LINUX: Fixed warp ignores

This commit is contained in:
Elias Naur 2004-04-12 12:20:59 +00:00
parent 84eae4c6f6
commit b641b66e12
3 changed files with 16 additions and 11 deletions

View File

@ -54,6 +54,8 @@
*/ */
extern bool releaseInput(void); extern bool releaseInput(void);
extern void resetCursor(int x, int y);
/* /*
* Various functions to release/acquire keyboard and mouse * Various functions to release/acquire keyboard and mouse
*/ */

View File

@ -93,8 +93,8 @@ static void transformCursorPos(int x, int y) {
setCursorPos(x, y); setCursorPos(x, y);
} }
static void centerCursor() { void resetCursor(int x, int y) {
transformCursorPos(getWindowWidth()/2, getWindowHeight()/2); transformCursorPos(x, y);
last_x = current_x; last_x = current_x;
last_y = current_y; last_y = current_y;
} }
@ -161,18 +161,18 @@ void updatePointerGrab(void) {
} }
static void doWarpPointer(void ) { static void doWarpPointer(void ) {
// int i;
XEvent ignore_warp_guard; XEvent ignore_warp_guard;
ignore_warp_guard.type = MotionNotify; ignore_warp_guard.type = MotionNotify;
ignore_warp_guard.xmotion.state = 1; // Tell event loop to start ignoring motion events // Tell event loop to start ignoring motion events
centerCursor(); ignore_warp_guard.xmotion.state = 1;
XSendEvent(getDisplay(), getCurrentWindow(), False, 0, &ignore_warp_guard); XSendEvent(getDisplay(), getCurrentWindow(), False, 0, &ignore_warp_guard);
XWarpPointer(getDisplay(), None, getCurrentWindow(), 0, 0, 0, 0, current_x, current_y); XWarpPointer(getDisplay(), None, getCurrentWindow(), 0, 0, 0, 0, getWindowWidth()/2, getWindowHeight()/2);
ignore_warp_guard.xmotion.state = 0; // Tell event loop to stop ignoring motion events // Tell event loop to stop ignoring motion events
ignore_warp_guard.xmotion.state = 0;
XSendEvent(getDisplay(), getCurrentWindow(), False, 0, &ignore_warp_guard); XSendEvent(getDisplay(), getCurrentWindow(), False, 0, &ignore_warp_guard);
centerCursor(); /* centerCursor();
/* XWarpPointer(getDisplay(), None, getCurrentWindow(), 0, 0, 0, 0, current_x, current_y); XWarpPointer(getDisplay(), None, getCurrentWindow(), 0, 0, 0, 0, current_x, current_y);
XEvent event; XEvent event;
// Try to catch the warp pointer event // Try to catch the warp pointer event
for (i = 0; i < WARP_RETRY; i++) { for (i = 0; i < WARP_RETRY; i++) {

View File

@ -157,8 +157,11 @@ static void handleMotion(XMotionEvent *event) {
if (event->send_event == True) { if (event->send_event == True) {
// We got a warp ignore message // We got a warp ignore message
ignore_motion_events = event->state == 1 ? true : false; ignore_motion_events = event->state == 1 ? true : false;
} else if (!ignore_motion_events) } else if (ignore_motion_events) {
resetCursor(event->x, event->y);
} else {
handlePointerMotion(event); handlePointerMotion(event);
}
} }
static void handleMessages() { static void handleMessages() {
@ -418,7 +421,7 @@ static void dumpVisualInfo(XVisualInfo *vis_info) {
glXGetConfig(getDisplay(), vis_info, GLX_SAMPLE_BUFFERS_ARB, &sample_buffers); glXGetConfig(getDisplay(), vis_info, GLX_SAMPLE_BUFFERS_ARB, &sample_buffers);
glXGetConfig(getDisplay(), vis_info, GLX_SAMPLES_ARB, &samples); glXGetConfig(getDisplay(), vis_info, GLX_SAMPLES_ARB, &samples);
} }
printf("Pixel format info: r = %d, g = %d, b = %d, a = %d, depth = %d, stencil = %d, sample buffers = %d, samples = %d\n", r, g, b, alpha, depth, stencil, sample_buffers, samples); printfDebug("Pixel format info: r = %d, g = %d, b = %d, a = %d, depth = %d, stencil = %d, sample buffers = %d, samples = %d\n", r, g, b, alpha, depth, stencil, sample_buffers, samples);
} }
static void destroy(void) { static void destroy(void) {