Move the mouse cursor hiding code from in_x11 to vid_{x11,glx} so it is

guaranteed to be done /before/ the glx context is created. Hopefully this
fixes knghtbrd's ugly cursor problem.
This commit is contained in:
Bill Currie 2000-07-27 03:37:41 +00:00
parent 1d5ced14dc
commit 4f0e4c858a
3 changed files with 81 additions and 49 deletions

View file

@ -48,7 +48,6 @@
#include <X11/extensions/xf86dga.h>
#endif
#include "quakedef.h"
#include "d_local.h"
#include "sound.h"
@ -78,7 +77,6 @@ static float mouse_x, mouse_y;
static float old_mouse_x, old_mouse_y;
static int p_mouse_x, p_mouse_y;
static float old__windowed_mouse;
static Cursor nullcursor = None;
#define KEY_MASK (KeyPressMask | KeyReleaseMask)
@ -86,36 +84,6 @@ static Cursor nullcursor = None;
#define INPUT_MASK (KEY_MASK | MOUSE_MASK)
/*
======================
Create an empty cursor
======================
*/
static void
CreateNullCursor(Display *display, Window root)
{
Pixmap cursormask;
XGCValues xgc;
GC gc;
XColor dummycolour;
if (nullcursor != None) return;
cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/);
xgc.function = GXclear;
gc = XCreateGC(display, cursormask, GCFunction, &xgc);
XFillRectangle(display, cursormask, gc, 0, 0, 1, 1);
dummycolour.pixel = 0;
dummycolour.red = 0;
dummycolour.flags = 04;
nullcursor = XCreatePixmapCursor(display, cursormask, cursormask,
&dummycolour,&dummycolour, 0,0);
XFreePixmap(display,cursormask);
XFreeGC(display,gc);
}
static int
XLateKey(XKeyEvent *ev)
{
@ -423,10 +391,6 @@ IN_Shutdown(void)
mouse_avail = 0;
if (x_disp) {
XAutoRepeatOn(x_disp);
if (nullcursor != None) {
XFreeCursor(x_disp, nullcursor);
nullcursor = None;
}
#ifdef HAVE_DGA
XF86DGADirectVideo(x_disp, DefaultScreen(x_disp), 0);
@ -477,8 +441,8 @@ IN_Init(void)
XF86DGADirectVideo(x_disp, DefaultScreen(x_disp),
XF86DGADirectMouse|XF86DGADirectKeyb);
XWarpPointer(x_disp, None, x_win, 0, 0, 0, 0,
vid.width, vid.height);
//XWarpPointer(x_disp, None, x_win, 0, 0, 0, 0,
// vid.width+2, vid.height+2);
XGrabPointer (x_disp, x_win, True, MOUSE_MASK, GrabModeAsync,
GrabModeAsync, x_win, None, CurrentTime);
@ -490,17 +454,6 @@ IN_Init(void)
mouse_x = mouse_y = 0.0;
mouse_avail = 1;
/* Invisible cursor */
#ifdef HAVE_DGA
if (!in_dgamouse->value)
{
#endif
CreateNullCursor(x_disp, x_win);
XDefineCursor(x_disp, x_win, nullcursor);
#ifdef HAVE_DGA
}
#endif
x11_add_event(KeyPress, &event_key);
x11_add_event(KeyRelease, &event_key);
x11_add_event(ButtonPress, &event_button);

View file

@ -87,6 +87,7 @@ static qboolean vid_initialized = false;
static int screen;
Window x_win;
static GLXContext ctx = NULL;
static Cursor nullcursor = None;
#define X_MASK (VisibilityChangeMask | StructureNotifyMask)
@ -148,6 +149,36 @@ int gl_mtex_enum = TEXTURE0_SGIS;
qboolean gl_arb_mtex = false;
qboolean gl_mtexable = false;
/*
======================
Create an empty cursor
======================
*/
static void
CreateNullCursor(Display *display, Window root)
{
Pixmap cursormask;
XGCValues xgc;
GC gc;
XColor dummycolour;
if (nullcursor != None) return;
cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/);
xgc.function = GXclear;
gc = XCreateGC(display, cursormask, GCFunction, &xgc);
XFillRectangle(display, cursormask, gc, 0, 0, 1, 1);
dummycolour.pixel = 0;
dummycolour.red = 0;
dummycolour.flags = 04;
nullcursor = XCreatePixmapCursor(display, cursormask, cursormask,
&dummycolour,&dummycolour, 0,0);
XFreePixmap(display,cursormask);
XFreeGC(display,gc);
}
/*-----------------------------------------------------------------------*/
void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
{
@ -185,6 +216,10 @@ VID_Shutdown(void)
dlhand = NULL;
}
#endif
if (nullcursor != None) {
XFreeCursor(x_disp, nullcursor);
nullcursor = None;
}
x11_close_display();
}
#if 0
@ -627,6 +662,11 @@ void VID_Init(unsigned char *palette)
visinfo->visual, mask, &attr);
XMapWindow(x_disp, x_win);
XRaiseWindow(x_disp, x_win);
/* Invisible cursor */
CreateNullCursor(x_disp, x_win);
XDefineCursor(x_disp, x_win, nullcursor);
#ifdef HAVE_VIDMODE
if (hasvidmode && vid_fullscreen->value) {
XGrabKeyboard(x_disp, x_win, 1, GrabModeAsync, GrabModeAsync,

View file

@ -85,6 +85,7 @@ static GC x_gc;
static Visual *x_vis;
static XVisualInfo *x_visinfo;
static Atom aWMDelete = 0;
static Cursor nullcursor = None;
#ifdef HAVE_VIDMODE
static XF86VidModeModeInfo **vidmodes;
@ -124,6 +125,36 @@ int scr_width, scr_height;
( VisibilityChangeMask | ExposureMask | StructureNotifyMask)
/*
======================
Create an empty cursor
======================
*/
static void
CreateNullCursor(Display *display, Window root)
{
Pixmap cursormask;
XGCValues xgc;
GC gc;
XColor dummycolour;
if (nullcursor != None) return;
cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/);
xgc.function = GXclear;
gc = XCreateGC(display, cursormask, GCFunction, &xgc);
XFillRectangle(display, cursormask, gc, 0, 0, 1, 1);
dummycolour.pixel = 0;
dummycolour.red = 0;
dummycolour.flags = 04;
nullcursor = XCreatePixmapCursor(display, cursormask, cursormask,
&dummycolour,&dummycolour, 0,0);
XFreePixmap(display,cursormask);
XFreeGC(display,gc);
}
static void
shiftmask_init( void )
{
@ -637,6 +668,10 @@ void VID_Init (unsigned char *palette)
/* Make window respond to Delete events */
aWMDelete = XInternAtom(x_disp, "WM_DELETE_WINDOW", False);
XSetWMProtocols(x_disp, x_win, &aWMDelete, 1);
/* Invisible cursor */
CreateNullCursor(x_disp, x_win);
XDefineCursor(x_disp, x_win, nullcursor);
}
if (x_visinfo->depth == 8) {
@ -775,6 +810,10 @@ VID_Shutdown(void)
XFree(vidmodes);
}
#endif
if (nullcursor != None) {
XFreeCursor(x_disp, nullcursor);
nullcursor = None;
}
XAutoRepeatOn(x_disp);
x11_close_display();
x_disp = 0;