summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkinput-xfree.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkinput-xfree.c')
-rw-r--r--gdk/x11/gdkinput-xfree.c68
1 files changed, 21 insertions, 47 deletions
diff --git a/gdk/x11/gdkinput-xfree.c b/gdk/x11/gdkinput-xfree.c
index f742490088..704c11aefa 100644
--- a/gdk/x11/gdkinput-xfree.c
+++ b/gdk/x11/gdkinput-xfree.c
@@ -44,7 +44,8 @@ void
gdk_input_init(void)
{
gdk_input_vtable.set_mode = gdk_input_xfree_set_mode;
- gdk_input_vtable.set_axes = gdk_input_common_set_axes;
+ gdk_input_vtable.set_axes = gdk_input_common_set_axes;
+ gdk_input_vtable.set_key = gdk_input_common_set_key;
gdk_input_vtable.motion_events = gdk_input_common_motion_events;
gdk_input_vtable.get_pointer = gdk_input_common_get_pointer;
gdk_input_vtable.grab_pointer = gdk_input_xfree_grab_pointer;
@@ -229,33 +230,6 @@ gdk_input_xfree_other_event (GdkEvent *event,
gdk_input_ignore_core)
gdk_input_check_proximity();
- /* Do a passive button grab. We have to be careful not to release
- an explicit grab, if any. Doubling the grab should be harmless,
- but we check anyways. */
-
- /* FIXME, finding the proper events here is going to be SLOW - but
- we might have different sets for each window/device combination */
-
- if (return_val> 0 && !input_window->grabbed)
- {
- if (event->type == GDK_BUTTON_PRESS)
- {
- XEventClass event_classes[6];
- gint num_classes;
-
- gdk_input_common_find_events (window, gdkdev,
- ((GdkWindowPrivate *)window)->extension_events,
- event_classes, &num_classes);
-
- XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice,
- GDK_WINDOW_XWINDOW (window),
- TRUE, num_classes, event_classes,
- GrabModeAsync, GrabModeAsync, event->button.time);
- }
- else if (event->type == GDK_BUTTON_RELEASE)
- XUngrabDevice( GDK_DISPLAY(), gdkdev->xdevice, event->button.time);
- }
-
return return_val;
}
@@ -284,8 +258,9 @@ gdk_input_xfree_grab_pointer (GdkWindow * window,
GdkInputWindow *input_window, *new_window;
GdkDevicePrivate *gdkdev;
GList *tmp_list;
- XEventClass event_classes[6];
+ XEventClass event_classes[GDK_MAX_DEVICE_CLASSES];
gint num_classes;
+ gint result;
tmp_list = gdk_input_windows;
new_window = NULL;
@@ -296,15 +271,12 @@ gdk_input_xfree_grab_pointer (GdkWindow * window,
return AlreadyGrabbed;
if (input_window->window == window)
- {
- new_window = input_window;
- break;
- }
+ new_window = input_window;
tmp_list = tmp_list->next;
}
- g_return_if_fail (new_window == NULL);
+ g_return_val_if_fail (new_window != NULL, Success); /* shouldn't happen */
new_window->grabbed = TRUE;
@@ -313,17 +285,21 @@ gdk_input_xfree_grab_pointer (GdkWindow * window,
{
gdkdev = (GdkDevicePrivate *)tmp_list->data;
if (gdkdev->info.deviceid != GDK_CORE_POINTER &&
- gdkdev->xdevice && !gdkdev->button_state)
+ gdkdev->xdevice)
{
- gdk_input_common_find_events (window, gdkdev,
- ((GdkWindowPrivate *)window)->extension_events,
+ gdk_input_common_find_events (window, gdkdev,
+ event_mask,
event_classes, &num_classes);
- /* FIXME: we should do something on failure */
- XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice,
- GDK_WINDOW_XWINDOW (window),
- TRUE, num_classes, event_classes,
- GrabModeAsync, GrabModeAsync, time);
+ result = XGrabDevice( GDK_DISPLAY(), gdkdev->xdevice,
+ GDK_WINDOW_XWINDOW (window),
+ owner_events, num_classes, event_classes,
+ GrabModeAsync, GrabModeAsync, time);
+
+ /* FIXME: if failure occurs on something other than the first
+ device, things will be badly inconsistent */
+ if (result != Success)
+ return result;
}
tmp_list = tmp_list->next;
}
@@ -355,11 +331,9 @@ gdk_input_xfree_ungrab_pointer (guint32 time)
while (tmp_list)
{
gdkdev = (GdkDevicePrivate *)tmp_list->data;
- if (gdkdev->info.deviceid != GDK_CORE_POINTER &&
- gdkdev->xdevice && !gdkdev->button_state)
- {
- XUngrabDevice( gdk_display, gdkdev->xdevice, time);
- }
+ if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice)
+ XUngrabDevice( gdk_display, gdkdev->xdevice, time);
+
tmp_list = tmp_list->next;
}
}