From 599344d428e20fb8be38fb4fb98483533a3b81fb Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 4 Apr 2017 17:08:48 +0200 Subject: [PATCH] gtkwindow: Add private API to update pointer cursors --- gtk/gtkwindow.c | 53 ++++++++++++++++++++++++++++++++++++++++++ gtk/gtkwindowprivate.h | 3 +++ 2 files changed, 56 insertions(+) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 5531ccd6b7..c9ca7faef6 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -11383,3 +11383,56 @@ gtk_window_set_pointer_focus_grab (GtkWindow *window, g_assert (focus != NULL); gtk_pointer_focus_set_implicit_grab (focus, grab_widget); } + +static void +update_cursor (GtkWindow *toplevel, + GdkDevice *device, + GtkWidget *target) +{ + GdkCursor *cursor = NULL; + GList *widgets = NULL, *l; + + while (target) + { + widgets = g_list_prepend (widgets, target); + target = _gtk_widget_get_parent (target); + } + + for (l = widgets; l; l = l->next) + { + cursor = gtk_widget_get_cursor (l->data); + if (cursor) + break; + } + + gdk_window_set_device_cursor (gtk_widget_get_window (GTK_WIDGET (toplevel)), + device, cursor); + g_list_free (widgets); +} + +void +gtk_window_maybe_update_cursor (GtkWindow *window, + GtkWidget *widget, + GdkDevice *device) +{ + GList *l = window->priv->foci; + + for (l = window->priv->foci; l; l = l->next) + { + GtkPointerFocus *focus = l->data; + + if (focus->sequence) + continue; + if (device && device != focus->device) + continue; + + if (widget != focus->target && + !gtk_widget_is_ancestor (focus->target, widget)) + continue; + + update_cursor (focus->toplevel, focus->device, focus->target); + + if (device) + break; + } +} diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h index 857121985e..1d97de7a1a 100644 --- a/gtk/gtkwindowprivate.h +++ b/gtk/gtkwindowprivate.h @@ -164,6 +164,9 @@ void gtk_window_update_pointer_focus_on_state_change (GtkWindow *win void gtk_window_maybe_revoke_implicit_grab (GtkWindow *window, GdkDevice *device, GtkWidget *grab_widget); +void gtk_window_maybe_update_cursor (GtkWindow *window, + GtkWidget *widget, + GdkDevice *device); G_END_DECLS