#include <X11/Xutil.h>
#include <GL/glx.h>
+#include "quakedef.h"
+
#include <X11/keysym.h>
#include <X11/cursorfont.h>
+#include <X11/xpm.h>
#include <X11/extensions/XShm.h>
#if !defined(__APPLE__) && !defined(__MACH__) && !defined(SUNOS)
#endif
#include <X11/extensions/xf86vmode.h>
-#include "quakedef.h"
+#include "nexuiz.xpm"
+#include "darkplaces.xpm"
// Tell startup code that we have a client
int cl_available = true;
static qboolean mouse_avail = true;
static qboolean vid_usingmouse = false;
+static qboolean vid_usingdgamouse = false;
static qboolean vid_usingvsync = false;
static qboolean vid_usevsync = false;
static qboolean vid_x11_hardwaregammasupported = false;
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_dgamouse = {CVAR_SAVE, "vid_dgamouse", "1", "make use of DGA mouse input"};
#endif
qboolean vidmode_ext = false;
return;
if (grab)
{
+#if !defined(__APPLE__) && !defined(SUNOS)
+ if(vid_usingmouse && (vid_usingdgamouse != !!vid_dgamouse.integer))
+ IN_Activate(false); // ungrab first!
+#endif
if (!vid_usingmouse && mouse_avail && win)
{
XWindowAttributes attribs_1;
XGrabPointer(vidx11_display, win, True, 0, GrabModeAsync, GrabModeAsync, win, None, CurrentTime);
#if !defined(__APPLE__) && !defined(SUNOS)
- if (vid_dga.integer && vid_x11_dgasupported)
+ if (vid_dgamouse.integer && vid_x11_dgasupported)
{
XF86DGADirectVideo(vidx11_display, DefaultScreen(vidx11_display), XF86DGADirectMouse);
XWarpPointer(vidx11_display, None, win, 0, 0, 0, 0, 0, 0);
XGrabKeyboard(vidx11_display, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
mouse_x = mouse_y = 0;
- cl_ignoremousemove = true;
+ cl_ignoremousemoves = 2;
vid_usingmouse = true;
+ vid_usingdgamouse = !!vid_dgamouse.integer;
}
}
else
if (win)
XUndefineCursor(vidx11_display, win);
- cl_ignoremousemove = true;
+ cl_ignoremousemoves = 2;
vid_usingmouse = false;
}
}
if (vid_usingmouse)
{
#if !defined(__APPLE__) && !defined(SUNOS)
- if (vid_dga.integer == 1 && vid_x11_dgasupported)
+ if (vid_dgamouse.integer == 1 && vid_x11_dgasupported)
{
mouse_x += event.xmotion.x_root;
mouse_y += event.xmotion.y_root;
// 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
void VID_Init(void)
{
#if !defined(__APPLE__) && !defined(SUNOS)
- Cvar_RegisterVariable (&vid_dga);
+ Cvar_RegisterVariable (&vid_dgamouse);
#endif
InitSig(); // trap evil signals
// COMMANDLINEOPTION: Input: -nomouse disables mouse support (see also vid_mouse cvar)
mouse_avail = false;
}
-void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer)
+void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, int samples)
{
*attrib++ = GLX_RGBA;
- *attrib++ = GLX_RED_SIZE;*attrib++ = 1;
- *attrib++ = GLX_GREEN_SIZE;*attrib++ = 1;
- *attrib++ = GLX_BLUE_SIZE;*attrib++ = 1;
+ *attrib++ = GLX_RED_SIZE;*attrib++ = stencil ? 8 : 5;
+ *attrib++ = GLX_GREEN_SIZE;*attrib++ = stencil ? 8 : 5;
+ *attrib++ = GLX_BLUE_SIZE;*attrib++ = stencil ? 8 : 5;
*attrib++ = GLX_DOUBLEBUFFER;
- *attrib++ = GLX_DEPTH_SIZE;*attrib++ = 1;
+ *attrib++ = GLX_DEPTH_SIZE;*attrib++ = stencil ? 24 : 16;
// if stencil is enabled, ask for alpha too
if (stencil)
{
*attrib++ = GLX_STENCIL_SIZE;*attrib++ = 8;
- *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 1;
+ *attrib++ = GLX_ALPHA_SIZE;*attrib++ = 8;
}
if (stereobuffer)
*attrib++ = GLX_STEREO;
+ if (samples > 1)
+ {
+ *attrib++ = GLX_SAMPLE_BUFFERS_ARB;
+ *attrib++ = 1;
+ *attrib++ = GLX_SAMPLES_ARB;
+ *attrib++ = samples;
+ }
*attrib++ = None;
}
-int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer)
+int VID_InitMode(int fullscreen, int width, int height, int bpp, int refreshrate, int stereobuffer, int samples)
{
int i;
int attrib[32];
XSetWindowAttributes attr;
+ XClassHint *clshints;
+ XWMHints *wmhints;
+ XSizeHints *szhints;
unsigned long mask;
Window root;
XVisualInfo *visinfo;
return false;
}
- VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer);
+ VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, samples);
visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+ if (!visinfo && (samples == 1))
+ {
+ /* Some Mesa drivers reject sample buffers with 1 sample, so try
+ * entirely without one */
+ VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, 0);
+ visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib);
+ }
if (!visinfo)
{
Con_Print("Couldn't get an RGB, Double-buffered, Depth visual\n");
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
gl_platform = "GLX";
gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen);
+ Con_DPrintf("GL_VENDOR: %s\n", gl_vendor);
+ Con_DPrintf("GL_RENDERER: %s\n", gl_renderer);
+ Con_DPrintf("GL_VERSION: %s\n", gl_version);
+ Con_DPrintf("GL_EXTENSIONS: %s\n", gl_extensions);
+ Con_DPrintf("%s_EXTENSIONS: %s\n", gl_platform, gl_platformextensions);
+
gl_videosyncavailable = false;
// COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions)
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();