Move translate_keysyms to bindings.[ch]
Patch status: merged
Patch by Tony Crisci
Long description:
Additionally add a check so the function only handles bindings of type B_KEYBOARD to prepare for the new bindmouse feature.
To apply this patch, use:
curl http://cr.i3wm.org/patch/466/raw.patch | git am
b/include/bindings.h
| 18 |
@@ -36,3 +36,9 @@ void grab_all_keys(xcb_connection_t *conn, bool bind_mode_switch); |
| 19 |
* |
| 20 |
*/ |
| 21 |
Binding *get_keyboard_binding(uint16_t modifiers, bool key_release, xcb_keycode_t keycode); |
| 22 |
+ |
| 23 |
+/** |
| 24 |
+ * Translates keysymbols to keycodes for all bindings which use keysyms. |
| 25 |
+ * |
| 26 |
+ */ |
| 27 |
+void translate_keysyms(void); |
b/include/config.h
| 32 |
@@ -309,12 +309,6 @@ struct Barconfig {
|
| 33 |
void load_configuration(xcb_connection_t *conn, const char *override_configfile, bool reload); |
| 34 |
|
| 35 |
/** |
| 36 |
- * Translates keysymbols to keycodes for all bindings which use keysyms. |
| 37 |
- * |
| 38 |
- */ |
| 39 |
-void translate_keysyms(void); |
| 40 |
- |
| 41 |
-/** |
| 42 |
* Ungrabs all keys, to be called before re-grabbing the keys because of a |
| 43 |
* mapping_notify event or a configuration file reload |
| 44 |
* |
b/src/bindings.c
| 49 |
@@ -179,3 +179,53 @@ Binding *get_keyboard_binding(uint16_t modifiers, bool key_release, xcb_keycode_ |
| 50 |
|
| 51 |
return (bind == TAILQ_END(bindings) ? NULL : bind); |
| 52 |
} |
| 53 |
+ |
| 54 |
+/* |
| 55 |
+ * Translates keysymbols to keycodes for all bindings which use keysyms. |
| 56 |
+ * |
| 57 |
+ */ |
| 58 |
+void translate_keysyms(void) {
|
| 59 |
+ Binding *bind; |
| 60 |
+ xcb_keysym_t keysym; |
| 61 |
+ int col; |
| 62 |
+ xcb_keycode_t i, min_keycode, max_keycode; |
| 63 |
+ |
| 64 |
+ min_keycode = xcb_get_setup(conn)->min_keycode; |
| 65 |
+ max_keycode = xcb_get_setup(conn)->max_keycode; |
| 66 |
+ |
| 67 |
+ TAILQ_FOREACH(bind, bindings, bindings) {
|
| 68 |
+ if (bind->input_type != B_KEYBOARD || bind->keycode > 0) |
| 69 |
+ continue; |
| 70 |
+ |
| 71 |
+ /* We need to translate the symbol to a keycode */ |
| 72 |
+ keysym = XStringToKeysym(bind->symbol); |
| 73 |
+ if (keysym == NoSymbol) {
|
| 74 |
+ ELOG("Could not translate string to key symbol: \"%s\"\n",
|
| 75 |
+ bind->symbol); |
| 76 |
+ continue; |
| 77 |
+ } |
| 78 |
+ |
| 79 |
+ /* Base column we use for looking up key symbols. We always consider |
| 80 |
+ * the base column and the corresponding shift column, so without |
| 81 |
+ * mode_switch, we look in 0 and 1, with mode_switch we look in 2 and |
| 82 |
+ * 3. */ |
| 83 |
+ col = (bind->mods & BIND_MODE_SWITCH ? 2 : 0); |
| 84 |
+ |
| 85 |
+ FREE(bind->translated_to); |
| 86 |
+ bind->number_keycodes = 0; |
| 87 |
+ |
| 88 |
+ for (i = min_keycode; i && i <= max_keycode; i++) {
|
| 89 |
+ if ((xcb_key_symbols_get_keysym(keysyms, i, col) != keysym) && |
| 90 |
+ (xcb_key_symbols_get_keysym(keysyms, i, col+1) != keysym)) |
| 91 |
+ continue; |
| 92 |
+ bind->number_keycodes++; |
| 93 |
+ bind->translated_to = srealloc(bind->translated_to, |
| 94 |
+ (sizeof(xcb_keycode_t) * |
| 95 |
+ bind->number_keycodes)); |
| 96 |
+ bind->translated_to[bind->number_keycodes-1] = i; |
| 97 |
+ } |
| 98 |
+ |
| 99 |
+ DLOG("Translated symbol \"%s\" to %d keycode\n", bind->symbol,
|
| 100 |
+ bind->number_keycodes); |
| 101 |
+ } |
| 102 |
+} |
b/src/config.c
| 107 |
@@ -31,55 +31,6 @@ void ungrab_all_keys(xcb_connection_t *conn) {
|
| 108 |
} |
| 109 |
|
| 110 |
/* |
| 111 |
- * Translates keysymbols to keycodes for all bindings which use keysyms. |
| 112 |
- * |
| 113 |
- */ |
| 114 |
-void translate_keysyms(void) {
|
| 115 |
- Binding *bind; |
| 116 |
- xcb_keysym_t keysym; |
| 117 |
- int col; |
| 118 |
- xcb_keycode_t i, |
| 119 |
- min_keycode = xcb_get_setup(conn)->min_keycode, |
| 120 |
- max_keycode = xcb_get_setup(conn)->max_keycode; |
| 121 |
- |
| 122 |
- TAILQ_FOREACH(bind, bindings, bindings) {
|
| 123 |
- if (bind->keycode > 0) |
| 124 |
- continue; |
| 125 |
- |
| 126 |
- /* We need to translate the symbol to a keycode */ |
| 127 |
- keysym = XStringToKeysym(bind->symbol); |
| 128 |
- if (keysym == NoSymbol) {
|
| 129 |
- ELOG("Could not translate string to key symbol: \"%s\"\n",
|
| 130 |
- bind->symbol); |
| 131 |
- continue; |
| 132 |
- } |
| 133 |
- |
| 134 |
- /* Base column we use for looking up key symbols. We always consider |
| 135 |
- * the base column and the corresponding shift column, so without |
| 136 |
- * mode_switch, we look in 0 and 1, with mode_switch we look in 2 and |
| 137 |
- * 3. */ |
| 138 |
- col = (bind->mods & BIND_MODE_SWITCH ? 2 : 0); |
| 139 |
- |
| 140 |
- FREE(bind->translated_to); |
| 141 |
- bind->number_keycodes = 0; |
| 142 |
- |
| 143 |
- for (i = min_keycode; i && i <= max_keycode; i++) {
|
| 144 |
- if ((xcb_key_symbols_get_keysym(keysyms, i, col) != keysym) && |
| 145 |
- (xcb_key_symbols_get_keysym(keysyms, i, col+1) != keysym)) |
| 146 |
- continue; |
| 147 |
- bind->number_keycodes++; |
| 148 |
- bind->translated_to = srealloc(bind->translated_to, |
| 149 |
- (sizeof(xcb_keycode_t) * |
| 150 |
- bind->number_keycodes)); |
| 151 |
- bind->translated_to[bind->number_keycodes-1] = i; |
| 152 |
- } |
| 153 |
- |
| 154 |
- DLOG("Translated symbol \"%s\" to %d keycode\n", bind->symbol,
|
| 155 |
- bind->number_keycodes); |
| 156 |
- } |
| 157 |
-} |
| 158 |
- |
| 159 |
-/* |
| 160 |
* Switches the key bindings to the given mode, if the mode exists |
| 161 |
* |
| 162 |
*/ |