diff options
Diffstat (limited to 'source/vid_sdl.c')
-rw-r--r-- | source/vid_sdl.c | 677 |
1 files changed, 359 insertions, 318 deletions
diff --git a/source/vid_sdl.c b/source/vid_sdl.c index 7e48223..883973c 100644 --- a/source/vid_sdl.c +++ b/source/vid_sdl.c @@ -30,6 +30,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "key_public.h" #include "q2pro.xbm" #include <SDL.h> +#if USE_X11 +#include <SDL_syswm.h> +#endif #ifdef __unix__ #include <GL/glx.h> #include <GL/glxext.h> @@ -38,10 +41,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. typedef struct { SDL_Surface *surface; SDL_Surface *icon; - Uint16 gamma[3][256]; - vidFlags_t flags; - qboolean mouseactive; // false when not focus app - qboolean mouseinitialized; + Uint16 gamma[3][256]; + vidFlags_t flags; + struct { + qboolean initialized; + grab_t grabbed; + } mouse; #ifdef __unix__ //PFNGLXGETVIDEOSYNCSGIPROC glXGetVideoSyncSGI; #endif @@ -49,8 +54,6 @@ typedef struct { static sdl_state_t sdl; -void QSDL_AcquireMouse( void ); - /* =============================================================================== @@ -59,16 +62,45 @@ COMMON SDL VIDEO RELATED ROUTINES =============================================================================== */ -static qboolean QSDL_SetMode( int flags, int forcedepth ) { +static void SetHints( void ) { +#if USE_X11 + SDL_SysWMinfo info; + Display *dpy; + Window win; + XSizeHints hints; + + SDL_VERSION( &info.version ); + if( !SDL_GetWMInfo( &info ) ) { + return; + } + if( info.subsystem != SDL_SYSWM_X11 ) { + return; + } + + dpy = info.info.x11.display; + win = info.info.x11.window; + + memset( &hints, 0, sizeof( hints ) ); + hints.flags = PMinSize|PResizeInc; + hints.min_width = 64; + hints.min_height = 64; + hints.width_inc = 8; + hints.height_inc = 2; + + XSetWMSizeHints( dpy, win, &hints, XA_WM_SIZE_HINTS ); +#endif +} + +static qboolean SetMode( int flags, int forcedepth ) { SDL_Surface *surf; vrect_t rc; int depth; flags &= ~(SDL_FULLSCREEN|SDL_RESIZABLE); - sdl.flags &= ~QVF_FULLSCREEN; + sdl.flags &= ~QVF_FULLSCREEN; if( vid_fullscreen->integer > 0 ) { - Video_GetModeFS( &rc, NULL, &depth ); + VID_GetModeFS( &rc, NULL, &depth ); if( forcedepth ) { depth = forcedepth; } @@ -76,76 +108,61 @@ static qboolean QSDL_SetMode( int flags, int forcedepth ) { rc.width, rc.height, depth ); surf = SDL_SetVideoMode( rc.width, rc.height, depth, flags | SDL_FULLSCREEN ); - if( surf ) { - sdl.flags |= QVF_FULLSCREEN; + if( surf ) { + sdl.flags |= QVF_FULLSCREEN; goto success; } - Com_EPrintf( "Fullscreen video mode failed: %s\n", SDL_GetError() ); + Com_EPrintf( "Fullscreen video mode failed: %s\n", SDL_GetError() ); Cvar_Set( "vid_fullscreen", "0" ); } flags |= SDL_RESIZABLE; - Video_GetPlacement( &rc ); + VID_GetGeometry( &rc ); Com_DPrintf( "...setting windowed mode: %dx%d\n", rc.width, rc.height ); surf = SDL_SetVideoMode( rc.width, rc.height, forcedepth, flags ); if( !surf ) { return qfalse; } - + success: + SetHints(); sdl.surface = surf; ref.ModeChanged( rc.width, rc.height, sdl.flags, surf->pitch, surf->pixels ); SCR_ModeChanged(); return qtrue; } -static void QSDL_Activate( SDL_Event *event ) { - // state is actually a bitmask! - if( event->active.state & SDL_APPACTIVE ) { - CL_AppActivate( event->active.gain ? qtrue : qfalse ); +/* +============ +VID_ModeChanged +============ +*/ +void VID_ModeChanged( void ) { + if( !SetMode( sdl.surface->flags, sdl.surface->format->BitsPerPixel ) ) { + Com_Error( ERR_FATAL, "Couldn't change video mode: %s", SDL_GetError() ); } } -void Video_ModeChanged( void ) { - SDL_Event event; +static qboolean InitVideo( void ) { + SDL_Color color; + byte *dst; + char buffer[MAX_QPATH]; + int i, ret; - if( !QSDL_SetMode( sdl.surface->flags, sdl.surface->format->BitsPerPixel ) ) { - Com_Error( ERR_FATAL, "Couldn't change video mode: %s", SDL_GetError() ); + if( SDL_WasInit( SDL_INIT_EVERYTHING ) == 0 ) { + ret = SDL_Init( SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE ); + } else { + ret = SDL_InitSubSystem( SDL_INIT_VIDEO ); } - // ignore any pending resize events - while( SDL_PollEvent( &event ) ) { - switch( event.type ) { - case SDL_ACTIVEEVENT: - QSDL_Activate( &event ); - break; - case SDL_QUIT: - Com_Quit(); - break; - } + if( ret == -1 ) { + Com_EPrintf( "Couldn't initialize SDL video: %s\n", SDL_GetError() ); + return qfalse; } -} - -static qboolean QSDL_InitVideo( void ) { - SDL_Color color; - byte *dst; - char buffer[MAX_QPATH]; - int i, ret; - - if( SDL_WasInit( SDL_INIT_EVERYTHING ) == 0 ) { - ret = SDL_Init( SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE ); - } else { - ret = SDL_InitSubSystem( SDL_INIT_VIDEO ); - } - if( ret == -1 ) { - Com_EPrintf( "Couldn't initialize SDL video: %s\n", SDL_GetError() ); - return qfalse; - } - - if( SDL_VideoDriverName( buffer, sizeof( buffer ) ) != NULL ) { - Com_Printf( "Using SDL video driver: %s\n", buffer ); - } + if( SDL_VideoDriverName( buffer, sizeof( buffer ) ) != NULL ) { + Com_Printf( "Using SDL video driver: %s\n", buffer ); + } sdl.icon = SDL_CreateRGBSurface( SDL_SWSURFACE, q2icon_width, q2icon_height, 8, 0, 0, 0, 0 ); @@ -169,41 +186,39 @@ static qboolean QSDL_InitVideo( void ) { SDL_WM_SetIcon( sdl.icon, NULL ); } - if( SDL_GetGammaRamp( sdl.gamma[0], sdl.gamma[1], sdl.gamma[2] ) != -1 ) { - Com_DPrintf( "...enabling gamma control\n" ); - sdl.flags |= QVF_GAMMARAMP; - } + if( SDL_GetGammaRamp( sdl.gamma[0], sdl.gamma[1], sdl.gamma[2] ) != -1 ) { + Com_DPrintf( "...enabling gamma control\n" ); + sdl.flags |= QVF_GAMMARAMP; + } - SDL_WM_SetCaption( APPLICATION, APPLICATION ); + SDL_WM_SetCaption( APPLICATION, APPLICATION ); - SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); + SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); - return qtrue; + return qtrue; } -static void QSDL_ShutdownVideo( void ) { - if( sdl.flags & QVF_GAMMARAMP ) { - SDL_SetGammaRamp( sdl.gamma[0], sdl.gamma[1], sdl.gamma[2] ); - } - - if( sdl.icon ) { - SDL_FreeSurface( sdl.icon ); - } - +static void ShutdownVideo( void ) { + if( sdl.flags & QVF_GAMMARAMP ) { + SDL_SetGammaRamp( sdl.gamma[0], sdl.gamma[1], sdl.gamma[2] ); + } + if( sdl.icon ) { + SDL_FreeSurface( sdl.icon ); + } memset( &sdl, 0, sizeof( sdl ) ); - if( SDL_WasInit( SDL_INIT_EVERYTHING ) == SDL_INIT_VIDEO ) { - SDL_Quit(); - } else { - SDL_QuitSubSystem( SDL_INIT_VIDEO ); - } + if( SDL_WasInit( SDL_INIT_EVERYTHING ) == SDL_INIT_VIDEO ) { + SDL_Quit(); + } else { + SDL_QuitSubSystem( SDL_INIT_VIDEO ); + } } -static void QSDL_UpdateGamma( const byte *table ) { - Uint16 ramp[256]; - int i; +static void UpdateGamma( const byte *table ) { + Uint16 ramp[256]; + int i; - if( sdl.flags & QVF_GAMMARAMP ) { + if( sdl.flags & QVF_GAMMARAMP ) { for( i = 0; i < 256; i++ ) { ramp[i] = table[i] << 8; } @@ -211,113 +226,124 @@ static void QSDL_UpdateGamma( const byte *table ) { } } -static void QSDL_KeyEvent( SDL_keysym *keysym, qboolean down ) { - unsigned key1, key2 = 0; +static void Activate( void ) { + int state = SDL_GetAppState(); + active_t active; + + if( state & SDL_APPACTIVE ) { + if( state & (SDL_APPMOUSEFOCUS|SDL_APPINPUTFOCUS) ) { + active = ACT_ACTIVATED; + } else { + active = ACT_RESTORED; + } + } else { + active = ACT_MINIMIZED; + } + + CL_Activate( active ); +} + +static void KeyEvent( SDL_keysym *keysym, qboolean down ) { + unsigned key1, key2 = 0; if( keysym->sym <= 127 ) { // ASCII chars are mapped directly - Key_Event( keysym->sym, down, com_eventTime ); + Key_Event( keysym->sym, down, com_eventTime ); return; } -#define K( s, d ) case SDLK_ ## s: key1 = K_ ## d; break; -#define KK( s, d1, d2 ) case SDLK_ ## s: key1 = K_ ## d1; key2 = K_ ## d2; break; - - switch( keysym->sym ) { - K( KP0, KP_INS ) - K( KP1, KP_END ) - K( KP2, KP_DOWNARROW ) - K( KP3, KP_PGDN ) - K( KP4, KP_LEFTARROW ) - K( KP5, KP_5 ) - K( KP6, KP_RIGHTARROW ) - K( KP7, KP_HOME ) - K( KP8, KP_UPARROW ) - K( KP9, KP_PGUP ) - K( KP_PERIOD, KP_DEL ) - K( KP_DIVIDE, KP_SLASH ) - K( KP_MULTIPLY, KP_MULTIPLY ) - K( KP_MINUS, KP_MINUS ) - K( KP_PLUS, KP_PLUS ) - K( KP_ENTER, KP_ENTER ) - - K( UP, UPARROW ) - K( DOWN, DOWNARROW ) - K( RIGHT, RIGHTARROW ) - K( LEFT, LEFTARROW ) - K( INSERT, INS ) - K( HOME, HOME ) - K( END, END ) - K( PAGEUP, PGUP ) - K( PAGEDOWN, PGDN ) - - K( F1, F1 ) - K( F2, F2 ) - K( F3, F3 ) - K( F4, F4 ) - K( F5, F5 ) - K( F6, F6 ) - K( F7, F7 ) - K( F8, F8 ) - K( F9, F9 ) - K( F10, F10 ) - K( F11, F11 ) - K( F12, F12 ) - - K( NUMLOCK, NUMLOCK ) - K( CAPSLOCK, CAPSLOCK ) - K( SCROLLOCK, SCROLLOCK ) - K( LSUPER, LWINKEY ) - K( RSUPER, RWINKEY ) - K( MENU, MENU ) - - KK( RSHIFT, SHIFT, RSHIFT ) - KK( LSHIFT, SHIFT, LSHIFT ) - KK( RCTRL, CTRL, RCTRL ) - KK( LCTRL, CTRL, LCTRL ) - KK( RALT, ALT, RALT ) - KK( LALT, ALT, LALT ) +#define K( s, d ) case SDLK_ ## s: key1 = K_ ## d; break; +#define KK( s, d1, d2 ) case SDLK_ ## s: key1 = K_ ## d1; key2 = K_ ## d2; break; + + switch( keysym->sym ) { + K( KP0, KP_INS ) + K( KP1, KP_END ) + K( KP2, KP_DOWNARROW ) + K( KP3, KP_PGDN ) + K( KP4, KP_LEFTARROW ) + K( KP5, KP_5 ) + K( KP6, KP_RIGHTARROW ) + K( KP7, KP_HOME ) + K( KP8, KP_UPARROW ) + K( KP9, KP_PGUP ) + K( KP_PERIOD, KP_DEL ) + K( KP_DIVIDE, KP_SLASH ) + K( KP_MULTIPLY, KP_MULTIPLY ) + K( KP_MINUS, KP_MINUS ) + K( KP_PLUS, KP_PLUS ) + K( KP_ENTER, KP_ENTER ) + + K( UP, UPARROW ) + K( DOWN, DOWNARROW ) + K( RIGHT, RIGHTARROW ) + K( LEFT, LEFTARROW ) + K( INSERT, INS ) + K( HOME, HOME ) + K( END, END ) + K( PAGEUP, PGUP ) + K( PAGEDOWN, PGDN ) + + K( F1, F1 ) + K( F2, F2 ) + K( F3, F3 ) + K( F4, F4 ) + K( F5, F5 ) + K( F6, F6 ) + K( F7, F7 ) + K( F8, F8 ) + K( F9, F9 ) + K( F10, F10 ) + K( F11, F11 ) + K( F12, F12 ) + + K( NUMLOCK, NUMLOCK ) + K( CAPSLOCK, CAPSLOCK ) + K( SCROLLOCK, SCROLLOCK ) + K( LSUPER, LWINKEY ) + K( RSUPER, RWINKEY ) + K( MENU, MENU ) + + KK( RSHIFT, SHIFT, RSHIFT ) + KK( LSHIFT, SHIFT, LSHIFT ) + KK( RCTRL, CTRL, RCTRL ) + KK( LCTRL, CTRL, LCTRL ) + KK( RALT, ALT, RALT ) + KK( LALT, ALT, LALT ) #undef K #undef KK - default: - Com_DPrintf( "%s: unknown keysym %d\n", __func__, keysym->sym ); + default: + Com_DPrintf( "%s: unknown keysym %d\n", __func__, keysym->sym ); return; - } + } - Key_Event( key1, down, com_eventTime ); + Key_Event( key1, down, com_eventTime ); if( key2 ) { - Key_Event( key2, down, com_eventTime ); + Key_Event( key2, down, com_eventTime ); } } -static void QSDL_MouseButtonEvent( int button, qboolean down ) { +static void ButtonEvent( int button, qboolean down ) { unsigned key; - if( !sdl.mouseinitialized ) { + if( !sdl.mouse.initialized ) { return; } - if( !sdl.mouseactive ) { - QSDL_AcquireMouse(); - sdl.mouseactive = qtrue; - return; - } - -#define K( s, d ) case SDL_BUTTON_ ## s: key = K_ ## d; break; +#define K( s, d ) case SDL_BUTTON_ ## s: key = K_ ## d; break; switch( button ) { - K( LEFT, MOUSE1 ) - K( RIGHT, MOUSE2 ) - K( MIDDLE, MOUSE3 ) - K( WHEELUP, MWHEELUP ) - K( WHEELDOWN, MWHEELDOWN ) + K( LEFT, MOUSE1 ) + K( RIGHT, MOUSE2 ) + K( MIDDLE, MOUSE3 ) + K( WHEELUP, MWHEELUP ) + K( WHEELDOWN, MWHEELDOWN ) #undef K default: - Com_DPrintf( "%s: unknown button %d\n", __func__, button ); + Com_DPrintf( "%s: unknown button %d\n", __func__, button ); return; } @@ -326,44 +352,45 @@ static void QSDL_MouseButtonEvent( int button, qboolean down ) { /* ============ -Video_PumpEvents +VID_PumpEvents ============ */ -void Video_PumpEvents( void ) { - SDL_Event event; - - while( SDL_PollEvent( &event ) ) { - switch( event.type ) { - case SDL_ACTIVEEVENT: - QSDL_Activate( &event ); - break; - case SDL_QUIT: - Com_Quit(); - break; +void VID_PumpEvents( void ) { + SDL_Event event; + + while( SDL_PollEvent( &event ) ) { + switch( event.type ) { + case SDL_ACTIVEEVENT: + Activate(); + break; + case SDL_QUIT: + Com_Quit(); + break; case SDL_VIDEORESIZE: if( sdl.surface->flags & SDL_RESIZABLE ) { - event.resize.w &= ~7; - event.resize.h &= ~1; - Cvar_Set( "vid_placement", va( "%dx%d", + Cvar_Set( "vid_geometry", va( "%dx%d", event.resize.w, event.resize.h ) ); - Video_ModeChanged(); + VID_ModeChanged(); return; } break; - case SDL_KEYDOWN: - QSDL_KeyEvent( &event.key.keysym, qtrue ); - break; - case SDL_KEYUP: - QSDL_KeyEvent( &event.key.keysym, qfalse ); - break; - case SDL_MOUSEBUTTONDOWN: - QSDL_MouseButtonEvent( event.button.button, qtrue ); + case SDL_KEYDOWN: + KeyEvent( &event.key.keysym, qtrue ); break; - case SDL_MOUSEBUTTONUP: - QSDL_MouseButtonEvent( event.button.button, qfalse ); + case SDL_KEYUP: + KeyEvent( &event.key.keysym, qfalse ); break; - } - } + case SDL_MOUSEBUTTONDOWN: + ButtonEvent( event.button.button, qtrue ); + break; + case SDL_MOUSEBUTTONUP: + ButtonEvent( event.button.button, qfalse ); + break; + case SDL_MOUSEMOTION: + IN_MouseEvent( event.motion.x, event.motion.y ); + break; + } + } } @@ -375,44 +402,44 @@ OPENGL SPECIFIC =============================================================================== */ -static qboolean QSDL_InitGL( void ) { - cvar_t *gl_driver; +static qboolean InitGL( void ) { + cvar_t *gl_driver; - if( !QSDL_InitVideo() ) { - return qfalse; - } + if( !InitVideo() ) { + return qfalse; + } - gl_driver = Cvar_Get( "gl_driver", DEFAULT_OPENGL_DRIVER, CVAR_LATCH ); + gl_driver = Cvar_Get( "gl_driver", DEFAULT_OPENGL_DRIVER, CVAR_LATCH ); - if( SDL_GL_LoadLibrary( gl_driver->string ) == -1 ) { - Com_EPrintf( "Couldn't load OpenGL library: %s\n", SDL_GetError() ); + if( SDL_GL_LoadLibrary( gl_driver->string ) == -1 ) { + Com_EPrintf( "Couldn't load OpenGL library: %s\n", SDL_GetError() ); goto fail; - } + } - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); - sdl.flags |= QVF_ACCELERATED; + sdl.flags |= QVF_ACCELERATED; - if( !QSDL_SetMode( SDL_OPENGL|SDL_RESIZABLE, 0 ) ) { + if( !SetMode( SDL_OPENGL|SDL_RESIZABLE, 0 ) ) { Com_EPrintf( "Couldn't set video mode: %s\n", SDL_GetError() ); goto fail; } // sdl.glXGetVideoSyncSGI = SDL_GL_GetProcAddress( "glXGetVideoSyncSGI" ); - CL_AppActivate( qtrue ); - return qtrue; + Activate(); + return qtrue; fail: - QSDL_ShutdownVideo(); - return qfalse; + ShutdownVideo(); + return qfalse; } #if 0 -qboolean QSDL_VideoSync( void ) { +qboolean VideoSync( void ) { GLuint count; static GLuint oldcount; @@ -420,7 +447,7 @@ qboolean QSDL_VideoSync( void ) { if( count != oldcount ) { oldcount = count; - SDL_GL_SwapBuffers(); + SDL_GL_SwapBuffers(); // Com_Printf( "%u ", count ); return qtrue; } @@ -428,21 +455,26 @@ qboolean QSDL_VideoSync( void ) { } #endif -static void QSDL_BeginFrameGL( void ) { +static void BeginFrameGL( void ) { } -static void QSDL_EndFrameGL( void ) { - SDL_GL_SwapBuffers(); +static void EndFrameGL( void ) { + SDL_GL_SwapBuffers(); } -void Video_FillGLAPI( videoAPI_t *api ) { - api->Init = QSDL_InitGL; - api->Shutdown = QSDL_ShutdownVideo; - api->UpdateGamma = QSDL_UpdateGamma; +/* +============ +VID_FillGLAPI +============ +*/ +void VID_FillGLAPI( videoAPI_t *api ) { + api->Init = InitGL; + api->Shutdown = ShutdownVideo; + api->UpdateGamma = UpdateGamma; api->UpdatePalette = NULL; - api->GetProcAddr = SDL_GL_GetProcAddress; - api->BeginFrame = QSDL_BeginFrameGL; - api->EndFrame = QSDL_EndFrameGL; + api->GetProcAddr = SDL_GL_GetProcAddress; + api->BeginFrame = BeginFrameGL; + api->EndFrame = EndFrameGL; } /* @@ -455,52 +487,57 @@ SOFTWARE SPECIFIC #ifndef REF_HARD_LINKED -static qboolean QSDL_InitSoft( void ) { - if( !QSDL_InitVideo() ) { - return qfalse; - } +static qboolean InitSoft( void ) { + if( !InitVideo() ) { + return qfalse; + } - if( !QSDL_SetMode( SDL_SWSURFACE|SDL_HWPALETTE|SDL_RESIZABLE, 8 ) ) { + if( !SetMode( SDL_SWSURFACE|SDL_HWPALETTE|SDL_RESIZABLE, 8 ) ) { Com_EPrintf( "Couldn't set video mode: %s\n", SDL_GetError() ); - QSDL_ShutdownVideo(); + ShutdownVideo(); return qfalse; } - CL_AppActivate( qtrue ); - return qtrue; + Activate(); + return qtrue; } -static void QSDL_UpdatePalette( const byte *palette ) { - SDL_Color colors[256]; - SDL_Color *c; +static void UpdatePalette( const byte *palette ) { + SDL_Color colors[256]; + SDL_Color *c; - for( c = colors; c < colors + 256; c++ ) { - c->r = palette[0]; - c->g = palette[1]; - c->b = palette[2]; - palette += 4; - } + for( c = colors; c < colors + 256; c++ ) { + c->r = palette[0]; + c->g = palette[1]; + c->b = palette[2]; + palette += 4; + } - SDL_SetPalette( sdl.surface, SDL_LOGPAL, colors, 0, 256 ); + SDL_SetPalette( sdl.surface, SDL_LOGPAL, colors, 0, 256 ); } -static void QSDL_BeginFrameSoft( void ) { - SDL_LockSurface( sdl.surface ); +static void BeginFrameSoft( void ) { + SDL_LockSurface( sdl.surface ); } -static void QSDL_EndFrameSoft( void ) { - SDL_UnlockSurface( sdl.surface ); - SDL_Flip( sdl.surface ); +static void EndFrameSoft( void ) { + SDL_UnlockSurface( sdl.surface ); + SDL_Flip( sdl.surface ); } -void Video_FillSWAPI( videoAPI_t *api ) { - api->Init = QSDL_InitSoft; - api->Shutdown = QSDL_ShutdownVideo; - api->UpdateGamma = QSDL_UpdateGamma; - api->UpdatePalette = QSDL_UpdatePalette; - api->GetProcAddr = NULL; - api->BeginFrame = QSDL_BeginFrameSoft; - api->EndFrame = QSDL_EndFrameSoft; +/* +============ +VID_FillSWAPI +============ +*/ +void VID_FillSWAPI( videoAPI_t *api ) { + api->Init = InitSoft; + api->Shutdown = ShutdownVideo; + api->UpdateGamma = UpdateGamma; + api->UpdatePalette = UpdatePalette; + api->GetProcAddr = NULL; + api->BeginFrame = BeginFrameSoft; + api->EndFrame = EndFrameSoft; } #endif // !REF_HARD_LINKED @@ -515,99 +552,103 @@ SDL MOUSE DRIVER #define SDL_FULLFOCUS (SDL_APPACTIVE|SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS) -void QSDL_AcquireMouse( void ) { +static void AcquireMouse( void ) { int state; - // move cursor to center of the main window before we grab the mouse - if( sdl.surface ) { - SDL_WarpMouse( sdl.surface->w / 2, sdl.surface->h / 2 ); - } + // move cursor to center of the main window before we grab the mouse + if( sdl.surface ) { + SDL_WarpMouse( sdl.surface->w / 2, sdl.surface->h / 2 ); + } - // pump mouse motion events generated by SDL_WarpMouse - SDL_PollEvent( NULL ); + // pump mouse motion events generated by SDL_WarpMouse + SDL_PollEvent( NULL ); - // grab the mouse, so SDL enters relative mouse mode - SDL_WM_GrabInput( SDL_GRAB_ON ); + // grab the mouse, so SDL enters relative mouse mode + SDL_WM_GrabInput( SDL_GRAB_ON ); state = SDL_GetAppState(); if( ( state & SDL_FULLFOCUS ) != SDL_FULLFOCUS ) { - Com_DPrintf( "QSDL_AcquireMouse: don't have full focus\n" ); + Com_DPrintf( "AcquireMouse: don't have full focus\n" ); } - SDL_ShowCursor( SDL_DISABLE ); - - // pump mouse motion events still pending - SDL_PollEvent( NULL ); + SDL_ShowCursor( SDL_DISABLE ); + + // pump mouse motion events still pending + SDL_PollEvent( NULL ); - // clear any deltas generated - SDL_GetRelativeMouseState( NULL, NULL ); + // clear any deltas generated + SDL_GetRelativeMouseState( NULL, NULL ); } -static void QSDL_DeAcquireMouse( void ) { - // release the mouse - SDL_ShowCursor( SDL_ENABLE ); - SDL_WM_GrabInput( SDL_GRAB_OFF ); +static qboolean GetMouseMotion( int *dx, int *dy ) { + if( !sdl.mouse.grabbed ) { + return qfalse; + } + SDL_GetRelativeMouseState( dx, dy ); + return qtrue; } -static void QSDL_SendMouseMoveEvents( void ) { - int dx, dy; - - if( !sdl.mouseinitialized ) { - return; - } - - if( !sdl.mouseactive ) { - return; - } - - SDL_GetRelativeMouseState( &dx, &dy ); - - if( dx || dy ) { - CL_MouseEvent( dx, dy ); - } +static void WarpMouse( int x, int y ) { + SDL_WarpMouse( x, y ); + SDL_PollEvent( NULL ); + SDL_GetRelativeMouseState( NULL, NULL ); } -static void QSDL_ShutdownMouse( void ) { - QSDL_DeAcquireMouse(); - sdl.mouseactive = qfalse; - sdl.mouseinitialized = qfalse; +static void ShutdownMouse( void ) { + // release the mouse + SDL_ShowCursor( SDL_ENABLE ); + SDL_WM_GrabInput( SDL_GRAB_OFF ); + SDL_WM_SetCaption( APPLICATION, APPLICATION ); + memset( &sdl.mouse, 0, sizeof( sdl.mouse ) ); } -static qboolean QSDL_InitMouse( void ) { - if( SDL_WasInit( SDL_INIT_VIDEO ) != SDL_INIT_VIDEO ) { - return qfalse; - } +static qboolean InitMouse( void ) { + if( SDL_WasInit( SDL_INIT_VIDEO ) != SDL_INIT_VIDEO ) { + return qfalse; + } - sdl.mouseinitialized = qtrue; + Com_Printf( "SDL mouse initialized.\n" ); + sdl.mouse.initialized = qtrue; - return qtrue; + return qtrue; } -static void QSDL_ActivateMouse( qboolean active ) { - if( !sdl.mouseinitialized ) { - return; - } - - if( sdl.mouseactive == active ) { - // return; - } +static void GrabMouse( grab_t grab ) { + if( !sdl.mouse.initialized ) { + return; + } - if( active ) { - QSDL_AcquireMouse(); - } else { - QSDL_DeAcquireMouse(); - } + if( sdl.mouse.grabbed == grab ) { + return; + } - sdl.mouseactive = active; -} + if( grab == IN_GRAB ) { + AcquireMouse(); + SDL_WM_SetCaption( "[" APPLICATION "]", APPLICATION ); + } else { + if( sdl.mouse.grabbed == IN_GRAB ) { + SDL_WM_GrabInput( SDL_GRAB_OFF ); + SDL_WM_SetCaption( APPLICATION, APPLICATION ); + } + if( grab == IN_HIDE ) { + SDL_ShowCursor( SDL_DISABLE ); + } else { + SDL_ShowCursor( SDL_ENABLE ); + } + } -static void QSDL_ClearMouseStates( void ) { - // no work here + sdl.mouse.grabbed = grab; } -void Video_FillInputAPI( inputAPI_t *api ) { - api->Init = QSDL_InitMouse; - api->Shutdown = QSDL_ShutdownMouse; - api->Activate = QSDL_ActivateMouse; - api->Frame = QSDL_SendMouseMoveEvents; - api->ClearStates = QSDL_ClearMouseStates; +/* +============ +VID_FillInputAPI +============ +*/ +void VID_FillInputAPI( inputAPI_t *api ) { + api->Init = InitMouse; + api->Shutdown = ShutdownMouse; + api->Grab = GrabMouse; + api->Warp = WarpMouse; + api->GetEvents = NULL; + api->GetMotion = GetMouseMotion; } |