aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/input.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-01-10 12:43:10 -0500
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-01-10 12:43:10 -0500
commit3d6440ec26f2b39c54fd03aa3a3c822a8a2bbc72 (patch)
tree05e5dddd092b3d3ba16166a3784a49923e9f3de2 /swaybar/input.c
parentMerge pull request #3400 from ianyfan/config-brace (diff)
downloadsway-3d6440ec26f2b39c54fd03aa3a3c822a8a2bbc72.tar.gz
sway-3d6440ec26f2b39c54fd03aa3a3c822a8a2bbc72.tar.zst
sway-3d6440ec26f2b39c54fd03aa3a3c822a8a2bbc72.zip
bar_cmd_bind: utilize mouse button helpers
This modifies `bar_cmd_bindsym` to use `get_mouse_bindsym` for parsing mouse buttons. This also introduces `cmd_bar_bindcode`, which will use `get_mouse_bindcode` for parsing mouse buttons. Like sway bindings, the two commands are encapsulated in a single file with shared code. This also modifies swaybar to operate off of event codes rather than x11 button numbers, which allows for any mouse button to be used. This introduces two new IPC properties: - For `get_bar_config`, `event_code` has been added to the `bindings` section and will include to event code for the button. If the event code can be mapped to a x11 button, `input_code` will still be the x11 button number. Otherwise, `input_code` will be `0`. - Likewise for `click_events`, `event` has been added and will include the event code for the button clicked. If the event code can be mapped to a x11 button, `button` will still be the x11 button number. Otherwise, `button` will be `0`.
Diffstat (limited to 'swaybar/input.c')
-rw-r--r--swaybar/input.c36
1 files changed, 10 insertions, 26 deletions
diff --git a/swaybar/input.c b/swaybar/input.c
index 620da977..bdd55e58 100644
--- a/swaybar/input.c
+++ b/swaybar/input.c
@@ -22,32 +22,16 @@ void free_hotspots(struct wl_list *list) {
22 } 22 }
23} 23}
24 24
25static enum x11_button wl_button_to_x11_button(uint32_t button) { 25static uint32_t wl_axis_to_button(uint32_t axis, wl_fixed_t value) {
26 switch (button) { 26 bool negative = wl_fixed_to_double(value) < 0;
27 case BTN_LEFT:
28 return LEFT;
29 case BTN_MIDDLE:
30 return MIDDLE;
31 case BTN_RIGHT:
32 return RIGHT;
33 case BTN_SIDE:
34 return BACK;
35 case BTN_EXTRA:
36 return FORWARD;
37 default:
38 return NONE;
39 }
40}
41
42static enum x11_button wl_axis_to_x11_button(uint32_t axis, wl_fixed_t value) {
43 switch (axis) { 27 switch (axis) {
44 case WL_POINTER_AXIS_VERTICAL_SCROLL: 28 case WL_POINTER_AXIS_VERTICAL_SCROLL:
45 return wl_fixed_to_double(value) < 0 ? SCROLL_UP : SCROLL_DOWN; 29 return negative ? SWAY_SCROLL_UP : SWAY_SCROLL_DOWN;
46 case WL_POINTER_AXIS_HORIZONTAL_SCROLL: 30 case WL_POINTER_AXIS_HORIZONTAL_SCROLL:
47 return wl_fixed_to_double(value) < 0 ? SCROLL_LEFT : SCROLL_RIGHT; 31 return negative ? SWAY_SCROLL_LEFT : SWAY_SCROLL_RIGHT;
48 default: 32 default:
49 wlr_log(WLR_DEBUG, "Unexpected axis value on mouse scroll"); 33 wlr_log(WLR_DEBUG, "Unexpected axis value on mouse scroll");
50 return NONE; 34 return 0;
51 } 35 }
52} 36}
53 37
@@ -102,12 +86,12 @@ static void wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
102 bar->pointer.y = wl_fixed_to_int(surface_y); 86 bar->pointer.y = wl_fixed_to_int(surface_y);
103} 87}
104 88
105static bool check_bindings(struct swaybar *bar, uint32_t x11_button, 89static bool check_bindings(struct swaybar *bar, uint32_t button,
106 uint32_t state) { 90 uint32_t state) {
107 bool released = state == WL_POINTER_BUTTON_STATE_RELEASED; 91 bool released = state == WL_POINTER_BUTTON_STATE_RELEASED;
108 for (int i = 0; i < bar->config->bindings->length; i++) { 92 for (int i = 0; i < bar->config->bindings->length; i++) {
109 struct swaybar_binding *binding = bar->config->bindings->items[i]; 93 struct swaybar_binding *binding = bar->config->bindings->items[i];
110 if (binding->button == x11_button && binding->release == released) { 94 if (binding->button == button && binding->release == released) {
111 ipc_execute_binding(bar, binding); 95 ipc_execute_binding(bar, binding);
112 return true; 96 return true;
113 } 97 }
@@ -124,7 +108,7 @@ static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
124 return; 108 return;
125 } 109 }
126 110
127 if (check_bindings(bar, wl_button_to_x11_button(button), state)) { 111 if (check_bindings(bar, button, state)) {
128 return; 112 return;
129 } 113 }
130 114
@@ -140,7 +124,7 @@ static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
140 && x < hotspot->x + hotspot->width 124 && x < hotspot->x + hotspot->width
141 && y < hotspot->y + hotspot->height) { 125 && y < hotspot->y + hotspot->height) {
142 if (HOTSPOT_IGNORE == hotspot->callback(output, hotspot, 126 if (HOTSPOT_IGNORE == hotspot->callback(output, hotspot,
143 pointer->x, pointer->y, wl_button_to_x11_button(button), hotspot->data)) { 127 pointer->x, pointer->y, button, hotspot->data)) {
144 return; 128 return;
145 } 129 }
146 } 130 }
@@ -158,7 +142,7 @@ static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
158 142
159 // If there is a button press binding, execute it, skip default behavior, 143 // If there is a button press binding, execute it, skip default behavior,
160 // and check button release bindings 144 // and check button release bindings
161 enum x11_button button = wl_axis_to_x11_button(axis, value); 145 uint32_t button = wl_axis_to_button(axis, value);
162 if (check_bindings(bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) { 146 if (check_bindings(bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) {
163 check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED); 147 check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
164 return; 148 return;