bug 1272194 replace MOZ_TOPLEVEL_MENU_ITEM flag with MOZ_GTK_MENUBARITEM node r=stransky draft
authorKarl Tomlinson <karlt+@karlt.net>
Thu, 19 May 2016 16:55:04 +1200
changeset 368605 55d153f6b38b69f575554b841da860124bf7863d
parent 367662 8f4f55c8f8a44df70d4329d5c50e625d5010491b
child 368606 02aeda4f9cd8ba7c78c16dcd7f62a90c0733d17c
push id18602
push userktomlinson@mozilla.com
push dateThu, 19 May 2016 05:18:04 +0000
reviewersstransky
bugs1272194
milestone49.0a1
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
widget/gtk/gtk2drawing.c
widget/gtk/gtk3drawing.cpp
widget/gtk/gtkdrawing.h
widget/gtk/nsNativeThemeGTK.cpp
--- 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;