From 0ead20e79d746de0e67a9dfbb77bdc994963ac02 Mon Sep 17 00:00:00 2001 From: "dbaron%fas.harvard.edu" Date: Sun, 4 Mar 2001 20:15:45 +0000 Subject: [PATCH] Improve GTK system colors for menus and buttons by creating menu and button widgets and asking for their colors so that theme rules specifically for menus and buttons are reflected in the system colors. Undo some changes I made before that were probably incorrect. r=bryner@netscape.com sr=blizzard@mozilla.org b=67448 --- widget/src/gtk/nsLookAndFeel.cpp | 139 ++++++++++++++++++++++++------- widget/src/gtk/nsLookAndFeel.h | 10 ++- 2 files changed, 116 insertions(+), 33 deletions(-) diff --git a/widget/src/gtk/nsLookAndFeel.cpp b/widget/src/gtk/nsLookAndFeel.cpp index ff7e5d2279fe..94fb19f6b96a 100644 --- a/widget/src/gtk/nsLookAndFeel.cpp +++ b/widget/src/gtk/nsLookAndFeel.cpp @@ -1,4 +1,5 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim:ts=2:et:sw=2: * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file @@ -30,7 +31,13 @@ nscolor nsLookAndFeel::sInfoText = 0; nscolor nsLookAndFeel::sInfoBackground = 0; -PRBool nsLookAndFeel::sHaveInfoColors = PR_FALSE; +nscolor nsLookAndFeel::sMenuText = 0; +nscolor nsLookAndFeel::sMenuBackground = 0; +nscolor nsLookAndFeel::sButtonBackground = 0; +nscolor nsLookAndFeel::sButtonText = 0; +nscolor nsLookAndFeel::sButtonOuterLightBorder = 0; +nscolor nsLookAndFeel::sButtonInnerDarkBorder = 0; +PRBool nsLookAndFeel::sColorsInitialized = PR_FALSE; NS_IMPL_ISUPPORTS1(nsLookAndFeel, nsILookAndFeel) @@ -46,6 +53,9 @@ nsLookAndFeel::nsLookAndFeel() gtk_widget_ensure_style(mWidget); mStyle = gtk_widget_get_style(mWidget); + if (!sColorsInitialized) + InitColors(); + (void)NS_NewXPLookAndFeel(getter_AddRefs(mXPLookAndFeel)); } @@ -108,84 +118,104 @@ NS_IMETHODIMP nsLookAndFeel::GetColor(const nsColorID aID, nscolor &aColor) // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors case eColor_activeborder: + // active window border aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); break; case eColor_activecaption: + // active window caption background aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); break; case eColor_appworkspace: + // MDI background color aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); break; case eColor_background: + // desktop background aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); break; - case eColor_captiontext: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); + // text in active window caption, size box, and scrollbar arrow box (!) + aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); break; case eColor_graytext: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_INSENSITIVE]); + // disabled text + aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); + // or maybe mStyle->text? break; case eColor_highlight: + // background of selected item aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]); break; case eColor_highlighttext: + // text of selected item aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_SELECTED]); break; case eColor_inactiveborder: + // inactive window border aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); break; case eColor_inactivecaption: + // inactive window caption aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_INSENSITIVE]); break; case eColor_inactivecaptiontext: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_INSENSITIVE]); + // text in inactive window caption + aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); break; case eColor_infobackground: - if (!sHaveInfoColors) - GetInfoColors(); + // tooltip background color aColor = sInfoBackground; break; case eColor_infotext: - if (!sHaveInfoColors) - GetInfoColors(); + // tooltip text color aColor = sInfoText; break; case eColor_menu: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); + // menu background + aColor = sMenuBackground; break; case eColor_menutext: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); + // menu text + aColor = sMenuText; break; case eColor_scrollbar: + // scrollbar gray area aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_ACTIVE]); break; case eColor_threedface: case eColor_buttonface: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); - break; - - case eColor_buttonhighlight: - case eColor_threedhighlight: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->light[GTK_STATE_NORMAL]); + // 3-D face color + aColor = sButtonBackground; break; case eColor_buttontext: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); + // text on push buttons + aColor = sButtonText; break; - case eColor_buttonshadow: - case eColor_threedshadow: // i think these should be the same - aColor = GDK_COLOR_TO_NS_RGB(mStyle->dark[GTK_STATE_NORMAL]); - break; - - case eColor_threeddarkshadow: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); + case eColor_buttonhighlight: + // 3-D highlighted edge color + case eColor_threedhighlight: + // 3-D highlighted outer edge color + aColor = sButtonOuterLightBorder; break; case eColor_threedlightshadow: - aColor = GDK_COLOR_TO_NS_RGB(mStyle->light[GTK_STATE_NORMAL]); + // 3-D highlighted inner edge color + aColor = sButtonBackground; // always same as background in GTK code + break; + + case eColor_buttonshadow: + // 3-D shadow edge color + case eColor_threedshadow: + // 3-D shadow inner edge color + aColor = sButtonInnerDarkBorder; + break; + + case eColor_threeddarkshadow: + // 3-D shadow outer edge color + aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); break; case eColor_window: @@ -375,19 +405,66 @@ NS_IMETHODIMP nsLookAndFeel::GetMetric(const nsMetricFloatID aID, float & aMetri } void -nsLookAndFeel::GetInfoColors() +nsLookAndFeel::InitColors() { + sColorsInitialized = PR_TRUE; + GtkStyle *style; + + // tooltip foreground and background GtkTooltips *tooltips = gtk_tooltips_new(); gtk_tooltips_force_window(tooltips); GtkWidget *tip_window = tooltips->tip_window; gtk_widget_set_rc_style(tip_window); - GtkStyle *tipstyle = gtk_widget_get_style(tip_window); - sInfoBackground = GDK_COLOR_TO_NS_RGB(tipstyle->bg[GTK_STATE_NORMAL]); - sInfoText = GDK_COLOR_TO_NS_RGB(tipstyle->fg[GTK_STATE_NORMAL]); - sHaveInfoColors = PR_TRUE; + style = gtk_widget_get_style(tip_window); + sInfoBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); + sInfoText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); gtk_object_unref(GTK_OBJECT(tooltips)); + + + // menu foreground & menu background + GtkWidget *accel_label = gtk_accel_label_new("M"); + GtkWidget *menuitem = gtk_menu_item_new(); + GtkWidget *menu = gtk_menu_new(); + + gtk_container_add(GTK_CONTAINER(menuitem), accel_label); + gtk_menu_append(GTK_MENU(menu), menuitem); + + gtk_widget_set_rc_style(accel_label); + style = gtk_widget_get_style(accel_label); + sMenuText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); + + gtk_widget_set_rc_style(menu); + style = gtk_widget_get_style(menu); + sMenuBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); + + gtk_widget_unref(menu); + + + // button styles + GtkWidget *parent = gtk_fixed_new(); + GtkWidget *button = gtk_button_new(); + GtkWidget *label = gtk_label_new("M"); + + gtk_container_add(GTK_CONTAINER(button), label); + gtk_container_add(GTK_CONTAINER(parent), button); + + gtk_widget_set_rc_style(button); + gtk_widget_set_rc_style(label); + + style = gtk_widget_get_style(label); + sButtonText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); + + style = gtk_widget_get_style(button); + sButtonBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); + sButtonOuterLightBorder = + GDK_COLOR_TO_NS_RGB(style->light[GTK_STATE_NORMAL]); + sButtonInnerDarkBorder = + GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]); + + gtk_widget_unref(parent); + } #ifdef NS_DEBUG diff --git a/widget/src/gtk/nsLookAndFeel.h b/widget/src/gtk/nsLookAndFeel.h index c3a841cc538b..08798da6f613 100644 --- a/widget/src/gtk/nsLookAndFeel.h +++ b/widget/src/gtk/nsLookAndFeel.h @@ -55,11 +55,17 @@ protected: // Cached colors, we have to create a dummy widget to actually // get the style - static PRBool sHaveInfoColors; + static PRBool sColorsInitialized; static nscolor sInfoBackground; static nscolor sInfoText; + static nscolor sMenuBackground; + static nscolor sMenuText; + static nscolor sButtonBackground; + static nscolor sButtonText; + static nscolor sButtonOuterLightBorder; + static nscolor sButtonInnerDarkBorder; - static void GetInfoColors(); + static void InitColors(); }; #endif