From 611cf0da7d4f3ce95157becfd7ff4556eddfbe59 Mon Sep 17 00:00:00 2001 From: "reed%reedloden.com" Date: Fri, 15 Feb 2008 05:28:44 +0000 Subject: [PATCH] Bug 406474 - "Native GTK look for toolbar arrows" [p=twanno@lycos.nl (Teune van Steeg) r+sr=roc a1.9=beltzner] git-svn-id: svn://10.0.0.236/trunk@245768 18797224-902f-48f8-a5cc-f745e15eee43 --- .../themes/gnomestripe/browser/browser.css | 11 ++++ mozilla/gfx/public/nsThemeConstants.h | 4 ++ mozilla/layout/style/nsCSSKeywordList.h | 2 + mozilla/layout/style/nsCSSProps.cpp | 2 + mozilla/widget/src/gtk2/gtk2drawing.c | 50 +++++++++++++++++++ mozilla/widget/src/gtk2/gtkdrawing.h | 11 ++++ mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp | 26 ++++++++-- 7 files changed, 103 insertions(+), 3 deletions(-) diff --git a/mozilla/browser/themes/gnomestripe/browser/browser.css b/mozilla/browser/themes/gnomestripe/browser/browser.css index d8c0d42879d..aeaf5a91e05 100644 --- a/mozilla/browser/themes/gnomestripe/browser/browser.css +++ b/mozilla/browser/themes/gnomestripe/browser/browser.css @@ -1248,6 +1248,17 @@ tabpanels { margin: -3px !important; } +/* Tabbrowser arrowscrollbox arrows */ +.tabbrowser-arrowscrollbox > .scrollbutton-up { + -moz-appearance: tab-scroll-arrow-back; + margin: 0px; +} + +.tabbrowser-arrowscrollbox > .scrollbutton-down { + -moz-appearance: tab-scroll-arrow-forward; + margin: 0px; +} + /* All tabs menupopup */ .alltabs-item > .menu-iconic-left > .menu-iconic-icon { list-style-image: url("chrome://global/skin/icons/folder-item.png"); diff --git a/mozilla/gfx/public/nsThemeConstants.h b/mozilla/gfx/public/nsThemeConstants.h index f7c4b34ef73..dac54962afe 100644 --- a/mozilla/gfx/public/nsThemeConstants.h +++ b/mozilla/gfx/public/nsThemeConstants.h @@ -114,6 +114,10 @@ // The tab panels container. #define NS_THEME_TAB_PANELS 65 +// The tabs scroll arrows (left/right) +#define NS_THEME_TAB_SCROLLARROW_BACK 66 +#define NS_THEME_TAB_SCROLLARROW_FORWARD 67 + // A tooltip #define NS_THEME_TOOLTIP 71 diff --git a/mozilla/layout/style/nsCSSKeywordList.h b/mozilla/layout/style/nsCSSKeywordList.h index 82b31497819..df9ac9e1e34 100644 --- a/mozilla/layout/style/nsCSSKeywordList.h +++ b/mozilla/layout/style/nsCSSKeywordList.h @@ -505,6 +505,8 @@ CSS_KEY(tab-left-edge, tab_left_edge) CSS_KEY(tab-right-edge, tab_right_edge) CSS_KEY(tabpanels, tabpanels) CSS_KEY(tabpanel, tabpanel) +CSS_KEY(tab-scroll-arrow-back, tabscrollarrow_back) +CSS_KEY(tab-scroll-arrow-forward, tabscrollarrow_forward) CSS_KEY(tooltip, tooltip) CSS_KEY(spinner, spinner) CSS_KEY(spinner-upbutton, spinner_upbutton) diff --git a/mozilla/layout/style/nsCSSProps.cpp b/mozilla/layout/style/nsCSSProps.cpp index 869bca12351..42fdbf96914 100644 --- a/mozilla/layout/style/nsCSSProps.cpp +++ b/mozilla/layout/style/nsCSSProps.cpp @@ -214,6 +214,8 @@ const PRInt32 nsCSSProps::kAppearanceKTable[] = { eCSSKeyword_tab_right_edge, NS_THEME_TAB_RIGHT_EDGE, eCSSKeyword_tabpanels, NS_THEME_TAB_PANELS, eCSSKeyword_tabpanel, NS_THEME_TAB_PANEL, + eCSSKeyword_tabscrollarrow_back, NS_THEME_TAB_SCROLLARROW_BACK, + eCSSKeyword_tabscrollarrow_forward, NS_THEME_TAB_SCROLLARROW_FORWARD, eCSSKeyword_tooltip, NS_THEME_TOOLTIP, eCSSKeyword_spinner, NS_THEME_SPINNER, eCSSKeyword_spinner_upbutton, NS_THEME_SPINNER_UP_BUTTON, diff --git a/mozilla/widget/src/gtk2/gtk2drawing.c b/mozilla/widget/src/gtk2/gtk2drawing.c index a1f88017b3f..07f0cb5e5e5 100644 --- a/mozilla/widget/src/gtk2/gtk2drawing.c +++ b/mozilla/widget/src/gtk2/gtk2drawing.c @@ -2028,6 +2028,36 @@ moz_gtk_tabpanels_paint(GdkDrawable* drawable, GdkRectangle* rect, return MOZ_GTK_SUCCESS; } +static gint +moz_gtk_tab_scroll_arrow_paint(GdkDrawable* drawable, GdkRectangle* rect, + GdkRectangle* cliprect, GtkWidgetState* state, + GtkArrowType arrow_type, + GtkTextDirection direction) +{ + GtkStateType state_type = ConvertGtkState(state); + GtkShadowType shadow_type = state->active ? GTK_SHADOW_IN : GTK_SHADOW_OUT; + GtkStyle* style; + gint arrow_size = MIN(rect->width, rect->height); + gint x = rect->x + (rect->width - arrow_size) / 2; + gint y = rect->y + (rect->height - arrow_size) / 2; + + ensure_tab_widget(); + + style = gTabWidget->style; + TSOffsetStyleGCs(style, rect->x, rect->y); + + if (direction == GTK_TEXT_DIR_RTL) { + arrow_type = (arrow_type == GTK_ARROW_LEFT) ? + GTK_ARROW_RIGHT : GTK_ARROW_LEFT; + } + + gtk_paint_arrow(style, drawable, state_type, shadow_type, NULL, + gTabWidget, "notebook", arrow_type, TRUE, + x, y, arrow_size, arrow_size); + + return MOZ_GTK_SUCCESS; +} + static gint moz_gtk_menu_bar_paint(GdkDrawable* drawable, GdkRectangle* rect, GdkRectangle* cliprect, GtkTextDirection direction) @@ -2482,6 +2512,7 @@ moz_gtk_get_widget_border(GtkThemeWidgetType widget, gint* left, gint* top, case MOZ_GTK_TOOLBARBUTTON_ARROW: case MOZ_GTK_TOOLBAR: case MOZ_GTK_MENUBAR: + case MOZ_GTK_TAB_SCROLLARROW: *left = *top = *right = *bottom = 0; return MOZ_GTK_SUCCESS; default: @@ -2516,6 +2547,21 @@ moz_gtk_get_dropdown_arrow_size(gint* width, gint* height) return MOZ_GTK_SUCCESS; } +gint +moz_gtk_get_tab_scroll_arrow_size(gint* width, gint* height) +{ + gint arrow_size; + + ensure_tab_widget(); + gtk_widget_style_get(gTabWidget, + "scroll-arrow-hlength", &arrow_size, + NULL); + + *height = *width = arrow_size; + + return MOZ_GTK_SUCCESS; +} + gint moz_gtk_get_toolbar_separator_width(gint* size) { @@ -2768,6 +2814,10 @@ moz_gtk_widget_paint(GtkThemeWidgetType widget, GdkDrawable* drawable, case MOZ_GTK_TABPANELS: return moz_gtk_tabpanels_paint(drawable, rect, cliprect, direction); break; + case MOZ_GTK_TAB_SCROLLARROW: + return moz_gtk_tab_scroll_arrow_paint(drawable, rect, cliprect, state, + (GtkArrowType) flags, direction); + break; case MOZ_GTK_MENUBAR: return moz_gtk_menu_bar_paint(drawable, rect, cliprect, direction); break; diff --git a/mozilla/widget/src/gtk2/gtkdrawing.h b/mozilla/widget/src/gtk2/gtkdrawing.h index 20f6ec85610..060213a0c1d 100644 --- a/mozilla/widget/src/gtk2/gtkdrawing.h +++ b/mozilla/widget/src/gtk2/gtkdrawing.h @@ -176,6 +176,8 @@ typedef enum { MOZ_GTK_TAB, /* Paints the background and border of a GtkNotebook. */ MOZ_GTK_TABPANELS, + /* Paints a GtkArrow for a GtkNotebook. flags is a GtkArrowType. */ + MOZ_GTK_TAB_SCROLLARROW, /* Paints the background and border of a GtkTreeView */ MOZ_GTK_TREEVIEW, /* Paints treeheader cells */ @@ -341,6 +343,15 @@ moz_gtk_get_scrollbar_metrics(MozGtkScrollbarMetrics* metrics); */ gint moz_gtk_get_dropdown_arrow_size(gint* width, gint* height); +/** + * Get the desired size of a scroll arrow widget + * width: [OUT] the desired width + * height: [OUT] the desired height + * + * returns: MOZ_GTK_SUCCESS if there was no error, an error code otherwise + */ +gint moz_gtk_get_tab_scroll_arrow_size(gint* width, gint* height); + /** * Get the desired size of a toolbar separator * size: [OUT] the desired width diff --git a/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp b/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp index ce699f23c94..34b5da306b5 100644 --- a/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp +++ b/mozilla/widget/src/gtk2/nsNativeThemeGTK.cpp @@ -525,6 +525,13 @@ nsNativeThemeGTK::GetGtkWidgetAndState(PRUint8 aWidgetType, nsIFrame* aFrame, case NS_THEME_PROGRESSBAR_CHUNK_VERTICAL: aGtkWidgetType = MOZ_GTK_PROGRESS_CHUNK; break; + case NS_THEME_TAB_SCROLLARROW_BACK: + case NS_THEME_TAB_SCROLLARROW_FORWARD: + if (aWidgetFlags) + *aWidgetFlags = aWidgetType == NS_THEME_TAB_SCROLLARROW_BACK ? + GTK_ARROW_LEFT : GTK_ARROW_RIGHT; + aGtkWidgetType = MOZ_GTK_TAB_SCROLLARROW; + break; case NS_THEME_TAB_PANELS: aGtkWidgetType = MOZ_GTK_TABPANELS; break; @@ -890,7 +897,9 @@ nsNativeThemeGTK::GetWidgetPadding(nsIDeviceContext* aContext, { if (aWidgetType == NS_THEME_BUTTON_FOCUS || aWidgetType == NS_THEME_TOOLBAR_BUTTON || - aWidgetType == NS_THEME_TOOLBAR_DUAL_BUTTON) { + aWidgetType == NS_THEME_TOOLBAR_DUAL_BUTTON || + aWidgetType == NS_THEME_TAB_SCROLLARROW_BACK || + aWidgetType == NS_THEME_TAB_SCROLLARROW_FORWARD) { aResult->SizeTo(0, 0, 0, 0); return PR_TRUE; } @@ -1034,6 +1043,13 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsIRenderingContext* aContext, *aIsOverridable = PR_FALSE; } break; + case NS_THEME_TAB_SCROLLARROW_BACK: + case NS_THEME_TAB_SCROLLARROW_FORWARD: + { + moz_gtk_get_tab_scroll_arrow_size(&aResult->width, &aResult->height); + *aIsOverridable = PR_FALSE; + } + break; case NS_THEME_DROPDOWN_BUTTON: { moz_gtk_get_dropdown_arrow_size(&aResult->width, &aResult->height); @@ -1244,6 +1260,8 @@ nsNativeThemeGTK::ThemeSupportsWidget(nsPresContext* aPresContext, case NS_THEME_TAB: // case NS_THEME_TAB_PANEL: case NS_THEME_TAB_PANELS: + case NS_THEME_TAB_SCROLLARROW_BACK: + case NS_THEME_TAB_SCROLLARROW_FORWARD: case NS_THEME_TOOLTIP: case NS_THEME_SPINNER: case NS_THEME_SPINNER_UP_BUTTON: @@ -1305,9 +1323,11 @@ NS_IMETHODIMP_(PRBool) nsNativeThemeGTK::WidgetIsContainer(PRUint8 aWidgetType) { // XXXdwh At some point flesh all of this out. - if (aWidgetType == NS_THEME_DROPDOWN_BUTTON || + if (aWidgetType == NS_THEME_DROPDOWN_BUTTON || IsRadioWidgetType(aWidgetType) || - IsCheckboxWidgetType(aWidgetType)) + IsCheckboxWidgetType(aWidgetType) || + aWidgetType == NS_THEME_TAB_SCROLLARROW_BACK || + aWidgetType == NS_THEME_TAB_SCROLLARROW_FORWARD) return PR_FALSE; return PR_TRUE; }