/** * @todo Find better name */ static void UI_CloseWindowByRef (uiNode_t *window) { int i; /** @todo If the focus is not on the window we close, we don't need to remove it */ UI_ReleaseInput(); assert(ui_global.windowStackPos); i = UI_GetWindowPositionFromStackByName(window->name); if (i == -1) { Com_Printf("Window '%s' is not on the active stack\n", window->name); return; } /* close child */ while (i + 1 < ui_global.windowStackPos) { uiNode_t *m = ui_global.windowStack[i + 1]; if (WINDOWEXTRADATA(m).parent != window) { break; } UI_Node_WindowClosed(window); WINDOWEXTRADATA(m).parent = NULL; UI_RemoveWindowAtPositionFromStack(i + 1); } /* close the window */ UI_Node_WindowClosed(window); WINDOWEXTRADATA(window).parent = NULL; UI_RemoveWindowAtPositionFromStack(i); UI_InvalidateMouse(); }
/** * @brief Sets the keyDest in cls * @param[in] keyDest see keydest_t */ void Key_SetDest (int keyDest) { cls.keyDest = keyDest; if (cls.keyDest == key_console) { /* make sure the menu no more capture inputs */ UI_ReleaseInput(); } }
/** * @brief Push a window onto the window stack * @param[in] name Name of the window to push onto window stack * @param[in] parentName Window name to link as parent-child (else NULL) * @param[in] params List of string parameters to send to the onWindowOpened method. * It can be NULL when there is no parameters, else this object must be freed by the caller. * @return A pointer to @c uiNode_t */ uiNode_t* UI_PushWindow (const char *name, const char *parentName, linkedList_t *params) { uiNode_t *window; UI_ReleaseInput(); window = UI_GetWindow(name); if (window == NULL) { Com_Printf("Window \"%s\" not found.\n", name); return NULL; } UI_DeleteWindowFromStack(window); if (ui_global.windowStackPos < UI_MAX_WINDOWSTACK) if (parentName) { const int parentPos = UI_GetWindowPositionFromStackByName(parentName); if (parentPos == -1) { Com_Printf("Didn't find parent window \"%s\" for window push of \"%s\"\n", parentName, name); return NULL; } UI_InsertWindowIntoStack(window, parentPos + 1); WINDOWEXTRADATA(window).parent = ui_global.windowStack[parentPos]; } else ui_global.windowStack[ui_global.windowStackPos++] = window; else Com_Printf("Window stack overflow\n"); UI_Node_WindowOpened(window, params); /* change from e.g. console mode to game input mode (fetch input) */ Key_SetDest(key_game); UI_InvalidateMouse(); return window; }
/** * Reinit input and font */ void UI_Reinit (void) { UI_InitFonts(); UI_ReleaseInput(); UI_InvalidateMouse(); }
/** * @brief Handle input events like keys presses and joystick movement as well * as window events * @sa CL_Frame * @sa IN_Parse * @sa IN_JoystickMove */ void IN_Frame (void) { int mouse_buttonstate; unsigned short unicode; unsigned int key; SDL_Event event; IN_Parse(); IN_JoystickMove(); if (vid_grabmouse->modified) { vid_grabmouse->modified = qfalse; if (!vid_grabmouse->integer) { /* ungrab the pointer */ Com_Printf("Switch grab input off\n"); SDL_WM_GrabInput(SDL_GRAB_OFF); /* don't allow grabbing the input in fullscreen mode */ } else if (!vid_fullscreen->integer) { /* grab the pointer */ Com_Printf("Switch grab input on\n"); SDL_WM_GrabInput(SDL_GRAB_ON); } else { Com_Printf("No input grabbing in fullscreen mode\n"); Cvar_SetValue("vid_grabmouse", 0); } } oldMousePosX = mousePosX; oldMousePosY = mousePosY; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: switch (event.button.button) { case SDL_BUTTON_LEFT: mouse_buttonstate = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: mouse_buttonstate = K_MOUSE3; break; case SDL_BUTTON_RIGHT: mouse_buttonstate = K_MOUSE2; break; case SDL_BUTTON_WHEELUP: mouse_buttonstate = K_MWHEELUP; break; case SDL_BUTTON_WHEELDOWN: mouse_buttonstate = K_MWHEELDOWN; break; case 6: mouse_buttonstate = K_MOUSE4; break; case 7: mouse_buttonstate = K_MOUSE5; break; default: mouse_buttonstate = K_AUX1 + (event.button.button - 8) % 16; break; } IN_EventEnqueue(mouse_buttonstate, 0, (event.type == SDL_MOUSEBUTTONDOWN)); break; case SDL_MOUSEMOTION: SDL_GetMouseState(&mousePosX, &mousePosY); mousePosX /= viddef.rx; mousePosY /= viddef.ry; break; case SDL_KEYDOWN: IN_PrintKey(&event, 1); #ifndef _WIN32 if ((event.key.keysym.mod & KMOD_ALT) && event.key.keysym.sym == SDLK_RETURN) { SDL_Surface *surface = SDL_GetVideoSurface(); if (!SDL_WM_ToggleFullScreen(surface)) { int flags = surface->flags ^= SDL_FULLSCREEN; SDL_SetVideoMode(surface->w, surface->h, 0, flags); } if (surface->flags & SDL_FULLSCREEN) { Cvar_SetValue("vid_fullscreen", 1); /* make sure, that input grab is deactivated in fullscreen mode */ Cvar_SetValue("vid_grabmouse", 0); } else { Cvar_SetValue("vid_fullscreen", 0); } vid_fullscreen->modified = qfalse; /* we just changed it with SDL. */ break; /* ignore this key */ } #endif if ((event.key.keysym.mod & KMOD_CTRL) && event.key.keysym.sym == SDLK_g) { SDL_GrabMode gm = SDL_WM_GrabInput(SDL_GRAB_QUERY); Cvar_SetValue("vid_grabmouse", (gm == SDL_GRAB_ON) ? 0 : 1); break; /* ignore this key */ } /* console key is hardcoded, so the user can never unbind it */ if ((event.key.keysym.mod & KMOD_SHIFT) && event.key.keysym.sym == SDLK_ESCAPE) { Con_ToggleConsole_f(); break; } IN_TranslateKey(&event.key.keysym, &key, &unicode); IN_EventEnqueue(key, unicode, qtrue); break; case SDL_VIDEOEXPOSE: break; case SDL_KEYUP: IN_PrintKey(&event, 0); IN_TranslateKey(&event.key.keysym, &key, &unicode); IN_EventEnqueue(key, unicode, qfalse); break; case SDL_ACTIVEEVENT: /* make sure menu no more capture input when the game window lose the focus */ if (event.active.state == SDL_APPINPUTFOCUS && event.active.gain == 0) UI_ReleaseInput(); break; case SDL_QUIT: Cmd_ExecuteString("quit"); break; case SDL_VIDEORESIZE: /* make sure that SDL_SetVideoMode is called again after we changed the size * otherwise the mouse will make problems */ vid_mode->modified = qtrue; break; } } }