gtk: pointer fixes from Takashi Iwai.

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.22 (GNU/Linux)
 
 iQIcBAABAgAGBQJTQmcoAAoJEEy22O7T6HE42vQP/ROH/ifmjMPB5ungvZCuyrNK
 2vNuGblzFuJRDy7AQTC/KJvzNkePqKoRVnax/GNcEX4EUrECX+Fhnlzq5NTA3kgS
 GMb1Sov8UF+ceWye3ZIGhAk2AyYhdF9CrMjjdbjky8FCuRXyHFdWVgycyu9HEX9b
 Dq7klIH+WatU1ozfvOcY80YJ0QiBModrPnlIAwLZ7TdlI8i2PV2uqug58JDOVr+/
 RJK5YhHVochBtPKfkBBeCGrF0H1bP1W+ufXoApfuyarIMz/t1BNQbdcs1bkcJNl4
 erxcvEnZ6mkO8w4efI1QKB+OshDGwHZ5xj9+g+8WUjqtFRq9vnr0Ar8c8J4PvC7N
 +3bWkIA5aC9EDZRn9VFjLbWutINW2Oi+FawMg/1v5vMTJESEdzfFrSlc7U5ogvzR
 yhPP8+56im/nZGszSnzhTnFBAmFXIzurGRVBcWNrP3xR0b3FG4XAbyJqoa7m6v2a
 U8tZ2O3aEBzsquRrALEaMAvjBn25S1pLBsKR/vJj/VPL0EYkBXDLZsgl9OO5dyV+
 XVqMlUVuc2dFumEveUzvAkXMSeR7vEmVlVO9gPf8QhdlRpfWSv+Yy0EaKulrwgoq
 5kiTsj0WZPYhnACLWtxALDmXviVjgiKBTUwae55Qi1G+ULYRZTrctdV2Z3Cjr7KZ
 YvG9diPNVe/XmNOfILar
 =n2Yg
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/kraxel/tags/pull-gtk-4' into staging

gtk: pointer fixes from Takashi Iwai.

# gpg: Signature made Mon 07 Apr 2014 09:51:52 BST using RSA key ID D3E87138
# gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>"
# gpg:                 aka "Gerd Hoffmann <gerd@kraxel.org>"
# gpg:                 aka "Gerd Hoffmann (private) <kraxel@gmail.com>"

* remotes/kraxel/tags/pull-gtk-4:
  ui: Update MAINTAINERS entry.
  gtk: Remember the last grabbed pointer position
  gtk: Fix the relative pointer tracking mode
  gtk: Use gtk generic event signal instead of motion-notify-event

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2014-04-07 12:27:10 +01:00
commit e20c016e32
2 changed files with 35 additions and 14 deletions

View File

@ -717,7 +717,8 @@ F: hw/display/qxl*
Graphics
M: Anthony Liguori <aliguori@amazon.com>
S: Maintained
M: Gerd Hoffmann <kraxel@redhat.com>
S: Odd Fixes
F: ui/
Cocoa graphics

View File

@ -156,8 +156,11 @@ typedef struct GtkDisplayState
DisplayChangeListener dcl;
DisplaySurface *ds;
int button_mask;
gboolean last_set;
int last_x;
int last_y;
int grab_x_root;
int grab_y_root;
double scale_x;
double scale_y;
@ -616,25 +619,25 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
x = (motion->x - mx) / s->scale_x;
y = (motion->y - my) / s->scale_y;
if (x < 0 || y < 0 ||
x >= surface_width(s->ds) ||
y >= surface_height(s->ds)) {
return TRUE;
}
if (qemu_input_is_absolute()) {
if (x < 0 || y < 0 ||
x >= surface_width(s->ds) ||
y >= surface_height(s->ds)) {
return TRUE;
}
qemu_input_queue_abs(s->dcl.con, INPUT_AXIS_X, x,
surface_width(s->ds));
qemu_input_queue_abs(s->dcl.con, INPUT_AXIS_Y, y,
surface_height(s->ds));
qemu_input_event_sync();
} else if (s->last_x != -1 && s->last_y != -1 && gd_is_grab_active(s)) {
} else if (s->last_set && gd_is_grab_active(s)) {
qemu_input_queue_rel(s->dcl.con, INPUT_AXIS_X, x - s->last_x);
qemu_input_queue_rel(s->dcl.con, INPUT_AXIS_Y, y - s->last_y);
qemu_input_event_sync();
}
s->last_x = x;
s->last_y = y;
s->last_set = TRUE;
if (!qemu_input_is_absolute() && gd_is_grab_active(s)) {
GdkScreen *screen = gtk_widget_get_screen(s->drawing_area);
@ -669,8 +672,7 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
GdkDisplay *display = gtk_widget_get_display(widget);
gdk_display_warp_pointer(display, screen, x, y);
#endif
s->last_x = -1;
s->last_y = -1;
s->last_set = FALSE;
return FALSE;
}
}
@ -765,6 +767,14 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
return TRUE;
}
static gboolean gd_event(GtkWidget *widget, GdkEvent *event, void *opaque)
{
if (event->type == GDK_MOTION_NOTIFY) {
return gd_motion_event(widget, &event->motion, opaque);
}
return FALSE;
}
/** Window Menu Actions **/
static void gd_menu_pause(GtkMenuItem *item, void *opaque)
@ -963,8 +973,8 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
static void gd_grab_pointer(GtkDisplayState *s)
{
#if GTK_CHECK_VERSION(3, 0, 0)
GdkDisplay *display = gtk_widget_get_display(s->drawing_area);
#if GTK_CHECK_VERSION(3, 0, 0)
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
GList *devices = gdk_device_manager_list_devices(mgr,
GDK_DEVICE_TYPE_MASTER);
@ -988,6 +998,8 @@ static void gd_grab_pointer(GtkDisplayState *s)
tmp = tmp->next;
}
g_list_free(devices);
gdk_device_get_position(gdk_device_manager_get_client_pointer(mgr),
NULL, &s->grab_x_root, &s->grab_y_root);
#else
gdk_pointer_grab(gtk_widget_get_window(s->drawing_area),
FALSE, /* All events to come to our window directly */
@ -999,13 +1011,15 @@ static void gd_grab_pointer(GtkDisplayState *s)
NULL, /* Allow cursor to move over entire desktop */
s->null_cursor,
GDK_CURRENT_TIME);
gdk_display_get_pointer(display, NULL,
&s->grab_x_root, &s->grab_y_root, NULL);
#endif
}
static void gd_ungrab_pointer(GtkDisplayState *s)
{
#if GTK_CHECK_VERSION(3, 0, 0)
GdkDisplay *display = gtk_widget_get_display(s->drawing_area);
#if GTK_CHECK_VERSION(3, 0, 0)
GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
GList *devices = gdk_device_manager_list_devices(mgr,
GDK_DEVICE_TYPE_MASTER);
@ -1019,8 +1033,14 @@ static void gd_ungrab_pointer(GtkDisplayState *s)
tmp = tmp->next;
}
g_list_free(devices);
gdk_device_warp(gdk_device_manager_get_client_pointer(mgr),
gtk_widget_get_screen(s->drawing_area),
s->grab_x_root, s->grab_y_root);
#else
gdk_pointer_ungrab(GDK_CURRENT_TIME);
gdk_display_warp_pointer(display,
gtk_widget_get_screen(s->drawing_area),
s->grab_x_root, s->grab_y_root);
#endif
}
@ -1267,8 +1287,8 @@ static void gd_connect_signals(GtkDisplayState *s)
g_signal_connect(s->drawing_area, "expose-event",
G_CALLBACK(gd_expose_event), s);
#endif
g_signal_connect(s->drawing_area, "motion-notify-event",
G_CALLBACK(gd_motion_event), s);
g_signal_connect(s->drawing_area, "event",
G_CALLBACK(gd_event), s);
g_signal_connect(s->drawing_area, "button-press-event",
G_CALLBACK(gd_button_event), s);
g_signal_connect(s->drawing_area, "button-release-event",