// // Check to see if we have grabbed the mouse or not and deal with it // appropriately // static void CheckMouseState(void) { if (x_focus && _windowed_mouse.value && !x_grabbed) { x_grabbed = true; printf("fooling with mouse!\n"); if (XGetPointerControl( x_disp, &x_mouse_num, &x_mouse_denom, &x_mouse_thresh )) printf( "XGetPointerControl failed!\n" ); //printf( "mouse %d/%d thresh %d\n", x_mouse_num, x_mouse_denom, x_mouse_thresh ); // make input rawer XAutoRepeatOff(x_disp); XGrabKeyboard(x_disp, x_win, True, GrabModeAsync, GrabModeAsync, CurrentTime); XGrabPointer(x_disp, x_win, True, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); // if (XChangePointerControl( x_disp, True, True, 1, MOUSE_SCALE, x_mouse_thresh )) // printf( "XChangePointerControl failed!\n" ); IN_CenterMouse(); // safe initial values x_root = x_root_old = vid.width >> 1; y_root = y_root_old = vid.height >> 1; } else if (x_grabbed && (!_windowed_mouse.value || !x_focus)) {
static void IN_DeactivateDGAMouse(void) { if (dga_available && dga_mouse_active) { XF86DGADirectVideo(x_disp, DefaultScreen(x_disp), 0); dga_mouse_active = false; IN_CenterMouse(); // maybe set mouse_x = 0 and mouse_y = 0? } }
void PollMouseMove (void) { int mousexmove, mouseymove; SDL_GetMouseState(&mousexmove, &mouseymove); if(IN_IsInputGrabbed()) IN_CenterMouse(); mousexmove -= screenWidth / 2; mouseymove -= screenHeight / 2; controlx += mousexmove * 10 / (13 - mouseadjustment); controly += mouseymove * 20 / (13 - mouseadjustment); }
static bool ShowText(const FString exitText, const FString flat, const FString music, ClusterInfo::ExitType type) { // Use cluster background if set. if(!flat.IsEmpty()) backgroundFlat = TexMan(flat); if(!backgroundFlat) // Get default if needed backgroundFlat = TexMan(gameinfo.FinaleFlat); switch(type) { case ClusterInfo::EXIT_MESSAGE: SD_PlaySound ("misc/1up"); Message (exitText); IN_ClearKeysDown (); IN_Ack (); return false; case ClusterInfo::EXIT_LUMP: { int lumpNum = Wads.CheckNumForName(exitText, ns_global); if(lumpNum != -1) { FWadLump lump = Wads.OpenLumpNum(lumpNum); char* text = new char[Wads.LumpLength(lumpNum)]; lump.Read(text, Wads.LumpLength(lumpNum)); if(!music.IsEmpty()) StartCPMusic(music); ShowArticle(text, !!(IWad::GetGame().Flags & IWad::HELPHACK)); delete[] text; } break; } default: if(!music.IsEmpty()) StartCPMusic(music); ShowArticle(exitText, !!(IWad::GetGame().Flags & IWad::HELPHACK)); break; } IN_ClearKeysDown(); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement return true; }
/* * Enables or disables the cursor */ void IN_SetMouseMode(MouseMode newMode) { if ( newMode != mouse_mode ) { if ( !mouseAvailable || !SDL_WasInit( SDL_INIT_VIDEO ) ) { return; } SDL_ShowCursor( newMode == MouseMode::SystemCursor ? SDL_ENABLE : SDL_DISABLE ); auto grab = newMode != MouseMode::Deltas || in_nograb->integer ? SDL_FALSE : SDL_TRUE; SDL_SetRelativeMouseMode( grab ); SDL_SetWindowGrab( window, grab ); if ( mouse_mode == MouseMode::Deltas ) { IN_CenterMouse(); } mouse_mode = newMode; } }
void IN_Commands(void) { if (!mouse_available) return; // FIXME - Need this consistant, robust // If we have the mouse, but are not in the game... if (mouse_grab_active && key_dest != key_game && !VID_IsFullScreen()) { IN_UngrabMouse(); IN_UngrabKeyboard(); } // If we don't have the mouse, but we're in the game and we want it... if (!mouse_grab_active && key_dest == key_game && (_windowed_mouse.value || VID_IsFullScreen())) { IN_GrabKeyboard(); IN_GrabMouse(); IN_CenterMouse(); } }
/* =============== IN_ProcessEvents =============== */ static void IN_ProcessEvents( bool dropInput ) { SDL_Event e; keyNum_t key = (keyNum_t) 0; static keyNum_t lastKeyDown = (keyNum_t) 0; if ( !SDL_WasInit( SDL_INIT_VIDEO ) ) { return; } while ( SDL_PollEvent( &e ) ) { switch ( e.type ) { case SDL_KEYDOWN: if ( !dropInput && ( !e.key.repeat || cls.keyCatchers ) ) { key = IN_TranslateSDLToQ3Key( &e.key.keysym, true ); if ( key ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, key, true, 0, nullptr ); } lastKeyDown = key; } break; case SDL_KEYUP: if ( !dropInput ) { key = IN_TranslateSDLToQ3Key( &e.key.keysym, false ); if ( key ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, key, false, 0, nullptr ); } lastKeyDown = (keyNum_t) 0; } break; case SDL_TEXTINPUT: if ( lastKeyDown != K_CONSOLE ) { char *c = e.text.text; while ( *c ) { int width = Q_UTF8_Width( c ); int sc = Q_UTF8_Store( c ); Com_QueueEvent( 0, sysEventType_t::SE_CHAR, sc, 0, 0, nullptr ); c += width; } } break; case SDL_MOUSEMOTION: if ( !dropInput ) { if ( mouse_mode != MouseMode::Deltas ) { Com_QueueEvent( 0, sysEventType_t::SE_MOUSE_POS, e.motion.x, e.motion.y, 0, nullptr ); } else { Com_QueueEvent( 0, sysEventType_t::SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, nullptr ); #if defined( __linux__ ) || defined( __BSD__ ) if ( !in_nograb->integer ) { // work around X window managers and edge-based workspace flipping // - without this, we get LeaveNotify, no mouse button events, EnterNotify; // we would likely miss some button presses and releases. IN_CenterMouse(); } #endif } } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: if ( !dropInput ) { unsigned char 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, sysEventType_t::SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? true : false ), 0, nullptr ); } break; case SDL_MOUSEWHEEL: // FIXME: mouse wheel support shouldn't use keys! if ( e.wheel.y > 0 ) { Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELUP, true, 0, nullptr ); Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELUP, false, 0, nullptr ); } else { Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELDOWN, true, 0, nullptr ); Com_QueueEvent( 0, sysEventType_t::SE_KEY, K_MWHEELDOWN, false, 0, nullptr ); } break; case SDL_WINDOWEVENT: switch( e.window.event ) { case SDL_WINDOWEVENT_RESIZED: { char width[32], height[32]; Com_sprintf( width, sizeof( width ), "%d", e.window.data1 ); Com_sprintf( height, sizeof( height ), "%d", e.window.data2 ); Cvar_Set( "r_customwidth", width ); Cvar_Set( "r_customheight", height ); Cvar_Set( "r_mode", "-1" ); } 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: Cvar_SetValue( "com_unfocused", 1 ); break; case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; case SDL_QUIT: Cmd::ExecuteCommand("quit Closed window"); break; default: break; } } }
void CheckKeys (void) { ScanCode scan; if (screenfaded || demoplayback) // don't do anything with a faded screen return; scan = LastScan; #ifdef SPEAR // // SECRET CHEAT CODE: TAB-G-F10 // if (Keyboard[sc_Tab] && Keyboard[sc_G] && Keyboard[sc_F10]) { WindowH = 160; if (godmode) { Message ("God mode OFF"); SD_PlaySound (NOBONUSSND); } else { Message ("God mode ON"); SD_PlaySound (ENDBONUS2SND); } IN_Ack (); godmode ^= 1; DrawPlayBorderSides (); IN_ClearKeysDown (); return; } #endif // // SECRET CHEAT CODE: 'MLI' // if (Keyboard[sc_M] && Keyboard[sc_L] && Keyboard[sc_I]) { gamestate.health = 100; gamestate.ammo = 99; gamestate.keys = 3; gamestate.score = 0; gamestate.TimeCount += 42000L; GiveWeapon (wp_chaingun); DrawWeapon (); DrawHealth (); DrawKeys (); DrawAmmo (); DrawScore (); ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message (STR_CHEATER1 "\n" STR_CHEATER2 "\n\n" STR_CHEATER3 "\n" STR_CHEATER4 "\n" STR_CHEATER5); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); if (viewsize < 17) DrawPlayBorder (); } // // OPEN UP DEBUG KEYS // #ifdef DEBUGKEYS if (Keyboard[sc_BackSpace] && Keyboard[sc_LShift] && Keyboard[sc_Alt] && param_debugmode) { ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message ("Debugging keys are\nnow available!"); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); DrawPlayBorderSides (); DebugOk = 1; } #endif // // TRYING THE KEEN CHEAT CODE! // if (Keyboard[sc_B] && Keyboard[sc_A] && Keyboard[sc_T]) { ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message ("Commander Keen is also\n" "available from Apogee, but\n" "then, you already know\n" "that - right, Cheatmeister?!"); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); if (viewsize < 18) DrawPlayBorder (); } // // pause key weirdness can't be checked as a scan code // if(buttonstate[bt_pause]) Paused = true; if(Paused) { int lastoffs = StopMusic(); LatchDrawPic (20 - 4, 80 - 2 * 8, PAUSEDPIC); VH_UpdateScreen(); IN_Ack (); Paused = false; ContinueMusic(lastoffs); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement lasttimecount = GetTimeCount(); return; } // // F1-F7/ESC to enter control panel // if ( #ifndef DEBCHECK scan == sc_F10 || #endif scan == sc_F9 || scan == sc_F7 || scan == sc_F8) // pop up quit dialog { short oldmapon = gamestate.mapon; short oldepisode = gamestate.episode; ClearMemory (); ClearSplitVWB (); US_ControlPanel (scan); DrawPlayBorderSides (); SETFONTCOLOR (0, 15); IN_ClearKeysDown (); return; } if ((scan >= sc_F1 && scan <= sc_F9) || scan == sc_Escape || buttonstate[bt_esc]) { int lastoffs = StopMusic (); ClearMemory (); VW_FadeOut (); US_ControlPanel (buttonstate[bt_esc] ? sc_Escape : scan); SETFONTCOLOR (0, 15); IN_ClearKeysDown (); VW_FadeOut(); if(viewsize != 21) DrawPlayScreen (); if (!startgame && !loadedgame) ContinueMusic (lastoffs); if (loadedgame) playstate = ex_abort; lasttimecount = GetTimeCount(); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement return; } // // TAB-? debug keys // #ifdef DEBUGKEYS if (Keyboard[sc_Tab] && DebugOk) { CA_CacheGrChunk (STARTFONT); fontnumber = 0; SETFONTCOLOR (0, 15); if (DebugKeys () && viewsize < 20) DrawPlayBorder (); // dont let the blue borders flash if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement lasttimecount = GetTimeCount(); return; } #endif }
void PlayLoop (void) { #if defined(USE_FEATUREFLAGS) && defined(USE_CLOUDSKY) if(GetFeatureFlags() & FF_CLOUDSKY) InitSky(); #endif #ifdef USE_SHADING InitLevelShadeTable(); #endif playstate = ex_stillplaying; lasttimecount = GetTimeCount(); frameon = 0; anglefrac = 0; facecount = 0; funnyticount = 0; memset (buttonstate, 0, sizeof (buttonstate)); ClearPaletteShifts (); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement if (demoplayback) IN_StartAck (); do { PollControls (); // // actor thinking // madenoise = false; MoveDoors (); MovePWalls (); for (obj = player; obj; obj = obj->next) DoActor (obj); UpdatePaletteShifts (); ThreeDRefresh (); // // MAKE FUNNY FACE IF BJ DOESN'T MOVE FOR AWHILE // #ifdef SPEAR funnyticount += tics; if (funnyticount > 30l * 70) { funnyticount = 0; if(viewsize != 21) StatusDrawFace(BJWAITING1PIC + (US_RndT () & 1)); facecount = 0; } #endif gamestate.TimeCount += tics; UpdateSoundLoc (); // JAB if (screenfaded) VW_FadeIn (); CheckKeys (); // // debug aids // if (singlestep) { VW_WaitVBL (singlestep); lasttimecount = GetTimeCount(); } if (extravbls) VW_WaitVBL (extravbls); if (demoplayback) { if (IN_CheckAck ()) { IN_ClearKeysDown (); playstate = ex_abort; } } } while (!playstate && !startgame); if (playstate != ex_died) FinishPaletteShifts (); }