|
1 | | -/* xcore-logger.c |
| 1 | +/* logger.c |
2 | 2 | * |
3 | 3 | * Copyright 2022 dharmx |
4 | 4 | * |
|
16 | 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 | 17 | */ |
18 | 18 |
|
19 | | -#include "xcore-logger.h" |
| 19 | +#include "logger.h" |
| 20 | +#define ON_OR_OFF(S) (S ? "on" : "off") |
20 | 21 |
|
21 | 22 | void |
22 | 23 | init_xinput(dump_t* dump, int version[2]) { |
@@ -105,4 +106,47 @@ start_key_logger(char* up, char* down, Bool only_icon, RawKeyPressMode mode) { |
105 | 106 | } |
106 | 107 | } |
107 | 108 |
|
| 109 | +void |
| 110 | +display_ind_state(Bool ind_keys[2], int event_state) { |
| 111 | + typedef enum { |
| 112 | + NO_STATE = 0, |
| 113 | + CAPS_LOCK_STATE = 1, |
| 114 | + NUM_LOCK_STATE = 2, |
| 115 | + BOTH_LOCK_STATE = 3, |
| 116 | + } ind_state_t; |
| 117 | + |
| 118 | + switch (event_state) { |
| 119 | + case NO_STATE: ind_keys[0] = ind_keys[1] = False; break; |
| 120 | + case CAPS_LOCK_STATE: ind_keys[0] = True; break; |
| 121 | + case NUM_LOCK_STATE: ind_keys[1] = True; break; |
| 122 | + case BOTH_LOCK_STATE: ind_keys[0] = ind_keys[1] = True; break; |
| 123 | + } |
| 124 | + |
| 125 | + printf("indicators %s %s\n", ON_OR_OFF(ind_keys[0]), ON_OR_OFF(ind_keys[1])); |
| 126 | + fflush(stdout); |
| 127 | +} |
| 128 | + |
| 129 | +void |
| 130 | +query_led_state(Bool ind_keys[2]) { |
| 131 | + unsigned int start_state; |
| 132 | + XkbGetIndicatorState(display, XkbUseCoreKbd, &start_state); |
| 133 | + if (ind_keys == NULL) { |
| 134 | + Bool ind_keys_once[2] = {False, False}; |
| 135 | + display_ind_state(ind_keys_once, start_state); |
| 136 | + } else display_ind_state(ind_keys, start_state); |
| 137 | +} |
| 138 | + |
| 139 | +void |
| 140 | +start_led_logger(Bool first) { |
| 141 | + Bool ind_keys[2] = {False, False}; |
| 142 | + if (first) query_led_state(ind_keys); |
| 143 | + |
| 144 | + XkbSelectEvents(display, XkbUseCoreKbd, XkbIndicatorStateNotifyMask, XkbIndicatorStateNotifyMask); |
| 145 | + XkbIndicatorNotifyEvent event; |
| 146 | + while (True) { |
| 147 | + XNextEvent(display, (XEvent*) &event); |
| 148 | + if (event.xkb_type == XkbIndicatorStateNotify) display_ind_state(ind_keys, event.state); |
| 149 | + } |
| 150 | +} |
| 151 | + |
108 | 152 | // vim:filetype=c |
0 commit comments