_gtk_window_remove_popover (priv->window, GTK_WIDGET (popover));
if (new_window)
- _gtk_window_add_popover (new_window, GTK_WIDGET (popover), priv->widget);
+ _gtk_window_add_popover (new_window, GTK_WIDGET (popover), priv->widget, TRUE);
priv->window = new_window;
}
if (priv->window)
- _gtk_window_add_popover (priv->window, GTK_WIDGET (popover), priv->widget);
+ _gtk_window_add_popover (priv->window, GTK_WIDGET (popover), priv->widget, TRUE);
if (relative_to)
scrollable = GTK_SCROLLABLE (gtk_widget_get_ancestor (priv->widget, GTK_TYPE_SCROLLABLE));
priv->windows[pos].widget = g_object_ref_sink (widget);
window = gtk_widget_get_ancestor (priv->parent, GTK_TYPE_WINDOW);
- _gtk_window_add_popover (GTK_WINDOW (window), widget, priv->parent);
+ _gtk_window_add_popover (GTK_WINDOW (window), widget, priv->parent, FALSE);
gtk_style_context_set_parent (gtk_widget_get_style_context (widget),
gtk_widget_get_style_context (priv->parent));
GtkPositionType pos;
cairo_rectangle_int_t rect;
gulong unmap_id;
+ guint clamp_allocation : 1;
};
struct _GtkWindowPrivate
GtkAllocation win_alloc;
GtkRequisition req;
GtkBorder win_border;
+ gdouble min, max;
gtk_widget_get_preferred_size (popover->widget, NULL, &req);
gtk_widget_get_allocation (GTK_WIDGET (window), &win_alloc);
rect->height = win_alloc.height;
}
else
- rect->y = CLAMP (popover->rect.y + (popover->rect.height / 2) -
- (req.height / 2), 0, win_alloc.y + win_alloc.height + win_border.bottom - req.height);
+ {
+ min = 0;
+ max = win_alloc.y + win_alloc.height + win_border.bottom - req.height;
+
+ if (popover->clamp_allocation)
+ {
+ min += win_border.top;
+ max -= win_border.bottom;
+ }
+
+ rect->y = CLAMP (popover->rect.y + (popover->rect.height / 2) -
+ (req.height / 2), min, max);
+ }
if ((popover->pos == GTK_POS_LEFT) ==
(gtk_widget_get_direction (popover->widget) == GTK_TEXT_DIR_LTR))
rect->width = win_alloc.width;
}
else
- rect->x = CLAMP (popover->rect.x + (popover->rect.width / 2) -
- (req.width / 2), 0, win_alloc.x + win_alloc.width + win_border.right - req.width);
+ {
+ min = 0;
+ max = win_alloc.x + win_alloc.width + win_border.right - req.width;
+
+ if (popover->clamp_allocation)
+ {
+ min += win_border.left;
+ max -= win_border.right;
+ }
+
+ rect->x = CLAMP (popover->rect.x + (popover->rect.width / 2) -
+ (req.width / 2), min, max);
+ }
if (popover->pos == GTK_POS_TOP)
{
void
_gtk_window_add_popover (GtkWindow *window,
GtkWidget *popover,
- GtkWidget *parent)
+ GtkWidget *parent,
+ gboolean clamp_allocation)
{
GtkWindowPrivate *priv;
GtkWindowPopover *data;
data = g_new0 (GtkWindowPopover, 1);
data->widget = popover;
data->parent = parent;
+ data->clamp_allocation = !!clamp_allocation;
priv->popovers = g_list_prepend (priv->popovers, data);
if (gtk_widget_get_realized (GTK_WIDGET (window)))
/* Popovers */
void _gtk_window_add_popover (GtkWindow *window,
GtkWidget *popover,
- GtkWidget *popover_parent);
+ GtkWidget *popover_parent,
+ gboolean clamp_allocation);
void _gtk_window_remove_popover (GtkWindow *window,
GtkWidget *popover);
void _gtk_window_set_popover_position (GtkWindow *window,