mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 06:00:22 +00:00
paned: Ensure children aren't underallocated
Instead, allocate them a proper size and just clip them using the window we added for them in the last commit.
This commit is contained in:
parent
206b9f940d
commit
6bda6f0c58
118
gtk/gtkpaned.c
118
gtk/gtkpaned.c
@ -981,17 +981,17 @@ flip_child (GtkWidget *widget,
|
|||||||
static void
|
static void
|
||||||
gtk_paned_child_allocate (GtkWidget *child,
|
gtk_paned_child_allocate (GtkWidget *child,
|
||||||
GdkWindow *child_window, /* can be NULL */
|
GdkWindow *child_window, /* can be NULL */
|
||||||
const GtkAllocation *allocation)
|
const GtkAllocation *window_allocation,
|
||||||
|
GtkAllocation *child_allocation)
|
||||||
{
|
{
|
||||||
GtkAllocation child_allocation = { 0, 0, allocation->width, allocation->height };
|
|
||||||
|
|
||||||
if (child_window)
|
if (child_window)
|
||||||
gdk_window_move_resize (child_window,
|
gdk_window_move_resize (child_window,
|
||||||
allocation->x, allocation->y,
|
window_allocation->x, window_allocation->y,
|
||||||
allocation->width, allocation->height);
|
window_allocation->width, window_allocation->height);
|
||||||
|
|
||||||
gtk_widget_size_allocate (child, &child_allocation);
|
gtk_widget_size_allocate (child, child_allocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_paned_size_allocate (GtkWidget *widget,
|
gtk_paned_size_allocate (GtkWidget *widget,
|
||||||
GtkAllocation *allocation)
|
GtkAllocation *allocation)
|
||||||
@ -1004,8 +1004,8 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
if (priv->child1 && gtk_widget_get_visible (priv->child1) &&
|
if (priv->child1 && gtk_widget_get_visible (priv->child1) &&
|
||||||
priv->child2 && gtk_widget_get_visible (priv->child2))
|
priv->child2 && gtk_widget_get_visible (priv->child2))
|
||||||
{
|
{
|
||||||
GtkAllocation child1_allocation;
|
GtkAllocation child1_allocation, window1_allocation;
|
||||||
GtkAllocation child2_allocation;
|
GtkAllocation child2_allocation, window2_allocation;
|
||||||
GtkAllocation priv_child1_allocation;
|
GtkAllocation priv_child1_allocation;
|
||||||
GdkRectangle old_handle_pos;
|
GdkRectangle old_handle_pos;
|
||||||
gint handle_size;
|
gint handle_size;
|
||||||
@ -1035,20 +1035,40 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
priv->handle_pos.width = handle_size;
|
priv->handle_pos.width = handle_size;
|
||||||
priv->handle_pos.height = allocation->height;
|
priv->handle_pos.height = allocation->height;
|
||||||
|
|
||||||
child1_allocation.height = child2_allocation.height = allocation->height;
|
window1_allocation.height = window2_allocation.height = allocation->height;
|
||||||
child1_allocation.width = MAX (1, priv->child1_size);
|
window1_allocation.width = MAX (1, priv->child1_size);
|
||||||
child1_allocation.x = allocation->x;
|
window1_allocation.x = allocation->x;
|
||||||
child1_allocation.y = child2_allocation.y = allocation->y;
|
window1_allocation.y = window2_allocation.y = allocation->y;
|
||||||
|
|
||||||
child2_allocation.x = child1_allocation.x + priv->child1_size + priv->handle_pos.width;
|
window2_allocation.x = window1_allocation.x + priv->child1_size + priv->handle_pos.width;
|
||||||
child2_allocation.width = MAX (1, allocation->x + allocation->width - child2_allocation.x);
|
window2_allocation.width = MAX (1, allocation->x + allocation->width - window2_allocation.x);
|
||||||
|
|
||||||
if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL)
|
if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL)
|
||||||
{
|
{
|
||||||
flip_child (widget, &(child2_allocation));
|
flip_child (widget, &(window2_allocation));
|
||||||
flip_child (widget, &(child1_allocation));
|
flip_child (widget, &(window1_allocation));
|
||||||
flip_child (widget, &(priv->handle_pos));
|
flip_child (widget, &(priv->handle_pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
child1_allocation.x = child1_allocation.y = 0;
|
||||||
|
child1_allocation.width = window1_allocation.width;
|
||||||
|
child1_allocation.height = window1_allocation.height;
|
||||||
|
if (child1_width > child1_allocation.width)
|
||||||
|
{
|
||||||
|
if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_LTR)
|
||||||
|
child1_allocation.x -= child1_width - child1_allocation.width;
|
||||||
|
child1_allocation.width = child1_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
child2_allocation.x = child2_allocation.y = 0;
|
||||||
|
child2_allocation.width = window2_allocation.width;
|
||||||
|
child2_allocation.height = window2_allocation.height;
|
||||||
|
if (child2_width > child2_allocation.width)
|
||||||
|
{
|
||||||
|
if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL)
|
||||||
|
child2_allocation.x -= child2_width - child2_allocation.width;
|
||||||
|
child2_allocation.width = child2_width;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1071,13 +1091,28 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
priv->handle_pos.width = allocation->width;
|
priv->handle_pos.width = allocation->width;
|
||||||
priv->handle_pos.height = handle_size;
|
priv->handle_pos.height = handle_size;
|
||||||
|
|
||||||
child1_allocation.width = child2_allocation.width = allocation->width;
|
window1_allocation.width = window2_allocation.width = allocation->width;
|
||||||
child1_allocation.height = MAX (1, priv->child1_size);
|
window1_allocation.height = MAX (1, priv->child1_size);
|
||||||
child1_allocation.x = child2_allocation.x = allocation->x;
|
window1_allocation.x = window2_allocation.x = allocation->x;
|
||||||
child1_allocation.y = allocation->y;
|
window1_allocation.y = allocation->y;
|
||||||
|
|
||||||
child2_allocation.y = child1_allocation.y + priv->child1_size + priv->handle_pos.height;
|
window2_allocation.y = window1_allocation.y + priv->child1_size + priv->handle_pos.height;
|
||||||
child2_allocation.height = MAX (1, allocation->y + allocation->height - child2_allocation.y);
|
window2_allocation.height = MAX (1, allocation->y + allocation->height - window2_allocation.y);
|
||||||
|
|
||||||
|
child1_allocation.x = child1_allocation.y = 0;
|
||||||
|
child1_allocation.width = window1_allocation.width;
|
||||||
|
child1_allocation.height = window1_allocation.height;
|
||||||
|
if (child1_height > child1_allocation.height)
|
||||||
|
{
|
||||||
|
child1_allocation.y -= child1_height - child1_allocation.height;
|
||||||
|
child1_allocation.height = child1_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
child2_allocation.x = child2_allocation.y = 0;
|
||||||
|
child2_allocation.width = window2_allocation.width;
|
||||||
|
child2_allocation.height = window2_allocation.height;
|
||||||
|
if (child2_height > child2_allocation.height)
|
||||||
|
child2_allocation.height = child2_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gtk_widget_get_mapped (widget) &&
|
if (gtk_widget_get_mapped (widget) &&
|
||||||
@ -1127,13 +1162,25 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
(priv->orientation == GTK_ORIENTATION_VERTICAL &&
|
(priv->orientation == GTK_ORIENTATION_VERTICAL &&
|
||||||
priv_child1_allocation.height < child1_allocation.height)))
|
priv_child1_allocation.height < child1_allocation.height)))
|
||||||
{
|
{
|
||||||
gtk_paned_child_allocate (priv->child2, priv->child2_window, &child2_allocation);
|
gtk_paned_child_allocate (priv->child2,
|
||||||
gtk_paned_child_allocate (priv->child1, priv->child1_window, &child1_allocation);
|
priv->child2_window,
|
||||||
|
&window2_allocation,
|
||||||
|
&child2_allocation);
|
||||||
|
gtk_paned_child_allocate (priv->child1,
|
||||||
|
priv->child1_window,
|
||||||
|
&window1_allocation,
|
||||||
|
&child1_allocation);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gtk_paned_child_allocate (priv->child1, priv->child1_window, &child1_allocation);
|
gtk_paned_child_allocate (priv->child1,
|
||||||
gtk_paned_child_allocate (priv->child2, priv->child2_window, &child2_allocation);
|
priv->child1_window,
|
||||||
|
&window1_allocation,
|
||||||
|
&child1_allocation);
|
||||||
|
gtk_paned_child_allocate (priv->child2,
|
||||||
|
priv->child2_window,
|
||||||
|
&window2_allocation,
|
||||||
|
&child2_allocation);
|
||||||
}
|
}
|
||||||
if (priv->child1_window)
|
if (priv->child1_window)
|
||||||
gdk_window_show (priv->child1_window);
|
gdk_window_show (priv->child1_window);
|
||||||
@ -1142,7 +1189,7 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GtkAllocation child_allocation;
|
GtkAllocation window_allocation, child_allocation;
|
||||||
|
|
||||||
if (gtk_widget_get_realized (widget))
|
if (gtk_widget_get_realized (widget))
|
||||||
gdk_window_hide (priv->handle);
|
gdk_window_hide (priv->handle);
|
||||||
@ -1152,14 +1199,20 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
if (priv->child2)
|
if (priv->child2)
|
||||||
gtk_widget_set_child_visible (priv->child2, TRUE);
|
gtk_widget_set_child_visible (priv->child2, TRUE);
|
||||||
|
|
||||||
child_allocation.x = allocation->x;
|
window_allocation.x = allocation->x;
|
||||||
child_allocation.y = allocation->y;
|
window_allocation.y = allocation->y;
|
||||||
|
window_allocation.width = allocation->width;
|
||||||
|
window_allocation.height = allocation->height;
|
||||||
|
child_allocation.x = child_allocation.y = 0;
|
||||||
child_allocation.width = allocation->width;
|
child_allocation.width = allocation->width;
|
||||||
child_allocation.height = allocation->height;
|
child_allocation.height = allocation->height;
|
||||||
|
|
||||||
if (priv->child1 && gtk_widget_get_visible (priv->child1))
|
if (priv->child1 && gtk_widget_get_visible (priv->child1))
|
||||||
{
|
{
|
||||||
gtk_paned_child_allocate (priv->child1, priv->child1_window, &child_allocation);
|
gtk_paned_child_allocate (priv->child1,
|
||||||
|
priv->child1_window,
|
||||||
|
&window_allocation,
|
||||||
|
&child_allocation);
|
||||||
if (priv->child1_window)
|
if (priv->child1_window)
|
||||||
gdk_window_show (priv->child1_window);
|
gdk_window_show (priv->child1_window);
|
||||||
if (priv->child2_window)
|
if (priv->child2_window)
|
||||||
@ -1167,7 +1220,10 @@ gtk_paned_size_allocate (GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
else if (priv->child2 && gtk_widget_get_visible (priv->child2))
|
else if (priv->child2 && gtk_widget_get_visible (priv->child2))
|
||||||
{
|
{
|
||||||
gtk_paned_child_allocate (priv->child2, priv->child2_window, &child_allocation);
|
gtk_paned_child_allocate (priv->child2,
|
||||||
|
priv->child2_window,
|
||||||
|
&window_allocation,
|
||||||
|
&child_allocation);
|
||||||
if (priv->child2_window)
|
if (priv->child2_window)
|
||||||
gdk_window_show (priv->child2_window);
|
gdk_window_show (priv->child2_window);
|
||||||
if (priv->child1_window)
|
if (priv->child1_window)
|
||||||
|
Loading…
Reference in New Issue
Block a user