bug 1272194 replace MOZ_TOPLEVEL_MENU_ITEM flag with MOZ_GTK_MENUBARITEM node r=stransky
This provides a better mapping between WidgetNodeType and GtkWidgets.
MozReview-Commit-ID: 3YYzK4aZCbP
--- a/widget/gtk/gtk2drawing.c
+++ b/widget/gtk/gtk2drawing.c
@@ -2609,26 +2609,26 @@ moz_gtk_menu_separator_paint(GdkDrawable
rect->x + rect->width - horizontal_padding - style->xthickness - 1,
rect->y + (rect->height - style->ythickness) / 2);
}
return MOZ_GTK_SUCCESS;
}
static gint
-moz_gtk_menu_item_paint(GdkDrawable* drawable, GdkRectangle* rect,
- GdkRectangle* cliprect, GtkWidgetState* state,
- gint flags, GtkTextDirection direction)
+moz_gtk_menu_item_paint(WidgetNodeType widget, GdkDrawable* drawable,
+ GdkRectangle* rect, GdkRectangle* cliprect,
+ GtkWidgetState* state, GtkTextDirection direction)
{
GtkStyle* style;
GtkShadowType shadow_type;
GtkWidget* item_widget;
if (state->inHover && !state->disabled) {
- if (flags & MOZ_TOPLEVEL_MENU_ITEM) {
+ if (widget == MOZ_GTK_MENUBARITEM) {
ensure_menu_bar_item_widget();
item_widget = gMenuBarItemWidget;
} else {
ensure_menu_item_widget();
item_widget = gMenuItemWidget;
}
gtk_widget_set_direction(item_widget, direction);
@@ -2677,17 +2677,18 @@ moz_gtk_check_menu_item_paint(GdkDrawabl
{
GtkStateType state_type = ConvertGtkState(state);
GtkStyle* style;
GtkShadowType shadow_type = (checked)?GTK_SHADOW_IN:GTK_SHADOW_OUT;
gint offset;
gint indicator_size, horizontal_padding;
gint x, y;
- moz_gtk_menu_item_paint(drawable, rect, cliprect, state, FALSE, direction);
+ moz_gtk_menu_item_paint(MOZ_GTK_MENUITEM, drawable, rect, cliprect, state,
+ direction);
ensure_check_menu_item_widget();
gtk_widget_set_direction(gCheckMenuItemWidget, direction);
gtk_widget_style_get (gCheckMenuItemWidget,
"indicator-size", &indicator_size,
"horizontal-padding", &horizontal_padding,
NULL);
@@ -2952,16 +2953,19 @@ moz_gtk_get_widget_border(WidgetNodeType
}
return MOZ_GTK_SUCCESS;
}
case MOZ_GTK_MENUPOPUP:
ensure_menu_popup_widget();
w = gMenuPopupWidget;
break;
+ case MOZ_GTK_MENUBARITEM:
+ // Bug 1274143 for MOZ_GTK_MENUBARITEM.
+ // Fall through to MOZ_GTK_MENUITEM for now.
case MOZ_GTK_MENUITEM:
ensure_menu_item_widget();
ensure_menu_bar_item_widget();
w = gMenuItemWidget;
break;
case MOZ_GTK_CHECKMENUITEM:
case MOZ_GTK_RADIOMENUITEM:
ensure_check_menu_item_widget();
@@ -3380,18 +3384,19 @@ moz_gtk_widget_paint(WidgetNodeType widg
break;
case MOZ_GTK_MENUPOPUP:
return moz_gtk_menu_popup_paint(drawable, rect, cliprect, direction);
break;
case MOZ_GTK_MENUSEPARATOR:
return moz_gtk_menu_separator_paint(drawable, rect, cliprect,
direction);
break;
+ case MOZ_GTK_MENUBARITEM:
case MOZ_GTK_MENUITEM:
- return moz_gtk_menu_item_paint(drawable, rect, cliprect, state, flags,
+ return moz_gtk_menu_item_paint(widget, drawable, rect, cliprect, state,
direction);
break;
case MOZ_GTK_MENUARROW:
return moz_gtk_menu_arrow_paint(drawable, rect, cliprect, state,
direction);
break;
case MOZ_GTK_TOOLBARBUTTON_ARROW:
return moz_gtk_arrow_paint(drawable, rect, cliprect, state,
--- a/widget/gtk/gtk3drawing.cpp
+++ b/widget/gtk/gtk3drawing.cpp
@@ -2450,53 +2450,52 @@ moz_gtk_menu_separator_paint(cairo_t *cr
gtk_style_context_restore(style);
return MOZ_GTK_SUCCESS;
}
// See gtk_menu_item_draw() for reference.
static gint
-moz_gtk_menu_item_paint(cairo_t *cr, GdkRectangle* rect,
- GtkWidgetState* state,
- gint flags, GtkTextDirection direction)
+moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect,
+ GtkWidgetState* state, GtkTextDirection direction)
{
GtkStyleContext* style;
GtkWidget* item_widget;
guint border_width;
gint x, y, w, h;
if (state->inHover && !state->disabled) {
- if (flags & MOZ_TOPLEVEL_MENU_ITEM) {
+ if (widget == MOZ_GTK_MENUBARITEM) {
ensure_menu_bar_item_widget();
item_widget = gMenuBarItemWidget;
} else {
ensure_menu_item_widget();
item_widget = gMenuItemWidget;
}
style = gtk_widget_get_style_context(item_widget);
- if (flags & MOZ_TOPLEVEL_MENU_ITEM) {
+ if (widget == MOZ_GTK_MENUBARITEM) {
gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR);
}
gtk_widget_set_direction(item_widget, direction);
gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state));
border_width = gtk_container_get_border_width(GTK_CONTAINER(item_widget));
x = rect->x + border_width;
y = rect->y + border_width;
w = rect->width - border_width * 2;
h = rect->height - border_width * 2;
gtk_render_background(style, cr, x, y, w, h);
gtk_render_frame(style, cr, x, y, w, h);
- if (flags & MOZ_TOPLEVEL_MENU_ITEM) {
+ if (widget == MOZ_GTK_MENUBARITEM) {
gtk_style_context_remove_class(style, GTK_STYLE_CLASS_MENUBAR);
}
gtk_style_context_set_state(style, GTK_STATE_FLAG_NORMAL);
}
return MOZ_GTK_SUCCESS;
}
@@ -2532,17 +2531,17 @@ moz_gtk_check_menu_item_paint(cairo_t *c
{
GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state);
GtkStyleContext* style;
GtkBorder padding;
gint offset;
gint indicator_size, horizontal_padding;
gint x, y;
- moz_gtk_menu_item_paint(cr, rect, state, FALSE, direction);
+ moz_gtk_menu_item_paint(MOZ_GTK_MENUITEM, cr, rect, state, direction);
ensure_check_menu_item_widget();
gtk_widget_set_direction(gCheckMenuItemWidget, direction);
style = gtk_widget_get_style_context(gCheckMenuItemWidget);
gtk_style_context_save(style);
gtk_style_context_get_style(style,
@@ -2803,26 +2802,25 @@ moz_gtk_get_widget_border(WidgetNodeType
moz_gtk_add_style_padding(style,
left, top, right, bottom);
return MOZ_GTK_SUCCESS;
}
case MOZ_GTK_MENUPOPUP:
ensure_menu_popup_widget();
w = gMenuPopupWidget;
break;
+ case MOZ_GTK_MENUBARITEM:
case MOZ_GTK_MENUITEM:
case MOZ_GTK_CHECKMENUITEM:
case MOZ_GTK_RADIOMENUITEM:
{
- if (widget == MOZ_GTK_MENUITEM) {
+ if (widget == MOZ_GTK_MENUBARITEM || widget == MOZ_GTK_MENUITEM) {
ensure_menu_item_widget();
- ensure_menu_bar_item_widget();
- w = gMenuItemWidget;
- }
- else {
+ w = gMenuItemWidget; // Bug 1274143 for MOZ_GTK_MENUBARITEM
+ } else {
ensure_check_menu_item_widget();
w = gCheckMenuItemWidget;
}
*left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
moz_gtk_add_style_padding(gtk_widget_get_style_context(w),
left, top, right, bottom);
return MOZ_GTK_SUCCESS;
@@ -3313,19 +3311,19 @@ moz_gtk_widget_paint(WidgetNodeType widg
break;
case MOZ_GTK_MENUPOPUP:
return moz_gtk_menu_popup_paint(cr, rect, direction);
break;
case MOZ_GTK_MENUSEPARATOR:
return moz_gtk_menu_separator_paint(cr, rect,
direction);
break;
+ case MOZ_GTK_MENUBARITEM:
case MOZ_GTK_MENUITEM:
- return moz_gtk_menu_item_paint(cr, rect, state, flags,
- direction);
+ return moz_gtk_menu_item_paint(widget, cr, rect, state, direction);
break;
case MOZ_GTK_MENUARROW:
return moz_gtk_menu_arrow_paint(cr, rect, state,
direction);
break;
case MOZ_GTK_TOOLBARBUTTON_ARROW:
return moz_gtk_arrow_paint(cr, rect, state,
(GtkArrowType) flags, direction);
--- a/widget/gtk/gtkdrawing.h
+++ b/widget/gtk/gtkdrawing.h
@@ -64,22 +64,16 @@ typedef enum {
/* bottom tabs */
MOZ_GTK_TAB_BOTTOM = 1 << 8,
/* the first tab in the group */
MOZ_GTK_TAB_FIRST = 1 << 9,
/* the selected tab */
MOZ_GTK_TAB_SELECTED = 1 << 10
} GtkTabFlags;
-/** flags for menuitems **/
-typedef enum {
- /* menuitem is part of the menubar */
- MOZ_TOPLEVEL_MENU_ITEM = 1 << 0
-} GtkMenuItemFlags;
-
/* function type for moz_gtk_enable_style_props */
typedef gint (*style_prop_t)(GtkStyle*, const gchar*, gint);
/*** result/error codes ***/
#define MOZ_GTK_SUCCESS 0
#define MOZ_GTK_UNKNOWN_WIDGET -1
#define MOZ_GTK_UNSAFE_THEME -2
@@ -184,17 +178,19 @@ typedef enum {
/* Paints the background of the menu bar. */
MOZ_GTK_MENUBAR,
/* Paints the background of menus, context menus. */
MOZ_GTK_MENUPOPUP,
/* Paints the arrow of menuitems that contain submenus */
MOZ_GTK_MENUARROW,
/* Paints an arrow in a toolbar button. flags is a GtkArrowType. */
MOZ_GTK_TOOLBARBUTTON_ARROW,
- /* Paints items of menubar and popups. */
+ /* Paints items of menubar. */
+ MOZ_GTK_MENUBARITEM,
+ /* Paints items of popup menus. */
MOZ_GTK_MENUITEM,
MOZ_GTK_CHECKMENUITEM,
MOZ_GTK_RADIOMENUITEM,
MOZ_GTK_MENUSEPARATOR,
/* Paints a GtkVPaned separator */
MOZ_GTK_SPLITTER_HORIZONTAL,
/* Paints a GtkHPaned separator */
MOZ_GTK_SPLITTER_VERTICAL,
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -349,20 +349,18 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
bool isTopLevel = false;
nsMenuFrame *menuFrame = do_QueryFrame(aFrame);
if (menuFrame) {
isTopLevel = menuFrame->IsOnMenuBar();
}
if (isTopLevel) {
aState->inHover = menuFrame->IsOpen();
- *aWidgetFlags |= MOZ_TOPLEVEL_MENU_ITEM;
} else {
aState->inHover = CheckBooleanAttr(aFrame, nsGkAtoms::menuactive);
- *aWidgetFlags &= ~MOZ_TOPLEVEL_MENU_ITEM;
}
aState->active = FALSE;
if (aWidgetType == NS_THEME_CHECKMENUITEM ||
aWidgetType == NS_THEME_RADIOMENUITEM) {
*aWidgetFlags = 0;
if (aFrame && aFrame->GetContent()) {
@@ -674,16 +672,23 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
break;
case NS_THEME_MENUBAR:
aGtkWidgetType = MOZ_GTK_MENUBAR;
break;
case NS_THEME_MENUPOPUP:
aGtkWidgetType = MOZ_GTK_MENUPOPUP;
break;
case NS_THEME_MENUITEM:
+ {
+ nsMenuFrame *menuFrame = do_QueryFrame(aFrame);
+ if (menuFrame && menuFrame->IsOnMenuBar()) {
+ aGtkWidgetType = MOZ_GTK_MENUBARITEM;
+ break;
+ }
+ }
aGtkWidgetType = MOZ_GTK_MENUITEM;
break;
case NS_THEME_MENUSEPARATOR:
aGtkWidgetType = MOZ_GTK_MENUSEPARATOR;
break;
case NS_THEME_MENUARROW:
aGtkWidgetType = MOZ_GTK_MENUARROW;
break;