[gtk/matthiasc/surface-state-rework: 54/80] gtk/popover: Request fake motion events for popovers too
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/surface-state-rework: 54/80] gtk/popover: Request fake motion events for popovers too
- Date: Sat, 5 Dec 2020 17:42:40 +0000 (UTC)
commit 49f7b93cd0210527e3337612cc7427520bd35819
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Fri Dec 4 09:12:22 2020 +0100
gtk/popover: Request fake motion events for popovers too
As with GtkWindow, we need to request fake motion events if allocation
changes, to emulate motion events given the new layout.
gtk/gtkpopover.c | 42 ++++++++++++++++++++++++++++++++++++++++--
1 file changed, 40 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 21e7f2e716..0aff55995d 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -589,6 +589,34 @@ gtk_popover_native_check_resize (GtkNative *native)
present_popup (popover);
}
+static void
+maybe_request_motion_event (GtkPopover *popover)
+{
+ GtkWidget *widget = GTK_WIDGET (popover);
+ GtkRoot *root = gtk_widget_get_root (widget);
+ GdkSeat *seat;
+ GdkDevice *device;
+ GtkWidget *focus;
+ GdkSurface *focus_surface;
+
+ seat = gdk_display_get_default_seat (gtk_widget_get_display (widget));
+ if (!seat)
+ return;
+
+
+ device = gdk_seat_get_pointer (seat);
+ focus = gtk_window_lookup_pointer_focus_widget (GTK_WINDOW (root),
+ device, NULL);
+ if (!focus)
+ return;
+
+ if (!gtk_widget_is_ancestor (focus, GTK_WIDGET (popover)))
+ return;
+
+ focus_surface = gtk_native_get_surface (gtk_widget_get_native (focus));
+ gdk_surface_request_motion (focus_surface);
+}
+
static void
gtk_popover_native_layout (GtkNative *native,
int width,
@@ -601,9 +629,19 @@ gtk_popover_native_layout (GtkNative *native,
update_popover_layout (popover, gdk_popup_layout_ref (priv->layout));
if (gtk_widget_needs_allocate (widget))
- gtk_widget_allocate (widget, width, height, -1, NULL);
+ {
+ gtk_widget_allocate (widget, width, height, -1, NULL);
+
+ /* This fake motion event is needed for getting up to date pointer focus
+ * and coordinates when tho pointer didn't move but the layout changed
+ * within the popover.
+ */
+ maybe_request_motion_event (popover);
+ }
else
- gtk_widget_ensure_allocate (widget);
+ {
+ gtk_widget_ensure_allocate (widget);
+ }
}
static gboolean
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]