diff -uNrBbwp palemoon-29.4.6/palemoon/platform/modules/libpref/Preferences.cpp palemoon-29.4.6-new/palemoon/platform/modules/libpref/Preferences.cpp --- palemoon-29.4.6/palemoon/platform/modules/libpref/Preferences.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/modules/libpref/Preferences.cpp 2022-05-08 01:44:48.929749239 +0000 @@ -35,6 +35,7 @@ #include "nsXPCOMCID.h" #include "nsAutoPtr.h" #include "nsPrintfCString.h" +#include "nsKDEUtils.h" #include "nsQuickSort.h" #include "PLDHashTable.h" @@ -1176,6 +1177,24 @@ static nsresult pref_LoadPrefsInDirList( if (NS_FAILED(rv)) return rv; + // make sure we load these special files after all the others + static const char* specialFiles[] = { + #if defined(XP_UNIX) + "" + #endif + }; + + if (nsKDEUtils::kdeSession()) { + for(int i = 0; + i < MOZ_ARRAY_LENGTH(specialFiles); + ++i ) { + if (*specialFiles[ i ] == '\0') { + specialFiles[ i ] = "kde.js"; + break; + } + } + } + nsCOMPtr list; dirSvc->Get(listId, NS_GET_IID(nsISimpleEnumerator), @@ -1201,7 +1220,7 @@ static nsresult pref_LoadPrefsInDirList( if (Substring(leaf, leaf.Length() - 4).EqualsLiteral(".xpi")) ReadExtensionPrefs(path); else - pref_LoadPrefsInDir(path, nullptr, 0); + pref_LoadPrefsInDir(path, specialFiles, MOZ_ARRAY_LENGTH(specialFiles)); } return NS_OK; } @@ -1303,9 +1322,21 @@ static nsresult pref_InitInitialObjects( "winpref.js" #elif defined(XP_UNIX) "unix.js" + , "" // placeholder for KDE (empty is otherwise harmless) #endif }; + if(nsKDEUtils::kdeSession()) { // TODO what if some setup actually requires the helper? + for(int i = 0; + i < MOZ_ARRAY_LENGTH(specialFiles); + ++i ) { + if( *specialFiles[ i ] == '\0' ) { + specialFiles[ i ] = "kde.js"; + break; + } + } + } + rv = pref_LoadPrefsInDir(defaultPrefDir, specialFiles, ArrayLength(specialFiles)); if (NS_FAILED(rv)) NS_WARNING("Error parsing application default preferences."); diff -uNrBbwp palemoon-29.4.6/palemoon/platform/python/mozbuild/mozpack/chrome/flags.py palemoon-29.4.6-new/palemoon/platform/python/mozbuild/mozpack/chrome/flags.py --- palemoon-29.4.6/palemoon/platform/python/mozbuild/mozpack/chrome/flags.py 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/python/mozbuild/mozpack/chrome/flags.py 2022-05-08 01:47:43.429939680 +0000 @@ -215,6 +215,7 @@ class Flags(OrderedDict): 'platform': Flag, 'xpcnativewrappers': Flag, 'tablet': Flag, + 'desktop': StringFlag, 'process': StringFlag, } RE = re.compile(r'([!<>=]+)') diff -uNrBbwp palemoon-29.4.6/palemoon/platform/python/mozbuild/mozpack/chrome/manifest.py palemoon-29.4.6-new/palemoon/platform/python/mozbuild/mozpack/chrome/manifest.py --- palemoon-29.4.6/palemoon/platform/python/mozbuild/mozpack/chrome/manifest.py 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/python/mozbuild/mozpack/chrome/manifest.py 2022-05-08 01:48:26.840430007 +0000 @@ -37,6 +37,7 @@ class ManifestEntry(object): 'abi', 'xpcnativewrappers', 'tablet', + 'desktop', 'process', ] diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/components/downloads/moz.build palemoon-29.4.6-new/palemoon/platform/toolkit/components/downloads/moz.build --- palemoon-29.4.6/palemoon/platform/toolkit/components/downloads/moz.build 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/components/downloads/moz.build 2022-05-08 01:50:21.822431291 +0000 @@ -43,6 +43,7 @@ FINAL_LIBRARY = 'xul' LOCAL_INCLUDES += [ '../protobuf', '/ipc/chromium/src', + '/toolkit/xre', 'chromium' ] diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/components/downloads/nsDownloadManager.cpp palemoon-29.4.6-new/palemoon/platform/toolkit/components/downloads/nsDownloadManager.cpp --- palemoon-29.4.6/palemoon/platform/toolkit/components/downloads/nsDownloadManager.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/components/downloads/nsDownloadManager.cpp 2022-05-08 01:58:44.293957051 +0000 @@ -61,6 +61,10 @@ #include #endif +#if defined(XP_UNIX) +#include "nsKDEUtils.h" +#endif + using namespace mozilla; using mozilla::downloads::GenerateGUID; @@ -2688,6 +2692,15 @@ nsDownload::SetState(DownloadState aStat pref->GetBoolPref(PREF_BDM_SHOWALERTONCOMPLETE, &showTaskbarAlert); if (showTaskbarAlert) { + if( nsKDEUtils::kdeSupport()) { + nsTArray command; + command.AppendElement( NS_LITERAL_CSTRING( "DOWNLOADFINISHED" )); + nsAutoString displayName; + GetDisplayName( displayName ); + command.AppendElement( nsAutoCString( ToNewUTF8String( displayName ))); + nsKDEUtils::command( command ); + } else { + // begin non-KDE block int32_t alertInterval = 2000; if (pref) pref->GetIntPref(PREF_BDM_SHOWALERTINTERVAL, &alertInterval); @@ -2729,7 +2742,7 @@ nsDownload::SetState(DownloadState aStat } } } - + } #if defined(XP_WIN) || defined(MOZ_WIDGET_GTK) nsCOMPtr fileURL = do_QueryInterface(mTarget); nsCOMPtr file; diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/content/jar.mn palemoon-29.4.6-new/palemoon/platform/toolkit/content/jar.mn --- palemoon-29.4.6/palemoon/platform/toolkit/content/jar.mn 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/content/jar.mn 2022-05-08 02:03:00.945031619 +0000 @@ -85,6 +85,8 @@ toolkit.jar: content/global/bindings/datetimebox.xml (widgets/datetimebox.xml) content/global/bindings/datetimebox.css (widgets/datetimebox.css) * 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) @@ -98,6 +100,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/remote-browser.xml (widgets/remote-browser.xml) diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/content/widgets/dialog-kde.xml palemoon-29.4.6-new/palemoon/platform/toolkit/content/widgets/dialog-kde.xml --- palemoon-29.4.6/palemoon/platform/toolkit/content/widgets/dialog-kde.xml 1970-01-01 00:00:00.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/content/widgets/dialog-kde.xml 2022-05-08 02:03:56.588096534 +0000 @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + null + (function(event) { + if (!document.documentElement.cancelDialog()) + event.preventDefault(); + }) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + (screen.availLeft + screen.availWidth)) + newX = (screen.availLeft + screen.availWidth) - window.outerWidth - 20; + + if (newY < screen.availTop) + newY = screen.availTop + 20; + if ((newY + window.outerHeight) > (screen.availTop + screen.availHeight)) + newY = (screen.availTop + screen.availHeight) - window.outerHeight - 60; + + window.moveTo( newX, newY ); + ]]> + + + + + + 0 ? xOffset : 0; + yOffset = yOffset > 0 ? yOffset : 0; + window.moveTo(xOffset, yOffset); + ]]> + + + + + + + + + + + + + + + + + + // see bug 63370 for details + this._mStrBundle = Components.classes["@mozilla.org/intl/stringbundle;1"] + .getService(Components.interfaces.nsIStringBundleService) + .createBundle("chrome://global/locale/dialog.properties"); + } + return this._mStrBundle; + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + if (!event.defaultPrevented) + this.cancelDialog(); + +#ifdef XP_MACOSX + +#else + + var btn = this.getButton(this.defaultButton); + if (btn) + btn.setAttribute("default", event.originalTarget == btn || !(event.originalTarget instanceof Components.interfaces.nsIDOMXULButtonElement)); + +#endif + + + + + + + + + + + + + + + diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/content/widgets/preferences-kde.xml palemoon-29.4.6-new/palemoon/platform/toolkit/content/widgets/preferences-kde.xml --- palemoon-29.4.6/palemoon/platform/toolkit/content/widgets/preferences-kde.xml 1970-01-01 00:00:00.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/content/widgets/preferences-kde.xml 2022-05-08 02:04:25.992073972 +0000 @@ -0,0 +1,1358 @@ + + + + %preferencesDTD; + + %globalKeysDTD; +]> + + + +# +# = Preferences Window Framework +# +# The syntax for use looks something like: +# +# +# +# +# +# +# +# +# +# +# + + + + + + elements is constructed. Its purpose is to propagate + // the values to the associated form elements + + var elements = this.getElementsByTagName("preference"); + for (let element of elements) { + if (!element._constructed) { + return; + } + } + for (let element of elements) { + element.updateElements(); + } + ]]> + + + + + + + + + + + + + + + + + + + + Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefService); + + + Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + + + this.service.getDefaultBranch(""); + + + Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranchInternal); + + + + + + + + + + + + + + + + + + + + + this.preferences.rootBranchInternal + .removeObserver(this.name, this.preferences); + + false + + + return this.getAttribute("instantApply") == "true" || this.preferences.instantApply; + + + + + + + if (val == this.name) + return val; + + this.preferences.rootBranchInternal + .removeObserver(this.name, this.preferences); + this.setAttribute('name', val); + this.preferences.rootBranchInternal + .addObserver(val, this.preferences, false); + + return val; + + + + + + + null + + + + + + + + + + + return this.preferences.rootBranch.prefIsLocked(this.name); + + + + + + return this.getAttribute("disabled") == "true"; + + + + + + + + + return parseInt(this.getAttribute("tabindex")); + + + + + + + + + + + + + + + // defer reset until preference update + this.value = undefined; + + + + false + + + + + + + + + return this._useDefault ? this.preferences.defaultBranch : this.preferences.rootBranch; + + + + false + + + + with id='" + this.id + "' and name='" + + this.name + "' has unknown type '" + this.type + "'."; + consoleService.logStringMessage(msg); + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + this.updateElements(); + + + + + + + + + +#else + title="&preferencesDefaultTitleMac.title;"> +#endif + + + + + + + + + +#ifdef XP_UNIX_GNOME + + + + + + + + + + + + + + + false + + + + + + + + + + this.setAttribute("lastSelected", val); + document.persist(this.id, "lastSelected"); + return val; + + + + + if (!this._currentPane) + this._currentPane = this.preferencePanes[0]; + + return this._currentPane; + + + null + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + 1) + aPaneElement.removeAttribute("flex"); + // Calling sizeToContent after the first prefpane is loaded + // will size the windows contents so style information is + // available to calculate correct sizing. + if (!this._initialized && prefpanes.length > 1) { + if (this._shouldAnimate) + this.style.minHeight = 0; + window.sizeToContent(); + } + + var oldPane = this.lastSelected ? document.getElementById(this.lastSelected) : this.preferencePanes[0]; + oldPane.selected = !(aPaneElement.selected = true); + this.lastSelected = aPaneElement.id; + this.currentPane = aPaneElement; + this._initialized = true; + + // Only animate if we've switched between prefpanes + if (this._shouldAnimate && oldPane.id != aPaneElement.id) { + aPaneElement.style.opacity = 0.0; + this.animate(oldPane, aPaneElement); + } + else if (!this._shouldAnimate && prefpanes.length > 1) { + var targetHeight = parseInt(window.getComputedStyle(this._paneDeckContainer, "").height); + var verticalPadding = parseInt(window.getComputedStyle(aPaneElement, "").paddingTop); + verticalPadding += parseInt(window.getComputedStyle(aPaneElement, "").paddingBottom); + if (aPaneElement.contentHeight > targetHeight - verticalPadding) { + // To workaround the bottom border of a groupbox from being + // cutoff an hbox with a class of bottomBox may enclose it. + // This needs to include its padding to resize properly. + // See bug 394433 + var bottomPadding = 0; + var bottomBox = aPaneElement.getElementsByAttribute("class", "bottomBox")[0]; + if (bottomBox) + bottomPadding = parseInt(window.getComputedStyle(bottomBox, "").paddingBottom); + window.innerHeight += bottomPadding + verticalPadding + aPaneElement.contentHeight - targetHeight; + } + + // XXX rstrong - extend the contents of the prefpane to + // prevent elements from being cutoff (see bug 349098). + if (aPaneElement.contentHeight + verticalPadding < targetHeight) + aPaneElement._content.style.height = targetHeight - verticalPadding + "px"; + } + } + break; + } + } + ]]> + + + + + + + + + + + + + + oldHeight ? 1 : -1; + var sizeDelta = Math.abs(oldHeight - aNewPane.contentHeight); + this._animateRemainder = sizeDelta % this._animateIncrement; + + this._setUpAnimationTimer(oldHeight); + ]]> + + + + + + 0 && this._currentHeight >= lastSelectedPane.contentHeight) || + (this._multiplier < 0 && this._currentHeight <= lastSelectedPane.contentHeight)) + return 0; + + if ((this._multiplier > 0 && newHeight > lastSelectedPane.contentHeight) || + (this._multiplier < 0 && newHeight < lastSelectedPane.contentHeight)) + increment = this._animateRemainder * this._multiplier; + return increment; + ]]> + + + + + + + + + + + + + + + + + + + + + + + + null + null + 15 + 40 + 5 + 0.40 + 0 + 0 + 0 + + + + + + + + + + + + + + return openDialog(aURL, "", "modal,centerscreen,resizable=no" + (aFeatures != "" ? ("," + aFeatures) : ""), aParams); + + + + + + + + + + + + + + + + + + + if (event.originalTarget.hasAttribute("pane")) { + var pane = document.getElementById(event.originalTarget.getAttribute("pane")); + this.showPane(pane); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + return document.getElementById(aElement.getAttribute("preference")); + + + + + + + + + + + + + + + + + + + + var targetHeight = parseInt(window.getComputedStyle(this._content, "").height); + targetHeight += parseInt(window.getComputedStyle(this._content, "").marginTop); + targetHeight += parseInt(window.getComputedStyle(this._content, "").marginBottom); + return targetHeight; + + + + document.getAnonymousElementByAttribute(this, "class", "content-box"); + + + + + // This "command" event handler tracks changes made to preferences by + // the user in this window. + if (event.sourceEvent) + event = event.sourceEvent; + this.userChangedValue(event.target); + + + // This "select" event handler tracks changes made to colorpicker + // preferences by the user in this window. + if (event.target.localName == "colorpicker") + this.userChangedValue(event.target); + + + // This "change" event handler tracks changes made to preferences by + // the user in this window. + this.userChangedValue(event.target); + + + // This "input" event handler tracks changes made to preferences by + // the user in this window. + this.userChangedValue(event.target); + + + + + + + + + + + + + + + + + + + +# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# +# This is PrefWindow 6. The Code Could Well Be Ready, Are You? +# +# Historical References: +# PrefWindow V (February 1, 2003) +# PrefWindow IV (April 24, 2000) +# PrefWindow III (January 6, 2000) +# PrefWindow II (???) +# PrefWindow I (June 4, 1999) +# diff -uNrBbwp palemoon-29.4.6/palemoon/platform/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp palemoon-29.4.6-new/palemoon/platform/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp --- palemoon-29.4.6/palemoon/platform/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp 2022-05-08 02:08:12.671190865 +0000 @@ -20,6 +20,8 @@ #include "nsInterfaceHashtable.h" #include "mozilla/Attributes.h" #include "nsIURI.h" +#include "nsVoidArray.h" +#include "nsKDEUtils.h" class nsUnixSystemProxySettings final : public nsISystemProxySettings { public: @@ -43,6 +45,7 @@ private: nsresult SetProxyResultFromGConf(const char* aKeyBase, const char* aType, nsACString& aResult); nsresult GetProxyFromGConf(const nsACString& aScheme, const nsACString& aHost, int32_t aPort, nsACString& aResult); nsresult GetProxyFromGSettings(const nsACString& aScheme, const nsACString& aHost, int32_t aPort, nsACString& aResult); + nsresult GetProxyFromKDE(const nsACString& aScheme, const nsACString& aHost, PRInt32 aPort, nsACString& aResult); nsresult SetProxyResultFromGSettings(const char* aKeyBase, const char* aType, nsACString& aResult); }; @@ -506,6 +509,9 @@ nsUnixSystemProxySettings::GetProxyForUR const int32_t aPort, nsACString & aResult) { + if (nsKDEUtils::kdeSupport()) + return GetProxyFromKDE(aScheme, aHost, aPort, aResult); + if (mProxySettings) { nsresult rv = GetProxyFromGSettings(aScheme, aHost, aPort, aResult); if (NS_SUCCEEDED(rv)) @@ -541,3 +547,29 @@ static const mozilla::Module kUnixProxyM }; NSMODULE_DEFN(nsUnixProxyModule) = &kUnixProxyModule; + +nsresult +nsUnixSystemProxySettings::GetProxyFromKDE(const nsACString& aScheme, + const nsACString& aHost, + PRInt32 aPort, + nsACString& aResult) +{ + nsAutoCString url; + url = aScheme; + url += "://"; + url += aHost; + if( aPort >= 0 ) + { + url += ":"; + url += nsPrintfCString("%d", aPort); + } + nsTArray command; + command.AppendElement( NS_LITERAL_CSTRING( "GETPROXY" )); + command.AppendElement( url ); + nsTArray result; + if( !nsKDEUtils::command( command, &result ) || result.Length() != 1 ) + return NS_ERROR_FAILURE; + aResult = result[0]; + return NS_OK; +} + diff -uNrBbwp palemoon-29.4.6/palemoon/platform/widget/gtk/moz.build palemoon-29.4.6-new/palemoon/platform/widget/gtk/moz.build --- palemoon-29.4.6/palemoon/platform/widget/gtk/moz.build 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/widget/gtk/moz.build 2022-05-08 02:11:08.388079995 +0000 @@ -116,6 +116,7 @@ LOCAL_INCLUDES += [ '/layout/style', '/layout/xul', '/other-licenses/atk-1.0', + '/toolkit/xre', '/widget', ] diff -uNrBbwp palemoon-29.4.6/palemoon/platform/widget/gtk/nsFilePicker.cpp palemoon-29.4.6-new/palemoon/platform/widget/gtk/nsFilePicker.cpp --- palemoon-29.4.6/palemoon/platform/widget/gtk/nsFilePicker.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/widget/gtk/nsFilePicker.cpp 2022-05-08 02:19:37.277382567 +0000 @@ -9,6 +9,7 @@ #include #include +#include #include "nsGtkUtils.h" #include "nsIFileURL.h" @@ -26,6 +27,7 @@ #include "mozilla/Preferences.h" #include "nsFilePicker.h" +#include "nsKDEUtils.h" using namespace mozilla; @@ -253,6 +255,8 @@ nsFilePicker::AppendFilter(const nsAStri { if (aFilter.EqualsLiteral("..apps")) { // No platform specific thing we can do here, really.... + // Unless it's KDE. + if( mMode != modeOpen || !nsKDEUtils::kdeSupport()) return NS_OK; } @@ -378,6 +382,23 @@ nsFilePicker::Open(nsIFilePickerShownCal if (mRunning) return NS_ERROR_NOT_AVAILABLE; + // KDE file picker is not handled via callback + if( nsKDEUtils::kdeSupport()) { + int16_t result; + mCallback = aCallback; + mRunning = true; + kdeFileDialog(&result); + if (mCallback) { + mCallback->Done(result); + mCallback = nullptr; + } else { + mResult = result; + } + mRunning = false; + return NS_OK; + } + + nsXPIDLCString title; title.Adopt(ToNewUTF8String(mTitle)); @@ -602,6 +623,235 @@ nsFilePicker::Done(void* file_chooser, g NS_RELEASE_THIS(); } +// All below functions available as of KDE5+ + +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 = GTK_WINDOW(widget->GetNativeData(NS_NATIVE_SHELLWIDGET)); + 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.Length() == 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; + } + } + + nsAutoCString directory; + if (mDisplayDirectory) { + mDisplayDirectory->GetNativePath(directory); + } else if (mPrevDisplayDirectory) { + mPrevDisplayDirectory->GetNativePath(directory); + } + + nsAutoCString 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 = "."; + + nsAutoCString filters; + PRInt32 count = mFilters.Length(); + if( count == 0 ) //just in case + filters = "*"; + else + { + filters = kdeMakeFilter( 0 ); + for (PRInt32 i = 1; i < count; ++i) + { + filters += "\n"; + filters += kdeMakeFilter( i ); + } + } + + nsTArray command; + command.AppendElement( nsAutoCString( arg )); + command.AppendElement( startdir ); + if( mMode != nsIFilePicker::modeGetFolder ) + { + command.AppendElement( filters ); + nsAutoCString selected; + selected.AppendInt( mSelectedType ); + command.AppendElement( selected ); + } + command.AppendElement( title ); + if( mMode == nsIFilePicker::modeOpenMultiple ) + command.AppendElement( NS_LITERAL_CSTRING( "MULTIPLE" )); + if( PRInt32 xid = windowToXid( mParentWidget )) + { + command.AppendElement( NS_LITERAL_CSTRING( "PARENT" )); + nsAutoCString parent; + parent.AppendInt( xid ); + command.AppendElement( parent ); + } + + nsTArray output; + if( nsKDEUtils::commandBlockUi( command, GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), &output )) + { + *aReturn = nsIFilePicker::returnOK; + mFiles.Clear(); + if( mMode != nsIFilePicker::modeGetFolder ) + { + mSelectedType = atoi( output[ 0 ].get()); + output.RemoveElementAt( 0 ); + } + if (mMode == nsIFilePicker::modeOpenMultiple) + { + mFileURL.Truncate(); + PRUint32 count = output.Length(); + for( PRUint32 i = 0; + i < count; + ++i ) + { + nsCOMPtr localfile; + nsresult rv = NS_NewNativeLocalFile( output[ i ], + PR_FALSE, + getter_AddRefs(localfile)); + if (NS_SUCCEEDED(rv)) + mFiles.AppendObject(localfile); + } + } + else + { + if( output.Length() == 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 file; + GetFile(getter_AddRefs(file)); + if (file) { + nsCOMPtr dir; + file->GetParent(getter_AddRefs(dir)); + nsCOMPtr localDir(do_QueryInterface(dir)); + if (localDir) { + localDir.swap(mPrevDisplayDirectory); + } + } + if (mMode == nsIFilePicker::modeSave) + { + nsCOMPtr file; + GetFile(getter_AddRefs(file)); + if (file) + { + bool exists = 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)); + + nsTArray command; + command.AppendElement( NS_LITERAL_CSTRING( "APPSDIALOG" )); + command.AppendElement( title ); + if( PRInt32 xid = windowToXid( mParentWidget )) + { + command.AppendElement( NS_LITERAL_CSTRING( "PARENT" )); + nsAutoCString parent; + parent.AppendInt( xid ); + command.AppendElement( parent ); + } + + nsTArray output; + if( nsKDEUtils::commandBlockUi( command, GTK_WINDOW(mParentWidget->GetNativeData(NS_NATIVE_SHELLWIDGET)), &output )) + { + *aReturn = nsIFilePicker::returnOK; + mFileURL = output.Length() > 0 ? output[ 0 ] : nsCString(); + } + else + { + *aReturn = nsIFilePicker::returnCancel; + } + return NS_OK; + } + + // All below functions available as of GTK 3.20+ void * diff -uNrBbwp palemoon-29.4.6/palemoon/platform/widget/gtk/nsFilePicker.h palemoon-29.4.6-new/palemoon/platform/widget/gtk/nsFilePicker.h --- palemoon-29.4.6/palemoon/platform/widget/gtk/nsFilePicker.h 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/widget/gtk/nsFilePicker.h 2022-05-08 02:21:10.412143643 +0000 @@ -74,6 +74,12 @@ protected: private: static nsIFile *mPrevDisplayDirectory; + bool kdeRunning(); + bool getKdeRunning(); + NS_IMETHODIMP kdeFileDialog(PRInt16 *aReturn); + NS_IMETHODIMP kdeAppsDialog(PRInt16 *aReturn); + nsCString kdeMakeFilter( int index ); + void *GtkFileChooserNew( const gchar *title, GtkWindow *parent, GtkFileChooserAction action, diff -uNrBbwp palemoon-29.4.6/palemoon/platform/xpcom/components/ManifestParser.cpp palemoon-29.4.6-new/palemoon/platform/xpcom/components/ManifestParser.cpp --- palemoon-29.4.6/palemoon/platform/xpcom/components/ManifestParser.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/xpcom/components/ManifestParser.cpp 2022-05-08 02:58:14.812421558 +0000 @@ -32,6 +32,7 @@ #include "nsIScriptError.h" #include "nsIXULAppInfo.h" #include "nsIXULRuntime.h" +#include "nsKDEUtils.h" using namespace mozilla; @@ -472,6 +473,7 @@ ParseManifest(NSLocationType aType, File NS_NAMED_LITERAL_STRING(kOs, "os"); NS_NAMED_LITERAL_STRING(kOsVersion, "osversion"); NS_NAMED_LITERAL_STRING(kABI, "abi"); + NS_NAMED_LITERAL_STRING(kDesktop, "desktop"); NS_NAMED_LITERAL_STRING(kProcess, "process"); NS_NAMED_LITERAL_STRING(kMain, "main"); @@ -529,6 +531,7 @@ ParseManifest(NSLocationType aType, File } nsAutoString osVersion; + nsAutoString desktop; #if defined(XP_WIN) #pragma warning(push) #pragma warning(disable:4996) // VC12+ deprecates GetVersionEx @@ -537,6 +540,7 @@ ParseManifest(NSLocationType aType, File nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", info.dwMajorVersion, info.dwMinorVersion); + desktop = NS_LITERAL_STRING("winxp"); } #pragma warning(pop) #elif defined(MOZ_WIDGET_COCOA) @@ -545,10 +549,13 @@ ParseManifest(NSLocationType aType, File nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", majorVersion, minorVersion); + desktop = NS_LITERAL_STRING("macosx"); + #elif defined(MOZ_WIDGET_GTK) nsTextFormatter::ssprintf(osVersion, u"%ld.%ld", gtk_major_version, gtk_minor_version); + desktop = nsKDEUtils::kdeSession() ? NS_LITERAL_STRING("kde") : NS_LITERAL_STRING("gnome"); #endif if (XRE_IsContentProcess()) { @@ -648,6 +655,7 @@ ParseManifest(NSLocationType aType, File TriState stOsVersion = eUnspecified; TriState stOs = eUnspecified; TriState stABI = eUnspecified; + TriState stDesktop = eUnspecified; TriState stProcess = eUnspecified; int flags = 0; @@ -660,6 +668,7 @@ ParseManifest(NSLocationType aType, File if (CheckStringFlag(kApplication, wtoken, appID, stApp) || CheckStringFlag(kOs, wtoken, osTarget, stOs) || CheckStringFlag(kABI, wtoken, abi, stABI) || + CheckStringFlag(kDesktop, wtoken, desktop, stDesktop) || CheckStringFlag(kProcess, wtoken, process, stProcess) || CheckVersionFlag(kOsVersion, wtoken, osVersion, stOsVersion) || CheckVersionFlag(kAppVersion, wtoken, appVersion, stAppVersion) || @@ -712,6 +721,7 @@ ParseManifest(NSLocationType aType, File stOs == eBad || stOsVersion == eBad || stABI == eBad || + stDesktop == eBad || stProcess == eBad) { continue; } diff -uNrBbwp palemoon-29.4.6/palemoon/platform/xpcom/components/moz.build palemoon-29.4.6-new/palemoon/platform/xpcom/components/moz.build --- palemoon-29.4.6/palemoon/platform/xpcom/components/moz.build 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/xpcom/components/moz.build 2022-05-08 02:59:44.784354052 +0000 @@ -48,6 +48,7 @@ LOCAL_INCLUDES += [ '../reflect/xptinfo', '/chrome', '/modules/libjar', + '/toolkit/xre', ] if 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']: diff -uNrBbwp palemoon-29.4.6/palemoon/platform/xpcom/io/nsLocalFileUnix.cpp palemoon-29.4.6-new/palemoon/platform/xpcom/io/nsLocalFileUnix.cpp --- palemoon-29.4.6/palemoon/platform/xpcom/io/nsLocalFileUnix.cpp 2022-05-07 15:30:02.000000000 +0000 +++ palemoon-29.4.6-new/palemoon/platform/xpcom/io/nsLocalFileUnix.cpp 2022-05-08 03:07:14.727013700 +0000 @@ -50,6 +50,7 @@ #ifdef MOZ_WIDGET_GTK #include "nsIGIOService.h" +#include "nsKDEUtils.h" #endif #ifdef MOZ_WIDGET_COCOA @@ -1915,18 +1916,17 @@ NS_IMETHODIMP nsLocalFile::Reveal() { #ifdef MOZ_WIDGET_GTK - nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); - if (!giovfs) { - return NS_ERROR_FAILURE; - } + + nsAutoCString url; bool isDirectory; if (NS_FAILED(IsDirectory(&isDirectory))) { return NS_ERROR_FAILURE; } + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); if (isDirectory) { - return giovfs->ShowURIForInput(mPath); + url = mPath; } else if (NS_SUCCEEDED(giovfs->OrgFreedesktopFileManager1ShowItems(mPath))) { return NS_OK; } else { @@ -1939,8 +1939,21 @@ nsLocalFile::Reveal() return NS_ERROR_FAILURE; } - return giovfs->ShowURIForInput(dirPath); + url = dirPath; + } + + if(nsKDEUtils::kdeSupport()) { + nsTArray command; + command.AppendElement( NS_LITERAL_CSTRING("REVEAL") ); + command.AppendElement( mPath ); + return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; } + + if (!giovfs) + return NS_ERROR_FAILURE; + + return giovfs->ShowURIForInput(url); + #elif defined(MOZ_WIDGET_COCOA) CFURLRef url; if (NS_SUCCEEDED(GetCFURL(&url))) { @@ -1958,6 +1971,13 @@ NS_IMETHODIMP nsLocalFile::Launch() { #ifdef MOZ_WIDGET_GTK + if( nsKDEUtils::kdeSupport()) { + nsTArray command; + command.AppendElement( NS_LITERAL_CSTRING("OPEN") ); + command.AppendElement( mPath ); + return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE; + } + nsCOMPtr giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID); if (!giovfs) { return NS_ERROR_FAILURE;