static void install_grabs_mouse( void ) { int i; int num_devices; XIDeviceInfo *info; XIEventMask mask; assert( x11display.dpy && x11display.win ); if( mouse_active ) return; XDefineCursor(x11display.dpy, x11display.win, CreateNullCursor(x11display.dpy, x11display.win)); mask.deviceid = XIAllDevices; mask.mask_len = XIMaskLen(XI_LASTEVENT); mask.mask = calloc(mask.mask_len, sizeof(char)); XISetMask(mask.mask, XI_Enter); XISetMask(mask.mask, XI_Leave); XISetMask(mask.mask, XI_ButtonPress); XISetMask(mask.mask, XI_ButtonRelease); info = XIQueryDevice(x11display.dpy, XIAllDevices, &num_devices); for(i = 0; i < num_devices; i++) { int id = info[i].deviceid; if(info[i].use == XISlavePointer) { mask.deviceid = id; XIGrabDevice(x11display.dpy, id, x11display.win, CurrentTime, None, GrabModeSync, GrabModeSync, True, &mask); } else if(info[i].use == XIMasterPointer) { if (x11display.features.wmStateFullscreen) XIWarpPointer(x11display.dpy, id, None, x11display.win, 0, 0, 0, 0, 0, 0); else XIWarpPointer(x11display.dpy, id, None, x11display.win, 0, 0, 0, 0, x11display.win_width/2, x11display.win_height/2); } } XIFreeDeviceInfo(info); mask.deviceid = XIAllDevices; memset(mask.mask, 0, mask.mask_len); XISetMask(mask.mask, XI_RawMotion); XISelectEvents(x11display.dpy, DefaultRootWindow(x11display.dpy), &mask, 1); free(mask.mask); XSync(x11display.dpy, True); mx = my = 0; mouse_active = qtrue; }
static void uninstall_grabs_mouse( void ) { int i; int num_devices; XIDeviceInfo *info; assert( x11display.dpy && x11display.win ); if( !mouse_active ) return; XUndefineCursor(x11display.dpy, x11display.win); info = XIQueryDevice(x11display.dpy, XIAllDevices, &num_devices); for(i = 0; i < num_devices; i++) { if(info[i].use == XIFloatingSlave) { XIUngrabDevice(x11display.dpy, info[i].deviceid, CurrentTime); } else if(info[i].use == XIMasterPointer) { XIWarpPointer(x11display.dpy, info[i].deviceid, None, x11display.win, 0, 0, 0, 0, x11display.win_width/2, x11display.win_height/2); } } XIFreeDeviceInfo(info); mouse_active = qfalse; mx = my = 0; }
static void meta_backend_x11_warp_pointer (MetaBackend *backend, int x, int y) { MetaBackendX11 *x11 = META_BACKEND_X11 (backend); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); XIWarpPointer (priv->xdisplay, META_VIRTUAL_CORE_POINTER_ID, None, meta_backend_x11_get_xwindow (x11), 0, 0, 0, 0, x, y); }
void doppelganger_move_by_window (Doppelganger *dg, Window w, int x, int y) { int current_pointer; if (dg->mpx==-1) return; XIWarpPointer (gdk_x11_get_default_xdisplay (), dg->mpx, None, w, 0, 0, 0, 0, x, y); }
/* New */ void MoveMousePointer(int deviceid, int x, int y) { XIWarpPointer(dpy, deviceid, None, window, 0, 0, 0, 0, x, y); XFlush(dpy); }