summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark McLoughlin <mark@skynet.ie>2002-07-11 05:03:36 +0000
committerMark McLoughlin <mmclouglin@src.gnome.org>2002-07-11 05:03:36 +0000
commit4df7d731d7b97df1a2b93586ba1bbf99f99d043b (patch)
tree4b606bc219fe45f8dbbb9a9680648e0d71482eab
parent6d41e3189b48154daa9c89d674ff9510d78da3c7 (diff)
add check for gtk with multihead support.MULTIHEAD_MERGPOINT1
2002-07-11 Mark McLoughlin <mark@skynet.ie> * configure.in: add check for gtk with multihead support. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * battstat_applet.c: (battstat_error_dialog), (about_cb): realise dialogs on the same screen as the applet. * properties.c: (prop_cb): ditto. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * Makefile.am: add egg-screen-exec.[ch] to the build. * cdplayer.c: (start_gtcd_cb): launch cdplayer on the same screen as the applet. (activate_cb), (preferences_cb), (about_cb): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * charpick.c: (about): realise dialogs on the same screen as the applet. * properties.c: (show_preferences_dialog): ditto. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * Makefile.am: add egg-screen-exec.[ch] to the build. * drivemount.c: (browse_cb): launch nautilus on the same screen as the applet. (about_cb), (mount_cb): realise dialogs on the same screen as the applet. * properties.c: (properties_show): ditto. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * geyes.c: (about_cb): * themes.c: (properties_cb): realise dialogs on the same screen as the applet. 002-07-11 Mark McLoughlin <mark@skynet.ie> * keygrab.c: (grab_key_filter), (grab_button_pressed): use the root window from the screen on which the applet is realised. * gkb.c: (about_cb): * prop-add.c: (gkb_prop_map_add): * prop-map.c: (gkb_prop_map_edit): * prop.c: (gkb_prop_create_property_box), (properties_dialog): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * gtik.c: (about_cb), (properties_cb): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * gweather-about.c: (gweather_about_run): * gweather-dialog.c: (gweather_dialog_create): * gweather-pref.c: (gweather_pref_create): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * src/Makefile.am: add egg-screen-exec.[ch] to the build. * src/exec.c: (exec_command): execute commands with DISPLAY set to make the default screen the same as the screen on which the applet is realised. * src/about.c: (about_box): * src/command_line.c: (show_history_signal), (show_file_browser_signal): * src/preferences.c: (properties_box): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * Makefile.am: add egg-screen-exec.[ch] to the build. * mixer.c: (mixer_start_gmix_cb): lauch mixer on the same screen as the applet. (mixer_popup_show), (mixer_start_gmix_cb), (mixer_about_cb), (mixer_applet_create): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * modemlights.c: (about_cb): * properties.c: (property_show): realise dialogs on the same screen as the applet. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * Makefile.am: add egg-screen-exec.[ch] to the build. * main.c: (start_procman_cb): launch procman on the same screen as the applet. (about_cb): realise dialogs on the same screen as the applet. * properties.c: (multiload_properties_cb): ditto. 2002-07-11 Mark McLoughlin <mark@skynet.ie> * panel-menu-add.c: (applet_add_cb), (add_entry_dnd_drag_begin_cb): * panel-menu-common.c: (widget_dnd_drag_begin_cb), (panel_menu_common_remove_entry), (panel_menu_common_single_entry_dialog_new): * panel-menu-directory.c: (panel_menu_directory_edit_dialog_new): * panel-menu-path.c: (panel_menu_path_edit_dialog_new): * panel-menu-properties.c: (applet_properties_cb): * panel-menu.c: (applet_about_cb): realise all dialogs on the same screen as the applet.
-rw-r--r--ChangeLog5
-rw-r--r--battstat/ChangeLog7
-rw-r--r--battstat/battstat_applet.c8
-rw-r--r--battstat/properties.c9
-rw-r--r--cdplayer/ChangeLog11
-rw-r--r--cdplayer/Makefile.am8
-rw-r--r--cdplayer/cdplayer.c26
-rw-r--r--cdplayer/egg-screen-exec.c188
-rw-r--r--cdplayer/egg-screen-exec.h46
-rwxr-xr-xcdplayer/update-from-egg.sh25
-rw-r--r--charpick/ChangeLog7
-rw-r--r--charpick/charpick.c8
-rw-r--r--charpick/properties.c8
-rw-r--r--configure.in12
-rw-r--r--drivemount/ChangeLog12
-rw-r--r--drivemount/Makefile.am8
-rw-r--r--drivemount/drivemount.c26
-rw-r--r--drivemount/egg-screen-exec.c188
-rw-r--r--drivemount/egg-screen-exec.h46
-rw-r--r--drivemount/properties.c4
-rwxr-xr-xdrivemount/update-from-egg.sh25
-rw-r--r--geyes/ChangeLog6
-rw-r--r--geyes/geyes.c9
-rw-r--r--geyes/themes.c9
-rw-r--r--gkb-new/ChangeLog12
-rw-r--r--gkb-new/descs/.cvsignore2
-rw-r--r--gkb-new/gkb.c3
-rw-r--r--gkb-new/keygrab.c14
-rw-r--r--gkb-new/prop-add.c8
-rw-r--r--gkb-new/prop-map.c4
-rw-r--r--gkb-new/prop.c8
-rw-r--r--gtik/ChangeLog5
-rw-r--r--gtik/gtik.c13
-rw-r--r--gweather/ChangeLog7
-rw-r--r--gweather/gweather-about.c10
-rw-r--r--gweather/gweather-dialog.c4
-rw-r--r--gweather/gweather-pref.c6
-rw-r--r--mini-commander/src/Makefile.am9
-rw-r--r--mini-commander/src/about.c10
-rw-r--r--mini-commander/src/command_line.c8
-rw-r--r--mini-commander/src/egg-screen-exec.c188
-rw-r--r--mini-commander/src/egg-screen-exec.h46
-rw-r--r--mini-commander/src/exec.c8
-rw-r--r--mini-commander/src/preferences.c8
-rwxr-xr-xmini-commander/src/update-from-egg.sh25
-rw-r--r--mixer/ChangeLog11
-rw-r--r--mixer/Makefile.am9
-rw-r--r--mixer/egg-screen-exec.c188
-rw-r--r--mixer/egg-screen-exec.h46
-rw-r--r--mixer/mixer.c26
-rwxr-xr-xmixer/update-from-egg.sh25
-rw-r--r--multiload/ChangeLog13
-rw-r--r--multiload/Makefile.am10
-rw-r--r--multiload/egg-screen-exec.c188
-rw-r--r--multiload/egg-screen-exec.h46
-rw-r--r--multiload/main.c21
-rw-r--r--multiload/properties.c8
-rwxr-xr-xmultiload/update-from-egg.sh25
-rw-r--r--panel-menu/ChangeLog12
-rw-r--r--panel-menu/panel-menu-add.c8
-rw-r--r--panel-menu/panel-menu-common.c13
-rw-r--r--panel-menu/panel-menu-directory.c4
-rw-r--r--panel-menu/panel-menu-path.c4
-rw-r--r--panel-menu/panel-menu-properties.c4
-rw-r--r--panel-menu/panel-menu.c8
65 files changed, 1761 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 2186a2807..f6c4c9d96 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * configure.in: add check for gtk with multihead
+ support.
+
2002-07-10 jacob berkman <jacob@localhost>
* Makefile.am (DIST_SUBDIRS): add wireless
diff --git a/battstat/ChangeLog b/battstat/ChangeLog
index f9ce16b1a..1433c8c2a 100644
--- a/battstat/ChangeLog
+++ b/battstat/ChangeLog
@@ -1,3 +1,10 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * battstat_applet.c: (battstat_error_dialog), (about_cb):
+ realise dialogs on the same screen as the applet.
+
+ * properties.c: (prop_cb): ditto.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* battstat.h: get method signatures for verb callbacks
diff --git a/battstat/battstat_applet.c b/battstat/battstat_applet.c
index 2e9015430..62d41df7b 100644
--- a/battstat/battstat_applet.c
+++ b/battstat/battstat_applet.c
@@ -696,6 +696,10 @@ battstat_error_dialog (PanelApplet *applet,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
msg);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (applet)));
+#endif
gtk_dialog_run (GTK_DIALOG(dialog));
gtk_widget_destroy (dialog);
@@ -849,6 +853,10 @@ about_cb (BonoboUIComponent *uic,
gdk_pixbuf_unref (pixbuf);
gtk_window_set_wmclass (GTK_WINDOW (about_box), "battery charge monitor", "Batter Charge Monitor");
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_box),
+ gtk_widget_get_screen (battstat->applet));
+#endif
gtk_widget_show (about_box);
}
diff --git a/battstat/properties.c b/battstat/properties.c
index 9761ce469..a0df04eb5 100644
--- a/battstat/properties.c
+++ b/battstat/properties.c
@@ -265,6 +265,11 @@ prop_cb (BonoboUIComponent *uic,
if (DEBUG) g_print("prop_cb()\n");
if (battstat->prop_win) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (battstat->prop_win),
+ gtk_widget_get_screen (battstat->applet));
+
+#endif
gtk_window_present (GTK_WINDOW (battstat->prop_win));
return;
}
@@ -274,6 +279,10 @@ prop_cb (BonoboUIComponent *uic,
battstat->prop_win = GTK_DIALOG (glade_xml_get_widget (glade_xml,
"battstat_properties"));
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (battstat->prop_win),
+ gtk_widget_get_screen (battstat->applet));
+#endif
widget = glade_xml_get_widget (glade_xml, "yellow_spin");
diff --git a/cdplayer/ChangeLog b/cdplayer/ChangeLog
index c47259730..f75e854f9 100644
--- a/cdplayer/ChangeLog
+++ b/cdplayer/ChangeLog
@@ -1,3 +1,14 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * Makefile.am: add egg-screen-exec.[ch] to the
+ build.
+
+ * cdplayer.c:
+ (start_gtcd_cb): launch cdplayer on the same screen
+ as the applet.
+ (activate_cb), (preferences_cb), (about_cb): realise
+ dialogs on the same screen as the applet.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* cdplayer.c: Correct signatures for verb callback
diff --git a/cdplayer/Makefile.am b/cdplayer/Makefile.am
index 7c45bae2a..2dd782319 100644
--- a/cdplayer/Makefile.am
+++ b/cdplayer/Makefile.am
@@ -7,12 +7,15 @@ $(CDROM_CFLAGS)
bin_PROGRAMS = cdplayer_applet2
+EGGFILES = egg-screen-exec.h egg-screen-exec.c
+
cdplayer_applet2_SOURCES = \
cdplayer.c \
cdplayer.h \
cdrom-interface.h \
led.c \
led.h \
+$(EGGFILES) \
cdrom-@CDROM_HOST@.c
cdplayer_applet2_DEPENDS = \
@@ -38,6 +41,7 @@ uidir = $(datadir)/gnome-2.0/ui
ui_DATA = GNOME_CDPlayerApplet.xml
EXTRA_DIST = \
+update-from-egg.sh \
images/cdplayer-backward.xpm \
images/cdplayer-eject.xpm \
images/cdplayer-forward.xpm \
@@ -57,3 +61,7 @@ $(ui_DATA)
install-data-local:
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA) ;
+EGGDIR = $(srcdir)/../../libegg/libegg/screen-exec
+
+regenerate-built-sources:
+ EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
diff --git a/cdplayer/cdplayer.c b/cdplayer/cdplayer.c
index bde44b555..c39e86f4e 100644
--- a/cdplayer/cdplayer.c
+++ b/cdplayer/cdplayer.c
@@ -39,6 +39,7 @@
#include "led.h"
#include "cdrom-interface.h"
#include "cdplayer.h"
+#include "egg-screen-exec.h"
#include "images/cdplayer-stop.xpm"
#include "images/cdplayer-play-pause.xpm"
@@ -269,7 +270,12 @@ start_gtcd_cb (BonoboUIComponent *component,
{
GError *error = NULL;
+#ifdef HAVE_GTK_MULTIHEAD
+ egg_screen_execute_command_line_async (
+ gtk_widget_get_screen (cd->panel.applet), "gnome-cd", &error);
+#else
g_spawn_command_line_async ("gnome-cd", &error);
+#endif
if (error) {
GtkWidget *dialog;
@@ -285,6 +291,10 @@ start_gtcd_cb (BonoboUIComponent *component,
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (cd->panel.applet));
+#endif
gtk_widget_show (dialog);
@@ -320,6 +330,10 @@ activate_cb (GtkEntry *entry,
GTK_BUTTONS_CLOSE,
"%s is not a proper device path",
cd->devpath, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (cd->panel.applet));
+#endif
g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
G_CALLBACK (gtk_widget_destroy),
GTK_OBJECT (dialog));
@@ -380,6 +394,10 @@ preferences_cb (BonoboUIComponent *component,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (cd->panel.applet));
+#endif
gtk_dialog_set_default_response(GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
box = GTK_DIALOG(dialog)->vbox;
@@ -466,6 +484,10 @@ about_cb (BonoboUIComponent *component,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (cd->panel.applet));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -491,6 +513,10 @@ about_cb (BonoboUIComponent *component,
gdk_pixbuf_unref (pixbuf);
gtk_window_set_wmclass (GTK_WINDOW (about), "cd player", "CD Player");
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (cd->panel.applet));
+#endif
g_signal_connect (G_OBJECT(about), "destroy",
G_CALLBACK(gtk_widget_destroyed), &about);
gtk_widget_show (about);
diff --git a/cdplayer/egg-screen-exec.c b/cdplayer/egg-screen-exec.c
new file mode 100644
index 000000000..0337d6881
--- /dev/null
+++ b/cdplayer/egg-screen-exec.c
@@ -0,0 +1,188 @@
+/* egg-screen-exec.c
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "egg-screen-exec.h"
+
+#include <string.h>
+#include <libgnome/gnome-exec.h>
+
+#ifndef HAVE_GTK_MULTIHEAD
+#include <gdk/gdkx.h>
+#endif
+
+extern char **environ;
+
+char *
+egg_screen_exec_display_string (GdkScreen *screen)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+ old_display = gdk_display_get_name (gdk_display_get_default ());
+
+ str = g_string_new ("DISPLAY=");
+ g_string_append (str, old_display);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+
+ retval = str->str;
+
+ g_string_free (str, FALSE);
+
+ return retval;
+#else
+ return g_strdup (DisplayString (GDK_DISPLAY ()));
+#endif
+}
+
+char **
+egg_screen_exec_environment (GdkScreen *screen)
+{
+ char **retval = NULL;
+ int i;
+#ifdef HAVE_GTK_MULTIHEAD
+ int display_index = -1;
+
+ for (i = 0; environ [i]; i++)
+ if (!strncmp (environ [i], "DISPLAY", 7))
+ display_index = i;
+
+ if (display_index == -1)
+ display_index = i++;
+#else
+ for (i = 0; environ [i]; i++);
+#endif
+
+ retval = g_new (char *, i + 1);
+
+ for (i = 0; environ [i]; i++)
+#ifdef HAVE_GTK_MULTIHEAD
+ if (i == display_index)
+ retval [i] = egg_screen_exec_display_string (screen);
+ else
+#endif
+ retval [i] = g_strdup (environ [i]);
+
+ retval [i] = NULL;
+
+ return retval;
+}
+
+int
+egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv [])
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ char **envp = NULL;
+ int envc = 0;
+ int retval;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () != screen) {
+ envc = 1;
+ envp = g_new0 (char *, 2);
+ envp [0] = egg_screen_exec_display_string (screen);
+ }
+
+ retval = gnome_execute_async_with_env (dir, argc, argv, envc, envp);
+
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return gnome_execute_async (dir, argc, argv);
+#endif
+}
+
+int
+egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ int retval = -1;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () == screen)
+ retval = gnome_execute_shell (dir, command);
+
+ else {
+ char *exec;
+ char *display;
+
+ display = egg_screen_exec_display_string (screen);
+ exec = g_strconcat (display, " ", command, NULL);
+
+ retval = gnome_execute_shell (dir, exec);
+
+ g_free (display);
+ g_free (exec);
+ }
+
+ return retval;
+#else
+ return gnome_execute_shell (dir, command);
+#endif
+}
+
+gboolean
+egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ gboolean retval;
+ char **argv = NULL;
+ char **envp = NULL;
+
+ g_return_val_if_fail (command != NULL, FALSE);
+
+ if (!g_shell_parse_argv (command, NULL, &argv, error))
+ return FALSE;
+
+ if (gdk_screen_get_default () != screen)
+ envp = egg_screen_exec_environment (screen);
+
+ retval = g_spawn_async (g_get_home_dir (),
+ argv, envp, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return g_spawn_command_line_async (command, error);
+#endif
+}
diff --git a/cdplayer/egg-screen-exec.h b/cdplayer/egg-screen-exec.h
new file mode 100644
index 000000000..65a6df021
--- /dev/null
+++ b/cdplayer/egg-screen-exec.h
@@ -0,0 +1,46 @@
+/* egg-screen-exec.h
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __EGG_SCREEN_EXEC_H__
+#define __EGG_SCREEN_EXEC_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+char *egg_screen_exec_display_string (GdkScreen *screen);
+char **egg_screen_exec_environment (GdkScreen *screen);
+
+int egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv []);
+int egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command);
+gboolean egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __EGG_SCREEN_EXEC_H__ */
diff --git a/cdplayer/update-from-egg.sh b/cdplayer/update-from-egg.sh
new file mode 100755
index 000000000..9be68a9b4
--- /dev/null
+++ b/cdplayer/update-from-egg.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+function die() {
+ echo $*
+ exit 1
+}
+
+if test -z "$EGGDIR"; then
+ echo "Must set EGGDIR"
+ exit 1
+fi
+
+if test -z "$EGGFILES"; then
+ echo "Must set EGGFILES"
+ exit 1
+fi
+
+for FILE in $EGGFILES; do
+ if cmp -s $EGGDIR/$FILE $FILE; then
+ echo "File $FILE is unchanged"
+ else
+ cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE"
+ echo "Updated $FILE"
+ fi
+done
diff --git a/charpick/ChangeLog b/charpick/ChangeLog
index 5016941f5..d8c2d5a50 100644
--- a/charpick/ChangeLog
+++ b/charpick/ChangeLog
@@ -1,3 +1,10 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * charpick.c: (about): realise dialogs on
+ the same screen as the applet.
+
+ * properties.c: (show_preferences_dialog): ditto.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* charpick.c: use unsafe verb callbacks to
diff --git a/charpick/charpick.c b/charpick/charpick.c
index 5a111c6ab..abeb49656 100644
--- a/charpick/charpick.c
+++ b/charpick/charpick.c
@@ -373,6 +373,10 @@ about (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about_box) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_box),
+ gtk_widget_get_screen (curr_data->applet));
+#endif
gtk_window_present (GTK_WINDOW (about_box));
return;
}
@@ -400,6 +404,10 @@ about (BonoboUIComponent *uic,
if (pixbuf)
gdk_pixbuf_unref (pixbuf);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_box),
+ gtk_widget_get_screen (curr_data->applet));
+#endif
gtk_window_set_wmclass (GTK_WINDOW (about_box), "character palette", "Character Palette");
gnome_window_icon_set_from_file (GTK_WINDOW (about_box), GNOME_ICONDIR"/charpick.png");
diff --git a/charpick/properties.c b/charpick/properties.c
index 01d93be7f..b3a93ca19 100644
--- a/charpick/properties.c
+++ b/charpick/properties.c
@@ -143,6 +143,10 @@ show_preferences_dialog (BonoboUIComponent *uic,
const gchar *verbname)
{
if (curr_data->propwindow) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (curr_data->propwindow),
+ gtk_widget_get_screen (curr_data->applet));
+#endif
gtk_window_present (GTK_WINDOW (curr_data->propwindow));
return;
}
@@ -153,6 +157,10 @@ show_preferences_dialog (BonoboUIComponent *uic,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (curr_data->propwindow),
+ gtk_widget_get_screen (curr_data->applet));
+#endif
gtk_dialog_set_default_response (GTK_DIALOG (curr_data->propwindow), GTK_RESPONSE_CLOSE);
/*size_frame_create();*/
default_chars_frame_create(curr_data);
diff --git a/configure.in b/configure.in
index f0c58fda2..3a394a516 100644
--- a/configure.in
+++ b/configure.in
@@ -101,6 +101,18 @@ AC_SUBST(GTOP_APPLETS_CFLAGS)
AC_SUBST(GTOP_APPLETS_LIBS)
AM_CONDITIONAL(BUILD_GTOP_APPLETS, $build_gtop_applets)
+
+dnl
+dnl Check for gtk+ with multihead support
+dnl
+AC_MSG_CHECKING([for gtk+ multihead support])
+if $PKG_CONFIG --atleast-version 2.1.0 gtk+-2.0; then
+ AC_DEFINE(HAVE_GTK_MULTIHEAD,,[gtk+ with multihead support found])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
dnl ************************
dnl ** Set up gettext **
dnl ************************
diff --git a/drivemount/ChangeLog b/drivemount/ChangeLog
index a0c6ae067..1fe3d10e5 100644
--- a/drivemount/ChangeLog
+++ b/drivemount/ChangeLog
@@ -1,3 +1,15 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * Makefile.am: add egg-screen-exec.[ch] to the build.
+
+ * drivemount.c:
+ (browse_cb): launch nautilus on the same screen as
+ the applet.
+ (about_cb), (mount_cb): realise dialogs on the same
+ screen as the applet.
+
+ * properties.c: (properties_show): ditto.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* drivemount.c: Correct the signatures for verb callback
diff --git a/drivemount/Makefile.am b/drivemount/Makefile.am
index 7a78b597a..c73934787 100644
--- a/drivemount/Makefile.am
+++ b/drivemount/Makefile.am
@@ -9,7 +9,10 @@ bin_PROGRAMS = drivemount_applet2
desktop_iconsdir = $(datadir)/pixmaps
desktop_icons_DATA = drivemount-applet.png
+EGGFILES = egg-screen-exec.h egg-screen-exec.c
+
drivemount_applet2_SOURCES = \
+$(EGGFILES) \
drivemount.c \
drivemount.h \
properties.c \
@@ -57,8 +60,13 @@ jazdrive_v_out.xpm \
$(server_in_files) \
$(schema_DATA) \
$(ui_DATA) \
+update-from-egg.sh \
drivemount-applet.png
install-data-local:
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA) ;
+EGGDIR = $(srcdir)/../../libegg/libegg/screen-exec
+
+regenerate-built-sources:
+ EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
diff --git a/drivemount/drivemount.c b/drivemount/drivemount.c
index 9926c3d44..4aad7025f 100644
--- a/drivemount/drivemount.c
+++ b/drivemount/drivemount.c
@@ -27,6 +27,7 @@
#include "drivemount.h"
#include "properties.h"
+#include "egg-screen-exec.h"
#include "floppy_v_in.xpm"
#include "floppy_v_out.xpm"
@@ -385,7 +386,12 @@ browse_cb (BonoboUIComponent *uic,
return;
command = g_strdup_printf ("nautilus %s", drivemount->mount_point);
+#ifdef HAVE_GTK_MULTIHEAD
+ egg_screen_execute_command_line_async (
+ gtk_widget_get_screen (drivemount->applet), command, &error);
+#else
g_spawn_command_line_async (command, &error);
+#endif
g_free (command);
if (error) {
GtkWidget *dialog;
@@ -403,6 +409,10 @@ browse_cb (BonoboUIComponent *uic,
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (drivemount->applet));
+#endif
gtk_widget_show (dialog);
@@ -449,6 +459,10 @@ about_cb (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (drivemount->applet));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -474,6 +488,10 @@ about_cb (BonoboUIComponent *uic,
gdk_pixbuf_unref (pixbuf);
gtk_window_set_wmclass (GTK_WINDOW (about), "disk mounter", "Disk Mounter");
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (drivemount->applet));
+#endif
g_signal_connect (G_OBJECT (about), "destroy",
G_CALLBACK (gtk_widget_destroyed), &about);
gtk_widget_show (about);
@@ -730,6 +748,10 @@ mount_cb (GtkWidget *widget,
/* Stop the user from displaying zillions of error messages */
if (dd->error_dialog) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dd->error_dialog),
+ gtk_widget_get_screen (dd->applet));
+#endif
gtk_window_present (GTK_WINDOW (dd->error_dialog));
return;
}
@@ -777,6 +799,10 @@ mount_cb (GtkWidget *widget,
NULL, GTK_DIALOG_MODAL,
GTK_STOCK_OK,
GTK_RESPONSE_OK, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dd->error_dialog),
+ gtk_widget_get_screen (dd->applet));
+#endif
hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX
(GTK_DIALOG (dd->error_dialog)->vbox), hbox,
diff --git a/drivemount/egg-screen-exec.c b/drivemount/egg-screen-exec.c
new file mode 100644
index 000000000..0337d6881
--- /dev/null
+++ b/drivemount/egg-screen-exec.c
@@ -0,0 +1,188 @@
+/* egg-screen-exec.c
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "egg-screen-exec.h"
+
+#include <string.h>
+#include <libgnome/gnome-exec.h>
+
+#ifndef HAVE_GTK_MULTIHEAD
+#include <gdk/gdkx.h>
+#endif
+
+extern char **environ;
+
+char *
+egg_screen_exec_display_string (GdkScreen *screen)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+ old_display = gdk_display_get_name (gdk_display_get_default ());
+
+ str = g_string_new ("DISPLAY=");
+ g_string_append (str, old_display);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+
+ retval = str->str;
+
+ g_string_free (str, FALSE);
+
+ return retval;
+#else
+ return g_strdup (DisplayString (GDK_DISPLAY ()));
+#endif
+}
+
+char **
+egg_screen_exec_environment (GdkScreen *screen)
+{
+ char **retval = NULL;
+ int i;
+#ifdef HAVE_GTK_MULTIHEAD
+ int display_index = -1;
+
+ for (i = 0; environ [i]; i++)
+ if (!strncmp (environ [i], "DISPLAY", 7))
+ display_index = i;
+
+ if (display_index == -1)
+ display_index = i++;
+#else
+ for (i = 0; environ [i]; i++);
+#endif
+
+ retval = g_new (char *, i + 1);
+
+ for (i = 0; environ [i]; i++)
+#ifdef HAVE_GTK_MULTIHEAD
+ if (i == display_index)
+ retval [i] = egg_screen_exec_display_string (screen);
+ else
+#endif
+ retval [i] = g_strdup (environ [i]);
+
+ retval [i] = NULL;
+
+ return retval;
+}
+
+int
+egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv [])
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ char **envp = NULL;
+ int envc = 0;
+ int retval;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () != screen) {
+ envc = 1;
+ envp = g_new0 (char *, 2);
+ envp [0] = egg_screen_exec_display_string (screen);
+ }
+
+ retval = gnome_execute_async_with_env (dir, argc, argv, envc, envp);
+
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return gnome_execute_async (dir, argc, argv);
+#endif
+}
+
+int
+egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ int retval = -1;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () == screen)
+ retval = gnome_execute_shell (dir, command);
+
+ else {
+ char *exec;
+ char *display;
+
+ display = egg_screen_exec_display_string (screen);
+ exec = g_strconcat (display, " ", command, NULL);
+
+ retval = gnome_execute_shell (dir, exec);
+
+ g_free (display);
+ g_free (exec);
+ }
+
+ return retval;
+#else
+ return gnome_execute_shell (dir, command);
+#endif
+}
+
+gboolean
+egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ gboolean retval;
+ char **argv = NULL;
+ char **envp = NULL;
+
+ g_return_val_if_fail (command != NULL, FALSE);
+
+ if (!g_shell_parse_argv (command, NULL, &argv, error))
+ return FALSE;
+
+ if (gdk_screen_get_default () != screen)
+ envp = egg_screen_exec_environment (screen);
+
+ retval = g_spawn_async (g_get_home_dir (),
+ argv, envp, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return g_spawn_command_line_async (command, error);
+#endif
+}
diff --git a/drivemount/egg-screen-exec.h b/drivemount/egg-screen-exec.h
new file mode 100644
index 000000000..65a6df021
--- /dev/null
+++ b/drivemount/egg-screen-exec.h
@@ -0,0 +1,46 @@
+/* egg-screen-exec.h
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __EGG_SCREEN_EXEC_H__
+#define __EGG_SCREEN_EXEC_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+char *egg_screen_exec_display_string (GdkScreen *screen);
+char **egg_screen_exec_environment (GdkScreen *screen);
+
+int egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv []);
+int egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command);
+gboolean egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __EGG_SCREEN_EXEC_H__ */
diff --git a/drivemount/properties.c b/drivemount/properties.c
index a17e97570..15798893a 100644
--- a/drivemount/properties.c
+++ b/drivemount/properties.c
@@ -253,6 +253,10 @@ properties_show (BonoboUIComponent *uic,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (dd->applet));
+#endif
box = GTK_DIALOG(dialog)->vbox;
frame = gtk_frame_new("Settings");
diff --git a/drivemount/update-from-egg.sh b/drivemount/update-from-egg.sh
new file mode 100755
index 000000000..9be68a9b4
--- /dev/null
+++ b/drivemount/update-from-egg.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+function die() {
+ echo $*
+ exit 1
+}
+
+if test -z "$EGGDIR"; then
+ echo "Must set EGGDIR"
+ exit 1
+fi
+
+if test -z "$EGGFILES"; then
+ echo "Must set EGGFILES"
+ exit 1
+fi
+
+for FILE in $EGGFILES; do
+ if cmp -s $EGGDIR/$FILE $FILE; then
+ echo "File $FILE is unchanged"
+ else
+ cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE"
+ echo "Updated $FILE"
+ fi
+done
diff --git a/geyes/ChangeLog b/geyes/ChangeLog
index b046b361a..2473390b8 100644
--- a/geyes/ChangeLog
+++ b/geyes/ChangeLog
@@ -1,3 +1,9 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * geyes.c: (about_cb):
+ * themes.c: (properties_cb): realise dialogs
+ on the same screen as the applet.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* geyes.c: use unsafe verb callbacks to
diff --git a/geyes/geyes.c b/geyes/geyes.c
index 6048cfefd..9981ad6c1 100644
--- a/geyes/geyes.c
+++ b/geyes/geyes.c
@@ -215,6 +215,11 @@ about_cb (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (
+ GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -241,6 +246,10 @@ about_cb (BonoboUIComponent *uic,
gdk_pixbuf_unref (pixbuf);
gtk_window_set_wmclass (GTK_WINDOW (about), "geyes", "Geyes");
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+#endif
g_signal_connect (about, "destroy",
G_CALLBACK (gtk_widget_destroyed),
&about);
diff --git a/geyes/themes.c b/geyes/themes.c
index 7d5ae31c8..d61155412 100644
--- a/geyes/themes.c
+++ b/geyes/themes.c
@@ -208,6 +208,11 @@ properties_cb (BonoboUIComponent *uic,
gchar filename [PATH_MAX];
if (eyes_applet->prop_box.pbox) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (
+ GTK_WINDOW (eyes_applet->prop_box.pbox),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+#endif
gtk_window_present (GTK_WINDOW (eyes_applet->prop_box.pbox));
return;
}
@@ -217,6 +222,10 @@ properties_cb (BonoboUIComponent *uic,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (eyes_applet->prop_box.pbox),
+ gtk_widget_get_screen (GTK_WIDGET (eyes_applet->applet)));
+#endif
gtk_dialog_set_default_response(GTK_DIALOG (pbox), GTK_RESPONSE_CLOSE);
g_signal_connect (pbox, "response",
diff --git a/gkb-new/ChangeLog b/gkb-new/ChangeLog
index 0c6a2fa3d..a4d19adde 100644
--- a/gkb-new/ChangeLog
+++ b/gkb-new/ChangeLog
@@ -1,3 +1,15 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * keygrab.c: (grab_key_filter), (grab_button_pressed): use
+ the root window from the screen on which the applet is
+ realised.
+
+ * gkb.c: (about_cb):
+ * prop-add.c: (gkb_prop_map_add):
+ * prop-map.c: (gkb_prop_map_edit):
+ * prop.c: (gkb_prop_create_property_box), (properties_dialog):
+ realise dialogs on the same screen as the applet.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* gkb.c:
diff --git a/gkb-new/descs/.cvsignore b/gkb-new/descs/.cvsignore
index 3c6233205..8e68cba6b 100644
--- a/gkb-new/descs/.cvsignore
+++ b/gkb-new/descs/.cvsignore
@@ -1,3 +1,3 @@
Makefile.in
Makefile
-*.keyprop \ No newline at end of file
+*.keyprop
diff --git a/gkb-new/gkb.c b/gkb-new/gkb.c
index f7acd3b77..cc86a03e7 100644
--- a/gkb-new/gkb.c
+++ b/gkb-new/gkb.c
@@ -629,6 +629,9 @@ about_cb (BonoboUIComponent *uic,
g_object_unref (pixbuf);
gtk_window_set_wmclass (GTK_WINDOW (about), "keyboard layout switcher", "Keyboard Layout Switcher");
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about), gtk_widget_get_screen (gkb->applet));
+#endif
g_signal_connect (G_OBJECT(about), "destroy",
(GCallback)gtk_widget_destroyed, &about);
diff --git a/gkb-new/keygrab.c b/gkb-new/keygrab.c
index 3643c169a..2fbce1c71 100644
--- a/gkb-new/keygrab.c
+++ b/gkb-new/keygrab.c
@@ -230,7 +230,12 @@ grab_key_filter (GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
entry = GTK_ENTRY (data);
+#ifdef HAVE_GTK_MULTIHEAD
+ root_window = gdk_screen_get_root_window (
+ gtk_widget_get_screen (GTK_WIDGET (entry)));
+#else
root_window = gdk_get_default_root_window ();
+#endif
state = xevent->xkey.state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK);
@@ -274,12 +279,21 @@ grab_button_pressed (GtkButton *button,
GtkWidget *label;
GdkWindow *root_window;
+#ifdef HAVE_GTK_MULTIHEAD
+ root_window = gdk_screen_get_root_window (
+ gtk_widget_get_screen (GTK_WIDGET (button)));
+#else
root_window = gdk_get_default_root_window ();
+#endif
gdk_keyboard_grab (root_window, FALSE, GDK_CURRENT_TIME);
gdk_window_add_filter (root_window, grab_key_filter, data);
grab_dialog = gtk_window_new (GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (grab_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (button)));
+#endif
g_object_set (G_OBJECT (grab_dialog),
"allow_grow", FALSE,
"allow_shrink", FALSE,
diff --git a/gkb-new/prop-add.c b/gkb-new/prop-add.c
index 20de07c4c..837e37d5c 100644
--- a/gkb-new/prop-add.c
+++ b/gkb-new/prop-add.c
@@ -364,6 +364,10 @@ gkb_prop_map_add (GkbPropertyBoxInfo * pbi)
if (gkb->addwindow)
{
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (gkb->addwindow),
+ gtk_widget_get_screen (gkb->applet));
+#endif
gtk_window_present (GTK_WINDOW (gkb->addwindow));
return;
}
@@ -375,6 +379,10 @@ gkb_prop_map_add (GkbPropertyBoxInfo * pbi)
GTK_STOCK_ADD, 100,
NULL);
gtk_dialog_set_default_response (GTK_DIALOG (gkb->addwindow), 100);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (gkb->addwindow),
+ gtk_widget_get_screen (gkb->applet));
+#endif
gtk_object_set_data (GTK_OBJECT (gkb->addwindow), "addwindow",
gkb->addwindow);
diff --git a/gkb-new/prop-map.c b/gkb-new/prop-map.c
index 0477e8d19..4b83dee62 100644
--- a/gkb-new/prop-map.c
+++ b/gkb-new/prop-map.c
@@ -578,6 +578,10 @@ gkb_prop_map_edit (GkbPropertyBoxInfo * pbi)
dialog = gtk_window_new (GTK_WINDOW_TOPLEVEL);
mdi->dialog = dialog;
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (pbi->gkb->applet));
+#endif
gtk_object_set_data (GTK_OBJECT (dialog), "mapedit", dialog);
gtk_window_set_title (GTK_WINDOW (dialog), _("Edit Keyboard"));
diff --git a/gkb-new/prop.c b/gkb-new/prop.c
index a47d71e7c..736c105fd 100644
--- a/gkb-new/prop.c
+++ b/gkb-new/prop.c
@@ -414,6 +414,10 @@ gkb_prop_create_property_box (GkbPropertyBoxInfo * pbi)
GTK_STOCK_HELP, GTK_RESPONSE_HELP,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (propwindow),
+ gtk_widget_get_screen (pbi->gkb->applet));
+#endif
propnotebook = gtk_notebook_new ();
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (propwindow)->vbox), propnotebook,
@@ -462,6 +466,10 @@ properties_dialog (BonoboUIComponent *uic,
GkbPropertyBoxInfo *pbi;
if (propwindow) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (propwindow),
+ gtk_widget_get_screen (gkb->applet));
+#endif
gtk_window_present (GTK_WINDOW (propwindow));
return;
}
diff --git a/gtik/ChangeLog b/gtik/ChangeLog
index b7f84ac98..d2df70a92 100644
--- a/gtik/ChangeLog
+++ b/gtik/ChangeLog
@@ -1,3 +1,8 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * gtik.c: (about_cb), (properties_cb): realise
+ dialogs on the same screen as the applet.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* gtik.c: use unsafe verbs to minimise casting.
diff --git a/gtik/gtik.c b/gtik/gtik.c
index a90ea7bf8..c9eb63e91 100644
--- a/gtik/gtik.c
+++ b/gtik/gtik.c
@@ -744,6 +744,10 @@ static gint updateOutput(gpointer data)
if (pixbuf)
gdk_pixbuf_unref (pixbuf);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (stockdata->applet));
+#endif
gtk_widget_show (about);
return;
@@ -1217,6 +1221,10 @@ static gint updateOutput(gpointer data)
int ur,ug,ub, dr,dg,db;
if (stockdata->pb) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (stockdata->pb),
+ gtk_widget_get_screen (stockdata->applet));
+#endif
gtk_window_present (GTK_WINDOW (stockdata->pb));
return;
}
@@ -1229,7 +1237,10 @@ static gint updateOutput(gpointer data)
GTK_STOCK_HELP,
GTK_RESPONSE_HELP,
NULL);
-
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (stockdata->pb),
+ gtk_widget_get_screen (stockdata->applet));
+#endif
notebook = gtk_notebook_new ();
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (stockdata->pb)->vbox), notebook,
TRUE, TRUE, 0);
diff --git a/gweather/ChangeLog b/gweather/ChangeLog
index 427864004..b0de5779c 100644
--- a/gweather/ChangeLog
+++ b/gweather/ChangeLog
@@ -1,3 +1,10 @@
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
+ * gweather-about.c: (gweather_about_run):
+ * gweather-dialog.c: (gweather_dialog_create):
+ * gweather-pref.c: (gweather_pref_create):
+ realise dialogs on the same screen as the applet.
+
2002-07-10 Mark McLoughlin <mark@skynet.ie>
* gweather-about.c: (gweather_about_run): use
diff --git a/gweather/gweather-about.c b/gweather/gweather-about.c
index dc74e2c12..f9ba15b0b 100644
--- a/gweather/gweather-about.c
+++ b/gweather/gweather-about.c
@@ -45,6 +45,10 @@ void gweather_about_run (GWeatherApplet *gw_applet)
static GtkWidget *about_dialog = NULL;
if (about_dialog) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet)));
+#endif
gtk_window_present (GTK_WINDOW (about_dialog));
return;
}
@@ -68,7 +72,11 @@ void gweather_about_run (GWeatherApplet *gw_applet)
pixbuf);
if (pixbuf)
gdk_pixbuf_unref (pixbuf);
-
+
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet)));
+#endif
gtk_window_set_wmclass (GTK_WINDOW (about_dialog), "weather report", "Weather Report");
gnome_window_icon_set_from_file (GTK_WINDOW (about_dialog), GNOME_ICONDIR"/gweather/tstorm.xpm");
diff --git a/gweather/gweather-dialog.c b/gweather/gweather-dialog.c
index c49e4660c..b2a8caf84 100644
--- a/gweather/gweather-dialog.c
+++ b/gweather/gweather-dialog.c
@@ -84,6 +84,10 @@ void gweather_dialog_create (GWeatherApplet *gw_applet)
else
gtk_widget_set_usize (gw_applet->gweather_dialog, 590, 340);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (gw_applet->gweather_dialog),
+ gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet)));
+#endif
gtk_window_set_policy (GTK_WINDOW (gw_applet->gweather_dialog), FALSE, FALSE, FALSE);
weather_vbox = GTK_DIALOG (gw_applet->gweather_dialog)->vbox;
diff --git a/gweather/gweather-pref.c b/gweather/gweather-pref.c
index e6b955d9b..330b3f6ad 100644
--- a/gweather/gweather-pref.c
+++ b/gweather/gweather-pref.c
@@ -564,7 +564,11 @@ static void gweather_pref_create (GWeatherApplet *gw_applet)
gtk_dialog_set_default_response (GTK_DIALOG (gw_applet->pref), GTK_RESPONSE_CLOSE);
gtk_widget_set_usize (gw_applet->pref, -2, 280);
gtk_window_set_policy (GTK_WINDOW (gw_applet->pref), TRUE, TRUE, FALSE);
-
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (gw_applet->pref),
+ gtk_widget_get_screen (GTK_WIDGET (gw_applet->applet)));
+#endif
+
pref_vbox = GTK_DIALOG (gw_applet->pref)->vbox;
gtk_widget_show (pref_vbox);
diff --git a/mini-commander/src/Makefile.am b/mini-commander/src/Makefile.am
index a4e5bf62b..a9958a049 100644
--- a/mini-commander/src/Makefile.am
+++ b/mini-commander/src/Makefile.am
@@ -9,7 +9,10 @@ INCLUDES = \
bin_PROGRAMS = mini_commander_applet
+EGGFILES = egg-screen-exec.h egg-screen-exec.c
+
mini_commander_applet_SOURCES = \
+ $(EGGFILES) \
about.c \
about.h \
cmd_completion.c \
@@ -56,7 +59,13 @@ install-data-local:
@INTLTOOL_SERVER_RULE@
+EGGDIR = $(srcdir)/../../../libegg/libegg/screen-exec
+
+regenerate-built-sources:
+ EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
+
EXTRA_DIST = \
+ update-from-egg.sh \
$(server_in_files) \
$(pixmap_DATA) \
$(bitmaps_DATA) \
diff --git a/mini-commander/src/about.c b/mini-commander/src/about.c
index 9b7fd4c88..19d4bef38 100644
--- a/mini-commander/src/about.c
+++ b/mini-commander/src/about.c
@@ -46,6 +46,10 @@ void about_box (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about_box) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_box),
+ gtk_widget_get_screen (GTK_WIDGET (mcdata->applet)));
+#endif
gtk_window_present (GTK_WINDOW (about_box));
return;
}
@@ -70,7 +74,11 @@ This program is free software; you can redistribute it and/or modify it under th
pixbuf);
if (pixbuf)
gdk_pixbuf_unref (pixbuf);
-
+
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about_box),
+ gtk_widget_get_screen (GTK_WIDGET (mcdata->applet)));
+#endif
gtk_window_set_wmclass (GTK_WINDOW (about_box), "command line", "Command Line");
g_signal_connect (about_box, "destroy",
G_CALLBACK (gtk_widget_destroyed),
diff --git a/mini-commander/src/command_line.c b/mini-commander/src/command_line.c
index 1792a1771..93a9090a7 100644
--- a/mini-commander/src/command_line.c
+++ b/mini-commander/src/command_line.c
@@ -356,6 +356,10 @@ show_history_signal (GtkWidget *widget,
j++;
window = gtk_window_new(GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (window),
+ gtk_widget_get_screen (GTK_WIDGET (applet)));
+#endif
gtk_window_set_policy(GTK_WINDOW(window), 0, 0, 1);
/* cb */
gtk_signal_connect_after(GTK_OBJECT(window),
@@ -525,6 +529,10 @@ show_file_browser_signal (GtkWidget *widget,
/* Set as modal */
gtk_window_set_modal(GTK_WINDOW(file_select),TRUE);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (file_select),
+ gtk_widget_get_screen (GTK_WIDGET (applet)));
+#endif
gtk_window_set_position (GTK_WINDOW (file_select), GTK_WIN_POS_MOUSE);
gtk_widget_show(file_select);
diff --git a/mini-commander/src/egg-screen-exec.c b/mini-commander/src/egg-screen-exec.c
new file mode 100644
index 000000000..0337d6881
--- /dev/null
+++ b/mini-commander/src/egg-screen-exec.c
@@ -0,0 +1,188 @@
+/* egg-screen-exec.c
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "egg-screen-exec.h"
+
+#include <string.h>
+#include <libgnome/gnome-exec.h>
+
+#ifndef HAVE_GTK_MULTIHEAD
+#include <gdk/gdkx.h>
+#endif
+
+extern char **environ;
+
+char *
+egg_screen_exec_display_string (GdkScreen *screen)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+ old_display = gdk_display_get_name (gdk_display_get_default ());
+
+ str = g_string_new ("DISPLAY=");
+ g_string_append (str, old_display);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+
+ retval = str->str;
+
+ g_string_free (str, FALSE);
+
+ return retval;
+#else
+ return g_strdup (DisplayString (GDK_DISPLAY ()));
+#endif
+}
+
+char **
+egg_screen_exec_environment (GdkScreen *screen)
+{
+ char **retval = NULL;
+ int i;
+#ifdef HAVE_GTK_MULTIHEAD
+ int display_index = -1;
+
+ for (i = 0; environ [i]; i++)
+ if (!strncmp (environ [i], "DISPLAY", 7))
+ display_index = i;
+
+ if (display_index == -1)
+ display_index = i++;
+#else
+ for (i = 0; environ [i]; i++);
+#endif
+
+ retval = g_new (char *, i + 1);
+
+ for (i = 0; environ [i]; i++)
+#ifdef HAVE_GTK_MULTIHEAD
+ if (i == display_index)
+ retval [i] = egg_screen_exec_display_string (screen);
+ else
+#endif
+ retval [i] = g_strdup (environ [i]);
+
+ retval [i] = NULL;
+
+ return retval;
+}
+
+int
+egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv [])
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ char **envp = NULL;
+ int envc = 0;
+ int retval;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () != screen) {
+ envc = 1;
+ envp = g_new0 (char *, 2);
+ envp [0] = egg_screen_exec_display_string (screen);
+ }
+
+ retval = gnome_execute_async_with_env (dir, argc, argv, envc, envp);
+
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return gnome_execute_async (dir, argc, argv);
+#endif
+}
+
+int
+egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ int retval = -1;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () == screen)
+ retval = gnome_execute_shell (dir, command);
+
+ else {
+ char *exec;
+ char *display;
+
+ display = egg_screen_exec_display_string (screen);
+ exec = g_strconcat (display, " ", command, NULL);
+
+ retval = gnome_execute_shell (dir, exec);
+
+ g_free (display);
+ g_free (exec);
+ }
+
+ return retval;
+#else
+ return gnome_execute_shell (dir, command);
+#endif
+}
+
+gboolean
+egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ gboolean retval;
+ char **argv = NULL;
+ char **envp = NULL;
+
+ g_return_val_if_fail (command != NULL, FALSE);
+
+ if (!g_shell_parse_argv (command, NULL, &argv, error))
+ return FALSE;
+
+ if (gdk_screen_get_default () != screen)
+ envp = egg_screen_exec_environment (screen);
+
+ retval = g_spawn_async (g_get_home_dir (),
+ argv, envp, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return g_spawn_command_line_async (command, error);
+#endif
+}
diff --git a/mini-commander/src/egg-screen-exec.h b/mini-commander/src/egg-screen-exec.h
new file mode 100644
index 000000000..65a6df021
--- /dev/null
+++ b/mini-commander/src/egg-screen-exec.h
@@ -0,0 +1,46 @@
+/* egg-screen-exec.h
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __EGG_SCREEN_EXEC_H__
+#define __EGG_SCREEN_EXEC_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+char *egg_screen_exec_display_string (GdkScreen *screen);
+char **egg_screen_exec_environment (GdkScreen *screen);
+
+int egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv []);
+int egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command);
+gboolean egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __EGG_SCREEN_EXEC_H__ */
diff --git a/mini-commander/src/exec.c b/mini-commander/src/exec.c
index e71cfde77..050758854 100644
--- a/mini-commander/src/exec.c
+++ b/mini-commander/src/exec.c
@@ -23,10 +23,12 @@
#include <string.h>
#include <libgnome/gnome-exec.h>
+#include "egg-screen-exec.h"
#include "exec.h"
#include "macro.h"
#include "preferences.h"
+#include "egg-screen-exec.h"
void
exec_command (const char *cmd,
@@ -42,5 +44,11 @@ exec_command (const char *cmd,
expand_command (command, prop);
+#ifdef HAVE_GTK_MULTIHEAD
+ egg_screen_execute_shell (
+ gtk_widget_get_screen (GTK_WIDGET (applet)),
+ g_get_home_dir (), command);
+#else
gnome_execute_shell (g_get_home_dir (), command);
+#endif
}
diff --git a/mini-commander/src/preferences.c b/mini-commander/src/preferences.c
index 5d32085e6..6e1c49439 100644
--- a/mini-commander/src/preferences.c
+++ b/mini-commander/src/preferences.c
@@ -696,6 +696,10 @@ properties_box (BonoboUIComponent *uic,
int i;
if (mcdata->properties_box) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (mcdata->properties_box),
+ gtk_widget_get_screen (GTK_WIDGET (mcdata->applet)));
+#endif
gtk_window_present (GTK_WINDOW (mcdata->properties_box));
return;
}
@@ -708,6 +712,10 @@ properties_box (BonoboUIComponent *uic,
NULL);
gtk_dialog_set_default_response (GTK_DIALOG (mcdata->properties_box), GTK_RESPONSE_CLOSE);
gtk_window_set_default_size (GTK_WINDOW (mcdata->properties_box), 400, 300);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (mcdata->properties_box),
+ gtk_widget_get_screen (GTK_WIDGET (mcdata->applet)));
+#endif
notebook = gtk_notebook_new ();
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (mcdata->properties_box)->vbox),
diff --git a/mini-commander/src/update-from-egg.sh b/mini-commander/src/update-from-egg.sh
new file mode 100755
index 000000000..9be68a9b4
--- /dev/null
+++ b/mini-commander/src/update-from-egg.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+function die() {
+ echo $*
+ exit 1
+}
+
+if test -z "$EGGDIR"; then
+ echo "Must set EGGDIR"
+ exit 1
+fi
+
+if test -z "$EGGFILES"; then
+ echo "Must set EGGFILES"
+ exit 1
+fi
+
+for FILE in $EGGFILES; do
+ if cmp -s $EGGDIR/$FILE $FILE; then
+ echo "File $FILE is unchanged"
+ else
+ cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE"
+ echo "Updated $FILE"
+ fi
+done
diff --git a/mixer/ChangeLog b/mixer/ChangeLog
index bb1b9d7c6..796c5991c 100644
--- a/mixer/ChangeLog
+++ b/mixer/ChangeLog
@@ -1,5 +1,16 @@
2002-07-11 Mark McLoughlin <mark@skynet.ie>
+ * Makefile.am: add egg-screen-exec.[ch] to the build.
+
+ * mixer.c:
+ (mixer_start_gmix_cb): lauch mixer on the same screen
+ as the applet.
+ (mixer_popup_show), (mixer_start_gmix_cb), (mixer_about_cb),
+ (mixer_applet_create): realise dialogs on the same screen as
+ the applet.
+
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
* mixer.c:
(mixer_start_gmix_cb): pop up error dialog if
we fail to execute mixer.
diff --git a/mixer/Makefile.am b/mixer/Makefile.am
index 338895324..1e950cb79 100644
--- a/mixer/Makefile.am
+++ b/mixer/Makefile.am
@@ -11,7 +11,10 @@ INCLUDES = -I. -I$(srcdir) \
bin_PROGRAMS = mixer_applet2
+EGGFILES = egg-screen-exec.h egg-screen-exec.c
+
mixer_applet2_SOURCES = \
+ $(EGGFILES) \
mixer.c
mixer_applet2_LDADD = \
@@ -24,10 +27,16 @@ server_DATA = $(server_in_files:.server.in=.server)
@INTLTOOL_SERVER_RULE@
+EGGDIR = $(srcdir)/../../libegg/libegg/screen-exec
+
+regenerate-built-sources:
+ EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
+
uidir = $(datadir)/gnome-2.0/ui
ui_DATA = GNOME_MixerApplet.xml
EXTRA_DIST = \
+ update-from-egg.sh \
$(server_DATA) \
$(server_in_files) \
$(ui_DATA) \
diff --git a/mixer/egg-screen-exec.c b/mixer/egg-screen-exec.c
new file mode 100644
index 000000000..0337d6881
--- /dev/null
+++ b/mixer/egg-screen-exec.c
@@ -0,0 +1,188 @@
+/* egg-screen-exec.c
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "egg-screen-exec.h"
+
+#include <string.h>
+#include <libgnome/gnome-exec.h>
+
+#ifndef HAVE_GTK_MULTIHEAD
+#include <gdk/gdkx.h>
+#endif
+
+extern char **environ;
+
+char *
+egg_screen_exec_display_string (GdkScreen *screen)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+ old_display = gdk_display_get_name (gdk_display_get_default ());
+
+ str = g_string_new ("DISPLAY=");
+ g_string_append (str, old_display);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+
+ retval = str->str;
+
+ g_string_free (str, FALSE);
+
+ return retval;
+#else
+ return g_strdup (DisplayString (GDK_DISPLAY ()));
+#endif
+}
+
+char **
+egg_screen_exec_environment (GdkScreen *screen)
+{
+ char **retval = NULL;
+ int i;
+#ifdef HAVE_GTK_MULTIHEAD
+ int display_index = -1;
+
+ for (i = 0; environ [i]; i++)
+ if (!strncmp (environ [i], "DISPLAY", 7))
+ display_index = i;
+
+ if (display_index == -1)
+ display_index = i++;
+#else
+ for (i = 0; environ [i]; i++);
+#endif
+
+ retval = g_new (char *, i + 1);
+
+ for (i = 0; environ [i]; i++)
+#ifdef HAVE_GTK_MULTIHEAD
+ if (i == display_index)
+ retval [i] = egg_screen_exec_display_string (screen);
+ else
+#endif
+ retval [i] = g_strdup (environ [i]);
+
+ retval [i] = NULL;
+
+ return retval;
+}
+
+int
+egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv [])
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ char **envp = NULL;
+ int envc = 0;
+ int retval;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () != screen) {
+ envc = 1;
+ envp = g_new0 (char *, 2);
+ envp [0] = egg_screen_exec_display_string (screen);
+ }
+
+ retval = gnome_execute_async_with_env (dir, argc, argv, envc, envp);
+
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return gnome_execute_async (dir, argc, argv);
+#endif
+}
+
+int
+egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ int retval = -1;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () == screen)
+ retval = gnome_execute_shell (dir, command);
+
+ else {
+ char *exec;
+ char *display;
+
+ display = egg_screen_exec_display_string (screen);
+ exec = g_strconcat (display, " ", command, NULL);
+
+ retval = gnome_execute_shell (dir, exec);
+
+ g_free (display);
+ g_free (exec);
+ }
+
+ return retval;
+#else
+ return gnome_execute_shell (dir, command);
+#endif
+}
+
+gboolean
+egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ gboolean retval;
+ char **argv = NULL;
+ char **envp = NULL;
+
+ g_return_val_if_fail (command != NULL, FALSE);
+
+ if (!g_shell_parse_argv (command, NULL, &argv, error))
+ return FALSE;
+
+ if (gdk_screen_get_default () != screen)
+ envp = egg_screen_exec_environment (screen);
+
+ retval = g_spawn_async (g_get_home_dir (),
+ argv, envp, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return g_spawn_command_line_async (command, error);
+#endif
+}
diff --git a/mixer/egg-screen-exec.h b/mixer/egg-screen-exec.h
new file mode 100644
index 000000000..65a6df021
--- /dev/null
+++ b/mixer/egg-screen-exec.h
@@ -0,0 +1,46 @@
+/* egg-screen-exec.h
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __EGG_SCREEN_EXEC_H__
+#define __EGG_SCREEN_EXEC_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+char *egg_screen_exec_display_string (GdkScreen *screen);
+char **egg_screen_exec_environment (GdkScreen *screen);
+
+int egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv []);
+int egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command);
+gboolean egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __EGG_SCREEN_EXEC_H__ */
diff --git a/mixer/mixer.c b/mixer/mixer.c
index 0364efa32..c7018f410 100644
--- a/mixer/mixer.c
+++ b/mixer/mixer.c
@@ -504,6 +504,10 @@ mixer_popup_show (MixerData *data)
GdkGrabStatus pointer, keyboard;
data->popup = gtk_window_new (GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (data->popup),
+ gtk_widget_get_screen (data->applet));
+#endif
data->vol_before_popup = readMixer ();
@@ -740,7 +744,12 @@ mixer_start_gmix_cb (BonoboUIComponent *uic,
if (!run_mixer_cmd)
return;
+#ifdef HAVE_GTK_MULTIHEAD
+ egg_screen_execute_command_line_async (
+ gtk_widget_get_screen (data->applet), run_mixer_cmd, &error);
+#else
g_spawn_command_line_async (run_mixer_cmd, &error);
+#endif
if (error) {
GtkWidget *dialog;
@@ -757,7 +766,10 @@ mixer_start_gmix_cb (BonoboUIComponent *uic,
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
-
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (data->applet));
+#endif
gtk_widget_show (dialog);
g_error_free (error);
@@ -784,6 +796,10 @@ mixer_about_cb (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (data->applet));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -800,6 +816,10 @@ mixer_about_cb (BonoboUIComponent *uic,
strcmp (translator_credits, "translator_credits") != 0 ? translator_credits : NULL,
pixbuf);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (data->applet));
+#endif
gtk_window_set_wmclass (GTK_WINDOW(about), "volume control", "Volume Control");
gnome_window_icon_set_from_file (GTK_WINDOW (about), GNOME_ICONDIR"/gnome-mixer-applet.png");
g_signal_connect (G_OBJECT (about), "destroy",
@@ -929,6 +949,10 @@ mixer_applet_create (PanelApplet *applet)
GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
("Couldn't open mixer device %s\n"),
device, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (applet)));
+#endif
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
diff --git a/mixer/update-from-egg.sh b/mixer/update-from-egg.sh
new file mode 100755
index 000000000..9be68a9b4
--- /dev/null
+++ b/mixer/update-from-egg.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+function die() {
+ echo $*
+ exit 1
+}
+
+if test -z "$EGGDIR"; then
+ echo "Must set EGGDIR"
+ exit 1
+fi
+
+if test -z "$EGGFILES"; then
+ echo "Must set EGGFILES"
+ exit 1
+fi
+
+for FILE in $EGGFILES; do
+ if cmp -s $EGGDIR/$FILE $FILE; then
+ echo "File $FILE is unchanged"
+ else
+ cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE"
+ echo "Updated $FILE"
+ fi
+done
diff --git a/multiload/ChangeLog b/multiload/ChangeLog
index 37cada0eb..0165411e9 100644
--- a/multiload/ChangeLog
+++ b/multiload/ChangeLog
@@ -1,5 +1,18 @@
2002-07-11 Mark McLoughlin <mark@skynet.ie>
+ * Makefile.am: add egg-screen-exec.[ch] to the
+ build.
+
+ * main.c:
+ (start_procman_cb): launch procman on the same
+ screen as the applet.
+ (about_cb): realise dialogs on the same screen
+ as the applet.
+
+ * properties.c: (multiload_properties_cb): ditto.
+
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
* global.h: don't export start_procman_cb.
* main.c: (about_cb): use gtk_window_present.
diff --git a/multiload/Makefile.am b/multiload/Makefile.am
index 477186d2b..b4f447269 100644
--- a/multiload/Makefile.am
+++ b/multiload/Makefile.am
@@ -9,7 +9,10 @@ INCLUDES = \
bin_PROGRAMS = multiload-applet-2
+EGGFILES = egg-screen-exec.h egg-screen-exec.c
+
multiload_applet_2_SOURCES = \
+ $(EGGFILES) \
global.h \
linux-proc.h \
load-graph.h \
@@ -39,6 +42,7 @@ install-data-local:
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA) ;
EXTRA_DIST = \
+ update-from-egg.sh \
GNOME_MultiLoadApplet_Factory.server.in \
multiload.schemas \
$(pixmaps) \
@@ -52,3 +56,9 @@ server_in_files = GNOME_MultiLoadApplet_Factory.server.in
server_DATA = $(server_in_files:.server.in=.server)
@INTLTOOL_SERVER_RULE@
+
+EGGDIR = $(srcdir)/../../libegg/libegg/screen-exec
+
+regenerate-built-sources:
+ EGGFILES="$(EGGFILES)" EGGDIR="$(EGGDIR)" $(srcdir)/update-from-egg.sh
+
diff --git a/multiload/egg-screen-exec.c b/multiload/egg-screen-exec.c
new file mode 100644
index 000000000..0337d6881
--- /dev/null
+++ b/multiload/egg-screen-exec.c
@@ -0,0 +1,188 @@
+/* egg-screen-exec.c
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#include <config.h>
+
+#include "egg-screen-exec.h"
+
+#include <string.h>
+#include <libgnome/gnome-exec.h>
+
+#ifndef HAVE_GTK_MULTIHEAD
+#include <gdk/gdkx.h>
+#endif
+
+extern char **environ;
+
+char *
+egg_screen_exec_display_string (GdkScreen *screen)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+ old_display = gdk_display_get_name (gdk_display_get_default ());
+
+ str = g_string_new ("DISPLAY=");
+ g_string_append (str, old_display);
+
+ p = strrchr (str->str, '.');
+ if (p && p > strchr (str->str, ':'))
+ g_string_truncate (str, p - str->str);
+
+ g_string_append_printf (str, ".%d", gdk_screen_get_number (screen));
+
+ retval = str->str;
+
+ g_string_free (str, FALSE);
+
+ return retval;
+#else
+ return g_strdup (DisplayString (GDK_DISPLAY ()));
+#endif
+}
+
+char **
+egg_screen_exec_environment (GdkScreen *screen)
+{
+ char **retval = NULL;
+ int i;
+#ifdef HAVE_GTK_MULTIHEAD
+ int display_index = -1;
+
+ for (i = 0; environ [i]; i++)
+ if (!strncmp (environ [i], "DISPLAY", 7))
+ display_index = i;
+
+ if (display_index == -1)
+ display_index = i++;
+#else
+ for (i = 0; environ [i]; i++);
+#endif
+
+ retval = g_new (char *, i + 1);
+
+ for (i = 0; environ [i]; i++)
+#ifdef HAVE_GTK_MULTIHEAD
+ if (i == display_index)
+ retval [i] = egg_screen_exec_display_string (screen);
+ else
+#endif
+ retval [i] = g_strdup (environ [i]);
+
+ retval [i] = NULL;
+
+ return retval;
+}
+
+int
+egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv [])
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ char **envp = NULL;
+ int envc = 0;
+ int retval;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () != screen) {
+ envc = 1;
+ envp = g_new0 (char *, 2);
+ envp [0] = egg_screen_exec_display_string (screen);
+ }
+
+ retval = gnome_execute_async_with_env (dir, argc, argv, envc, envp);
+
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return gnome_execute_async (dir, argc, argv);
+#endif
+}
+
+int
+egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ int retval = -1;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
+
+ if (gdk_screen_get_default () == screen)
+ retval = gnome_execute_shell (dir, command);
+
+ else {
+ char *exec;
+ char *display;
+
+ display = egg_screen_exec_display_string (screen);
+ exec = g_strconcat (display, " ", command, NULL);
+
+ retval = gnome_execute_shell (dir, exec);
+
+ g_free (display);
+ g_free (exec);
+ }
+
+ return retval;
+#else
+ return gnome_execute_shell (dir, command);
+#endif
+}
+
+gboolean
+egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error)
+{
+#ifdef HAVE_GTK_MULTIHEAD
+ gboolean retval;
+ char **argv = NULL;
+ char **envp = NULL;
+
+ g_return_val_if_fail (command != NULL, FALSE);
+
+ if (!g_shell_parse_argv (command, NULL, &argv, error))
+ return FALSE;
+
+ if (gdk_screen_get_default () != screen)
+ envp = egg_screen_exec_environment (screen);
+
+ retval = g_spawn_async (g_get_home_dir (),
+ argv, envp, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ return retval;
+#else
+ return g_spawn_command_line_async (command, error);
+#endif
+}
diff --git a/multiload/egg-screen-exec.h b/multiload/egg-screen-exec.h
new file mode 100644
index 000000000..65a6df021
--- /dev/null
+++ b/multiload/egg-screen-exec.h
@@ -0,0 +1,46 @@
+/* egg-screen-exec.h
+ *
+ * Copyright (C) 2002 Sun Microsystems Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ * Authors: Mark McLoughlin <mark@skynet.ie>
+ */
+
+#ifndef __EGG_SCREEN_EXEC_H__
+#define __EGG_SCREEN_EXEC_H__
+
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+char *egg_screen_exec_display_string (GdkScreen *screen);
+char **egg_screen_exec_environment (GdkScreen *screen);
+
+int egg_screen_execute_async (GdkScreen *screen,
+ const char *dir,
+ int argc,
+ char * const argv []);
+int egg_screen_execute_shell (GdkScreen *screen,
+ const char *dir,
+ const char *command);
+gboolean egg_screen_execute_command_line_async (GdkScreen *screen,
+ const char *command,
+ GError **error);
+
+G_END_DECLS
+
+#endif /* __EGG_SCREEN_EXEC_H__ */
diff --git a/multiload/main.c b/multiload/main.c
index abd878a8d..8a7f4b3f0 100644
--- a/multiload/main.c
+++ b/multiload/main.c
@@ -30,6 +30,7 @@
#include <libart_lgpl/libart.h>
#include "global.h"
+#include "egg-screen-exec.h"
static void
about_cb (BonoboUIComponent *uic,
@@ -56,6 +57,10 @@ about_cb (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -83,7 +88,11 @@ about_cb (BonoboUIComponent *uic,
if (pixbuf)
gdk_pixbuf_unref (pixbuf);
-
+
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)));
+#endif
gtk_window_set_wmclass (GTK_WINDOW (about), "system monitor", "System Monitor");
g_signal_connect (G_OBJECT (about), "destroy",
G_CALLBACK (gtk_widget_destroyed), &about);
@@ -100,7 +109,13 @@ start_procman_cb (BonoboUIComponent *uic,
{
GError *error = NULL;
+#ifdef HAVE_GTK_MULTIHEAD
+ egg_screen_execute_command_line_async (
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)),
+ "gnome-system-monitor", &error);
+#else
g_spawn_command_line_async ("gnome-system-monitor", &error);
+#endif
if (error) {
GtkWidget *dialog;
@@ -116,6 +131,10 @@ start_procman_cb (BonoboUIComponent *uic,
NULL);
gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)));
+#endif
gtk_widget_show (dialog);
diff --git a/multiload/properties.c b/multiload/properties.c
index 821471f32..b1cb51e27 100644
--- a/multiload/properties.c
+++ b/multiload/properties.c
@@ -404,6 +404,10 @@ multiload_properties_cb (BonoboUIComponent *uic,
static GtkWidget *dialog = NULL;
if (dialog) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)));
+#endif
gtk_window_present (GTK_WINDOW (dialog));
return;
}
@@ -412,6 +416,10 @@ multiload_properties_cb (BonoboUIComponent *uic,
NULL, 0,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (ma->applet)));
+#endif
fill_properties(dialog, ma);
diff --git a/multiload/update-from-egg.sh b/multiload/update-from-egg.sh
new file mode 100755
index 000000000..9be68a9b4
--- /dev/null
+++ b/multiload/update-from-egg.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+function die() {
+ echo $*
+ exit 1
+}
+
+if test -z "$EGGDIR"; then
+ echo "Must set EGGDIR"
+ exit 1
+fi
+
+if test -z "$EGGFILES"; then
+ echo "Must set EGGFILES"
+ exit 1
+fi
+
+for FILE in $EGGFILES; do
+ if cmp -s $EGGDIR/$FILE $FILE; then
+ echo "File $FILE is unchanged"
+ else
+ cp $EGGDIR/$FILE $FILE || die "Could not move $EGGDIR/$FILE to $FILE"
+ echo "Updated $FILE"
+ fi
+done
diff --git a/panel-menu/ChangeLog b/panel-menu/ChangeLog
index 9d8244e27..7fb2a1d04 100644
--- a/panel-menu/ChangeLog
+++ b/panel-menu/ChangeLog
@@ -1,5 +1,17 @@
2002-07-11 Mark McLoughlin <mark@skynet.ie>
+ * panel-menu-add.c: (applet_add_cb), (add_entry_dnd_drag_begin_cb):
+ * panel-menu-common.c: (widget_dnd_drag_begin_cb),
+ (panel_menu_common_remove_entry),
+ (panel_menu_common_single_entry_dialog_new):
+ * panel-menu-directory.c: (panel_menu_directory_edit_dialog_new):
+ * panel-menu-path.c: (panel_menu_path_edit_dialog_new):
+ * panel-menu-properties.c: (applet_properties_cb):
+ * panel-menu.c: (applet_about_cb): realise all dialogs on the same
+ screen as the applet.
+
+2002-07-11 Mark McLoughlin <mark@skynet.ie>
+
* panel-menu-common.[ch]:
(panel_menu_common_single_entry_dialog_new): add PanelMenu
arg.
diff --git a/panel-menu/panel-menu-add.c b/panel-menu/panel-menu-add.c
index 8b3636111..fdc0559d8 100644
--- a/panel-menu/panel-menu-add.c
+++ b/panel-menu/panel-menu-add.c
@@ -75,6 +75,10 @@ applet_add_cb (BonoboUIComponent *uic,
dialog = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dialog), _("Add items to the Menu Bar"));
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
box = GTK_DIALOG (dialog)->vbox;
@@ -208,6 +212,10 @@ add_entry_dnd_drag_begin_cb (GtkWidget *widget,
GtkWidget *button;
window = gtk_window_new (GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (window),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
button = gtk_button_new_with_label (gtk_label_get_text
(GTK_LABEL
(GTK_BIN (widget)->child)));
diff --git a/panel-menu/panel-menu-common.c b/panel-menu/panel-menu-common.c
index d7cfd0d62..52e3d9ee1 100644
--- a/panel-menu/panel-menu-common.c
+++ b/panel-menu/panel-menu-common.c
@@ -123,6 +123,11 @@ widget_dnd_drag_begin_cb (GtkWidget *widget,
gtk_drag_set_icon_pixbuf (context, pixbuf, -5, -5);
} else {
window = gtk_window_new (GTK_WINDOW_POPUP);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (
+ GTK_WINDOW (window),
+ gtk_widget_get_screen (GTK_WIDGET (entry->parent->applet)));
+#endif
button = gtk_button_new_with_label (gtk_label_get_text
(GTK_LABEL
(GTK_BIN (widget)->
@@ -734,6 +739,10 @@ panel_menu_common_remove_entry (GtkWidget *widget,
GTK_BUTTONS_OK,
_("Removing this entry is not allowed as this will cause the Menu Bar applet to be removed from GNOME Panel"));
gtk_dialog_set_default_response (GTK_DIALOG (message_dlg), GTK_RESPONSE_OK);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (message_dlg),
+ gtk_widget_get_screen (GTK_WIDGET (entry->parent->applet)));
+#endif
gtk_window_set_resizable (GTK_WINDOW (message_dlg), FALSE);
g_signal_connect (message_dlg, "response",
G_CALLBACK (handle_response), NULL);
@@ -799,6 +808,10 @@ panel_menu_common_single_entry_dialog_new (PanelMenu *panel_menu,
GTK_STOCK_CLOSE,
GTK_RESPONSE_CLOSE, GTK_STOCK_OK,
GTK_RESPONSE_OK, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
box = GTK_DIALOG (dialog)->vbox;
diff --git a/panel-menu/panel-menu-directory.c b/panel-menu/panel-menu-directory.c
index dd8e74104..65153dee9 100644
--- a/panel-menu/panel-menu-directory.c
+++ b/panel-menu/panel-menu-directory.c
@@ -662,6 +662,10 @@ panel_menu_directory_edit_dialog_new (PanelMenu *panel_menu,
GTK_STOCK_CLOSE,
GTK_RESPONSE_CLOSE, GTK_STOCK_OK,
GTK_RESPONSE_OK, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
box = GTK_DIALOG (dialog)->vbox;
gtk_container_set_border_width (GTK_CONTAINER (box), 5);
diff --git a/panel-menu/panel-menu-path.c b/panel-menu/panel-menu-path.c
index 797551aa6..1cb8bb11e 100644
--- a/panel-menu/panel-menu-path.c
+++ b/panel-menu/panel-menu-path.c
@@ -724,6 +724,10 @@ panel_menu_path_edit_dialog_new (PanelMenu *panel_menu,
GTK_STOCK_CLOSE,
GTK_RESPONSE_CLOSE, GTK_STOCK_OK,
GTK_RESPONSE_OK, NULL);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
box = GTK_DIALOG (dialog)->vbox;
diff --git a/panel-menu/panel-menu-properties.c b/panel-menu/panel-menu-properties.c
index c666303f9..bb1c4054f 100644
--- a/panel-menu/panel-menu-properties.c
+++ b/panel-menu/panel-menu-properties.c
@@ -70,6 +70,10 @@ applet_properties_cb (BonoboUIComponent *uic,
dialog = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dialog), _("Menu Bar Preferences"));
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (dialog),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
box = GTK_DIALOG (dialog)->vbox;
diff --git a/panel-menu/panel-menu.c b/panel-menu/panel-menu.c
index 71b157964..b671f1e6c 100644
--- a/panel-menu/panel-menu.c
+++ b/panel-menu/panel-menu.c
@@ -673,6 +673,10 @@ applet_about_cb (BonoboUIComponent *uic,
const gchar *translator_credits = _("translator_credits");
if (about) {
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
gtk_window_present (GTK_WINDOW (about));
return;
}
@@ -695,6 +699,10 @@ applet_about_cb (BonoboUIComponent *uic,
strcmp (translator_credits, "translator_credits") != 0 ? translator_credits : NULL,
pixbuf);
+#ifdef HAVE_GTK_MULTIHEAD
+ gtk_window_set_screen (GTK_WINDOW (about),
+ gtk_widget_get_screen (GTK_WIDGET (panel_menu->applet)));
+#endif
gtk_window_set_wmclass (GTK_WINDOW (about), "panel-menu", "PanelMenu");
if (pixbuf) {
gtk_window_set_icon (GTK_WINDOW (about), pixbuf);