[gtk/matthiasc/surface-state-rework: 54/80] gtk/popover: Request fake motion events for popovers too




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]