From 49e8f75985ff6b91b2a0e53f3ddb97bf02dea67e Mon Sep 17 00:00:00 2001 From: "ginn.chen%sun.com" Date: Fri, 18 Feb 2005 06:03:08 +0000 Subject: [PATCH] Bug 174740 Black checkboxes in menus (e.g. View->Toolbars->Navigation Bar) r=robin.lu sr=bryner git-svn-id: svn://10.0.0.236/trunk@169351 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/gfx/public/nsThemeConstants.h | 2 + mozilla/gfx/src/gtk/gtk2drawing.c | 74 +++++++++++++++++++ mozilla/gfx/src/gtk/gtkdrawing.h | 2 + mozilla/gfx/src/gtk/nsNativeThemeGTK.cpp | 27 ++++++- mozilla/layout/style/nsCSSKeywordList.h | 2 + mozilla/layout/style/nsCSSProps.cpp | 2 + mozilla/themes/classic/global/win/menu.css | 12 +++ .../themes/gnomestripe/global/menu.css | 30 +------- 8 files changed, 124 insertions(+), 27 deletions(-) diff --git a/mozilla/gfx/public/nsThemeConstants.h b/mozilla/gfx/public/nsThemeConstants.h index 0a3ac5fc5a4..adc1333ee83 100644 --- a/mozilla/gfx/public/nsThemeConstants.h +++ b/mozilla/gfx/public/nsThemeConstants.h @@ -203,3 +203,5 @@ #define NS_THEME_MENUPOPUP 211 // and appearances #define NS_THEME_MENUITEM 212 +#define NS_THEME_CHECKMENUITEM 213 +#define NS_THEME_RADIOMENUITEM 214 diff --git a/mozilla/gfx/src/gtk/gtk2drawing.c b/mozilla/gfx/src/gtk/gtk2drawing.c index 9b32a53f330..49bbdc03c75 100644 --- a/mozilla/gfx/src/gtk/gtk2drawing.c +++ b/mozilla/gfx/src/gtk/gtk2drawing.c @@ -73,6 +73,7 @@ static GtkWidget* gMenuBarWidget; static GtkWidget* gMenuBarItemWidget; static GtkWidget* gMenuPopupWidget; static GtkWidget* gMenuItemWidget; +static GtkWidget* gCheckMenuItemWidget; static GtkShadowType gMenuBarShadowType; static GtkShadowType gToolbarShadowType; @@ -304,6 +305,19 @@ ensure_menu_item_widget() return MOZ_GTK_SUCCESS; } +static gint +ensure_check_menu_item_widget() +{ + if (!gCheckMenuItemWidget) { + ensure_menu_popup_widget(); + gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); + gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), + gCheckMenuItemWidget); + gtk_widget_realize(gCheckMenuItemWidget); + } + return MOZ_GTK_SUCCESS; +} + static GtkStateType ConvertGtkState(GtkWidgetState* state) { @@ -1284,6 +1298,55 @@ moz_gtk_menu_item_paint(GdkDrawable* drawable, GdkRectangle* rect, return MOZ_GTK_SUCCESS; } +static gint +moz_gtk_check_menu_item_paint(GdkDrawable* drawable, GdkRectangle* rect, + GdkRectangle* cliprect, GtkWidgetState* state, + gboolean checked, gboolean isradio) +{ + GtkStateType state_type; + GtkStyle* style; + GtkShadowType shadow_type = (checked)?GTK_SHADOW_IN:GTK_SHADOW_OUT; + gint offset; + gint indicator_size = 8; /* it's a fixed value in gtk 2.2 */ + gint x, y; + + moz_gtk_menu_item_paint(drawable, rect, cliprect, state); + + ensure_check_menu_item_widget(); + + if (checked || GTK_CHECK_MENU_ITEM(gCheckMenuItemWidget)->always_show_toggle) { + style = gCheckMenuItemWidget->style; + + if (state->inHover && !state->disabled) { + state_type = GTK_STATE_PRELIGHT; + } else { + state_type = GTK_STATE_NORMAL; + } + + offset = GTK_CONTAINER(gCheckMenuItemWidget)->border_width + + gCheckMenuItemWidget->style->xthickness + 2; + + x = rect->x + offset; + y = rect->y + (rect->height - indicator_size) / 2; + + TSOffsetStyleGCs(style, x, y); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gCheckMenuItemWidget), + checked); + + if (isradio) { + gtk_paint_option(style, drawable, state_type, shadow_type, cliprect, + gCheckMenuItemWidget, "option", + x, y, indicator_size, indicator_size); + } else { + gtk_paint_check(style, drawable, state_type, shadow_type, cliprect, + gCheckMenuItemWidget, "check", + x, y, indicator_size, indicator_size); + } + } + + return MOZ_GTK_SUCCESS; +} + static gint moz_gtk_window_paint(GdkDrawable* drawable, GdkRectangle* rect, GdkRectangle* cliprect) @@ -1420,6 +1483,11 @@ moz_gtk_get_widget_border(GtkThemeWidgetType widget, gint* xthickness, ensure_menu_item_widget(); w = gMenuItemWidget; break; + case MOZ_GTK_CHECKMENUITEM: + case MOZ_GTK_RADIOMENUITEM: + ensure_check_menu_item_widget(); + w = gCheckMenuItemWidget; + break; /* These widgets have no borders, since they are not containers. */ case MOZ_GTK_CHECKBUTTON: case MOZ_GTK_RADIOBUTTON: @@ -1568,6 +1636,12 @@ moz_gtk_widget_paint(GtkThemeWidgetType widget, GdkDrawable* drawable, case MOZ_GTK_MENUITEM: return moz_gtk_menu_item_paint(drawable, rect, cliprect, state); break; + case MOZ_GTK_CHECKMENUITEM: + case MOZ_GTK_RADIOMENUITEM: + return moz_gtk_check_menu_item_paint(drawable, rect, cliprect, state, + (gboolean) flags, + (widget == MOZ_GTK_RADIOMENUITEM)); + break; case MOZ_GTK_WINDOW: return moz_gtk_window_paint(drawable, rect, cliprect); break; diff --git a/mozilla/gfx/src/gtk/gtkdrawing.h b/mozilla/gfx/src/gtk/gtkdrawing.h index e0d0be854e8..f1a7f5fc78d 100644 --- a/mozilla/gfx/src/gtk/gtkdrawing.h +++ b/mozilla/gfx/src/gtk/gtkdrawing.h @@ -148,6 +148,8 @@ typedef enum { MOZ_GTK_MENUPOPUP, /* Paints items of menubar and popups. */ MOZ_GTK_MENUITEM, + MOZ_GTK_CHECKMENUITEM, + MOZ_GTK_RADIOMENUITEM, /* Paints the background of a window, dialog or page. */ MOZ_GTK_WINDOW } GtkThemeWidgetType; diff --git a/mozilla/gfx/src/gtk/nsNativeThemeGTK.cpp b/mozilla/gfx/src/gtk/nsNativeThemeGTK.cpp index 872b23824c7..d1d23c60eec 100644 --- a/mozilla/gfx/src/gtk/nsNativeThemeGTK.cpp +++ b/mozilla/gfx/src/gtk/nsNativeThemeGTK.cpp @@ -241,7 +241,9 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, // menus which are children of a menu bar are only marked as prelight // if they are open, not on normal hover. - if (aWidgetType == NS_THEME_MENUITEM) { + if (aWidgetType == NS_THEME_MENUITEM || + aWidgetType == NS_THEME_CHECKMENUITEM || + aWidgetType == NS_THEME_RADIOMENUITEM) { PRBool isTopLevel = PR_FALSE; nsIMenuFrame *menuFrame; CallQueryInterface(aFrame, &menuFrame); @@ -262,6 +264,21 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, } aState->active = FALSE; + + if (aWidgetType == NS_THEME_CHECKMENUITEM || + aWidgetType == NS_THEME_RADIOMENUITEM) { + if (aFrame) { + nsAutoString attr; + nsresult res = aFrame->GetContent()->GetAttr(kNameSpaceID_None, mCheckedAtom, attr); + if (res == NS_CONTENT_ATTR_NO_VALUE || + (res != NS_CONTENT_ATTR_NOT_THERE && attr.IsEmpty())) + *aWidgetFlags = FALSE; + else + *aWidgetFlags = attr.EqualsIgnoreCase("true"); + } else { + *aWidgetFlags = FALSE; + } + } } } } @@ -374,6 +391,12 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, case NS_THEME_MENUITEM: aGtkWidgetType = MOZ_GTK_MENUITEM; break; + case NS_THEME_CHECKMENUITEM: + aGtkWidgetType = MOZ_GTK_CHECKMENUITEM; + break; + case NS_THEME_RADIOMENUITEM: + aGtkWidgetType = MOZ_GTK_RADIOMENUITEM; + break; case NS_THEME_WINDOW: case NS_THEME_DIALOG: aGtkWidgetType = MOZ_GTK_WINDOW; @@ -742,6 +765,8 @@ nsNativeThemeGTK::ThemeSupportsWidget(nsPresContext* aPresContext, case NS_THEME_MENUBAR: case NS_THEME_MENUPOPUP: case NS_THEME_MENUITEM: + case NS_THEME_CHECKMENUITEM: + case NS_THEME_RADIOMENUITEM: case NS_THEME_WINDOW: case NS_THEME_DIALOG: case NS_THEME_DROPDOWN: diff --git a/mozilla/layout/style/nsCSSKeywordList.h b/mozilla/layout/style/nsCSSKeywordList.h index 806494c0862..eb19635a5b7 100644 --- a/mozilla/layout/style/nsCSSKeywordList.h +++ b/mozilla/layout/style/nsCSSKeywordList.h @@ -507,6 +507,8 @@ CSS_KEY(caret, caret) CSS_KEY(menubar, menubar) CSS_KEY(menupopup, menupopup) CSS_KEY(menuitem, menuitem) +CSS_KEY(checkmenuitem, checkmenuitem) +CSS_KEY(radiomenuitem, radiomenuitem) CSS_KEY(menulist, menulist) CSS_KEY(menulist-button, menulistbutton) CSS_KEY(menulist-text, menulisttext) diff --git a/mozilla/layout/style/nsCSSProps.cpp b/mozilla/layout/style/nsCSSProps.cpp index 2046596232c..1339ee1d68e 100644 --- a/mozilla/layout/style/nsCSSProps.cpp +++ b/mozilla/layout/style/nsCSSProps.cpp @@ -236,6 +236,8 @@ const PRInt32 nsCSSProps::kAppearanceKTable[] = { eCSSKeyword_menubar, NS_THEME_MENUBAR, eCSSKeyword_menupopup, NS_THEME_MENUPOPUP, eCSSKeyword_menuitem, NS_THEME_MENUITEM, + eCSSKeyword_checkmenuitem, NS_THEME_CHECKMENUITEM, + eCSSKeyword_radiomenuitem, NS_THEME_RADIOMENUITEM, eCSSKeyword_UNKNOWN,-1 }; diff --git a/mozilla/themes/classic/global/win/menu.css b/mozilla/themes/classic/global/win/menu.css index c77f7c75021..2b865fabc8c 100644 --- a/mozilla/themes/classic/global/win/menu.css +++ b/mozilla/themes/classic/global/win/menu.css @@ -221,6 +221,11 @@ menulist > menupopup > menuitem[_moz-menuactive="true"] { /* ::::: checkbox menuitem ::::: */ +#ifdef MOZ_WIDGET_GTK2 +menuitem[type="checkbox"] { + -moz-appearance: checkmenuitem !important; +} +#else menuitem[checked="true"] { list-style-image: url("chrome://global/skin/menu/menu-check.gif"); -moz-image-region: auto; @@ -235,9 +240,15 @@ menuitem[checked="true"][_moz-menuactive="true"] { list-style-image: url("chrome://global/skin/menu/menu-check-hover.gif"); -moz-image-region: auto; } +#endif /* ::::: radio menuitem ::::: */ +#ifdef MOZ_WIDGET_GTK2 +menuitem[type="radio"] { + -moz-appearance: radiomenuitem !important; +} +#else menuitem[checked="true"][type="radio"] { list-style-image: url("chrome://global/skin/menu/menu-radio.gif"); -moz-image-region: auto; @@ -252,6 +263,7 @@ menuitem[checked="true"][type="radio"][_moz-menuactive="true"] { list-style-image: url("chrome://global/skin/menu/menu-radio-hover.gif"); -moz-image-region: auto; } +#endif /* ::::: menuseparator ::::: */ diff --git a/mozilla/toolkit/themes/gnomestripe/global/menu.css b/mozilla/toolkit/themes/gnomestripe/global/menu.css index b43e2120bb6..b70071cd11b 100644 --- a/mozilla/toolkit/themes/gnomestripe/global/menu.css +++ b/mozilla/toolkit/themes/gnomestripe/global/menu.css @@ -155,36 +155,14 @@ menulist > menupopup > menu > .menu-iconic-left { /* ::::: checkbox menuitem ::::: */ -menuitem[checked="true"] { - list-style-image: url("chrome://global/skin/menu/menu-check.gif"); - -moz-image-region: auto; -} - -menuitem[checked="true"][disabled="true"] { - list-style-image: url("chrome://global/skin/menu/menu-check-disabled.gif"); - -moz-image-region: auto; -} - -menuitem[checked="true"][_moz-menuactive="true"] { - list-style-image: url("chrome://global/skin/menu/menu-check-hover.gif"); - -moz-image-region: auto; +menuitem[type="checkbox"] { + -moz-appearance: checkmenuitem !important; } /* ::::: radio menuitem ::::: */ -menuitem[checked="true"][type="radio"] { - list-style-image: url("chrome://global/skin/menu/menu-radio.gif"); - -moz-image-region: auto; -} - -menuitem[checked="true"][type="radio"][disabled="true"] { - list-style-image: url("chrome://global/skin/menu/menu-radio-disabled.gif"); - -moz-image-region: auto; -} - -menuitem[checked="true"][type="radio"][_moz-menuactive="true"] { - list-style-image: url("chrome://global/skin/menu/menu-radio-hover.gif"); - -moz-image-region: auto; +menuitem[type="radio"] { + -moz-appearance: radiomenuitem !important; } /* ::::: menuseparator ::::: */