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:
reed@reedloden.com 2007-12-03 01:14:18 -08:00
Родитель de3b1129df
Коммит 3abbda83e9
4 изменённых файлов: 42 добавлений и 4 удалений

Просмотреть файл

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