diff --git a/ChangeLog b/ChangeLog index c97320d76..75d9f958d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2003-02-22 Havoc Pennington + + * src/display.c (meta_display_get_tab_next): when tabbing + backward, we are still tabbing *from* the most recently used + window, not from the least recently used window. + + * src/keybindings.c (struct _MetaKeyBinding): make keycode + unsigned to match XEvent + + Patch for #84999 based on patch from Mark McLoughlin + + * src/prefs.c: add an add_shift field to MetaKeyPref to + add shift when grabbing the given keybinding. + + * src/keybindings.c (rebuild_screen_binding_table) + (rebuild_window_binding_table): refactor to share code, + and honor add_shift field in MetaKeyPref + 2003-02-20 Havoc Pennington * src/stack.c (create_constraints): don't create constraints diff --git a/src/display.c b/src/display.c index 36971cc9b..9213c8c43 100644 --- a/src/display.c +++ b/src/display.c @@ -3541,7 +3541,7 @@ meta_display_get_tab_next (MetaDisplay *display, if (backward) return find_tab_backward (display, type, screen, workspace, - g_list_last (display->mru_list)); + display->mru_list); else return find_tab_forward (display, type, screen, workspace, display->mru_list); diff --git a/src/display.h b/src/display.h index c5dae68aa..44381b909 100644 --- a/src/display.h +++ b/src/display.h @@ -259,8 +259,8 @@ struct _MetaDisplay int n_screen_bindings; MetaKeyBinding *window_bindings; int n_window_bindings; - int min_keycode; - int max_keycode; + unsigned int min_keycode; + unsigned int max_keycode; KeySym *keymap; int keysyms_per_keycode; XModifierKeymap *modmap; diff --git a/src/keybindings.c b/src/keybindings.c index 2190091e5..713e4242a 100644 --- a/src/keybindings.c +++ b/src/keybindings.c @@ -209,7 +209,7 @@ struct _MetaKeyBinding const char *name; KeySym keysym; unsigned int mask; - int keycode; + unsigned int keycode; MetaVirtualModifier modifiers; const MetaKeyHandler *handler; }; @@ -429,7 +429,7 @@ reload_modmap (MetaDisplay *display) /* get the key code at this point in the map, * see if its keysym is one we're interested in */ - int keycode = modmap->modifiermap[i]; + unsigned int keycode = modmap->modifiermap[i]; if (keycode >= display->min_keycode && keycode <= display->max_keycode) @@ -512,7 +512,7 @@ reload_keycodes (MetaDisplay *display) int i; i = 0; - while (display->screen_bindings[i].keysym != None) + while (i < display->n_screen_bindings) { display->screen_bindings[i].keycode = XKeysymToKeycode (display->xdisplay, display->screen_bindings[i].keysym); @@ -526,7 +526,7 @@ reload_keycodes (MetaDisplay *display) int i; i = 0; - while (display->window_bindings[i].keysym != None) + while (i < display->n_window_bindings) { display->window_bindings[i].keycode = XKeysymToKeycode (display->xdisplay, display->window_bindings[i].keysym); @@ -547,11 +547,17 @@ reload_modifiers (MetaDisplay *display) int i; i = 0; - while (display->screen_bindings[i].keysym != None) + while (i < display->n_screen_bindings) { meta_display_devirtualize_modifiers (display, display->screen_bindings[i].modifiers, &display->screen_bindings[i].mask); + + meta_topic (META_DEBUG_KEYBINDINGS, + " Devirtualized mods 0x%x -> 0x%x (%s)\n", + display->screen_bindings[i].modifiers, + display->screen_bindings[i].mask, + display->screen_bindings[i].name); ++i; } @@ -562,93 +568,137 @@ reload_modifiers (MetaDisplay *display) int i; i = 0; - while (display->window_bindings[i].keysym != None) + while (i < display->n_window_bindings) { meta_display_devirtualize_modifiers (display, display->window_bindings[i].modifiers, &display->window_bindings[i].mask); + + meta_topic (META_DEBUG_KEYBINDINGS, + " Devirtualized mods 0x%x -> 0x%x (%s)\n", + display->window_bindings[i].modifiers, + display->window_bindings[i].mask, + display->window_bindings[i].name); ++i; } } } -static void -rebuild_screen_binding_table (MetaDisplay *display) +static int +count_bindings (const MetaKeyPref *prefs, + int n_prefs) +{ + int i; + int count; + + count = 0; + i = 0; + while (i < n_prefs) + { + if (prefs[i].keysym != None) + { + count += 1; + + if (prefs[i].add_shift && + (prefs[i].modifiers & META_VIRTUAL_SHIFT_MASK) == 0) + count += 1; + } + + ++i; + } + + return count; +} + +static void +rebuild_binding_table (MetaDisplay *display, + MetaKeyBinding **bindings_p, + int *n_bindings_p, + const MetaKeyPref *prefs, + int n_prefs) { - const MetaKeyPref *prefs; int n_bindings; int src, dest; - meta_topic (META_DEBUG_KEYBINDINGS, - "Rebuilding screen binding table from preferences\n"); - - meta_prefs_get_screen_bindings (&prefs, &n_bindings); - g_free (display->screen_bindings); - display->screen_bindings = g_new0 (MetaKeyBinding, n_bindings); + n_bindings = count_bindings (prefs, n_prefs); + g_free (*bindings_p); + *bindings_p = g_new0 (MetaKeyBinding, n_bindings); src = 0; dest = 0; - while (src < n_bindings) + while (src < n_prefs) { if (prefs[src].keysym != None) { - display->screen_bindings[dest].name = prefs[src].name; - display->screen_bindings[dest].keysym = prefs[src].keysym; - display->screen_bindings[dest].modifiers = prefs[src].modifiers; - display->screen_bindings[dest].mask = 0; - display->screen_bindings[dest].keycode = 0; + (*bindings_p)[dest].name = prefs[src].name; + (*bindings_p)[dest].keysym = prefs[src].keysym; + (*bindings_p)[dest].modifiers = prefs[src].modifiers; + (*bindings_p)[dest].mask = 0; + (*bindings_p)[dest].keycode = 0; ++dest; + + if (prefs[src].add_shift && + (prefs[src].modifiers & META_VIRTUAL_SHIFT_MASK) == 0) + { + meta_topic (META_DEBUG_KEYBINDINGS, + "Binding %s also needs Shift grabbed\n", + prefs[src].name); + + (*bindings_p)[dest].name = prefs[src].name; + (*bindings_p)[dest].keysym = prefs[src].keysym; + (*bindings_p)[dest].modifiers = prefs[src].modifiers | + META_VIRTUAL_SHIFT_MASK; + (*bindings_p)[dest].mask = 0; + (*bindings_p)[dest].keycode = 0; + + ++dest; + } } ++src; } - display->n_screen_bindings = dest; + g_assert (dest == n_bindings); + + *n_bindings_p = dest; meta_topic (META_DEBUG_KEYBINDINGS, - "%d screen bindings in table\n", - display->n_screen_bindings); + " %d bindings in table\n", + *n_bindings_p); +} + +static void +rebuild_screen_binding_table (MetaDisplay *display) +{ + const MetaKeyPref *prefs; + int n_prefs; + + meta_topic (META_DEBUG_KEYBINDINGS, + "Rebuilding screen binding table from preferences\n"); + + meta_prefs_get_screen_bindings (&prefs, &n_prefs); + rebuild_binding_table (display, + &display->screen_bindings, + &display->n_screen_bindings, + prefs, n_prefs); } static void rebuild_window_binding_table (MetaDisplay *display) { const MetaKeyPref *prefs; - int n_bindings; - int src, dest; + int n_prefs; meta_topic (META_DEBUG_KEYBINDINGS, "Rebuilding window binding table from preferences\n"); - meta_prefs_get_window_bindings (&prefs, &n_bindings); - g_free (display->window_bindings); - display->window_bindings = g_new0 (MetaKeyBinding, n_bindings); - - src = 0; - dest = 0; - while (src < n_bindings) - { - if (prefs[src].keysym != None) - { - display->window_bindings[dest].name = prefs[src].name; - display->window_bindings[dest].keysym = prefs[src].keysym; - display->window_bindings[dest].modifiers = prefs[src].modifiers; - display->window_bindings[dest].mask = 0; - display->window_bindings[dest].keycode = 0; - - ++dest; - } - - ++src; - } - - display->n_window_bindings = dest; - - meta_topic (META_DEBUG_KEYBINDINGS, - "%d window bindings in table\n", - display->n_window_bindings); + meta_prefs_get_window_bindings (&prefs, &n_prefs); + rebuild_binding_table (display, + &display->window_bindings, + &display->n_window_bindings, + prefs, n_prefs); } static void @@ -854,7 +904,7 @@ meta_change_keygrab (MetaDisplay *display, Window xwindow, gboolean grab, int keysym, - int keycode, + unsigned int keycode, int modmask) { int ignored_mask; @@ -925,7 +975,7 @@ static void meta_grab_key (MetaDisplay *display, Window xwindow, int keysym, - int keycode, + unsigned int keycode, int modmask) { meta_change_keygrab (display, xwindow, TRUE, keysym, keycode, modmask); @@ -1422,6 +1472,11 @@ process_event (MetaKeyBinding *bindings, { const MetaKeyHandler *handler; + meta_topic (META_DEBUG_KEYBINDINGS, + "Binding keycode 0x%x mask 0x%x matches event 0x%x state 0x%x\n", + bindings[i].keycode, bindings[i].mask, + event->xkey.keycode, event->xkey.state); + if (bindings[i].handler) handler = bindings[i].handler; else diff --git a/src/prefs.c b/src/prefs.c index 512a555b5..88e273a6b 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -1338,100 +1338,100 @@ meta_prefs_set_num_workspaces (int n_workspaces) /* Indexes must correspond to MetaKeybindingAction */ static MetaKeyPref screen_bindings[] = { - { META_KEYBINDING_WORKSPACE_1, 0, 0 }, - { META_KEYBINDING_WORKSPACE_2, 0, 0 }, - { META_KEYBINDING_WORKSPACE_3, 0, 0 }, - { META_KEYBINDING_WORKSPACE_4, 0, 0 }, - { META_KEYBINDING_WORKSPACE_5, 0, 0 }, - { META_KEYBINDING_WORKSPACE_6, 0, 0 }, - { META_KEYBINDING_WORKSPACE_7, 0, 0 }, - { META_KEYBINDING_WORKSPACE_8, 0, 0 }, - { META_KEYBINDING_WORKSPACE_9, 0, 0 }, - { META_KEYBINDING_WORKSPACE_10, 0, 0 }, - { META_KEYBINDING_WORKSPACE_11, 0, 0 }, - { META_KEYBINDING_WORKSPACE_12, 0, 0 }, - { META_KEYBINDING_WORKSPACE_LEFT, 0, 0 }, - { META_KEYBINDING_WORKSPACE_RIGHT, 0, 0 }, - { META_KEYBINDING_WORKSPACE_UP, 0, 0 }, - { META_KEYBINDING_WORKSPACE_DOWN, 0, 0 }, - { META_KEYBINDING_SWITCH_WINDOWS, 0, 0 }, - { META_KEYBINDING_SWITCH_WINDOWS_BACKWARD, 0, 0 }, - { META_KEYBINDING_SWITCH_PANELS, 0, 0 }, - { META_KEYBINDING_SWITCH_PANELS_BACKWARD, 0, 0 }, - { META_KEYBINDING_CYCLE_WINDOWS, 0, 0 }, - { META_KEYBINDING_CYCLE_WINDOWS_BACKWARD, 0, 0 }, - { META_KEYBINDING_CYCLE_PANELS, 0, 0 }, - { META_KEYBINDING_CYCLE_PANELS_BACKWARD, 0, 0 }, - { META_KEYBINDING_SHOW_DESKTOP, 0, 0 }, - { META_KEYBINDING_COMMAND_1, 0, 0 }, - { META_KEYBINDING_COMMAND_2, 0, 0 }, - { META_KEYBINDING_COMMAND_3, 0, 0 }, - { META_KEYBINDING_COMMAND_4, 0, 0 }, - { META_KEYBINDING_COMMAND_5, 0, 0 }, - { META_KEYBINDING_COMMAND_6, 0, 0 }, - { META_KEYBINDING_COMMAND_7, 0, 0 }, - { META_KEYBINDING_COMMAND_8, 0, 0 }, - { META_KEYBINDING_COMMAND_9, 0, 0 }, - { META_KEYBINDING_COMMAND_10, 0, 0 }, - { META_KEYBINDING_COMMAND_11, 0, 0 }, - { META_KEYBINDING_COMMAND_12, 0, 0 }, - { META_KEYBINDING_COMMAND_13, 0, 0 }, - { META_KEYBINDING_COMMAND_14, 0, 0 }, - { META_KEYBINDING_COMMAND_15, 0, 0 }, - { META_KEYBINDING_COMMAND_16, 0, 0 }, - { META_KEYBINDING_COMMAND_17, 0, 0 }, - { META_KEYBINDING_COMMAND_18, 0, 0 }, - { META_KEYBINDING_COMMAND_19, 0, 0 }, - { META_KEYBINDING_COMMAND_20, 0, 0 }, - { META_KEYBINDING_COMMAND_21, 0, 0 }, - { META_KEYBINDING_COMMAND_22, 0, 0 }, - { META_KEYBINDING_COMMAND_23, 0, 0 }, - { META_KEYBINDING_COMMAND_24, 0, 0 }, - { META_KEYBINDING_COMMAND_25, 0, 0 }, - { META_KEYBINDING_COMMAND_26, 0, 0 }, - { META_KEYBINDING_COMMAND_27, 0, 0 }, - { META_KEYBINDING_COMMAND_28, 0, 0 }, - { META_KEYBINDING_COMMAND_29, 0, 0 }, - { META_KEYBINDING_COMMAND_30, 0, 0 }, - { META_KEYBINDING_COMMAND_31, 0, 0 }, - { META_KEYBINDING_COMMAND_32, 0, 0 }, - { NULL, 0, 0 } + { META_KEYBINDING_WORKSPACE_1, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_2, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_3, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_4, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_5, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_6, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_7, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_8, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_9, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_10, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_11, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_12, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_LEFT, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_RIGHT, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_UP, 0, 0, FALSE }, + { META_KEYBINDING_WORKSPACE_DOWN, 0, 0, FALSE }, + { META_KEYBINDING_SWITCH_WINDOWS, 0, 0, TRUE }, + { META_KEYBINDING_SWITCH_WINDOWS_BACKWARD, 0, 0, TRUE }, + { META_KEYBINDING_SWITCH_PANELS, 0, 0, TRUE }, + { META_KEYBINDING_SWITCH_PANELS_BACKWARD, 0, 0, TRUE }, + { META_KEYBINDING_CYCLE_WINDOWS, 0, 0, TRUE }, + { META_KEYBINDING_CYCLE_WINDOWS_BACKWARD, 0, 0, TRUE }, + { META_KEYBINDING_CYCLE_PANELS, 0, 0, TRUE }, + { META_KEYBINDING_CYCLE_PANELS_BACKWARD, 0, 0, TRUE }, + { META_KEYBINDING_SHOW_DESKTOP, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_1, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_2, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_3, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_4, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_5, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_6, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_7, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_8, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_9, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_10, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_11, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_12, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_13, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_14, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_15, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_16, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_17, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_18, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_19, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_20, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_21, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_22, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_23, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_24, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_25, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_26, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_27, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_28, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_29, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_30, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_31, 0, 0, FALSE }, + { META_KEYBINDING_COMMAND_32, 0, 0, FALSE }, + { NULL, 0, 0, FALSE} }; static MetaKeyPref window_bindings[] = { - { META_KEYBINDING_WINDOW_MENU, 0, 0 }, - { META_KEYBINDING_TOGGLE_FULLSCREEN, 0, 0 }, - { META_KEYBINDING_TOGGLE_MAXIMIZE, 0, 0 }, - { META_KEYBINDING_MAXIMIZE, 0, 0 }, - { META_KEYBINDING_UNMAXIMIZE, 0, 0 }, - { META_KEYBINDING_TOGGLE_SHADE, 0, 0 }, - { META_KEYBINDING_MINIMIZE, 0, 0 }, - { META_KEYBINDING_CLOSE, 0, 0 }, - { META_KEYBINDING_BEGIN_MOVE, 0, 0 }, - { META_KEYBINDING_BEGIN_RESIZE, 0, 0 }, - { META_KEYBINDING_TOGGLE_STICKY, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_1, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_2, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_3, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_4, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_5, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_6, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_7, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_8, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_9, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_10, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_11, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_12, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_LEFT, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_RIGHT, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_UP, 0, 0 }, - { META_KEYBINDING_MOVE_WORKSPACE_DOWN, 0, 0 }, - { META_KEYBINDING_RAISE_OR_LOWER, 0, 0 }, - { META_KEYBINDING_RAISE, 0, 0 }, - { META_KEYBINDING_LOWER, 0, 0 }, - { META_KEYBINDING_MAXIMIZE_VERTICALLY, 0, 0 }, - { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, 0, 0 }, - { NULL, 0, 0 } + { META_KEYBINDING_WINDOW_MENU, 0, 0, FALSE }, + { META_KEYBINDING_TOGGLE_FULLSCREEN, 0, 0, FALSE }, + { META_KEYBINDING_TOGGLE_MAXIMIZE, 0, 0, FALSE }, + { META_KEYBINDING_MAXIMIZE, 0, 0, FALSE }, + { META_KEYBINDING_UNMAXIMIZE, 0, 0, FALSE }, + { META_KEYBINDING_TOGGLE_SHADE, 0, 0, FALSE }, + { META_KEYBINDING_MINIMIZE, 0, 0, FALSE }, + { META_KEYBINDING_CLOSE, 0, 0, FALSE }, + { META_KEYBINDING_BEGIN_MOVE, 0, 0, FALSE }, + { META_KEYBINDING_BEGIN_RESIZE, 0, 0, FALSE }, + { META_KEYBINDING_TOGGLE_STICKY, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_1, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_2, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_3, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_4, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_5, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_6, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_7, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_8, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_9, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_10, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_11, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_12, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_LEFT, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_RIGHT, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_UP, 0, 0, FALSE }, + { META_KEYBINDING_MOVE_WORKSPACE_DOWN, 0, 0, FALSE }, + { META_KEYBINDING_RAISE_OR_LOWER, 0, 0, FALSE }, + { META_KEYBINDING_RAISE, 0, 0, FALSE }, + { META_KEYBINDING_LOWER, 0, 0, FALSE }, + { META_KEYBINDING_MAXIMIZE_VERTICALLY, 0, 0, FALSE }, + { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, 0, 0, FALSE }, + { NULL, 0, 0, FALSE } }; static void diff --git a/src/prefs.h b/src/prefs.h index 45e9d7fe7..8a607f697 100644 --- a/src/prefs.h +++ b/src/prefs.h @@ -223,6 +223,8 @@ typedef struct const char *name; unsigned int keysym; MetaVirtualModifier modifiers; + /* for keybindings that can have shift or not like Alt+Tab */ + gboolean add_shift; } MetaKeyPref; void meta_prefs_get_screen_bindings (const MetaKeyPref **bindings,