Move keyboard binding accessor to bindings.[ch]
Patch status: merged
Patch by Tony Crisci
Long description:
Rename `get_binding` to `get_keyboard_binding` and ensure that this function only accesses bindings of type B_KEYBOARD. Other types of bindings (e.g. mouse bindings) will be accessed by a different function.
To apply this patch, use:
curl http://cr.i3wm.org/patch/432/raw.patch | git am
b/include/bindings.h
| 20 |
@@ -29,3 +29,10 @@ Binding *configure_binding(const char *bindtype, const char *modifiers, const ch |
| 21 |
* |
| 22 |
*/ |
| 23 |
void grab_all_keys(xcb_connection_t *conn, bool bind_mode_switch); |
| 24 |
+ |
| 25 |
+/** |
| 26 |
+ * Returns a pointer to the keyboard Binding with the specified modifiers and |
| 27 |
+ * keycode or NULL if no such binding exists. |
| 28 |
+ * |
| 29 |
+ */ |
| 30 |
+Binding *get_keyboard_binding(uint16_t modifiers, bool key_release, xcb_keycode_t keycode); |
b/include/config.h
| 35 |
@@ -334,13 +334,6 @@ void switch_mode(const char *new_mode); |
| 36 |
*/void update_barconfig(); |
| 37 |
|
| 38 |
/** |
| 39 |
- * Returns a pointer to the Binding with the specified modifiers and keycode |
| 40 |
- * or NULL if no such binding exists. |
| 41 |
- * |
| 42 |
- */ |
| 43 |
-Binding *get_binding(uint16_t modifiers, bool key_release, xcb_keycode_t keycode); |
| 44 |
- |
| 45 |
-/** |
| 46 |
* Kills the configerror i3-nagbar process, if any. |
| 47 |
* |
| 48 |
* Called when reloading/restarting. |
b/src/bindings.c
| 53 |
@@ -117,3 +117,65 @@ void grab_all_keys(xcb_connection_t *conn, bool bind_mode_switch) {
|
| 54 |
grab_keycode_for_binding(conn, bind, *walk++); |
| 55 |
} |
| 56 |
} |
| 57 |
+ |
| 58 |
+/* |
| 59 |
+ * Returns a pointer to the keyboard Binding with the specified modifiers and |
| 60 |
+ * keycode or NULL if no such binding exists. |
| 61 |
+ * |
| 62 |
+ */ |
| 63 |
+Binding *get_keyboard_binding(uint16_t modifiers, bool key_release, xcb_keycode_t keycode) {
|
| 64 |
+ Binding *bind; |
| 65 |
+ |
| 66 |
+ if (!key_release) {
|
| 67 |
+ /* On a KeyPress event, we first reset all |
| 68 |
+ * B_UPON_KEYRELEASE_IGNORE_MODS bindings back to B_UPON_KEYRELEASE */ |
| 69 |
+ TAILQ_FOREACH(bind, bindings, bindings) {
|
| 70 |
+ if (bind->input_type != B_KEYBOARD) |
| 71 |
+ continue; |
| 72 |
+ if (bind->release == B_UPON_KEYRELEASE_IGNORE_MODS) |
| 73 |
+ bind->release = B_UPON_KEYRELEASE; |
| 74 |
+ } |
| 75 |
+ } |
| 76 |
+ |
| 77 |
+ TAILQ_FOREACH(bind, bindings, bindings) {
|
| 78 |
+ /* First compare the modifiers (unless this is a |
| 79 |
+ * B_UPON_KEYRELEASE_IGNORE_MODS binding and this is a KeyRelease |
| 80 |
+ * event) */ |
| 81 |
+ if (bind->input_type != B_KEYBOARD) |
| 82 |
+ continue; |
| 83 |
+ if (bind->mods != modifiers && |
| 84 |
+ (bind->release != B_UPON_KEYRELEASE_IGNORE_MODS || |
| 85 |
+ !key_release)) |
| 86 |
+ continue; |
| 87 |
+ |
| 88 |
+ /* If a symbol was specified by the user, we need to look in |
| 89 |
+ * the array of translated keycodes for the event’s keycode */ |
| 90 |
+ if (bind->symbol != NULL) {
|
| 91 |
+ if (memmem(bind->translated_to, |
| 92 |
+ bind->number_keycodes * sizeof(xcb_keycode_t), |
| 93 |
+ &keycode, sizeof(xcb_keycode_t)) == NULL) |
| 94 |
+ continue; |
| 95 |
+ } else {
|
| 96 |
+ /* This case is easier: The user specified a keycode */ |
| 97 |
+ if (bind->keycode != keycode) |
| 98 |
+ continue; |
| 99 |
+ } |
| 100 |
+ |
| 101 |
+ /* If this keybinding is a KeyRelease binding, it matches the key which |
| 102 |
+ * the user pressed. We therefore mark it as |
| 103 |
+ * B_UPON_KEYRELEASE_IGNORE_MODS for later, so that the user can |
| 104 |
+ * release the modifiers before the actual key and the KeyRelease will |
| 105 |
+ * still be matched. */ |
| 106 |
+ if (bind->release == B_UPON_KEYRELEASE && !key_release) |
| 107 |
+ bind->release = B_UPON_KEYRELEASE_IGNORE_MODS; |
| 108 |
+ |
| 109 |
+ /* Check if the binding is for a KeyPress or a KeyRelease event */ |
| 110 |
+ if ((bind->release == B_UPON_KEYPRESS && key_release) || |
| 111 |
+ (bind->release >= B_UPON_KEYRELEASE && !key_release)) |
| 112 |
+ continue; |
| 113 |
+ |
| 114 |
+ break; |
| 115 |
+ } |
| 116 |
+ |
| 117 |
+ return (bind == TAILQ_END(bindings) ? NULL : bind); |
| 118 |
+} |
b/src/config.c
| 123 |
@@ -31,64 +31,6 @@ void ungrab_all_keys(xcb_connection_t *conn) {
|
| 124 |
} |
| 125 |
|
| 126 |
/* |
| 127 |
- * Returns a pointer to the Binding with the specified modifiers and keycode |
| 128 |
- * or NULL if no such binding exists. |
| 129 |
- * |
| 130 |
- */ |
| 131 |
-Binding *get_binding(uint16_t modifiers, bool key_release, xcb_keycode_t keycode) {
|
| 132 |
- Binding *bind; |
| 133 |
- |
| 134 |
- if (!key_release) {
|
| 135 |
- /* On a KeyPress event, we first reset all |
| 136 |
- * B_UPON_KEYRELEASE_IGNORE_MODS bindings back to B_UPON_KEYRELEASE */ |
| 137 |
- TAILQ_FOREACH(bind, bindings, bindings) {
|
| 138 |
- if (bind->release == B_UPON_KEYRELEASE_IGNORE_MODS) |
| 139 |
- bind->release = B_UPON_KEYRELEASE; |
| 140 |
- } |
| 141 |
- } |
| 142 |
- |
| 143 |
- TAILQ_FOREACH(bind, bindings, bindings) {
|
| 144 |
- /* First compare the modifiers (unless this is a |
| 145 |
- * B_UPON_KEYRELEASE_IGNORE_MODS binding and this is a KeyRelease |
| 146 |
- * event) */ |
| 147 |
- if (bind->mods != modifiers && |
| 148 |
- (bind->release != B_UPON_KEYRELEASE_IGNORE_MODS || |
| 149 |
- !key_release)) |
| 150 |
- continue; |
| 151 |
- |
| 152 |
- /* If a symbol was specified by the user, we need to look in |
| 153 |
- * the array of translated keycodes for the event’s keycode */ |
| 154 |
- if (bind->symbol != NULL) {
|
| 155 |
- if (memmem(bind->translated_to, |
| 156 |
- bind->number_keycodes * sizeof(xcb_keycode_t), |
| 157 |
- &keycode, sizeof(xcb_keycode_t)) == NULL) |
| 158 |
- continue; |
| 159 |
- } else {
|
| 160 |
- /* This case is easier: The user specified a keycode */ |
| 161 |
- if (bind->keycode != keycode) |
| 162 |
- continue; |
| 163 |
- } |
| 164 |
- |
| 165 |
- /* If this keybinding is a KeyRelease binding, it matches the key which |
| 166 |
- * the user pressed. We therefore mark it as |
| 167 |
- * B_UPON_KEYRELEASE_IGNORE_MODS for later, so that the user can |
| 168 |
- * release the modifiers before the actual key and the KeyRelease will |
| 169 |
- * still be matched. */ |
| 170 |
- if (bind->release == B_UPON_KEYRELEASE && !key_release) |
| 171 |
- bind->release = B_UPON_KEYRELEASE_IGNORE_MODS; |
| 172 |
- |
| 173 |
- /* Check if the binding is for a KeyPress or a KeyRelease event */ |
| 174 |
- if ((bind->release == B_UPON_KEYPRESS && key_release) || |
| 175 |
- (bind->release >= B_UPON_KEYRELEASE && !key_release)) |
| 176 |
- continue; |
| 177 |
- |
| 178 |
- break; |
| 179 |
- } |
| 180 |
- |
| 181 |
- return (bind == TAILQ_END(bindings) ? NULL : bind); |
| 182 |
-} |
| 183 |
- |
| 184 |
-/* |
| 185 |
* Translates keysymbols to keycodes for all bindings which use keysyms. |
| 186 |
* |
| 187 |
*/ |
b/src/key_press.c
| 192 |
@@ -84,7 +84,7 @@ void handle_key_press(xcb_key_press_event_t *event) {
|
| 193 |
DLOG("(checked mode_switch, state %d)\n", state_filtered);
|
| 194 |
|
| 195 |
/* Find the binding */ |
| 196 |
- Binding *bind = get_binding(state_filtered, key_release, event->detail); |
| 197 |
+ Binding *bind = get_keyboard_binding(state_filtered, key_release, event->detail); |
| 198 |
|
| 199 |
/* No match? Then the user has Mode_switch enabled but does not have a |
| 200 |
* specific keybinding. Fall back to the default keybindings (without |
| 201 |
@@ -93,7 +93,7 @@ void handle_key_press(xcb_key_press_event_t *event) {
|
| 202 |
if (bind == NULL) {
|
| 203 |
state_filtered &= ~(BIND_MODE_SWITCH); |
| 204 |
DLOG("no match, new state_filtered = %d\n", state_filtered);
|
| 205 |
- if ((bind = get_binding(state_filtered, key_release, event->detail)) == NULL) {
|
| 206 |
+ if ((bind = get_keyboard_binding(state_filtered, key_release, event->detail)) == NULL) {
|
| 207 |
/* This is not a real error since we can have release and |
| 208 |
* non-release keybindings. On a KeyPress event for which there is |
| 209 |
* only a !release-binding, but no release-binding, the |