diff options
author | Mark McLoughlin <mark@skynet.ie> | 2002-07-11 05:03:36 +0000 |
---|---|---|
committer | Mark McLoughlin <mmclouglin@src.gnome.org> | 2002-07-11 05:03:36 +0000 |
commit | 4df7d731d7b97df1a2b93586ba1bbf99f99d043b (patch) | |
tree | 4b606bc219fe45f8dbbb9a9680648e0d71482eab | |
parent | 6d41e3189b48154daa9c89d674ff9510d78da3c7 (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.
65 files changed, 1761 insertions, 7 deletions
@@ -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); |