зеркало из https://github.com/mozilla/gecko-dev.git
Bug 404514 - "Native GTK active button look" [p=twanno@lycos.nl (Teune van Steeg) r+sr=roc a1.9=schrep]
This commit is contained in:
Родитель
de3b1129df
Коммит
3abbda83e9
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче