[gtk+] Fixed GtkNotebook to not consult GtkWidget->requisition directly
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Fixed GtkNotebook to not consult GtkWidget->requisition directly
- Date: Thu, 2 Sep 2010 04:48:29 +0000 (UTC)
commit f2279d5e5130382c78eedb59b5da2e47ebd9885a
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Thu Sep 2 13:42:50 2010 +0900
Fixed GtkNotebook to not consult GtkWidget->requisition directly
GtkNotebook was filling widget->requisition directly at "size-request"
time instead of filling in the *requsition argument, also (more importantly)
at size_allocate time GtkNotebook was consulting the action widget's
widget->requisition directly instead of safely calling
gtk_widget_get_child_requisition(). This commit closes bgo #628068.
gtk/gtknotebook.c | 65 +++++++++++++++++++++++++++--------------------------
1 files changed, 33 insertions(+), 32 deletions(-)
---
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index 5cd2998..567c845 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -1833,8 +1833,8 @@ gtk_notebook_size_request (GtkWidget *widget,
"scroll-arrow-vlength", &scroll_arrow_vlength,
NULL);
- widget->requisition.width = 0;
- widget->requisition.height = 0;
+ requisition->width = 0;
+ requisition->height = 0;
for (children = priv->children, vis_pages = 0; children;
children = children->next)
@@ -1846,9 +1846,9 @@ gtk_notebook_size_request (GtkWidget *widget,
vis_pages++;
gtk_widget_size_request (page->child, &child_requisition);
- widget->requisition.width = MAX (widget->requisition.width,
+ requisition->width = MAX (requisition->width,
child_requisition.width);
- widget->requisition.height = MAX (widget->requisition.height,
+ requisition->height = MAX (requisition->height,
child_requisition.height);
if (priv->menu && page->menu_label->parent &&
@@ -1867,8 +1867,8 @@ gtk_notebook_size_request (GtkWidget *widget,
if (priv->show_border || priv->show_tabs)
{
- widget->requisition.width += widget->style->xthickness * 2;
- widget->requisition.height += widget->style->ythickness * 2;
+ requisition->width += widget->style->xthickness * 2;
+ requisition->height += widget->style->ythickness * 2;
if (priv->show_tabs)
{
@@ -1944,7 +1944,7 @@ gtk_notebook_size_request (GtkWidget *widget,
break;
if (priv->scrollable && vis_pages > 1 &&
- widget->requisition.width < tab_width)
+ requisition->width < tab_width)
tab_height = MAX (tab_height, scroll_arrow_hlength);
tab_height = MAX (tab_height, action_widget_requisition[ACTION_WIDGET_START].height);
@@ -1971,20 +1971,20 @@ gtk_notebook_size_request (GtkWidget *widget,
}
if (priv->scrollable && vis_pages > 1 &&
- widget->requisition.width < tab_width)
+ requisition->width < tab_width)
tab_width = tab_max + 2 * (scroll_arrow_hlength + arrow_spacing);
action_width += action_widget_requisition[ACTION_WIDGET_START].width;
action_width += action_widget_requisition[ACTION_WIDGET_END].width;
if (priv->homogeneous && !priv->scrollable)
- widget->requisition.width = MAX (widget->requisition.width,
+ requisition->width = MAX (requisition->width,
vis_pages * tab_max +
tab_overlap + action_width);
else
- widget->requisition.width = MAX (widget->requisition.width,
+ requisition->width = MAX (requisition->width,
tab_width + tab_overlap + action_width);
- widget->requisition.height += tab_height;
+ requisition->height += tab_height;
break;
case GTK_POS_LEFT:
case GTK_POS_RIGHT:
@@ -1992,7 +1992,7 @@ gtk_notebook_size_request (GtkWidget *widget,
break;
if (priv->scrollable && vis_pages > 1 &&
- widget->requisition.height < tab_height)
+ requisition->height < tab_height)
tab_width = MAX (tab_width,
arrow_spacing + 2 * scroll_arrow_vlength);
@@ -2022,27 +2022,27 @@ gtk_notebook_size_request (GtkWidget *widget,
}
if (priv->scrollable && vis_pages > 1 &&
- widget->requisition.height < tab_height)
+ requisition->height < tab_height)
tab_height = tab_max + (2 * scroll_arrow_vlength + arrow_spacing);
action_height += action_widget_requisition[ACTION_WIDGET_START].height;
action_height += action_widget_requisition[ACTION_WIDGET_END].height;
if (priv->homogeneous && !priv->scrollable)
- widget->requisition.height =
- MAX (widget->requisition.height,
+ requisition->height =
+ MAX (requisition->height,
vis_pages * tab_max + tab_overlap + action_height);
else
- widget->requisition.height =
- MAX (widget->requisition.height,
+ requisition->height =
+ MAX (requisition->height,
tab_height + tab_overlap + action_height);
if (!priv->homogeneous || priv->scrollable)
vis_pages = 1;
- widget->requisition.height = MAX (widget->requisition.height,
- vis_pages * tab_max +
- tab_overlap);
+ requisition->height = MAX (requisition->height,
+ vis_pages * tab_max +
+ tab_overlap);
- widget->requisition.width += tab_width;
+ requisition->width += tab_width;
break;
}
}
@@ -2062,8 +2062,8 @@ gtk_notebook_size_request (GtkWidget *widget,
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- widget->requisition.width += border_width * 2;
- widget->requisition.height += border_width * 2;
+ requisition->width += border_width * 2;
+ requisition->height += border_width * 2;
if (switch_page)
{
@@ -2082,8 +2082,8 @@ gtk_notebook_size_request (GtkWidget *widget,
}
else if (gtk_widget_get_visible (widget))
{
- widget->requisition.width = border_width * 2;
- widget->requisition.height= border_width * 2;
+ requisition->width = border_width * 2;
+ requisition->height = border_width * 2;
}
}
if (vis_pages && !priv->cur_page)
@@ -2171,7 +2171,8 @@ gtk_notebook_size_allocate (GtkWidget *widget,
for (i = 0; i < N_ACTION_WIDGETS; i++)
{
GtkAllocation widget_allocation;
-
+ GtkRequisition requisition;
+
if (!priv->action_widget[i])
continue;
@@ -2179,6 +2180,8 @@ gtk_notebook_size_allocate (GtkWidget *widget,
widget_allocation.y = widget->allocation.y + border_width;
is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+ gtk_widget_get_child_requisition (priv->action_widget[i], &requisition);
+
switch (tab_pos)
{
case GTK_POS_BOTTOM:
@@ -2186,14 +2189,13 @@ gtk_notebook_size_allocate (GtkWidget *widget,
widget->allocation.height - 2 * border_width - priv->cur_page->requisition.height;
/* fall through */
case GTK_POS_TOP:
- widget_allocation.width = priv->action_widget[i]->requisition.width;
+ widget_allocation.width = requisition.width;
widget_allocation.height = priv->cur_page->requisition.height - widget->style->ythickness;
if ((i == ACTION_WIDGET_START && is_rtl) ||
(i == ACTION_WIDGET_END && !is_rtl))
widget_allocation.x +=
- widget->allocation.width - 2 * border_width -
- priv->action_widget[i]->requisition.width;
+ widget->allocation.width - 2 * border_width - requisition.width;
if (tab_pos == GTK_POS_TOP) /* no fall through */
widget_allocation.y += 2 * focus_width;
break;
@@ -2202,13 +2204,12 @@ gtk_notebook_size_allocate (GtkWidget *widget,
widget->allocation.width - 2 * border_width - priv->cur_page->requisition.width;
/* fall through */
case GTK_POS_LEFT:
- widget_allocation.height = priv->action_widget[i]->requisition.height;
+ widget_allocation.height = requisition.height;
widget_allocation.width = priv->cur_page->requisition.width - widget->style->xthickness;
if (i == ACTION_WIDGET_END)
widget_allocation.y +=
- widget->allocation.height - 2 * border_width -
- priv->action_widget[i]->requisition.height;
+ widget->allocation.height - 2 * border_width - requisition.height;
if (tab_pos == GTK_POS_LEFT) /* no fall through */
widget_allocation.x += 2 * focus_width;
break;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]