diff options
author | Ryan Walklin <ryan@testtoast.com> | 2019-03-20 14:47:29 +1100 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2019-03-19 23:58:47 -0400 |
commit | bdb402404cd6d54242b0b1dc2360cfc5679e52f2 (patch) | |
tree | 5a355e025c24b3de0bc69db4b8cc9d002bbd1167 /sway/input/input-manager.c | |
parent | Clean up focus follows mouse logic (diff) | |
download | sway-bdb402404cd6d54242b0b1dc2360cfc5679e52f2.tar.gz sway-bdb402404cd6d54242b0b1dc2360cfc5679e52f2.tar.zst sway-bdb402404cd6d54242b0b1dc2360cfc5679e52f2.zip |
Support WLR_INPUT_DEVICE_SWITCH in sway
This commit adds support for laptop lid and tablet
mode switches as provided by evdev/libinput and
handled by wlroots.
Adds a new bindswitch command with syntax:
bindswitch <switch>:<state> <command>
Where <switch> is one of:
tablet for WLR_SWITCH_TYPE_TABLET_MODE
lid for WLR_SWITCH_TYPE_LID
<state> is one of:
on for WLR_SWITCH_STATE_ON
off for WLR_SWITCH_STATE_OFF
toggle for WLR_SWITCH_STATE_TOGGLE
(Note that WLR_SWITCH_STATE_TOGGLE doesn't map to
libinput and will trigger at both on and off events)
Diffstat (limited to 'sway/input/input-manager.c')
-rw-r--r-- | sway/input/input-manager.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index f99fc395..adb36af9 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c | |||
@@ -155,6 +155,47 @@ static void input_manager_libinput_reset_keyboard( | |||
155 | libinput_device, send_events)); | 155 | libinput_device, send_events)); |
156 | } | 156 | } |
157 | 157 | ||
158 | static void input_manager_libinput_config_switch( | ||
159 | struct sway_input_device *input_device) { | ||
160 | struct wlr_input_device *wlr_device = input_device->wlr_device; | ||
161 | struct input_config *ic = input_device_get_config(input_device); | ||
162 | struct libinput_device *libinput_device; | ||
163 | |||
164 | if (!ic || !wlr_input_device_is_libinput(wlr_device)) { | ||
165 | return; | ||
166 | } | ||
167 | |||
168 | libinput_device = wlr_libinput_get_device_handle(wlr_device); | ||
169 | sway_log(SWAY_DEBUG, "input_manager_libinput_config_switch(%s)", | ||
170 | ic->identifier); | ||
171 | |||
172 | if (ic->send_events != INT_MIN) { | ||
173 | sway_log(SWAY_DEBUG, "libinput_config_switch(%s) send_events_set_mode(%d)", | ||
174 | ic->identifier, ic->send_events); | ||
175 | log_libinput_config_status(libinput_device_config_send_events_set_mode( | ||
176 | libinput_device, ic->send_events)); | ||
177 | } | ||
178 | } | ||
179 | |||
180 | static void input_manager_libinput_reset_switch( | ||
181 | struct sway_input_device *input_device) { | ||
182 | struct wlr_input_device *wlr_device = input_device->wlr_device; | ||
183 | struct libinput_device *libinput_device; | ||
184 | |||
185 | if (!wlr_input_device_is_libinput(wlr_device)) { | ||
186 | return; | ||
187 | } | ||
188 | |||
189 | libinput_device = wlr_libinput_get_device_handle(wlr_device); | ||
190 | |||
191 | uint32_t send_events = | ||
192 | libinput_device_config_send_events_get_default_mode(libinput_device); | ||
193 | sway_log(SWAY_DEBUG, "libinput_reset_switch(%s) send_events_set_mode(%d)", | ||
194 | input_device->identifier, send_events); | ||
195 | log_libinput_config_status(libinput_device_config_send_events_set_mode( | ||
196 | libinput_device, send_events)); | ||
197 | } | ||
198 | |||
158 | static void input_manager_libinput_config_touch( | 199 | static void input_manager_libinput_config_touch( |
159 | struct sway_input_device *input_device) { | 200 | struct sway_input_device *input_device) { |
160 | struct wlr_input_device *wlr_device = input_device->wlr_device; | 201 | struct wlr_input_device *wlr_device = input_device->wlr_device; |
@@ -471,6 +512,8 @@ static void handle_new_input(struct wl_listener *listener, void *data) { | |||
471 | input_manager_libinput_config_pointer(input_device); | 512 | input_manager_libinput_config_pointer(input_device); |
472 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { | 513 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { |
473 | input_manager_libinput_config_keyboard(input_device); | 514 | input_manager_libinput_config_keyboard(input_device); |
515 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) { | ||
516 | input_manager_libinput_config_switch(input_device); | ||
474 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { | 517 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { |
475 | input_manager_libinput_config_touch(input_device); | 518 | input_manager_libinput_config_touch(input_device); |
476 | } | 519 | } |
@@ -624,6 +667,8 @@ void input_manager_apply_input_config(struct input_config *input_config) { | |||
624 | input_manager_libinput_config_pointer(input_device); | 667 | input_manager_libinput_config_pointer(input_device); |
625 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { | 668 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { |
626 | input_manager_libinput_config_keyboard(input_device); | 669 | input_manager_libinput_config_keyboard(input_device); |
670 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) { | ||
671 | input_manager_libinput_config_switch(input_device); | ||
627 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { | 672 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { |
628 | input_manager_libinput_config_touch(input_device); | 673 | input_manager_libinput_config_touch(input_device); |
629 | } | 674 | } |
@@ -642,6 +687,8 @@ void input_manager_reset_input(struct sway_input_device *input_device) { | |||
642 | input_manager_libinput_reset_pointer(input_device); | 687 | input_manager_libinput_reset_pointer(input_device); |
643 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { | 688 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) { |
644 | input_manager_libinput_reset_keyboard(input_device); | 689 | input_manager_libinput_reset_keyboard(input_device); |
690 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) { | ||
691 | input_manager_libinput_reset_switch(input_device); | ||
645 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { | 692 | } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) { |
646 | input_manager_libinput_reset_touch(input_device); | 693 | input_manager_libinput_reset_touch(input_device); |
647 | } | 694 | } |