Bug 1428676 Part 3 - Rename menulist-button to menulist-button-orig and make behavior of menulist-button like menulist on Linux. r?mats
MozReview-Commit-ID: 41Y0BVQLVlc
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -262,17 +262,18 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
aState->focused = TRUE;
aState->depressed = TRUE; // see moz_gtk_entry_paint()
} else if (aWidgetType == NS_THEME_BUTTON ||
aWidgetType == NS_THEME_TOOLBARBUTTON ||
aWidgetType == NS_THEME_DUALBUTTON ||
aWidgetType == NS_THEME_TOOLBARBUTTON_DROPDOWN ||
aWidgetType == NS_THEME_MENULIST ||
- aWidgetType == NS_THEME_MENULIST_BUTTON) {
+ aWidgetType == NS_THEME_MENULIST_BUTTON ||
+ aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG) {
aState->active &= aState->inHover;
}
if (IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) {
// For these widget types, some element (either a child or parent)
// actually has element focus, so we check the focused attribute
// to see whether to draw in the focused state.
if (aWidgetType == NS_THEME_NUMBER_INPUT ||
@@ -369,26 +370,29 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
// A button with drop down menu open or an activated toggle button
// should always appear depressed.
if (aWidgetType == NS_THEME_BUTTON ||
aWidgetType == NS_THEME_TOOLBARBUTTON ||
aWidgetType == NS_THEME_DUALBUTTON ||
aWidgetType == NS_THEME_TOOLBARBUTTON_DROPDOWN ||
aWidgetType == NS_THEME_MENULIST ||
- aWidgetType == NS_THEME_MENULIST_BUTTON) {
+ aWidgetType == NS_THEME_MENULIST_BUTTON ||
+ aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG) {
bool menuOpen = IsOpenButton(aFrame);
aState->depressed = IsCheckedButton(aFrame) || menuOpen;
// we must not highlight buttons with open drop down menus on hover.
aState->inHover = aState->inHover && !menuOpen;
}
// When the input field of the drop down button has focus, some themes
// should draw focus for the drop down button as well.
- if (aWidgetType == NS_THEME_MENULIST_BUTTON && aWidgetFlags) {
+ if ((aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG && aWidgetFlags) ||
+ (aWidgetType == NS_THEME_MENULIST_BUTTON && aWidgetFlags &&
+ !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled"))) {
*aWidgetFlags = CheckBooleanAttr(aFrame, nsGkAtoms::parentfocused);
}
}
}
switch (aWidgetType) {
case NS_THEME_BUTTON:
if (aWidgetFlags)
@@ -563,24 +567,34 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
case NS_THEME_TREETWISTYOPEN:
aGtkWidgetType = MOZ_GTK_TREEVIEW_EXPANDER;
if (aWidgetFlags)
*aWidgetFlags = GTK_EXPANDER_EXPANDED;
break;
case NS_THEME_MENULIST:
aGtkWidgetType = MOZ_GTK_DROPDOWN;
if (aWidgetFlags)
- *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
+ *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
break;
case NS_THEME_MENULIST_TEXT:
return false; // nothing to do, but prevents the bg from being drawn
case NS_THEME_MENULIST_TEXTFIELD:
aGtkWidgetType = MOZ_GTK_DROPDOWN_ENTRY;
break;
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ aGtkWidgetType = MOZ_GTK_DROPDOWN;
+ if (aWidgetFlags)
+ *aWidgetFlags = IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML);
+ } else {
+ aGtkWidgetType = MOZ_GTK_DROPDOWN_ARROW;
+ }
+ break;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
aGtkWidgetType = MOZ_GTK_DROPDOWN_ARROW;
break;
case NS_THEME_TOOLBARBUTTON_DROPDOWN:
case NS_THEME_BUTTON_ARROW_DOWN:
case NS_THEME_BUTTON_ARROW_UP:
case NS_THEME_BUTTON_ARROW_NEXT:
case NS_THEME_BUTTON_ARROW_PREVIOUS:
aGtkWidgetType = MOZ_GTK_TOOLBARBUTTON_ARROW;
@@ -1381,17 +1395,23 @@ nsNativeThemeGTK::GetWidgetPadding(nsDev
case NS_THEME_TOOLBARBUTTON:
case NS_THEME_WINDOW_BUTTON_CLOSE:
case NS_THEME_WINDOW_BUTTON_MINIMIZE:
case NS_THEME_WINDOW_BUTTON_MAXIMIZE:
case NS_THEME_WINDOW_BUTTON_RESTORE:
case NS_THEME_DUALBUTTON:
case NS_THEME_TAB_SCROLL_ARROW_BACK:
case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ return false;
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
case NS_THEME_TOOLBARBUTTON_DROPDOWN:
case NS_THEME_BUTTON_ARROW_UP:
case NS_THEME_BUTTON_ARROW_DOWN:
case NS_THEME_BUTTON_ARROW_NEXT:
case NS_THEME_BUTTON_ARROW_PREVIOUS:
case NS_THEME_RANGE_THUMB:
// Radios and checkboxes return a fixed size in GetMinimumWidgetSize
// and have a meaningful baseline, so they can't have
@@ -1578,17 +1598,17 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
break;
case NS_THEME_TAB_SCROLL_ARROW_BACK:
case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
{
moz_gtk_get_tab_scroll_arrow_size(&aResult->width, &aResult->height);
*aIsOverridable = false;
}
break;
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON_ORIG:
{
moz_gtk_get_combo_box_entry_button_size(&aResult->width,
&aResult->height);
*aIsOverridable = false;
}
break;
case NS_THEME_MENUSEPARATOR:
{
@@ -1614,16 +1634,25 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
case NS_THEME_BUTTON_ARROW_NEXT:
case NS_THEME_BUTTON_ARROW_PREVIOUS:
{
moz_gtk_get_arrow_size(MOZ_GTK_TOOLBARBUTTON_ARROW,
&aResult->width, &aResult->height);
*aIsOverridable = false;
}
break;
+ case NS_THEME_MENULIST_BUTTON: {
+ if (!mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ moz_gtk_get_combo_box_entry_button_size(&aResult->width,
+ &aResult->height);
+ *aIsOverridable = false;
+ break;
+ }
+ MOZ_FALLTHROUGH;
+ }
case NS_THEME_CHECKBOX_CONTAINER:
case NS_THEME_RADIO_CONTAINER:
case NS_THEME_CHECKBOX_LABEL:
case NS_THEME_RADIO_LABEL:
case NS_THEME_BUTTON:
case NS_THEME_MENULIST:
case NS_THEME_TOOLBARBUTTON:
case NS_THEME_TREEHEADERCELL:
@@ -1907,17 +1936,23 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
case NS_THEME_WINDOW_BUTTON_RESTORE:
case NS_THEME_WINDOW_TITLEBAR:
case NS_THEME_WINDOW_TITLEBAR_MAXIMIZED:
// GtkHeaderBar is available on GTK 3.10+, which is used for styling
// title bars and title buttons.
return gtk_check_version(3, 10, 0) == nullptr &&
!IsWidgetStyled(aPresContext, aFrame, aWidgetType);
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
if (aFrame && aFrame->GetWritingMode().IsVertical()) {
return false;
}
// "Native" dropdown buttons cause padding and margin problems, but only
// in HTML so allow them in XUL.
return (!aFrame || IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) &&
!IsWidgetStyled(aPresContext, aFrame, aWidgetType);
@@ -1927,38 +1962,43 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
return false;
}
NS_IMETHODIMP_(bool)
nsNativeThemeGTK::WidgetIsContainer(uint8_t aWidgetType)
{
// XXXdwh At some point flesh all of this out.
- if (aWidgetType == NS_THEME_MENULIST_BUTTON ||
+ if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+ !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+ aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG ||
aWidgetType == NS_THEME_RADIO ||
aWidgetType == NS_THEME_RANGE_THUMB ||
aWidgetType == NS_THEME_CHECKBOX ||
aWidgetType == NS_THEME_TAB_SCROLL_ARROW_BACK ||
aWidgetType == NS_THEME_TAB_SCROLL_ARROW_FORWARD ||
aWidgetType == NS_THEME_BUTTON_ARROW_UP ||
aWidgetType == NS_THEME_BUTTON_ARROW_DOWN ||
aWidgetType == NS_THEME_BUTTON_ARROW_NEXT ||
aWidgetType == NS_THEME_BUTTON_ARROW_PREVIOUS)
return false;
return true;
}
bool
nsNativeThemeGTK::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
{
- if (aWidgetType == NS_THEME_MENULIST ||
- aWidgetType == NS_THEME_BUTTON ||
- aWidgetType == NS_THEME_TREEHEADERCELL)
- return true;
-
+ if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+ mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+ aWidgetType == NS_THEME_MENULIST ||
+ aWidgetType == NS_THEME_BUTTON ||
+ aWidgetType == NS_THEME_TREEHEADERCELL) {
+ return true;
+ }
+
return false;
}
bool
nsNativeThemeGTK::ThemeNeedsComboboxDropmarker()
{
return false;
}
--- a/widget/headless/HeadlessThemeGTK.cpp
+++ b/widget/headless/HeadlessThemeGTK.cpp
@@ -82,17 +82,27 @@ HeadlessThemeGTK::GetWidgetBorder(nsDevi
aResult->left = 6;
break;
case NS_THEME_MENULIST:
aResult->top = 6;
aResult->right = 22;
aResult->bottom = 6;
aResult->left = 7;
break;
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ aResult->top = 6;
+ aResult->right = 22;
+ aResult->bottom = 6;
+ aResult->left = 7;
+ break;
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
aResult->top = 1;
aResult->right = 1;
aResult->bottom = 1;
aResult->left = 0;
break;
case NS_THEME_MENULIST_TEXTFIELD:
aResult->top = 1;
aResult->right = 0;
@@ -127,17 +137,23 @@ HeadlessThemeGTK::GetWidgetPadding(nsDev
case NS_THEME_DUALBUTTON:
case NS_THEME_TOOLBARBUTTON_DROPDOWN:
case NS_THEME_BUTTON_ARROW_UP:
case NS_THEME_BUTTON_ARROW_DOWN:
case NS_THEME_BUTTON_ARROW_NEXT:
case NS_THEME_BUTTON_ARROW_PREVIOUS:
case NS_THEME_TAB_SCROLL_ARROW_BACK:
case NS_THEME_TAB_SCROLL_ARROW_FORWARD:
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ return false;
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
case NS_THEME_RANGE_THUMB:
case NS_THEME_BUTTON_FOCUS:
aResult->top = 0;
aResult->right = 0;
aResult->bottom = 0;
aResult->left = 0;
return true;
case NS_THEME_MENUITEM:
@@ -262,17 +278,25 @@ HeadlessThemeGTK::GetMinimumWidgetSize(n
aResult->width = 10;
aResult->height = 31;
*aIsOverridable = false;
break;
case NS_THEME_MENULIST:
aResult->width = 44;
aResult->height = 27;
break;
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ aResult->width = 44;
+ aResult->height = 27;
+ break;
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
aResult->width = 29;
aResult->height = 28;
*aIsOverridable = false;
break;
case NS_THEME_SCALETHUMB_HORIZONTAL:
case NS_THEME_RANGE_THUMB:
aResult->width = 14;
aResult->height = 18;
@@ -397,27 +421,35 @@ HeadlessThemeGTK::ThemeSupportsWidget(ns
case NS_THEME_MENUPOPUP:
case NS_THEME_MENUITEM:
case NS_THEME_CHECKMENUITEM:
case NS_THEME_RADIOMENUITEM:
case NS_THEME_MENUSEPARATOR:
case NS_THEME_MENUARROW:
case NS_THEME_GTK_INFO_BAR:
return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
- case NS_THEME_MENULIST_BUTTON:
+ case NS_THEME_MENULIST_BUTTON: {
+ if (mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) {
+ return !IsWidgetStyled(aPresContext, aFrame, aWidgetType);
+ }
+ MOZ_FALLTHROUGH;
+ }
+ case NS_THEME_MENULIST_BUTTON_ORIG:
return (!aFrame || IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)) &&
!IsWidgetStyled(aPresContext, aFrame, aWidgetType);
}
return false;
}
NS_IMETHODIMP_(bool)
HeadlessThemeGTK::WidgetIsContainer(uint8_t aWidgetType)
{
- if (aWidgetType == NS_THEME_MENULIST_BUTTON ||
+ if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+ !mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+ aWidgetType == NS_THEME_MENULIST_BUTTON_ORIG ||
aWidgetType == NS_THEME_RADIO ||
aWidgetType == NS_THEME_RANGE_THUMB ||
aWidgetType == NS_THEME_CHECKBOX ||
aWidgetType == NS_THEME_TAB_SCROLL_ARROW_BACK ||
aWidgetType == NS_THEME_TAB_SCROLL_ARROW_FORWARD ||
aWidgetType == NS_THEME_BUTTON_ARROW_UP ||
aWidgetType == NS_THEME_BUTTON_ARROW_DOWN ||
aWidgetType == NS_THEME_BUTTON_ARROW_NEXT ||
@@ -426,17 +458,19 @@ HeadlessThemeGTK::WidgetIsContainer(uint
return false;
}
return true;
}
bool
HeadlessThemeGTK::ThemeDrawsFocusForWidget(uint8_t aWidgetType)
{
- if (aWidgetType == NS_THEME_MENULIST ||
+ if ((aWidgetType == NS_THEME_MENULIST_BUTTON &&
+ mozilla::Preferences::GetBool("layout.css.webkit-appearance.enabled")) ||
+ aWidgetType == NS_THEME_MENULIST ||
aWidgetType == NS_THEME_BUTTON ||
aWidgetType == NS_THEME_TREEHEADERCELL) {
return true;
}
return false;
}
bool