diff --git a/mozilla/toolkit/themes/gnomestripe/global/toolbarbutton.css b/mozilla/toolkit/themes/gnomestripe/global/toolbarbutton.css index 36c554b1f7c..9cdb930f313 100644 --- a/mozilla/toolkit/themes/gnomestripe/global/toolbarbutton.css +++ b/mozilla/toolkit/themes/gnomestripe/global/toolbarbutton.css @@ -105,7 +105,6 @@ toolbarbutton[disabled="true"][open="true"] { /* ..... checked state ..... */ toolbarbutton[checked="true"] { - -moz-appearance: none; border-color: ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow !important; padding-top: 4px !important; padding-bottom: 2px !important; diff --git a/mozilla/widget/src/gtk2/gtk2drawing.c b/mozilla/widget/src/gtk2/gtk2drawing.c index ae89be5dc4f..5d4fd8782a8 100644 --- a/mozilla/widget/src/gtk2/gtk2drawing.c +++ b/mozilla/widget/src/gtk2/gtk2drawing.c @@ -56,6 +56,7 @@ static GtkWidget* gProtoWindow; static GtkWidget* gButtonWidget; +static GtkWidget* gToggleButtonWidget; static GtkWidget* gCheckboxWidget; static GtkWidget* gRadiobuttonWidget; static GtkWidget* gHorizScrollbarWidget; @@ -134,6 +135,18 @@ ensure_button_widget() return MOZ_GTK_SUCCESS; } +static gint +ensure_toggle_button_widget() +{ + if (!gToggleButtonWidget) { + gToggleButtonWidget = gtk_toggle_button_new(); + setup_widget_prototype(gToggleButtonWidget); + /* toggle button must be set active to get the right style on hover. */ + GTK_TOGGLE_BUTTON(gToggleButtonWidget)->active = TRUE; + } + return MOZ_GTK_SUCCESS; +} + static gint ensure_checkbox_widget() { @@ -418,6 +431,8 @@ ConvertGtkState(GtkWidgetState* state) { if (state->disabled) return GTK_STATE_INSENSITIVE; + else if (state->depressed) + return (state->inHover ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE); else if (state->inHover) return (state->active ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT); else @@ -482,10 +497,12 @@ moz_gtk_button_paint(GdkDrawable* drawable, GdkRectangle* rect, height -= 2 * (focus_width + focus_pad); } - shadow_type = button_state == GTK_STATE_ACTIVE ? GTK_SHADOW_IN : GTK_SHADOW_OUT; + shadow_type = button_state == GTK_STATE_ACTIVE || + state->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT; - if (relief != GTK_RELIEF_NONE || (button_state != GTK_STATE_NORMAL && - button_state != GTK_STATE_INSENSITIVE)) { + if (relief != GTK_RELIEF_NONE || state->depressed || + (button_state != GTK_STATE_NORMAL && + button_state != GTK_STATE_INSENSITIVE)) { TSOffsetStyleGCs(style, x, y); /* the following line can trigger an assertion (Crux theme) file ../../gdk/gdkwindow.c: line 1846 (gdk_window_clear_area): @@ -2074,6 +2091,12 @@ moz_gtk_widget_paint(GtkThemeWidgetType widget, GdkDrawable* drawable, { switch (widget) { case MOZ_GTK_BUTTON: + if (state->depressed) { + ensure_toggle_button_widget(); + return moz_gtk_button_paint(drawable, rect, cliprect, state, + (GtkReliefStyle) flags, + gToggleButtonWidget); + } ensure_button_widget(); return moz_gtk_button_paint(drawable, rect, cliprect, state, (GtkReliefStyle) flags, gButtonWidget); @@ -2219,6 +2242,7 @@ moz_gtk_shutdown() gProtoWindow = NULL; gButtonWidget = NULL; + gToggleButtonWidget = NULL; gCheckboxWidget = NULL; gRadiobuttonWidget = NULL; gHorizScrollbarWidget = NULL; diff --git a/mozilla/widget/src/gtk2/gtkdrawing.h b/mozilla/widget/src/gtk2/gtkdrawing.h index 717a089bbd7..b21612740fa 100644 --- a/mozilla/widget/src/gtk2/gtkdrawing.h +++ b/mozilla/widget/src/gtk2/gtkdrawing.h @@ -63,6 +63,9 @@ typedef struct { guint8 disabled; guint8 isDefault; guint8 canDefault; + /* The depressed state is for buttons which remain active for a longer period: + * activated toggle buttons or buttons showing a popup menu. */ + guint8 depressed; gint32 curpos; /* curpos and maxpos are used for scrollbars */ gint32 maxpos; } GtkWidgetState; diff --git a/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp b/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp index 0380107cb22..376fde5b5f0 100644 --- a/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp +++ b/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp @@ -227,6 +227,7 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, aState->inHover = (eventState & NS_EVENT_STATE_HOVER) == NS_EVENT_STATE_HOVER; aState->isDefault = IsDefaultButton(aFrame); aState->canDefault = FALSE; // XXX fix me + aState->depressed = FALSE; if (aFrame && aFrame->GetContent()->IsNodeOfType(nsINode::eXUL)) { // For these widget types, some element (either a child or parent) @@ -297,6 +298,17 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, nsWidgetAtoms::_true, eIgnoreCase); } } + + // A button with drop down menu open or an activated toggle button + // should always appear depressed. + if (aWidgetType == NS_THEME_BUTTON || + aWidgetType == NS_THEME_TOOLBAR_BUTTON || + aWidgetType == NS_THEME_TOOLBAR_DUAL_BUTTON) { + PRBool menuOpen = CheckBooleanAttr(aFrame, nsWidgetAtoms::open); + aState->depressed = IsCheckedButton(aFrame) || menuOpen; + // we must not highlight buttons with open drop down menus on hover. + aState->inHover = aState->inHover && !menuOpen; + } } } }