Merge branch 'wip/chergert/popover-offset' into 'master'

popover: allow setting popup layout offset

See merge request GNOME/gtk!2412
This commit is contained in:
Matthias Clasen 2020-08-08 02:41:04 +00:00
commit bfd8c5383f
3 changed files with 70 additions and 0 deletions

View File

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

View File

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

View File

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