X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=7f5fbe051eb359f4c47cc74f90f8e1cc00f32f53;hb=08b17d6e1f0ba20ac2ec1414a1369b1a098bd06f;hp=291f5d5a10cdddeb5a4b414f3b9d936b56b5a850;hpb=6c4d997a497cb5afde74b4bf16f6a9ade5aca37e;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index 291f5d5a..7f5fbe05 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -25,8 +25,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include +#include "quakedef.h" + #include #include +#include #include #if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS) @@ -34,7 +37,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #include -#include "quakedef.h" +#include "nexuiz.xpm" +#include "darkplaces.xpm" // Tell startup code that we have a client int cl_available = true; @@ -88,14 +92,13 @@ static qboolean vid_usingmouse = false; static qboolean vid_usingvsync = false; static qboolean vid_usevsync = false; static qboolean vid_x11_hardwaregammasupported = false; +static qboolean vid_x11_dgasupported = false; static int vid_x11_gammarampsize = 0; static float mouse_x, mouse_y; static int p_mouse_x, p_mouse_y; #if !defined(__APPLE__) && !defined(SUNOS) -// FIXME: vid_dga_mouseaccel is poorly named, it is actually the multiplier for mouse movement, not an acceleration (which would be a power function or something) -cvar_t vid_dga = {CVAR_SAVE, "vid_dga", "1", "make use of DGA mouse input"}; -cvar_t vid_dga_mouseaccel = {0, "vid_dga_mouseaccel", "1", "speed of mouse when using DGA mouse input"}; +cvar_t vid_dgamouse = {CVAR_SAVE, "vid_dgamouse", "1", "make use of DGA mouse input"}; #endif qboolean vidmode_ext = false; @@ -266,22 +269,10 @@ static void IN_Activate (qboolean grab) XGrabPointer(vidx11_display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); #if !defined(__APPLE__) && !defined(SUNOS) - if (vid_dga.integer) + if (vid_dgamouse.integer && vid_x11_dgasupported) { - int MajorVersion, MinorVersion; - - if (!XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion)) - { - // unable to query, probably not supported - Con_Print( "Failed to detect XF86DGA Mouse\n" ); - Cvar_SetValueQuick(&vid_dga, 0); - XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, vid.width / 2, vid.height / 2); - } - else - { - XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse); - XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0); - } + XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse); + XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0); } else #endif @@ -300,7 +291,7 @@ static void IN_Activate (qboolean grab) if (vid_usingmouse) { #if !defined(__APPLE__) && !defined(SUNOS) - if (vid_dga.integer) + if (vid_x11_dgasupported) XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), 0); #endif @@ -372,10 +363,10 @@ static void HandleEvents(void) if (vid_usingmouse) { #if !defined(__APPLE__) && !defined(SUNOS) - if (vid_dga.integer == 1) + if (vid_dgamouse.integer == 1 && vid_x11_dgasupported) { - mouse_x += event.xmotion.x_root * vid_dga_mouseaccel.value; - mouse_y += event.xmotion.y_root * vid_dga_mouseaccel.value; + mouse_x += event.xmotion.x_root; + mouse_y += event.xmotion.y_root; } else #endif @@ -422,6 +413,11 @@ static void HandleEvents(void) // window changed size/location win_x = event.xconfigure.x; win_y = event.xconfigure.y; + if(vid_resizable.integer < 2) + { + vid.width = event.xconfigure.width; + vid.height = event.xconfigure.height; + } break; case DestroyNotify: // window has been destroyed @@ -487,7 +483,7 @@ static int GL_OpenLibrary(const char *name) { Con_Printf("Loading OpenGL driver %s\n", name); GL_CloseLibrary(); - if (!(prjobj = dlopen(name, RTLD_LAZY))) + if (!(prjobj = dlopen(name, RTLD_LAZY | RTLD_GLOBAL))) { Con_Printf("Unable to open symbol list for %s\n", name); return false; @@ -603,8 +599,7 @@ int VID_GetGamma(unsigned short *ramps, int rampsize) void VID_Init(void) { #if !defined(__APPLE__) && !defined(SUNOS) - Cvar_RegisterVariable (&vid_dga); - Cvar_RegisterVariable (&vid_dga_mouseaccel); + Cvar_RegisterVariable (&vid_dgamouse); #endif InitSig(); // trap evil signals // COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar) @@ -636,6 +631,9 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate int i; int attrib[32]; XSetWindowAttributes attr; + XClassHint *clshints; + XWMHints *wmhints; + XSizeHints *szhints; unsigned long mask; Window root; XVisualInfo *visinfo; @@ -773,7 +771,30 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; win = XCreateWindow(vidx11_display, root, 0, 0, width, height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); - XStoreName(vidx11_display, win, gamename); + + wmhints = XAllocWMHints(); + if(XpmCreatePixmapFromData(vidx11_display, win, + (gamemode == GAME_NEXUIZ) ? nexuiz_xpm : darkplaces_xpm, + &wmhints->icon_pixmap, &wmhints->icon_mask, NULL) == XpmSuccess) + wmhints->flags |= IconPixmapHint | IconMaskHint; + + clshints = XAllocClassHint(); + clshints->res_name = strdup(gamename); + clshints->res_class = strdup("DarkPlaces"); + + szhints = XAllocSizeHints(); + if(vid_resizable.integer == 0) + { + szhints->min_width = szhints->max_width = width; + szhints->min_height = szhints->max_height = height; + szhints->flags |= PMinSize | PMaxSize; + } + + XmbSetWMProperties(vidx11_display, win, gamename, gamename, (char **) com_argv, com_argc, szhints, wmhints, clshints); + XFree(clshints); + XFree(wmhints); + XFree(szhints); + //XStoreName(vidx11_display, win, gamename); XMapWindow(vidx11_display, win); // LordHavoc: making the close button on a window do the right thing @@ -837,6 +858,11 @@ int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate vid_hidden = false; vid_activewindow = true; vid_x11_hardwaregammasupported = XF86VidModeGetGammaRampSize(vidx11_display, vidx11_screen, &vid_x11_gammarampsize) != 0; +#if !defined(__APPLE__) && !defined(SUNOS) + vid_x11_dgasupported = XF86DGAQueryVersion(vidx11_display, &MajorVersion, &MinorVersion); + if (!vid_x11_dgasupported) + Con_Print( "Failed to detect XF86DGA Mouse extension\n" ); +#endif GL_Init(); return true; } @@ -846,15 +872,21 @@ void Sys_SendKeyEvents(void) static qboolean sound_active = true; // enable/disable sound on focus gain/loss - if (!vid_activewindow && sound_active) + if (!vid_hidden && (vid_activewindow || !snd_mutewhenidle.integer)) { - S_BlockSound (); - sound_active = false; + if (!sound_active) + { + S_UnblockSound (); + sound_active = true; + } } - else if (vid_activewindow && !sound_active) + else { - S_UnblockSound (); - sound_active = true; + if (sound_active) + { + S_BlockSound (); + sound_active = false; + } } HandleEvents();