diff options
Diffstat (limited to 'firefox-4.0-gnome3.patch')
-rw-r--r-- | firefox-4.0-gnome3.patch | 1299 |
1 files changed, 0 insertions, 1299 deletions
diff --git a/firefox-4.0-gnome3.patch b/firefox-4.0-gnome3.patch deleted file mode 100644 index c1f229a..0000000 --- a/firefox-4.0-gnome3.patch +++ /dev/null @@ -1,1299 +0,0 @@ -diff --git a/toolkit/system/gnome/nsGIOService.cpp b/toolkit/system/gnome/nsGIOService.cpp ---- a/toolkit/system/gnome/nsGIOService.cpp -+++ b/toolkit/system/gnome/nsGIOService.cpp -@@ -101,25 +101,25 @@ nsGIOMimeApp::GetName(nsACString& aName) - return NS_OK; - } - - NS_IMETHODIMP - nsGIOMimeApp::GetCommand(nsACString& aCommand) - { - get_commandline_t g_app_info_get_commandline_ptr; - -- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY); -+ void *libHandle = dlopen("libgio-2.0.so.0", RTLD_LAZY); - if (!libHandle) { - return NS_ERROR_FAILURE; - } - dlerror(); /* clear any existing error */ - g_app_info_get_commandline_ptr = - (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline"); -- if (dlerror() != NULL) { -- const char cmd = *g_app_info_get_commandline_ptr(mApp); -+ if (dlerror() == NULL) { -+ const char *cmd = g_app_info_get_commandline_ptr(mApp); - if (!cmd) { - dlclose(libHandle); - return NS_ERROR_FAILURE; - } - aCommand.Assign(cmd); - } - dlclose(libHandle); - return NS_OK; -@@ -414,75 +414,46 @@ nsGIOService::CreateAppFromCommand(nsACS - nsIGIOMimeApp** appInfo) - { - GError *error = NULL; - *appInfo = nsnull; - - GAppInfo *app_info = NULL, *app_info_from_list = NULL; - GList *apps = g_app_info_get_all(); - GList *apps_p = apps; -- get_commandline_t g_app_info_get_commandline_ptr; -- -- void *libHandle = dlopen("libgio-2.0.so", RTLD_LAZY); -- if (!libHandle) { -- return NS_ERROR_FAILURE; -- } -- dlerror(); /* clear any existing error */ -- g_app_info_get_commandline_ptr = -- (get_commandline_t) dlsym(libHandle, "g_app_info_get_commandline"); -- if (dlerror() != NULL) { -- g_app_info_get_commandline_ptr = NULL; -- } - - // Try to find relevant and existing GAppInfo in all installed application -+ // We do this by comparing each GAppInfo's executable with out own - while (apps_p) { - app_info_from_list = (GAppInfo*) apps_p->data; -- /* This is a silly test. It just compares app names but not -- * commands. This is due to old version of Glib/Gio. The required -- * function which allows to do a regular check of existence of desktop file -- * is possible by using function g_app_info_get_commandline. This function -- * has been introduced in Glib 2.20. */ -- if (app_info_from_list && strcmp(g_app_info_get_name(app_info_from_list), -- PromiseFlatCString(appName).get()) == 0 ) -- { -- if (g_app_info_get_commandline_ptr) -- { -- /* Following test is only possible with Glib >= 2.20. -- * Compare path only by using strncmp */ -- if (strncmp(g_app_info_get_commandline_ptr(app_info_from_list), -- PromiseFlatCString(cmd).get(), -- strlen(PromiseFlatCString(cmd).get())) == 0) -- { -- app_info = app_info_from_list; -- break; -- } else { -- g_object_unref(app_info_from_list); -- } -- } else { -+ if (!app_info) { -+ // If the executable is not absolute, get it's full path -+ char *executable = g_find_program_in_path(g_app_info_get_executable(app_info_from_list)); -+ -+ if (executable && strcmp(executable, PromiseFlatCString(cmd).get()) == 0) { -+ g_object_ref (app_info_from_list); - app_info = app_info_from_list; -- break; - } -- } else { -- g_object_unref(app_info_from_list); -+ g_free(executable); - } -+ -+ g_object_unref(app_info_from_list); - apps_p = apps_p->next; - } - g_list_free(apps); - - if (!app_info) { - app_info = g_app_info_create_from_commandline(PromiseFlatCString(cmd).get(), - PromiseFlatCString(appName).get(), - G_APP_INFO_CREATE_SUPPORTS_URIS, - &error); - } - - if (!app_info) { - g_warning("Cannot create application info from command: %s", error->message); - g_error_free(error); -- dlclose(libHandle); - return NS_ERROR_FAILURE; - } - nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info); - NS_ENSURE_TRUE(mozApp, NS_ERROR_OUT_OF_MEMORY); - NS_ADDREF(*appInfo = mozApp); -- dlclose(libHandle); - return NS_OK; - } - -diff --git a/browser/components/shell/src/nsGNOMEShellService.cpp b/browser/components/shell/src/nsGNOMEShellService.cpp ---- a/browser/components/shell/src/nsGNOMEShellService.cpp -+++ b/browser/components/shell/src/nsGNOMEShellService.cpp -@@ -101,24 +101,24 @@ static const char kDesktopOptionsKey[] = - static const char kDesktopDrawBGKey[] = DG_BACKGROUND "/draw_background"; - static const char kDesktopColorKey[] = DG_BACKGROUND "/primary_color"; - - nsresult - nsGNOMEShellService::Init() - { - nsresult rv; - -- // GConf _must_ be available, or we do not allow -+ // GConf or GIO _must_ be available, or we do not allow - // CreateInstance to succeed. - - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - nsCOMPtr<nsIGIOService> giovfs = - do_GetService(NS_GIOSERVICE_CONTRACTID); - -- if (!gconf) -+ if (!gconf && !giovfs) - return NS_ERROR_NOT_AVAILABLE; - - // Check G_BROKEN_FILENAMES. If it's set, then filenames in glib use - // the locale encoding. If it's not set, they use UTF-8. - mUseLocaleFilenames = PR_GetEnv("G_BROKEN_FILENAMES") != nsnull; - - if (GetAppPathFromLauncher()) - return NS_OK; -@@ -189,50 +189,77 @@ nsGNOMEShellService::KeyMatchesAppName(c - if (!commandPath) - return PR_FALSE; - - PRBool matches = mAppPath.Equals(commandPath); - g_free(commandPath); - return matches; - } - -+PRBool -+nsGNOMEShellService::CheckHandlerMatchesAppName(const nsACString &handler) const -+{ -+ gint argc; -+ gchar **argv; -+ nsCAutoString command(handler); -+ -+ // The string will be something of the form: [/path/to/]browser "%s" -+ // We want to remove all of the parameters and get just the binary name. -+ -+ if (g_shell_parse_argv(command.get(), &argc, &argv, NULL) && argc > 0) { -+ command.Assign(argv[0]); -+ g_strfreev(argv); -+ } -+ -+ if (!KeyMatchesAppName(command.get())) -+ return PR_FALSE; // the handler is set to another app -+ -+ return PR_TRUE; -+} -+ - NS_IMETHODIMP - nsGNOMEShellService::IsDefaultBrowser(PRBool aStartupCheck, - PRBool* aIsDefaultBrowser) - { - *aIsDefaultBrowser = PR_FALSE; - if (aStartupCheck) - mCheckedThisSession = PR_TRUE; - - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -+ nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); - - PRBool enabled; - nsCAutoString handler; -+ nsCOMPtr<nsIGIOMimeApp> gioApp; - - for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) { - if (!appProtocols[i].essential) - continue; - -- handler.Truncate(); -- gconf->GetAppForProtocol(nsDependentCString(appProtocols[i].name), -- &enabled, handler); -+ if (gconf) { -+ handler.Truncate(); -+ gconf->GetAppForProtocol(nsDependentCString(appProtocols[i].name), -+ &enabled, handler); - -- // The string will be something of the form: [/path/to/]browser "%s" -- // We want to remove all of the parameters and get just the binary name. -- -- gint argc; -- gchar **argv; -- -- if (g_shell_parse_argv(handler.get(), &argc, &argv, NULL) && argc > 0) { -- handler.Assign(argv[0]); -- g_strfreev(argv); -+ if (!CheckHandlerMatchesAppName(handler) || !enabled) -+ return NS_OK; // the handler is disabled or set to another app - } - -- if (!KeyMatchesAppName(handler.get()) || !enabled) -- return NS_OK; // the handler is disabled or set to another app -+ if (giovfs) { -+ handler.Truncate(); -+ giovfs->GetAppForURIScheme(nsDependentCString(appProtocols[i].name), -+ getter_AddRefs(gioApp)); -+ if (!gioApp) -+ return NS_OK; -+ -+ gioApp->GetCommand(handler); -+ -+ if (!CheckHandlerMatchesAppName(handler)) -+ return NS_OK; // the handler is set to another app -+ } - } - - *aIsDefaultBrowser = PR_TRUE; - - return NS_OK; - } - - NS_IMETHODIMP -@@ -240,19 +267,20 @@ nsGNOMEShellService::SetDefaultBrowser(P - PRBool aForAllUsers) - { - #ifdef DEBUG - if (aForAllUsers) - NS_WARNING("Setting the default browser for all users is not yet supported"); - #endif - - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -+ nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); - if (gconf) { - nsCAutoString appKeyValue; -- if(mAppIsInPath) { -+ if (mAppIsInPath) { - // mAppPath is in the users path, so use only the basename as the launcher - gchar *tmp = g_path_get_basename(mAppPath.get()); - appKeyValue = tmp; - g_free(tmp); - } else { - appKeyValue = mAppPath; - } - -@@ -261,23 +289,18 @@ nsGNOMEShellService::SetDefaultBrowser(P - for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) { - if (appProtocols[i].essential || aClaimAllTypes) { - gconf->SetAppForProtocol(nsDependentCString(appProtocols[i].name), - appKeyValue); - } - } - } - -- // set handler for .html and xhtml files and MIME types: -- if (aClaimAllTypes) { -+ if (giovfs) { - nsresult rv; -- nsCOMPtr<nsIGIOService> giovfs = -- do_GetService(NS_GIOSERVICE_CONTRACTID, &rv); -- NS_ENSURE_SUCCESS(rv, NS_OK); -- - nsCOMPtr<nsIStringBundleService> bundleService = - do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr<nsIStringBundle> brandBundle; - rv = bundleService->CreateBundle(BRAND_PROPERTIES, getter_AddRefs(brandBundle)); - NS_ENSURE_SUCCESS(rv, rv); - -@@ -290,20 +313,30 @@ nsGNOMEShellService::SetDefaultBrowser(P - // use brandShortName as the application id. - NS_ConvertUTF16toUTF8 id(brandShortName); - nsCOMPtr<nsIGIOMimeApp> appInfo; - rv = giovfs->CreateAppFromCommand(mAppPath, - id, - getter_AddRefs(appInfo)); - NS_ENSURE_SUCCESS(rv, rv); - -- // Add mime types for html, xhtml extension and set app to just created appinfo. -- for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appTypes); ++i) { -- appInfo->SetAsDefaultForMimeType(nsDependentCString(appTypes[i].mimeType)); -- appInfo->SetAsDefaultForFileExtensions(nsDependentCString(appTypes[i].extensions)); -+ // set handler for the protocols -+ for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appProtocols); ++i) { -+ if (appProtocols[i].essential || aClaimAllTypes) { -+ appInfo->SetAsDefaultForURIScheme(nsDependentCString(appProtocols[i].name)); -+ } -+ } -+ -+ // set handler for .html and xhtml files and MIME types: -+ if (aClaimAllTypes) { -+ // Add mime types for html, xhtml extension and set app to just created appinfo. -+ for (unsigned int i = 0; i < NS_ARRAY_LENGTH(appTypes); ++i) { -+ appInfo->SetAsDefaultForMimeType(nsDependentCString(appTypes[i].mimeType)); -+ appInfo->SetAsDefaultForFileExtensions(nsDependentCString(appTypes[i].extensions)); -+ } - } - } - - return NS_OK; - } - - NS_IMETHODIMP - nsGNOMEShellService::GetShouldCheckDefaultBrowser(PRBool* aResult) -@@ -403,48 +436,52 @@ nsGNOMEShellService::SetDesktopBackgroun - filePath.Append("_wallpaper.png"); - - // write the image to a file in the home dir - rv = WriteImage(filePath, container); - - // if the file was written successfully, set it as the system wallpaper - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - -- nsCAutoString options; -- if (aPosition == BACKGROUND_TILE) -- options.Assign("wallpaper"); -- else if (aPosition == BACKGROUND_STRETCH) -- options.Assign("stretched"); -- else -- options.Assign("centered"); -+ if (gconf) { -+ nsCAutoString options; -+ if (aPosition == BACKGROUND_TILE) -+ options.Assign("wallpaper"); -+ else if (aPosition == BACKGROUND_STRETCH) -+ options.Assign("stretched"); -+ else -+ options.Assign("centered"); - -- gconf->SetString(NS_LITERAL_CSTRING(kDesktopOptionsKey), options); -+ gconf->SetString(NS_LITERAL_CSTRING(kDesktopOptionsKey), options); - -- // Set the image to an empty string first to force a refresh -- // (since we could be writing a new image on top of an existing -- // Firefox_wallpaper.png and nautilus doesn't monitor the file for changes) -- gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), -- EmptyCString()); -+ // Set the image to an empty string first to force a refresh -+ // (since we could be writing a new image on top of an existing -+ // Firefox_wallpaper.png and nautilus doesn't monitor the file for changes) -+ gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), -+ EmptyCString()); - -- gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), filePath); -- gconf->SetBool(NS_LITERAL_CSTRING(kDesktopDrawBGKey), PR_TRUE); -+ gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), filePath); -+ gconf->SetBool(NS_LITERAL_CSTRING(kDesktopDrawBGKey), PR_TRUE); -+ } - - return rv; - } - - #define COLOR_16_TO_8_BIT(_c) ((_c) >> 8) - #define COLOR_8_TO_16_BIT(_c) ((_c) << 8 | (_c)) - - NS_IMETHODIMP - nsGNOMEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) - { - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - - nsCAutoString background; -- gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background); -+ if (gconf) { -+ gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background); -+ } - - if (background.IsEmpty()) { - *aColor = 0; - return NS_OK; - } - - GdkColor color; - gboolean success = gdk_color_parse(background.get(), &color); -@@ -473,36 +510,48 @@ ColorToCString(PRUint32 aColor, nsCStrin - } - - NS_IMETHODIMP - nsGNOMEShellService::SetDesktopBackgroundColor(PRUint32 aColor) - { - NS_ASSERTION(aColor <= 0xffffff, "aColor has extra bits"); - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - -- nsCAutoString colorString; -- ColorToCString(aColor, colorString); -+ if (gconf) { -+ nsCAutoString colorString; -+ ColorToCString(aColor, colorString); - -- gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), colorString); -+ gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), colorString); -+ } - - return NS_OK; - } - - NS_IMETHODIMP - nsGNOMEShellService::OpenApplication(PRInt32 aApplication) - { - nsCAutoString scheme; - if (aApplication == APPLICATION_MAIL) - scheme.Assign("mailto"); - else if (aApplication == APPLICATION_NEWS) - scheme.Assign("news"); - else - return NS_ERROR_NOT_AVAILABLE; - -+ nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); -+ if (giovfs) { -+ nsCOMPtr<nsIGIOMimeApp> gioApp; -+ giovfs->GetAppForURIScheme(scheme, getter_AddRefs(gioApp)); -+ if (gioApp) -+ return gioApp->Launch(EmptyCString()); -+ } -+ - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -+ if (!gconf) -+ return NS_ERROR_FAILURE; - - PRBool enabled; - nsCAutoString appCommand; - gconf->GetAppForProtocol(scheme, &enabled, appCommand); - - if (!enabled) - return NS_ERROR_FAILURE; - -diff --git a/browser/components/shell/src/nsGNOMEShellService.h b/browser/components/shell/src/nsGNOMEShellService.h ---- a/browser/components/shell/src/nsGNOMEShellService.h -+++ b/browser/components/shell/src/nsGNOMEShellService.h -@@ -49,16 +49,17 @@ public: - NS_DECL_NSISHELLSERVICE - - nsresult Init() NS_HIDDEN; - - private: - ~nsGNOMEShellService() {} - - NS_HIDDEN_(PRBool) KeyMatchesAppName(const char *aKeyValue) const; -+ NS_HIDDEN_(PRBool) CheckHandlerMatchesAppName(const nsACString& handler) const; - - NS_HIDDEN_(PRBool) GetAppPathFromLauncher(); - PRPackedBool mCheckedThisSession; - PRPackedBool mUseLocaleFilenames; - nsCString mAppPath; - PRPackedBool mAppIsInPath; - }; - -diff --git a/toolkit/system/gnome/nsGIOService.cpp b/toolkit/system/gnome/nsGIOService.cpp ---- a/toolkit/system/gnome/nsGIOService.cpp -+++ b/toolkit/system/gnome/nsGIOService.cpp -@@ -277,16 +277,43 @@ nsGIOMimeApp::SetAsDefaultForFileExtensi - } else { - *ext_pos = '\0'; - } - } - g_free(extensions); - return NS_OK; - } - -+/** -+ * Set default application for URI's of a particular scheme -+ * @param aURIScheme string containing the URI scheme -+ * @return NS_OK when application was set as default for URI scheme, -+ * NS_ERROR_FAILURE otherwise -+ */ -+NS_IMETHODIMP -+nsGIOMimeApp::SetAsDefaultForURIScheme(nsACString const& aURIScheme) -+{ -+ GError *error = NULL; -+ nsCAutoString contentType("x-scheme-handler/"); -+ contentType.Append(aURIScheme); -+ -+ g_app_info_set_as_default_for_type(mApp, -+ contentType.get(), -+ &error); -+ if (error) { -+ g_warning("Cannot set application as default for URI scheme (%s): %s", -+ PromiseFlatCString(aURIScheme).get(), -+ error->message); -+ g_error_free(error); -+ return NS_ERROR_FAILURE; -+ } -+ -+ return NS_OK; -+} -+ - nsresult - nsGIOService::Init() - { - // do nothing, gvfs/gio does not init. - return NS_OK; - } - - NS_IMPL_ISUPPORTS1(nsGIOService, nsIGIOService) -@@ -317,16 +344,33 @@ nsGIOService::GetMimeTypeFromExtension(c - g_free(mime_type); - g_free(content_type); - - return NS_OK; - } - // used in nsGNOMERegistry - // ----------------------------------------------------------------------------- - NS_IMETHODIMP -+nsGIOService::GetAppForURIScheme(const nsACString& aURIScheme, -+ nsIGIOMimeApp** aApp) -+{ -+ *aApp = nsnull; -+ -+ GAppInfo *app_info = g_app_info_get_default_for_uri_scheme( -+ PromiseFlatCString(aURIScheme).get()); -+ if (app_info) { -+ nsGIOMimeApp *mozApp = new nsGIOMimeApp(app_info); -+ NS_ADDREF(*aApp = mozApp); -+ } else { -+ return NS_ERROR_FAILURE; -+ } -+ return NS_OK; -+} -+ -+NS_IMETHODIMP - nsGIOService::GetAppForMimeType(const nsACString& aMimeType, - nsIGIOMimeApp** aApp) - { - *aApp = nsnull; - char *content_type = - get_content_type_from_mime_type(PromiseFlatCString(aMimeType).get()); - if (!content_type) - return NS_ERROR_FAILURE; -diff --git a/xpcom/system/nsIGIOService.idl b/xpcom/system/nsIGIOService.idl ---- a/xpcom/system/nsIGIOService.idl -+++ b/xpcom/system/nsIGIOService.idl -@@ -41,57 +41,61 @@ - - interface nsIUTF8StringEnumerator; - interface nsIURI; - - /* nsIGIOMimeApp holds information about an application that is looked up - with nsIGIOService::GetAppForMimeType. */ - // 66009894-9877-405b-9321-bf30420e34e6 prev uuid - --[scriptable, uuid(e77021b4-4012-407d-b686-7a1f18050109)] -+[scriptable, uuid(ca6bad0c-8a48-48ac-82c7-27bb8f510fbe)] - interface nsIGIOMimeApp : nsISupports - { - const long EXPECTS_URIS = 0; - const long EXPECTS_PATHS = 1; - const long EXPECTS_URIS_FOR_NON_FILES = 2; - - readonly attribute AUTF8String id; - readonly attribute AUTF8String name; - readonly attribute AUTF8String command; - readonly attribute long expectsURIs; // see constants above - readonly attribute nsIUTF8StringEnumerator supportedURISchemes; - - void launch(in AUTF8String uri); - void setAsDefaultForMimeType(in AUTF8String mimeType); - void setAsDefaultForFileExtensions(in AUTF8String extensions); -+ void setAsDefaultForURIScheme(in AUTF8String uriScheme); - }; - - /* - * The VFS service makes use of two distinct registries. - * - * The application registry holds information about applications (uniquely - * identified by id), such as which MIME types and URI schemes they are - * capable of handling, whether they run in a terminal, etc. - * - * The MIME registry holds information about MIME types, such as which - * extensions map to a given MIME type. The MIME registry also stores the - * id of the application selected to handle each MIME type. - */ - - // prev id dea20bf0-4e4d-48c5-b932-dc3e116dc64b --[scriptable, uuid(47e372c2-78bb-4899-8114-56aa7d9cdac5)] -+[scriptable, uuid(eda22a30-84e1-4e16-9ca0-cd1553c2b34a)] - interface nsIGIOService : nsISupports - { - - /*** MIME registry methods ***/ - - /* Obtain the MIME type registered for an extension. The extension - should not include a leading dot. */ - AUTF8String getMimeTypeFromExtension(in AUTF8String extension); - -+ /* Obtain the preferred application for opening a given URI scheme */ -+ nsIGIOMimeApp getAppForURIScheme(in AUTF8String aURIScheme); -+ - /* Obtain the preferred application for opening a given MIME type */ - nsIGIOMimeApp getAppForMimeType(in AUTF8String mimeType); - - /* Obtain the preferred application for opening a given MIME type */ - nsIGIOMimeApp createAppFromCommand(in AUTF8String cmd, - in AUTF8String appName); - - /* Obtain a description for the given MIME type */ - -diff --git a/toolkit/system/gnome/Makefile.in b/toolkit/system/gnome/Makefile.in ---- a/toolkit/system/gnome/Makefile.in -+++ b/toolkit/system/gnome/Makefile.in -@@ -60,16 +60,17 @@ ifdef MOZ_ENABLE_GNOMEVFS - CPPSRCS += \ - nsGnomeVFSService.cpp \ - $(NULL) - endif - - ifdef MOZ_ENABLE_GIO - CPPSRCS += \ - nsGIOService.cpp \ -+ nsGSettingsService.cpp \ - $(NULL) - endif - - ifdef MOZ_ENABLE_LIBNOTIFY - CPPSRCS += \ - nsAlertsService.cpp \ - nsAlertsIconListener.cpp \ - $(NULL) -diff --git a/toolkit/system/gnome/nsGSettingsService.cpp b/toolkit/system/gnome/nsGSettingsService.cpp -new file mode 100644 ---- /dev/null -+++ b/toolkit/system/gnome/nsGSettingsService.cpp -@@ -0,0 +1,238 @@ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -+/* ***** BEGIN LICENSE BLOCK ***** -+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 -+ * -+ * The contents of this file are subject to the Mozilla Public License Version -+ * 1.1 (the "License"); you may not use this file except in compliance with -+ * the License. You may obtain a copy of the License at -+ * http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS IS" basis, -+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -+ * for the specific language governing rights and limitations under the -+ * License. -+ * -+ * The Original Code is the Mozilla GNOME integration code. -+ * -+ * The Initial Developer of the Original Code is -+ * Canonical Ltd. -+ * Portions created by the Initial Developer are Copyright (C) 2010 -+ * the Initial Developer. All Rights Reserved. -+ * -+ * Contributor(s): -+ * Chris Coulson <chris.coulson@canonical.com> -+ * -+ * Alternatively, the contents of this file may be used under the terms of -+ * either the GNU General Public License Version 2 or later (the "GPL"), or -+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -+ * in which case the provisions of the GPL or the LGPL are applicable instead -+ * of those above. If you wish to allow use of your version of this file only -+ * under the terms of either the GPL or the LGPL, and not to allow others to -+ * use your version of this file under the terms of the MPL, indicate your -+ * decision by deleting the provisions above and replace them with the notice -+ * and other provisions required by the GPL or the LGPL. If you do not delete -+ * the provisions above, a recipient may use your version of this file under -+ * the terms of any one of the MPL, the GPL or the LGPL. -+ * -+ * ***** END LICENSE BLOCK ***** */ -+ -+#include "nsGSettingsService.h" -+#include "nsStringAPI.h" -+#include "nsCOMPtr.h" -+#include "prlink.h" -+#include "nsComponentManagerUtils.h" -+ -+#include <glib.h> -+#include <glib-object.h> -+ -+typedef struct _GSettings GSettings; -+ -+typedef GSettings * (*_g_settings_new_fn) (const char* schema); -+typedef const char * const* (*_g_settings_list_schemas_fn) (void); -+typedef gboolean (*_g_settings_set_string_fn) (GSettings* settings, -+ const char* key, -+ const char* value); -+typedef gboolean (*_g_settings_set_boolean_fn) (GSettings* settings, -+ const char* key, -+ gboolean value); -+typedef gboolean (*_g_settings_set_int_fn) (GSettings* settings, -+ const char* key, -+ int value); -+typedef char * (*_g_settings_get_string_fn) (GSettings* settings, -+ const char* key); -+typedef gboolean (*_g_settings_get_boolean_fn) (GSettings* settings, -+ const char* key); -+typedef int (*_g_settings_get_int_fn) (GSettings* settings, -+ const char* key); -+ -+static _g_settings_new_fn _g_settings_new; -+static _g_settings_list_schemas_fn _g_settings_list_schemas; -+static PRLibrary *gioLib = nsnull; -+ -+class nsGSettingsCollection : public nsIGSettingsCollection -+{ -+public: -+ NS_DECL_ISUPPORTS -+ NS_DECL_NSIGSETTINGSCOLLECTION -+ -+ nsGSettingsCollection(GSettings* aSettings) : mSettings(aSettings) {} -+ ~nsGSettingsCollection() { g_object_unref(mSettings); } -+ -+private: -+ GSettings *mSettings; -+}; -+ -+NS_IMPL_ISUPPORTS1(nsGSettingsCollection, nsIGSettingsCollection) -+ -+NS_IMETHODIMP -+nsGSettingsCollection::SetString(const nsACString& aKey, -+ const nsACString& aValue) -+{ -+ _g_settings_set_string_fn _g_settings_set_string = -+ (_g_settings_set_string_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_set_string"); -+ if (!_g_settings_set_string) -+ return NS_ERROR_FAILURE; -+ -+ gboolean res = _g_settings_set_string(mSettings, -+ PromiseFlatCString(aKey).get(), -+ PromiseFlatCString(aValue).get()); -+ -+ return res ? NS_OK : NS_ERROR_FAILURE; -+} -+ -+NS_IMETHODIMP -+nsGSettingsCollection::SetBoolean(const nsACString& aKey, -+ PRBool aValue) -+{ -+ _g_settings_set_boolean_fn _g_settings_set_boolean = -+ (_g_settings_set_boolean_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_set_boolean"); -+ if (!_g_settings_set_boolean) -+ return NS_ERROR_FAILURE; -+ -+ gboolean res = _g_settings_set_boolean(mSettings, -+ PromiseFlatCString(aKey).get(), -+ aValue); -+ -+ return res ? NS_OK : NS_ERROR_FAILURE; -+} -+ -+NS_IMETHODIMP -+nsGSettingsCollection::SetInt(const nsACString& aKey, -+ PRInt32 aValue) -+{ -+ _g_settings_set_int_fn _g_settings_set_int = -+ (_g_settings_set_int_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_set_int"); -+ if (!_g_settings_set_int) -+ return NS_ERROR_FAILURE; -+ -+ gboolean res = _g_settings_set_int(mSettings, -+ PromiseFlatCString(aKey).get(), -+ aValue); -+ -+ return res ? NS_OK : NS_ERROR_FAILURE; -+} -+ -+NS_IMETHODIMP -+nsGSettingsCollection::GetString(const nsACString& aKey, -+ nsACString& aResult) -+{ -+ _g_settings_get_string_fn _g_settings_get_string = -+ (_g_settings_get_string_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_get_string"); -+ if (!_g_settings_get_string) -+ return NS_ERROR_FAILURE; -+ -+ char *result = _g_settings_get_string(mSettings, -+ PromiseFlatCString(aKey).get()); -+ if (!result) -+ return NS_ERROR_FAILURE; -+ -+ aResult.Assign(result); -+ g_free(result); -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+nsGSettingsCollection::GetBoolean(const nsACString& aKey, -+ PRBool* aResult) -+{ -+ _g_settings_get_boolean_fn _g_settings_get_boolean = -+ (_g_settings_get_boolean_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_get_boolean"); -+ if (!_g_settings_get_boolean) -+ return NS_ERROR_FAILURE; -+ -+ gboolean res = _g_settings_get_boolean(mSettings, -+ PromiseFlatCString(aKey).get()); -+ *aResult = res ? PR_TRUE : PR_FALSE; -+ -+ return NS_OK; -+} -+ -+NS_IMETHODIMP -+nsGSettingsCollection::GetInt(const nsACString& aKey, -+ PRInt32* aResult) -+{ -+ _g_settings_get_int_fn _g_settings_get_int = -+ (_g_settings_get_int_fn) PR_FindFunctionSymbol(gioLib, -+ "g_settings_get_int"); -+ if (!_g_settings_get_int) -+ return NS_ERROR_FAILURE; -+ -+ *aResult = _g_settings_get_int(mSettings, -+ PromiseFlatCString(aKey).get()); -+ -+ return NS_OK; -+} -+ -+nsresult -+nsGSettingsService::Init() -+{ -+ if (!gioLib) { -+ gioLib = PR_LoadLibrary("libgio-2.0.so.0"); -+ } -+ -+ _g_settings_new = (_g_settings_new_fn) -+ PR_FindFunctionSymbol(gioLib, "g_settings_new"); -+ _g_settings_list_schemas = (_g_settings_list_schemas_fn) -+ PR_FindFunctionSymbol(gioLib, "g_settings_list_schemas"); -+ -+ if (!_g_settings_new || !_g_settings_list_schemas) { -+ PR_UnloadLibrary(gioLib); -+ return NS_ERROR_FAILURE; -+ } -+ -+ return NS_OK; -+} -+ -+NS_IMPL_ISUPPORTS1(nsGSettingsService, nsIGSettingsService) -+ -+nsGSettingsService::~nsGSettingsService() -+{ -+ if (gioLib) { -+ PR_UnloadLibrary(gioLib); -+ gioLib = nsnull; -+ } -+} -+ -+NS_IMETHODIMP -+nsGSettingsService::GetCollectionForSchema(const nsACString& schema, -+ nsIGSettingsCollection** collection) -+{ -+ const char * const *schemas = _g_settings_list_schemas(); -+ unsigned int i = 0; -+ -+ for (i = 0; schemas[i] != NULL; i++) { -+ if (strcmp(schemas[i], PromiseFlatCString(schema).get()) == 0) { -+ GSettings *settings = _g_settings_new(PromiseFlatCString(schema).get()); -+ nsGSettingsCollection *mozGSettings = new nsGSettingsCollection(settings); -+ NS_ADDREF(*collection = mozGSettings); -+ return NS_OK; -+ } -+ } -+ -+ return NS_ERROR_FAILURE; -+} -diff --git a/toolkit/system/gnome/nsGSettingsService.h b/toolkit/system/gnome/nsGSettingsService.h -new file mode 100644 ---- /dev/null -+++ b/toolkit/system/gnome/nsGSettingsService.h -@@ -0,0 +1,60 @@ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -+/* ***** BEGIN LICENSE BLOCK ***** -+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 -+ * -+ * The contents of this file are subject to the Mozilla Public License Version -+ * 1.1 (the "License"); you may not use this file except in compliance with -+ * the License. You may obtain a copy of the License at -+ * http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS IS" basis, -+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -+ * for the specific language governing rights and limitations under the -+ * License. -+ * -+ * The Original Code is the Mozilla GNOME integration code. -+ * -+ * The Initial Developer of the Original Code is -+ * Canonical Ltd. -+ * Portions created by the Initial Developer are Copyright (C) 2010 -+ * the Initial Developer. All Rights Reserved. -+ * -+ * Contributor(s): -+ * Chris Coulson <chris.coulson@canonical.com> -+ * -+ * Alternatively, the contents of this file may be used under the terms of -+ * either the GNU General Public License Version 2 or later (the "GPL"), or -+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -+ * in which case the provisions of the GPL or the LGPL are applicable instead -+ * of those above. If you wish to allow use of your version of this file only -+ * under the terms of either the GPL or the LGPL, and not to allow others to -+ * use your version of this file under the terms of the MPL, indicate your -+ * decision by deleting the provisions above and replace them with the notice -+ * and other provisions required by the GPL or the LGPL. If you do not delete -+ * the provisions above, a recipient may use your version of this file under -+ * the terms of any one of the MPL, the GPL or the LGPL. -+ * -+ * ***** END LICENSE BLOCK ***** */ -+ -+#ifndef nsGSettingsService_h_ -+#define nsGSettingsService_h_ -+ -+#include "nsIGSettingsService.h" -+ -+#define NS_GSETTINGSSERVICE_CID \ -+{0xbfd4a9d8, 0xd886, 0x4161, {0x81, 0xef, 0x88, 0x68, 0xda, 0x11, 0x41, 0x70}} -+ -+class nsGSettingsService : public nsIGSettingsService -+{ -+public: -+ NS_DECL_ISUPPORTS -+ NS_DECL_NSIGSETTINGSSERVICE -+ -+ NS_HIDDEN_(nsresult) Init(); -+ -+private: -+ ~nsGSettingsService(); -+}; -+ -+#endif -+ -diff --git a/toolkit/system/gnome/nsGnomeModule.cpp b/toolkit/system/gnome/nsGnomeModule.cpp ---- a/toolkit/system/gnome/nsGnomeModule.cpp -+++ b/toolkit/system/gnome/nsGnomeModule.cpp -@@ -44,62 +44,67 @@ - NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGConfService, Init) - #endif - #ifdef MOZ_ENABLE_GNOMEVFS - #include "nsGnomeVFSService.h" - NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGnomeVFSService, Init) - #endif - #ifdef MOZ_ENABLE_GIO - #include "nsGIOService.h" -+#include "nsGSettingsService.h" - NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGIOService, Init) -+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGSettingsService, Init) - #endif - #ifdef MOZ_ENABLE_LIBNOTIFY - #include "nsAlertsService.h" - NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsAlertsService, Init) - #endif - - #ifdef MOZ_ENABLE_GCONF - NS_DEFINE_NAMED_CID(NS_GCONFSERVICE_CID); - #endif - #ifdef MOZ_ENABLE_GNOMEVFS - NS_DEFINE_NAMED_CID(NS_GNOMEVFSSERVICE_CID); - #endif - #ifdef MOZ_ENABLE_GIO - NS_DEFINE_NAMED_CID(NS_GIOSERVICE_CID); -+NS_DEFINE_NAMED_CID(NS_GSETTINGSSERVICE_CID); - #endif - #ifdef MOZ_ENABLE_LIBNOTIFY - NS_DEFINE_NAMED_CID(NS_SYSTEMALERTSSERVICE_CID); - #endif - - - static const mozilla::Module::CIDEntry kGnomeCIDs[] = { - #ifdef MOZ_ENABLE_GCONF - { &kNS_GCONFSERVICE_CID, false, NULL, nsGConfServiceConstructor }, - #endif - #ifdef MOZ_ENABLE_GNOMEVFS - { &kNS_GNOMEVFSSERVICE_CID, false, NULL, nsGnomeVFSServiceConstructor }, - #endif - #ifdef MOZ_ENABLE_GIO - { &kNS_GIOSERVICE_CID, false, NULL, nsGIOServiceConstructor }, -+ { &kNS_GSETTINGSSERVICE_CID, false, NULL, nsGSettingsServiceConstructor }, - #endif - #ifdef MOZ_ENABLE_LIBNOTIFY - { &kNS_SYSTEMALERTSSERVICE_CID, false, NULL, nsAlertsServiceConstructor }, - #endif - { NULL } - }; - - static const mozilla::Module::ContractIDEntry kGnomeContracts[] = { - #ifdef MOZ_ENABLE_GCONF - { NS_GCONFSERVICE_CONTRACTID, &kNS_GCONFSERVICE_CID }, - #endif - #ifdef MOZ_ENABLE_GNOMEVFS - { NS_GNOMEVFSSERVICE_CONTRACTID, &kNS_GNOMEVFSSERVICE_CID }, - #endif - #ifdef MOZ_ENABLE_GIO - { NS_GIOSERVICE_CONTRACTID, &kNS_GIOSERVICE_CID }, -+ { NS_GSETTINGSSERVICE_CONTRACTID, &kNS_GSETTINGSSERVICE_CID }, - #endif - #ifdef MOZ_ENABLE_LIBNOTIFY - { NS_SYSTEMALERTSERVICE_CONTRACTID, &kNS_SYSTEMALERTSSERVICE_CID }, - #endif - { NULL } - }; - - static const mozilla::Module kGnomeModule = { -diff --git a/xpcom/system/Makefile.in b/xpcom/system/Makefile.in ---- a/xpcom/system/Makefile.in -+++ b/xpcom/system/Makefile.in -@@ -47,16 +47,17 @@ XPIDL_MODULE = xpcom_system - - XPIDLSRCS = \ - nsIXULAppInfo.idl \ - nsIXULRuntime.idl \ - nsIGConfService.idl \ - nsIGnomeVFSService.idl \ - nsIBlocklistService.idl \ - nsIGIOService.idl \ -+ nsIGSettingsService.idl \ - nsIAccelerometer.idl \ - nsIGeolocationProvider.idl \ - nsIHapticFeedback.idl \ - $(NULL) - - ifdef MOZ_CRASHREPORTER - XPIDLSRCS += nsICrashReporter.idl - endif -diff --git a/xpcom/system/nsIGSettingsService.idl b/xpcom/system/nsIGSettingsService.idl -new file mode 100644 ---- /dev/null -+++ b/xpcom/system/nsIGSettingsService.idl -@@ -0,0 +1,61 @@ -+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -+/* ***** BEGIN LICENSE BLOCK ***** -+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1 -+ * -+ * The contents of this file are subject to the Mozilla Public License Version -+ * 1.1 (the "License"); you may not use this file except in compliance with -+ * the License. You may obtain a copy of the License at -+ * http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS IS" basis, -+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -+ * for the specific language governing rights and limitations under the -+ * License. -+ * -+ * The Original Code is the Mozilla GNOME integration code. -+ * -+ * The Initial Developer of the Original Code is -+ * Canonical Ltd. -+ * Portions created by the Initial Developer are Copyright (C) 2010 -+ * the Initial Developer. All Rights Reserved. -+ * -+ * Contributor(s): -+ * Chris Coulson <chris.coulson@canonical.com> -+ * -+ * Alternatively, the contents of this file may be used under the terms of -+ * either the GNU General Public License Version 2 or later (the "GPL"), or -+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -+ * in which case the provisions of the GPL or the LGPL are applicable instead -+ * of those above. If you wish to allow use of your version of this file only -+ * under the terms of either the GPL or the LGPL, and not to allow others to -+ * use your version of this file under the terms of the MPL, indicate your -+ * decision by deleting the provisions above and replace them with the notice -+ * and other provisions required by the GPL or the LGPL. If you do not delete -+ * the provisions above, a recipient may use your version of this file under -+ * the terms of any one of the MPL, the GPL or the LGPL. -+ * -+ * ***** END LICENSE BLOCK ***** */ -+ -+#include "nsISupports.idl" -+#include "nsIArray.idl" -+ -+[scriptable, uuid(09637d3c-3c07-40b4-aff9-1d2a0f046f3c)] -+interface nsIGSettingsCollection : nsISupports -+{ -+ void setString(in AUTF8String key, in AUTF8String value); -+ void setBoolean(in AUTF8String key, in boolean value); -+ void setInt(in AUTF8String key, in long value); -+ AUTF8String getString(in AUTF8String key); -+ boolean getBoolean(in AUTF8String key); -+ long getInt(in AUTF8String key); -+}; -+ -+[scriptable, uuid(849c088b-57d1-4f24-b7b2-3dc4acb04c0a)] -+interface nsIGSettingsService : nsISupports -+{ -+ nsIGSettingsCollection getCollectionForSchema(in AUTF8String schema); -+}; -+ -+%{C++ -+#define NS_GSETTINGSSERVICE_CONTRACTID "@mozilla.org/gsettings-service;1" -+%} - -diff --git a/browser/components/shell/src/nsGNOMEShellService.cpp b/browser/components/shell/src/nsGNOMEShellService.cpp ---- a/browser/components/shell/src/nsGNOMEShellService.cpp -+++ b/browser/components/shell/src/nsGNOMEShellService.cpp -@@ -41,16 +41,17 @@ - #include "nsILocalFile.h" - #include "nsIProperties.h" - #include "nsDirectoryServiceDefs.h" - #include "nsIPrefService.h" - #include "prenv.h" - #include "nsStringAPI.h" - #include "nsIGConfService.h" - #include "nsIGIOService.h" -+#include "nsIGSettingsService.h" - #include "nsIStringBundle.h" - #include "nsIOutputStream.h" - #include "nsIProcess.h" - #include "nsNetUtil.h" - #include "nsIDOMHTMLImageElement.h" - #include "nsIImageLoadingContent.h" - #include "imgIRequest.h" - #include "imgIContainer.h" -@@ -96,29 +97,37 @@ static const char kDocumentIconPath[] = - // GConf registry key constants - #define DG_BACKGROUND "/desktop/gnome/background" - - static const char kDesktopImageKey[] = DG_BACKGROUND "/picture_filename"; - static const char kDesktopOptionsKey[] = DG_BACKGROUND "/picture_options"; - static const char kDesktopDrawBGKey[] = DG_BACKGROUND "/draw_background"; - static const char kDesktopColorKey[] = DG_BACKGROUND "/primary_color"; - -+static const char kDesktopBGSchema[] = "org.gnome.desktop.background"; -+static const char kDesktopImageGSKey[] = "picture-uri"; -+static const char kDesktopOptionGSKey[] = "picture-options"; -+static const char kDesktopDrawBGGSKey[] = "draw-background"; -+static const char kDesktopColorGSKey[] = "primary-color"; -+ - nsresult - nsGNOMEShellService::Init() - { - nsresult rv; - -- // GConf or GIO _must_ be available, or we do not allow -+ // GConf, GSettings or GIO _must_ be available, or we do not allow - // CreateInstance to succeed. - - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); - nsCOMPtr<nsIGIOService> giovfs = - do_GetService(NS_GIOSERVICE_CONTRACTID); -+ nsCOMPtr<nsIGSettingsService> gsettings = -+ do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); - -- if (!gconf && !giovfs) -+ if (!gconf && !giovfs && !gsettings) - return NS_ERROR_NOT_AVAILABLE; - - // Check G_BROKEN_FILENAMES. If it's set, then filenames in glib use - // the locale encoding. If it's not set, they use UTF-8. - mUseLocaleFilenames = PR_GetEnv("G_BROKEN_FILENAMES") != nsnull; - - if (GetAppPathFromLauncher()) - return NS_OK; -@@ -434,27 +443,47 @@ nsGNOMEShellService::SetDesktopBackgroun - filePath.Append('/'); - filePath.Append(NS_ConvertUTF16toUTF8(brandName)); - filePath.Append("_wallpaper.png"); - - // write the image to a file in the home dir - rv = WriteImage(filePath, container); - - // if the file was written successfully, set it as the system wallpaper -+ nsCAutoString options; -+ if (aPosition == BACKGROUND_TILE) -+ options.Assign("wallpaper"); -+ else if (aPosition == BACKGROUND_STRETCH) -+ options.Assign("stretched"); -+ else -+ options.Assign("centered"); -+ -+ // Try GSettings first. If we don't have GSettings or the right schema, fall back -+ // to using GConf instead. Note that if GSettings works ok, the changes get -+ // mirrored to GConf by the gsettings->gconf bridge in gnome-settings-daemon -+ nsCOMPtr<nsIGSettingsService> gsettings = -+ do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); -+ if (gsettings) { -+ nsCOMPtr<nsIGSettingsCollection> background_settings; -+ gsettings->GetCollectionForSchema( -+ NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings)); -+ if (background_settings) { -+ filePath.Insert("file://", 0); -+ background_settings->SetString(NS_LITERAL_CSTRING(kDesktopOptionGSKey), -+ options); -+ background_settings->SetString(NS_LITERAL_CSTRING(kDesktopImageGSKey), -+ filePath); -+ background_settings->SetBoolean(NS_LITERAL_CSTRING(kDesktopDrawBGGSKey), -+ PR_TRUE); -+ return rv; -+ } -+ } -+ - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -- - if (gconf) { -- nsCAutoString options; -- if (aPosition == BACKGROUND_TILE) -- options.Assign("wallpaper"); -- else if (aPosition == BACKGROUND_STRETCH) -- options.Assign("stretched"); -- else -- options.Assign("centered"); -- - gconf->SetString(NS_LITERAL_CSTRING(kDesktopOptionsKey), options); - - // Set the image to an empty string first to force a refresh - // (since we could be writing a new image on top of an existing - // Firefox_wallpaper.png and nautilus doesn't monitor the file for changes) - gconf->SetString(NS_LITERAL_CSTRING(kDesktopImageKey), - EmptyCString()); - -@@ -466,21 +495,33 @@ nsGNOMEShellService::SetDesktopBackgroun - } - - #define COLOR_16_TO_8_BIT(_c) ((_c) >> 8) - #define COLOR_8_TO_16_BIT(_c) ((_c) << 8 | (_c)) - - NS_IMETHODIMP - nsGNOMEShellService::GetDesktopBackgroundColor(PRUint32 *aColor) - { -- nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -+ nsCOMPtr<nsIGSettingsService> gsettings = -+ do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); -+ nsCOMPtr<nsIGSettingsCollection> background_settings; -+ nsCAutoString background; -+ if (gsettings) { -+ gsettings->GetCollectionForSchema( -+ NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings)); -+ if (background_settings) { -+ background_settings->GetString(NS_LITERAL_CSTRING(kDesktopColorGSKey), -+ background); -+ } -+ } - -- nsCAutoString background; -- if (gconf) { -- gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background); -+ if (!background_settings) { -+ nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -+ if (gconf) -+ gconf->GetString(NS_LITERAL_CSTRING(kDesktopColorKey), background); - } - - if (background.IsEmpty()) { - *aColor = 0; - return NS_OK; - } - - GdkColor color; -@@ -508,22 +548,35 @@ ColorToCString(PRUint32 aColor, nsCStrin - - PR_snprintf(buf, 14, "#%04x%04x%04x", red, green, blue); - } - - NS_IMETHODIMP - nsGNOMEShellService::SetDesktopBackgroundColor(PRUint32 aColor) - { - NS_ASSERTION(aColor <= 0xffffff, "aColor has extra bits"); -+ -+ nsCAutoString colorString; -+ ColorToCString(aColor, colorString); -+ -+ nsCOMPtr<nsIGSettingsService> gsettings = -+ do_GetService(NS_GSETTINGSSERVICE_CONTRACTID); -+ if (gsettings) { -+ nsCOMPtr<nsIGSettingsCollection> background_settings; -+ gsettings->GetCollectionForSchema( -+ NS_LITERAL_CSTRING(kDesktopBGSchema), getter_AddRefs(background_settings)); -+ if (background_settings) { -+ background_settings->SetString(NS_LITERAL_CSTRING(kDesktopColorGSKey), -+ colorString); -+ return NS_OK; -+ } -+ } -+ - nsCOMPtr<nsIGConfService> gconf = do_GetService(NS_GCONFSERVICE_CONTRACTID); -- - if (gconf) { -- nsCAutoString colorString; -- ColorToCString(aColor, colorString); -- - gconf->SetString(NS_LITERAL_CSTRING(kDesktopColorKey), colorString); - } - - return NS_OK; - } - - NS_IMETHODIMP - nsGNOMEShellService::OpenApplication(PRInt32 aApplication) - |