aboutsummaryrefslogtreecommitdiff
path: root/sway/input/input-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/input-manager.c')
-rw-r--r--sway/input/input-manager.c434
1 files changed, 4 insertions, 430 deletions
diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c
index dd84a0b3..4f9ed891 100644
--- a/sway/input/input-manager.c
+++ b/sway/input/input-manager.c
@@ -1,16 +1,14 @@
#define _POSIX_C_SOURCE 200809L
#include <ctype.h>
-#include <float.h>
-#include <limits.h>
#include <stdio.h>
#include <string.h>
-#include <libinput.h>
#include <math.h>
#include <wlr/backend/libinput.h>
#include <wlr/types/wlr_input_inhibitor.h>
#include <wlr/types/wlr_virtual_keyboard_v1.h>
#include "sway/config.h"
#include "sway/input/input-manager.h"
+#include "sway/input/libinput.h"
#include "sway/input/seat.h"
#include "sway/ipc-server.h"
#include "sway/server.h"
@@ -173,401 +171,6 @@ void input_manager_verify_fallback_seat(void) {
}
}
-static void log_libinput_config_status(enum libinput_config_status status) {
- if (status != LIBINPUT_CONFIG_STATUS_SUCCESS) {
- sway_log(SWAY_ERROR, "Failed to apply libinput config: %s",
- libinput_config_status_to_str(status));
- }
-}
-
-static void input_manager_libinput_config_keyboard(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct input_config *ic = input_device_get_config(input_device);
- struct libinput_device *libinput_device;
-
- if (!ic || !wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
- sway_log(SWAY_DEBUG, "input_manager_libinput_config_keyboard(%s)",
- ic->identifier);
-
- if (ic->send_events != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_keyboard(%s) send_events_set_mode(%d)",
- ic->identifier, ic->send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, ic->send_events));
- }
-}
-
-static void input_manager_libinput_reset_keyboard(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct libinput_device *libinput_device;
-
- if (!wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
-
- uint32_t send_events =
- libinput_device_config_send_events_get_default_mode(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_keyboard(%s) send_events_set_mode(%d)",
- input_device->identifier, send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, send_events));
-}
-
-static void input_manager_libinput_config_switch(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct input_config *ic = input_device_get_config(input_device);
- struct libinput_device *libinput_device;
-
- if (!ic || !wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
- sway_log(SWAY_DEBUG, "input_manager_libinput_config_switch(%s)",
- ic->identifier);
-
- if (ic->send_events != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_switch(%s) send_events_set_mode(%d)",
- ic->identifier, ic->send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, ic->send_events));
- }
-}
-
-static void input_manager_libinput_reset_switch(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct libinput_device *libinput_device;
-
- if (!wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
-
- uint32_t send_events =
- libinput_device_config_send_events_get_default_mode(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_switch(%s) send_events_set_mode(%d)",
- input_device->identifier, send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, send_events));
-}
-
-static void input_manager_libinput_config_touch(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct input_config *ic = input_device_get_config(input_device);
- struct libinput_device *libinput_device;
-
- if (!ic || !wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
- sway_log(SWAY_DEBUG, "input_manager_libinput_config_touch(%s)",
- ic->identifier);
-
- if (ic->send_events != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_touch(%s) send_events_set_mode(%d)",
- ic->identifier, ic->send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, ic->send_events));
- }
- float *m = ic->calibration_matrix.matrix;
- if (ic->calibration_matrix.configured) {
- sway_log(SWAY_DEBUG, "libinput_config_touch(%s) calibration_set_matrix(%f %f %f %f %f %f)",
- ic->identifier, m[0], m[1], m[2], m[3], m[4], m[5]);
- log_libinput_config_status(libinput_device_config_calibration_set_matrix(
- libinput_device, ic->calibration_matrix.matrix));
- }
-}
-
-static void input_manager_libinput_reset_touch(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct libinput_device *libinput_device;
-
- if (!wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
-
- uint32_t send_events =
- libinput_device_config_send_events_get_default_mode(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_touch(%s) send_events_set_mode(%d)",
- input_device->identifier, send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, send_events));
-
- if (libinput_device_config_calibration_has_matrix(libinput_device)) {
- float m[6];
- libinput_device_config_calibration_get_default_matrix(libinput_device, m);
- sway_log(SWAY_DEBUG, "libinput_reset_touch(%s) calibration_set_matrix("
- "%f %f %f %f %f %f)", input_device->identifier, m[0], m[1],
- m[2], m[3], m[4], m[5]);
- log_libinput_config_status(libinput_device_config_calibration_set_matrix(
- libinput_device, m));
- }
-}
-
-static void input_manager_libinput_config_pointer(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
- struct input_config *ic = input_device_get_config(input_device);
- struct libinput_device *libinput_device;
-
- if (!ic || !wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- libinput_device = wlr_libinput_get_device_handle(wlr_device);
- sway_log(SWAY_DEBUG, "input_manager_libinput_config_pointer(%s)",
- ic->identifier);
-
- if (ic->accel_profile != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) accel_set_profile(%d)",
- ic->identifier, ic->accel_profile);
- log_libinput_config_status(libinput_device_config_accel_set_profile(
- libinput_device, ic->accel_profile));
- }
- if (ic->click_method != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) click_set_method(%d)",
- ic->identifier, ic->click_method);
- log_libinput_config_status(libinput_device_config_click_set_method(
- libinput_device, ic->click_method));
- }
- if (ic->drag != INT_MIN) {
- sway_log(SWAY_DEBUG,
- "libinput_config_pointer(%s) tap_set_drag_enabled(%d)",
- ic->identifier, ic->drag);
- log_libinput_config_status(libinput_device_config_tap_set_drag_enabled(
- libinput_device, ic->drag));
- }
- if (ic->drag_lock != INT_MIN) {
- sway_log(SWAY_DEBUG,
- "libinput_config_pointer(%s) tap_set_drag_lock_enabled(%d)",
- ic->identifier, ic->drag_lock);
- log_libinput_config_status(
- libinput_device_config_tap_set_drag_lock_enabled(
- libinput_device, ic->drag_lock));
- }
- if (ic->dwt != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) dwt_set_enabled(%d)",
- ic->identifier, ic->dwt);
- log_libinput_config_status(libinput_device_config_dwt_set_enabled(
- libinput_device, ic->dwt));
- }
- if (ic->left_handed != INT_MIN) {
- sway_log(SWAY_DEBUG,
- "libinput_config_pointer(%s) left_handed_set_enabled(%d)",
- ic->identifier, ic->left_handed);
- log_libinput_config_status(libinput_device_config_left_handed_set(
- libinput_device, ic->left_handed));
- }
- if (ic->middle_emulation != INT_MIN) {
- sway_log(SWAY_DEBUG,
- "libinput_config_pointer(%s) middle_emulation_set_enabled(%d)",
- ic->identifier, ic->middle_emulation);
- log_libinput_config_status(
- libinput_device_config_middle_emulation_set_enabled(
- libinput_device, ic->middle_emulation));
- }
- if (ic->natural_scroll != INT_MIN) {
- sway_log(SWAY_DEBUG,
- "libinput_config_pointer(%s) natural_scroll_set_enabled(%d)",
- ic->identifier, ic->natural_scroll);
- log_libinput_config_status(
- libinput_device_config_scroll_set_natural_scroll_enabled(
- libinput_device, ic->natural_scroll));
- }
- if (ic->pointer_accel != FLT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) accel_set_speed(%f)",
- ic->identifier, ic->pointer_accel);
- log_libinput_config_status(libinput_device_config_accel_set_speed(
- libinput_device, ic->pointer_accel));
- }
- if (ic->scroll_button != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) scroll_set_button(%d)",
- ic->identifier, ic->scroll_button);
- log_libinput_config_status(libinput_device_config_scroll_set_button(
- libinput_device, ic->scroll_button));
- }
- if (ic->scroll_method != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) scroll_set_method(%d)",
- ic->identifier, ic->scroll_method);
- log_libinput_config_status(libinput_device_config_scroll_set_method(
- libinput_device, ic->scroll_method));
- }
- if (ic->send_events != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) send_events_set_mode(%d)",
- ic->identifier, ic->send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, ic->send_events));
- }
- if (ic->tap != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) tap_set_enabled(%d)",
- ic->identifier, ic->tap);
- log_libinput_config_status(libinput_device_config_tap_set_enabled(
- libinput_device, ic->tap));
- }
- if (ic->tap_button_map != INT_MIN) {
- sway_log(SWAY_DEBUG, "libinput_config_pointer(%s) tap_set_button_map(%d)",
- ic->identifier, ic->tap_button_map);
- log_libinput_config_status(libinput_device_config_tap_set_button_map(
- libinput_device, ic->tap_button_map));
- }
-}
-
-static void input_manager_libinput_reset_pointer(
- struct sway_input_device *input_device) {
- struct wlr_input_device *wlr_device = input_device->wlr_device;
-
- if (!wlr_input_device_is_libinput(wlr_device)) {
- return;
- }
-
- struct libinput_device *libinput_device =
- wlr_libinput_get_device_handle(wlr_device);
-
- uint32_t send_events =
- libinput_device_config_send_events_get_default_mode(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) send_events_set_mode(%d)",
- input_device->identifier, send_events);
- log_libinput_config_status(libinput_device_config_send_events_set_mode(
- libinput_device, send_events));
-
- if (libinput_device_config_tap_get_finger_count(libinput_device) > 0) {
- enum libinput_config_tap_state tap =
- libinput_device_config_tap_get_default_enabled(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) tap_set_enabled(%d)",
- input_device->identifier, tap);
- log_libinput_config_status(libinput_device_config_tap_set_enabled(
- libinput_device, tap));
-
- enum libinput_config_tap_button_map tap_button_map =
- libinput_device_config_tap_get_button_map(libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) tap_set_button_map(%d)",
- input_device->identifier, tap_button_map);
- log_libinput_config_status(libinput_device_config_tap_set_button_map(
- libinput_device, tap_button_map));
-
- enum libinput_config_drag_state drag =
- libinput_device_config_tap_get_default_drag_enabled(libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) tap_set_drag_enabled(%d)",
- input_device->identifier, drag);
- log_libinput_config_status(libinput_device_config_tap_set_drag_enabled(
- libinput_device, drag));
-
- enum libinput_config_drag_lock_state drag_lock =
- libinput_device_config_tap_get_default_drag_lock_enabled(
- libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) tap_set_drag_lock_enabled(%d)",
- input_device->identifier, drag_lock);
- log_libinput_config_status(
- libinput_device_config_tap_set_drag_lock_enabled(
- libinput_device, drag_lock));
- }
-
- if (libinput_device_config_accel_is_available(libinput_device)) {
- double pointer_accel =
- libinput_device_config_accel_get_default_speed(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) accel_set_speed(%f)",
- input_device->identifier, pointer_accel);
- log_libinput_config_status(libinput_device_config_accel_set_speed(
- libinput_device, pointer_accel));
-
- enum libinput_config_accel_profile accel_profile =
- libinput_device_config_accel_get_default_profile(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) accel_set_profile(%d)",
- input_device->identifier, accel_profile);
- log_libinput_config_status(libinput_device_config_accel_set_profile(
- libinput_device, accel_profile));
- }
-
- if (libinput_device_config_scroll_has_natural_scroll(libinput_device)) {
- int natural_scroll =
- libinput_device_config_scroll_get_default_natural_scroll_enabled(
- libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) natural_scroll_set_enabled(%d)",
- input_device->identifier, natural_scroll);
- log_libinput_config_status(
- libinput_device_config_scroll_set_natural_scroll_enabled(
- libinput_device, natural_scroll));
- }
-
- if (libinput_device_config_left_handed_is_available(libinput_device)) {
- int left_handed =
- libinput_device_config_left_handed_get_default(libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) left_handed_set_enabled(%d)",
- input_device->identifier, left_handed);
- log_libinput_config_status(libinput_device_config_left_handed_set(
- libinput_device, left_handed));
- }
-
- uint32_t click = libinput_device_config_click_get_methods(libinput_device);
- if ((click & ~LIBINPUT_CONFIG_CLICK_METHOD_NONE) != 0) {
- enum libinput_config_click_method click_method =
- libinput_device_config_click_get_default_method(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) click_set_method(%d)",
- input_device->identifier, click_method);
- log_libinput_config_status(libinput_device_config_click_set_method(
- libinput_device, click_method));
- }
-
- if (libinput_device_config_middle_emulation_is_available(libinput_device)) {
- enum libinput_config_middle_emulation_state middle_emulation =
- libinput_device_config_middle_emulation_get_default_enabled(
- libinput_device);
- sway_log(SWAY_DEBUG,
- "libinput_reset_pointer(%s) middle_emulation_set_enabled(%d)",
- input_device->identifier, middle_emulation);
- log_libinput_config_status(
- libinput_device_config_middle_emulation_set_enabled(
- libinput_device, middle_emulation));
- }
-
- uint32_t scroll = libinput_device_config_scroll_get_methods(libinput_device);
- if ((scroll & ~LIBINPUT_CONFIG_SCROLL_NO_SCROLL) != 0) {
- enum libinput_config_scroll_method scroll_method =
- libinput_device_config_scroll_get_default_method(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) scroll_set_method(%d)",
- input_device->identifier, scroll_method);
- log_libinput_config_status(libinput_device_config_scroll_set_method(
- libinput_device, scroll_method));
-
- uint32_t scroll_button =
- libinput_device_config_scroll_get_default_button(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) scroll_set_button(%d)",
- input_device->identifier, scroll_button);
- log_libinput_config_status(libinput_device_config_scroll_set_button(
- libinput_device, scroll_button));
- }
-
- if (libinput_device_config_dwt_is_available(libinput_device)) {
- enum libinput_config_dwt_state dwt =
- libinput_device_config_dwt_get_default_enabled(libinput_device);
- sway_log(SWAY_DEBUG, "libinput_reset_pointer(%s) dwt_set_enabled(%d)",
- input_device->identifier, dwt);
- log_libinput_config_status(libinput_device_config_dwt_set_enabled(
- libinput_device, dwt));
- }
-}
-
static void handle_device_destroy(struct wl_listener *listener, void *data) {
struct wlr_input_device *device = data;
@@ -614,16 +217,7 @@ static void handle_new_input(struct wl_listener *listener, void *data) {
apply_input_type_config(input_device);
- if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
- input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) {
- input_manager_libinput_config_pointer(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) {
- input_manager_libinput_config_keyboard(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) {
- input_manager_libinput_config_switch(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) {
- input_manager_libinput_config_touch(input_device);
- }
+ sway_input_configure_libinput_device(input_device);
wl_signal_add(&device->events.destroy, &input_device->device_destroy);
input_device->device_destroy.notify = handle_device_destroy;
@@ -775,17 +369,7 @@ void input_manager_apply_input_config(struct input_config *input_config) {
if (strcmp(input_device->identifier, input_config->identifier) == 0
|| wildcard
|| type_matches) {
- if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
- input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) {
- input_manager_libinput_config_pointer(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) {
- input_manager_libinput_config_keyboard(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) {
- input_manager_libinput_config_switch(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) {
- input_manager_libinput_config_touch(input_device);
- }
-
+ sway_input_configure_libinput_device(input_device);
struct sway_seat *seat = NULL;
wl_list_for_each(seat, &server.input->seats, link) {
seat_configure_device(seat, input_device);
@@ -795,17 +379,7 @@ void input_manager_apply_input_config(struct input_config *input_config) {
}
void input_manager_reset_input(struct sway_input_device *input_device) {
- if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
- input_device->wlr_device->type == WLR_INPUT_DEVICE_TABLET_TOOL) {
- input_manager_libinput_reset_pointer(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_KEYBOARD) {
- input_manager_libinput_reset_keyboard(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_SWITCH) {
- input_manager_libinput_reset_switch(input_device);
- } else if (input_device->wlr_device->type == WLR_INPUT_DEVICE_TOUCH) {
- input_manager_libinput_reset_touch(input_device);
- }
-
+ sway_input_reset_libinput_device(input_device);
struct sway_seat *seat = NULL;
wl_list_for_each(seat, &server.input->seats, link) {
seat_reset_device(seat, input_device);