Bug 174740 Black checkboxes in menus (e.g. View->Toolbars->Navigation Bar)

r=robin.lu sr=bryner
This commit is contained in:
ginn.chen%sun.com 2005-02-18 06:03:08 +00:00
parent e1a59dde23
commit 22ff8dbb7d
8 changed files with 124 additions and 27 deletions

View File

@ -203,3 +203,5 @@
#define NS_THEME_MENUPOPUP 211
// <menu> and <menuitem> appearances
#define NS_THEME_MENUITEM 212
#define NS_THEME_CHECKMENUITEM 213
#define NS_THEME_RADIOMENUITEM 214

View File

@ -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;

View File

@ -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;

View File

@ -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:

View File

@ -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)

View File

@ -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
};

View File

@ -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 ::::: */

View File

@ -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 ::::: */