[gtk+] Make GtkMenu(Shell) use GtkStyleContext
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Make GtkMenu(Shell) use GtkStyleContext
- Date: Wed, 12 Jan 2011 19:59:37 +0000 (UTC)
commit 26db0b7276af9eadec4ce422915fd26cc307949d
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Jan 12 20:35:04 2011 +0100
Make GtkMenu(Shell) use GtkStyleContext
The default CSS has also been modified to theme these sensibly
gtk/gtkcssprovider.c | 34 ++++++++++--------
gtk/gtkmenu.c | 91 ++++++++++++++++++++++++++++++++++++++------------
gtk/gtkmenushell.c | 9 +++--
3 files changed, 93 insertions(+), 41 deletions(-)
---
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c
index 871caac..20206ce 100644
--- a/gtk/gtkcssprovider.c
+++ b/gtk/gtkcssprovider.c
@@ -3727,14 +3727,16 @@ gtk_css_provider_get_default (void)
" background-color: shade (@bg_color, 1.05);\n"
"}\n"
"\n"
- ".check, .radio,\n"
+ ".check, .radio {\n"
+ " border-style: solid;\n"
+ " border-width: 1;\n"
+ "}\n"
+ "\n"
".check:active, .radio:active,\n"
".check:hover, .radio:hover {\n"
" background-color: @base_color;\n"
" border-color: @fg_color;\n"
" color: @text_color;\n"
- " border-style: solid;\n"
- " border-width: 1;\n"
"}\n"
"\n"
".check:selected, .radio:selected {\n"
@@ -3744,11 +3746,8 @@ gtk_css_provider_get_default (void)
"\n"
".menu.check, .menu.radio {\n"
" color: @fg_color;\n"
- "}\n"
- "\n"
- ".menu:hover {\n"
- " background-color: @selected_bg_color;\n"
" border-style: none;\n"
+ " border-width: 0;\n"
"}\n"
"\n"
".popup {\n"
@@ -3783,18 +3782,13 @@ gtk_css_provider_get_default (void)
"}\n"
"\n"
".menu:hover,\n"
- ".menubar:hover {\n"
+ ".menubar:hover,\n"
+ ".menu.check:hover,\n"
+ ".menu.radio:hover {\n"
" background-color: @selected_bg_color;\n"
" color: @selected_fg_color;\n"
"}\n"
"\n"
- ".menu .check,\n"
- ".menu .radio,\n"
- ".menu .check:active,\n"
- ".menu .radio:active {\n"
- " border-style: none;\n"
- "}\n"
- "\n"
"GtkSpinButton.button {\n"
" border-width: 1;\n"
"}\n"
@@ -3886,6 +3880,16 @@ gtk_css_provider_get_default (void)
" background-color: lighter (@bg_color);\n"
" color: @fg_color;\n"
"}\n"
+ "\n"
+ ".menu {\n"
+ " border-width: 1;\n"
+ " padding: 0;\n"
+ "}\n"
+ "\n"
+ ".menu * {\n"
+ " border-width: 0;\n"
+ " padding: 2;\n"
+ "}\n"
"\n";
provider = gtk_css_provider_new ();
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 8127568..c8c6c64 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -2334,17 +2334,18 @@ get_menu_border (GtkWidget *widget,
{
GtkStyleContext *context;
GtkStateFlags state;
- GtkBorder *border_width;
+ GtkBorder padding, border_width;
context = gtk_widget_get_style_context (widget);
state = gtk_widget_get_state_flags (widget);
- gtk_style_context_get (context, state,
- "border-width", &border_width,
- NULL);
+ gtk_style_context_get_padding (context, state, &padding);
+ gtk_style_context_get_border (context, state, &border_width);
- *border = *border_width;
- gtk_border_free (border_width);
+ border->left = border_width.left + padding.left;
+ border->right = border_width.right + padding.right;
+ border->top = border_width.top + padding.top;
+ border->bottom = border_width.bottom + padding.bottom;
}
static void
@@ -2535,6 +2536,9 @@ calculate_line_heights (GtkMenu *menu,
guint **ret_min_heights,
guint **ret_nat_heights)
{
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding;
GtkMenuPrivate *priv;
GtkMenuShell *menu_shell;
GtkWidget *child, *widget;
@@ -2561,8 +2565,12 @@ calculate_line_heights (GtkMenu *menu,
"horizontal-padding", &horizontal_padding,
NULL);
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+
border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
- avail_width -= (border_width + horizontal_padding + gtk_widget_get_style (widget)->xthickness) * 2;
+ avail_width -= (border_width + horizontal_padding) * 2 + padding.left + padding.right;
for (children = menu_shell->priv->children; children; children = children->next)
{
@@ -3127,6 +3135,9 @@ gtk_menu_get_preferred_height_for_width (GtkWidget *widget,
gint *minimum_size,
gint *natural_size)
{
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding, border;
GtkMenu *menu = GTK_MENU (widget);
GtkMenuPrivate *priv = menu->priv;
guint *min_heights, *nat_heights;
@@ -3137,7 +3148,13 @@ gtk_menu_get_preferred_height_for_width (GtkWidget *widget,
gtk_widget_style_get (widget, "vertical-padding", &vertical_padding, NULL);
border_width = gtk_container_get_border_width (GTK_CONTAINER (menu));
- min_height = nat_height = (border_width + vertical_padding + gtk_widget_get_style (widget)->ythickness) * 2;
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+ gtk_style_context_get_border (context, state, &border);
+
+ min_height = nat_height = (border_width + vertical_padding) * 2 +
+ padding.left + padding.right + border.left + border.right;
n_heights =
calculate_line_heights (menu, for_size, &min_heights, &nat_heights);
@@ -3810,6 +3827,9 @@ get_arrows_sensitive_area (GtkMenu *menu,
guint vertical_padding;
gint win_x, win_y;
gint scroll_arrow_height;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding;
window = gtk_widget_get_window (widget);
width = gdk_window_get_width (window);
@@ -3821,8 +3841,11 @@ get_arrows_sensitive_area (GtkMenu *menu,
"arrow-placement", &arrow_placement,
NULL);
- border = gtk_container_get_border_width (GTK_CONTAINER (menu)) +
- gtk_widget_get_style (widget)->ythickness + vertical_padding;
+ border = gtk_container_get_border_width (GTK_CONTAINER (menu)) + vertical_padding;
+
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
gdk_window_get_position (window, &win_x, &win_y);
@@ -3834,15 +3857,15 @@ get_arrows_sensitive_area (GtkMenu *menu,
upper->x = win_x;
upper->y = win_y;
upper->width = width;
- upper->height = scroll_arrow_height + border;
+ upper->height = scroll_arrow_height + border + padding.top;
}
if (lower)
{
lower->x = win_x;
- lower->y = win_y + height - border - scroll_arrow_height;
+ lower->y = win_y + height - border - padding.bottom - scroll_arrow_height;
lower->width = width;
- lower->height = scroll_arrow_height + border;
+ lower->height = scroll_arrow_height + border + padding.bottom;
}
break;
@@ -3852,7 +3875,7 @@ get_arrows_sensitive_area (GtkMenu *menu,
upper->x = win_x;
upper->y = win_y;
upper->width = width / 2;
- upper->height = scroll_arrow_height + border;
+ upper->height = scroll_arrow_height + border + padding.top;
}
if (lower)
@@ -3860,7 +3883,7 @@ get_arrows_sensitive_area (GtkMenu *menu,
lower->x = win_x + width / 2;
lower->y = win_y;
lower->width = width / 2;
- lower->height = scroll_arrow_height + border;
+ lower->height = scroll_arrow_height + border + padding.bottom;
}
break;
@@ -3870,7 +3893,7 @@ get_arrows_sensitive_area (GtkMenu *menu,
upper->x = win_x;
upper->y = win_y + height - border - scroll_arrow_height;
upper->width = width / 2;
- upper->height = scroll_arrow_height + border;
+ upper->height = scroll_arrow_height + border + padding.top;
}
if (lower)
@@ -3878,7 +3901,7 @@ get_arrows_sensitive_area (GtkMenu *menu,
lower->x = win_x + width / 2;
lower->y = win_y + height - border - scroll_arrow_height;
lower->width = width / 2;
- lower->height = scroll_arrow_height + border;
+ lower->height = scroll_arrow_height + border + padding.bottom;
}
break;
}
@@ -4977,6 +5000,9 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell,
{
guint vertical_padding;
gboolean double_arrows;
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding;
y = priv->scroll_offset;
width = gdk_window_get_width (gtk_widget_get_window (widget));
@@ -4988,8 +5014,12 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell,
double_arrows = get_double_arrows (menu);
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+
height -= 2 * gtk_container_get_border_width (GTK_CONTAINER (menu)) +
- 2 * gtk_widget_get_style (widget)->ythickness +
+ padding.top + padding.bottom +
2 * vertical_padding;
if (child_offset < y)
{
@@ -5366,12 +5396,20 @@ get_visible_size (GtkMenu *menu)
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (menu);
GtkContainer *container = GTK_CONTAINER (menu);
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding;
gint menu_height;
gtk_widget_get_allocation (widget, &allocation);
- menu_height = (allocation.height
- - 2 * (gtk_container_get_border_width (container)
- + gtk_widget_get_style (widget)->ythickness));
+
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+
+ menu_height = (allocation.height -
+ (2 * gtk_container_get_border_width (container)) -
+ padding.top - padding.bottom);
if (!priv->tearoff_active)
{
@@ -5437,12 +5475,21 @@ get_menu_height (GtkMenu *menu)
GtkMenuPrivate *priv = menu->priv;
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (menu);
+ GtkStyleContext *context;
+ GtkStateFlags state;
+ GtkBorder padding, border;
gint height;
gtk_widget_get_allocation (widget, &allocation);
+ context = gtk_widget_get_style_context (widget);
+ state = gtk_widget_get_state_flags (widget);
+ gtk_style_context_get_padding (context, state, &padding);
+ gtk_style_context_get_border (context, state, &border);
+
height = allocation.height;
- height -= (gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->ythickness) * 2;
+ height -= (gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2) +
+ padding.top + padding.bottom + border.top + border.bottom;
if (!priv->tearoff_active)
{
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index eef635d..1bbbc17 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -504,6 +504,7 @@ gtk_menu_shell_realize (GtkWidget *widget)
GdkWindow *window;
GdkWindowAttr attributes;
gint attributes_mask;
+ GtkStyleContext *context;
gtk_widget_set_realized (widget, TRUE);
@@ -531,8 +532,8 @@ gtk_menu_shell_realize (GtkWidget *widget)
gtk_widget_set_window (widget, window);
gdk_window_set_user_data (window, widget);
- gtk_widget_style_attach (widget);
- gtk_style_set_background (gtk_widget_get_style (widget), window, GTK_STATE_NORMAL);
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_set_background (context, window);
}
void
@@ -945,7 +946,7 @@ gtk_menu_shell_enter_notify (GtkWidget *widget,
if (event->detail != GDK_NOTIFY_INFERIOR)
{
- if (gtk_widget_get_state (menu_item) != GTK_STATE_PRELIGHT)
+ if ((gtk_widget_get_state_flags (menu_item) & GTK_STATE_FLAG_PRELIGHT) == 0)
gtk_menu_shell_select_item (menu_shell, menu_item);
/* If any mouse button is down, and there is a submenu
@@ -1015,7 +1016,7 @@ gtk_menu_shell_leave_notify (GtkWidget *widget,
(menu_item->priv->submenu == NULL))
{
if ((event->detail != GDK_NOTIFY_INFERIOR) &&
- (gtk_widget_get_state (GTK_WIDGET (menu_item)) != GTK_STATE_NORMAL))
+ (gtk_widget_get_state_flags (GTK_WIDGET (menu_item)) & GTK_STATE_FLAG_PRELIGHT) != 0)
{
gtk_menu_shell_deselect (menu_shell);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]