From b096ca1d04d4a1b35b76c9701134b3ca22ccd424 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Mon, 14 Sep 2009 22:07:34 +0000 Subject: [PATCH] Allow optional window resizing. Fixes Bugzilla #2844. --- README | 1 + code/sdl/sdl_glimp.c | 5 +++++ code/sdl/sdl_input.c | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/README b/README index 12219161..e0707ef1 100644 --- a/README +++ b/README @@ -159,6 +159,7 @@ New cvars ipv6 servers on the local network net_mcastiface - outgoing interface to use for scan + r_allowResize - make window resizable (SDL only) r_zProj - distance of observer camera to projection plane in quake3 standard units r_greyscale - render black and white images diff --git a/code/sdl/sdl_glimp.c b/code/sdl/sdl_glimp.c index ba08ade3..59c1e53c 100644 --- a/code/sdl/sdl_glimp.c +++ b/code/sdl/sdl_glimp.c @@ -79,6 +79,7 @@ static SDL_Surface *screen = NULL; static const SDL_VideoInfo *videoInfo = NULL; cvar_t *r_allowSoftwareGL; // Don't abort out if a hardware visual can't be obtained +cvar_t *r_allowResize; // make window resizable cvar_t *r_sdlDriver; void (APIENTRYP qglActiveTextureARB) (GLenum texture); @@ -215,6 +216,9 @@ static int GLimp_SetMode( int mode, qboolean fullscreen ) ri.Printf( PRINT_ALL, "Initializing OpenGL display\n"); + if ( r_allowResize->integer ) + flags |= SDL_RESIZABLE; + #if !SDL_VERSION_ATLEAST(1, 2, 10) // 1.2.10 is needed to get the desktop resolution displayAspect = 4.0f / 3.0f; @@ -667,6 +671,7 @@ void GLimp_Init( void ) { r_allowSoftwareGL = ri.Cvar_Get( "r_allowSoftwareGL", "0", CVAR_LATCH ); r_sdlDriver = ri.Cvar_Get( "r_sdlDriver", "", CVAR_ROM ); + r_allowResize = ri.Cvar_Get( "r_allowResize", "0", CVAR_ARCHIVE ); Sys_GLimpInit( ); diff --git a/code/sdl/sdl_input.c b/code/sdl/sdl_input.c index a74887a0..4949dc18 100644 --- a/code/sdl/sdl_input.c +++ b/code/sdl/sdl_input.c @@ -70,6 +70,8 @@ static cvar_t *in_joystickDebug = NULL; static cvar_t *in_joystickThreshold = NULL; static cvar_t *in_joystickNo = NULL; +static int vidRestartTime = 0; + #define CTRL(a) ((a)-'a'+1) /* @@ -901,6 +903,21 @@ static void IN_ProcessEvents( void ) Sys_Quit( ); break; + case SDL_VIDEORESIZE: + { + char width[32], height[32]; + Com_sprintf( width, sizeof(width), "%d", e.resize.w ); + Com_sprintf( height, sizeof(height), "%d", e.resize.h ); + ri.Cvar_Set( "r_customwidth", width ); + ri.Cvar_Set( "r_customheight", height ); + ri.Cvar_Set( "r_mode", "-1" ); + /* wait until user stops dragging for 1 second, so + we aren't constantly recreating the GL context while + he tries to drag...*/ + vidRestartTime = Sys_Milliseconds() + 1000; + } + break; + default: break; } @@ -939,6 +956,13 @@ void IN_Frame( void ) } else IN_ActivateMouse( ); + + /* in case we had to delay actual restart of video system... */ + if ( (vidRestartTime != 0) && (vidRestartTime < Sys_Milliseconds()) ) + { + vidRestartTime = 0; + Cbuf_AddText( "vid_restart" ); + } } /*