Index: browser/components/shell/src/nsGNOMEShellService.cpp =================================================================== RCS file: /cvsroot/mozilla/browser/components/shell/src/nsGNOMEShellService.cpp,v retrieving revision 1.21 diff -d -u -p -U 8 -r1.21 nsGNOMEShellService.cpp --- browser/components/shell/src/nsGNOMEShellService.cpp 1 Oct 2007 18:25:26 -0000 1.21 +++ browser/components/shell/src/nsGNOMEShellService.cpp 15 Mar 2008 07:08:47 -0000 @@ -58,16 +58,17 @@ #include "nsIImage.h" #include "prprf.h" #ifdef MOZ_WIDGET_GTK2 #include "nsIImageToPixbuf.h" #endif #include #include +#include #include #include #include struct ProtocolAssociation { const char *name; PRBool essential; @@ -442,117 +443,56 @@ nsGNOMEShellService::SetDesktopBackgroun EmptyCString()); gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), filePath); gconf->SetBool(NS_LITERAL_CSTRING(kDesktopDrawBGKey), PR_TRUE); return rv; } -// In: pointer to two characters CC -// Out: parsed color number -static PRUint8 -HexToNum(char ch) -{ - if ('0' <= ch && '9' >= ch) - return ch - '0'; - - if ('A' <= ch && 'F' >= ch) - return ch - 'A'; - - if ('a' <= ch && 'f' >= ch) - return ch - 'a'; - - return 0; -} - - -// In: 3 or 6-character RRGGBB hex string -// Out: component colors -static PRBool -HexToRGB(const nsCString& aColorSpec, - PRUint8 &aRed, - PRUint8 &aGreen, - PRUint8 &aBlue) -{ - const char *buf = aColorSpec.get(); - - if (aColorSpec.Length() == 6) { - aRed = HexToNum(buf[0]) >> 4 | - HexToNum(buf[1]); - aGreen = HexToNum(buf[2]) >> 4 | - HexToNum(buf[3]); - aBlue = HexToNum(buf[4]) >> 4 | - HexToNum(buf[5]); - return PR_TRUE; - } - - if (aColorSpec.Length() == 3) { - aRed = HexToNum(buf[0]); - aGreen = HexToNum(buf[1]); - aBlue = HexToNum(buf[2]); - - aRed |= aRed >> 4; - aGreen |= aGreen >> 4; - aBlue |= aBlue >> 4; - - return PR_TRUE; - } - - return PR_FALSE; -} +#define COLOR_16_TO_8_BIT(_c) ((_c) >> 8) +#define COLOR_8_TO_16_BIT(_c) ((_c) << 8) NS_IMETHODIMP nsGNOMEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) { nsCOMPtr gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); nsCAutoString background; gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background); if (background.IsEmpty()) { *aColor = 0; return NS_OK; } - // Chop off the leading '#' character - background.Cut(0, 1); + GdkColor color; + gboolean success = gdk_color_parse(background.get(), &color); - PRUint8 red, green, blue; - if (!HexToRGB(background, red, green, blue)) - return NS_ERROR_FAILURE; + NS_ENSURE_TRUE(success, NS_ERROR_FAILURE); - // The result must be in RGB order with the high 8 bits zero. - *aColor = (red << 16 | green << 8 | blue); + *aColor = COLOR_16_TO_8_BIT(color.red) << 16 | + COLOR_16_TO_8_BIT(color.green) << 8 | + COLOR_16_TO_8_BIT(color.blue); return NS_OK; } -static void -ColorToHex(PRUint32 aColor, nsCString& aResult) -{ - char *buf = aResult.BeginWriting(7); - if (!buf) - return; - - PRUint8 red = (aColor >> 16); - PRUint8 green = (aColor >> 8) & 0xff; - PRUint8 blue = aColor & 0xff; - - PR_snprintf(buf, 8, "#%02x%02x%02x", red, green, blue); -} - NS_IMETHODIMP nsGNOMEShellService::SetDesktopBackgroundColor(PRUint32 aColor) { nsCOMPtr gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - nsCString colorString; - ColorToHex(aColor, colorString); + GdkColor color; + color.red = COLOR_8_TO_16_BIT(aColor >> 16); + color.green = COLOR_8_TO_16_BIT((aColor >> 8) & 0xff); + color.blue = COLOR_8_TO_16_BIT(aColor & 0xff); - gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), colorString); + gchar *colorString = gdk_color_to_string(&color); + gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), nsDependentCString(colorString)); + g_free (colorString); return NS_OK; } NS_IMETHODIMP nsGNOMEShellService::OpenApplication(PRInt32 aApplication) { nsCAutoString scheme;