grab keys on all the screens for the current display

2003-07-03  Bastien Nocera  <hadess@hadess.net>

	* gnome-settings-keybindings.c: (get_screens_list),
	(screen_exec_display_string), (grab_key), (do_grab),
	(gnome_settings_keybindings_load): grab keys on all the screens for the
	current display
This commit is contained in:
Bastien Nocera 2003-07-03 21:39:23 +00:00 committed by Bastien Nocera
parent 73930e8c2a
commit 6b1e429fcd
2 changed files with 56 additions and 12 deletions

View file

@ -1,3 +1,10 @@
2003-07-03 Bastien Nocera <hadess@hadess.net>
* gnome-settings-keybindings.c: (get_screens_list),
(screen_exec_display_string), (grab_key), (do_grab),
(gnome_settings_keybindings_load): grab keys on all the screens for the
current display
Thu Jun 26 07:37:20 2003 Jonathan Blandford <jrb@gnome.org>
* gnome-settings-typing-break.c: new module to handle the

View file

@ -35,6 +35,30 @@ typedef struct {
} Binding;
static GSList *binding_list = NULL;
static GSList *screens = NULL;
static GSList *
get_screens_list (void)
{
GdkDisplay *display = gdk_display_get_default();
GSList *list = NULL;
int i;
if (gdk_display_get_n_screens (display) == 1) {
list = g_slist_append (list, gdk_screen_get_default ());
} else {
for (i = 0; i < gdk_display_get_n_screens (display); i++) {
GdkScreen *screen;
screen = gdk_display_get_screen (display, i);
if (screen != NULL) {
list = g_slist_append (list, screen);
}
}
}
return list;
}
char *
screen_exec_display_string (XEvent *xevent)
@ -44,8 +68,6 @@ screen_exec_display_string (XEvent *xevent)
char *retval;
char *p;
#ifdef HAVE_GTK_MULTIHEAD
GdkScreen *screen = NULL;
GdkWindow *window = gdk_xid_table_lookup (xevent->xkey.root);
@ -71,9 +93,6 @@ screen_exec_display_string (XEvent *xevent)
g_string_free (str, FALSE);
return retval;
#else
return g_strdup ("DISPLAY=:0.0");
#endif
}
static gint
@ -214,6 +233,23 @@ key_already_used (Binding *binding)
return FALSE;
}
static void
grab_key (GdkWindow *root, Key *key, int result, gboolean grab)
{
gdk_error_trap_push ();
if (grab)
XGrabKey (GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync);
else
XUngrabKey(GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_WINDOW_XID (root));
gdk_flush ();
if (gdk_error_trap_pop ()) {
g_warning (_("It seems that another application already has"
" access to key '%d'."), key->keycode);
}
}
/* inspired from all_combinations from gnome-panel/gnome-panel/global-keys.c */
#define N_BITS 32
static void
@ -235,19 +271,19 @@ do_grab (gboolean grab,
uppervalue = 1<<bits_set_cnt;
for (i = 0; i < uppervalue; i++) {
GSList *l;
int j, result = 0;
for (j = 0; j < bits_set_cnt; j++) {
if (i & (1<<j))
result |= (1<<indexes[j]);
}
/* FIXME need to grab for all root windows for the display */
if (grab)
XGrabKey (GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_ROOT_WINDOW(), True, GrabModeAsync, GrabModeAsync);
else
XUngrabKey(GDK_DISPLAY(), key->keycode, (result | key->state),
GDK_ROOT_WINDOW());
for (l = screens; l ; l = l->next) {
GdkScreen *screen = l->data;
grab_key (gdk_screen_get_root_window (screen), key, result,
grab);
}
}
}
@ -385,6 +421,7 @@ gnome_settings_keybindings_load (GConfClient *client)
GSList *list, *li;
list = gconf_client_all_dirs (client, GCONF_BINDING_DIR, NULL);
screens = get_screens_list ();
for (li = list; li != NULL; li = li->next)
{