Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.2:Test
mozilla-xulrunner191
mozilla-kde.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File mozilla-kde.patch of Package mozilla-xulrunner191
--- mozilla/chrome/src/Makefile.in.sav 2009-11-05 20:08:57.000000000 +0100 +++ mozilla/chrome/src/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -86,6 +86,7 @@ EXTRA_DSO_LDOPTS = \ ifneq (,$(filter gtk2,$(MOZ_WIDGET_TOOLKIT))) EXTRA_DSO_LDOPTS += $(MOZ_GTK2_LIBS) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre endif ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT))) --- mozilla/chrome/src/nsChromeRegistry.cpp.sav 2009-11-05 20:08:57.000000000 +0100 +++ mozilla/chrome/src/nsChromeRegistry.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -114,6 +114,7 @@ #include "nsIXULAppInfo.h" #include "nsIXULRuntime.h" #include "nsPresShellIterator.h" +#include "nsKDEUtils.h" #ifdef MOZ_XUL // keep all the RDF stuff together, in case we can remove it in the far future @@ -2208,6 +2209,7 @@ nsChromeRegistry::ProcessManifestBuffer( NS_NAMED_LITERAL_STRING(kAppVersion, "appversion"); NS_NAMED_LITERAL_STRING(kOs, "os"); NS_NAMED_LITERAL_STRING(kOsVersion, "osversion"); + NS_NAMED_LITERAL_STRING(kDesktop, "desktop"); nsCOMPtr<nsIIOService> io (do_GetIOService()); if (!io) return NS_ERROR_FAILURE; @@ -2251,6 +2253,7 @@ nsChromeRegistry::ProcessManifestBuffer( } nsAutoString osVersion; + nsAutoString desktop; #if defined(XP_WIN) OSVERSIONINFO info = { sizeof(OSVERSIONINFO) }; if (GetVersionEx(&info)) { @@ -2258,6 +2261,7 @@ nsChromeRegistry::ProcessManifestBuffer( info.dwMajorVersion, info.dwMinorVersion); } + desktop = NS_LITERAL_STRING("win"); #elif defined(XP_MACOSX) long majorVersion, minorVersion; if ((Gestalt(gestaltSystemVersionMajor, &majorVersion) == noErr) && @@ -2266,10 +2270,12 @@ nsChromeRegistry::ProcessManifestBuffer( majorVersion, minorVersion); } + desktop = NS_LITERAL_STRING("macosx"); #elif defined(MOZ_WIDGET_GTK2) nsTextFormatter::ssprintf(osVersion, NS_LITERAL_STRING("%ld.%ld").get(), gtk_major_version, gtk_minor_version); + desktop = nsKDEUtils::kdeSession() ? NS_LITERAL_STRING("kde") : NS_LITERAL_STRING("gnome"); // TODO others? #endif char *token; @@ -2313,6 +2319,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOsVersion = eUnspecified; TriState stOs = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2326,6 +2333,7 @@ nsChromeRegistry::ProcessManifestBuffer( CheckFlag(kContentAccessible, wtoken, contentAccessible) || CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2337,7 +2345,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> resolved; @@ -2398,6 +2406,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOs = eUnspecified; TriState stOsVersion = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2408,6 +2417,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2419,7 +2429,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> resolved; @@ -2460,6 +2470,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOs = eUnspecified; TriState stOsVersion = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2470,6 +2481,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2481,7 +2493,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> resolved; @@ -2524,6 +2536,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOs = eUnspecified; TriState stOsVersion = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2534,6 +2547,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2545,7 +2559,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> baseuri, overlayuri; @@ -2580,6 +2594,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOs = eUnspecified; TriState stOsVersion = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2590,6 +2605,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2601,7 +2617,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> baseuri, overlayuri; @@ -2640,6 +2656,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOs = eUnspecified; TriState stOsVersion = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2650,6 +2667,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2661,7 +2679,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsCOMPtr<nsIURI> chromeuri, resolveduri; @@ -2702,6 +2720,7 @@ nsChromeRegistry::ProcessManifestBuffer( TriState stApp = eUnspecified; TriState stOsVersion = eUnspecified; TriState stOs = eUnspecified; + TriState stDesktop = eUnspecified; PRBool badFlag = PR_FALSE; @@ -2712,6 +2731,7 @@ nsChromeRegistry::ProcessManifestBuffer( if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckVersionFlag(kOsVersion, wtoken, osVersion, vc, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, vc, stAppVersion)) continue; @@ -2723,7 +2743,7 @@ nsChromeRegistry::ProcessManifestBuffer( } if (badFlag || stApp == eBad || stAppVersion == eBad || - stOs == eBad || stOsVersion == eBad) + stOs == eBad || stOsVersion == eBad || stDesktop == eBad) continue; nsDependentCString host(package); --- mozilla/modules/libpref/src/Makefile.in.sav 2009-11-05 20:09:08.000000000 +0100 +++ mozilla/modules/libpref/src/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -97,3 +97,5 @@ nsPrefService.$(OBJ_SUFFIX): nsPrefServi @$(MAKE_DEPS_AUTO_CXX) $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:-O2=-O1) $(_VPATH_SRCS) endif + +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre --- mozilla/modules/libpref/src/nsPrefService.cpp.sav 2009-11-05 20:09:08.000000000 +0100 +++ mozilla/modules/libpref/src/nsPrefService.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -51,6 +51,7 @@ #include "nsCOMArray.h" #include "nsXPCOMCID.h" #include "nsAutoPtr.h" +#include "nsKDEUtils.h" #include "nsQuickSort.h" #include "prmem.h" @@ -606,7 +607,8 @@ pref_LoadPrefsInDir(nsIFile* aDir, char return rv; } -static nsresult pref_LoadPrefsInDirList(const char *listId) +static nsresult pref_LoadPrefsInDirList(const char *listId, + char const *const *aSpecialFiles = NULL, PRUint32 aSpecialFilesCount = 0) { nsresult rv; nsCOMPtr<nsIProperties> dirSvc(do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv)); @@ -625,7 +627,7 @@ static nsresult pref_LoadPrefsInDirList( nsCOMPtr<nsIFile> dir = do_QueryInterface(elem); if (dir) { // Do we care if a file provided by this process fails to load? - pref_LoadPrefsInDir(dir, nsnull, 0); + pref_LoadPrefsInDir(dir, aSpecialFiles, aSpecialFilesCount); } } } @@ -676,6 +678,7 @@ static nsresult pref_InitInitialObjects( #if defined(MOZ_WIDGET_PHOTON) , "photon.js" #endif + , "" // placeholder for KDE (empty is otherwise harmless) #elif defined(XP_OS2) "os2pref.js" #elif defined(XP_BEOS) @@ -683,12 +686,23 @@ static nsresult pref_InitInitialObjects( #endif }; + if( nsKDEUtils::kdeSession()) { // TODO what if some setup actually requires the helper? + for( int i = 0; + i < NS_ARRAY_LENGTH(specialFiles); + ++i ) { + if( *specialFiles[ i ] == '\0' ) { + specialFiles[ i ] = "kde.js"; + break; + } + } + } + rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, NS_ARRAY_LENGTH(specialFiles)); if (NS_FAILED(rv)) { NS_WARNING("Error parsing application default preferences."); } - rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST); + rv = pref_LoadPrefsInDirList(NS_APP_PREFS_DEFAULTS_DIR_LIST, specialFiles, NS_ARRAY_LENGTH(specialFiles)); NS_ENSURE_SUCCESS(rv, rv); NS_CreateServicesFromCategory(NS_PREFSERVICE_APPDEFAULTS_TOPIC_ID, --- mozilla/toolkit/components/downloads/src/Makefile.in.sav 2009-11-05 20:09:12.000000000 +0100 +++ mozilla/toolkit/components/downloads/src/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -100,3 +100,4 @@ include $(topsrcdir)/config/rules.mk EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre --- mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp.sav 2009-11-16 15:26:47.000000000 +0100 +++ mozilla/toolkit/components/downloads/src/nsDownloadManager.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -85,6 +85,7 @@ #include "nsDocShellCID.h" #include "nsIPrivateBrowsingService.h" #include "nsNetCID.h" +#include "nsKDEUtils.h" #if defined(XP_WIN) && !defined(WINCE) #include <shlobj.h> @@ -2308,6 +2309,15 @@ nsDownload::SetState(DownloadState aStat pref->GetBoolPref(PREF_BDM_SHOWALERTONCOMPLETE, &showTaskbarAlert); if (showTaskbarAlert) { + if( nsKDEUtils::kdeSupport()) { + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "DOWNLOADFINISHED" )); + nsAutoString displayName; + GetDisplayName( displayName ); + command.AppendCString( nsCAutoString( ToNewUTF8String( displayName ))); + nsKDEUtils::command( command ); + } else { + // begin non-KDE block PRInt32 alertInterval = 2000; if (pref) pref->GetIntPref(PREF_BDM_SHOWALERTINTERVAL, &alertInterval); @@ -2343,6 +2353,7 @@ nsDownload::SetState(DownloadState aStat EmptyString()); } } + } // end non-KDE block } #if defined(XP_WIN) && !defined(WINCE) nsCOMPtr<nsIFileURL> fileURL = do_QueryInterface(mTarget); --- mozilla/toolkit/content/jar.mn.sav 2009-11-05 20:09:13.000000000 +0100 +++ mozilla/toolkit/content/jar.mn 2009-11-16 15:37:59.000000000 +0100 @@ -43,6 +43,8 @@ toolkit.jar: *+ content/global/bindings/colorpicker.xml (widgets/colorpicker.xml) *+ content/global/bindings/datetimepicker.xml (widgets/datetimepicker.xml) *+ content/global/bindings/dialog.xml (widgets/dialog.xml) +*+ content/global/bindings/dialog-kde.xml (widgets/dialog-kde.xml) +% override chrome://global/content/bindings/dialog.xml chrome://global/content/bindings/dialog-kde.xml desktop=kde *+ content/global/bindings/editor.xml (widgets/editor.xml) * content/global/bindings/expander.xml (widgets/expander.xml) * content/global/bindings/filefield.xml (widgets/filefield.xml) @@ -56,6 +58,8 @@ toolkit.jar: *+ content/global/bindings/numberbox.xml (widgets/numberbox.xml) *+ content/global/bindings/popup.xml (widgets/popup.xml) *+ content/global/bindings/preferences.xml (widgets/preferences.xml) +*+ content/global/bindings/preferences-kde.xml (widgets/preferences-kde.xml) +% override chrome://global/content/bindings/preferences.xml chrome://global/content/bindings/preferences-kde.xml desktop=kde *+ content/global/bindings/progressmeter.xml (widgets/progressmeter.xml) *+ content/global/bindings/radio.xml (widgets/radio.xml) *+ content/global/bindings/resizer.xml (widgets/resizer.xml) --- mozilla/toolkit/content/widgets/dialog-kde.xml.sav 2009-11-05 20:09:13.000000000 +0100 +++ mozilla/toolkit/content/widgets/dialog-kde.xml 2009-11-16 15:37:59.000000000 +0100 @@ -19,7 +19,7 @@ <xul:hbox class="dialog-button-box" anonid="buttons" xbl:inherits="pack=buttonpack,align=buttonalign,dir=buttondir,orient=buttonorient" -#ifdef XP_UNIX +#ifdef XP_UNIX_GNOME > <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> <xul:button dlgtype="help" class="dialog-button" hidden="true"/> @@ -28,6 +28,15 @@ <xul:spacer anonid="spacer" flex="1"/> <xul:button dlgtype="cancel" class="dialog-button"/> <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> +#elif XP_UNIX + pack="end"> + <xul:button dlgtype="help" class="dialog-button" hidden="true"/> + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> + <xul:spacer anonid="spacer" flex="1" hidden="true"/> + <xul:button dlgtype="accept" class="dialog-button" xbl:inherits="disabled=buttondisabledaccept"/> + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> + <xul:button dlgtype="cancel" class="dialog-button"/> + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> #else pack="end"> <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> --- mozilla/toolkit/content/widgets/preferences-kde.xml.sav 2009-11-05 20:09:13.000000000 +0100 +++ mozilla/toolkit/content/widgets/preferences-kde.xml 2009-11-16 15:37:59.000000000 +0100 @@ -573,7 +573,7 @@ </xul:deck> </xul:hbox> <xul:hbox anonid="dlg-buttons" class="prefWindow-dlgbuttons" -#ifdef XP_UNIX +#ifdef XP_UNIX_GNOME > <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/> @@ -582,6 +582,15 @@ <xul:spacer anonid="spacer" flex="1"/> <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/> <xul:button dlgtype="accept" class="dialog-button" icon="accept"/> +#elif XP_UNIX + pack="end"> + <xul:button dlgtype="help" class="dialog-button" hidden="true" icon="help"/> + <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> + <xul:spacer anonid="spacer" flex="1"/> + <xul:button dlgtype="accept" class="dialog-button" icon="accept"/> + <xul:button dlgtype="extra1" class="dialog-button" hidden="true"/> + <xul:button dlgtype="cancel" class="dialog-button" icon="cancel"/> + <xul:button dlgtype="disclosure" class="dialog-button" hidden="true"/> #else pack="end"> <xul:button dlgtype="extra2" class="dialog-button" hidden="true"/> --- mozilla/toolkit/system/unixproxy/Makefile.in.sav 2009-11-16 15:26:00.000000000 +0100 +++ mozilla/toolkit/system/unixproxy/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -59,6 +59,8 @@ REQUIRES = \ mozgnome \ $(NULL) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre + EXTRA_DSO_LDOPTS += \ $(MOZ_LIBPROXY_LIBS) \ $(MOZ_COMPONENT_LIBS) \ --- mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp.sav 2009-11-16 15:26:15.000000000 +0100 +++ mozilla/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -49,6 +49,8 @@ #include "nsPrintfCString.h" #include "nsNetUtil.h" #include "nsISupportsPrimitives.h" +#include "nsVoidArray.h" +#include "nsKDEUtils.h" class nsUnixSystemProxySettings : public nsISystemProxySettings { public: @@ -65,6 +67,7 @@ private: PRBool IsProxyMode(const char* aMode); nsresult SetProxyResultFromGConf(const char* aKeyBase, const char* aType, nsACString& aResult); nsresult GetProxyFromGConf(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult); + nsresult GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult); }; NS_IMPL_ISUPPORTS1(nsUnixSystemProxySettings, nsISystemProxySettings) @@ -412,6 +415,9 @@ nsUnixSystemProxySettings::GetProxyForUR rv = aURI->GetPort(&port); NS_ENSURE_SUCCESS(rv, rv); + if( nsKDEUtils::kdeSupport()) + return GetProxyFromKDE( scheme, host, port, aResult ); + if (!mGConf) return GetProxyFromEnvironment(scheme, host, port, aResult); @@ -432,3 +438,28 @@ static const nsModuleComponentInfo compo }; NS_IMPL_NSGETMODULE(nsUnixProxyModule, components) + +nsresult +nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme, + const nsACString& aHost, + PRInt32 aPort, + nsACString& aResult) +{ + nsCAutoString url; + url = aScheme; + url += "://"; + url += aHost; + if( aPort >= 0 ) + { + url += ":"; + url += nsPrintfCString("%d", aPort); + } + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "GETPROXY" )); + command.AppendCString( url ); + nsCStringArray result; + if( !nsKDEUtils::command( command, &result ) || result.Count() != 1 ) + return NS_ERROR_FAILURE; + aResult = *result[ 0 ]; + return NS_OK; +} --- mozilla/toolkit/xre/Makefile.in.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/toolkit/xre/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -98,6 +98,7 @@ endif EXPORTS = \ xrecore.h \ nsXULAppAPI.h \ + nsKDEUtils.h \ $(NULL) CPPSRCS = \ @@ -133,7 +134,7 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),beos) CPPSRCS += nsNativeAppSupportBeOS.cpp else ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) -CPPSRCS += nsNativeAppSupportUnix.cpp +CPPSRCS += nsNativeAppSupportUnix.cpp nsKDEUtils.cpp else CPPSRCS += nsNativeAppSupportDefault.cpp endif --- mozilla/toolkit/xre/nsKDEUtils.cpp.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/toolkit/xre/nsKDEUtils.cpp 2009-11-23 13:16:57.000000000 +0100 @@ -0,0 +1,335 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** 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 Unix Native App Support. + * + * The Initial Developer of the Original Code is + * Mozilla Corporation. + * Portions created by the Initial Developer are Copyright (C) 2007 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * 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 "nsKDEUtils.h" +#include "nsIWidget.h" + +#include <gtk/gtkwindow.h> +#include <gtk/gtkmain.h> + +#include <limits.h> +#include <stdio.h> +#include <sys/wait.h> +#include <unistd.h> +#include <X11/Xlib.h> + +//#define DEBUG_KDE +#ifdef DEBUG_KDE +#define KMOZILLAHELPER "kmozillahelper" +#else +// not need for lib64, it's a binary +#define KMOZILLAHELPER "/usr/lib/mozilla/kmozillahelper" +#endif + +#define KMOZILLAHELPER_VERSION 6 +#define MAKE_STR2( n ) #n +#define MAKE_STR( n ) MAKE_STR2( n ) + +static bool getKdeSession() + { + Display* dpy = XOpenDisplay( NULL ); + if( dpy == NULL ) + return false; + Atom kde_full_session = XInternAtom( dpy, "KDE_FULL_SESSION", True ); + bool kde = false; + if( kde_full_session != None ) + { + int cnt; + if( Atom* props = XListProperties( dpy, DefaultRootWindow( dpy ), &cnt )) + { + for( int i = 0; + i < cnt; + ++i ) + { + if( props[ i ] == kde_full_session ) + { + kde = true; +#ifdef DEBUG_KDE + fprintf( stderr, "KDE SESSION %d\n", kde ); +#endif + break; + } + } + XFree( props ); + } + } + XCloseDisplay( dpy ); + return kde; + } + +static bool getKdeSupport() + { + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "CHECK" )); + command.AppendCString( NS_LITERAL_CSTRING( MAKE_STR( KMOZILLAHELPER_VERSION ))); + bool kde = nsKDEUtils::command( command ); +#ifdef DEBUG_KDE + fprintf( stderr, "KDE RUNNING %d\n", kde ); +#endif + return kde; + } + +nsKDEUtils::nsKDEUtils() + : commandFile( NULL ) + , replyFile( NULL ) + { + } + +nsKDEUtils::~nsKDEUtils() + { +// closeHelper(); not actually useful, exiting will close the fd too + } + +nsKDEUtils* nsKDEUtils::self() + { + static nsKDEUtils s; + return &s; + } + +static bool helperRunning = false; +static bool helperFailed = false; + +bool nsKDEUtils::kdeSession() + { + static bool session = getKdeSession(); + return session; + } + +bool nsKDEUtils::kdeSupport() + { + static bool support = kdeSession() && getKdeSupport(); + return support && helperRunning; + } + +struct nsKDECommandData + { + FILE* file; + nsCStringArray* output; + GMainLoop* loop; + bool success; + }; + +static gboolean kdeReadFunc( GIOChannel*, GIOCondition, gpointer data ) + { + nsKDECommandData* p = static_cast< nsKDECommandData* >( data ); + char buf[ 8192 ]; // TODO big enough + bool command_done = false; + bool command_failed = false; + while( !command_done && !command_failed && fgets( buf, 8192, p->file ) != NULL ) + { // TODO what if the kernel splits a line into two chunks? +//#ifdef DEBUG_KDE +// fprintf( stderr, "READ: %s %d\n", buf, feof( p->file )); +//#endif + if( char* eol = strchr( buf, '\n' )) + *eol = '\0'; + command_done = ( strcmp( buf, "\\1" ) == 0 ); + command_failed = ( strcmp( buf, "\\0" ) == 0 ); + nsCAutoString line( buf ); + line.ReplaceSubstring( "\\n", "\n" ); + line.ReplaceSubstring( "\\" "\\", "\\" ); // \\ -> \ , i.e. unescape + if( p->output && !( command_done || command_failed )) + p->output->AppendCString( nsCString( buf )); // TODO utf8? + } + bool quit = false; + if( feof( p->file ) || command_failed ) + { + quit = true; + p->success = false; + } + if( command_done ) + { // reading one reply finished + quit = true; + p->success = true; + } + if( quit ) + { + if( p->loop ) + g_main_loop_quit( p->loop ); + return FALSE; + } + return TRUE; + } + +bool nsKDEUtils::command( const nsCStringArray& command, nsCStringArray* output ) + { + return self()->internalCommand( command, NULL, false, output ); + } + +bool nsKDEUtils::commandBlockUi( const nsCStringArray& command, const GtkWindow* parent, nsCStringArray* output ) + { + return self()->internalCommand( command, parent, true, output ); + } + +bool nsKDEUtils::internalCommand( const nsCStringArray& command, const GtkWindow* parent, bool blockUi, + nsCStringArray* output ) + { + if( !startHelper()) + return false; + // if Gtk has meanwhile gotten a grab (bnc#555202, somehow the file dialog + // is called with a delay), then do not do anything, as this app would keep + // the grabs but block waiting for the helper, which would be unable to do + // anything because of the grab + if( blockUi && gdk_pointer_is_grabbed()) + return false; + feedCommand( command ); + // do not store the data in 'this' but in extra structure, just in case there + // is reentrancy (can there be? the event loop is re-entered) + nsKDECommandData data; + data.file = replyFile; + data.output = output; + data.success = false; + if( blockUi ) + { + data.loop = g_main_loop_new( NULL, FALSE ); + GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + if( parent && parent->group ) + gtk_window_group_add_window( parent->group, GTK_WINDOW( window )); + gtk_widget_realize( window ); + gtk_widget_set_sensitive( window, TRUE ); + gtk_grab_add( window ); + GIOChannel* channel = g_io_channel_unix_new( fileno( data.file )); + g_io_add_watch( channel, static_cast< GIOCondition >( G_IO_IN | G_IO_ERR | G_IO_HUP ), kdeReadFunc, &data ); + g_io_channel_unref( channel ); + g_main_loop_run( data.loop ); + g_main_loop_unref( data.loop ); + gtk_grab_remove( window ); + gtk_widget_destroy( window ); + } + else + { + data.loop = NULL; + while( kdeReadFunc( NULL, static_cast< GIOCondition >( 0 ), &data )) + ; + } + return data.success; + } + +bool nsKDEUtils::startHelper() + { + if( helperRunning ) + return true; + if( helperFailed ) + return false; + helperFailed = true; + int fdcommand[ 2 ]; + int fdreply[ 2 ]; + if( pipe( fdcommand ) < 0 ) + return false; + if( pipe( fdreply ) < 0 ) + { + close( fdcommand[ 0 ] ); + close( fdcommand[ 1 ] ); + return false; + } + char* args[ 2 ] = { const_cast< char* >( KMOZILLAHELPER ), NULL }; + switch( fork()) + { + case -1: + { + close( fdcommand[ 0 ] ); + close( fdcommand[ 1 ] ); + close( fdreply[ 0 ] ); + close( fdreply[ 1 ] ); + return false; + } + case 0: // child + { + if( dup2( fdcommand[ 0 ], STDIN_FILENO ) < 0 ) + _exit( 1 ); + if( dup2( fdreply[ 1 ], STDOUT_FILENO ) < 0 ) + _exit( 1 ); + int maxfd = 1024; // close all other fds + struct rlimit rl; + if( getrlimit( RLIMIT_NOFILE, &rl ) == 0 ) + maxfd = rl.rlim_max; + for( int i = 3; + i < maxfd; + ++i ) + close( i ); +#ifdef DEBUG_KDE + execvp( KMOZILLAHELPER, args ); +#else + execv( KMOZILLAHELPER, args ); +#endif + _exit( 1 ); // failed + } + default: // parent + { + commandFile = fdopen( fdcommand[ 1 ], "w" ); + replyFile = fdopen( fdreply[ 0 ], "r" ); + close( fdcommand[ 0 ] ); + close( fdreply[ 1 ] ); + if( commandFile == NULL || replyFile == NULL ) + { + closeHelper(); + return false; + } + // ok, helper ready, getKdeRunning() will check if it works + } + } + helperFailed = false; + helperRunning = true; + return true; + } + +void nsKDEUtils::closeHelper() + { + if( commandFile != NULL ) + fclose( commandFile ); // this will also make the helper quit + if( replyFile != NULL ) + fclose( replyFile ); + helperRunning = false; + } + +void nsKDEUtils::feedCommand( const nsCStringArray& command ) + { + for( int i = 0; + i < command.Count(); + ++i ) + { + nsCString line = *command[ i ]; + line.ReplaceSubstring( "\\", "\\" "\\" ); // \ -> \\ , i.e. escape + line.ReplaceSubstring( "\n", "\\n" ); +#ifdef DEBUG_KDE + fprintf( stderr, "COMM: %s\n", line.get()); +#endif + fputs( line.get(), commandFile ); + fputs( "\n", commandFile ); + } + fputs( "\\E\n", commandFile ); // done as \E, so it cannot happen in normal data + fflush( commandFile ); + } --- mozilla/toolkit/xre/nsKDEUtils.h.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/toolkit/xre/nsKDEUtils.h 2009-11-16 15:37:59.000000000 +0100 @@ -0,0 +1,77 @@ +/* -*- 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 Mozilla Communicator client code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either of 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 nsKDEUtils_h__ +#define nsKDEUtils_h__ + +#include "nsStringGlue.h" +#include "nsVoidArray.h" +#include <stdio.h> + +typedef struct _GtkWindow GtkWindow; + +class NS_EXPORT nsKDEUtils + { + public: + /* Returns true if running inside a KDE session (regardless of whether there is KDE + support available for Firefox). This should be used e.g. when determining + dialog button order but not for code that requires the KDE support. */ + static bool kdeSession(); + /* Returns true if running inside a KDE session and KDE support is available + for Firefox. This should be used everywhere where the external helper is needed. */ + static bool kdeSupport(); + /* Executes the given helper command, returns true if helper returned success. */ + static bool command( const nsCStringArray& command, nsCStringArray* output = NULL ); + /* Like command(), but additionally blocks the parent widget like if there was + a modal dialog shown and enters the event loop (i.e. there are still paint updates, + this is for commands that take long). */ + static bool commandBlockUi( const nsCStringArray& command, const GtkWindow* parent, nsCStringArray* output = NULL ); + private: + nsKDEUtils(); + ~nsKDEUtils(); + static nsKDEUtils* self(); + bool startHelper(); + void closeHelper(); + void feedCommand( const nsCStringArray& command ); + bool internalCommand( const nsCStringArray& command, const GtkWindow* parent, bool isParent, + nsCStringArray* output ); + FILE* commandFile; + FILE* replyFile; + }; + +#endif // nsKDEUtils --- mozilla/uriloader/exthandler/Makefile.in.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/uriloader/exthandler/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -109,8 +109,9 @@ endif LOCAL_INCLUDES = -I$(srcdir) ifeq ($(MOZ_WIDGET_TOOLKIT),gtk2) -OSHELPER += nsGNOMERegistry.cpp +OSHELPER += nsCommonRegistry.cpp nsGNOMERegistry.cpp nsKDERegistry.cpp OSHELPER += nsMIMEInfoUnix.cpp +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre endif ifeq ($(MOZ_WIDGET_TOOLKIT),qt) --- mozilla/uriloader/exthandler/unix/nsCommonRegistry.cpp.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsCommonRegistry.cpp 2009-11-23 13:22:53.000000000 +0100 @@ -0,0 +1,87 @@ +/* -*- 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 GNOME helper app implementation. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner <bryner@brianryner.com> (Original Author) + * + * 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 "nsCommonRegistry.h" + +#include "nsGNOMERegistry.h" +#include "nsKDERegistry.h" +#include "nsString.h" +#include "nsVoidArray.h" +#include "nsKDEUtils.h" + +/* static */ PRBool +nsCommonRegistry::HandlerExists(const char *aProtocolScheme) +{ + if( nsKDEUtils::kdeSupport()) + return nsKDERegistry::HandlerExists( aProtocolScheme ); + return nsGNOMERegistry::HandlerExists( aProtocolScheme ); +} + +/* static */ nsresult +nsCommonRegistry::LoadURL(nsIURI *aURL) +{ + if( nsKDEUtils::kdeSupport()) + return nsKDERegistry::LoadURL( aURL ); + return nsGNOMERegistry::LoadURL( aURL ); +} + +/* static */ void +nsCommonRegistry::GetAppDescForScheme(const nsACString& aScheme, + nsAString& aDesc) +{ + if( nsKDEUtils::kdeSupport()) + return nsKDERegistry::GetAppDescForScheme( aScheme, aDesc ); + return nsGNOMERegistry::GetAppDescForScheme( aScheme, aDesc ); +} + + +/* static */ already_AddRefed<nsMIMEInfoBase> +nsCommonRegistry::GetFromExtension(const nsACString& aFileExt) +{ + if( nsKDEUtils::kdeSupport()) + return nsKDERegistry::GetFromExtension( aFileExt ); + return nsGNOMERegistry::GetFromExtension( aFileExt ); +} + +/* static */ already_AddRefed<nsMIMEInfoBase> +nsCommonRegistry::GetFromType(const nsACString& aMIMEType) +{ + if( nsKDEUtils::kdeSupport()) + return nsKDERegistry::GetFromType( aMIMEType ); + return nsGNOMERegistry::GetFromType( aMIMEType ); +} --- mozilla/uriloader/exthandler/unix/nsCommonRegistry.h.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsCommonRegistry.h 2009-11-16 15:37:59.000000000 +0100 @@ -0,0 +1,56 @@ +/* ***** 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 GNOME helper app implementation. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner <bryner@brianryner.com> (Original Author) + * + * 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 "nsIURI.h" +#include "nsCOMPtr.h" + +class nsMIMEInfoBase; + +class nsCommonRegistry +{ + public: + static PRBool HandlerExists(const char *aProtocolScheme); + + static nsresult LoadURL(nsIURI *aURL); + + static void GetAppDescForScheme(const nsACString& aScheme, + nsAString& aDesc); + + static already_AddRefed<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt); + + static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType); +}; --- mozilla/uriloader/exthandler/unix/nsKDERegistry.cpp.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsKDERegistry.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -0,0 +1,119 @@ +/* -*- 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 GNOME helper app implementation. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner <bryner@brianryner.com> (Original Author) + * + * 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 "nsKDERegistry.h" +#include "prlink.h" +#include "prmem.h" +#include "nsString.h" +#include "nsILocalFile.h" +#include "nsMIMEInfoUnix.h" +#include "nsAutoPtr.h" +#include "nsKDEUtils.h" + +/* static */ PRBool +nsKDERegistry::HandlerExists(const char *aProtocolScheme) +{ + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "HANDLEREXISTS" )); + command.AppendCString( nsCAutoString( aProtocolScheme )); + return nsKDEUtils::command( command ); +} + +/* static */ nsresult +nsKDERegistry::LoadURL(nsIURI *aURL) +{ + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); + nsCString url; + aURL->GetSpec( url ); + command.AppendCString( url ); + return nsKDEUtils::command( command ); +} + +/* static */ void +nsKDERegistry::GetAppDescForScheme(const nsACString& aScheme, + nsAString& aDesc) +{ + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "GETAPPDESCFORSCHEME" )); + command.AppendCString( aScheme ); + nsCStringArray output; + if( nsKDEUtils::command( command, &output ) && output.Count() == 1 ) + CopyUTF8toUTF16( *output[ 0 ], aDesc ); +} + + +/* static */ already_AddRefed<nsMIMEInfoBase> +nsKDERegistry::GetFromExtension(const nsACString& aFileExt) +{ + NS_ASSERTION(aFileExt[0] != '.', "aFileExt shouldn't start with a dot"); + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "GETFROMEXTENSION" )); + command.AppendCString( aFileExt ); + return GetFromHelper( command ); +} + +/* static */ already_AddRefed<nsMIMEInfoBase> +nsKDERegistry::GetFromType(const nsACString& aMIMEType) +{ + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "GETFROMTYPE" )); + command.AppendCString( aMIMEType ); + return GetFromHelper( command ); +} + +/* static */ already_AddRefed<nsMIMEInfoBase> +nsKDERegistry::GetFromHelper(const nsCStringArray& command) +{ + nsCStringArray output; + if( nsKDEUtils::command( command, &output ) && output.Count() == 3 ) + { + nsCString mimetype = *output[ 0 ]; + nsRefPtr<nsMIMEInfoUnix> mimeInfo = new nsMIMEInfoUnix( mimetype ); + NS_ENSURE_TRUE(mimeInfo, nsnull); + nsCString description = *output[ 1 ]; + mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description)); + nsCString handlerAppName = *output[ 2 ]; + mimeInfo->SetDefaultDescription(NS_ConvertUTF8toUTF16(handlerAppName)); + mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault); + nsMIMEInfoBase* retval; + NS_ADDREF((retval = mimeInfo)); + return retval; + } + return nsnull; +} --- mozilla/uriloader/exthandler/unix/nsKDERegistry.h.sav 2009-11-16 15:37:59.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsKDERegistry.h 2009-11-16 15:37:59.000000000 +0100 @@ -0,0 +1,61 @@ +/* ***** 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 GNOME helper app implementation. + * + * The Initial Developer of the Original Code is + * IBM Corporation. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brian Ryner <bryner@brianryner.com> (Original Author) + * + * 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 "nsIURI.h" +#include "nsCOMPtr.h" + +class nsMIMEInfoBase; +class nsCAutoString; +class nsCStringArray; + +class nsKDERegistry +{ + public: + static PRBool HandlerExists(const char *aProtocolScheme); + + static nsresult LoadURL(nsIURI *aURL); + + static void GetAppDescForScheme(const nsACString& aScheme, + nsAString& aDesc); + + static already_AddRefed<nsMIMEInfoBase> GetFromExtension(const nsACString& aFileExt); + + static already_AddRefed<nsMIMEInfoBase> GetFromType(const nsACString& aMIMEType); + private: + static already_AddRefed<nsMIMEInfoBase> GetFromHelper(const nsCStringArray& command); + +}; --- mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp.sav 2009-11-16 15:25:58.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsMIMEInfoUnix.cpp 2009-11-23 13:12:28.000000000 +0100 @@ -44,18 +44,19 @@ #include "nsMIMEInfoUnix.h" -#include "nsGNOMERegistry.h" +#include "nsCommonRegistry.h" #include "nsIGnomeVFSService.h" #include "nsAutoPtr.h" #ifdef MOZ_ENABLE_DBUS #include "nsDBusHandlerApp.h" #endif +#include "nsKDEUtils.h" nsresult nsMIMEInfoUnix::LoadUriInternal(nsIURI * aURI) { - nsresult rv = nsGNOMERegistry::LoadURL(aURI); + nsresult rv = nsCommonRegistry::LoadURL(aURI); #ifdef MOZ_PLATFORM_HILDON if (NS_FAILED(rv)){ HildonURIAction *action = hildon_uri_get_default_action(mType.get(), nsnull); @@ -75,11 +76,11 @@ NS_IMETHODIMP nsMIMEInfoUnix::GetHasDefaultHandler(PRBool *_retval) { *_retval = PR_FALSE; - nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromType(mType); + nsRefPtr<nsMIMEInfoBase> mimeInfo = nsCommonRegistry::GetFromType(mType); if (!mimeInfo) { nsCAutoString ext; GetPrimaryExtension(ext); - mimeInfo = nsGNOMERegistry::GetFromExtension(ext); + mimeInfo = nsCommonRegistry::GetFromExtension(ext); } if (mimeInfo) @@ -106,6 +107,25 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns { nsCAutoString nativePath; aFile->GetNativePath(nativePath); + + if( nsKDEUtils::kdeSupport()) + { + PRBool supports; + if( NS_SUCCEEDED( GetHasDefaultHandler( &supports )) && supports ) + { + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); + command.AppendCString( nativePath ); + command.AppendCString( NS_LITERAL_CSTRING( "MIMETYPE" )); + command.AppendCString( mType ); + if( nsKDEUtils::command( command )) + return NS_OK; + } + if (!mDefaultApplication) + return NS_ERROR_FILE_NOT_FOUND; + + return LaunchWithIProcess(mDefaultApplication, nativePath); + } nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); @@ -116,7 +136,7 @@ nsMIMEInfoUnix::LaunchDefaultWithFile(ns // If we haven't got an app we try to get a valid one by searching for the // extension mapped type - nsRefPtr<nsMIMEInfoBase> mimeInfo = nsGNOMERegistry::GetFromExtension(nativePath); + nsRefPtr<nsMIMEInfoBase> mimeInfo = nsCommonRegistry::GetFromExtension(nativePath); if (mimeInfo) { nsCAutoString type; mimeInfo->GetType(type); --- mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp.sav 2009-11-16 15:25:58.000000000 +0100 +++ mozilla/uriloader/exthandler/unix/nsOSHelperAppService.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -44,7 +44,7 @@ #include "nsOSHelperAppService.h" #include "nsMIMEInfoUnix.h" #ifdef MOZ_WIDGET_GTK2 -#include "nsGNOMERegistry.h" +#include "nsCommonRegistry.h" #endif #include "nsISupports.h" #include "nsString.h" @@ -1210,7 +1210,7 @@ nsresult nsOSHelperAppService::OSProtoco #ifdef MOZ_WIDGET_GTK2 // Check the GConf registry for a protocol handler - *aHandlerExists = nsGNOMERegistry::HandlerExists(aProtocolScheme); + *aHandlerExists = nsCommonRegistry::HandlerExists(aProtocolScheme); #endif return NS_OK; @@ -1219,7 +1219,7 @@ nsresult nsOSHelperAppService::OSProtoco NS_IMETHODIMP nsOSHelperAppService::GetApplicationDescription(const nsACString& aScheme, nsAString& _retval) { #ifdef MOZ_WIDGET_GTK2 - nsGNOMERegistry::GetAppDescForScheme(aScheme, _retval); + nsCommonRegistry::GetAppDescForScheme(aScheme, _retval); return _retval.IsEmpty() ? NS_ERROR_NOT_AVAILABLE : NS_OK; #else return NS_ERROR_NOT_AVAILABLE; @@ -1315,7 +1315,7 @@ nsOSHelperAppService::GetFromExtension(c #ifdef MOZ_WIDGET_GTK2 LOG(("Looking in GNOME registry\n")); - nsMIMEInfoBase *gnomeInfo = nsGNOMERegistry::GetFromExtension(aFileExt).get(); + nsMIMEInfoBase *gnomeInfo = nsCommonRegistry::GetFromExtension(aFileExt).get(); if (gnomeInfo) { LOG(("Got MIMEInfo from GNOME registry\n")); return gnomeInfo; @@ -1441,7 +1441,7 @@ nsOSHelperAppService::GetFromType(const // get back a MIMEInfo without any extensions set. In that case we'll have // to look in our mime.types files for the extensions. LOG(("Looking in GNOME registry\n")); - gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType).get(); + gnomeInfo = nsCommonRegistry::GetFromType(aMIMEType).get(); if (gnomeInfo && gnomeInfo->HasExtensions()) { LOG(("Got MIMEInfo from GNOME registry, and it has extensions set\n")); return gnomeInfo; --- mozilla/widget/src/gtk2/Makefile.in.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/widget/src/gtk2/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -182,6 +182,8 @@ INCLUDES += \ -I$(topsrcdir)/other-licenses/atk-1.0 \ $(NULL) +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre + test_container: mozdrawingarea.o mozcontainer.o test_container.c $(CC) $(MOZ_GTK2_CFLAGS) -o test_container test_container.c \ mozdrawingarea.o mozcontainer.o \ --- mozilla/widget/src/gtk2/nsFilePicker.cpp.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/widget/src/gtk2/nsFilePicker.cpp 2009-11-16 15:59:10.000000000 +0100 @@ -40,6 +40,7 @@ #include <gtk/gtkstock.h> #include <gtk/gtkmessagedialog.h> #include <gtk/gtkimage.h> +#include <gdk/gdkx.h> #include "nsIFileURL.h" #include "nsIURI.h" @@ -59,6 +60,7 @@ #include "nsFilePicker.h" #include "nsAccessibilityHelper.h" +#include "nsKDEUtils.h" #define DECL_FUNC_PTR(func) static _##func##_fn _##func #define GTK_FILE_CHOOSER(widget) ((GtkFileChooser*) widget) @@ -95,6 +97,7 @@ typedef GtkWidget* (*_gtk_file_chooser_d GtkFileChooserAction action, const gchar *first_button_text, ...); +typedef void (*_gtk_dialog_set_alternative_button_order_fn)(GtkDialog *dialog, gint first_response_id, ...); typedef void (*_gtk_file_chooser_set_select_multiple_fn)(GtkFileChooser* chooser, gboolean truth); typedef void (*_gtk_file_chooser_set_do_overwrite_confirmation_fn)(GtkFileChooser* chooser, gboolean do_confirm); typedef void (*_gtk_file_chooser_set_current_name_fn)(GtkFileChooser* chooser, const gchar* name); @@ -119,6 +122,7 @@ DECL_FUNC_PTR(gtk_file_chooser_get_filen DECL_FUNC_PTR(gtk_file_chooser_get_uri); DECL_FUNC_PTR(gtk_file_chooser_get_uris); DECL_FUNC_PTR(gtk_file_chooser_dialog_new); +DECL_FUNC_PTR(gtk_dialog_set_alternative_button_order); DECL_FUNC_PTR(gtk_file_chooser_set_select_multiple); DECL_FUNC_PTR(gtk_file_chooser_set_do_overwrite_confirmation); DECL_FUNC_PTR(gtk_file_chooser_set_current_name); @@ -214,6 +218,7 @@ nsFilePicker::LoadSymbolsGTK24() GET_LIBGTK_FUNC(gtk_file_chooser_get_uri); GET_LIBGTK_FUNC(gtk_file_chooser_get_uris); GET_LIBGTK_FUNC(gtk_file_chooser_dialog_new); + GET_LIBGTK_FUNC(gtk_dialog_set_alternative_button_order); GET_LIBGTK_FUNC(gtk_file_chooser_set_select_multiple); GET_LIBGTK_FUNC_OPT(gtk_file_chooser_set_do_overwrite_confirmation); GET_LIBGTK_FUNC(gtk_file_chooser_set_current_name); @@ -442,7 +447,9 @@ nsFilePicker::AppendFilter(const nsAStri { if (aFilter.EqualsLiteral("..apps")) { // No platform specific thing we can do here, really.... - return NS_OK; + // Unless it's KDE. + if( mMode != modeOpen || !nsKDEUtils::kdeSupport()) + return NS_OK; } nsCAutoString filter, name; @@ -590,6 +597,9 @@ confirm_overwrite_file (GtkWidget *paren NS_IMETHODIMP nsFilePicker::Show(PRInt16 *aReturn) { + if( nsKDEUtils::kdeSupport()) + return kdeFileDialog( aReturn ); + NS_ENSURE_ARG_POINTER(aReturn); nsXPIDLCString title; @@ -605,6 +615,12 @@ nsFilePicker::Show(PRInt16 *aReturn) GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, accept_button, GTK_RESPONSE_ACCEPT, NULL); + + _gtk_dialog_set_alternative_button_order(GTK_DIALOG(file_chooser), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + if (mAllowURLs) { _gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_chooser), FALSE); } @@ -727,3 +743,229 @@ nsFilePicker::Show(PRInt16 *aReturn) return NS_OK; } + +nsCString nsFilePicker::kdeMakeFilter( int index ) + { + nsCString buf = *mFilters[ index ]; + for( PRUint32 i = 0; + i < buf.Length(); + ++i ) + if( buf[ i ] == ';' ) // KDE separates just using spaces + buf.SetCharAt( ' ', i ); + if (!mFilterNames[index]->IsEmpty()) + { + buf += "|"; + buf += mFilterNames[index]->get(); + } + return buf; + } + +static PRInt32 windowToXid( nsIWidget* widget ) + { + GtkWindow *parent_widget = get_gtk_window_for_nsiwidget( widget ); + GdkWindow* gdk_window = gtk_widget_get_window( gtk_widget_get_toplevel( GTK_WIDGET( parent_widget ))); + return GDK_WINDOW_XID( gdk_window ); + } + +NS_IMETHODIMP nsFilePicker::kdeFileDialog(PRInt16 *aReturn) + { + NS_ENSURE_ARG_POINTER(aReturn); + + if( mMode == modeOpen && mFilters.Count() == 1 && mFilters[ 0 ]->EqualsLiteral( "..apps" )) + return kdeAppsDialog( aReturn ); + + nsXPIDLCString title; + title.Adopt(ToNewUTF8String(mTitle)); + + const char* arg = NULL; + if( mAllowURLs ) + { + switch( mMode ) + { + case nsIFilePicker::modeOpen: + case nsIFilePicker::modeOpenMultiple: + arg = "GETOPENURL"; + break; + case nsIFilePicker::modeSave: + arg = "GETSAVEURL"; + break; + case nsIFilePicker::modeGetFolder: + arg = "GETDIRECTORYURL"; + break; + } + } + else + { + switch( mMode ) + { + case nsIFilePicker::modeOpen: + case nsIFilePicker::modeOpenMultiple: + arg = "GETOPENFILENAME"; + break; + case nsIFilePicker::modeSave: + arg = "GETSAVEFILENAME"; + break; + case nsIFilePicker::modeGetFolder: + arg = "GETDIRECTORYFILENAME"; + break; + } + } + + nsCAutoString directory; + if (mDisplayDirectory) { + mDisplayDirectory->GetNativePath(directory); + } else if (mPrevDisplayDirectory) { + mPrevDisplayDirectory->GetNativePath(directory); + } + + nsCAutoString startdir; + if (!directory.IsEmpty()) { + startdir = directory; + } + if (mMode == nsIFilePicker::modeSave) { + if( !startdir.IsEmpty()) + { + startdir += "/"; + startdir += ToNewUTF8String(mDefault); + } + else + startdir = ToNewUTF8String(mDefault); + } + if( startdir.IsEmpty()) + startdir = "."; + + nsCAutoString filters; + PRInt32 count = mFilters.Count(); + if( count == 0 ) //just in case + filters = "*"; + else + { + filters = kdeMakeFilter( 0 ); + for (PRInt32 i = 1; i < count; ++i) + { + filters += "\n"; + filters += kdeMakeFilter( i ); + } + } + + nsCStringArray command; + command.AppendCString( nsCAutoString( arg )); + command.AppendCString( startdir ); + if( mMode != nsIFilePicker::modeGetFolder ) + { + command.AppendCString( filters ); + nsCAutoString selected; + selected.AppendInt( mSelectedType ); + command.AppendCString( selected ); + } + command.AppendCString( title ); + if( mMode == nsIFilePicker::modeOpenMultiple ) + command.AppendCString( NS_LITERAL_CSTRING( "MULTIPLE" )); + if( PRInt32 xid = windowToXid( mParentWidget )) + { + command.AppendCString( NS_LITERAL_CSTRING( "PARENT" )); + nsCAutoString parent; + parent.AppendInt( xid ); + command.AppendCString( parent ); + } + + nsCStringArray output; + if( nsKDEUtils::commandBlockUi( command, get_gtk_window_for_nsiwidget( mParentWidget ), &output )) + { + *aReturn = nsIFilePicker::returnOK; + mFiles.Clear(); + if( mMode != nsIFilePicker::modeGetFolder ) + { + mSelectedType = atoi( output[ 0 ]->get()); + output.RemoveCStringAt( 0 ); + } + if (mMode == nsIFilePicker::modeOpenMultiple) + { + mFileURL.Truncate(); + PRUint32 count = output.Count(); + for( PRUint32 i = 0; + i < count; + ++i ) + { + nsCOMPtr<nsILocalFile> localfile; + nsresult rv = NS_NewNativeLocalFile( *output[ i ], + PR_FALSE, + getter_AddRefs(localfile)); + if (NS_SUCCEEDED(rv)) + mFiles.AppendObject(localfile); + } + } + else + { + if( output.Count() == 0 ) + mFileURL = nsCString(); + else if( mAllowURLs ) + mFileURL = *output[ 0 ]; + else // GetFile() actually requires it to be url even for local files :-/ + { + mFileURL = nsCString( "file://" ); + mFileURL.Append( *output[ 0 ] ); + } + } + // Remember last used directory. + nsCOMPtr<nsILocalFile> file; + GetFile(getter_AddRefs(file)); + if (file) { + nsCOMPtr<nsIFile> dir; + file->GetParent(getter_AddRefs(dir)); + nsCOMPtr<nsILocalFile> localDir(do_QueryInterface(dir)); + if (localDir) { + localDir.swap(mPrevDisplayDirectory); + } + } + if (mMode == nsIFilePicker::modeSave) + { + nsCOMPtr<nsILocalFile> file; + GetFile(getter_AddRefs(file)); + if (file) + { + PRBool exists = PR_FALSE; + file->Exists(&exists); + if (exists) // TODO do overwrite check in the helper app + *aReturn = nsIFilePicker::returnReplace; + } + } + } + else + { + *aReturn = nsIFilePicker::returnCancel; + } + return NS_OK; + } + + +NS_IMETHODIMP nsFilePicker::kdeAppsDialog(PRInt16 *aReturn) + { + NS_ENSURE_ARG_POINTER(aReturn); + + nsXPIDLCString title; + title.Adopt(ToNewUTF8String(mTitle)); + + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "APPSDIALOG" )); + command.AppendCString( title ); + if( PRInt32 xid = windowToXid( mParentWidget )) + { + command.AppendCString( NS_LITERAL_CSTRING( "PARENT" )); + nsCAutoString parent; + parent.AppendInt( xid ); + command.AppendCString( parent ); + } + + nsCStringArray output; + if( nsKDEUtils::commandBlockUi( command, get_gtk_window_for_nsiwidget( mParentWidget ), &output )) + { + *aReturn = nsIFilePicker::returnOK; + mFileURL = output.Count() > 0 ? *output[ 0 ] : nsCString(); + } + else + { + *aReturn = nsIFilePicker::returnCancel; + } + return NS_OK; + } --- mozilla/widget/src/gtk2/nsFilePicker.h.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/widget/src/gtk2/nsFilePicker.h 2009-11-16 15:37:59.000000000 +0100 @@ -98,6 +98,12 @@ protected: private: static nsILocalFile *mPrevDisplayDirectory; static PRLibrary *mGTK24; + + bool kdeRunning(); + bool getKdeRunning(); + NS_IMETHODIMP kdeFileDialog(PRInt16 *aReturn); + NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn); + nsCString kdeMakeFilter( int index ); }; #endif --- mozilla/widget/src/gtk2/nsPrintDialogGTK.cpp.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/widget/src/gtk2/nsPrintDialogGTK.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -145,6 +145,10 @@ ShowCustomDialog(GtkComboBox *changed_bo GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(prompt_dialog), GTK_RESPONSE_ACCEPT); + gtk_dialog_set_alternative_button_order(GTK_DIALOG(prompt_dialog), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_REJECT, + -1); printBundle->GetStringFromName(NS_LITERAL_STRING("customHeaderFooterPrompt").get(), getter_Copies(intlString)); GtkWidget* custom_label = gtk_label_new(NS_ConvertUTF16toUTF8(intlString).get()); --- mozilla/xpcom/io/Makefile.in.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/xpcom/io/Makefile.in 2009-11-16 15:37:59.000000000 +0100 @@ -199,3 +199,4 @@ endif endif LOCAL_INCLUDES = -I.. +LOCAL_INCLUDES += -I$(topsrcdir)/toolkit/xre --- mozilla/xpcom/io/nsLocalFileUnix.cpp.sav 2009-11-05 20:09:14.000000000 +0100 +++ mozilla/xpcom/io/nsLocalFileUnix.cpp 2009-11-16 15:37:59.000000000 +0100 @@ -84,6 +84,7 @@ #ifdef MOZ_WIDGET_GTK2 #include "nsIGnomeVFSService.h" +#include "nsKDEUtils.h" #endif #include "nsNativeCharsetUtils.h" @@ -1648,16 +1649,13 @@ NS_IMETHODIMP nsLocalFile::Reveal() { #ifdef MOZ_WIDGET_GTK2 - nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); - if (!vfs) - return NS_ERROR_FAILURE; - + nsCAutoString url; PRBool isDirectory; if (NS_FAILED(IsDirectory(&isDirectory))) return NS_ERROR_FAILURE; if (isDirectory) { - return vfs->ShowURIForInput(mPath); + url = mPath; } else { nsCOMPtr<nsIFile> parentDir; nsCAutoString dirPath; @@ -1666,8 +1664,21 @@ nsLocalFile::Reveal() if (NS_FAILED(parentDir->GetNativePath(dirPath))) return NS_ERROR_FAILURE; - return vfs->ShowURIForInput(dirPath); + url = dirPath; } + + if( nsKDEUtils::kdeSupport()) { + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); + command.AppendCString( url ); + return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; + } + + nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); + if (!vfs) + return NS_ERROR_FAILURE; + return vfs->ShowURIForInput(url); + #else return NS_ERROR_FAILURE; #endif @@ -1677,6 +1688,13 @@ NS_IMETHODIMP nsLocalFile::Launch() { #ifdef MOZ_WIDGET_GTK2 + if( nsKDEUtils::kdeSupport()) { + nsCStringArray command; + command.AppendCString( NS_LITERAL_CSTRING( "OPEN" )); + command.AppendCString( mPath ); + return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; + } + nsCOMPtr<nsIGnomeVFSService> vfs = do_GetService(NS_GNOMEVFSSERVICE_CONTRACTID); if (!vfs) return NS_ERROR_FAILURE;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor