mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
Bug 174740 Black checkboxes in menus (e.g. View->Toolbars->Navigation Bar)
r=robin.lu sr=bryner
This commit is contained in:
parent
e1a59dde23
commit
22ff8dbb7d
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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 ::::: */
|
||||
|
||||
|
@ -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 ::::: */
|
||||
|
Loading…
Reference in New Issue
Block a user