aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/switch.c
diff options
context:
space:
mode:
authorLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-07-09 02:57:59 -0400
committerLibravatar Simon Ser <contact@emersion.fr>2019-07-09 10:00:57 +0300
commit152e30c374382eecccb917e5c26d72a2ea53ef87 (patch)
tree9baab29c015d6246c0a00e1d596c54ced0e7384b /sway/input/switch.c
parentMake mouse drag in tiled mode swap containers if no edge is selected (diff)
downloadsway-152e30c374382eecccb917e5c26d72a2ea53ef87.tar.gz
sway-152e30c374382eecccb917e5c26d72a2ea53ef87.tar.zst
sway-152e30c374382eecccb917e5c26d72a2ea53ef87.zip
cmd_bindswitch: add option to execute on reload
This adds a --reload flag to cmd_bindswitch that allows for the binding to be executed on reload. One possible use case for this is to allow users to disable outputs when the lid closes and enable them when the lid opens without having to open and re-close the lid after a reload.
Diffstat (limited to 'sway/input/switch.c')
-rw-r--r--sway/input/switch.c57
1 files changed, 40 insertions, 17 deletions
diff --git a/sway/input/switch.c b/sway/input/switch.c
index d825c5c3..72d1245f 100644
--- a/sway/input/switch.c
+++ b/sway/input/switch.c
@@ -13,39 +13,30 @@ struct sway_switch *sway_switch_create(struct sway_seat *seat,
13 } 13 }
14 device->switch_device = switch_device; 14 device->switch_device = switch_device;
15 switch_device->seat_device = device; 15 switch_device->seat_device = device;
16 switch_device->state = WLR_SWITCH_STATE_OFF;
16 wl_list_init(&switch_device->switch_toggle.link); 17 wl_list_init(&switch_device->switch_toggle.link);
17 sway_log(SWAY_DEBUG, "Allocated switch for device"); 18 sway_log(SWAY_DEBUG, "Allocated switch for device");
18 19
19 return switch_device; 20 return switch_device;
20} 21}
21 22
22static void handle_switch_toggle(struct wl_listener *listener, void *data) { 23static void execute_binding(struct sway_switch *sway_switch) {
23 struct sway_switch *sway_switch =
24 wl_container_of(listener, sway_switch, switch_toggle);
25 struct sway_seat* seat = sway_switch->seat_device->sway_seat; 24 struct sway_seat* seat = sway_switch->seat_device->sway_seat;
26 struct wlr_seat *wlr_seat = seat->wlr_seat;
27 struct wlr_input_device *wlr_device =
28 sway_switch->seat_device->input_device->wlr_device;
29
30 wlr_idle_notify_activity(server.idle, wlr_seat);
31 bool input_inhibited = seat->exclusive_client != NULL; 25 bool input_inhibited = seat->exclusive_client != NULL;
32 26
33 char *device_identifier = input_device_get_identifier(wlr_device);
34
35 struct wlr_event_switch_toggle *event = data;
36 enum wlr_switch_type type = event->switch_type;
37 enum wlr_switch_state state = event->switch_state;
38 sway_log(SWAY_DEBUG, "%s: type %d state %d", device_identifier, type, state);
39
40 list_t *bindings = config->current_mode->switch_bindings; 27 list_t *bindings = config->current_mode->switch_bindings;
41 struct sway_switch_binding *matched_binding = NULL; 28 struct sway_switch_binding *matched_binding = NULL;
42 for (int i = 0; i < bindings->length; ++i) { 29 for (int i = 0; i < bindings->length; ++i) {
43 struct sway_switch_binding *binding = bindings->items[i]; 30 struct sway_switch_binding *binding = bindings->items[i];
44 if (binding->type != type) { 31 if (binding->type != sway_switch->type) {
45 continue; 32 continue;
46 } 33 }
47 if (binding->state != WLR_SWITCH_STATE_TOGGLE && 34 if (binding->state != WLR_SWITCH_STATE_TOGGLE &&
48 binding->state != state) { 35 binding->state != sway_switch->state) {
36 continue;
37 }
38 if (config->reloading && (binding->state == WLR_SWITCH_STATE_TOGGLE
39 || (binding->flags & BINDING_RELOAD) == 0)) {
49 continue; 40 continue;
50 } 41 }
51 bool binding_locked = binding->flags & BINDING_LOCKED; 42 bool binding_locked = binding->flags & BINDING_LOCKED;
@@ -73,7 +64,25 @@ static void handle_switch_toggle(struct wl_listener *listener, void *data) {
73 64
74 transaction_commit_dirty(); 65 transaction_commit_dirty();
75 66
67}
68
69static void handle_switch_toggle(struct wl_listener *listener, void *data) {
70 struct sway_switch *sway_switch =
71 wl_container_of(listener, sway_switch, switch_toggle);
72 struct wlr_event_switch_toggle *event = data;
73 struct wlr_seat* wlr_seat = sway_switch->seat_device->sway_seat->wlr_seat;
74 wlr_idle_notify_activity(server.idle, wlr_seat);
75
76 struct wlr_input_device *wlr_device =
77 sway_switch->seat_device->input_device->wlr_device;
78 char *device_identifier = input_device_get_identifier(wlr_device);
79 sway_log(SWAY_DEBUG, "%s: type %d state %d", device_identifier,
80 event->switch_type, event->switch_state);
76 free(device_identifier); 81 free(device_identifier);
82
83 sway_switch->type = event->switch_type;
84 sway_switch->state = event->switch_state;
85 execute_binding(sway_switch);
77} 86}
78 87
79void sway_switch_configure(struct sway_switch *sway_switch) { 88void sway_switch_configure(struct sway_switch *sway_switch) {
@@ -93,3 +102,17 @@ void sway_switch_destroy(struct sway_switch *sway_switch) {
93 wl_list_remove(&sway_switch->switch_toggle.link); 102 wl_list_remove(&sway_switch->switch_toggle.link);
94 free(sway_switch); 103 free(sway_switch);
95} 104}
105
106void sway_switch_retrigger_bindings_for_all(void) {
107 struct sway_seat *seat;
108 wl_list_for_each(seat, &server.input->seats, link) {
109 struct sway_seat_device *seat_device;
110 wl_list_for_each(seat_device, &seat->devices, link) {
111 struct sway_input_device *input_device = seat_device->input_device;
112 if (input_device->wlr_device->type != WLR_INPUT_DEVICE_SWITCH) {
113 continue;
114 }
115 execute_binding(seat_device->switch_device);
116 };
117 }
118}