static gboolean button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GdkDevice *device; MyWidgetPrivate *private_data; device = gdk_event_get_device ((GdkEvent *) event); private_data = MY_WIDGET (widget)->private; if (!private_data->grabbed_device && gdk_device_grab (device, widget->window, GDK_OWNERSHIP_NONE, FALSE, GDK_POINTER_MOTION_MASK, NULL, gdk_event_get_time ((GdkEvent *) event)) == GDK_GRAB_SUCCESS) { private_data->grabbed_device = device; } return TRUE; } static gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data) { GdkDevice *keyboard, *pointer; MyWidgetPrivate *private_data; if (event->key != GDK_Escape) return FALSE; private_data = MY_WIDGET (widget)->private; keyboard = gdk_event_get_device ((GdkEvent *) event); pointer = gdk_device_get_associated_device (keyboard); if (private_data->grabbed_device != NULL && private_data->grabbed_device == pointer) { gdk_device_ungrab (device, gdk_event_get_time ((GdkEvent *) event)); private_data->grabbed_device = NULL; } return TRUE; }