summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwann Chenede - <erwann.chenede@sun.com>2002-10-18 17:22:13 +0000
committerErwann Chenede <erwannc@src.gnome.org>2002-10-18 17:22:13 +0000
commitb1108500bf349fe92876121a8fc832a34cc8b3a0 (patch)
treedbe590ac8e9b0a9421176d62f163b50a4afa0b18
parent9266656beac6c238d5c34b0b7e9e89e8794f7449 (diff)
downloadgnome-control-center-b1108500bf349fe92876121a8fc832a34cc8b3a0.tar.gz
added function to get display string from an XEvent. (keybindings_filter)
2002-10-18 Erwann Chenede - <erwann.chenede@sun.com> * gnome-settings-keybindings.c (screen_exec_display_string) : added function to get display string from an XEvent. (keybindings_filter) : set a fully qualified DISPLAY env variable when spawing a keybinding action.
-rw-r--r--gnome-settings-daemon/ChangeLog8
-rw-r--r--gnome-settings-daemon/gnome-settings-keybindings.c77
2 files changed, 79 insertions, 6 deletions
diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog
index 900a46dd5..d9f06f0bd 100644
--- a/gnome-settings-daemon/ChangeLog
+++ b/gnome-settings-daemon/ChangeLog
@@ -1,3 +1,11 @@
+2002-10-18 Erwann Chenede - <erwann.chenede@sun.com>
+
+ * gnome-settings-keybindings.c
+ (screen_exec_display_string) : added function to get display
+ string from an XEvent.
+ (keybindings_filter) : set a fully qualified DISPLAY env variable
+ when spawing a keybinding action.
+
2002-10-08 Jody Goldberg <jody@gnome.org>
http://bugzilla.gnome.org/show_bug.cgi?id=91535
diff --git a/gnome-settings-daemon/gnome-settings-keybindings.c b/gnome-settings-daemon/gnome-settings-keybindings.c
index 0f87eb3fa..dfaa76e01 100644
--- a/gnome-settings-daemon/gnome-settings-keybindings.c
+++ b/gnome-settings-daemon/gnome-settings-keybindings.c
@@ -36,6 +36,46 @@ typedef struct {
static GSList *binding_list = NULL;
+char *
+screen_exec_display_string (XEvent *xevent)
+{
+ GString *str;
+ const char *old_display;
+ char *retval;
+ char *p;
+
+#ifdef HAVE_GTK_MULTIHEAD
+
+ GdkScreen *screen = NULL;
+
+ GdkWindow *window = gdk_xid_table_lookup (xevent->xkey.root);
+
+ if (window)
+ screen = gdk_drawable_get_screen (GDK_DRAWABLE (window));
+
+ g_assert (GDK_IS_SCREEN (screen));
+
+ old_display = gdk_display_get_name (gdk_screen_get_display (screen));
+
+ 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 ("DISPLAY=:0.0");
+#endif
+}
+
static gint
compare_bindings (gconstpointer a, gconstpointer b)
{
@@ -284,8 +324,33 @@ keybindings_filter (GdkXEvent *gdk_xevent,
(state & USED_MODS) == binding->key.state)
{
GError* error = NULL;
+ gboolean retval;
+ gchar **argv = NULL;
+ gchar **envp = NULL;
+
+ g_return_val_if_fail (binding->action != NULL, GDK_FILTER_CONTINUE);
- if (!g_spawn_command_line_async (binding->action, &error))
+ if (!g_shell_parse_argv (binding->action,
+ NULL, &argv,
+ &error))
+ return GDK_FILTER_CONTINUE;
+
+ envp = g_new0 (gchar *, 2);
+ envp [0] = screen_exec_display_string (xevent);
+ envp [1] = NULL;
+
+ retval = g_spawn_async (NULL,
+ argv,
+ envp,
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ NULL,
+ &error);
+ g_strfreev (argv);
+ g_strfreev (envp);
+
+ if (!retval)
{
GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_WARNING,
GTK_BUTTONS_CLOSE,
@@ -307,11 +372,11 @@ keybindings_filter (GdkXEvent *gdk_xevent,
void
gnome_settings_keybindings_init (GConfClient *client)
{
- gnome_settings_daemon_register_callback (GCONF_BINDING_DIR, bindings_callback);
- gdk_window_add_filter (gdk_get_default_root_window (),
- keybindings_filter,
- NULL);
-
+ gnome_settings_daemon_register_callback (GCONF_BINDING_DIR, bindings_callback);
+
+ gdk_window_add_filter (gdk_get_default_root_window (),
+ keybindings_filter,
+ NULL);
}
void