Use the client pointer for events with no device.

The core pointer is sort of meaningless in a multidevice environment,
the client pointer is used instead to fake a GdkDevice on events that
don't have one.
This commit is contained in:
Carlos Garnacho
2010-10-28 23:01:16 +02:00
parent 398728feb5
commit b1dec866e5

View File

@ -1032,20 +1032,22 @@ gdk_event_get_device (const GdkEvent *event)
case GDK_KEY_RELEASE: case GDK_KEY_RELEASE:
{ {
GdkDisplay *display; GdkDisplay *display;
GdkDevice *core_pointer; GdkDeviceManager *device_manager;
GdkDevice *client_pointer;
g_warning ("Event with type %d not holding a GdkDevice. " g_warning ("Event with type %d not holding a GdkDevice. "
"It is most likely synthesized outside Gdk/GTK+\n", "It is most likely synthesized outside Gdk/GTK+\n",
event->type); event->type);
display = gdk_window_get_display (event->any.window); display = gdk_window_get_display (event->any.window);
core_pointer = gdk_display_get_core_pointer (display); device_manager = gdk_display_get_device_manager (display);
client_pointer = gdk_device_manager_get_client_pointer (device_manager);
if (event->type == GDK_KEY_PRESS || if (event->type == GDK_KEY_PRESS ||
event->type == GDK_KEY_RELEASE) event->type == GDK_KEY_RELEASE)
return gdk_device_get_associated_device (core_pointer); return gdk_device_get_associated_device (client_pointer);
else else
return core_pointer; return client_pointer;
} }
break; break;
default: default: