[gtk+] paned: Ensure children aren't underallocated
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] paned: Ensure children aren't underallocated
- Date: Mon, 9 May 2011 17:14:28 +0000 (UTC)
commit 6bda6f0c580cbdc5d154bb8e249260d1cdc1b88b
Author: Benjamin Otte <otte redhat com>
Date: Mon May 9 18:55:13 2011 +0200
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.
gtk/gtkpaned.c | 118 +++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 87 insertions(+), 31 deletions(-)
---
diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c
index da770d4..62c66bb 100644
--- a/gtk/gtkpaned.c
+++ b/gtk/gtkpaned.c
@@ -981,17 +981,17 @@ flip_child (GtkWidget *widget,
static void
gtk_paned_child_allocate (GtkWidget *child,
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)
gdk_window_move_resize (child_window,
- allocation->x, allocation->y,
- allocation->width, allocation->height);
+ window_allocation->x, window_allocation->y,
+ window_allocation->width, window_allocation->height);
- gtk_widget_size_allocate (child, &child_allocation);
+ gtk_widget_size_allocate (child, child_allocation);
}
+
static void
gtk_paned_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
@@ -1004,8 +1004,8 @@ gtk_paned_size_allocate (GtkWidget *widget,
if (priv->child1 && gtk_widget_get_visible (priv->child1) &&
priv->child2 && gtk_widget_get_visible (priv->child2))
{
- GtkAllocation child1_allocation;
- GtkAllocation child2_allocation;
+ GtkAllocation child1_allocation, window1_allocation;
+ GtkAllocation child2_allocation, window2_allocation;
GtkAllocation priv_child1_allocation;
GdkRectangle old_handle_pos;
gint handle_size;
@@ -1035,20 +1035,40 @@ gtk_paned_size_allocate (GtkWidget *widget,
priv->handle_pos.width = handle_size;
priv->handle_pos.height = allocation->height;
- child1_allocation.height = child2_allocation.height = allocation->height;
- child1_allocation.width = MAX (1, priv->child1_size);
- child1_allocation.x = allocation->x;
- child1_allocation.y = child2_allocation.y = allocation->y;
+ window1_allocation.height = window2_allocation.height = allocation->height;
+ window1_allocation.width = MAX (1, priv->child1_size);
+ window1_allocation.x = allocation->x;
+ window1_allocation.y = window2_allocation.y = allocation->y;
- child2_allocation.x = child1_allocation.x + priv->child1_size + priv->handle_pos.width;
- child2_allocation.width = MAX (1, allocation->x + allocation->width - child2_allocation.x);
+ window2_allocation.x = window1_allocation.x + priv->child1_size + priv->handle_pos.width;
+ window2_allocation.width = MAX (1, allocation->x + allocation->width - window2_allocation.x);
if (gtk_widget_get_direction (GTK_WIDGET (widget)) == GTK_TEXT_DIR_RTL)
{
- flip_child (widget, &(child2_allocation));
- flip_child (widget, &(child1_allocation));
+ flip_child (widget, &(window2_allocation));
+ flip_child (widget, &(window1_allocation));
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
{
@@ -1071,13 +1091,28 @@ gtk_paned_size_allocate (GtkWidget *widget,
priv->handle_pos.width = allocation->width;
priv->handle_pos.height = handle_size;
- child1_allocation.width = child2_allocation.width = allocation->width;
- child1_allocation.height = MAX (1, priv->child1_size);
- child1_allocation.x = child2_allocation.x = allocation->x;
- child1_allocation.y = allocation->y;
+ window1_allocation.width = window2_allocation.width = allocation->width;
+ window1_allocation.height = MAX (1, priv->child1_size);
+ window1_allocation.x = window2_allocation.x = allocation->x;
+ window1_allocation.y = allocation->y;
+
+ window2_allocation.y = window1_allocation.y + priv->child1_size + priv->handle_pos.height;
+ 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.y = child1_allocation.y + priv->child1_size + priv->handle_pos.height;
- child2_allocation.height = MAX (1, allocation->y + allocation->height - child2_allocation.y);
+ 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) &&
@@ -1127,13 +1162,25 @@ gtk_paned_size_allocate (GtkWidget *widget,
(priv->orientation == GTK_ORIENTATION_VERTICAL &&
priv_child1_allocation.height < child1_allocation.height)))
{
- gtk_paned_child_allocate (priv->child2, priv->child2_window, &child2_allocation);
- gtk_paned_child_allocate (priv->child1, priv->child1_window, &child1_allocation);
+ gtk_paned_child_allocate (priv->child2,
+ priv->child2_window,
+ &window2_allocation,
+ &child2_allocation);
+ gtk_paned_child_allocate (priv->child1,
+ priv->child1_window,
+ &window1_allocation,
+ &child1_allocation);
}
else
{
- gtk_paned_child_allocate (priv->child1, priv->child1_window, &child1_allocation);
- gtk_paned_child_allocate (priv->child2, priv->child2_window, &child2_allocation);
+ gtk_paned_child_allocate (priv->child1,
+ priv->child1_window,
+ &window1_allocation,
+ &child1_allocation);
+ gtk_paned_child_allocate (priv->child2,
+ priv->child2_window,
+ &window2_allocation,
+ &child2_allocation);
}
if (priv->child1_window)
gdk_window_show (priv->child1_window);
@@ -1142,7 +1189,7 @@ gtk_paned_size_allocate (GtkWidget *widget,
}
else
{
- GtkAllocation child_allocation;
+ GtkAllocation window_allocation, child_allocation;
if (gtk_widget_get_realized (widget))
gdk_window_hide (priv->handle);
@@ -1152,14 +1199,20 @@ gtk_paned_size_allocate (GtkWidget *widget,
if (priv->child2)
gtk_widget_set_child_visible (priv->child2, TRUE);
- child_allocation.x = allocation->x;
- child_allocation.y = allocation->y;
+ window_allocation.x = allocation->x;
+ 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.height = allocation->height;
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)
gdk_window_show (priv->child1_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))
{
- 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)
gdk_window_show (priv->child2_window);
if (priv->child1_window)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]