[gtk/wip/matthiasc/popup4: 69/94] popover: Track the parent position



commit 43c2582d67e1bfd40f83a8c0c5e10b5fdbb92f63
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Apr 22 19:06:39 2019 +0000

    popover: Track the parent position
    
    Use the new surface-transform-changed-callback functionality
    to move the popover whenever the parent changes its
    position in the window. This currently works for X11,
    but not for Wayland (due to restrictions in the
    move-to-rect implementation.

 gtk/gtkpopover.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 566d7f836b..e24dff2042 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -142,6 +142,7 @@ typedef struct {
   GtkWidget *relative_to;
   GdkRectangle pointing_to;
   gboolean has_pointing_to;
+  guint surface_transform_changed_cb;
   GtkPositionType position;
   gboolean modal;
   gboolean has_grab;
@@ -523,6 +524,25 @@ grab_prepare_func (GdkSeat    *seat,
   gdk_surface_show (surface);
 }
 
+static void
+unset_surface_transform_changed_cb (gpointer data)
+{
+  GtkPopover *popover = data;
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  priv->surface_transform_changed_cb = 0;
+}
+
+static gboolean
+surface_transform_changed_cb (GtkWidget               *widget,
+                              const graphene_matrix_t *transform,
+                              gpointer                 user_data)
+{
+  move_to_rect (GTK_POPOVER (user_data));
+
+  return G_SOURCE_CONTINUE;
+}
+
 static void
 gtk_popover_map (GtkWidget *widget)
 {
@@ -544,6 +564,12 @@ gtk_popover_map (GtkWidget *widget)
   gtk_widget_get_surface_allocation (priv->relative_to, &parent_rect);
   move_to_rect (popover);
 
+  priv->surface_transform_changed_cb =
+    gtk_widget_add_surface_transform_changed_callback (priv->relative_to,
+                                                       surface_transform_changed_cb,
+                                                       popover,
+                                                       unset_surface_transform_changed_cb);
+
   GTK_WIDGET_CLASS (gtk_popover_parent_class)->map (widget);
 
   child = gtk_bin_get_child (GTK_BIN (widget));
@@ -558,6 +584,10 @@ gtk_popover_unmap (GtkWidget *widget)
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
   GtkWidget *child;
 
+  gtk_widget_remove_surface_transform_changed_callback (priv->relative_to,
+                                                        priv->surface_transform_changed_cb);
+  priv->surface_transform_changed_cb = 0;
+
   GTK_WIDGET_CLASS (gtk_popover_parent_class)->unmap (widget);
 
   gdk_surface_hide (priv->surface);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]