X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=vid_wgl.c;h=6a78bb0be99ca9599426f6488ff57779b2f70551;hp=781cad32879da781d5a69e4b45745f3a568970f4;hb=859321ff938fe9ba4c653edc794732c983582a6f;hpb=94c4d57c1fabb4ef6a4ff419666f4ae765629a68 diff --git a/vid_wgl.c b/vid_wgl.c index 781cad32..6a78bb0b 100644 --- a/vid_wgl.c +++ b/vid_wgl.c @@ -26,12 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAX_MODE_LIST 30 #define VID_ROW_SIZE 3 -#define WARP_WIDTH 320 -#define WARP_HEIGHT 200 #define MAXWIDTH 10000 #define MAXHEIGHT 10000 -#define BASEWIDTH 320 -#define BASEHEIGHT 200 #define MODE_WINDOWED 0 #define NO_MODE (MODE_WINDOWED - 1) @@ -66,7 +62,6 @@ const char *gl_renderer; const char *gl_version; const char *gl_extensions; -qboolean DDActive; qboolean scr_skipupdate; static vmode_t modelist[MAX_MODE_LIST]; @@ -79,7 +74,7 @@ static qboolean vid_initialized = false; static qboolean windowed, leavecurrentmode; static qboolean vid_canalttab = false; static qboolean vid_wassuspended = false; -static int windowed_mouse; +static int usingmouse; extern qboolean mouseactive; // from in_win.c static HICON hIcon; @@ -87,7 +82,7 @@ int DIBWidth, DIBHeight; RECT WindowRect; DWORD WindowStyle, ExWindowStyle; -HWND mainwindow, dibwindow; +HWND mainwindow; int vid_modenum = NO_MODE; int vid_realmode; @@ -98,8 +93,6 @@ unsigned char vid_curpal[256*3]; HGLRC baseRC; HDC maindc; -glvert_t glv; - HWND WINAPI InitializeWindow (HINSTANCE hInstance, int nCmdShow); viddef_t vid; // global video state @@ -116,60 +109,19 @@ void AppActivate(BOOL fActive, BOOL minimize); char *VID_GetModeDescription (int mode); void ClearAllStates (void); void VID_UpdateWindowStatus (void); -void GL_Init (void); - -// LordHavoc: ARB multitexture support -int gl_mtex_enum = 0; - -qboolean is8bit = false; -qboolean isPermedia = false; -qboolean isATI = false; // LordHavoc: special differences for ATI's broken drivers -qboolean isG200 = false; // LordHavoc: the Matrox G200 can't do per pixel alpha, and it uses a D3D driver for GL... ugh... -qboolean isRagePro = false; // LordHavoc: the ATI Rage Pro has limitations with per pixel alpha (the color scaler does not apply to per pixel alpha images...), although not as bad as a G200. -qboolean gl_mtexable = false; -qboolean gl_arrays = false; //==================================== -cvar_t vid_mode = {"vid_mode","0", false}; // Note that 0 is MODE_WINDOWED -cvar_t _vid_default_mode = {"_vid_default_mode","0", true}; +//cvar_t _vid_default_mode = {"_vid_default_mode","0", true}; // Note that 3 is MODE_FULLSCREEN_DEFAULT -cvar_t _vid_default_mode_win = {"_vid_default_mode_win","3", true}; -cvar_t vid_wait = {"vid_wait","0"}; -cvar_t vid_nopageflip = {"vid_nopageflip","0", true}; -cvar_t _vid_wait_override = {"_vid_wait_override", "0", true}; -cvar_t vid_config_x = {"vid_config_x","800", true}; -cvar_t vid_config_y = {"vid_config_y","600", true}; -cvar_t vid_stretch_by_2 = {"vid_stretch_by_2","1", true}; -cvar_t _windowed_mouse = {"_windowed_mouse","1", true}; +//cvar_t _vid_default_mode_win = {"_vid_default_mode_win","3", true}; int window_center_x, window_center_y, window_x, window_y, window_width, window_height; RECT window_rect; // direct draw software compatability stuff -void VID_HandlePause (qboolean pause) -{ -} - -void VID_ForceLockState (int lk) -{ -} - -void VID_LockBuffer (void) -{ -} - -void VID_UnlockBuffer (void) -{ -} - -int VID_ForceUnlockedAndReturnState (void) -{ - return 0; -} - void CenterWindow(HWND hWndCenter, int width, int height, BOOL lefttopjustify) { int CenterX, CenterY; @@ -199,71 +151,36 @@ qboolean VID_SetWindowedMode (int modenum) DIBWidth = modelist[modenum].width; DIBHeight = modelist[modenum].height; - WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | - WS_MINIMIZEBOX; + WindowStyle = WS_OVERLAPPED | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; ExWindowStyle = 0; rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); + AdjustWindowRectEx(&rect, WindowStyle, false, 0); width = rect.right - rect.left; height = rect.bottom - rect.top; // Create the DIB window - dibwindow = CreateWindowEx ( - ExWindowStyle, -#ifdef NEHAHRA - "DPNehahraQuake", - "DPNehahraGLQuake", -#else - "DarkPlacesQuake", - "DarkPlacesGLQuake", -#endif - WindowStyle, - rect.left, rect.top, - width, - height, - NULL, - NULL, - global_hInstance, - NULL); - - if (!dibwindow) + mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); + + if (!mainwindow) Sys_Error ("Couldn't create DIB window"); // Center and show the DIB window - CenterWindow(dibwindow, WindowRect.right - WindowRect.left, - WindowRect.bottom - WindowRect.top, false); + CenterWindow(mainwindow, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top, false); - ShowWindow (dibwindow, SW_SHOWDEFAULT); - UpdateWindow (dibwindow); + ShowWindow (mainwindow, SW_SHOWDEFAULT); + UpdateWindow (mainwindow); modestate = MS_WINDOWED; - // LordHavoc: using GDI functions on an OpenGL window? bad idea - /* -// because we have set the background brush for the window to NULL -// (to avoid flickering when re-sizing the window on the desktop), -// we clear the window to black when created, otherwise it will be -// empty while Quake starts up. - hdc = GetDC(dibwindow); - PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS); - ReleaseDC(dibwindow, hdc); - */ - if (vid.conheight > modelist[modenum].height) vid.conheight = modelist[modenum].height; if (vid.conwidth > modelist[modenum].width) vid.conwidth = modelist[modenum].width; - vid.width = vid.conwidth; - vid.height = vid.conheight; - vid.numpages = 2; - - mainwindow = dibwindow; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); return true; } @@ -302,81 +219,44 @@ qboolean VID_SetFullDIBMode (int modenum) ExWindowStyle = 0; rect = WindowRect; - AdjustWindowRectEx(&rect, WindowStyle, FALSE, 0); + AdjustWindowRectEx(&rect, WindowStyle, false, 0); width = rect.right - rect.left; height = rect.bottom - rect.top; // Create the DIB window - dibwindow = CreateWindowEx ( - ExWindowStyle, -#ifdef NEHAHRA - "DPNehahraQuake", - "DPNehahraGLQuake", -#else - "DarkPlacesQuake", - "DarkPlacesGLQuake", -#endif - WindowStyle, - rect.left, rect.top, - width, - height, - NULL, - NULL, - global_hInstance, - NULL); - - if (!dibwindow) - Sys_Error ("Couldn't create DIB window"); + mainwindow = CreateWindowEx (ExWindowStyle, gamename, gamename, WindowStyle, rect.left, rect.top, width, height, NULL, NULL, global_hInstance, NULL); - ShowWindow (dibwindow, SW_SHOWDEFAULT); - UpdateWindow (dibwindow); + if (!mainwindow) + Sys_Error ("Couldn't create DIB window"); - // LordHavoc: using GDI functions on an OpenGL window? bad idea - /* - // Because we have set the background brush for the window to NULL - // (to avoid flickering when re-sizing the window on the desktop), we - // clear the window to black when created, otherwise it will be - // empty while Quake starts up. - hdc = GetDC(dibwindow); - PatBlt(hdc,0,0,WindowRect.right,WindowRect.bottom,BLACKNESS); - ReleaseDC(dibwindow, hdc); - */ + ShowWindow (mainwindow, SW_SHOWDEFAULT); + UpdateWindow (mainwindow); if (vid.conheight > modelist[modenum].height) vid.conheight = modelist[modenum].height; if (vid.conwidth > modelist[modenum].width) vid.conwidth = modelist[modenum].width; - vid.width = vid.conwidth; - vid.height = vid.conheight; - - vid.numpages = 2; // needed because we're not getting WM_MOVE messages fullscreen on NT window_x = 0; window_y = 0; - mainwindow = dibwindow; - - SendMessage (mainwindow, WM_SETICON, (WPARAM)TRUE, (LPARAM)hIcon); - SendMessage (mainwindow, WM_SETICON, (WPARAM)FALSE, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)true, (LPARAM)hIcon); + SendMessage (mainwindow, WM_SETICON, (WPARAM)false, (LPARAM)hIcon); return true; } -int VID_SetMode (int modenum, unsigned char *palette) +int VID_SetMode (int modenum) { int original_mode, temp; qboolean stat; MSG msg; - if ((windowed && (modenum != 0)) || - (!windowed && (modenum < 1)) || - (!windowed && (modenum >= nummodes))) - { + if ((windowed && (modenum != 0)) || (!windowed && (modenum < 1)) || (!windowed && (modenum >= nummodes))) Sys_Error ("Bad video mode\n"); - } // so Con_Printfs don't mess us up by forcing vid and snd updates temp = scr_disabled_for_loading; @@ -392,29 +272,31 @@ int VID_SetMode (int modenum, unsigned char *palette) // Set either the fullscreen or windowed mode if (modelist[modenum].type == MS_WINDOWED) { - if (_windowed_mouse.value && key_dest == key_game) - { - stat = VID_SetWindowedMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); - } - else - { - IN_DeactivateMouse (); - IN_ShowMouse (); - stat = VID_SetWindowedMode(modenum); - } +// if (vid_mouse.integer && key_dest == key_game) +// { +// stat = VID_SetWindowedMode(modenum); +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); +// } +// else +// { +// usingmouse = false; +// IN_DeactivateMouse (); +// IN_ShowMouse (); +// stat = VID_SetWindowedMode(modenum); +// } + stat = VID_SetWindowedMode(modenum); } else if (modelist[modenum].type == MS_FULLDIB) { stat = VID_SetFullDIBMode(modenum); - IN_ActivateMouse (); - IN_HideMouse (); +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); } else - { Sys_Error ("VID_SetMode: Bad mode type in modelist"); - } window_width = DIBWidth; window_height = DIBHeight; @@ -424,9 +306,7 @@ int VID_SetMode (int modenum, unsigned char *palette) scr_disabled_for_loading = temp; if (!stat) - { Sys_Error ("Couldn't set video mode"); - } // now we try to make sure we get the focus on the mode switch, because // sometimes in some systems we don't. We grab the foreground, then @@ -435,7 +315,6 @@ int VID_SetMode (int modenum, unsigned char *palette) // ourselves at the top of the z order, then grab the foreground again, // Who knows if it helps, but it probably doesn't hurt SetForegroundWindow (mainwindow); - VID_SetPalette (palette); vid_modenum = modenum; Cvar_SetValue ("vid_mode", (float)vid_modenum); @@ -447,9 +326,7 @@ int VID_SetMode (int modenum, unsigned char *palette) Sleep (100); - SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, - SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | - SWP_NOCOPYBITS); + SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOCOPYBITS); SetForegroundWindow (mainwindow); @@ -459,9 +336,7 @@ int VID_SetMode (int modenum, unsigned char *palette) if (!msg_suppress_1) Con_SafePrintf ("Video mode %s initialized.\n", VID_GetModeDescription (vid_modenum)); - VID_SetPalette (palette); - - vid.recalc_refdef = 1; +// vid.recalc_refdef = 1; return true; } @@ -488,135 +363,6 @@ void VID_UpdateWindowStatus (void) //==================================== -void (APIENTRY *qglVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (APIENTRY *qglColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (APIENTRY *qglTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr); -void (APIENTRY *qglArrayElement)(GLint i); -void (APIENTRY *qglDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -void (APIENTRY *qglMTexCoord2f)(GLenum, GLfloat, GLfloat); -void (APIENTRY *qglSelectTexture)(GLenum); -void (APIENTRY *glColorTableEXT)(int, int, int, int, int, const void*); - -void CheckVertexArrays (void) -{ - if (COM_CheckParm("-novertex")) - { - Con_Printf("...vertex array support disabled\n"); - return; - } - if ((qglArrayElement = (void *) wglGetProcAddress("glArrayElement")) - && (qglColorPointer = (void *) wglGetProcAddress("glColorPointer")) -// && (qglDrawArrays = (void *) wglGetProcAddress("glDrawArrays")) - && (qglDrawElements = (void *) wglGetProcAddress("glDrawElements")) -// && (qglInterleavedArrays = (void *) wglGetProcAddress("glInterleavedArrays")) - && (qglTexCoordPointer = (void *) wglGetProcAddress("glTexCoordPointer")) - && (qglVertexPointer = (void *) wglGetProcAddress("glVertexPointer")) - ) - { - Con_Printf("...vertex array support detected\n"); - gl_arrays = true; - return; - } - - Con_Printf("...vertex array support disabled (not detected - get a better driver)\n"); -} - -int texture_extension_number = 1; - -void CheckMultiTexture(void) -{ - qglMTexCoord2f = NULL; - qglSelectTexture = NULL; - // Check to see if multitexture is disabled - if (COM_CheckParm("-nomtex")) - { - Con_Printf("...multitexture disabled\n"); - return; - } - // Test for ARB_multitexture - if (!COM_CheckParm("-SGISmtex") && strstr(gl_extensions, "GL_ARB_multitexture ")) - { - Con_Printf("...using GL_ARB_multitexture\n"); - qglMTexCoord2f = (void *) wglGetProcAddress("glMultiTexCoord2fARB"); - qglSelectTexture = (void *) wglGetProcAddress("glActiveTextureARB"); - gl_mtexable = true; - gl_mtex_enum = GL_TEXTURE0_ARB; - } - else if (strstr(gl_extensions, "GL_SGIS_multitexture ")) // Test for SGIS_multitexture (if ARB_multitexture not found) - { - Con_Printf("...using GL_SGIS_multitexture\n"); - qglMTexCoord2f = (void *) wglGetProcAddress("glMTexCoord2fSGIS"); - qglSelectTexture = (void *) wglGetProcAddress("glSelectTextureSGIS"); - gl_mtexable = true; - gl_mtex_enum = TEXTURE0_SGIS; - } - if (!gl_mtexable) - Con_Printf("...multitexture disabled (not detected)\n"); -} - -/* -=============== -GL_Init -=============== -*/ -extern char *QSG_EXTENSIONS; -void GL_Init (void) -{ - gl_vendor = glGetString (GL_VENDOR); - Con_Printf ("GL_VENDOR: %s\n", gl_vendor); - gl_renderer = glGetString (GL_RENDERER); - Con_Printf ("GL_RENDERER: %s\n", gl_renderer); - - gl_version = glGetString (GL_VERSION); - Con_Printf ("GL_VERSION: %s\n", gl_version); - gl_extensions = glGetString (GL_EXTENSIONS); - Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions); - -// Con_Printf ("%s %s\n", gl_renderer, gl_version); - - if (strnicmp(gl_renderer,"Permedia",8)==0) - isPermedia = true; - - // LordHavoc: special differences for ATI (broken 8bit color when also using 32bit? weird!) - if (strnicmp(gl_vendor,"ATI",3)==0) - { - isATI = true; - if (strnicmp(gl_renderer,"Rage Pro",8)==0) - isRagePro = true; - } - if (strnicmp(gl_renderer,"Matrox G200 Direct3D",20)==0) // a D3D driver for GL? sigh... - isG200 = true; - - CheckMultiTexture (); - CheckVertexArrays (); - - // LordHavoc: report supported extensions - Con_Printf ("\nQSG extensions: %s\n", QSG_EXTENSIONS); - - // LordHavoc: set up state -// glEnable(GL_DEPTH_TEST); -// glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); -// glShadeModel(GL_SMOOTH); -// glEnable(GL_TEXTURE_2D); - glAlphaFunc(GL_GREATER, 0.5); -// if (isRagePro || isG200) -// { -// glEnable(GL_ALPHA_TEST); -// glAlphaFunc(GL_GREATER, 0.5); -// } -// else -// glDisable(GL_ALPHA_TEST); -// glDepthMask(1); -// glDisable(GL_DITHER); // LordHavoc: disable dithering -// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -// glEnable(GL_BLEND); - -// glClearColor (0,0,0,0); // LordHavoc: changed from red to black - glCullFace(GL_FRONT); - -// glAlphaFunc(GL_GREATER, 0.666); -} - /* ================= GL_BeginRendering @@ -625,8 +371,6 @@ GL_BeginRendering */ void GL_BeginRendering (int *x, int *y, int *width, int *height) { -// extern cvar_t gl_clear; - *x = *y = 0; *width = WindowRect.right - WindowRect.left; *height = WindowRect.bottom - WindowRect.top; @@ -640,34 +384,34 @@ void GL_BeginRendering (int *x, int *y, int *width, int *height) void GL_EndRendering (void) { - if (!scr_skipupdate) + int usemouse; + if (r_render.integer && !scr_skipupdate) SwapBuffers(maindc); // handle the mouse state when windowed if that's changed - if (modestate == MS_WINDOWED) + usemouse = false; + if (vid_mouse.integer && key_dest == key_game) + usemouse = true; + if (modestate == MS_FULLDIB) + usemouse = true; + if (!ActiveApp) + usemouse = false; + if (usemouse) { - if (!_windowed_mouse.value) + if (!usingmouse) { - if (windowed_mouse) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - windowed_mouse = false; - } + usingmouse = true; + IN_ActivateMouse (); + IN_HideMouse(); } - else + } + else + { + if (usingmouse) { - windowed_mouse = true; - if (key_dest == key_game && !mouseactive && ActiveApp) - { - IN_ActivateMouse (); - IN_HideMouse (); - } - else if (mouseactive && key_dest != key_game) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } + usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse(); } } } @@ -677,6 +421,7 @@ void VID_SetDefaultMode (void) IN_DeactivateMouse (); } +void VID_RestoreSystemGamma(void); void VID_Shutdown (void) { @@ -694,22 +439,25 @@ void VID_Shutdown (void) wglMakeCurrent(NULL, NULL); // LordHavoc: free textures before closing (may help NVIDIA) - for (i = 0;i < 8192;i++) temp[i] = i; + for (i = 0;i < 8192;i++) + temp[i] = i+1; glDeleteTextures(8192, temp); if (hRC) wglDeleteContext(hRC); - if (hDC && dibwindow) - ReleaseDC(dibwindow, hDC); + if (hDC && mainwindow) + ReleaseDC(mainwindow, hDC); if (modestate == MS_FULLDIB) ChangeDisplaySettings (NULL, 0); - if (maindc && dibwindow) - ReleaseDC (dibwindow, maindc); + if (maindc && mainwindow) + ReleaseDC (mainwindow, maindc); AppActivate(false, false); + + VID_RestoreSystemGamma(); } } @@ -744,64 +492,47 @@ BOOL bSetupPixelFormat(HDC hDC) if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 ) { MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK); - return FALSE; + return false; } - if (SetPixelFormat(hDC, pixelformat, &pfd) == FALSE) + if (SetPixelFormat(hDC, pixelformat, &pfd) == false) { MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK); - return FALSE; + return false; } - return TRUE; + return true; } -byte scantokey[128] = - { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0 , 27, '1', '2', '3', '4', '5', '6', - '7', '8', '9', '0', '-', '=', K_BACKSPACE, 9, // 0 - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', - 'o', 'p', '[', ']', 13 , K_CTRL,'a', 's', // 1 - 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', - '\'' , '`', K_SHIFT,'\\', 'z', 'x', 'c', 'v', // 2 - 'b', 'n', 'm', ',', '.', '/', K_SHIFT,'*', - K_ALT,' ', 0 , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 - K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE , 0 , K_HOME, - K_UPARROW,K_PGUP,'-',K_LEFTARROW,'5',K_RIGHTARROW,'+',K_END, //4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, - K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 - }; - -byte shiftscantokey[128] = - { -// 0 1 2 3 4 5 6 7 -// 8 9 A B C D E F - 0 , 27, '!', '@', '#', '$', '%', '^', - '&', '*', '(', ')', '_', '+', K_BACKSPACE, 9, // 0 - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '{', '}', 13 , K_CTRL,'A', 'S', // 1 - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', - '"' , '~', K_SHIFT,'|', 'Z', 'X', 'C', 'V', // 2 - 'B', 'N', 'M', '<', '>', '?', K_SHIFT,'*', - K_ALT,' ', 0 , K_F1, K_F2, K_F3, K_F4, K_F5, // 3 - K_F6, K_F7, K_F8, K_F9, K_F10, K_PAUSE , 0 , K_HOME, - K_UPARROW,K_PGUP,'_',K_LEFTARROW,'%',K_RIGHTARROW,'+',K_END, //4 - K_DOWNARROW,K_PGDN,K_INS,K_DEL,0,0, 0, K_F11, - K_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6 - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7 - }; +byte scantokey[128] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0 ,27 ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-' ,'=' ,K_BACKSPACE,9 , // 0 + 'q' ,'w' ,'e' ,'r' ,'t' ,'y' ,'u' ,'i' ,'o' ,'p' ,'[' ,']' ,13 ,K_CTRL ,'a' ,'s' , // 1 + 'd' ,'f' ,'g' ,'h' ,'j' ,'k' ,'l' ,';' ,'\'' ,'`' ,K_SHIFT,'\\' ,'z' ,'x' ,'c' ,'v' , // 2 + 'b' ,'n' ,'m' ,',' ,'.' ,'/' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2 ,K_F3 ,K_F4 ,K_F5 , // 3 + K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,'-' ,K_LEFTARROW,'5' ,K_RIGHTARROW,'+' ,K_END , // 4 + K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 +}; +/* +byte shiftscantokey[128] = +{ +// 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0 ,27 ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'_' ,'+' ,K_BACKSPACE,9 , // 0 + 'Q' ,'W' ,'E' ,'R' ,'T' ,'Y' ,'U' ,'I' ,'O' ,'P' ,'{' ,'}' ,13 ,K_CTRL ,'A' ,'S' , // 1 + 'D' ,'F' ,'G' ,'H' ,'J' ,'K' ,'L' ,':' ,'"' ,'~' ,K_SHIFT,'|' ,'Z' ,'X' ,'C' ,'V' , // 2 + 'B' ,'N' ,'M' ,'<' ,'>' ,'?' ,K_SHIFT,'*' ,K_ALT ,' ' ,0 ,K_F1 ,K_F2,K_F3 ,K_F4 ,K_F5 , // 3 + K_F6 ,K_F7 ,K_F8 ,K_F9 ,K_F10,K_PAUSE,0 ,K_HOME,K_UPARROW,K_PGUP,'_' ,K_LEFTARROW,'%' ,K_RIGHTARROW,'+' ,K_END, // 4 + K_DOWNARROW,K_PGDN,K_INS,K_DEL,0 ,0 ,0 ,K_F11 ,K_F12 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 5 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 6 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 // 7 +}; +*/ /* ======= @@ -810,13 +541,15 @@ MapKey Map from windows to quake keynums ======= */ -int MapKey (int key) +int MapKey (int key, int virtualkey) { key = (key>>16)&255; if (key > 127) return 0; if (scantokey[key] == 0) Con_DPrintf("key 0x%02x has no translation\n", key); +// if (scantokey[key] >= 0x20 && scantokey[key] < 0x7F) +// return realchar; return scantokey[key]; } @@ -847,6 +580,9 @@ void ClearAllStates (void) IN_ClearStates (); } +void VID_RestoreGameGamma(void); +extern qboolean host_loopactive; + void AppActivate(BOOL fActive, BOOL minimize) /**************************************************************************** * @@ -880,48 +616,59 @@ void AppActivate(BOOL fActive, BOOL minimize) { if (modestate == MS_FULLDIB) { - IN_ActivateMouse (); - IN_HideMouse (); - if (vid_canalttab && vid_wassuspended) { +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); + if (vid_canalttab && vid_wassuspended) + { vid_wassuspended = false; ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); ShowWindow(mainwindow, SW_SHOWNORMAL); } + + // LordHavoc: from dabb, fix for alt-tab bug in NVidia drivers + MoveWindow(mainwindow,0,0,gdevmode.dmPelsWidth,gdevmode.dmPelsHeight,false); } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && key_dest == key_game) - { - IN_ActivateMouse (); - IN_HideMouse (); - } +// else if ((modestate == MS_WINDOWED) && vid_mouse.integer && key_dest == key_game) +// { +// usingmouse = true; +// IN_ActivateMouse (); +// IN_HideMouse (); +// } + if (host_loopactive) + VID_RestoreGameGamma(); } if (!fActive) { + usingmouse = false; + IN_DeactivateMouse (); + IN_ShowMouse (); if (modestate == MS_FULLDIB) { - IN_DeactivateMouse (); - IN_ShowMouse (); - if (vid_canalttab) { +// usingmouse = false; +// IN_DeactivateMouse (); +// IN_ShowMouse (); + if (vid_canalttab) + { ChangeDisplaySettings (NULL, 0); vid_wassuspended = true; } } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } +// else if ((modestate == MS_WINDOWED) && vid_mouse.integer) +// { +// usingmouse = false; +// IN_DeactivateMouse (); +// IN_ShowMouse (); +// } + VID_RestoreSystemGamma(); } } LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); /* main window procedure */ -LONG WINAPI MainWndProc ( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) +LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 1; int fActive, fMinimized, temp; @@ -948,12 +695,12 @@ LONG WINAPI MainWndProc ( case WM_KEYDOWN: case WM_SYSKEYDOWN: - Key_Event (MapKey(lParam), true); + Key_Event (MapKey(lParam, wParam), true); break; case WM_KEYUP: case WM_SYSKEYUP: - Key_Event (MapKey(lParam), false); + Key_Event (MapKey(lParam, wParam), false); break; case WM_SYSCHAR: @@ -1001,11 +748,8 @@ LONG WINAPI MainWndProc ( break; case WM_CLOSE: - if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", - MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) - { + if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) Sys_Quit (); - } break; @@ -1021,8 +765,8 @@ LONG WINAPI MainWndProc ( case WM_DESTROY: { - if (dibwindow) - DestroyWindow (dibwindow); + if (mainwindow) + DestroyWindow (mainwindow); PostQuitMessage (0); } @@ -1090,9 +834,7 @@ char *VID_GetModeDescription (int mode) } else { - sprintf (temp, "Desktop resolution (%dx%d)", - modelist[MODE_FULLSCREEN_DEFAULT].width, - modelist[MODE_FULLSCREEN_DEFAULT].height); + sprintf (temp, "Desktop resolution (%dx%d)", modelist[MODE_FULLSCREEN_DEFAULT].width, modelist[MODE_FULLSCREEN_DEFAULT].height); pinfo = temp; } @@ -1114,15 +856,9 @@ char *VID_GetExtModeDescription (int mode) if (modelist[mode].type == MS_FULLDIB) { if (!leavecurrentmode) - { sprintf(pinfo,"%s fullscreen", pv->modedesc); - } else - { - sprintf (pinfo, "Desktop resolution (%dx%d)", - modelist[MODE_FULLSCREEN_DEFAULT].width, - modelist[MODE_FULLSCREEN_DEFAULT].height); - } + sprintf (pinfo, "Desktop resolution (%dx%d)", modelist[MODE_FULLSCREEN_DEFAULT].width, modelist[MODE_FULLSCREEN_DEFAULT].height); } else { @@ -1208,12 +944,37 @@ void VID_DescribeModes_f (void) leavecurrentmode = t; } +void VID_AddMode(int type, int width, int height, int modenum, int halfscreen, int dib, int fullscreen, int bpp) +{ + int i; + if (nummodes >= MAX_MODE_LIST) + return; + modelist[nummodes].type = type; + modelist[nummodes].width = width; + modelist[nummodes].height = height; + modelist[nummodes].modenum = modenum; + modelist[nummodes].halfscreen = halfscreen; + modelist[nummodes].dib = dib; + modelist[nummodes].fullscreen = fullscreen; + modelist[nummodes].bpp = bpp; + if (bpp == 0) + sprintf (modelist[nummodes].modedesc, "%dx%d", width, height); + else + sprintf (modelist[nummodes].modedesc, "%dx%dx%d", width, height, bpp); + for (i = 0;i < nummodes;i++) + { + if (!memcmp(&modelist[i], &modelist[nummodes], sizeof(vmode_t))) + return; + } + nummodes++; +} void VID_InitDIB (HINSTANCE hInstance) { + int w, h; WNDCLASS wc; - /* Register the frame class */ + // Register the frame class wc.style = 0; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.cbClsExtra = 0; @@ -1223,15 +984,12 @@ void VID_InitDIB (HINSTANCE hInstance) wc.hCursor = LoadCursor (NULL,IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = 0; -#ifdef NEHAHRA - wc.lpszClassName = "DPNehahraQuake"; -#else - wc.lpszClassName = "DarkPlacesQuake"; -#endif + wc.lpszClassName = gamename; if (!RegisterClass (&wc) ) Sys_Error ("Couldn't register window class"); + /* modelist[0].type = MS_WINDOWED; if (COM_CheckParm("-width")) @@ -1250,8 +1008,7 @@ void VID_InitDIB (HINSTANCE hInstance) if (modelist[0].height < 240) modelist[0].height = 240; - sprintf (modelist[0].modedesc, "%dx%d", - modelist[0].width, modelist[0].height); + sprintf (modelist[0].modedesc, "%dx%d", modelist[0].width, modelist[0].height); modelist[0].modenum = MODE_WINDOWED; modelist[0].dib = 1; @@ -1260,6 +1017,24 @@ void VID_InitDIB (HINSTANCE hInstance) modelist[0].bpp = 0; nummodes = 1; + */ + if (COM_CheckParm("-width")) + w = atoi(com_argv[COM_CheckParm("-width")+1]); + else + w = 640; + + if (w < 320) + w = 320; + + if (COM_CheckParm("-height")) + h = atoi(com_argv[COM_CheckParm("-height")+1]); + else + h = w * 240/320; + + if (h < 240) + h = 240; + + VID_AddMode(MS_WINDOWED, w, h, 0, 0, 1, 0, 0); } @@ -1271,8 +1046,14 @@ VID_InitFullDIB void VID_InitFullDIB (HINSTANCE hInstance) { DEVMODE devmode; - int i, modenum, originalnummodes, existingmode, numlowresmodes; - int j, bpp, done; +// int i; + int modenum; + int originalnummodes; +// int existingmode; + int numlowresmodes; + int j; + int bpp; + int done; BOOL stat; // enumerate >8 bpp modes @@ -1283,18 +1064,19 @@ void VID_InitFullDIB (HINSTANCE hInstance) { stat = EnumDisplaySettings (NULL, modenum, &devmode); - if ((devmode.dmBitsPerPel >= 15) && - (devmode.dmPelsWidth <= MAXWIDTH) && - (devmode.dmPelsHeight <= MAXHEIGHT) && - (nummodes < MAX_MODE_LIST)) + if ((devmode.dmBitsPerPel >= 15) && (devmode.dmPelsWidth <= MAXWIDTH) && (devmode.dmPelsHeight <= MAXHEIGHT) && (nummodes < MAX_MODE_LIST)) { - devmode.dmFields = DM_BITSPERPEL | - DM_PELSWIDTH | - DM_PELSHEIGHT; + devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) == - DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) { + // if the width is more than twice the height, reduce it by half because this + // is probably a dual-screen monitor + if ((!COM_CheckParm("-noadjustaspect")) && (devmode.dmPelsWidth > (devmode.dmPelsHeight << 1))) + VID_AddMode(MS_FULLDIB, devmode.dmPelsWidth >> 1, devmode.dmPelsHeight, 0, 1, 1, 1, devmode.dmBitsPerPel); + else + VID_AddMode(MS_FULLDIB, devmode.dmPelsWidth, devmode.dmPelsHeight, 0, 0, 1, 1, devmode.dmBitsPerPel); + /* modelist[nummodes].type = MS_FULLDIB; modelist[nummodes].width = devmode.dmPelsWidth; modelist[nummodes].height = devmode.dmPelsHeight; @@ -1303,9 +1085,7 @@ void VID_InitFullDIB (HINSTANCE hInstance) modelist[nummodes].dib = 1; modelist[nummodes].fullscreen = 1; modelist[nummodes].bpp = devmode.dmBitsPerPel; - sprintf (modelist[nummodes].modedesc, "%dx%dx%d", - devmode.dmPelsWidth, devmode.dmPelsHeight, - devmode.dmBitsPerPel); + sprintf (modelist[nummodes].modedesc, "%dx%dx%d", devmode.dmPelsWidth, devmode.dmPelsHeight, devmode.dmBitsPerPel); // if the width is more than twice the height, reduce it by half because this // is probably a dual-screen monitor @@ -1315,18 +1095,13 @@ void VID_InitFullDIB (HINSTANCE hInstance) { modelist[nummodes].width >>= 1; modelist[nummodes].halfscreen = 1; - sprintf (modelist[nummodes].modedesc, "%dx%dx%d", - modelist[nummodes].width, - modelist[nummodes].height, - modelist[nummodes].bpp); + sprintf (modelist[nummodes].modedesc, "%dx%dx%d", modelist[nummodes].width, modelist[nummodes].height, modelist[nummodes].bpp); } } for (i=originalnummodes, existingmode = 0 ; iwidth)/2, 4, p); + M_DrawPic ( (320-p->width)/2, 4, "gfx/vidmodes.lmp"); vid_wmodes = 0; lnummodes = VID_NumModes (); - + for (i=1 ; (i"); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, - "and -bpp "); - M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, - "Select windowed mode with -window"); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*2, "Video modes must be set from the"); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*3, "command line with -width "); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*4, "and -bpp "); + M_Print (3*8, 36 + MODE_AREA_HEIGHT * 8 + 8*6, "Select windowed mode with -window"); }