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:
commit
e20c016e32
@ -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
|
||||
|
46
ui/gtk.c
46
ui/gtk.c
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user