// // UpdateGrab (From chocolate-doom) // static void UpdateGrab(void) { bool grab = MouseShouldBeGrabbed(); if (grab && !mousegrabbed) { SetCursorState(false); SDL_WM_GrabInput(SDL_GRAB_ON); // Warp the mouse back to the middle of the screen if(screen) SDL_WarpMouse(screen->width/ 2, screen->height / 2); // eat all pending input from outside the game SDL_Event ev; while (SDL_PollEvent(&ev)); } else if (!grab && mousegrabbed) { SetCursorState(true); SDL_WM_GrabInput(SDL_GRAB_OFF); } mousegrabbed = grab; }
// // UpdateGrab (From chocolate-doom) // static void UpdateGrab(void) { bool grab = MouseShouldBeGrabbed(); if (grab && !mousegrabbed) { SetCursorState(false); SDL_WM_GrabInput(SDL_GRAB_ON); // Warp the mouse back to the middle of the screen if(screen) SDL_WarpMouse(screen->width/ 2, screen->height / 2); I_FlushInput(); } else if (!grab && mousegrabbed) { SetCursorState(true); SDL_WM_GrabInput(SDL_GRAB_OFF); } #if defined WIN32 && !defined _XBOX if (Args.CheckParm ("-gdi")) { if (grab) FixGDIMouseInput(); else RestoreGDIMouseSettings(); } #endif mousegrabbed = grab; }
void CMouseBehaviour::UpdateCursor (void) { if ( m_bCursorOn && m_bHasMoved) { m_bHasMoved = FALSE; SetCursorState (m_nPosX, m_nPosY, TRUE); } }
boolean CMouseBehaviour::ShowCursor (boolean bShow) { boolean bResult = m_bCursorOn; m_bCursorOn = bShow; assert (m_nPosX < m_nScreenWidth); assert (m_nPosY < m_nScreenHeight); SetCursorState (m_nPosX, m_nPosY, m_bCursorOn); return bResult; }
// // I_ResumeMouse // void I_ResumeMouse (void) { if(havefocus) { GrabMouse(); SetCursorState(false); // denis - disable key repeats as they mess with the mouse in XP SDL_EnableKeyRepeat(0, SDL_DEFAULT_REPEAT_INTERVAL); } mousepaused = false; }
void I_PauseMouse (void) { // denis - disable key repeats as they mess with the mouse in XP SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); if (fullscreen) return; UngrabMouse(); SetCursorState(true); mousepaused = true; }
// // UpdateGrab (From chocolate-doom) // static void UpdateGrab(void) { bool grab; grab = MouseShouldBeGrabbed(); if (grab && !mousegrabbed) { if(screen) SDL_WarpMouse(screen->width/ 2, screen->height / 2); SetCursorState(false); SDL_WM_GrabInput(SDL_GRAB_ON); flushmouse = true; } else if (!grab && mousegrabbed) { SetCursorState(true); SDL_WM_GrabInput(SDL_GRAB_OFF); } mousegrabbed = grab; }
boolean CMouseBehaviour::SetCursor (unsigned nPosX, unsigned nPosY) { assert (m_nScreenWidth > 0); assert (m_nScreenHeight > 0); if ( nPosX >= m_nScreenWidth || nPosY >= m_nScreenHeight) { return FALSE; } m_nPosX = nPosX; m_nPosY = nPosY; if (!m_bCursorOn) { return TRUE; } return SetCursorState (m_nPosX, m_nPosY, TRUE); }
// // I_GetEvent // void I_GetEvent (void) { event_t event; event_t mouseevent = {ev_mouse, 0, 0, 0}; static int mbuttons = 0; int sendmouseevent = 0; SDL_Event ev; if (!(SDL_GetAppState()&SDL_APPINPUTFOCUS) && havefocus) { havefocus = false; UngrabMouse(); SetCursorState(true); } else if((SDL_GetAppState()&SDL_APPINPUTFOCUS) && !havefocus) { havefocus = true; if(!mousepaused) I_ResumeMouse(); } while(SDL_PollEvent(&ev)) { event.data1 = event.data2 = event.data3 = 0; switch(ev.type) { case SDL_QUIT: AddCommandString("quit"); break; case SDL_KEYDOWN: event.type = ev_keydown; event.data1 = ev.key.keysym.sym; if(event.data1 >= SDLK_KP0 && event.data1 <= SDLK_KP9) event.data2 = event.data3 = '0' + (event.data1 - SDLK_KP0); else if(event.data1 == SDLK_KP_PERIOD) event.data2 = event.data3 = '.'; else if(event.data1 == SDLK_KP_DIVIDE) event.data2 = event.data3 = '/'; else if(event.data1 == SDLK_KP_ENTER) event.data2 = event.data3 = '\r'; else if ( (ev.key.keysym.unicode & 0xFF80) == 0 ) event.data2 = event.data3 = ev.key.keysym.unicode; else event.data2 = event.data3 = 0; #ifdef WIN32 // SoM: Ignore the tab portion of alt-tab presses if(event.data1 == SDLK_TAB && SDL_GetModState() & (KMOD_LALT | KMOD_RALT)) event.data1 = event.data2 = event.data3 = 0; else #endif D_PostEvent(&event); break; case SDL_KEYUP: event.type = ev_keyup; event.data1 = ev.key.keysym.sym; if ( (ev.key.keysym.unicode & 0xFF80) == 0 ) event.data2 = event.data3 = ev.key.keysym.unicode; else event.data2 = event.data3 = 0; D_PostEvent(&event); break; case SDL_MOUSEMOTION: if(flushmouse) { flushmouse = false; break; } // denis - ignore artificially inserted events (see SDL_WarpMouse below) if(ev.motion.x == screen->width/2 && ev.motion.y == screen->height/2) { break; } mouseevent.data2 += AccelerateMouse(ev.motion.xrel); mouseevent.data3 -= AccelerateMouse(ev.motion.yrel); sendmouseevent = 1; break; case SDL_MOUSEBUTTONDOWN: if(nomouse) break; event.type = ev_keydown; if(ev.button.button == SDL_BUTTON_LEFT) { event.data1 = KEY_MOUSE1; mbuttons |= 1; } else if(ev.button.button == SDL_BUTTON_RIGHT) { event.data1 = KEY_MOUSE2; mbuttons |= 2; } else if(ev.button.button == SDL_BUTTON_MIDDLE) { event.data1 = KEY_MOUSE3; mbuttons |= 4; } else if(ev.button.button == SDL_BUTTON_WHEELUP) event.data1 = KEY_MWHEELUP; else if(ev.button.button == SDL_BUTTON_WHEELDOWN) event.data1 = KEY_MWHEELDOWN; D_PostEvent(&event); break; case SDL_MOUSEBUTTONUP: if(nomouse) break; event.type = ev_keyup; if(ev.button.button == SDL_BUTTON_LEFT) { event.data1 = KEY_MOUSE1; mbuttons &= ~1; } else if(ev.button.button == SDL_BUTTON_RIGHT) { event.data1 = KEY_MOUSE2; mbuttons &= ~2; } else if(ev.button.button == SDL_BUTTON_MIDDLE) { event.data1 = KEY_MOUSE3; mbuttons &= ~4; } else if(ev.button.button == SDL_BUTTON_WHEELUP) event.data1 = KEY_MWHEELUP; else if(ev.button.button == SDL_BUTTON_WHEELDOWN) event.data1 = KEY_MWHEELDOWN; D_PostEvent(&event); break; }; } if(!nomouse) { if(sendmouseevent) { mouseevent.data1 = mbuttons; D_PostEvent(&mouseevent); } if(mousegrabbed && screen) { SDL_WarpMouse(screen->width/ 2, screen->height / 2); } } }