X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=vid_sdl.c;h=2fb307c52d41b65ec095bf81b7ee9f5bfed7aceb;hp=248baac760cecccfade6af4180ae8ff37fb0de3a;hb=45e243af848a57db51089ede24ff46d4f05d3047;hpb=f070d358e31542df4f016558be6bf30dfb07aa84 diff --git a/vid_sdl.c b/vid_sdl.c index 248baac7..2fb307c5 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -30,8 +30,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include -static cvar_t apple_mouse_noaccel = {CVAR_SAVE, "apple_mouse_noaccel", "1", "disables mouse acceleration while DarkPlaces is active"}; -static qboolean vid_usingnoaccel; +static cvar_t apple_mouse_noaccel = {CF_CLIENT | CF_ARCHIVE, "apple_mouse_noaccel", "1", "disables mouse acceleration while DarkPlaces is active"}; +static qbool vid_usingnoaccel; static double originalMouseSpeed = -1.0; io_connect_t IN_GetIOHandle(void) { @@ -63,15 +63,17 @@ io_connect_t IN_GetIOHandle(void) // Tell startup code that we have a client int cl_available = true; -qboolean vid_supportrefreshrate = false; +qbool vid_supportrefreshrate = false; -static qboolean vid_usingmouse = false; -static qboolean vid_usingmouse_relativeworks = false; // SDL2 workaround for unimplemented RelativeMouse mode -static qboolean vid_usinghidecursor = false; -static qboolean vid_hasfocus = false; -static qboolean vid_isfullscreen; -static qboolean vid_usingvsync = false; +static qbool vid_usingmouse = false; +static qbool vid_usingmouse_relativeworks = false; // SDL2 workaround for unimplemented RelativeMouse mode +static qbool vid_usinghidecursor = false; +static qbool vid_hasfocus = false; +static qbool vid_isfullscreen; +static qbool vid_usingvsync = false; static SDL_Joystick *vid_sdljoystick = NULL; +static SDL_GameController *vid_sdlgamecontroller = NULL; +static cvar_t joy_sdl2_trigger_deadzone = {CF_ARCHIVE | CF_CLIENT, "joy_sdl2_trigger_deadzone", "0.5", "deadzone for triggers to be registered as key presses"}; // GAME_STEELSTORM specific static cvar_t *steelstorm_showing_map = NULL; // detect but do not create the cvar static cvar_t *steelstorm_showing_mousecursor = NULL; // detect but do not create the cvar @@ -339,12 +341,12 @@ static int MapKey( unsigned int sdlkey ) } } -qboolean VID_HasScreenKeyboardSupport(void) +qbool VID_HasScreenKeyboardSupport(void) { return SDL_HasScreenKeyboardSupport() != SDL_FALSE; } -void VID_ShowKeyboard(qboolean show) +void VID_ShowKeyboard(qbool show) { if (!SDL_HasScreenKeyboardSupport()) return; @@ -361,12 +363,12 @@ void VID_ShowKeyboard(qboolean show) } } -qboolean VID_ShowingKeyboard(void) +qbool VID_ShowingKeyboard(void) { return SDL_IsTextInputActive() != 0; } -void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecursor) +void VID_SetMouse(qbool fullscreengrab, qbool relative, qbool hidecursor) { #ifndef DP_MOBILETOUCH #ifdef MACOSX @@ -453,14 +455,14 @@ float multitouch[MAXFINGERS][3]; int multitouchs[MAXFINGERS]; // modified heavily by ELUAN -static qboolean VID_TouchscreenArea(int corner, float px, float py, float pwidth, float pheight, const char *icon, float textheight, const char *text, float *resultmove, qboolean *resultbutton, keynum_t key, const char *typedtext, float deadzone, float oversizepixels_x, float oversizepixels_y, qboolean iamexclusive) +static qbool VID_TouchscreenArea(int corner, float px, float py, float pwidth, float pheight, const char *icon, float textheight, const char *text, float *resultmove, qbool *resultbutton, keynum_t key, const char *typedtext, float deadzone, float oversizepixels_x, float oversizepixels_y, qbool iamexclusive) { int finger; float fx, fy, fwidth, fheight; float overfx, overfy, overfwidth, overfheight; float rel[3]; float sqsum; - qboolean button = false; + qbool button = false; VectorClear(rel); if (pwidth > 0 && pheight > 0) { @@ -566,11 +568,11 @@ static qboolean VID_TouchscreenArea(int corner, float px, float py, float pwidth // ELUAN: // not reentrant, but we only need one mouse cursor anyway... -static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheight, qboolean *resultbutton, keynum_t key) +static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheight, qbool *resultbutton, keynum_t key) { int finger; float fx, fy, fwidth, fheight; - qboolean button = false; + qbool button = false; static int cursorfinger = -1; static int cursorfreemovement = false; static int canclick = false; @@ -605,7 +607,7 @@ static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheigh } if (scr_numtouchscreenareas < 128) { - if (clickrealtime + 1 > realtime) + if (clickrealtime + 1 > host.realtime) { scr_touchscreenareas[scr_numtouchscreenareas].pic = "gfx/gui/touch_puck_cur_click.tga"; } @@ -615,7 +617,7 @@ static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheigh } else { - switch ((int)realtime * 10 % 20) + switch ((int)host.realtime * 10 % 20) { case 0: scr_touchscreenareas[scr_numtouchscreenareas].pic = "gfx/gui/touch_puck_cur_touch.tga"; @@ -669,11 +671,11 @@ static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheigh { Key_Event(key, 0, true); canclick = false; - clickrealtime = realtime; + clickrealtime = host.realtime; } // SS:BR can't qc can't cope with presses and releases on the same frame - if (clickrealtime && clickrealtime + 0.1 < realtime) + if (clickrealtime && clickrealtime + 0.1 < host.realtime) { Key_Event(key, 0, false); clickrealtime = 0; @@ -692,14 +694,31 @@ void VID_BuildJoyState(vid_joystate_t *joystate) { SDL_Joystick *joy = vid_sdljoystick; int j; - int numaxes; - int numbuttons; - numaxes = SDL_JoystickNumAxes(joy); - for (j = 0;j < numaxes;j++) - joystate->axis[j] = SDL_JoystickGetAxis(joy, j) * (1.0f / 32767.0f); - numbuttons = SDL_JoystickNumButtons(joy); - for (j = 0;j < numbuttons;j++) - joystate->button[j] = SDL_JoystickGetButton(joy, j); + + if (vid_sdlgamecontroller) + { + for (j = 0; j <= SDL_CONTROLLER_AXIS_MAX; ++j) + { + joystate->axis[j] = SDL_GameControllerGetAxis(vid_sdlgamecontroller, (SDL_GameControllerAxis)j) * (1.0f / 32767.0f); + } + for (j = 0; j < SDL_CONTROLLER_BUTTON_MAX; ++j) + joystate->button[j] = SDL_GameControllerGetButton(vid_sdlgamecontroller, (SDL_GameControllerButton)j); + // emulate joy buttons for trigger "axes" + joystate->button[SDL_CONTROLLER_BUTTON_MAX] = VID_JoyState_GetAxis(joystate, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 1, joy_sdl2_trigger_deadzone.value) > 0.0f; + joystate->button[SDL_CONTROLLER_BUTTON_MAX+1] = VID_JoyState_GetAxis(joystate, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 1, joy_sdl2_trigger_deadzone.value) > 0.0f; + } + else + + { + int numaxes; + int numbuttons; + numaxes = SDL_JoystickNumAxes(joy); + for (j = 0;j < numaxes;j++) + joystate->axis[j] = SDL_JoystickGetAxis(joy, j) * (1.0f / 32767.0f); + numbuttons = SDL_JoystickNumButtons(joy); + for (j = 0;j < numbuttons;j++) + joystate->button[j] = SDL_JoystickGetButton(joy, j); + } } VID_Shared_BuildJoyState_Finish(joystate); @@ -742,8 +761,8 @@ static void IN_Move_TouchScreen_SteelStorm(void) int i, numfingers; float xscale, yscale; float move[3], aim[3]; - static qboolean oldbuttons[128]; - static qboolean buttons[128]; + static qbool oldbuttons[128]; + static qbool buttons[128]; keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest; memcpy(oldbuttons, buttons, sizeof(oldbuttons)); memset(multitouchs, 0, sizeof(multitouchs)); @@ -855,8 +874,8 @@ static void IN_Move_TouchScreen_Quake(void) { int x, y; float move[3], aim[3], click[3]; - static qboolean oldbuttons[128]; - static qboolean buttons[128]; + static qbool oldbuttons[128]; + static qbool buttons[128]; keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest; memcpy(oldbuttons, buttons, sizeof(oldbuttons)); memset(multitouchs, 0, sizeof(multitouchs)); @@ -875,7 +894,7 @@ static void IN_Move_TouchScreen_Quake(void) if (!VID_ShowingKeyboard()) { // user entered a command, close the console now - Con_ToggleConsole_f(); + Con_ToggleConsole_f(cmd_local); } VID_TouchscreenArea( 0, 0, 0, 0, 0, NULL , 0.0f, NULL, NULL, &buttons[15], (keynum_t)0, NULL, 0, 0, 0, true); VID_TouchscreenArea( 0, 0, 0, 0, 0, NULL , 0.0f, NULL, move, &buttons[0], K_MOUSE4, NULL, 0, 0, 0, true); @@ -925,7 +944,7 @@ void IN_Move( void ) static int old_x = 0, old_y = 0; static int stuck = 0; static keydest_t oldkeydest; - static qboolean oldshowkeyboard; + static qbool oldshowkeyboard; int x, y; vid_joystate_t joystate; keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest; @@ -1003,7 +1022,7 @@ void IN_Move( void ) //// #ifdef SDL_R_RESTART -static qboolean sdl_needs_restart; +static qbool sdl_needs_restart; static void sdl_start(void) { } @@ -1041,10 +1060,10 @@ static keynum_t buttonremap[] = // SDL2 void Sys_SendKeyEvents( void ) { - static qboolean sound_active = true; + static qbool sound_active = true; int keycode; int i; - qboolean isdown; + qbool isdown; Uchar unicode; SDL_Event event; @@ -1057,7 +1076,7 @@ void Sys_SendKeyEvents( void ) #ifdef DEBUGSDLEVENTS Con_DPrintf("SDL_Event: SDL_QUIT\n"); #endif - Sys_Quit(0); + host.state = host_shutdown; break; case SDL_KEYDOWN: case SDL_KEYUP: @@ -1156,11 +1175,11 @@ void Sys_SendKeyEvents( void ) vid.width = event.window.data1; vid.height = event.window.data2; #ifdef SDL_R_RESTART - // better not call R_Modules_Restart from here directly, as this may wreak havoc... + // better not call R_Modules_Restart_f from here directly, as this may wreak havoc... // so, let's better queue it for next frame if(!sdl_needs_restart) { - Cbuf_AddText("\nr_restart\n"); + Cbuf_AddText(cmd_local, "\nr_restart\n"); sdl_needs_restart = true; } #endif @@ -1183,7 +1202,7 @@ void Sys_SendKeyEvents( void ) vid_hasfocus = false; break; case SDL_WINDOWEVENT_CLOSE: - Sys_Quit(0); + host.state = host_shutdown; break; } } @@ -1292,12 +1311,12 @@ void *GL_GetProcAddress(const char *name) return p; } -qboolean GL_ExtensionSupported(const char *name) +qbool GL_ExtensionSupported(const char *name) { return SDL_GL_ExtensionSupported(name); } -static qboolean vid_sdl_initjoysticksystem = false; +static qbool vid_sdl_initjoysticksystem = false; void VID_Init (void) { @@ -1309,6 +1328,7 @@ void VID_Init (void) #ifdef DP_MOBILETOUCH Cvar_SetValueQuick(&vid_touchscreen, 1); #endif + Cvar_RegisterVariable(&joy_sdl2_trigger_deadzone); #ifdef SDL_R_RESTART R_RegisterModule("SDL", sdl_start, sdl_shutdown, sdl_newmap, NULL, NULL); @@ -1317,17 +1337,17 @@ void VID_Init (void) if (SDL_Init(SDL_INIT_VIDEO) < 0) Sys_Error ("Failed to init SDL video subsystem: %s", SDL_GetError()); vid_sdl_initjoysticksystem = SDL_InitSubSystem(SDL_INIT_JOYSTICK) >= 0; - if (vid_sdl_initjoysticksystem) - Con_Printf("Failed to init SDL joystick subsystem: %s\n", SDL_GetError()); + if (!vid_sdl_initjoysticksystem) + Con_Printf(CON_ERROR "Failed to init SDL joystick subsystem: %s\n", SDL_GetError()); vid_isfullscreen = false; } static int vid_sdljoystickindex = -1; -void VID_EnableJoystick(qboolean enable) +void VID_EnableJoystick(qbool enable) { int index = joy_enable.integer > 0 ? joy_index.integer : -1; int numsdljoysticks; - qboolean success = false; + qbool success = false; int sharedcount = 0; int sdlindex = -1; sharedcount = VID_Shared_SetJoystick(index); @@ -1348,19 +1368,31 @@ void VID_EnableJoystick(qboolean enable) vid_sdljoystickindex = sdlindex; // close SDL joystick if active if (vid_sdljoystick) + { SDL_JoystickClose(vid_sdljoystick); - vid_sdljoystick = NULL; + vid_sdljoystick = NULL; + } + if (vid_sdlgamecontroller) + { + SDL_GameControllerClose(vid_sdlgamecontroller); + vid_sdlgamecontroller = NULL; + } if (sdlindex >= 0) { vid_sdljoystick = SDL_JoystickOpen(sdlindex); if (vid_sdljoystick) { const char *joystickname = SDL_JoystickName(vid_sdljoystick); + if (SDL_IsGameController(vid_sdljoystickindex)) + { + vid_sdlgamecontroller = SDL_GameControllerOpen(vid_sdljoystickindex); + Con_DPrintf("Using SDL GameController mappings for Joystick %i\n", index); + } Con_Printf("Joystick %i opened (SDL_Joystick %i is \"%s\" with %i axes, %i buttons, %i balls)\n", index, sdlindex, joystickname, (int)SDL_JoystickNumAxes(vid_sdljoystick), (int)SDL_JoystickNumButtons(vid_sdljoystick), (int)SDL_JoystickNumBalls(vid_sdljoystick)); } else { - Con_Printf("Joystick %i failed (SDL_JoystickOpen(%i) returned: %s)\n", index, sdlindex, SDL_GetError()); + Con_Printf(CON_ERROR "Joystick %i failed (SDL_JoystickOpen(%i) returned: %s)\n", index, sdlindex, SDL_GetError()); sdlindex = -1; } } @@ -1386,6 +1418,11 @@ static void VID_OutputVersion(void) #ifdef WIN32 static void AdjustWindowBounds(viddef_mode_t *mode, RECT *rect) { + int workWidth; + int workHeight; + int titleBarPixels = 2; + int screenHeight; + RECT workArea; LONG width = mode->width; // vid_width LONG height = mode->height; // vid_height @@ -1396,16 +1433,14 @@ static void AdjustWindowBounds(viddef_mode_t *mode, RECT *rect) rect->bottom = height; AdjustWindowRectEx(rect, WS_CAPTION|WS_THICKFRAME, false, 0); - RECT workArea; SystemParametersInfo(SPI_GETWORKAREA, 0, &workArea, 0); - int workWidth = workArea.right - workArea.left; - int workHeight = workArea.bottom - workArea.top; + workWidth = workArea.right - workArea.left; + workHeight = workArea.bottom - workArea.top; // SDL forces the window height to be <= screen height - 27px (on Win8.1 - probably intended for the title bar) // If the task bar is docked to the the left screen border and we move the window to negative y, // there would be some part of the regular desktop visible on the bottom of the screen. - int titleBarPixels = 2; - int screenHeight = GetSystemMetrics(SM_CYSCREEN); + screenHeight = GetSystemMetrics(SM_CYSCREEN); if (screenHeight == workHeight) titleBarPixels = -rect->top; @@ -1427,13 +1462,21 @@ static void AdjustWindowBounds(viddef_mode_t *mode, RECT *rect) } #endif -static qboolean VID_InitModeGL(viddef_mode_t *mode) +extern cvar_t gl_info_vendor; +extern cvar_t gl_info_renderer; +extern cvar_t gl_info_version; +extern cvar_t gl_info_platform; +extern cvar_t gl_info_driver; + +static qbool VID_InitModeGL(viddef_mode_t *mode) { int windowflags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL; + // currently SDL_WINDOWPOS_UNDEFINED behaves exactly like SDL_WINDOWPOS_CENTERED, this might change some day + // https://trello.com/c/j56vUcwZ/81-centered-vs-undefined-window-position int xPos = SDL_WINDOWPOS_UNDEFINED; int yPos = SDL_WINDOWPOS_UNDEFINED; -#ifndef USE_GLES2 int i; +#ifndef USE_GLES2 const char *drivername; #endif @@ -1450,12 +1493,12 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) drivername = NULL; // COMMANDLINEOPTION: SDL GL: -gl_driver selects a GL driver library, default is whatever SDL recommends, useful only for 3dfxogl.dll/3dfxvgl.dll or fxmesa or similar, if you don't know what this is for, you don't need it - i = COM_CheckParm("-gl_driver"); - if (i && i < com_argc - 1) - drivername = com_argv[i + 1]; + i = Sys_CheckParm("-gl_driver"); + if (i && i < sys.argc - 1) + drivername = sys.argv[i + 1]; if (SDL_GL_LoadLibrary(drivername) < 0) { - Con_Printf("Unable to load GL driver \"%s\": %s\n", drivername, SDL_GetError()); + Con_Printf(CON_ERROR "Unable to load GL driver \"%s\": %s\n", drivername, SDL_GetError()); return false; } #endif @@ -1482,16 +1525,27 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) vid_isfullscreen = true; } else { + if (vid_borderless.integer) + windowflags |= SDL_WINDOW_BORDERLESS; #ifdef WIN32 - RECT rect; - AdjustWindowBounds(mode, &rect); - xPos = rect.left; - yPos = rect.top; + if (vid_ignore_taskbar.integer) { + xPos = SDL_WINDOWPOS_CENTERED; + yPos = SDL_WINDOWPOS_CENTERED; + } + else { + RECT rect; + AdjustWindowBounds(mode, &rect); + xPos = rect.left; + yPos = rect.top; + } #endif } } //flags |= SDL_HWSURFACE; + if (vid_mouse_clickthrough.integer && !vid_isfullscreen) + SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); + SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute (SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE, 8); @@ -1508,21 +1562,23 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) } #ifdef USE_GLES2 + SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 0); - SDL_GL_SetAttribute (SDL_GL_RETAINED_BACKING, 1); #else + SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, (gl_debug.integer > 0 ? SDL_GL_CONTEXT_DEBUG_FLAG : 0)); #endif + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, (gl_debug.integer > 0 ? SDL_GL_CONTEXT_DEBUG_FLAG : 0)); + video_bpp = mode->bitsperpixel; window_flags = windowflags; window = SDL_CreateWindow(gamename, xPos, yPos, mode->width, mode->height, windowflags); if (window == NULL) { - Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); + Con_Printf(CON_ERROR "Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); VID_Shutdown(); return false; } @@ -1530,7 +1586,7 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) context = SDL_GL_CreateContext(window); if (context == NULL) { - Con_Printf("Failed to initialize OpenGL context: %s\n", SDL_GetError()); + Con_Printf(CON_ERROR "Failed to initialize OpenGL context: %s\n", SDL_GetError()); VID_Shutdown(); return false; } @@ -1543,22 +1599,22 @@ static qboolean VID_InitModeGL(viddef_mode_t *mode) GL_Setup(); // VorteX: set other info - extern cvar_t gl_info_vendor; - extern cvar_t gl_info_renderer; - extern cvar_t gl_info_version; - extern cvar_t gl_info_platform; - extern cvar_t gl_info_driver; Cvar_SetQuick(&gl_info_vendor, gl_vendor); Cvar_SetQuick(&gl_info_renderer, gl_renderer); Cvar_SetQuick(&gl_info_version, gl_version); Cvar_SetQuick(&gl_info_platform, gl_platform ? gl_platform : ""); Cvar_SetQuick(&gl_info_driver, gl_driver); - // LordHavoc: report supported extensions + // LadyHavoc: report supported extensions + Con_DPrintf("\nQuakeC extensions for server and client:"); + for (i = 0; vm_sv_extensions[i]; i++) + Con_DPrintf(" %s", vm_sv_extensions[i]); + Con_DPrintf("\n"); #ifdef CONFIG_MENU - Con_DPrintf("\nQuakeC extensions for server and client: %s\nQuakeC extensions for menu: %s\n", vm_sv_extensions, vm_m_extensions); -#else - Con_DPrintf("\nQuakeC extensions for server and client: %s\n", vm_sv_extensions); + Con_DPrintf("\nQuakeC extensions for menu:"); + for (i = 0; vm_m_extensions[i]; i++) + Con_DPrintf(" %s", vm_m_extensions[i]); + Con_DPrintf("\n"); #endif // clear to black (loading plaque will be seen over this) @@ -1580,11 +1636,11 @@ extern cvar_t gl_info_version; extern cvar_t gl_info_platform; extern cvar_t gl_info_driver; -qboolean VID_InitMode(viddef_mode_t *mode) +qbool VID_InitMode(viddef_mode_t *mode) { // GAME_STEELSTORM specific - steelstorm_showing_map = Cvar_FindVar("steelstorm_showing_map"); - steelstorm_showing_mousecursor = Cvar_FindVar("steelstorm_showing_mousecursor"); + steelstorm_showing_map = Cvar_FindVar(&cvars_all, "steelstorm_showing_map", ~0); + steelstorm_showing_mousecursor = Cvar_FindVar(&cvars_all, "steelstorm_showing_mousecursor", ~0); if (!SDL_WasInit(SDL_INIT_VIDEO) && SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) Sys_Error ("Failed to init SDL video subsystem: %s", SDL_GetError()); @@ -1610,7 +1666,7 @@ void VID_Shutdown (void) void VID_Finish (void) { - qboolean vid_usevsync; + qbool vid_usevsync; vid_activewindow = !vid_hidden && vid_hasfocus; VID_UpdateGamma();