static void add_device_presence_filter (GsdPointingDeviceManager *manager) { Display *display; XEventClass class_presence; gint xi_presence; gint op_code, event, error; if (!XQueryExtension(GDK_DISPLAY(), "XInputExtension", &op_code, &event, &error)) { return; } display = gdk_x11_get_default_xdisplay(); gdk_error_trap_push(); DevicePresence(display, xi_presence, class_presence); XSelectExtensionEvent(display, RootWindow(display, DefaultScreen(display)), &class_presence, 1); gdk_flush(); if (!gdk_error_trap_pop()) gdk_window_add_filter(NULL, device_presence_filter, manager); }
static GdkFilterReturn device_presence_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) { XEvent *xev = (XEvent *)xevent; XEventClass class_presence; int xi_presence; GpdsXInput *xinput; GsdPointingDeviceManager *manager = GSD_POINTING_DEVICE_MANAGER(data); xinput = gsd_pointing_device_manager_get_xinput(manager); if (!xinput) return GDK_FILTER_CONTINUE; DevicePresence(gdk_x11_get_default_xdisplay(), xi_presence, class_presence); if (xev->type == xi_presence) { XDevicePresenceNotifyEvent *notify_event = (XDevicePresenceNotifyEvent *)xev; if (notify_event->devchange == DeviceEnabled || notify_event->devchange == DeviceRemoved) { set_disable_while_other_device_exists(manager, xinput, gconf_client_get_default()); } } g_object_unref(xinput); return GDK_FILTER_CONTINUE; }
int XInputEventNotifier::registerForNewDeviceEvent(Display* display) { int xitype; XEventClass xiclass; DevicePresence(display, xitype, xiclass); XSelectExtensionEvent(display, DefaultRootWindow(display), &xiclass, 1); kDebug() << "Registered for new device events from XInput, class" << xitype; xinputEventType = xitype; return xitype; }