static void I_GetEvent(SDL_Event *Event) { event_t event; switch (Event->type) { case SDL_KEYDOWN: event.type = ev_keydown; event.data1 = I_TranslateKey(&Event->key.keysym); D_PostEvent(&event); break; case SDL_KEYUP: { event.type = ev_keyup; event.data1 = I_TranslateKey(&Event->key.keysym); D_PostEvent(&event); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if (mouse_enabled) // recognise clicks even if the pointer isn't grabbed { event.type = ev_mouse; event.data1 = I_SDLtoDoomMouseState(SDL_GetMouseState(NULL, NULL)); event.data2 = event.data3 = 0; D_PostEvent(&event); } break; case SDL_MOUSEMOTION: if (mouse_currently_grabbed) { event.type = ev_mouse; event.data1 = I_SDLtoDoomMouseState(Event->motion.state); event.data2 = Event->motion.xrel << 5; event.data3 = -Event->motion.yrel << 5; D_PostEvent(&event); } break; case SDL_QUIT: S_StartSound(NULL, sfx_swtchn); M_QuitDOOM(0); default: break; } }
static void I_GetInput() { event_t event; event.data2 = event.data3 = 0; uint32_t down = hidKeysDown(); uint32_t held = hidKeysHeld(); uint32_t up = hidKeysUp(); // iterate over other possible key values int i; for (i = 0; i < (usejoystick ? 28 : 32); i++) { uint32_t key = 1<<i; if (down & key) { event.data1 = I_TranslateKey(key); event.type = ev_keydown; D_PostEvent(&event); } else if (up & key) { event.data1 = I_TranslateKey(key); event.type = ev_keyup; D_PostEvent(&event); } } // handle touch pad movement if (usemouse) { static int px = 0; static int py = 0; touchPosition touch; hidTouchRead(&touch); if (down & KEY_TOUCH) { px = touch.px; py = touch.py; } else if (held & KEY_TOUCH && (touch.px != px || touch.py != py)) { event.type = ev_mouse; event.data1 = -1; event.data2 = (touch.px - px) << 5; event.data3 = -(touch.py - py) << 5; D_PostEvent(&event); px = touch.px; py = touch.py; } } }
static void I_GetEvent(void) { event_t event; SDL_Event SDLEvent; SDL_Event *Event = &SDLEvent; static int mwheeluptic = 0, mwheeldowntic = 0; while (SDL_PollEvent(Event)) { switch (Event->type) { case SDL_KEYDOWN: #ifdef MACOSX if (Event->key.keysym.mod & KMOD_META) { // Switch windowed<->fullscreen if pressed <Command-F> if (Event->key.keysym.sym == SDLK_f) { V_ToggleFullscreen(); break; } } #else if (Event->key.keysym.mod & KMOD_LALT) { // Prevent executing action on Alt-Tab if (Event->key.keysym.sym == SDLK_TAB) { break; } // Switch windowed<->fullscreen if pressed Alt-Enter else if (Event->key.keysym.sym == SDLK_RETURN) { V_ToggleFullscreen(); break; } } #endif event.type = ev_keydown; event.data1 = I_TranslateKey(&Event->key.keysym); D_PostEvent(&event); break; case SDL_KEYUP: { event.type = ev_keyup; event.data1 = I_TranslateKey(&Event->key.keysym); D_PostEvent(&event); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if (mouse_enabled && window_focused) { event.type = ev_mouse; event.data1 = I_SDLtoDoomMouseState(SDL_GetMouseState(NULL, NULL)); event.data2 = event.data3 = 0; if (Event->type == SDL_MOUSEBUTTONDOWN) { switch(Event->button.button) { case SDL_BUTTON_WHEELUP: event.type = ev_keydown; event.data1 = KEYD_MWHEELUP; mwheeluptic = gametic; break; case SDL_BUTTON_WHEELDOWN: event.type = ev_keydown; event.data1 = KEYD_MWHEELDOWN; mwheeldowntic = gametic; break; } } D_PostEvent(&event); } break; //e6y: new mouse code case SDL_ACTIVEEVENT: UpdateFocus(); break; case SDL_VIDEORESIZE: ApplyWindowResize(Event); break; case SDL_QUIT: S_StartSound(NULL, sfx_swtchn); M_QuitDOOM(0); default: break; } } if(mwheeluptic && mwheeluptic + 1 < gametic) { event.type = ev_keyup; event.data1 = KEYD_MWHEELUP; D_PostEvent(&event); mwheeluptic = 0; } if(mwheeldowntic && mwheeldowntic + 1 < gametic) { event.type = ev_keyup; event.data1 = KEYD_MWHEELDOWN; D_PostEvent(&event); mwheeldowntic = 0; } }
static void I_GetEvent(SDL_Window *window) { SDL_Event ev; int sendmouseevent = 0; int buttons = 0; event_t d_event = { ev_keydown, 0, 0, 0, false }; event_t mouseevent = { ev_mouse, 0, 0, 0, false }; event_t tempevent = { ev_keydown, 0, 0, 0, false }; // [CG] 01/31/2012: Ensure we have the latest info about focus and mouse grabbing. UpdateFocus(window); UpdateGrab(window); while(SDL_PollEvent(&ev)) { // haleyjd 10/08/05: from Chocolate DOOM if(!window_focused && (ev.type == SDL_MOUSEMOTION || ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP)) { continue; } switch(ev.type) { case SDL_TEXTINPUT: for(unsigned int i = 0; i < SDL_strlen(ev.text.text); i++) { const char currchar = ev.text.text[i]; if(ectype::isPrint(currchar)) { event_t textevent = { ev_text, currchar, 0, 0, !!ev.key.repeat }; D_PostEvent(&textevent); } } break; case SDL_KEYDOWN: d_event.type = ev_keydown; d_event.repeat = !!ev.key.repeat; d_event.data1 = I_TranslateKey(&ev.key.keysym); #if (EE_CURRENT_PLATFORM != EE_PLATFORM_MACOSX) // This quick exit code is adapted from PRBoom+ // See PRBoom+'s I_GetEvent for a cross-platform implementation of how to get that input. if(ev.key.keysym.mod & KMOD_LALT) { // Prevent executing action on Alt-Tab if(ev.key.keysym.scancode == SDL_SCANCODE_TAB) break; // Immediately exit on Alt+F4 ("Boss Key") else if(ev.key.keysym.scancode == SDL_SCANCODE_F4) { I_QuitFast(); break; } else if(ev.key.keysym.scancode == SDL_SCANCODE_RETURN) { I_ToggleFullscreen(); break; } } #else // Also provide macOS option for quick exit and fullscreen toggle if(ev.key.keysym.mod & KMOD_GUI) { if(ev.key.keysym.scancode == SDL_SCANCODE_Q) { I_QuitFast(); break; } else if(ev.key.keysym.scancode == SDL_SCANCODE_F) { I_ToggleFullscreen(); break; } } #endif // MaxW: 2017/10/12: Removed deferred event adding for caps lock // MaxW: 2017/10/18: Removed character input D_PostEvent(&d_event); break; case SDL_KEYUP: d_event.type = ev_keyup; d_event.data1 = I_TranslateKey(&ev.key.keysym); D_PostEvent(&d_event); break; case SDL_MOUSEMOTION: if(!usemouse || ((mouseAccel_type == ACCELTYPE_CHOCO) || (mouseAccel_type == ACCELTYPE_CUSTOM))) continue; // haleyjd 06/14/10: no mouse motion at startup. if(gametic == 0) continue; // SoM 1-20-04 Ok, use xrel/yrel for mouse movement because most // people like it the most. if(mouseAccel_type == ACCELTYPE_NONE) { mouseevent.data2 += ev.motion.xrel; mouseevent.data3 -= ev.motion.yrel; } else if(mouseAccel_type == ACCELTYPE_LINEAR) { // Simple linear acceleration // Evaluates to 1.25 * x. So Why don't I just do that? .... shut up mouseevent.data2 += (ev.motion.xrel + (float)(ev.motion.xrel * 0.25f)); mouseevent.data3 -= (ev.motion.yrel + (float)(ev.motion.yrel * 0.25f)); } sendmouseevent = 1; break; case SDL_MOUSEBUTTONDOWN: if(!usemouse) continue; d_event.type = ev_keydown; switch(ev.button.button) { case SDL_BUTTON_LEFT: sendmouseevent = 1; buttons |= 1; d_event.data1 = KEYD_MOUSE1; break; case SDL_BUTTON_MIDDLE: // haleyjd 05/28/06: swapped MOUSE3/MOUSE2 sendmouseevent = 1; buttons |= 4; d_event.data1 = KEYD_MOUSE3; break; case SDL_BUTTON_RIGHT: sendmouseevent = 1; buttons |= 2; d_event.data1 = KEYD_MOUSE2; break; case SDL_BUTTON_X1: d_event.data1 = KEYD_MOUSE4; break; case SDL_BUTTON_X2: d_event.data1 = KEYD_MOUSE5; break; } D_PostEvent(&d_event); break; case SDL_MOUSEWHEEL: if(!usemouse) continue; d_event.type = ev_keydown; // SDL_TODO: Allow y to correspond to # of weps scrolled through? if(ev.wheel.y > 0) { d_event.data1 = KEYD_MWHEELUP; D_PostEvent(&d_event); // WHEELUP sends a button up event immediately. That won't work; // we need an input latency gap of at least one gametic. tempevent.type = ev_keyup; tempevent.data1 = KEYD_MWHEELUP; I_AddDeferredEvent(tempevent, gametic + 1); break; } else if(ev.wheel.y < 0) { d_event.data1 = KEYD_MWHEELDOWN; D_PostEvent(&d_event); // ditto, as above. tempevent.type = ev_keyup; tempevent.data1 = KEYD_MWHEELDOWN; I_AddDeferredEvent(tempevent, gametic + 1); break; } case SDL_MOUSEBUTTONUP: if(!usemouse) continue; d_event.type = ev_keyup; d_event.data1 = 0; switch(ev.button.button) { case SDL_BUTTON_LEFT: sendmouseevent = 1; buttons &= ~1; d_event.data1 = KEYD_MOUSE1; break; case SDL_BUTTON_MIDDLE: // haleyjd 05/28/06: swapped MOUSE3/MOUSE2 sendmouseevent = 1; buttons &= ~4; d_event.data1 = KEYD_MOUSE3; break; case SDL_BUTTON_RIGHT: sendmouseevent = 1; buttons &= ~2; d_event.data1 = KEYD_MOUSE2; break; case SDL_BUTTON_X1: d_event.data1 = KEYD_MOUSE4; break; case SDL_BUTTON_X2: d_event.data1 = KEYD_MOUSE5; break; } if(d_event.data1) D_PostEvent(&d_event); break; case SDL_QUIT: MN_QuitDoom(); break; case SDL_WINDOWEVENT: // haleyjd 10/08/05: from Chocolate DOOM: // need to update our focus state // 2/14/2011: Update mouse grabbing as well (thanks Catoptromancy) UpdateFocus(window); UpdateGrab(window); break; default: break; } } if(sendmouseevent) { mouseevent.data1 = buttons; D_PostEvent(&mouseevent); } // SoM: if paused, delay for a short amount of time to allow other threads // to process on the system. Otherwise Eternity will use almost 100% of the // CPU even while paused. if(paused || !window_focused) SDL_Delay(1); }