Added Chocolate Doom appstate tracking.

This commit is contained in:
James Haley 2008-06-17 05:21:33 -05:00
parent 4a3dd8fc4e
commit 26f762b64e
3 changed files with 144 additions and 16 deletions

View File

@ -260,7 +260,7 @@ void I_Quit (void)
#if defined(MY_SDL_VER)
// Under Visual C++, the console window likes to rudely slam
// shut -- this can stop it
if(stdin && waitAtExit)
if(*errmsg || waitAtExit)
{
puts("Press any key to continue");
getch();

View File

@ -43,6 +43,7 @@ rcsid[] = "$Id: i_video.c,v 1.12 1998/05/03 22:40:35 killough Exp $";
#include "am_map.h"
#include "m_menu.h"
#include "wi_stuff.h"
#include "i_video.h"
SDL_Surface *sdlscreen;
@ -138,6 +139,94 @@ void I_StartFrame(void)
//
/////////////////////////////////////////////////////////////////////////////
// haleyjd 10/08/05: Chocolate DOOM application focus state code added
// Grab the mouse? (int type for config code)
int grabmouse = 1;
// Flag indicating whether the screen is currently visible:
// when the screen isnt visible, don't render the screen
boolean screenvisible;
static boolean window_focused;
static boolean fullscreen;
//
// MouseShouldBeGrabbed
//
// haleyjd 10/08/05: From Chocolate DOOM, fairly self-explanatory.
//
static boolean MouseShouldBeGrabbed(void)
{
// if the window doesnt have focus, never grab it
if(!window_focused)
return false;
// always grab the mouse when full screen (dont want to
// see the mouse pointer)
if(fullscreen)
return true;
// if we specify not to grab the mouse, never grab
if(!grabmouse)
return false;
// when menu is active or game is paused, release the mouse
if(menuactive || paused)
return false;
// only grab mouse when playing levels (but not demos)
return (gamestate == GS_LEVEL) && !demoplayback;
}
//
// UpdateFocus
//
// haleyjd 10/08/05: From Chocolate Doom
// Update the value of window_focused when we get a focus event
//
// We try to make ourselves be well-behaved: the grab on the mouse
// is removed if we lose focus (such as a popup window appearing),
// and we dont move the mouse around if we aren't focused either.
//
static void UpdateFocus(void)
{
Uint8 state = SDL_GetAppState();
// We should have input (keyboard) focus and be visible
// (not minimised)
window_focused = (state & SDL_APPINPUTFOCUS) && (state & SDL_APPACTIVE);
// Should the screen be grabbed?
screenvisible = (state & SDL_APPACTIVE) != 0;
}
//
// UpdateGrab
//
// haleyjd 10/08/05: from Chocolate DOOM
//
static void UpdateGrab(void)
{
static boolean currently_grabbed = false;
boolean grab;
grab = MouseShouldBeGrabbed();
if(grab && !currently_grabbed)
{
SDL_ShowCursor(SDL_DISABLE);
SDL_WM_GrabInput(SDL_GRAB_ON);
}
if(!grab && currently_grabbed)
{
SDL_ShowCursor(SDL_ENABLE);
SDL_WM_GrabInput(SDL_GRAB_OFF);
}
currently_grabbed = grab;
}
//
// Keyboard routines
// By Lee Killough
@ -237,6 +326,15 @@ void I_GetEvent()
while(SDL_PollEvent(&event))
{
// haleyjd 10/08/05: from Chocolate DOOM
if(!window_focused &&
(event.type == SDL_MOUSEMOTION ||
event.type == SDL_MOUSEBUTTONDOWN ||
event.type == SDL_MOUSEBUTTONUP))
{
continue;
}
switch(event.type)
{
case SDL_KEYDOWN:
@ -274,12 +372,12 @@ void I_GetEvent()
}
else if(event.button.button == SDL_BUTTON_MIDDLE)
{
buttons &= ~2;
buttons &= ~4;
d_event.data1 = buttons;
}
else
{
buttons &= ~4;
buttons &= ~2;
d_event.data1 = buttons;
}
D_PostEvent(&d_event);
@ -296,12 +394,12 @@ void I_GetEvent()
}
else if(event.button.button == SDL_BUTTON_MIDDLE)
{
buttons |= 2;
buttons |= 4;
d_event.data1 = buttons;
}
else
{
buttons |= 4;
buttons |= 2;
d_event.data1 = buttons;
}
D_PostEvent(&d_event);
@ -310,6 +408,15 @@ void I_GetEvent()
case SDL_QUIT:
exit(0);
break;
case SDL_ACTIVEEVENT:
// haleyjd 10/08/05: from Chocolate DOOM:
// need to update our focus state
UpdateFocus();
break;
default:
break;
}
}
@ -318,6 +425,9 @@ void I_GetEvent()
mouseevent.data1 = buttons;
D_PostEvent(&mouseevent);
}
if(paused && !window_focused)
I_WaitVBL(1);
}
//
@ -362,6 +472,16 @@ void I_FinishUpdate(void)
if (noblit || !in_graphics_mode)
return;
// haleyjd 10/08/05: from Chocolate DOOM:
UpdateGrab();
// Don't update the screen if the window isn't visible.
// Not doing this breaks under Windows when we alt-tab away
// while fullscreen.
if(!(SDL_GetAppState() & SDL_APPACTIVE))
return;
v_width = in_hires ? 640 : 320;
v_height = in_hires ? 400 : 200;
@ -535,14 +655,7 @@ void I_ShutdownGraphics(void)
{
if(in_graphics_mode) // killough 10/98
{
if(SDL_ShowCursor(SDL_QUERY) == SDL_DISABLE)
SDL_ShowCursor(SDL_ENABLE);
// SoM 1-20-04: let go of input
if(SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON)
SDL_WM_GrabInput(SDL_GRAB_OFF);
UpdateGrab();
in_graphics_mode = false;
sdlscreen = NULL;
}
@ -571,6 +684,13 @@ static void I_InitGraphicsMode(void)
firsttime = false;
}
// haleyjd 10/09/05: from Chocolate DOOM
// mouse grabbing
if(M_CheckParm("-grabmouse"))
grabmouse = 1;
else if(M_CheckParm("-nograbmouse"))
grabmouse = 0;
// haleyjd 04/11/03: "vsync" or page-flipping support
if(use_vsync || page_flip)
flags = SDL_HWSURFACE | SDL_DOUBLEBUF;
@ -592,11 +712,11 @@ static void I_InitGraphicsMode(void)
V_Init();
SDL_ShowCursor(SDL_DISABLE);
SDL_WM_GrabInput(SDL_GRAB_ON);
SDL_WM_SetCaption("WinMBF v2.03", NULL);
UpdateFocus();
UpdateGrab();
in_graphics_mode = 1;
in_page_flip = false;
in_hires = hires;

View File

@ -82,6 +82,7 @@ extern int joystickSens_x;
extern int joystickSens_y;
extern int waitAtExit;
extern int forceFlipPan;
extern int grabmouse;
extern char *chat_macros[], *wad_files[], *deh_files[]; // killough 10/98
@ -1634,6 +1635,13 @@ default_t defaults[] = {
0, {0, 1}, number, ss_none, wad_no,
"1 to force reversal of stereo audio channels"
},
{
"grabmouse",
&grabmouse, NULL,
1, {0, 1}, number, ss_none, wad_no,
"1 to grab mouse during play"
},
#endif
{NULL} // last entry