[gtk+/combo-refactor: 84/201] Fixing GtkComboBox breakage after merge, completing hand-merge of style-context GtkBorder issues (no
- From: Tristan Van Berkom <tvb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/combo-refactor: 84/201] Fixing GtkComboBox breakage after merge, completing hand-merge of style-context GtkBorder issues (no
- Date: Tue, 21 Dec 2010 12:52:19 +0000 (UTC)
commit a8b6d2f2e01b5d9591a216f5a9e3c1766402af31
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date: Sun Dec 5 18:03:32 2010 +0900
Fixing GtkComboBox breakage after merge, completing hand-merge of style-context GtkBorder issues (now it works again).
gtk/gtkcombobox.c | 222 ++++++++++++++++++++++++++---------------------------
1 files changed, 109 insertions(+), 113 deletions(-)
---
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index a94caf6..9ed7416 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -41,6 +41,7 @@
#include "gtkcellareabox.h"
#include "gtktreemenu.h"
#include "gtkprivate.h"
+#include "gtkentryprivate.h"
#include <gdk/gdkkeysyms.h>
@@ -386,6 +387,7 @@ struct _GtkComboBoxPrivate
gint text_column;
GtkCellRenderer *text_renderer;
+ guint in_construction : 1;
guint popup_in_progress : 1;
guint popup_shown : 1;
guint add_tearoffs : 1;
@@ -976,7 +978,6 @@ static void
gtk_combo_box_init (GtkComboBox *combo_box)
{
GtkComboBoxPrivate *priv;
- GtkStyleContext *context;
combo_box->priv = G_TYPE_INSTANCE_GET_PRIVATE (combo_box,
GTK_TYPE_COMBO_BOX,
@@ -1004,9 +1005,6 @@ gtk_combo_box_init (GtkComboBox *combo_box)
priv->text_column = -1;
priv->text_renderer = NULL;
priv->id_column = -1;
-
- context = gtk_widget_get_style_context (GTK_WIDGET (combo_box));
- gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
}
/******************************************************
@@ -1020,6 +1018,7 @@ gtk_combo_box_constructor (GType type,
GObject *object;
GtkComboBox *combo_box;
GtkComboBoxPrivate *priv;
+ GtkStyleContext *context;
object = G_OBJECT_CLASS (gtk_combo_box_parent_class)->constructor
(type, n_construct_properties, construct_properties);
@@ -1034,6 +1033,18 @@ gtk_combo_box_constructor (GType type,
priv->area = g_object_ref_sink (area);
}
+ priv->cell_view = gtk_cell_view_new_with_context (priv->area, NULL);
+ gtk_cell_view_set_fit_model (GTK_CELL_VIEW (priv->cell_view), TRUE);
+ gtk_cell_view_set_model (GTK_CELL_VIEW (priv->cell_view), priv->model);
+ gtk_widget_set_parent (priv->cell_view, GTK_WIDGET (combo_box));
+ _gtk_bin_set_child (GTK_BIN (combo_box), priv->cell_view);
+ gtk_widget_show (priv->cell_view);
+
+ gtk_combo_box_check_appearance (combo_box);
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (combo_box));
+ gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
+
if (priv->has_entry)
{
GtkWidget *entry;
@@ -1051,16 +1062,6 @@ gtk_combo_box_constructor (GType type,
g_signal_connect (combo_box, "changed",
G_CALLBACK (gtk_combo_box_entry_active_changed), NULL);
}
- else
- {
- priv->cell_view = gtk_cell_view_new_with_context (priv->area, NULL);
- gtk_cell_view_set_fit_model (GTK_CELL_VIEW (priv->cell_view), TRUE);
- gtk_cell_view_set_model (GTK_CELL_VIEW (priv->cell_view), priv->model);
- gtk_container_add (GTK_CONTAINER (combo_box), priv->cell_view);
- gtk_widget_show (priv->cell_view);
- }
-
- gtk_combo_box_check_appearance (combo_box);
return object;
}
@@ -1805,6 +1806,23 @@ gtk_combo_box_destroy (GtkWidget *widget)
combo_box->priv->cell_view = NULL;
}
+static void
+get_widget_border (GtkWidget *widget,
+ GtkBorder *border)
+{
+ GtkStyleContext *context;
+ GtkBorder *border_width;
+
+ context = gtk_widget_get_style_context (widget);
+
+ gtk_style_context_get (context,
+ gtk_widget_get_state_flags (widget),
+ "border-width", &border_width,
+ NULL);
+
+ *border = *border_width;
+ gtk_border_free (border_width);
+}
static void
gtk_combo_box_get_preferred_width (GtkWidget *widget,
@@ -1819,10 +1837,11 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
PangoFontMetrics *metrics;
PangoFontDescription *font_desc;
GtkWidget *child;
- gint minimum_width, natural_width;
+ gint minimum_width = 0, natural_width = 0;
gint child_min, child_nat;
GtkStyleContext *style_context;
GtkStateFlags state;
+ GtkBorder *border;
child = gtk_bin_get_child (GTK_BIN (widget));
@@ -1840,6 +1859,7 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
gtk_style_context_get (style_context, state,
"font", &font_desc,
+ "border-width", &border,
NULL);
context = gtk_widget_get_pango_context (GTK_WIDGET (widget));
@@ -1860,15 +1880,17 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
if (priv->cell_view)
{
gint sep_width, arrow_width;
- gint border_width, xthickness, xpad;
+ gint border_width, xpad;
+ GtkBorder button_border;
border_width = gtk_container_get_border_width (GTK_CONTAINER (combo_box));
- xthickness = get_widget_border_thickness (priv->button);
+ get_widget_border (priv->button, &button_border);
gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
- xpad = 2*(border_width + xthickness + focus_width + focus_pad);
+ xpad = 2 * (border_width + focus_width + focus_pad) +
+ button_border.left + button_border.right;
minimum_width = child_min + sep_width + arrow_width + xpad;
natural_width = child_nat + sep_width + arrow_width + xpad;
@@ -1900,8 +1922,12 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
{
if (priv->has_frame)
{
- gint border_width = gtk_container_get_border_width (GTK_CONTAINER (priv->cell_view_frame));
- gint xpad = 2 * (border_width + get_widget_border_thickness (priv->cell_view_frame));
+ gint border_width, xpad;
+ GtkBorder frame_border;
+
+ border_width = gtk_container_get_border_width (GTK_CONTAINER (priv->cell_view_frame));
+ get_widget_border (priv->cell_view_frame, &frame_border);
+ xpad = (2 * border_width) + frame_border.left + frame_border.right;
minimum_width += xpad;
natural_width += xpad;
@@ -1916,14 +1942,9 @@ gtk_combo_box_get_preferred_width (GtkWidget *widget,
natural_width += button_nat_width;
}
- if (GTK_SHADOW_NONE != priv->shadow_type)
- {
- gint thickness;
-
- thickness = get_widget_border_thickness (GTK_WIDGET (widget));
- minimum_width += 2 * thickness;
- natural_width += 2 * thickness;
- }
+ minimum_width += border->left + border->right;
+ natural_width += border->left + border->right;
+ gtk_border_free (border);
if (minimum_size)
*minimum_size = minimum_width;
@@ -1966,21 +1987,20 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
GtkComboBoxPrivate *priv = combo_box->priv;
gint focus_width, focus_pad;
- gint min_height, nat_height;
+ gint min_height = 0, nat_height = 0;
gint size;
GtkWidget *child;
+ GtkBorder border;
gtk_widget_style_get (GTK_WIDGET (widget),
"focus-line-width", &focus_width,
"focus-padding", &focus_pad,
NULL);
- size = avail_size;
-
child = gtk_bin_get_child (GTK_BIN (widget));
- if (GTK_SHADOW_NONE != priv->shadow_type)
- size -= get_widget_border_thickness (widget);
+ get_widget_border (widget, &border);
+ size = avail_size - border.left;
if (!priv->tree_view)
{
@@ -1989,10 +2009,11 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
{
/* calculate x/y padding and separator/arrow size */
gint sep_width, arrow_width, sep_height, arrow_height;
- gint border_width, xthickness, ythickness, xpad, ypad;
+ gint border_width, xpad, ypad;
+ GtkBorder button_border;
border_width = gtk_container_get_border_width (GTK_CONTAINER (combo_box));
- xthickness = ythickness = get_widget_border_thickness (priv->button);
+ get_widget_border (priv->button, &button_border);
gtk_widget_get_preferred_width (priv->separator, &sep_width, NULL);
gtk_widget_get_preferred_width (priv->arrow, &arrow_width, NULL);
@@ -2001,8 +2022,10 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
gtk_widget_get_preferred_height_for_width (priv->arrow,
arrow_width, &arrow_height, NULL);
- xpad = 2*(border_width + xthickness + focus_width + focus_pad);
- ypad = 2*(border_width + ythickness + focus_width + focus_pad);
+ xpad = 2 * (border_width + focus_width + focus_pad) +
+ button_border.left + button_border.right;
+ ypad = 2 * (border_width + focus_width + focus_pad) +
+ button_border.top + button_border.bottom;
size -= sep_width + arrow_width + xpad;
@@ -2048,14 +2071,14 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
if (priv->cell_view_frame && priv->has_frame)
{
+ GtkBorder frame_border;
gint border_width;
- gint thickness;
border_width = gtk_container_get_border_width (GTK_CONTAINER (priv->cell_view_frame));
- thickness = get_widget_border_thickness (GTK_WIDGET (priv->cell_view_frame));
+ get_widget_border (GTK_WIDGET (priv->cell_view_frame), &frame_border);
- xpad = 2 * (border_width + thickness);
- ypad = 2 * (border_width + thickness);
+ xpad = (2 * border_width) + border.left + frame_border.right;
+ ypad = (2 * border_width) + border.top + frame_border.bottom;
}
size -= but_width;
@@ -2073,14 +2096,8 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
nat_height += ypad;
}
- if (GTK_SHADOW_NONE != priv->shadow_type)
- {
- gint thickness;
-
- thickness = get_widget_border_thickness (widget);
- min_height += 2 * thickness;
- nat_height += 2 * thickness;
- }
+ min_height += border.top + border.bottom;
+ nat_height += border.top + border.bottom;
if (minimum_size)
*minimum_size = min_height;
@@ -2094,32 +2111,18 @@ gtk_combo_box_get_preferred_height_for_width (GtkWidget *widget,
&req, NULL); \
\
if (is_rtl) \
- child.x = allocation->x + shadow_width; \
+ child.x = allocation->x + border.right; \
else \
- child.x = allocation->x + allocation->width - req.width - shadow_width; \
+ child.x = allocation->x + allocation->width - req.width - border.left; \
\
- child.y = allocation->y + shadow_height; \
+ child.y = allocation->y + border.top; \
child.width = req.width; \
- child.height = allocation->height - 2 * shadow_height; \
+ child.height = allocation->height - (border.top + border.bottom); \
child.width = MAX (1, child.width); \
child.height = MAX (1, child.height); \
\
gtk_widget_size_allocate (combo_box->priv->button, &child);
-static gint
-get_widget_border_thickness (GtkWidget *widget)
-{
- GtkStyleContext *context;
- gint thickness;
-
- context = gtk_widget_get_style_context (widget);
-
- gtk_style_context_get (context,
- gtk_widget_get_state_flags (widget),
- "border-width", &thickness,
- NULL);
- return thickness;
-}
static void
gtk_combo_box_size_allocate (GtkWidget *widget,
@@ -2128,47 +2131,40 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
GtkComboBoxPrivate *priv = combo_box->priv;
GtkWidget *child_widget;
- gint shadow_width, shadow_height;
gint focus_width, focus_pad;
GtkAllocation child;
GtkRequisition req;
gboolean is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+ GtkBorder border;
gtk_widget_set_allocation (widget, allocation);
child_widget = gtk_bin_get_child (GTK_BIN (widget));
+ get_widget_border (widget, &border);
gtk_widget_style_get (widget,
"focus-line-width", &focus_width,
"focus-padding", &focus_pad,
NULL);
- if (GTK_SHADOW_NONE != priv->shadow_type)
- shadow_width = shadow_height = get_widget_border_thickness (widget);
- else
- {
- shadow_width = 0;
- shadow_height = 0;
- }
-
if (!priv->tree_view)
{
if (priv->cell_view)
{
- gint xthickness, ythickness;
+ GtkBorder button_border;
gint width;
guint border_width;
/* menu mode */
- allocation->x += shadow_width;
- allocation->y += shadow_height;
- allocation->width -= 2 * shadow_width;
- allocation->height -= 2 * shadow_height;
+ allocation->x += border.left;
+ allocation->y += border.top;
+ allocation->width -= border.left + border.right;
+ allocation->height -= border.top + border.bottom;
gtk_widget_size_allocate (priv->button, allocation);
/* set some things ready */
border_width = gtk_container_get_border_width (GTK_CONTAINER (priv->button));
- xthickness = ythickness = get_widget_border_thickness (priv->button);
+ get_widget_border (priv->button, &button_border);
child.x = allocation->x;
child.y = allocation->y;
@@ -2177,13 +2173,14 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
if (!priv->is_cell_renderer)
{
- child.x += border_width + xthickness + focus_width + focus_pad;
- child.y += border_width + ythickness + focus_width + focus_pad;
- width -= 2 * (child.x - allocation->x);
- child.height -= 2 * (child.y - allocation->y);
+ child.x += border_width + button_border.left + focus_width + focus_pad;
+ child.y += border_width + button_border.top + focus_width + focus_pad;
+ width -= (2 * (border_width + focus_width + focus_pad)) +
+ button_border.left + button_border.right;
+ child.height -= (2 * (border_width + focus_width + focus_pad)) +
+ button_border.top + button_border.bottom;
}
-
/* handle the children */
gtk_widget_get_preferred_size (priv->arrow, &req, NULL);
child.width = req.width;
@@ -2206,14 +2203,14 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
{
child.x += req.width;
child.width = allocation->x + allocation->width
- - (border_width + xthickness + focus_width + focus_pad)
+ - (border_width + button_border.right + focus_width + focus_pad)
- child.x;
}
else
{
child.width = child.x;
child.x = allocation->x
- + border_width + xthickness + focus_width + focus_pad;
+ + border_width + button_border.left + focus_width + focus_pad;
child.width -= child.x;
}
@@ -2251,11 +2248,11 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
GTK_COMBO_BOX_SIZE_ALLOCATE_BUTTON
if (is_rtl)
- child.x = allocation->x + req.width + shadow_width;
+ child.x = allocation->x + req.width + border.right;
else
- child.x = allocation->x + shadow_width;
- child.y = allocation->y + shadow_height;
- child.width = allocation->width - req.width - 2 * shadow_width;
+ child.x = allocation->x + border.left;
+ child.y = allocation->y + border.top;
+ child.width = allocation->width - req.width - (border.left + border.right);
child.width = MAX (1, child.width);
child.height = MAX (1, child.height);
gtk_widget_size_allocate (child_widget, &child);
@@ -2264,11 +2261,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
else
{
/* list mode */
-
- /* Combobox thickness + border-width */
guint border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- int delta_x = shadow_width + border_width;
- int delta_y = shadow_height + border_width;
/* button */
GTK_COMBO_BOX_SIZE_ALLOCATE_BUTTON
@@ -2285,30 +2278,32 @@ gtk_combo_box_size_allocate (GtkWidget *widget,
if (priv->cell_view_frame)
{
- child.x += delta_x;
- child.y += delta_y;
- child.width = MAX (1, child.width - delta_x * 2);
- child.height = MAX (1, child.height - delta_y * 2);
+ child.x += border.left + border_width;
+ child.y += border.top + border_width;
+ child.width = MAX (1, child.width - (2 * border_width) - (border.left + border.right));
+ child.height = MAX (1, child.height - (2 * border_width) - (border.top + border.bottom));
gtk_widget_size_allocate (priv->cell_view_frame, &child);
/* the sample */
if (priv->has_frame)
{
+ GtkBorder frame_border;
+
border_width = gtk_container_get_border_width (GTK_CONTAINER (priv->cell_view_frame));
- delta_x = delta_y = border_width + get_widget_border_thickness (priv->cell_view_frame);
+ get_widget_border (priv->cell_view_frame, &frame_border);
- child.x += delta_x;
- child.y += delta_y;
- child.width -= delta_x * 2;
- child.height -= delta_y * 2;
+ child.x += border_width + frame_border.left;
+ child.y += border_width + frame_border.right;
+ child.width -= (2 * border_width) + frame_border.left + frame_border.right;
+ child.height -= (2 * border_width) + frame_border.top + frame_border.bottom;
}
}
else
{
- child.x += delta_x;
- child.y += delta_y;
- child.width -= delta_x * 2;
- child.height -= delta_y * 2;
+ child.x += border.left + border_width;
+ child.y += border.top + border_width;
+ child.width -= (2 * border_width) - (border.left + border.right);
+ child.height -= (2 * border_width) - (border.top + border.bottom);
}
if (gtk_widget_get_visible (priv->popup_window))
@@ -2408,7 +2403,7 @@ gtk_combo_box_remove (GtkContainer *container,
GtkWidget *child_widget;
child_widget = gtk_bin_get_child (GTK_BIN (container));
- if (widget && widget == child_widget)
+ if (widget && widget == child_widget && GTK_IS_ENTRY (widget))
{
g_signal_handlers_disconnect_by_func (widget,
gtk_combo_box_entry_contents_changed,
@@ -2826,6 +2821,7 @@ gtk_combo_box_menu_position_below (GtkMenu *menu,
GdkScreen *screen;
gint monitor_num;
GdkRectangle monitor;
+ GtkBorder border;
/* FIXME: is using the size request here broken? */
child = gtk_bin_get_child (GTK_BIN (combo_box));
@@ -2843,8 +2839,8 @@ gtk_combo_box_menu_position_below (GtkMenu *menu,
gdk_window_get_root_coords (gtk_widget_get_window (child),
sx, sy, &sx, &sy);
- if (GTK_SHADOW_NONE != combo_box->priv->shadow_type)
- sx -= get_widget_border_thickness (GTK_WIDGET (combo_box));
+ get_widget_border (GTK_WIDGET (combo_box), &border);
+ sx -= border.left;
if (combo_box->priv->popup_fixed_width)
gtk_widget_get_preferred_size (GTK_WIDGET (menu), &req, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]