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 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 @@ -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);