[gtk/wip/chergert/popover-offset] popover: allow setting popup layout offset




commit c47d189b0f43a1ae73dabaa25060afcfa8a11d3b
Author: Christian Hergert <chergert redhat com>
Date:   Fri Aug 7 17:06:08 2020 -0700

    popover: allow setting popup layout offset
    
    Currently there is no way to alter the offset of the popup when positioning
    with GdkPopupLayout. This makes using the popup difficult for scenarios
    like completion windows where you may need to offset the window by a given
    amount for aligning text.
    
    gtk_popover_set_offset() allows setting these values and are analagous to
    the function of the same name for GdkPopupLayout.

 gtk/gtkpopover.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 gtk/gtkpopover.h |  9 +++++++++
 2 files changed, 68 insertions(+)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index d2d36ead63..72a5451647 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -150,6 +150,9 @@ typedef struct {
   gboolean mnemonics_visible;
   gboolean disable_auto_mnemonics;
 
+  int x_offset;
+  int y_offset;
+
   guint mnemonics_display_timeout_id;
 
   GtkWidget *child;
@@ -550,6 +553,9 @@ create_popup_layout (GtkPopover *popover)
                                  surface_anchor);
   gdk_popup_layout_set_anchor_hints (layout, anchor_hints);
 
+  if (priv->x_offset || priv->y_offset)
+    gdk_popup_layout_set_offset (layout, priv->x_offset, priv->y_offset);
+
   return layout;
 }
 
@@ -2162,3 +2168,56 @@ gtk_popover_disable_auto_mnemonics (GtkPopover *popover)
 
   priv->disable_auto_mnemonics = TRUE;
 }
+
+/**
+ * gtk_popover_set_offset:
+ * @popover: a #GtkPopover
+ * @x_offset: the x offset to adjust the position by
+ * @y_offset: the y offset to adjust the position by
+ *
+ * Sets the offset to use when calculating the position of the popover.
+ *
+ * These values are used when preparing the #GtkPopupLayout for positioning
+ * the popover.
+ */
+void
+gtk_popover_set_offset (GtkPopover *popover,
+                        int         x_offset,
+                        int         y_offset)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  if (priv->x_offset != x_offset || priv->y_offset != y_offset)
+    {
+      priv->x_offset = x_offset;
+      priv->y_offset = y_offset;
+
+      gtk_widget_queue_resize (GTK_WIDGET (popover));
+    }
+}
+
+/**
+ * gtk_popover_get_offset:
+ * @popover: a #GtkPopover
+ * @x_offset: (out) (nullable): a location for the x_offset
+ * @y_offset: (out) (nullable): a location for the y_offset
+ *
+ * Gets the offset previous set with gtk_popover_set_offset().
+ */
+void
+gtk_popover_get_offset (GtkPopover *popover,
+                        int        *x_offset,
+                        int        *y_offset)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  if (x_offset)
+    *x_offset = priv->x_offset;
+
+  if (y_offset)
+    *y_offset = priv->y_offset;
+}
diff --git a/gtk/gtkpopover.h b/gtk/gtkpopover.h
index 965ad195d5..a27fdf431a 100644
--- a/gtk/gtkpopover.h
+++ b/gtk/gtkpopover.h
@@ -103,6 +103,15 @@ void            gtk_popover_popup (GtkPopover *popover);
 GDK_AVAILABLE_IN_ALL
 void            gtk_popover_popdown (GtkPopover *popover);
 
+GDK_AVAILABLE_IN_ALL
+void            gtk_popover_set_offset (GtkPopover *popover,
+                                        int         x_offset,
+                                        int         y_offset);
+GDK_AVAILABLE_IN_ALL
+void            gtk_popover_get_offset (GtkPopover *popover,
+                                        int        *x_offset,
+                                        int        *y_offset);
+
 GDK_AVAILABLE_IN_ALL
 void gtk_popover_set_default_widget (GtkPopover *popover,
                                      GtkWidget  *widget);


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