void IN_Init(void) { int appState; if (!SDL_WasInit(SDL_INIT_VIDEO)) { Com_Error(ERR_FATAL, "IN_Init called before SDL_Init( SDL_INIT_VIDEO )"); return; } mainScreen = (SDL_Window *)GLimp_MainWindow(); Com_DPrintf("\n------- Input Initialization -------\n"); in_keyboardDebug = Cvar_Get("in_keyboardDebug", "0", CVAR_TEMP); // mouse variables in_mouse = Cvar_Get("in_mouse", "1", CVAR_ARCHIVE); if (in_mouse->integer == 2) { Com_Printf("Trying to emulate non raw input\n"); if (!SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE)) { Com_Printf(S_COLOR_RED "Failed to set the hint"); } } else { SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "0", SDL_HINT_OVERRIDE); } in_nograb = Cvar_Get("in_nograb", "0", CVAR_ARCHIVE); in_joystick = Cvar_Get("in_joystick", "0", CVAR_ARCHIVE | CVAR_LATCH); in_joystickThreshold = Cvar_Get("joy_threshold", "0.15", CVAR_ARCHIVE); SDL_StartTextInput(); mouseAvailable = (in_mouse->value != 0); IN_DeactivateMouse(); appState = SDL_GetWindowFlags(mainScreen); Cvar_SetValue("com_unfocused", !((appState & SDL_WINDOW_INPUT_FOCUS) && (appState & SDL_WINDOW_MOUSE_FOCUS))); Cvar_SetValue("com_minimized", appState & SDL_WINDOW_MINIMIZED); IN_InitKeyLockStates(); // FIXME: Joystick initialization crashes some Windows and Mac OS X clients (see SDL #2833) //IN_InitJoystick(); #ifdef DISABLE_DINGY IN_EnableDingFilter(); #endif Com_DPrintf("------------------------------------\n"); }
static void IN_ProcessEvents(void) { SDL_Event e; keyNum_t key = 0; static keyNum_t lastKeyDown = 0; if (!SDL_WasInit(SDL_INIT_VIDEO)) { return; } while (SDL_PollEvent(&e)) { switch (e.type) { case SDL_KEYDOWN: if (e.key.repeat && Key_GetCatcher() == 0) { break; } if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qtrue))) { Com_QueueEvent(0, SE_KEY, key, qtrue, 0, NULL); if (key == K_BACKSPACE) { // This was added to keep mod comp, mods do not check K_BACKSPACE but instead use char 8 which is backspace in ascii // 8 == CTRL('h') == BS aka Backspace from ascii table Com_QueueEvent(0, SE_CHAR, CTRL('h'), 0, 0, NULL); } else if (keys[K_CTRL].down && key >= 'a' && key <= 'z') { Com_QueueEvent(0, SE_CHAR, CTRL(key), 0, 0, NULL); } } lastKeyDown = key; break; case SDL_KEYUP: if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qfalse))) { Com_QueueEvent(0, SE_KEY, key, qfalse, 0, NULL); } lastKeyDown = 0; break; case SDL_TEXTINPUT: if (lastKeyDown != K_CONSOLE) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while (*c) { int utf32 = 0; if ((*c & 0x80) == 0) { utf32 = *c++; } else if ((*c & 0xE0) == 0xC0) // 110x xxxx { utf32 |= (*c++ & 0x1F) << 6; utf32 |= (*c++ & 0x3F); } else if ((*c & 0xF0) == 0xE0) // 1110 xxxx { utf32 |= (*c++ & 0x0F) << 12; utf32 |= (*c++ & 0x3F) << 6; utf32 |= (*c++ & 0x3F); } else if ((*c & 0xF8) == 0xF0) // 1111 0xxx { utf32 |= (*c++ & 0x07) << 18; utf32 |= (*c++ & 0x3F) << 12; utf32 |= (*c++ & 0x3F) << 6; utf32 |= (*c++ & 0x3F); } else { Com_DPrintf("Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c); c++; } if (utf32 != 0) { if (IN_IsConsoleKey(0, utf32)) { Com_QueueEvent(0, SE_KEY, K_CONSOLE, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_CONSOLE, qfalse, 0, NULL); } else { Com_QueueEvent(0, SE_CHAR, utf32, 0, 0, NULL); } } } } break; case SDL_MOUSEMOTION: if (mouseActive) { if (!e.motion.xrel && !e.motion.yrel) { break; } Com_QueueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { int b; switch (e.button.button) { case SDL_BUTTON_LEFT: b = K_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = K_MOUSE3; break; case SDL_BUTTON_RIGHT: b = K_MOUSE2; break; case SDL_BUTTON_X1: b = K_MOUSE4; break; case SDL_BUTTON_X2: b = K_MOUSE5; break; default: b = K_AUX1 + (e.button.button - SDL_BUTTON_X2 + 1) % 16; break; } Com_QueueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); } break; case SDL_MOUSEWHEEL: if (e.wheel.y > 0) { Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qfalse, 0, NULL); } else if (e.wheel.y < 0) { Com_QueueEvent(0, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL); Com_QueueEvent(0, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL); } break; case SDL_QUIT: Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n"); break; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_RESIZED: IN_WindowResize(&e); break; case SDL_WINDOWEVENT_MINIMIZED: Cvar_SetValue("com_minimized", 1); break; case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue("com_minimized", 0); break; case SDL_WINDOWEVENT_FOCUS_LOST: // disabled for now (causes issues with vid_restart //IN_WindowFocusLost(); case SDL_WINDOWEVENT_LEAVE: Key_ClearStates(); Cvar_SetValue("com_unfocused", 1); break; case SDL_WINDOWEVENT_ENTER: case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue("com_unfocused", 0); if (com_minimized->integer) { SDL_RestoreWindow(mainScreen); } #ifdef DISABLE_DINGY IN_EnableDingFilter(); #endif } break; } break; default: break; } } }