summaryrefslogtreecommitdiff
path: root/firefox-2.0-startup-notify.patch
diff options
context:
space:
mode:
Diffstat (limited to 'firefox-2.0-startup-notify.patch')
-rw-r--r--firefox-2.0-startup-notify.patch1296
1 files changed, 0 insertions, 1296 deletions
diff --git a/firefox-2.0-startup-notify.patch b/firefox-2.0-startup-notify.patch
deleted file mode 100644
index bed9346..0000000
--- a/firefox-2.0-startup-notify.patch
+++ /dev/null
@@ -1,1296 +0,0 @@
-https://bugzilla.mozilla.org/show_bug.cgi?id=223492
-
-
-Index: configure
-===================================================================
-RCS file: /cvsroot/mozilla/configure,v
-retrieving revision 1.1492.2.121
-diff -d -u -p -r1.1492.2.121 configure
---- configure 11 Jul 2007 16:44:47 -0000 1.1492.2.121
-+++ configure 25 Sep 2007 05:12:51 -0000
-@@ -83,6 +83,8 @@ ac_help="$ac_help
- ac_help="$ac_help
- --with-qtdir=\$dir Specify Qt directory "
- ac_help="$ac_help
-+ --enable-startup-notification Enable startup-notification support (default: disabled) "
-+ac_help="$ac_help
- --enable-application=APP
- Options include:
- suite
-@@ -1067,6 +1069,7 @@ GNOMEVFS_VERSION=2.0
- GNOMEUI_VERSION=2.2.0
- GCONF_VERSION=1.2.1
- LIBGNOME_VERSION=2.0
-+STARTUP_NOTIFICATION_VERSION=0.8
-
- MISSING_X=
- for ac_prog in gawk mawk nawk awk
-@@ -12906,6 +12909,137 @@ fi # COMPILE_ENVIRONMENT
-
-
-
-+if test "$MOZ_ENABLE_GTK2"
-+then
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=
-+
-+ # Check whether --enable-startup-notification or --disable-startup-notification was given.
-+if test "${enable_startup_notification+set}" = set; then
-+ enableval="$enable_startup_notification"
-+ if test "$enableval" = "yes"; then
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=force
-+ elif test "$enableval" = "no"; then
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=
-+ else
-+ { echo "configure: error: Option, startup-notification, does not take an argument ($enableval)." 1>&2; exit 1; }
-+ fi
-+fi
-+
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION"
-+ then
-+
-+ succeeded=no
-+
-+ if test -z "$PKG_CONFIG"; then
-+ # Extract the first word of "pkg-config", so it can be a program name with args.
-+set dummy pkg-config; ac_word=$2
-+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-+echo "configure:12938: checking for $ac_word" >&5
-+if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then
-+ echo $ac_n "(cached) $ac_c" 1>&6
-+else
-+ case "$PKG_CONFIG" in
-+ /*)
-+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
-+ ;;
-+ ?:/*)
-+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a dos path.
-+ ;;
-+ *)
-+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
-+ ac_dummy="$PATH"
-+ for ac_dir in $ac_dummy; do
-+ test -z "$ac_dir" && ac_dir=.
-+ if test -f $ac_dir/$ac_word; then
-+ ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
-+ break
-+ fi
-+ done
-+ IFS="$ac_save_ifs"
-+ test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
-+ ;;
-+esac
-+fi
-+PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-+if test -n "$PKG_CONFIG"; then
-+ echo "$ac_t""$PKG_CONFIG" 1>&6
-+else
-+ echo "$ac_t""no" 1>&6
-+fi
-+
-+ fi
-+
-+ if test "$PKG_CONFIG" = "no" ; then
-+ echo "*** The pkg-config script could not be found. Make sure it is"
-+ echo "*** in your path, or set the PKG_CONFIG environment variable"
-+ echo "*** to the full path to pkg-config."
-+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
-+ else
-+ PKG_CONFIG_MIN_VERSION=0.9.0
-+ if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
-+ echo $ac_n "checking for libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION""... $ac_c" 1>&6
-+echo "configure:12982: checking for libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION" >&5
-+
-+ if $PKG_CONFIG --exists "libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION" ; then
-+ echo "$ac_t""yes" 1>&6
-+ succeeded=yes
-+
-+ echo $ac_n "checking MOZ_STARTUP_NOTIFICATION_CFLAGS""... $ac_c" 1>&6
-+echo "configure:12989: checking MOZ_STARTUP_NOTIFICATION_CFLAGS" >&5
-+ MOZ_STARTUP_NOTIFICATION_CFLAGS=`$PKG_CONFIG --cflags "libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION"`
-+ echo "$ac_t""$MOZ_STARTUP_NOTIFICATION_CFLAGS" 1>&6
-+
-+ echo $ac_n "checking MOZ_STARTUP_NOTIFICATION_LIBS""... $ac_c" 1>&6
-+echo "configure:12994: checking MOZ_STARTUP_NOTIFICATION_LIBS" >&5
-+ ## don't use --libs since that can do evil things like add
-+ ## -Wl,--export-dynamic
-+ MOZ_STARTUP_NOTIFICATION_LIBS="`$PKG_CONFIG --libs-only-L \"libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION\"` `$PKG_CONFIG --libs-only-l \"libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION\"`"
-+ echo "$ac_t""$MOZ_STARTUP_NOTIFICATION_LIBS" 1>&6
-+ else
-+ MOZ_STARTUP_NOTIFICATION_CFLAGS=""
-+ MOZ_STARTUP_NOTIFICATION_LIBS=""
-+ ## If we have a custom action on failure, don't print errors, but
-+ ## do set a variable so people can do so.
-+ MOZ_STARTUP_NOTIFICATION_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION"`
-+
-+ fi
-+
-+
-+
-+ else
-+ echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
-+ echo "*** See http://www.freedesktop.org/software/pkgconfig"
-+ fi
-+ fi
-+
-+ if test $succeeded = yes; then
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=1
-+ else
-+
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION" = "force"
-+ then
-+ { echo "configure: error: * * * Could not find startup-notification >= $STARTUP_NOTIFICATION_VERSION" 1>&2; exit 1; }
-+ fi
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=
-+
-+ fi
-+
-+ fi
-+
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION"; then
-+ cat >> confdefs.h <<\EOF
-+#define MOZ_ENABLE_STARTUP_NOTIFICATION 1
-+EOF
-+
-+ fi
-+
-+ TK_LIBS="$TK_LIBS $MOZ_STARTUP_NOTIFICATION_LIBS"
-+fi
-+
-+
-+
-+
-+
-
-
-
-@@ -20426,6 +20560,9 @@ s%@MOZ_GTK2_CFLAGS@%$MOZ_GTK2_CFLAGS%g
- s%@MOZ_GTK2_LIBS@%$MOZ_GTK2_LIBS%g
- s%@HOST_MOC@%$HOST_MOC%g
- s%@MOZ_DEFAULT_TOOLKIT@%$MOZ_DEFAULT_TOOLKIT%g
-+s%@MOZ_STARTUP_NOTIFICATION_CFLAGS@%$MOZ_STARTUP_NOTIFICATION_CFLAGS%g
-+s%@MOZ_STARTUP_NOTIFICATION_LIBS@%$MOZ_STARTUP_NOTIFICATION_LIBS%g
-+s%@MOZ_ENABLE_STARTUP_NOTIFICATION@%$MOZ_ENABLE_STARTUP_NOTIFICATION%g
- s%@TK_CFLAGS@%$TK_CFLAGS%g
- s%@TK_LIBS@%$TK_LIBS%g
- s%@MOZ_ENABLE_GTK@%$MOZ_ENABLE_GTK%g
---- config/autoconf.mk.in 2006-09-14 14:07:03.000000000 -0400
-+++ config/autoconf.mk.in 2007-07-03 18:01:36.000000000 -0400
-@@ -223,6 +223,10 @@
- MOZ_GNOMEUI_CFLAGS = @MOZ_GNOMEUI_CFLAGS@
- MOZ_GNOMEUI_LIBS = @MOZ_GNOMEUI_LIBS@
-
-+MOZ_ENABLE_STARTUP_NOTIFICATION = @MOZ_ENABLE_STARTUP_NOTIFICATION@
-+MOZ_STARTUP_NOTIFICATION_CFLAGS = @MOZ_STARTUP_NOTIFICATION_CFLAGS@
-+MOZ_STARTUP_NOTIFICATION_LIBS = @MOZ_STARTUP_NOTIFICATION_LIBS@
-+
- MOZ_GNOMEVFS_CFLAGS = @MOZ_GNOMEVFS_CFLAGS@
- MOZ_GNOMEVFS_LIBS = @MOZ_GNOMEVFS_LIBS@
-
---- toolkit/components/remote/nsGTKRemoteService.cpp 2006-01-05 22:19:20.000000000 -0500
-+++ toolkit/components/remote/nsGTKRemoteService.cpp 2007-07-05 17:34:41.000000000 -0400
-@@ -50,7 +50,9 @@
-
- #include "nsIBaseWindow.h"
- #include "nsIDocShell.h"
-+#include "nsIDocument.h"
- #include "nsIDOMWindow.h"
-+#include "nsPIDOMWindow.h"
- #include "nsIGenericFactory.h"
- #include "nsILocalFile.h"
- #include "nsIObserverService.h"
-@@ -58,6 +60,8 @@
- #include "nsIServiceManager.h"
- #include "nsIWeakReference.h"
- #include "nsIWidget.h"
-+#include "nsIAppShellService.h"
-+#include "nsAppShellCID.h"
-
- #include "nsCOMPtr.h"
- #include "nsString.h"
-@@ -65,6 +69,10 @@
- #include "prenv.h"
- #include "nsCRT.h"
-
-+#ifdef MOZ_WIDGET_GTK2
-+#include "nsGTKToolkit.h"
-+#endif
-+
- #ifdef MOZ_XUL_APP
- #include "nsICommandLineRunner.h"
- #include "nsXULAppAPI.h"
-@@ -155,20 +163,46 @@
- return PL_DHASH_NEXT;
- }
-
-+static nsIWidget* GetMainWidget(nsIDOMWindow* aWindow)
-+{
-+ // get the native window for this instance
-+ nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(aWindow));
-+ NS_ENSURE_TRUE(window, nsnull);
-+ nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
-+ NS_ENSURE_TRUE(doc, nsnull);
-+ nsCOMPtr<nsISupports> container = doc->GetContainer();
-+ nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(container));
-+ NS_ENSURE_TRUE(baseWindow, nsnull);
-+
-+ nsCOMPtr<nsIWidget> mainWidget;
-+ baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
-+ return mainWidget;
-+}
-+
-+static nsGTKToolkit* GetGTKToolkit()
-+{
-+ nsCOMPtr<nsIAppShellService> svc = do_GetService(NS_APPSHELLSERVICE_CONTRACTID);
-+ if (!svc)
-+ return nsnull;
-+ nsCOMPtr<nsIDOMWindowInternal> window;
-+ svc->GetHiddenDOMWindow(getter_AddRefs(window));
-+ if (!window)
-+ return nsnull;
-+ nsIWidget* widget = GetMainWidget(window);
-+ if (!widget)
-+ return nsnull;
-+ nsIToolkit* toolkit = widget->GetToolkit();
-+ if (!toolkit)
-+ return nsnull;
-+ return NS_STATIC_CAST(nsGTKToolkit*, toolkit);
-+}
-+
-+
- NS_IMETHODIMP
- nsGTKRemoteService::RegisterWindow(nsIDOMWindow* aWindow)
- {
- // get the native window for this instance
-- nsCOMPtr<nsIScriptGlobalObject> scriptObject
-- (do_QueryInterface(aWindow));
-- NS_ENSURE_TRUE(scriptObject, NS_ERROR_FAILURE);
--
-- nsCOMPtr<nsIBaseWindow> baseWindow
-- (do_QueryInterface(scriptObject->GetDocShell()));
-- NS_ENSURE_TRUE(baseWindow, NS_ERROR_FAILURE);
--
-- nsCOMPtr<nsIWidget> mainWidget;
-- baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
-+ nsIWidget* mainWidget = GetMainWidget(aWindow);
- NS_ENSURE_TRUE(mainWidget, NS_ERROR_FAILURE);
-
- // walk up the widget tree and find the toplevel window in the
-@@ -201,7 +235,6 @@
-
- return NS_OK;
- }
--
- NS_IMETHODIMP
- nsGTKRemoteService::Shutdown()
- {
-@@ -260,7 +293,7 @@
-
- #ifndef MOZ_XUL_APP
- const char*
--nsGTKRemoteService::HandleCommand(char* aCommand, nsIDOMWindow* aWindow)
-+nsGTKRemoteService::HandleCommand(char* aCommand, nsIDOMWindow* aWindow, PRUint32 aTimestamp)
- {
- nsresult rv;
-
-@@ -283,8 +316,60 @@
- }
-
- #else //MOZ_XUL_APP
-+
-+// Set desktop startup ID to the passed ID, if there is one, so that any created
-+// windows get created with the right window manager metadata, and any windows
-+// that get new tabs and are activated also get the right WM metadata.
-+// If there is no desktop startup ID, then use the X event's timestamp
-+// for _NET_ACTIVE_WINDOW when the window gets focused or shown.
-+static void
-+SetDesktopStartupIDOrTimestamp(const nsACString& aDesktopStartupID,
-+ PRUint32 aTimestamp) {
-+#ifdef MOZ_WIDGET_GTK2
-+ nsGTKToolkit* toolkit = GetGTKToolkit();
-+ if (!toolkit)
-+ return;
-+ if (!aDesktopStartupID.IsEmpty()) {
-+ toolkit->SetDesktopStartupID(aDesktopStartupID);
-+ } else {
-+ toolkit->SetFocusTimestamp(aTimestamp);
-+ }
-+#endif
-+}
-+
-+static PRBool
-+FindExtensionParameterInCommand(const char* aParameterName,
-+ const nsACString& aCommand,
-+ char aSeparator,
-+ nsACString* aValue)
-+{
-+ nsCAutoString searchFor;
-+ searchFor.Append(aSeparator);
-+ searchFor.Append(aParameterName);
-+ searchFor.Append('=');
-+
-+ nsACString::const_iterator start, end;
-+ aCommand.BeginReading(start);
-+ aCommand.EndReading(end);
-+ if (!FindInReadable(searchFor, start, end))
-+ return PR_FALSE;
-+
-+ nsACString::const_iterator charStart, charEnd;
-+ charStart = end;
-+ aCommand.EndReading(charEnd);
-+ nsACString::const_iterator idStart = charStart, idEnd;
-+ if (FindCharInReadable(aSeparator, charStart, charEnd)) {
-+ idEnd = charStart;
-+ } else {
-+ idEnd = charEnd;
-+ }
-+ *aValue = nsDependentCSubstring(idStart, idEnd);
-+ return PR_TRUE;
-+}
-+
- const char*
--nsGTKRemoteService::HandleCommand(char* aCommand, nsIDOMWindow* aWindow)
-+nsGTKRemoteService::HandleCommand(char* aCommand, nsIDOMWindow* aWindow,
-+ PRUint32 aTimestamp)
- {
- nsresult rv;
-
-@@ -314,6 +399,12 @@
- #endif
-
- if (!command.EqualsLiteral("ping")) {
-+ nsCAutoString desktopStartupID;
-+ nsDependentCString cmd(aCommand);
-+ FindExtensionParameterInCommand("DESKTOP_STARTUP_ID",
-+ cmd, '\n',
-+ &desktopStartupID);
-+
- char* argv[3] = {"dummyappname", "-remote", aCommand};
- rv = cmdline->Init(3, argv, nsnull, nsICommandLine::STATE_REMOTE_EXPLICIT);
- if (NS_FAILED(rv))
-@@ -322,6 +413,8 @@
- if (aWindow)
- cmdline->SetWindowContext(aWindow);
-
-+ SetDesktopStartupIDOrTimestamp(desktopStartupID, aTimestamp);
-+
- rv = cmdline->Run();
- if (NS_ERROR_ABORT == rv)
- return "500 command not parseable";
-@@ -333,7 +426,8 @@
- }
-
- const char*
--nsGTKRemoteService::HandleCommandLine(char* aBuffer, nsIDOMWindow* aWindow)
-+nsGTKRemoteService::HandleCommandLine(char* aBuffer, nsIDOMWindow* aWindow,
-+ PRUint32 aTimestamp)
- {
- nsresult rv;
-
-@@ -364,6 +458,8 @@
- if (NS_FAILED(rv))
- return "509 internal error";
-
-+ nsCAutoString desktopStartupID;
-+
- char **argv = (char**) malloc(sizeof(char*) * argc);
- if (!argv) return "509 internal error";
-
-@@ -372,6 +468,12 @@
- for (int i = 0; i < argc; ++i) {
- argv[i] = aBuffer + TO_LITTLE_ENDIAN32(offset[i]);
-
-+ if (i == 0) {
-+ nsDependentCString cmd(argv[0]);
-+ FindExtensionParameterInCommand("DESKTOP_STARTUP_ID",
-+ cmd, ' ',
-+ &desktopStartupID);
-+ }
- #ifdef DEBUG_bsmedberg
- printf(" argv[%i]:\t%s\n", i, argv[i]);
- #endif
-@@ -386,7 +488,10 @@
- if (aWindow)
- cmdline->SetWindowContext(aWindow);
-
-+ SetDesktopStartupIDOrTimestamp(desktopStartupID, aTimestamp);
-+
- rv = cmdline->Run();
-+
- if (NS_ERROR_ABORT == rv)
- return "500 command not parseable";
-
-@@ -486,7 +591,7 @@
- return FALSE;
-
- // cool, we got the property data.
-- const char *response = HandleCommand(data, window);
-+ const char *response = HandleCommand(data, window, pevent->time);
-
- // put the property onto the window as the response
- XChangeProperty (GDK_DISPLAY(), GDK_WINDOW_XWINDOW(pevent->window),
-@@ -531,7 +636,7 @@
- return FALSE;
-
- // cool, we got the property data.
-- const char *response = HandleCommandLine(data, window);
-+ const char *response = HandleCommandLine(data, window, pevent->time);
-
- // put the property onto the window as the response
- XChangeProperty (GDK_DISPLAY(), GDK_WINDOW_XWINDOW(pevent->window),
---- toolkit/components/remote/nsGTKRemoteService.h 2005-04-04 19:11:42.000000000 -0400
-+++ toolkit/components/remote/nsGTKRemoteService.h 2007-07-03 18:01:36.000000000 -0400
-@@ -80,10 +80,12 @@
- nsIWeakReference* aData,
- void* aClosure);
-
-- static const char* HandleCommand(char* aCommand, nsIDOMWindow* aWindow);
-+ static const char* HandleCommand(char* aCommand, nsIDOMWindow* aWindow,
-+ PRUint32 aTimestamp);
-
- #ifdef MOZ_XUL_APP
-- static const char* HandleCommandLine(char* aBuffer, nsIDOMWindow* aWindow);
-+ static const char* HandleCommandLine(char* aBuffer, nsIDOMWindow* aWindow,
-+ PRUint32 aTimestamp);
- #endif
-
- static gboolean HandlePropertyChange(GtkWidget *widget,
---- toolkit/components/remote/Makefile.in 2005-04-08 00:59:36.000000000 -0400
-+++ toolkit/components/remote/Makefile.in 2007-07-05 17:45:55.000000000 -0400
-@@ -56,7 +56,9 @@
- string \
- appcomps \
- toolkitcomps \
-- appcomps \
-+ appshell \
-+ layout \
-+ content \
- xulapp \
- widget \
- gfx \
---- toolkit/library/Makefile.in 2007-04-03 10:32:27.000000000 -0400
-+++ toolkit/library/Makefile.in 2007-07-03 18:01:36.000000000 -0400
-@@ -357,6 +357,10 @@
- EXTRA_DSO_LDOPTS += $(MOZ_XPRINT_LDFLAGS)
- endif
-
-+ifdef MOZ_ENABLE_STARTUP_NOTIFICATION
-+EXTRA_DSO_LDOPTS += $(MOZ_STARTUP_NOTIFICATION_LIBS)
-+endif
-+
- ifdef MOZ_ENABLE_PANGO
- EXTRA_DSO_LDOPTS += $(MOZ_PANGO_LIBS)
- endif
---- toolkit/xre/nsAppRunner.cpp 2007-04-30 13:26:58.000000000 -0400
-+++ toolkit/xre/nsAppRunner.cpp 2007-07-05 17:48:51.000000000 -0400
-@@ -72,6 +72,7 @@
- #include "nsIComponentRegistrar.h"
- #include "nsIContentHandler.h"
- #include "nsIDialogParamBlock.h"
-+#include "nsIDocument.h"
- #include "nsIDOMWindow.h"
- #include "nsIEventQueueService.h"
- #include "nsIExtensionManager.h"
-@@ -99,6 +100,11 @@
- #ifdef XP_WIN
- #include "nsIWinAppHelper.h"
- #endif
-+#include "nsPIDOMWindow.h"
-+#include "nsIBaseWindow.h"
-+#include "nsIWidget.h"
-+#include "nsIDocShell.h"
-+#include "nsAppShellCID.h"
-
- #include "nsCRT.h"
- #include "nsCOMPtr.h"
-@@ -262,6 +268,9 @@
- #if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_GTK2)
- #include <gtk/gtk.h>
- #endif //MOZ_WIDGET_GTK || MOZ_WIDGET_GTK2
-+#if defined(MOZ_WIDGET_GTK2)
-+#include "nsGTKToolkit.h"
-+#endif
-
- #if defined(MOZ_WIDGET_QT)
- #include <qapplication.h>
-@@ -1105,7 +1114,7 @@
- // use int here instead of a PR type since it will be returned
- // from main - just to keep types consistent
- static int
--HandleRemoteArgument(const char* remote)
-+HandleRemoteArgument(const char* remote, const char* aDesktopStartupID)
- {
- nsresult rv;
- ArgResult ar;
-@@ -1146,7 +1155,7 @@
- nsXPIDLCString response;
- PRBool success = PR_FALSE;
- rv = client.SendCommand(program.get(), username, profile, remote,
-- getter_Copies(response), &success);
-+ aDesktopStartupID, getter_Copies(response), &success);
- // did the command fail?
- if (NS_FAILED(rv)) {
- PR_fprintf(PR_STDERR, "Error: Failed to send command: %s\n",
-@@ -1163,7 +1172,7 @@
- }
-
- static RemoteResult
--RemoteCommandLine()
-+RemoteCommandLine(const char* aDesktopStartupID)
- {
- nsresult rv;
- ArgResult ar;
-@@ -1195,7 +1204,7 @@
- nsXPIDLCString response;
- PRBool success = PR_FALSE;
- rv = client.SendCommandLine(program.get(), username, nsnull,
-- gArgc, gArgv,
-+ gArgc, gArgv, aDesktopStartupID,
- getter_Copies(response), &success);
- // did the command fail?
- if (NS_FAILED(rv) || !success)
-@@ -2059,6 +2068,53 @@
- #ifdef MOZ_WIDGET_GTK2
- #include "prlink.h"
- typedef void (*_g_set_application_name_fn)(const gchar *application_name);
-+typedef void (*_gtk_window_set_auto_startup_notification_fn)(gboolean setting);
-+
-+static PRFuncPtr FindFunction(const char* aName)
-+{
-+ PRLibrary *lib = nsnull;
-+ PRFuncPtr result = PR_FindFunctionSymbolAndLibrary(aName, &lib);
-+ // Since the library was already loaded, we can safely unload it here.
-+ if (lib) {
-+ PR_UnloadLibrary(lib);
-+ }
-+ return result;
-+}
-+
-+static nsIWidget* GetMainWidget(nsIDOMWindow* aWindow)
-+{
-+ // get the native window for this instance
-+ nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(aWindow));
-+ NS_ENSURE_TRUE(window, nsnull);
-+ nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
-+ NS_ENSURE_TRUE(doc, nsnull);
-+ nsCOMPtr<nsISupports> container = doc->GetContainer();
-+ nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(container));
-+ NS_ENSURE_TRUE(baseWindow, nsnull);
-+
-+ nsCOMPtr<nsIWidget> mainWidget;
-+ baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
-+ return mainWidget;
-+}
-+
-+static nsGTKToolkit* GetGTKToolkit()
-+{
-+ nsCOMPtr<nsIAppShellService> svc = do_GetService(NS_APPSHELLSERVICE_CONTRACTID);
-+ if (!svc)
-+ return nsnull;
-+ nsCOMPtr<nsIDOMWindowInternal> window;
-+ svc->GetHiddenDOMWindow(getter_AddRefs(window));
-+ if (!window)
-+ return nsnull;
-+ nsIWidget* widget = GetMainWidget(window);
-+ if (!widget)
-+ return nsnull;
-+ nsIToolkit* toolkit = widget->GetToolkit();
-+ if (!toolkit)
-+ return nsnull;
-+ return NS_STATIC_CAST(nsGTKToolkit*, toolkit);
-+}
-+
- #endif
-
- int
-@@ -2235,6 +2291,16 @@
- if (CheckArg("install"))
- gdk_rgb_set_install(TRUE);
-
-+#if defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_GTK2) || defined(MOZ_ENABLE_XREMOTE)
-+ // Stash DESKTOP_STARTUP_ID in malloc'ed memory becaus gtk_init will clear it.
-+#define HAVE_DESKTOP_STARTUP_ID
-+ const char* desktopStartupIDEnv = PR_GetEnv("DESKTOP_STARTUP_ID");
-+ nsCAutoString desktopStartupID;
-+ if (desktopStartupIDEnv) {
-+ desktopStartupID.Assign(desktopStartupIDEnv);
-+ }
-+#endif
-+
- // Initialize GTK+1/2 here for splash
- #if defined(MOZ_WIDGET_GTK)
- gtk_set_locale();
-@@ -2243,15 +2309,15 @@
-
- #if defined(MOZ_WIDGET_GTK2)
- // g_set_application_name () is only defined in glib2.2 and higher.
-- PRLibrary *glib2 = nsnull;
-- _g_set_application_name_fn _g_set_application_name =
-- (_g_set_application_name_fn)PR_FindFunctionSymbolAndLibrary("g_set_application_name", &glib2);
-+ _g_set_application_name_fn _g_set_application_name =
-+ (_g_set_application_name_fn)FindFunction("g_set_application_name");
- if (_g_set_application_name) {
- _g_set_application_name(gAppData->name);
- }
-- if (glib2) {
-- PR_UnloadLibrary(glib2);
-- }
-+ _gtk_window_set_auto_startup_notification_fn _gtk_window_set_auto_startup_notification =
-+ (_gtk_window_set_auto_startup_notification_fn)FindFunction("gtk_window_set_auto_startup_notification");
-+ if (_gtk_window_set_auto_startup_notification)
-+ _gtk_window_set_auto_startup_notification(PR_FALSE);
- #endif
-
- gtk_widget_set_default_visual(gdk_rgb_get_visual());
-@@ -2315,13 +2381,15 @@
- PR_fprintf(PR_STDERR, "Error: -remote requires an argument\n");
- return 1;
- }
-+ const char* desktopStartupIDPtr =
-+ desktopStartupID.IsEmpty() ? nsnull : desktopStartupID.get();
- if (ar) {
-- return HandleRemoteArgument(xremotearg);
-+ return HandleRemoteArgument(xremotearg, desktopStartupIDPtr);
- }
-
- if (!PR_GetEnv("MOZ_NO_REMOTE")) {
- // Try to remote the entire command line. If this fails, start up normally.
-- RemoteResult rr = RemoteCommandLine();
-+ RemoteResult rr = RemoteCommandLine(desktopStartupIDPtr);
- if (rr == REMOTE_FOUND)
- return 0;
- else if (rr == REMOTE_ARG_BAD)
-@@ -2533,6 +2601,13 @@
- NS_TIMELINE_LEAVE("appStartup->CreateHiddenWindow");
- NS_ENSURE_SUCCESS(rv, 1);
-
-+#if defined(HAVE_DESKTOP_STARTUP_ID) && defined(MOZ_WIDGET_GTK2)
-+ nsRefPtr<nsGTKToolkit> toolkit = GetGTKToolkit();
-+ if (toolkit && !desktopStartupID.IsEmpty()) {
-+ toolkit->SetDesktopStartupID(desktopStartupID);
-+ }
-+#endif
-+
- // Extension Compatibility Checking and Startup
- if (gAppData->flags & NS_XRE_ENABLE_EXTENSION_MANAGER) {
- nsCOMPtr<nsIExtensionManager> em(do_GetService("@mozilla.org/extensions/manager;1"));
-@@ -2713,6 +2788,21 @@
- }
- #endif
-
-+#if defined(HAVE_DESKTOP_STARTUP_ID) && defined(MOZ_TOOLKIT_GTK2)
-+ nsGTKToolkit* toolkit = GetGTKToolkit();
-+ if (toolkit) {
-+ nsCAutoString currentDesktopStartupID;
-+ toolkit->GetDesktopStartupID(&currentDesktopStartupID);
-+ if (!currentDesktopStartupID.IsEmpty()) {
-+ nsCAutoString desktopStartupEnv;
-+ desktopStartupEnv.AssignLiteral("DESKTOP_STARTUP_ID=");
-+ desktopStartupEnv.Append(currentDesktopStartupID);
-+ // Leak it with extreme prejudice!
-+ PR_SetEnv(ToNewCString(desktopStartupEnv));
-+ }
-+ }
-+#endif
-+
- rv = LaunchChild(nativeApp, appInitiatedRestart, upgraded ? -1 : 0);
- return rv == NS_ERROR_LAUNCHED_CHILD_PROCESS ? 0 : 1;
- }
---- toolkit/xre/Makefile.in 2007-02-06 02:13:20.000000000 -0500
-+++ toolkit/xre/Makefile.in 2007-07-03 18:01:36.000000000 -0400
-@@ -69,6 +69,7 @@
- shellservice \
- string \
- uriloader \
-+ layout \
- widget \
- windowwatcher \
- xpcom \
---- configure.in 2007-04-03 11:40:02.000000000 -0400
-+++ configure.in 2007-07-03 18:01:36.000000000 -0400
-@@ -125,6 +125,7 @@
- GNOMEUI_VERSION=2.2.0
- GCONF_VERSION=1.2.1
- LIBGNOME_VERSION=2.0
-+STARTUP_NOTIFICATION_VERSION=0.8
-
- dnl Set various checks
- dnl ========================================================
-@@ -4156,6 +4157,41 @@
-
- AC_SUBST(MOZ_DEFAULT_TOOLKIT)
-
-+dnl ========================================================
-+dnl = startup-notification support module
-+dnl ========================================================
-+
-+if test "$MOZ_ENABLE_GTK2"
-+then
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=
-+
-+ MOZ_ARG_ENABLE_BOOL(startup-notification,
-+ [ --enable-startup-notification Enable startup-notification support (default: disabled) ],
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=force,
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=)
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION"
-+ then
-+ PKG_CHECK_MODULES(MOZ_STARTUP_NOTIFICATION,
-+ libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION,
-+ [MOZ_ENABLE_STARTUP_NOTIFICATION=1], [
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION" = "force"
-+ then
-+ AC_MSG_ERROR([* * * Could not find startup-notification >= $STARTUP_NOTIFICATION_VERSION])
-+ fi
-+ MOZ_ENABLE_STARTUP_NOTIFICATION=
-+ ])
-+ fi
-+
-+ if test "$MOZ_ENABLE_STARTUP_NOTIFICATION"; then
-+ AC_DEFINE(MOZ_ENABLE_STARTUP_NOTIFICATION)
-+ fi
-+
-+ TK_LIBS="$TK_LIBS $MOZ_STARTUP_NOTIFICATION_LIBS"
-+fi
-+AC_SUBST(MOZ_ENABLE_STARTUP_NOTIFICATION)
-+AC_SUBST(MOZ_STARTUP_NOTIFICATION_CFLAGS)
-+AC_SUBST(MOZ_STARTUP_NOTIFICATION_LIBS)
-+
- AC_SUBST(GTK_CONFIG)
- AC_SUBST(TK_CFLAGS)
- AC_SUBST(TK_LIBS)
---- widget/src/gtk2/nsWindow.cpp 2007-04-19 14:46:03.000000000 -0400
-+++ widget/src/gtk2/nsWindow.cpp 2007-07-03 18:01:36.000000000 -0400
-@@ -40,7 +40,7 @@
- #include "prlink.h"
-
- #include "nsWindow.h"
--#include "nsToolkit.h"
-+#include "nsGTKToolkit.h"
- #include "nsIRenderingContext.h"
- #include "nsIRegion.h"
- #include "nsIRollupListener.h"
-@@ -58,6 +58,13 @@
- #include <gdk/gdkx.h>
- #include <gdk/gdkkeysyms.h>
-
-+#ifdef MOZ_ENABLE_STARTUP_NOTIFICATION
-+#define SN_API_NOT_YET_FROZEN
-+#pragma GCC visibility push(default)
-+#include <startup-notification-1.0/libsn/sn.h>
-+#pragma GCC visibility pop
-+#endif
-+
- #include "gtk2xtbin.h"
-
- #include "nsIPrefService.h"
-@@ -660,6 +665,75 @@
- return NS_ERROR_NOT_IMPLEMENTED;
- }
-
-+typedef void (* SetUserTimeFunc)(GdkWindow* aWindow, guint32 aTimestamp);
-+
-+// This will become obsolete when new GTK APIs are widely supported,
-+// as described here: http://bugzilla.gnome.org/show_bug.cgi?id=347375
-+static void
-+SetUserTimeAndStartupIDForActivatedWindow(GtkWidget* aWindow)
-+{
-+ nsCOMPtr<nsIToolkit> toolkit;
-+ NS_GetCurrentToolkit(getter_AddRefs(toolkit));
-+ if (!toolkit)
-+ return;
-+
-+ nsGTKToolkit* GTKToolkit = NS_STATIC_CAST(nsGTKToolkit*,
-+ NS_STATIC_CAST(nsIToolkit*, toolkit));
-+ nsCAutoString desktopStartupID;
-+ GTKToolkit->GetDesktopStartupID(&desktopStartupID);
-+ if (desktopStartupID.IsEmpty()) {
-+ // We don't have the data we need. Fall back to an
-+ // approximation ... using the timestamp of the remote command
-+ // being received as a guess for the timestamp of the user event
-+ // that triggered it.
-+ PRUint32 timestamp = GTKToolkit->GetFocusTimestamp();
-+ if (timestamp) {
-+ gdk_window_focus(aWindow->window, timestamp);
-+ GTKToolkit->SetFocusTimestamp(0);
-+ }
-+ return;
-+ }
-+
-+#ifdef MOZ_ENABLE_STARTUP_NOTIFICATION
-+ GdkDrawable* drawable = GDK_DRAWABLE(aWindow->window);
-+ GtkWindow* win = GTK_WINDOW(aWindow);
-+ if (!win) {
-+ NS_WARNING("Passed in widget was not a GdkWindow!");
-+ return;
-+ }
-+ GdkScreen* screen = gtk_window_get_screen(win);
-+ SnDisplay* snd =
-+ sn_display_new(gdk_x11_drawable_get_xdisplay(drawable), nsnull, nsnull);
-+ if (!snd)
-+ return;
-+ SnLauncheeContext* ctx =
-+ sn_launchee_context_new(snd, gdk_screen_get_number(screen),
-+ desktopStartupID.get());
-+ if (!ctx) {
-+ sn_display_unref(snd);
-+ return;
-+ }
-+
-+ if (sn_launchee_context_get_id_has_timestamp(ctx)) {
-+ PRLibrary* gtkLibrary;
-+ SetUserTimeFunc setUserTimeFunc = (SetUserTimeFunc)
-+ PR_FindFunctionSymbolAndLibrary("gdk_x11_window_set_user_time", &gtkLibrary);
-+ if (setUserTimeFunc) {
-+ setUserTimeFunc(aWindow->window, sn_launchee_context_get_timestamp(ctx));
-+ PR_UnloadLibrary(gtkLibrary);
-+ }
-+ }
-+
-+ sn_launchee_context_setup_window(ctx, gdk_x11_drawable_get_xid(drawable));
-+ sn_launchee_context_complete(ctx);
-+
-+ sn_launchee_context_unref(ctx);
-+ sn_display_unref(snd);
-+#endif
-+
-+ GTKToolkit->SetDesktopStartupID(EmptyCString());
-+}
-+
- NS_IMETHODIMP
- nsWindow::SetFocus(PRBool aRaise)
- {
-@@ -680,6 +754,10 @@
- // set properly.
- GtkWidget *toplevelWidget = gtk_widget_get_toplevel(owningWidget);
-
-+ if (toplevelWidget && aRaise) {
-+ SetUserTimeAndStartupIDForActivatedWindow(toplevelWidget);
-+ }
-+
- if (gRaiseWindows && aRaise && toplevelWidget &&
- !GTK_WIDGET_HAS_FOCUS(owningWidget) &&
- !GTK_WIDGET_HAS_FOCUS(toplevelWidget)) {
-@@ -1167,7 +1245,7 @@
-
- case NS_NATIVE_GRAPHIC: {
- NS_ASSERTION(nsnull != mToolkit, "NULL toolkit, unable to get a GC");
-- return (void *)NS_STATIC_CAST(nsToolkit *, mToolkit)->GetSharedGC();
-+ return (void *)NS_STATIC_CAST(nsGTKToolkit *, mToolkit)->GetSharedGC();
- break;
- }
-
-@@ -2802,13 +2880,18 @@
- // is shown.
- // XXX that may or may not be true for GTK+ 2.x
- if (mTransparencyBitmap) {
-- ApplyTransparencyBitmap();
-+ ApplyTransparencyBitmap();
- }
-
- // unset our flag now that our window has been shown
- mNeedsShow = PR_FALSE;
-
- if (mIsTopLevel) {
-+ // Set up usertime/startupID metadata for the created window.
-+ if (mWindowType != eWindowType_invisible) {
-+ SetUserTimeAndStartupIDForActivatedWindow(mShell);
-+ }
-+
- moz_drawingarea_set_visibility(mDrawingarea, aAction);
- gtk_widget_show(GTK_WIDGET(mContainer));
- gtk_widget_show(mShell);
---- widget/src/gtk2/Makefile.in 2006-06-17 11:16:14.000000000 -0400
-+++ widget/src/gtk2/Makefile.in 2007-07-03 18:01:36.000000000 -0400
-@@ -97,6 +97,7 @@
- $(MOZ_COMPONENT_LIBS) \
- -lgkgfx \
- -lgtkxtbin \
-+ $(MOZ_STARTUP_NOTIFICATION_LIBS) \
- $(XLDFLAGS) \
- $(XLIBS) \
- $(MOZ_GTK2_LIBS)
-@@ -107,14 +108,15 @@
-
- EXPORTS = \
- nsIGdkPixbufImage.h \
-+ nsGTKToolkit.h \
- mozdrawingarea.h \
- mozcontainer.h \
- $(NULL)
-
- include $(topsrcdir)/config/rules.mk
-
--CFLAGS += $(MOZ_GTK2_CFLAGS)
--CXXFLAGS += $(MOZ_GTK2_CFLAGS)
-+CFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_STARTUP_NOTIFICATION_CFLAGS)
-+CXXFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_STARTUP_NOTIFICATION_CFLAGS)
-
- DEFINES += -DUSE_XIM
-
---- widget/src/gtk2/nsToolkit.cpp 2004-04-18 18:00:17.000000000 -0400
-+++ widget/src/gtk2/nsToolkit.cpp 2007-07-03 18:01:36.000000000 -0400
-@@ -38,7 +38,7 @@
- * ***** END LICENSE BLOCK ***** */
-
- #include "nscore.h" // needed for 'nsnull'
--#include "nsToolkit.h"
-+#include "nsGTKToolkit.h"
-
- //
- // Static thread local storage index of the Toolkit
-@@ -51,9 +51,10 @@
- // constructor
- //
- //-------------------------------------------------------------------------
--nsToolkit::nsToolkit()
-+nsGTKToolkit::nsGTKToolkit()
- {
- mSharedGC = nsnull;
-+ mFocusTimestamp = 0;
- }
-
- //-------------------------------------------------------------------------
-@@ -61,7 +62,7 @@
- // destructor
- //
- //-------------------------------------------------------------------------
--nsToolkit::~nsToolkit()
-+nsGTKToolkit::~nsGTKToolkit()
- {
- if (mSharedGC) {
- gdk_gc_unref(mSharedGC);
-@@ -77,9 +78,9 @@
- //
- //-------------------------------------------------------------------------
-
--NS_IMPL_ISUPPORTS1(nsToolkit, nsIToolkit)
-+NS_IMPL_ISUPPORTS1(nsGTKToolkit, nsIToolkit)
-
--void nsToolkit::CreateSharedGC(void)
-+void nsGTKToolkit::CreateSharedGC(void)
- {
- GdkPixmap *pixmap;
-
-@@ -91,7 +92,7 @@
- gdk_pixmap_unref(pixmap);
- }
-
--GdkGC *nsToolkit::GetSharedGC(void)
-+GdkGC *nsGTKToolkit::GetSharedGC(void)
- {
- return gdk_gc_ref(mSharedGC);
- }
-@@ -100,7 +101,7 @@
- //
- //
- //-------------------------------------------------------------------------
--NS_IMETHODIMP nsToolkit::Init(PRThread *aThread)
-+NS_IMETHODIMP nsGTKToolkit::Init(PRThread *aThread)
- {
- CreateSharedGC();
-
-@@ -135,7 +136,7 @@
- // Create a new toolkit for this thread...
- //
- if (!toolkit) {
-- toolkit = new nsToolkit();
-+ toolkit = new nsGTKToolkit();
-
- if (!toolkit) {
- rv = NS_ERROR_OUT_OF_MEMORY;
---- widget/src/xremoteclient/mozilla-xremote-client.cpp 2005-04-04 15:08:51.000000000 -0400
-+++ widget/src/xremoteclient/mozilla-xremote-client.cpp 2007-07-03 18:01:36.000000000 -0400
-@@ -40,6 +40,7 @@
- #include <stdlib.h>
- #include <string.h>
- #include <plgetopt.h>
-+#include <prenv.h>
- #ifdef MOZ_WIDGET_PHOTON
- #include "PhRemoteClient.h"
- #else
-@@ -99,7 +100,7 @@
- // send the command - it doesn't get any easier than this
- PRBool success = PR_FALSE;
- char *error = 0;
-- rv = client.SendCommand(browser, username, profile, command,
-+ rv = client.SendCommand(browser, username, profile, command, nsnull,
- &error, &success);
-
- // failed to send command
---- widget/src/xremoteclient/XRemoteClient.cpp 2006-03-30 03:01:13.000000000 -0500
-+++ widget/src/xremoteclient/XRemoteClient.cpp 2007-07-03 18:01:36.000000000 -0400
-@@ -173,6 +173,7 @@
- nsresult
- XRemoteClient::SendCommand (const char *aProgram, const char *aUsername,
- const char *aProfile, const char *aCommand,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aWindowFound)
- {
- PR_LOG(sRemoteLm, PR_LOG_DEBUG, ("XRemoteClient::SendCommand"));
-@@ -198,7 +199,7 @@
-
- if (NS_SUCCEEDED(rv)) {
- // send our command
-- rv = DoSendCommand(w, aCommand, aResponse, &destroyed);
-+ rv = DoSendCommand(w, aCommand, aDesktopStartupID, aResponse, &destroyed);
-
- // if the window was destroyed, don't bother trying to free the
- // lock.
-@@ -217,6 +218,7 @@
- XRemoteClient::SendCommandLine (const char *aProgram, const char *aUsername,
- const char *aProfile,
- PRInt32 argc, char **argv,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aWindowFound)
- {
- PR_LOG(sRemoteLm, PR_LOG_DEBUG, ("XRemoteClient::SendCommandLine"));
-@@ -242,7 +244,7 @@
-
- if (NS_SUCCEEDED(rv)) {
- // send our command
-- rv = DoSendCommandLine(w, argc, argv, aResponse, &destroyed);
-+ rv = DoSendCommandLine(w, argc, argv, aDesktopStartupID, aResponse, &destroyed);
-
- // if the window was destroyed, don't bother trying to free the
- // lock.
-@@ -643,6 +645,7 @@
-
- nsresult
- XRemoteClient::DoSendCommand(Window aWindow, const char *aCommand,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aDestroyed)
- {
- *aDestroyed = PR_FALSE;
-@@ -651,9 +654,28 @@
- ("(writing " MOZILLA_COMMAND_PROP " \"%s\" to 0x%x)\n",
- aCommand, (unsigned int) aWindow));
-
-+ // We add the DESKTOP_STARTUP_ID setting as an extra line of
-+ // the command string. Firefox ignores all lines but the first.
-+ static char desktopStartupPrefix[] = "\nDESKTOP_STARTUP_ID=";
-+
-+ PRInt32 len = strlen(aCommand);
-+ if (aDesktopStartupID) {
-+ len += sizeof(desktopStartupPrefix) - 1 + strlen(aDesktopStartupID);
-+ }
-+ char* buffer = (char*)malloc(len + 1);
-+ if (!buffer)
-+ return NS_ERROR_OUT_OF_MEMORY;
-+
-+ strcpy(buffer, aCommand);
-+ if (aDesktopStartupID) {
-+ strcat(buffer, desktopStartupPrefix);
-+ strcat(buffer, aDesktopStartupID);
-+ }
-+
- XChangeProperty (mDisplay, aWindow, mMozCommandAtom, XA_STRING, 8,
-- PropModeReplace, (unsigned char *)aCommand,
-- strlen(aCommand));
-+ PropModeReplace, (unsigned char *)buffer, len);
-+
-+ free(buffer);
-
- if (!WaitForResponse(aWindow, aResponse, aDestroyed, mMozCommandAtom))
- return NS_ERROR_FAILURE;
-@@ -663,7 +685,7 @@
-
- /* like strcpy, but return the char after the final null */
- static char*
--estrcpy(char* s, char* d)
-+estrcpy(const char* s, char* d)
- {
- while (*s)
- *d++ = *s++;
-@@ -674,6 +696,7 @@
-
- nsresult
- XRemoteClient::DoSendCommandLine(Window aWindow, PRInt32 argc, char **argv,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aDestroyed)
- {
- int i;
-@@ -690,9 +713,16 @@
- // [argc][offsetargv0][offsetargv1...]<workingdir>\0<argv[0]>\0argv[1]...\0
- // (offset is from the beginning of the buffer)
-
-+ static char desktopStartupPrefix[] = " DESKTOP_STARTUP_ID=";
-+
- PRInt32 argvlen = strlen(cwdbuf);
-- for (i = 0; i < argc; ++i)
-- argvlen += strlen(argv[i]);
-+ for (i = 0; i < argc; ++i) {
-+ PRInt32 len = strlen(argv[i]);
-+ if (i == 0 && aDesktopStartupID) {
-+ len += sizeof(desktopStartupPrefix) - 1 + strlen(aDesktopStartupID);
-+ }
-+ argvlen += len;
-+ }
-
- PRInt32* buffer = (PRInt32*) malloc(argvlen + argc + 1 +
- sizeof(PRInt32) * (argc + 1));
-@@ -708,6 +738,10 @@
- for (int i = 0; i < argc; ++i) {
- buffer[i + 1] = TO_LITTLE_ENDIAN32(bufend - ((char*) buffer));
- bufend = estrcpy(argv[i], bufend);
-+ if (i == 0 && aDesktopStartupID) {
-+ bufend = estrcpy(desktopStartupPrefix, bufend - 1);
-+ bufend = estrcpy(aDesktopStartupID, bufend - 1);
-+ }
- }
-
- #ifdef DEBUG_bsmedberg
---- widget/src/xremoteclient/nsRemoteClient.h 2005-04-04 15:08:51.000000000 -0400
-+++ widget/src/xremoteclient/nsRemoteClient.h 2007-07-03 18:01:36.000000000 -0400
-@@ -76,6 +76,10 @@
- * @param aCommand This is the command that is passed to the server.
- * Please see the additional information located at:
- * http://www.mozilla.org/unix/remote.html
-+ *
-+ * @param aDesktopStartupID the contents of the DESKTOP_STARTUP_ID environment
-+ * variable defined by the Startup Notification specification
-+ * http://standards.freedesktop.org/startup-notification-spec/startup-notification-0.1.txt
- *
- * @param aResponse If there is a response, it will be here. This
- * includes error messages. The string is allocated using stdlib
-@@ -85,11 +89,16 @@
- */
- virtual nsresult SendCommand(const char *aProgram, const char *aUsername,
- const char *aProfile, const char *aCommand,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aSucceeded) = 0;
-
- /**
- * Send a complete command line to a running instance.
- *
-+ * @param aDesktopStartupID the contents of the DESKTOP_STARTUP_ID environment
-+ * variable defined by the Startup Notification specification
-+ * http://standards.freedesktop.org/startup-notification-spec/startup-notification-0.1.txt
-+ *
- * @see sendCommand
- * @param argc The number of command-line arguments.
- *
-@@ -97,6 +106,7 @@
- virtual nsresult SendCommandLine(const char *aProgram, const char *aUsername,
- const char *aProfile,
- PRInt32 argc, char **argv,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aSucceeded) = 0;
- };
-
---- widget/src/xremoteclient/XRemoteClient.h 2006-03-30 03:01:13.000000000 -0500
-+++ widget/src/xremoteclient/XRemoteClient.h 2007-07-03 18:01:36.000000000 -0400
-@@ -48,10 +48,12 @@
- virtual nsresult Init();
- virtual nsresult SendCommand(const char *aProgram, const char *aUsername,
- const char *aProfile, const char *aCommand,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aSucceeded);
- virtual nsresult SendCommandLine(const char *aProgram, const char *aUsername,
- const char *aProfile,
- PRInt32 argc, char **argv,
-+ const char* aDesktopStartupID,
- char **aResponse, PRBool *aSucceeded);
- void Shutdown();
-
-@@ -67,10 +69,12 @@
- PRBool aSupportsCommandLine);
- nsresult DoSendCommand (Window aWindow,
- const char *aCommand,
-+ const char* aDesktopStartupID,
- char **aResponse,
- PRBool *aDestroyed);
- nsresult DoSendCommandLine(Window aWindow,
- PRInt32 argc, char **argv,
-+ const char* aDesktopStartupID,
- char **aResponse,
- PRBool *aDestroyed);
- PRBool WaitForResponse (Window aWindow, char **aResponse,
---- /dev/null 2007-07-05 17:03:04.116204904 -0400
-+++ widget/src/gtk2/nsGTKToolkit.h 2007-07-03 18:01:36.000000000 -0400
-@@ -0,0 +1,87 @@
-+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-+/* vim:expandtab:shiftwidth=4:tabstop=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 mozilla.org 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 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 GTKTOOLKIT_H
-+#define GTKTOOLKIT_H
-+
-+#include "nsIToolkit.h"
-+#include "nsString.h"
-+#include <gtk/gtk.h>
-+
-+/**
-+ * Wrapper around the thread running the message pump.
-+ * The toolkit abstraction is necessary because the message pump must
-+ * execute within the same thread that created the widget under Win32.
-+ */
-+
-+class nsGTKToolkit : public nsIToolkit
-+{
-+public:
-+ nsGTKToolkit();
-+ virtual ~nsGTKToolkit();
-+
-+ NS_DECL_ISUPPORTS
-+
-+ NS_IMETHOD Init(PRThread *aThread);
-+
-+ void CreateSharedGC(void);
-+ GdkGC *GetSharedGC(void);
-+
-+ /**
-+ * Get/set our value of DESKTOP_STARTUP_ID. When non-empty, this is applied
-+ * to the next toplevel window to be shown or focused (and then immediately
-+ * cleared).
-+ */
-+ void SetDesktopStartupID(const nsACString& aID) { mDesktopStartupID = aID; }
-+ void GetDesktopStartupID(nsACString* aID) { *aID = mDesktopStartupID; }
-+
-+ /**
-+ * Get/set the timestamp value to be used, if non-zero, to focus the
-+ * next top-level window to be shown or focused (upon which it is cleared).
-+ */
-+ void SetFocusTimestamp(PRUint32 aTimestamp) { mFocusTimestamp = aTimestamp; }
-+ PRUint32 GetFocusTimestamp() { return mFocusTimestamp; }
-+
-+private:
-+ GdkGC *mSharedGC;
-+ nsCString mDesktopStartupID;
-+ PRUint32 mFocusTimestamp;
-+};
-+
-+#endif // GTKTOOLKIT_H
bgstack15