summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2020-08-07 17:06:08 -0700
committerChristian Hergert <chergert@redhat.com>2020-08-07 17:10:52 -0700
commit4d88e3af171a0eecca3e944ff649d2116905601c (patch)
treeb7dc847cfe1a1c8812f7cae5d0bbf0f0c25bbcbd
parent7625ccd6fac09a4e341608d1de60a8c332368346 (diff)
downloadgtk+-4d88e3af171a0eecca3e944ff649d2116905601c.tar.gz
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.
-rw-r--r--docs/reference/gtk/gtk4-sections.txt2
-rw-r--r--gtk/gtkpopover.c59
-rw-r--r--gtk/gtkpopover.h9
3 files changed, 70 insertions, 0 deletions
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index d96884bb94..5b23420daf 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -6270,6 +6270,8 @@ gtk_popover_set_autohide
gtk_popover_get_autohide
gtk_popover_set_has_arrow
gtk_popover_get_has_arrow
+gtk_popover_set_offset
+gtk_popover_get_offset
gtk_popover_set_default_widget
<SUBSECTION Standard>
GTK_TYPE_POPOVER
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
@@ -104,6 +104,15 @@ 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);