From 21ce20885a6a6e9e7178778513b09fea9354c603 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 7 Dec 2017 07:31:49 -0500 Subject: rename input to input-manager --- sway/input/input-manager.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++ sway/input/input.c | 77 -------------------------------------------- 2 files changed, 79 insertions(+), 77 deletions(-) create mode 100644 sway/input/input-manager.c delete mode 100644 sway/input/input.c (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c new file mode 100644 index 00000000..285a68b8 --- /dev/null +++ b/sway/input/input-manager.c @@ -0,0 +1,79 @@ +#define _XOPEN_SOURCE 700 +#include +#include +#include +#include +#include +#include +#include "sway/config.h" +#include "sway/input-manager.h" +#include "sway/server.h" +#include "list.h" +#include "log.h" + +struct input_config *current_input_config = NULL; + +struct sway_input_manager *sway_input_manager_create( + struct sway_server *server) { + struct sway_input_manager *input = + calloc(1, sizeof(struct sway_input_manager)); + if (!input) { + return NULL; + } + return input; +} + +struct input_config *new_input_config(const char* identifier) { + struct input_config *input = calloc(1, sizeof(struct input_config)); + if (!input) { + sway_log(L_DEBUG, "Unable to allocate input config"); + return NULL; + } + sway_log(L_DEBUG, "new_input_config(%s)", identifier); + if (!(input->identifier = strdup(identifier))) { + free(input); + sway_log(L_DEBUG, "Unable to allocate input config"); + return NULL; + } + + input->tap = INT_MIN; + input->drag_lock = INT_MIN; + input->dwt = INT_MIN; + input->send_events = INT_MIN; + input->click_method = INT_MIN; + input->middle_emulation = INT_MIN; + input->natural_scroll = INT_MIN; + input->accel_profile = INT_MIN; + input->pointer_accel = FLT_MIN; + input->scroll_method = INT_MIN; + input->left_handed = INT_MIN; + + return input; +} + +char *libinput_dev_unique_id(struct libinput_device *device) { + int vendor = libinput_device_get_id_vendor(device); + int product = libinput_device_get_id_product(device); + char *name = strdup(libinput_device_get_name(device)); + + char *p = name; + for (; *p; ++p) { + if (*p == ' ') { + *p = '_'; + } + } + + sway_log(L_DEBUG, "rewritten name %s", name); + + int len = strlen(name) + sizeof(char) * 6; + char *identifier = malloc(len); + if (!identifier) { + sway_log(L_ERROR, "Unable to allocate unique input device name"); + return NULL; + } + + const char *fmt = "%d:%d:%s"; + snprintf(identifier, len, fmt, vendor, product, name); + free(name); + return identifier; +} diff --git a/sway/input/input.c b/sway/input/input.c deleted file mode 100644 index 02b4995e..00000000 --- a/sway/input/input.c +++ /dev/null @@ -1,77 +0,0 @@ -#define _XOPEN_SOURCE 700 -#include -#include -#include -#include -#include -#include -#include "sway/config.h" -#include "sway/input.h" -#include "sway/server.h" -#include "list.h" -#include "log.h" - -struct input_config *current_input_config = NULL; - -struct sway_input *sway_input_create(struct sway_server *server) { - struct sway_input *input = calloc(1, sizeof(struct sway_input)); - if (!input) { - return NULL; - } - return input; -} - -struct input_config *new_input_config(const char* identifier) { - struct input_config *input = calloc(1, sizeof(struct input_config)); - if (!input) { - sway_log(L_DEBUG, "Unable to allocate input config"); - return NULL; - } - sway_log(L_DEBUG, "new_input_config(%s)", identifier); - if (!(input->identifier = strdup(identifier))) { - free(input); - sway_log(L_DEBUG, "Unable to allocate input config"); - return NULL; - } - - input->tap = INT_MIN; - input->drag_lock = INT_MIN; - input->dwt = INT_MIN; - input->send_events = INT_MIN; - input->click_method = INT_MIN; - input->middle_emulation = INT_MIN; - input->natural_scroll = INT_MIN; - input->accel_profile = INT_MIN; - input->pointer_accel = FLT_MIN; - input->scroll_method = INT_MIN; - input->left_handed = INT_MIN; - - return input; -} - -char *libinput_dev_unique_id(struct libinput_device *device) { - int vendor = libinput_device_get_id_vendor(device); - int product = libinput_device_get_id_product(device); - char *name = strdup(libinput_device_get_name(device)); - - char *p = name; - for (; *p; ++p) { - if (*p == ' ') { - *p = '_'; - } - } - - sway_log(L_DEBUG, "rewritten name %s", name); - - int len = strlen(name) + sizeof(char) * 6; - char *identifier = malloc(len); - if (!identifier) { - sway_log(L_ERROR, "Unable to allocate unique input device name"); - return NULL; - } - - const char *fmt = "%d:%d:%s"; - snprintf(identifier, len, fmt, vendor, product, name); - free(name); - return identifier; -} -- cgit v1.2.3 From f6f63f60d6c7f9602dd1c07b45eb45a97e5b6f5a Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 7 Dec 2017 09:58:32 -0500 Subject: basic input manager and seat --- sway/input/input-manager.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++ sway/input/seat.c | 24 +++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 sway/input/seat.c (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 285a68b8..b5ab8cc1 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -7,12 +7,52 @@ #include #include "sway/config.h" #include "sway/input-manager.h" +#include "sway/seat.h" #include "sway/server.h" #include "list.h" #include "log.h" +static const char *default_seat = "seat0"; + struct input_config *current_input_config = NULL; +static struct sway_seat *input_manager_get_seat( + struct sway_input_manager *input, const char *seat_name) { + struct sway_seat *seat = NULL; + + for (int i = 0; i < input->seats->length; ++i) { + seat = input->seats->items[i]; + if (strcmp(seat->seat->name, seat_name) == 0) { + return seat; + } + } + + seat = sway_seat_create(input->server->wl_display, seat_name); + list_add(input->seats, seat); + + return seat; +} + +static void input_add_notify(struct wl_listener *listener, void *data) { + struct sway_input_manager *input = + wl_container_of(listener, input, input_add); + struct wlr_input_device *device = data; + + // TODO device configuration + struct sway_seat *seat = input_manager_get_seat(input, default_seat); + sway_seat_add_device(seat, device); +} + +static void input_remove_notify(struct wl_listener *listener, void *data) { + struct sway_input_manager *input = + wl_container_of(listener, input, input_remove); + struct wlr_input_device *device = data; + + // TODO device configuration + struct sway_seat *seat = input_manager_get_seat(input, default_seat); + sway_seat_remove_device(seat, device); +} + struct sway_input_manager *sway_input_manager_create( struct sway_server *server) { struct sway_input_manager *input = @@ -20,6 +60,20 @@ struct sway_input_manager *sway_input_manager_create( if (!input) { return NULL; } + // XXX probably don't need the full server + input->server = server; + + input->seats = create_list(); + + // create the default seat + input_manager_get_seat(input, default_seat); + + input->input_add.notify = input_add_notify; + wl_signal_add(&server->backend->events.input_add, &input->input_add); + + input->input_remove.notify = input_remove_notify; + wl_signal_add(&server->backend->events.input_remove, &input->input_remove); + return input; } diff --git a/sway/input/seat.c b/sway/input/seat.c new file mode 100644 index 00000000..f41b6dba --- /dev/null +++ b/sway/input/seat.c @@ -0,0 +1,24 @@ +#define _XOPEN_SOURCE 700 +#include "sway/seat.h" +#include "sway/input-manager.h" +#include "log.h" + +struct sway_seat *sway_seat_create(struct wl_display *display, + const char *seat_name) { + struct sway_seat *seat = calloc(1, sizeof(struct sway_seat)); + if (!seat) { + return NULL; + } + seat->seat = wlr_seat_create(display, seat_name); + return seat; +} + +void sway_seat_add_device(struct sway_seat *seat, + struct wlr_input_device *device) { + sway_log(L_DEBUG, "input add: %s", device->name); +} + +void sway_seat_remove_device(struct sway_seat *seat, + struct wlr_input_device *device) { + sway_log(L_DEBUG, "input remove: %s", device->name); +} -- cgit v1.2.3 From ec7fc42a00db8c230ca1a050f0a1f7badc697fa5 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Fri, 8 Dec 2017 07:22:26 -0500 Subject: sway cursor --- sway/input/cursor.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++ sway/input/seat.c | 52 +++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 sway/input/cursor.c (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c new file mode 100644 index 00000000..819007d5 --- /dev/null +++ b/sway/input/cursor.c @@ -0,0 +1,128 @@ +#define _XOPEN_SOURCE 700 +#include +#include "sway/cursor.h" +#include "log.h" + +static void handle_cursor_motion(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, motion); + struct wlr_event_pointer_motion *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_cursor_motion_absolute(struct wl_listener *listener, + void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, motion_absolute); + struct wlr_event_pointer_motion_absolute *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_cursor_button(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, button); + struct wlr_event_pointer_button *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_cursor_axis(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, axis); + struct wlr_event_pointer_axis *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_touch_down(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, touch_down); + struct wlr_event_touch_down *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_touch_up(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, touch_up); + struct wlr_event_touch_up *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_touch_motion(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, touch_motion); + struct wlr_event_touch_motion *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_tool_axis(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, tool_axis); + struct wlr_event_tablet_tool_axis *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_tool_tip(struct wl_listener *listener, void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, tool_tip); + struct wlr_event_tablet_tool_tip *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +static void handle_request_set_cursor(struct wl_listener *listener, + void *data) { + struct sway_cursor *cursor = + wl_container_of(listener, cursor, request_set_cursor); + struct wlr_seat_pointer_request_set_cursor_event *event = data; + sway_log(L_DEBUG, "TODO: handle event: %p", event); +} + +struct sway_cursor *sway_cursor_create(struct sway_seat *seat) { + struct sway_cursor *cursor = calloc(1, sizeof(struct sway_cursor)); + if (!sway_assert(cursor, "could not allocate sway cursor")) { + return NULL; + } + + struct wlr_cursor *wlr_cursor = wlr_cursor_create(); + if (!sway_assert(wlr_cursor, "could not allocate wlr cursor")) { + free(cursor); + return NULL; + } + + // input events + wl_signal_add(&wlr_cursor->events.motion, &cursor->motion); + cursor->motion.notify = handle_cursor_motion; + + wl_signal_add(&wlr_cursor->events.motion_absolute, + &cursor->motion_absolute); + cursor->motion_absolute.notify = handle_cursor_motion_absolute; + + wl_signal_add(&wlr_cursor->events.button, &cursor->button); + cursor->button.notify = handle_cursor_button; + + wl_signal_add(&wlr_cursor->events.axis, &cursor->axis); + cursor->axis.notify = handle_cursor_axis; + + wl_signal_add(&wlr_cursor->events.touch_down, &cursor->touch_down); + cursor->touch_down.notify = handle_touch_down; + + wl_signal_add(&wlr_cursor->events.touch_up, &cursor->touch_up); + cursor->touch_up.notify = handle_touch_up; + + wl_signal_add(&wlr_cursor->events.touch_motion, + &cursor->touch_motion); + cursor->touch_motion.notify = handle_touch_motion; + + wl_signal_add(&wlr_cursor->events.tablet_tool_axis, + &cursor->tool_axis); + cursor->tool_axis.notify = handle_tool_axis; + + wl_signal_add(&wlr_cursor->events.tablet_tool_tip, &cursor->tool_tip); + cursor->tool_tip.notify = handle_tool_tip; + + wl_signal_add(&seat->seat->events.request_set_cursor, + &cursor->request_set_cursor); + cursor->request_set_cursor.notify = handle_request_set_cursor; + + cursor->cursor = wlr_cursor; + + return cursor; +} diff --git a/sway/input/seat.c b/sway/input/seat.c index f41b6dba..459b2ee2 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1,5 +1,7 @@ #define _XOPEN_SOURCE 700 +#include #include "sway/seat.h" +#include "sway/cursor.h" #include "sway/input-manager.h" #include "log.h" @@ -9,16 +11,66 @@ struct sway_seat *sway_seat_create(struct wl_display *display, if (!seat) { return NULL; } + seat->seat = wlr_seat_create(display, seat_name); + if (!sway_assert(seat->seat, "could not allocate seat")) { + return NULL; + } + + seat->cursor = sway_cursor_create(seat); + if (!seat->cursor) { + wlr_seat_destroy(seat->seat); + free(seat); + return NULL; + } + + wlr_seat_set_capabilities(seat->seat, + WL_SEAT_CAPABILITY_KEYBOARD | + WL_SEAT_CAPABILITY_POINTER | + WL_SEAT_CAPABILITY_TOUCH); + return seat; } +static void seat_add_pointer(struct sway_seat *seat, + struct wlr_input_device *device) { + // TODO pointer configuration + wlr_cursor_attach_input_device(seat->cursor->cursor, device); +} + void sway_seat_add_device(struct sway_seat *seat, struct wlr_input_device *device) { sway_log(L_DEBUG, "input add: %s", device->name); + switch (device->type) { + case WLR_INPUT_DEVICE_POINTER: + seat_add_pointer(seat, device); + break; + case WLR_INPUT_DEVICE_KEYBOARD: + case WLR_INPUT_DEVICE_TOUCH: + case WLR_INPUT_DEVICE_TABLET_PAD: + case WLR_INPUT_DEVICE_TABLET_TOOL: + sway_log(L_DEBUG, "TODO: add other devices"); + break; + } +} + +static void seat_remove_pointer(struct sway_seat *seat, + struct wlr_input_device *device) { + // TODO } void sway_seat_remove_device(struct sway_seat *seat, struct wlr_input_device *device) { sway_log(L_DEBUG, "input remove: %s", device->name); + switch (device->type) { + case WLR_INPUT_DEVICE_POINTER: + seat_remove_pointer(seat, device); + break; + case WLR_INPUT_DEVICE_KEYBOARD: + case WLR_INPUT_DEVICE_TOUCH: + case WLR_INPUT_DEVICE_TABLET_PAD: + case WLR_INPUT_DEVICE_TABLET_TOOL: + sway_log(L_DEBUG, "TODO: remove other devices"); + break; + } } -- cgit v1.2.3 From d76e745b738281fb98834fd5dee78f2a21727d80 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Fri, 8 Dec 2017 08:07:47 -0500 Subject: input include directory --- sway/input/cursor.c | 2 +- sway/input/input-manager.c | 4 ++-- sway/input/seat.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 819007d5..85b7865d 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -1,6 +1,6 @@ #define _XOPEN_SOURCE 700 #include -#include "sway/cursor.h" +#include "sway/input/cursor.h" #include "log.h" static void handle_cursor_motion(struct wl_listener *listener, void *data) { diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index b5ab8cc1..4f52e59a 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -6,8 +6,8 @@ #include #include #include "sway/config.h" -#include "sway/input-manager.h" -#include "sway/seat.h" +#include "sway/input/input-manager.h" +#include "sway/input/seat.h" #include "sway/server.h" #include "list.h" #include "log.h" diff --git a/sway/input/seat.c b/sway/input/seat.c index 459b2ee2..1a2b728c 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1,8 +1,8 @@ #define _XOPEN_SOURCE 700 #include -#include "sway/seat.h" -#include "sway/cursor.h" -#include "sway/input-manager.h" +#include "sway/input/seat.h" +#include "sway/input/cursor.h" +#include "sway/input/input-manager.h" #include "log.h" struct sway_seat *sway_seat_create(struct wl_display *display, -- cgit v1.2.3 From 7c67bea942d44b93cf03c3223067d2668905a3c0 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 9 Dec 2017 11:51:28 -0500 Subject: sway xcursor manager --- sway/input/seat.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'sway/input') diff --git a/sway/input/seat.c b/sway/input/seat.c index 1a2b728c..1fd65980 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1,8 +1,10 @@ #define _XOPEN_SOURCE 700 #include +#include #include "sway/input/seat.h" #include "sway/input/cursor.h" #include "sway/input/input-manager.h" +#include "sway/output.h" #include "log.h" struct sway_seat *sway_seat_create(struct wl_display *display, @@ -29,6 +31,8 @@ struct sway_seat *sway_seat_create(struct wl_display *display, WL_SEAT_CAPABILITY_POINTER | WL_SEAT_CAPABILITY_TOUCH); + sway_seat_configure_xcursor(seat); + return seat; } @@ -74,3 +78,37 @@ void sway_seat_remove_device(struct sway_seat *seat, break; } } + +void sway_seat_configure_xcursor(struct sway_seat *seat) { + // TODO configure theme and size + const char *cursor_theme = "default"; + + if (seat->cursor->xcursor_manager) { + wlr_xcursor_manager_destroy(seat->cursor->xcursor_manager); + } + + seat->cursor->xcursor_manager = + wlr_xcursor_manager_create(NULL, 24); + if (sway_assert(seat->cursor->xcursor_manager, + "Cannot create XCursor manager for theme %s", cursor_theme)) { + return; + } + + for (int i = 0; i < root_container.children->length; ++i) { + swayc_t *output_container = root_container.children->items[i]; + struct wlr_output *output = + output_container->sway_output->wlr_output; + bool result = + wlr_xcursor_manager_load(seat->cursor->xcursor_manager, + output->scale); + + sway_assert(result, + "Cannot load xcursor theme for output '%s' with scale %d", + output->name, output->scale); + } + + wlr_xcursor_manager_set_cursor_image(seat->cursor->xcursor_manager, + "left_ptr", seat->cursor->cursor); + wlr_cursor_warp(seat->cursor->cursor, NULL, seat->cursor->cursor->x, + seat->cursor->cursor->y); +} -- cgit v1.2.3 From 9333a7eb5329073aecfaf776c8ee0572c7dff67c Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 9 Dec 2017 14:06:00 -0500 Subject: working xcursor --- sway/input/cursor.c | 8 +++++++- sway/input/seat.c | 18 ++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 85b7865d..4f0344be 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -1,5 +1,6 @@ #define _XOPEN_SOURCE 700 #include +#include #include "sway/input/cursor.h" #include "log.h" @@ -7,7 +8,10 @@ static void handle_cursor_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, motion); struct wlr_event_pointer_motion *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle cursor motion event: dx=%f, dy=%f", event->delta_x, event->delta_y); + wlr_cursor_move(cursor->cursor, event->device, event->delta_x, event->delta_y); + sway_log(L_DEBUG, "TODO: new x=%f, y=%f", cursor->cursor->x, cursor->cursor->y); + wlr_xcursor_manager_set_cursor_image(cursor->xcursor_manager, "left_ptr", cursor->cursor); } static void handle_cursor_motion_absolute(struct wl_listener *listener, @@ -87,6 +91,8 @@ struct sway_cursor *sway_cursor_create(struct sway_seat *seat) { return NULL; } + wlr_cursor_attach_output_layout(wlr_cursor, root_container.output_layout); + // input events wl_signal_add(&wlr_cursor->events.motion, &cursor->motion); cursor->motion.notify = handle_cursor_motion; diff --git a/sway/input/seat.c b/sway/input/seat.c index 1fd65980..5aed1f68 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -83,15 +83,13 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { // TODO configure theme and size const char *cursor_theme = "default"; - if (seat->cursor->xcursor_manager) { - wlr_xcursor_manager_destroy(seat->cursor->xcursor_manager); - } - - seat->cursor->xcursor_manager = - wlr_xcursor_manager_create(NULL, 24); - if (sway_assert(seat->cursor->xcursor_manager, - "Cannot create XCursor manager for theme %s", cursor_theme)) { - return; + if (!seat->cursor->xcursor_manager) { + seat->cursor->xcursor_manager = + wlr_xcursor_manager_create("default", 24); + if (sway_assert(seat->cursor->xcursor_manager, + "Cannot create XCursor manager for theme %s", cursor_theme)) { + return; + } } for (int i = 0; i < root_container.children->length; ++i) { @@ -102,7 +100,7 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { wlr_xcursor_manager_load(seat->cursor->xcursor_manager, output->scale); - sway_assert(result, + sway_assert(!result, "Cannot load xcursor theme for output '%s' with scale %d", output->name, output->scale); } -- cgit v1.2.3 From e69b052a6d88b1c24d5e48ad086480ee04c07c81 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 08:48:44 -0500 Subject: working pointer motion --- sway/input/cursor.c | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 4f0344be..059f907d 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -2,16 +2,44 @@ #include #include #include "sway/input/cursor.h" +#include "sway/view.h" +#include "list.h" #include "log.h" +static void cursor_update_position(struct sway_cursor *cursor) { + double x = cursor->cursor->x; + double y = cursor->cursor->y; + + wlr_xcursor_manager_set_cursor_image(cursor->xcursor_manager, + "left_ptr", cursor->cursor); + + cursor->x = x; + cursor->y = y; +} + +static void cursor_send_pointer_motion(struct sway_cursor *cursor, + uint32_t time) { + struct wlr_seat *seat = cursor->seat->seat; + struct wlr_surface *surface = NULL; + double sx, sy; + swayc_t *swayc = + swayc_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy); + if (swayc) { + wlr_seat_pointer_enter(seat, surface, sx, sy); + wlr_seat_pointer_notify_motion(seat, time, sx, sy); + } else { + wlr_seat_pointer_clear_focus(seat); + } +} + static void handle_cursor_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, motion); struct wlr_event_pointer_motion *event = data; - sway_log(L_DEBUG, "TODO: handle cursor motion event: dx=%f, dy=%f", event->delta_x, event->delta_y); - wlr_cursor_move(cursor->cursor, event->device, event->delta_x, event->delta_y); - sway_log(L_DEBUG, "TODO: new x=%f, y=%f", cursor->cursor->x, cursor->cursor->y); - wlr_xcursor_manager_set_cursor_image(cursor->xcursor_manager, "left_ptr", cursor->cursor); + wlr_cursor_move(cursor->cursor, event->device, + event->delta_x, event->delta_y); + cursor_update_position(cursor); + cursor_send_pointer_motion(cursor, event->time_msec); } static void handle_cursor_motion_absolute(struct wl_listener *listener, @@ -19,7 +47,10 @@ static void handle_cursor_motion_absolute(struct wl_listener *listener, struct sway_cursor *cursor = wl_container_of(listener, cursor, motion_absolute); struct wlr_event_pointer_motion_absolute *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + wlr_cursor_warp_absolute(cursor->cursor, event->device, + event->x_mm / event->width_mm, event->y_mm / event->height_mm); + cursor_update_position(cursor); + cursor_send_pointer_motion(cursor, event->time_msec); } static void handle_cursor_button(struct wl_listener *listener, void *data) { @@ -91,6 +122,7 @@ struct sway_cursor *sway_cursor_create(struct sway_seat *seat) { return NULL; } + cursor->seat = seat; wlr_cursor_attach_output_layout(wlr_cursor, root_container.output_layout); // input events -- cgit v1.2.3 From 5f644d78fc77f48c7f7d839f7c2e318b51c2c6d7 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 10:08:16 -0500 Subject: button and axis events --- sway/input/cursor.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 059f907d..5f2d650e 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -25,7 +25,7 @@ static void cursor_send_pointer_motion(struct sway_cursor *cursor, swayc_t *swayc = swayc_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy); if (swayc) { - wlr_seat_pointer_enter(seat, surface, sx, sy); + wlr_seat_pointer_notify_enter(seat, surface, sx, sy); wlr_seat_pointer_notify_motion(seat, time, sx, sy); } else { wlr_seat_pointer_clear_focus(seat); @@ -57,49 +57,51 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, button); struct wlr_event_pointer_button *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + wlr_seat_pointer_notify_button(cursor->seat->seat, event->time_msec, + event->button, event->state); } static void handle_cursor_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, axis); struct wlr_event_pointer_axis *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + wlr_seat_pointer_notify_axis(cursor->seat->seat, event->time_msec, + event->orientation, event->delta); } static void handle_touch_down(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_down); struct wlr_event_touch_down *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle touch down event: %p", event); } static void handle_touch_up(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_up); struct wlr_event_touch_up *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle touch up event: %p", event); } static void handle_touch_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_motion); struct wlr_event_touch_motion *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle touch motion event: %p", event); } static void handle_tool_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_axis); struct wlr_event_tablet_tool_axis *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle tool axis event: %p", event); } static void handle_tool_tip(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_tip); struct wlr_event_tablet_tool_tip *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle tool tip event: %p", event); } static void handle_request_set_cursor(struct wl_listener *listener, @@ -107,7 +109,7 @@ static void handle_request_set_cursor(struct wl_listener *listener, struct sway_cursor *cursor = wl_container_of(listener, cursor, request_set_cursor); struct wlr_seat_pointer_request_set_cursor_event *event = data; - sway_log(L_DEBUG, "TODO: handle event: %p", event); + sway_log(L_DEBUG, "TODO: handle request set cursor event: %p", event); } struct sway_cursor *sway_cursor_create(struct sway_seat *seat) { -- cgit v1.2.3 From 21626e8153490bf155e812644454fe9610491ffd Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 11:11:47 -0500 Subject: seat focus on button press --- sway/input/cursor.c | 15 +++++++++++++++ sway/input/input-manager.c | 14 +++++++++++++- sway/input/seat.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 70 insertions(+), 3 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 5f2d650e..217c2ddb 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -1,4 +1,9 @@ #define _XOPEN_SOURCE 700 +#ifdef __linux__ +#include +#elif __FreeBSD__ +#include +#endif #include #include #include "sway/input/cursor.h" @@ -57,6 +62,16 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, button); struct wlr_event_pointer_button *event = data; + + if (event->button == BTN_LEFT) { + struct wlr_surface *surface = NULL; + double sx, sy; + swayc_t *swayc = + swayc_at(&root_container, cursor->x, cursor->y, &surface, &sx, &sy); + + sway_seat_set_focus(cursor->seat, swayc); + } + wlr_seat_pointer_notify_button(cursor->seat->seat, event->time_msec, event->button, event->state); } diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 4f52e59a..ca80f267 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -27,7 +27,7 @@ static struct sway_seat *input_manager_get_seat( } } - seat = sway_seat_create(input->server->wl_display, seat_name); + seat = sway_seat_create(input, seat_name); list_add(input->seats, seat); return seat; @@ -131,3 +131,15 @@ char *libinput_dev_unique_id(struct libinput_device *device) { free(name); return identifier; } + +bool sway_input_manager_swayc_has_focus(struct sway_input_manager *input, + swayc_t *container) { + for (int i = 0; i < input->seats->length; ++i) { + struct sway_seat *seat = input->seats->items[i]; + if (seat->focus == container) { + return true; + } + } + + return false; +} diff --git a/sway/input/seat.c b/sway/input/seat.c index 5aed1f68..94f547cc 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -5,16 +5,17 @@ #include "sway/input/cursor.h" #include "sway/input/input-manager.h" #include "sway/output.h" +#include "sway/view.h" #include "log.h" -struct sway_seat *sway_seat_create(struct wl_display *display, +struct sway_seat *sway_seat_create(struct sway_input_manager *input, const char *seat_name) { struct sway_seat *seat = calloc(1, sizeof(struct sway_seat)); if (!seat) { return NULL; } - seat->seat = wlr_seat_create(display, seat_name); + seat->seat = wlr_seat_create(input->server->wl_display, seat_name); if (!sway_assert(seat->seat, "could not allocate seat")) { return NULL; } @@ -26,6 +27,8 @@ struct sway_seat *sway_seat_create(struct wl_display *display, return NULL; } + seat->input = input; + wlr_seat_set_capabilities(seat->seat, WL_SEAT_CAPABILITY_KEYBOARD | WL_SEAT_CAPABILITY_POINTER | @@ -110,3 +113,40 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { wlr_cursor_warp(seat->cursor->cursor, NULL, seat->cursor->cursor->x, seat->cursor->cursor->y); } + +static void handle_focus_destroy(struct wl_listener *listener, void *data) { + struct sway_seat *seat = wl_container_of(listener, seat, focus_destroy); + //swayc_t *container = data; + + // TODO set new focus based on the state of the tree + sway_seat_set_focus(seat, NULL); +} + +void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { + swayc_t *last_focus = seat->focus; + + if (last_focus == container) { + return; + } + + if (last_focus) { + wl_list_remove(&seat->focus_destroy.link); + } + + if (container) { + struct sway_view *view = container->sway_view; + view->iface.set_activated(view, true); + wl_signal_add(&container->events.destroy, &seat->focus_destroy); + seat->focus_destroy.notify = handle_focus_destroy; + // TODO give keyboard focus + } + + seat->focus = container; + + if (last_focus && + !sway_input_manager_swayc_has_focus(seat->input, last_focus)) { + struct sway_view *view = last_focus->sway_view; + view->iface.set_activated(view, false); + + } +} -- cgit v1.2.3 From 6339c4f161a80cc00a8e57f402ca45c5dbc86937 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 13:28:04 -0500 Subject: remove pointer device --- sway/input/seat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/input') diff --git a/sway/input/seat.c b/sway/input/seat.c index 94f547cc..b3d36681 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -63,7 +63,7 @@ void sway_seat_add_device(struct sway_seat *seat, static void seat_remove_pointer(struct sway_seat *seat, struct wlr_input_device *device) { - // TODO + wlr_cursor_detach_input_device(seat->cursor->cursor, device); } void sway_seat_remove_device(struct sway_seat *seat, -- cgit v1.2.3 From 609f63934ab3eb925741450aa7f78db1c11bdd37 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 13:59:04 -0500 Subject: basic keyboard --- sway/input/keyboard.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++ sway/input/seat.c | 14 ++++++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 sway/input/keyboard.c (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c new file mode 100644 index 00000000..59f81e62 --- /dev/null +++ b/sway/input/keyboard.c @@ -0,0 +1,57 @@ +#include "sway/input/seat.h" +#include "sway/input/keyboard.h" +#include "log.h" + +static void handle_keyboard_key(struct wl_listener *listener, void *data) { + struct sway_keyboard *keyboard = + wl_container_of(listener, keyboard, keyboard_key); + struct wlr_event_keyboard_key *event = data; + wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); + wlr_seat_keyboard_notify_key(keyboard->seat->seat, event->time_msec, + event->keycode, event->state); +} + +static void handle_keyboard_modifiers(struct wl_listener *listener, + void *data) { + struct sway_keyboard *keyboard = + wl_container_of(listener, keyboard, keyboard_modifiers); + wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); + wlr_seat_keyboard_notify_modifiers(keyboard->seat->seat); +} + +struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, + struct wlr_input_device *device) { + struct sway_keyboard *keyboard = + calloc(1, sizeof(struct sway_keyboard)); + if (!sway_assert(keyboard, "could not allocate sway keyboard")) { + return NULL; + } + + keyboard->device = device; + keyboard->seat = seat; + + // TODO keyboard config + struct xkb_rule_names rules; + memset(&rules, 0, sizeof(rules)); + rules.rules = getenv("XKB_DEFAULT_RULES"); + rules.model = getenv("XKB_DEFAULT_MODEL"); + rules.layout = getenv("XKB_DEFAULT_LAYOUT"); + rules.variant = getenv("XKB_DEFAULT_VARIANT"); + rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); + if (!sway_assert(context, "cannot create XKB context")) { + return NULL; + } + + wlr_keyboard_set_keymap(device->keyboard, xkb_map_new_from_names(context, + &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); + xkb_context_unref(context); + + wl_signal_add(&device->keyboard->events.key, &keyboard->keyboard_key); + keyboard->keyboard_key.notify = handle_keyboard_key; + + wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); + keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; + + return keyboard; +} diff --git a/sway/input/seat.c b/sway/input/seat.c index b3d36681..0a5329c8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -4,6 +4,7 @@ #include "sway/input/seat.h" #include "sway/input/cursor.h" #include "sway/input/input-manager.h" +#include "sway/input/keyboard.h" #include "sway/output.h" #include "sway/view.h" #include "log.h" @@ -36,6 +37,8 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, sway_seat_configure_xcursor(seat); + wl_list_init(&seat->keyboards); + return seat; } @@ -45,6 +48,13 @@ static void seat_add_pointer(struct sway_seat *seat, wlr_cursor_attach_input_device(seat->cursor->cursor, device); } +static void seat_add_keyboard(struct sway_seat *seat, + struct wlr_input_device *device) { + struct sway_keyboard *keyboard = sway_keyboard_create(seat, device); + wl_list_insert(&seat->keyboards, &keyboard->link); + wlr_seat_set_keyboard(seat->seat, device); +} + void sway_seat_add_device(struct sway_seat *seat, struct wlr_input_device *device) { sway_log(L_DEBUG, "input add: %s", device->name); @@ -53,6 +63,8 @@ void sway_seat_add_device(struct sway_seat *seat, seat_add_pointer(seat, device); break; case WLR_INPUT_DEVICE_KEYBOARD: + seat_add_keyboard(seat, device); + break; case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_TOOL: @@ -138,7 +150,7 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { view->iface.set_activated(view, true); wl_signal_add(&container->events.destroy, &seat->focus_destroy); seat->focus_destroy.notify = handle_focus_destroy; - // TODO give keyboard focus + wlr_seat_keyboard_notify_enter(seat->seat, view->surface); } seat->focus = container; -- cgit v1.2.3 From 4d449743c5c476f1891a64b31f00cb7d5dd1555b Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 15:37:17 -0500 Subject: keyboard remove --- sway/input/keyboard.c | 9 +++++++++ sway/input/seat.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 59f81e62..31d254df 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -53,5 +53,14 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; + wl_list_insert(&seat->keyboards, &keyboard->link); + return keyboard; } + +void sway_keyboard_destroy(struct sway_keyboard *keyboard) { + wl_list_remove(&keyboard->keyboard_key.link); + wl_list_remove(&keyboard->keyboard_modifiers.link); + wl_list_remove(&keyboard->link); + free(keyboard); +} diff --git a/sway/input/seat.c b/sway/input/seat.c index 0a5329c8..7c827374 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -42,6 +42,18 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, return seat; } +static struct sway_keyboard *seat_keyboard_from_device(struct sway_seat *seat, + struct wlr_input_device *device) { + struct sway_keyboard *keyboard = NULL; + wl_list_for_each(keyboard, &seat->keyboards, link) { + if (keyboard->device == device) { + return keyboard; + } + } + + return keyboard; +} + static void seat_add_pointer(struct sway_seat *seat, struct wlr_input_device *device) { // TODO pointer configuration @@ -50,8 +62,13 @@ static void seat_add_pointer(struct sway_seat *seat, static void seat_add_keyboard(struct sway_seat *seat, struct wlr_input_device *device) { - struct sway_keyboard *keyboard = sway_keyboard_create(seat, device); - wl_list_insert(&seat->keyboards, &keyboard->link); + // TODO keyboard configuration + if (seat_keyboard_from_device(seat, device)) { + // already added + return; + } + + sway_keyboard_create(seat, device); wlr_seat_set_keyboard(seat->seat, device); } @@ -73,6 +90,14 @@ void sway_seat_add_device(struct sway_seat *seat, } } +static void seat_remove_keyboard(struct sway_seat *seat, + struct wlr_input_device *device) { + struct sway_keyboard *keyboard = seat_keyboard_from_device(seat, device); + if (keyboard) { + sway_keyboard_destroy(keyboard); + } +} + static void seat_remove_pointer(struct sway_seat *seat, struct wlr_input_device *device) { wlr_cursor_detach_input_device(seat->cursor->cursor, device); @@ -86,6 +111,8 @@ void sway_seat_remove_device(struct sway_seat *seat, seat_remove_pointer(seat, device); break; case WLR_INPUT_DEVICE_KEYBOARD: + seat_remove_keyboard(seat, device); + break; case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_TOOL: -- cgit v1.2.3 From 9ae906cd3752fd16ea2c3e046e24abb8ec8462a2 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 10 Dec 2017 15:49:54 -0500 Subject: sway pointer --- sway/input/seat.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'sway/input') diff --git a/sway/input/seat.c b/sway/input/seat.c index 7c827374..9c17250d 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -42,6 +42,18 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, return seat; } +static struct sway_pointer *seat_pointer_from_device(struct sway_seat *seat, + struct wlr_input_device *device) { + struct sway_pointer *pointer = NULL; + wl_list_for_each(pointer, &seat->pointers, link) { + if (pointer->device == device) { + return pointer; + } + } + + return pointer; +} + static struct sway_keyboard *seat_keyboard_from_device(struct sway_seat *seat, struct wlr_input_device *device) { struct sway_keyboard *keyboard = NULL; @@ -57,6 +69,16 @@ static struct sway_keyboard *seat_keyboard_from_device(struct sway_seat *seat, static void seat_add_pointer(struct sway_seat *seat, struct wlr_input_device *device) { // TODO pointer configuration + if (seat_pointer_from_device(seat, device)) { + // already added + return; + } + + struct sway_pointer *pointer = calloc(1, sizeof(struct sway_pointer)); + pointer->seat = seat; + pointer->device = device; + wl_list_insert(&seat->pointers, &pointer->link); + wlr_cursor_attach_input_device(seat->cursor->cursor, device); } @@ -100,7 +122,13 @@ static void seat_remove_keyboard(struct sway_seat *seat, static void seat_remove_pointer(struct sway_seat *seat, struct wlr_input_device *device) { - wlr_cursor_detach_input_device(seat->cursor->cursor, device); + struct sway_pointer *pointer = seat_pointer_from_device(seat, device); + + if (pointer) { + wl_list_remove(&pointer->link); + free(pointer); + wlr_cursor_detach_input_device(seat->cursor->cursor, device); + } } void sway_seat_remove_device(struct sway_seat *seat, -- cgit v1.2.3 From 163edc5a900fda58e006ed30e14ae10cc4aa13b3 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 12 Dec 2017 08:29:37 -0500 Subject: sway input device --- sway/input/input-manager.c | 185 +++++++++++++++++++++++++++++---------------- sway/input/keyboard.c | 18 ++--- sway/input/seat.c | 104 ++++++++++--------------- 3 files changed, 170 insertions(+), 137 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index ca80f267..b7f5615c 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -14,23 +14,70 @@ static const char *default_seat = "seat0"; +// TODO make me not global +struct sway_input_manager *input_manager; + struct input_config *current_input_config = NULL; static struct sway_seat *input_manager_get_seat( struct sway_input_manager *input, const char *seat_name) { struct sway_seat *seat = NULL; - - for (int i = 0; i < input->seats->length; ++i) { - seat = input->seats->items[i]; + wl_list_for_each(seat, &input->seats, link) { if (strcmp(seat->seat->name, seat_name) == 0) { return seat; } } - seat = sway_seat_create(input, seat_name); - list_add(input->seats, seat); + return sway_seat_create(input, seat_name); +} + +static char *get_device_identifier(struct wlr_input_device *device) { + int vendor = device->vendor; + int product = device->product; + char *name = strdup(device->name); + + char *p = name; + for (; *p; ++p) { + if (*p == ' ') { + *p = '_'; + } + } + + sway_log(L_DEBUG, "rewritten name %s", name); + + int len = strlen(name) + sizeof(char) * 6; + char *identifier = malloc(len); + if (!identifier) { + sway_log(L_ERROR, "Unable to allocate unique input device name"); + return NULL; + } + + const char *fmt = "%d:%d:%s"; + snprintf(identifier, len, fmt, vendor, product, name); + free(name); + return identifier; +} - return seat; +static struct sway_input_device *input_sway_device_from_wlr(struct sway_input_manager *input, + struct wlr_input_device *device) { + struct sway_input_device *sway_device = NULL; + wl_list_for_each(sway_device, &input->devices, link) { + if (sway_device->wlr_device == device) { + return sway_device; + } + } + return NULL; +} + +static struct sway_input_device *input_sway_device_from_config(struct sway_input_manager *input, + struct input_config *config) { + struct sway_input_device *sway_device = NULL; + wl_list_for_each(sway_device, &input->devices, link) { + if (strcmp(sway_device->identifier, config->identifier) == 0) { + return sway_device; + } + } + return NULL; } static void input_add_notify(struct wl_listener *listener, void *data) { @@ -38,9 +85,27 @@ static void input_add_notify(struct wl_listener *listener, void *data) { wl_container_of(listener, input, input_add); struct wlr_input_device *device = data; - // TODO device configuration + struct sway_input_device *sway_device = + calloc(1, sizeof(struct sway_input_device)); + if (!sway_assert(sway_device, "could not allocate input device")) { + return; + } + + sway_device->wlr_device = device; + sway_device->identifier = get_device_identifier(device); + wl_list_insert(&input->devices, &sway_device->link); + + // find config + for (int i = 0; i < config->input_configs->length; ++i) { + struct input_config *input_config = config->input_configs->items[i]; + if (strcmp(input_config->identifier, sway_device->identifier) == 0) { + sway_device->config = input_config; + break; + } + } + struct sway_seat *seat = input_manager_get_seat(input, default_seat); - sway_seat_add_device(seat, device); + sway_seat_add_device(seat, sway_device); } static void input_remove_notify(struct wl_listener *listener, void *data) { @@ -48,9 +113,21 @@ static void input_remove_notify(struct wl_listener *listener, void *data) { wl_container_of(listener, input, input_remove); struct wlr_input_device *device = data; - // TODO device configuration - struct sway_seat *seat = input_manager_get_seat(input, default_seat); - sway_seat_remove_device(seat, device); + struct sway_input_device *sway_device = + input_sway_device_from_wlr(input, device); + + if (!sway_assert(sway_device, "could not find sway device")) { + return; + } + + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + sway_seat_remove_device(seat, sway_device); + } + + wl_list_remove(&sway_device->link); + free(sway_device->identifier); + free(sway_device); } struct sway_input_manager *sway_input_manager_create( @@ -63,7 +140,8 @@ struct sway_input_manager *sway_input_manager_create( // XXX probably don't need the full server input->server = server; - input->seats = create_list(); + wl_list_init(&input->devices); + wl_list_init(&input->seats); // create the default seat input_manager_get_seat(input, default_seat); @@ -77,69 +155,46 @@ struct sway_input_manager *sway_input_manager_create( return input; } -struct input_config *new_input_config(const char* identifier) { - struct input_config *input = calloc(1, sizeof(struct input_config)); - if (!input) { - sway_log(L_DEBUG, "Unable to allocate input config"); - return NULL; - } - sway_log(L_DEBUG, "new_input_config(%s)", identifier); - if (!(input->identifier = strdup(identifier))) { - free(input); - sway_log(L_DEBUG, "Unable to allocate input config"); - return NULL; +bool sway_input_manager_has_focus(struct sway_input_manager *input, + swayc_t *container) { + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + if (seat->focus == container) { + return true; + } } - input->tap = INT_MIN; - input->drag_lock = INT_MIN; - input->dwt = INT_MIN; - input->send_events = INT_MIN; - input->click_method = INT_MIN; - input->middle_emulation = INT_MIN; - input->natural_scroll = INT_MIN; - input->accel_profile = INT_MIN; - input->pointer_accel = FLT_MIN; - input->scroll_method = INT_MIN; - input->left_handed = INT_MIN; - - return input; + return false; } -char *libinput_dev_unique_id(struct libinput_device *device) { - int vendor = libinput_device_get_id_vendor(device); - int product = libinput_device_get_id_product(device); - char *name = strdup(libinput_device_get_name(device)); - - char *p = name; - for (; *p; ++p) { - if (*p == ' ') { - *p = '_'; - } +void sway_input_manager_set_focus(struct sway_input_manager *input, + swayc_t *container) { + struct sway_seat *seat ; + wl_list_for_each(seat, &input->seats, link) { + sway_seat_set_focus(seat, container); } +} - sway_log(L_DEBUG, "rewritten name %s", name); +void sway_input_manager_apply_config(struct sway_input_manager *input, + struct input_config *config) { + struct sway_input_device *sway_device = + input_sway_device_from_config(input, config); + if (!sway_device) { + return; + } - int len = strlen(name) + sizeof(char) * 6; - char *identifier = malloc(len); - if (!identifier) { - sway_log(L_ERROR, "Unable to allocate unique input device name"); - return NULL; + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + sway_seat_remove_device(seat, sway_device); } - const char *fmt = "%d:%d:%s"; - snprintf(identifier, len, fmt, vendor, product, name); - free(name); - return identifier; + seat = input_manager_get_seat(input, default_seat); + sway_seat_add_device(seat, sway_device); } -bool sway_input_manager_swayc_has_focus(struct sway_input_manager *input, - swayc_t *container) { - for (int i = 0; i < input->seats->length; ++i) { - struct sway_seat *seat = input->seats->items[i]; - if (seat->focus == container) { - return true; - } +void sway_input_manager_configure_xcursor(struct sway_input_manager *input) { + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + sway_seat_configure_xcursor(seat); } - - return false; } diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 31d254df..6a792c65 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -6,7 +6,7 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { struct sway_keyboard *keyboard = wl_container_of(listener, keyboard, keyboard_key); struct wlr_event_keyboard_key *event = data; - wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); + wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); wlr_seat_keyboard_notify_key(keyboard->seat->seat, event->time_msec, event->keycode, event->state); } @@ -15,12 +15,12 @@ static void handle_keyboard_modifiers(struct wl_listener *listener, void *data) { struct sway_keyboard *keyboard = wl_container_of(listener, keyboard, keyboard_modifiers); - wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device); + wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); wlr_seat_keyboard_notify_modifiers(keyboard->seat->seat); } struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, - struct wlr_input_device *device) { + struct sway_input_device *device) { struct sway_keyboard *keyboard = calloc(1, sizeof(struct sway_keyboard)); if (!sway_assert(keyboard, "could not allocate sway keyboard")) { @@ -43,18 +43,18 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, return NULL; } - wlr_keyboard_set_keymap(device->keyboard, xkb_map_new_from_names(context, - &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); + wlr_keyboard_set_keymap(device->wlr_device->keyboard, + xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); xkb_context_unref(context); - wl_signal_add(&device->keyboard->events.key, &keyboard->keyboard_key); + wl_signal_add(&device->wlr_device->keyboard->events.key, + &keyboard->keyboard_key); keyboard->keyboard_key.notify = handle_keyboard_key; - wl_signal_add(&device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); + wl_signal_add(&device->wlr_device->keyboard->events.modifiers, + &keyboard->keyboard_modifiers); keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; - wl_list_insert(&seat->keyboards, &keyboard->link); - return keyboard; } diff --git a/sway/input/seat.c b/sway/input/seat.c index 9c17250d..80c6424f 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -29,6 +29,7 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, } seat->input = input; + seat->devices = create_list(); wlr_seat_set_capabilities(seat->seat, WL_SEAT_CAPABILITY_KEYBOARD | @@ -37,67 +38,38 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, sway_seat_configure_xcursor(seat); - wl_list_init(&seat->keyboards); + wl_list_insert(&input->seats, &seat->link); return seat; } -static struct sway_pointer *seat_pointer_from_device(struct sway_seat *seat, - struct wlr_input_device *device) { - struct sway_pointer *pointer = NULL; - wl_list_for_each(pointer, &seat->pointers, link) { - if (pointer->device == device) { - return pointer; - } - } - - return pointer; -} - -static struct sway_keyboard *seat_keyboard_from_device(struct sway_seat *seat, - struct wlr_input_device *device) { - struct sway_keyboard *keyboard = NULL; - wl_list_for_each(keyboard, &seat->keyboards, link) { - if (keyboard->device == device) { - return keyboard; - } - } - - return keyboard; -} - static void seat_add_pointer(struct sway_seat *seat, - struct wlr_input_device *device) { + struct sway_input_device *sway_device) { // TODO pointer configuration - if (seat_pointer_from_device(seat, device)) { - // already added - return; - } - - struct sway_pointer *pointer = calloc(1, sizeof(struct sway_pointer)); - pointer->seat = seat; - pointer->device = device; - wl_list_insert(&seat->pointers, &pointer->link); - - wlr_cursor_attach_input_device(seat->cursor->cursor, device); + wlr_cursor_attach_input_device(seat->cursor->cursor, + sway_device->wlr_device); } static void seat_add_keyboard(struct sway_seat *seat, - struct wlr_input_device *device) { + struct sway_input_device *device) { // TODO keyboard configuration - if (seat_keyboard_from_device(seat, device)) { - // already added - return; - } - sway_keyboard_create(seat, device); - wlr_seat_set_keyboard(seat->seat, device); + wlr_seat_set_keyboard(seat->seat, device->wlr_device); +} + +bool sway_seat_has_device(struct sway_seat *seat, + struct sway_input_device *device) { + return false; } void sway_seat_add_device(struct sway_seat *seat, - struct wlr_input_device *device) { - sway_log(L_DEBUG, "input add: %s", device->name); - switch (device->type) { + struct sway_input_device *device) { + if (sway_seat_has_device(seat, device)) { + return; + } + + sway_log(L_DEBUG, "input add: %s", device->identifier); + switch (device->wlr_device->type) { case WLR_INPUT_DEVICE_POINTER: seat_add_pointer(seat, device); break; @@ -110,31 +82,30 @@ void sway_seat_add_device(struct sway_seat *seat, sway_log(L_DEBUG, "TODO: add other devices"); break; } + + list_add(seat->devices, device); } static void seat_remove_keyboard(struct sway_seat *seat, - struct wlr_input_device *device) { - struct sway_keyboard *keyboard = seat_keyboard_from_device(seat, device); - if (keyboard) { - sway_keyboard_destroy(keyboard); + struct sway_input_device *device) { + if (device && device->keyboard) { + sway_keyboard_destroy(device->keyboard); } } static void seat_remove_pointer(struct sway_seat *seat, - struct wlr_input_device *device) { - struct sway_pointer *pointer = seat_pointer_from_device(seat, device); - - if (pointer) { - wl_list_remove(&pointer->link); - free(pointer); - wlr_cursor_detach_input_device(seat->cursor->cursor, device); - } + struct sway_input_device *device) { + wlr_cursor_detach_input_device(seat->cursor->cursor, device->wlr_device); } void sway_seat_remove_device(struct sway_seat *seat, - struct wlr_input_device *device) { - sway_log(L_DEBUG, "input remove: %s", device->name); - switch (device->type) { + struct sway_input_device *device) { + sway_log(L_DEBUG, "input remove: %s", device->identifier); + if (!sway_seat_has_device(seat, device)) { + return; + } + + switch (device->wlr_device->type) { case WLR_INPUT_DEVICE_POINTER: seat_remove_pointer(seat, device); break; @@ -147,6 +118,13 @@ void sway_seat_remove_device(struct sway_seat *seat, sway_log(L_DEBUG, "TODO: remove other devices"); break; } + + for (int i = 0; i < seat->devices->length; ++i) { + if (seat->devices->items[i] == device) { + list_del(seat->devices, i); + break; + } + } } void sway_seat_configure_xcursor(struct sway_seat *seat) { @@ -211,7 +189,7 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { seat->focus = container; if (last_focus && - !sway_input_manager_swayc_has_focus(seat->input, last_focus)) { + !sway_input_manager_has_focus(seat->input, last_focus)) { struct sway_view *view = last_focus->sway_view; view->iface.set_activated(view, false); -- cgit v1.2.3 From c173d30b9203520c274f34eb72fc787aa33ca211 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 12 Dec 2017 10:55:20 -0500 Subject: seat configuration --- sway/input/input-manager.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index b7f5615c..b07a733e 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -104,7 +104,9 @@ static void input_add_notify(struct wl_listener *listener, void *data) { } } - struct sway_seat *seat = input_manager_get_seat(input, default_seat); + const char *seat_name = + (sway_device->config ? sway_device->config->seat : default_seat); + struct sway_seat *seat = input_manager_get_seat(input, seat_name); sway_seat_add_device(seat, sway_device); } @@ -176,9 +178,9 @@ void sway_input_manager_set_focus(struct sway_input_manager *input, } void sway_input_manager_apply_config(struct sway_input_manager *input, - struct input_config *config) { + struct input_config *input_config) { struct sway_input_device *sway_device = - input_sway_device_from_config(input, config); + input_sway_device_from_config(input, input_config); if (!sway_device) { return; } @@ -188,7 +190,8 @@ void sway_input_manager_apply_config(struct sway_input_manager *input, sway_seat_remove_device(seat, sway_device); } - seat = input_manager_get_seat(input, default_seat); + const char *seat_name = (input_config->seat ? input_config->seat : default_seat); + seat = input_manager_get_seat(input, seat_name); sway_seat_add_device(seat, sway_device); } -- cgit v1.2.3 From 92fef27eaa0b52c9d37bdabff14ae21cd6660f46 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 14 Dec 2017 11:11:56 -0500 Subject: basic configuration --- sway/input/cursor.c | 8 +-- sway/input/input-manager.c | 139 +++++++++++++++++++++++++++----------- sway/input/keyboard.c | 51 +++++++++----- sway/input/seat.c | 163 +++++++++++++++++++++++++++++---------------- 4 files changed, 244 insertions(+), 117 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 217c2ddb..3aa2d1bc 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -24,7 +24,7 @@ static void cursor_update_position(struct sway_cursor *cursor) { static void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time) { - struct wlr_seat *seat = cursor->seat->seat; + struct wlr_seat *seat = cursor->seat->wlr_seat; struct wlr_surface *surface = NULL; double sx, sy; swayc_t *swayc = @@ -72,7 +72,7 @@ static void handle_cursor_button(struct wl_listener *listener, void *data) { sway_seat_set_focus(cursor->seat, swayc); } - wlr_seat_pointer_notify_button(cursor->seat->seat, event->time_msec, + wlr_seat_pointer_notify_button(cursor->seat->wlr_seat, event->time_msec, event->button, event->state); } @@ -80,7 +80,7 @@ static void handle_cursor_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, axis); struct wlr_event_pointer_axis *event = data; - wlr_seat_pointer_notify_axis(cursor->seat->seat, event->time_msec, + wlr_seat_pointer_notify_axis(cursor->seat->wlr_seat, event->time_msec, event->orientation, event->delta); } @@ -173,7 +173,7 @@ struct sway_cursor *sway_cursor_create(struct sway_seat *seat) { wl_signal_add(&wlr_cursor->events.tablet_tool_tip, &cursor->tool_tip); cursor->tool_tip.notify = handle_tool_tip; - wl_signal_add(&seat->seat->events.request_set_cursor, + wl_signal_add(&seat->wlr_seat->events.request_set_cursor, &cursor->request_set_cursor); cursor->request_set_cursor.notify = handle_request_set_cursor; diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index b07a733e..1950b6d9 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -18,12 +18,13 @@ static const char *default_seat = "seat0"; struct sway_input_manager *input_manager; struct input_config *current_input_config = NULL; +struct seat_config *current_seat_config = NULL; static struct sway_seat *input_manager_get_seat( struct sway_input_manager *input, const char *seat_name) { struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { - if (strcmp(seat->seat->name, seat_name) == 0) { + if (strcmp(seat->wlr_seat->name, seat_name) == 0) { return seat; } } @@ -58,56 +59,88 @@ static char *get_device_identifier(struct wlr_input_device *device) { return identifier; } -static struct sway_input_device *input_sway_device_from_wlr(struct sway_input_manager *input, - struct wlr_input_device *device) { - struct sway_input_device *sway_device = NULL; - wl_list_for_each(sway_device, &input->devices, link) { - if (sway_device->wlr_device == device) { - return sway_device; +static struct sway_input_device *input_sway_device_from_wlr( + struct sway_input_manager *input, struct wlr_input_device *device) { + struct sway_input_device *input_device = NULL; + wl_list_for_each(input_device, &input->devices, link) { + if (input_device->wlr_device == device) { + return input_device; } } return NULL; } -static struct sway_input_device *input_sway_device_from_config(struct sway_input_manager *input, - struct input_config *config) { - struct sway_input_device *sway_device = NULL; - wl_list_for_each(sway_device, &input->devices, link) { - if (strcmp(sway_device->identifier, config->identifier) == 0) { - return sway_device; +static struct sway_input_device *input_sway_device_from_config( + struct sway_input_manager *input, struct input_config *config) { + struct sway_input_device *input_device = NULL; + wl_list_for_each(input_device, &input->devices, link) { + if (strcmp(input_device->identifier, config->identifier) == 0) { + return input_device; } } return NULL; } +static struct sway_input_device *input_sway_device_from_identifier( + struct sway_input_manager *input, char *identifier) { + struct sway_input_device *input_device = NULL; + wl_list_for_each(input_device, &input->devices, link) { + if (strcmp(input_device->identifier, identifier) == 0) { + return input_device; + } + } + return NULL; +} + +static bool input_has_seat_configuration(struct sway_input_manager *input) { + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + if (seat->config) { + return true; + } + } + + return false; +} + static void input_add_notify(struct wl_listener *listener, void *data) { struct sway_input_manager *input = wl_container_of(listener, input, input_add); struct wlr_input_device *device = data; - struct sway_input_device *sway_device = + struct sway_input_device *input_device = calloc(1, sizeof(struct sway_input_device)); - if (!sway_assert(sway_device, "could not allocate input device")) { + if (!sway_assert(input_device, "could not allocate input device")) { return; } - sway_device->wlr_device = device; - sway_device->identifier = get_device_identifier(device); - wl_list_insert(&input->devices, &sway_device->link); + input_device->wlr_device = device; + input_device->identifier = get_device_identifier(device); + wl_list_insert(&input->devices, &input_device->link); // find config for (int i = 0; i < config->input_configs->length; ++i) { struct input_config *input_config = config->input_configs->items[i]; - if (strcmp(input_config->identifier, sway_device->identifier) == 0) { - sway_device->config = input_config; + if (strcmp(input_config->identifier, input_device->identifier) == 0) { + input_device->config = input_config; break; } } - const char *seat_name = - (sway_device->config ? sway_device->config->seat : default_seat); - struct sway_seat *seat = input_manager_get_seat(input, seat_name); - sway_seat_add_device(seat, sway_device); + struct sway_seat *seat = NULL; + if (!input_has_seat_configuration(input)) { + seat = input_manager_get_seat(input, default_seat); + sway_seat_add_device(seat, input_device); + return; + } + + wl_list_for_each(seat, &input->seats, link) { + if (seat->config && + (seat_config_get_attachment(seat->config, input_device->identifier) || + seat_config_get_attachment(seat->config, "*"))) { + sway_seat_add_device(seat, input_device); + } + } } static void input_remove_notify(struct wl_listener *listener, void *data) { @@ -115,21 +148,21 @@ static void input_remove_notify(struct wl_listener *listener, void *data) { wl_container_of(listener, input, input_remove); struct wlr_input_device *device = data; - struct sway_input_device *sway_device = + struct sway_input_device *input_device = input_sway_device_from_wlr(input, device); - if (!sway_assert(sway_device, "could not find sway device")) { + if (!sway_assert(input_device, "could not find sway device")) { return; } struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { - sway_seat_remove_device(seat, sway_device); + sway_seat_remove_device(seat, input_device); } - wl_list_remove(&sway_device->link); - free(sway_device->identifier); - free(sway_device); + wl_list_remove(&input_device->link); + free(input_device->identifier); + free(input_device); } struct sway_input_manager *sway_input_manager_create( @@ -139,7 +172,6 @@ struct sway_input_manager *sway_input_manager_create( if (!input) { return NULL; } - // XXX probably don't need the full server input->server = server; wl_list_init(&input->devices); @@ -177,22 +209,53 @@ void sway_input_manager_set_focus(struct sway_input_manager *input, } } -void sway_input_manager_apply_config(struct sway_input_manager *input, +void sway_input_manager_apply_input_config(struct sway_input_manager *input, struct input_config *input_config) { - struct sway_input_device *sway_device = + struct sway_input_device *input_device = input_sway_device_from_config(input, input_config); - if (!sway_device) { + if (!input_device) { return; } + input_device->config = input_config; struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { - sway_seat_remove_device(seat, sway_device); + sway_seat_configure_device(seat, input_device); + } +} + +void sway_input_manager_apply_seat_config(struct sway_input_manager *input, + struct seat_config *seat_config) { + struct sway_seat *seat = input_manager_get_seat(input, seat_config->name); + // the old config is invalid so clear it + sway_seat_set_config(seat, NULL); + + // clear devices + struct sway_input_device *input_device = NULL; + wl_list_for_each(input_device, &input->devices, link) { + sway_seat_remove_device(seat, input_device); + } + + if (seat_config_get_attachment(seat_config, "*")) { + wl_list_for_each(input_device, &input->devices, link) { + sway_seat_add_device(seat, input_device); + } + } else { + for (int i = 0; i < seat_config->attachments->length; ++i) { + struct seat_attachment_config *attachment = + seat_config->attachments->items[i]; + + struct sway_input_device *device = + input_sway_device_from_identifier(input, + attachment->identifier); + + if (device) { + sway_seat_add_device(seat, device); + } + } } - const char *seat_name = (input_config->seat ? input_config->seat : default_seat); - seat = input_manager_get_seat(input, seat_name); - sway_seat_add_device(seat, sway_device); + sway_seat_set_config(seat, seat_config); } void sway_input_manager_configure_xcursor(struct sway_input_manager *input) { diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 6a792c65..53db3270 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -5,32 +5,46 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { struct sway_keyboard *keyboard = wl_container_of(listener, keyboard, keyboard_key); + struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; + struct wlr_input_device *wlr_device = + keyboard->seat_device->input_device->wlr_device; struct wlr_event_keyboard_key *event = data; - wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); - wlr_seat_keyboard_notify_key(keyboard->seat->seat, event->time_msec, - event->keycode, event->state); + wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); + wlr_seat_set_keyboard(wlr_seat, wlr_device); + wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,event->keycode, + event->state); } static void handle_keyboard_modifiers(struct wl_listener *listener, void *data) { struct sway_keyboard *keyboard = wl_container_of(listener, keyboard, keyboard_modifiers); - wlr_seat_set_keyboard(keyboard->seat->seat, keyboard->device->wlr_device); - wlr_seat_keyboard_notify_modifiers(keyboard->seat->seat); + struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; + struct wlr_input_device *wlr_device = + keyboard->seat_device->input_device->wlr_device; + wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); + wlr_seat_set_keyboard(wlr_seat, wlr_device); + wlr_seat_keyboard_notify_modifiers(wlr_seat); } struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, - struct sway_input_device *device) { + struct sway_seat_device *device) { struct sway_keyboard *keyboard = calloc(1, sizeof(struct sway_keyboard)); if (!sway_assert(keyboard, "could not allocate sway keyboard")) { return NULL; } - keyboard->device = device; - keyboard->seat = seat; + keyboard->seat_device = device; + device->keyboard = keyboard; - // TODO keyboard config + wl_list_init(&keyboard->keyboard_key.link); + wl_list_init(&keyboard->keyboard_modifiers.link); + + return keyboard; +} + +void sway_keyboard_configure(struct sway_keyboard *keyboard) { struct xkb_rule_names rules; memset(&rules, 0, sizeof(rules)); rules.rules = getenv("XKB_DEFAULT_RULES"); @@ -38,27 +52,32 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, rules.layout = getenv("XKB_DEFAULT_LAYOUT"); rules.variant = getenv("XKB_DEFAULT_VARIANT"); rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!sway_assert(context, "cannot create XKB context")) { - return NULL; + return; } - wlr_keyboard_set_keymap(device->wlr_device->keyboard, - xkb_map_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS)); + keyboard->keymap = + xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap); xkb_context_unref(context); - wl_signal_add(&device->wlr_device->keyboard->events.key, + wl_list_remove(&keyboard->keyboard_key.link); + wl_signal_add( + &keyboard->seat_device->input_device->wlr_device->keyboard->events.key, &keyboard->keyboard_key); keyboard->keyboard_key.notify = handle_keyboard_key; - wl_signal_add(&device->wlr_device->keyboard->events.modifiers, + wl_list_remove(&keyboard->keyboard_modifiers.link); + wl_signal_add( + &keyboard->seat_device->input_device->wlr_device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; - - return keyboard; } void sway_keyboard_destroy(struct sway_keyboard *keyboard) { + xkb_keymap_unref(keyboard->keymap); wl_list_remove(&keyboard->keyboard_key.link); wl_list_remove(&keyboard->keyboard_modifiers.link); wl_list_remove(&keyboard->link); diff --git a/sway/input/seat.c b/sway/input/seat.c index 80c6424f..1b25419b 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -9,6 +9,18 @@ #include "sway/view.h" #include "log.h" +static void seat_device_destroy(struct sway_seat_device *seat_device) { + if (!seat_device) { + return; + } + + sway_keyboard_destroy(seat_device->keyboard); + wlr_cursor_detach_input_device(seat_device->sway_seat->cursor->cursor, + seat_device->input_device->wlr_device); + wl_list_remove(&seat_device->link); + free(seat_device); +} + struct sway_seat *sway_seat_create(struct sway_input_manager *input, const char *seat_name) { struct sway_seat *seat = calloc(1, sizeof(struct sway_seat)); @@ -16,22 +28,22 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, return NULL; } - seat->seat = wlr_seat_create(input->server->wl_display, seat_name); - if (!sway_assert(seat->seat, "could not allocate seat")) { + seat->wlr_seat = wlr_seat_create(input->server->wl_display, seat_name); + if (!sway_assert(seat->wlr_seat, "could not allocate seat")) { return NULL; } seat->cursor = sway_cursor_create(seat); if (!seat->cursor) { - wlr_seat_destroy(seat->seat); + wlr_seat_destroy(seat->wlr_seat); free(seat); return NULL; } seat->input = input; - seat->devices = create_list(); + wl_list_init(&seat->devices); - wlr_seat_set_capabilities(seat->seat, + wlr_seat_set_capabilities(seat->wlr_seat, WL_SEAT_CAPABILITY_KEYBOARD | WL_SEAT_CAPABILITY_POINTER | WL_SEAT_CAPABILITY_TOUCH); @@ -43,88 +55,94 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, return seat; } -static void seat_add_pointer(struct sway_seat *seat, - struct sway_input_device *sway_device) { +static void seat_configure_pointer(struct sway_seat *seat, + struct sway_seat_device *sway_device) { // TODO pointer configuration wlr_cursor_attach_input_device(seat->cursor->cursor, - sway_device->wlr_device); + sway_device->input_device->wlr_device); } -static void seat_add_keyboard(struct sway_seat *seat, - struct sway_input_device *device) { - // TODO keyboard configuration - sway_keyboard_create(seat, device); - wlr_seat_set_keyboard(seat->seat, device->wlr_device); +static void seat_configure_keyboard(struct sway_seat *seat, + struct sway_seat_device *seat_device) { + if (!seat_device->keyboard) { + sway_keyboard_create(seat, seat_device); + } + sway_keyboard_configure(seat_device->keyboard); } -bool sway_seat_has_device(struct sway_seat *seat, - struct sway_input_device *device) { - return false; +static struct sway_seat_device *sway_seat_get_device(struct sway_seat *seat, + struct sway_input_device *input_device) { + struct sway_seat_device *seat_device = NULL; + wl_list_for_each(seat_device, &seat->devices, link) { + if (seat_device->input_device == input_device) { + return seat_device; + } + } + + return NULL; } -void sway_seat_add_device(struct sway_seat *seat, - struct sway_input_device *device) { - if (sway_seat_has_device(seat, device)) { +void sway_seat_configure_device(struct sway_seat *seat, + struct sway_input_device *input_device) { + struct sway_seat_device *seat_device = + sway_seat_get_device(seat, input_device); + if (!seat_device) { return; } - sway_log(L_DEBUG, "input add: %s", device->identifier); - switch (device->wlr_device->type) { + if (seat->config) { + seat_device->attachment_config = + seat_config_get_attachment(seat->config, input_device->identifier); + } + + switch (input_device->wlr_device->type) { case WLR_INPUT_DEVICE_POINTER: - seat_add_pointer(seat, device); + seat_configure_pointer(seat, seat_device); break; case WLR_INPUT_DEVICE_KEYBOARD: - seat_add_keyboard(seat, device); + seat_configure_keyboard(seat, seat_device); + wlr_seat_set_keyboard(seat->wlr_seat, + seat_device->input_device->wlr_device); break; case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TABLET_PAD: case WLR_INPUT_DEVICE_TABLET_TOOL: - sway_log(L_DEBUG, "TODO: add other devices"); + sway_log(L_DEBUG, "TODO: configure other devices"); break; } - - list_add(seat->devices, device); } -static void seat_remove_keyboard(struct sway_seat *seat, - struct sway_input_device *device) { - if (device && device->keyboard) { - sway_keyboard_destroy(device->keyboard); +void sway_seat_add_device(struct sway_seat *seat, + struct sway_input_device *input_device) { + if (sway_seat_get_device(seat, input_device)) { + return; } -} -static void seat_remove_pointer(struct sway_seat *seat, - struct sway_input_device *device) { - wlr_cursor_detach_input_device(seat->cursor->cursor, device->wlr_device); + struct sway_seat_device *seat_device = + calloc(1, sizeof(struct sway_seat_device)); + if (!seat_device) { + sway_log(L_DEBUG, "could not allocate seat device"); + return; + } + + seat_device->sway_seat = seat; + seat_device->input_device = input_device; + wl_list_insert(&seat->devices, &seat_device->link); + + sway_seat_configure_device(seat, input_device); } void sway_seat_remove_device(struct sway_seat *seat, - struct sway_input_device *device) { - sway_log(L_DEBUG, "input remove: %s", device->identifier); - if (!sway_seat_has_device(seat, device)) { - return; - } + struct sway_input_device *input_device) { + sway_log(L_DEBUG, "input remove: %s", input_device->identifier); + struct sway_seat_device *seat_device = + sway_seat_get_device(seat, input_device); - switch (device->wlr_device->type) { - case WLR_INPUT_DEVICE_POINTER: - seat_remove_pointer(seat, device); - break; - case WLR_INPUT_DEVICE_KEYBOARD: - seat_remove_keyboard(seat, device); - break; - case WLR_INPUT_DEVICE_TOUCH: - case WLR_INPUT_DEVICE_TABLET_PAD: - case WLR_INPUT_DEVICE_TABLET_TOOL: - sway_log(L_DEBUG, "TODO: remove other devices"); - break; + if (!seat_device) { + return; } - for (int i = 0; i < seat->devices->length; ++i) { - if (seat->devices->items[i] == device) { - list_del(seat->devices, i); - break; - } - } + seat_device_destroy(seat_device); } void sway_seat_configure_xcursor(struct sway_seat *seat) { @@ -135,7 +153,8 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { seat->cursor->xcursor_manager = wlr_xcursor_manager_create("default", 24); if (sway_assert(seat->cursor->xcursor_manager, - "Cannot create XCursor manager for theme %s", cursor_theme)) { + "Cannot create XCursor manager for theme %s", + cursor_theme)) { return; } } @@ -183,7 +202,7 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { view->iface.set_activated(view, true); wl_signal_add(&container->events.destroy, &seat->focus_destroy); seat->focus_destroy.notify = handle_focus_destroy; - wlr_seat_keyboard_notify_enter(seat->seat, view->surface); + wlr_seat_keyboard_notify_enter(seat->wlr_seat, view->surface); } seat->focus = container; @@ -195,3 +214,29 @@ void sway_seat_set_focus(struct sway_seat *seat, swayc_t *container) { } } + +void sway_seat_set_config(struct sway_seat *seat, + struct seat_config *seat_config) { + // clear configs + seat->config = NULL; + + struct sway_seat_device *seat_device = NULL; + wl_list_for_each(seat_device, &seat->devices, link) { + seat_device->attachment_config = NULL; + } + + if (!seat_config) { + return; + } + + // add configs + seat->config = seat_config; + + wl_list_for_each(seat_device, &seat->devices, link) { + seat_device->attachment_config = + seat_config_get_attachment(seat_config, + seat_device->input_device->identifier); + sway_seat_configure_device(seat, seat_device->input_device); + } + +} -- cgit v1.2.3 From 9eecbb5d8a988a0dded57ead1982dd0121071454 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Fri, 15 Dec 2017 05:22:51 -0500 Subject: xkb config --- sway/input/keyboard.c | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 53db3270..2ab0206a 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -1,5 +1,6 @@ #include "sway/input/seat.h" #include "sway/input/keyboard.h" +#include "sway/input/input-manager.h" #include "log.h" static void handle_keyboard_key(struct wl_listener *listener, void *data) { @@ -47,17 +48,44 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, void sway_keyboard_configure(struct sway_keyboard *keyboard) { struct xkb_rule_names rules; memset(&rules, 0, sizeof(rules)); - rules.rules = getenv("XKB_DEFAULT_RULES"); - rules.model = getenv("XKB_DEFAULT_MODEL"); - rules.layout = getenv("XKB_DEFAULT_LAYOUT"); - rules.variant = getenv("XKB_DEFAULT_VARIANT"); - rules.options = getenv("XKB_DEFAULT_OPTIONS"); + struct input_config *input_config = + keyboard->seat_device->input_device->config; + + if (input_config && input_config->xkb_layout) { + rules.layout = input_config->xkb_layout; + } else { + rules.layout = getenv("XKB_DEFAULT_LAYOUT"); + } + if (input_config && input_config->xkb_model) { + rules.model = input_config->xkb_model; + } else { + rules.model = getenv("XKB_DEFAULT_MODEL"); + } + + if (input_config && input_config->xkb_options) { + rules.options = input_config->xkb_options; + } else { + rules.options = getenv("XKB_DEFAULT_OPTIONS"); + } + + if (input_config && input_config->xkb_rules) { + rules.rules = input_config->xkb_rules; + } else { + rules.rules = getenv("XKB_DEFAULT_RULES"); + } + + if (input_config && input_config->xkb_variant) { + rules.variant = input_config->xkb_variant; + } else { + rules.variant = getenv("XKB_DEFAULT_VARIANT"); + } struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); if (!sway_assert(context, "cannot create XKB context")) { return; } + xkb_keymap_unref(keyboard->keymap); keyboard->keymap = xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap); -- cgit v1.2.3 From 030fcb64da90242718b7276a4c98cd0b2a346aad Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Fri, 15 Dec 2017 05:57:28 -0500 Subject: keyboard cleanup --- sway/input/keyboard.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 2ab0206a..b9b571a6 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -10,10 +10,9 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { struct wlr_input_device *wlr_device = keyboard->seat_device->input_device->wlr_device; struct wlr_event_keyboard_key *event = data; - wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); wlr_seat_set_keyboard(wlr_seat, wlr_device); - wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,event->keycode, - event->state); + wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec, + event->keycode, event->state); } static void handle_keyboard_modifiers(struct wl_listener *listener, @@ -23,7 +22,6 @@ static void handle_keyboard_modifiers(struct wl_listener *listener, struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; struct wlr_input_device *wlr_device = keyboard->seat_device->input_device->wlr_device; - wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); wlr_seat_set_keyboard(wlr_seat, wlr_device); wlr_seat_keyboard_notify_modifiers(wlr_seat); } @@ -50,6 +48,8 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { memset(&rules, 0, sizeof(rules)); struct input_config *input_config = keyboard->seat_device->input_device->config; + struct wlr_input_device *wlr_device = + keyboard->seat_device->input_device->wlr_device; if (input_config && input_config->xkb_layout) { rules.layout = input_config->xkb_layout; @@ -88,18 +88,16 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { xkb_keymap_unref(keyboard->keymap); keyboard->keymap = xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); - wlr_keyboard_set_keymap(keyboard->seat_device->input_device->wlr_device->keyboard, keyboard->keymap); + wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); + wlr_keyboard_set_repeat_info(wlr_device->keyboard, 25, 600); xkb_context_unref(context); wl_list_remove(&keyboard->keyboard_key.link); - wl_signal_add( - &keyboard->seat_device->input_device->wlr_device->keyboard->events.key, - &keyboard->keyboard_key); + wl_signal_add(&wlr_device->keyboard->events.key, &keyboard->keyboard_key); keyboard->keyboard_key.notify = handle_keyboard_key; wl_list_remove(&keyboard->keyboard_modifiers.link); - wl_signal_add( - &keyboard->seat_device->input_device->wlr_device->keyboard->events.modifiers, + wl_signal_add( &wlr_device->keyboard->events.modifiers, &keyboard->keyboard_modifiers); keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; } -- cgit v1.2.3 From b3a0309f2612523450b2b960c81d1c4895880454 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 16 Dec 2017 07:39:22 -0500 Subject: fix logging issue for new wlroots --- sway/input/seat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/input') diff --git a/sway/input/seat.c b/sway/input/seat.c index 1b25419b..907c610a 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -168,7 +168,7 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { output->scale); sway_assert(!result, - "Cannot load xcursor theme for output '%s' with scale %d", + "Cannot load xcursor theme for output '%s' with scale %f", output->name, output->scale); } -- cgit v1.2.3 From 24e240642984a3b7ee2fba0828eb4375e901aafc Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 16 Dec 2017 13:00:31 -0500 Subject: strip whitespace for device id --- sway/input/input-manager.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 1950b6d9..e4558366 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -9,6 +9,7 @@ #include "sway/input/input-manager.h" #include "sway/input/seat.h" #include "sway/server.h" +#include "stringop.h" #include "list.h" #include "log.h" @@ -36,6 +37,7 @@ static char *get_device_identifier(struct wlr_input_device *device) { int vendor = device->vendor; int product = device->product; char *name = strdup(device->name); + name = strip_whitespace(name); char *p = name; for (; *p; ++p) { -- cgit v1.2.3 From b0ed1ad28d8c87a9ca0e5eacb1e7b840ed924117 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 16 Dec 2017 13:16:58 -0500 Subject: device add/remove logging --- sway/input/input-manager.c | 6 ++++++ sway/input/seat.c | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index e4558366..34766ee6 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -120,6 +120,9 @@ static void input_add_notify(struct wl_listener *listener, void *data) { input_device->identifier = get_device_identifier(device); wl_list_insert(&input->devices, &input_device->link); + sway_log(L_DEBUG, "adding device: '%s'", + input_device->identifier); + // find config for (int i = 0; i < config->input_configs->length; ++i) { struct input_config *input_config = config->input_configs->items[i]; @@ -157,6 +160,9 @@ static void input_remove_notify(struct wl_listener *listener, void *data) { return; } + sway_log(L_DEBUG, "removing device: '%s'", + input_device->identifier); + struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { sway_seat_remove_device(seat, input_device); diff --git a/sway/input/seat.c b/sway/input/seat.c index 907c610a..1e62efa1 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -125,6 +125,9 @@ void sway_seat_add_device(struct sway_seat *seat, return; } + sway_log(L_DEBUG, "adding device %s to seat %s", + input_device->identifier, seat->wlr_seat->name); + seat_device->sway_seat = seat; seat_device->input_device = input_device; wl_list_insert(&seat->devices, &seat_device->link); @@ -134,7 +137,6 @@ void sway_seat_add_device(struct sway_seat *seat, void sway_seat_remove_device(struct sway_seat *seat, struct sway_input_device *input_device) { - sway_log(L_DEBUG, "input remove: %s", input_device->identifier); struct sway_seat_device *seat_device = sway_seat_get_device(seat, input_device); @@ -142,6 +144,9 @@ void sway_seat_remove_device(struct sway_seat *seat, return; } + sway_log(L_DEBUG, "removing device %s from seat %s", + input_device->identifier, seat->wlr_seat->name); + seat_device_destroy(seat_device); } -- cgit v1.2.3 From 9e4fc7253e5e82f443ae8e1a27ced12fb13f8a67 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 16 Dec 2017 14:00:23 -0500 Subject: get device id correctly --- sway/input/input-manager.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 34766ee6..6a49b13b 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "sway/config.h" #include "sway/input/input-manager.h" #include "sway/input/seat.h" @@ -33,6 +34,13 @@ static struct sway_seat *input_manager_get_seat( return sway_seat_create(input, seat_name); } +static inline int strlen_num(int num) { + if (num == 0) { + return 2; + } + return (int)((ceil(log10(abs(num)))+2)); +} + static char *get_device_identifier(struct wlr_input_device *device) { int vendor = device->vendor; int product = device->product; @@ -46,9 +54,12 @@ static char *get_device_identifier(struct wlr_input_device *device) { } } - sway_log(L_DEBUG, "rewritten name %s", name); + int len = + (strlen(name) + + strlen_num(device->vendor) + + strlen_num(device->product) + + 3) * sizeof(char); - int len = strlen(name) + sizeof(char) * 6; char *identifier = malloc(len); if (!identifier) { sway_log(L_ERROR, "Unable to allocate unique input device name"); -- cgit v1.2.3 From 0256cd1473a574c2eb087f420f8356fee9e08aa7 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sat, 16 Dec 2017 19:16:00 -0500 Subject: fix keyboard hotplugging --- sway/input/keyboard.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index b9b571a6..ce0df3c5 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -103,9 +103,10 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { } void sway_keyboard_destroy(struct sway_keyboard *keyboard) { - xkb_keymap_unref(keyboard->keymap); + if (!keyboard) { + return; + } wl_list_remove(&keyboard->keyboard_key.link); wl_list_remove(&keyboard->keyboard_modifiers.link); - wl_list_remove(&keyboard->link); free(keyboard); } -- cgit v1.2.3 From e27eff8a29abd74448322ae78baa99a489e43620 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 17 Dec 2017 08:30:20 -0500 Subject: send keyboard enter on keyboard configuration --- sway/input/input-manager.c | 2 ++ sway/input/seat.c | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 6a49b13b..fa8e4b49 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -145,6 +145,7 @@ static void input_add_notify(struct wl_listener *listener, void *data) { struct sway_seat *seat = NULL; if (!input_has_seat_configuration(input)) { + sway_log(L_DEBUG, "no seat configuration, using default seat"); seat = input_manager_get_seat(input, default_seat); sway_seat_add_device(seat, input_device); return; @@ -245,6 +246,7 @@ void sway_input_manager_apply_input_config(struct sway_input_manager *input, void sway_input_manager_apply_seat_config(struct sway_input_manager *input, struct seat_config *seat_config) { + sway_log(L_DEBUG, "applying new seat config for seat %s", seat_config->name); struct sway_seat *seat = input_manager_get_seat(input, seat_config->name); // the old config is invalid so clear it sway_seat_set_config(seat, NULL); diff --git a/sway/input/seat.c b/sway/input/seat.c index 1e62efa1..8fe82b46 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -68,6 +68,13 @@ static void seat_configure_keyboard(struct sway_seat *seat, sway_keyboard_create(seat, seat_device); } sway_keyboard_configure(seat_device->keyboard); + wlr_seat_set_keyboard(seat->wlr_seat, + seat_device->input_device->wlr_device); + if (seat->focus) { + // force notify reenter to pick up the new configuration + wlr_seat_keyboard_clear_focus(seat->wlr_seat); + wlr_seat_keyboard_notify_enter(seat->wlr_seat, seat->focus->sway_view->surface); + } } static struct sway_seat_device *sway_seat_get_device(struct sway_seat *seat, @@ -101,8 +108,6 @@ void sway_seat_configure_device(struct sway_seat *seat, break; case WLR_INPUT_DEVICE_KEYBOARD: seat_configure_keyboard(seat, seat_device); - wlr_seat_set_keyboard(seat->wlr_seat, - seat_device->input_device->wlr_device); break; case WLR_INPUT_DEVICE_TOUCH: case WLR_INPUT_DEVICE_TABLET_PAD: -- cgit v1.2.3 From 88bcd43ebf59cfa03a9e9a158c6f7a258c1f7db2 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 17 Dec 2017 10:39:22 -0500 Subject: seat fallback config --- sway/input/input-manager.c | 83 ++++++++++++++++++++++++++++++++-------------- sway/input/seat.c | 3 +- 2 files changed, 60 insertions(+), 26 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index fa8e4b49..16301489 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -56,9 +56,9 @@ static char *get_device_identifier(struct wlr_input_device *device) { int len = (strlen(name) + - strlen_num(device->vendor) + - strlen_num(device->product) + - 3) * sizeof(char); + strlen_num(device->vendor) + + strlen_num(device->product) + + 3) * sizeof(char); char *identifier = malloc(len); if (!identifier) { @@ -151,13 +151,30 @@ static void input_add_notify(struct wl_listener *listener, void *data) { return; } + bool added = false; wl_list_for_each(seat, &input->seats, link) { if (seat->config && (seat_config_get_attachment(seat->config, input_device->identifier) || seat_config_get_attachment(seat->config, "*"))) { sway_seat_add_device(seat, input_device); + added = true; } } + + if (!added) { + wl_list_for_each(seat, &input->seats, link) { + if (seat->config && seat->config->fallback == 1) { + sway_seat_add_device(seat, input_device); + added = true; + } + } + } + + if (!added) { + sway_log(L_DEBUG, + "device '%s' is not configured on any seats", + input_device->identifier); + } } static void input_remove_notify(struct wl_listener *listener, void *data) { @@ -248,35 +265,53 @@ void sway_input_manager_apply_seat_config(struct sway_input_manager *input, struct seat_config *seat_config) { sway_log(L_DEBUG, "applying new seat config for seat %s", seat_config->name); struct sway_seat *seat = input_manager_get_seat(input, seat_config->name); - // the old config is invalid so clear it - sway_seat_set_config(seat, NULL); + if (!seat) { + return; + } + + sway_seat_set_config(seat, seat_config); - // clear devices + // for every device, try to add it to a seat and if no seat has it + // attached, add it to the fallback seats. struct sway_input_device *input_device = NULL; wl_list_for_each(input_device, &input->devices, link) { - sway_seat_remove_device(seat, input_device); - } - - if (seat_config_get_attachment(seat_config, "*")) { - wl_list_for_each(input_device, &input->devices, link) { - sway_seat_add_device(seat, input_device); + list_t *seat_list = create_list(); + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + if (!seat->config) { + continue; + } + if (seat_config_get_attachment(seat->config, "*") || + seat_config_get_attachment(seat->config, input_device->identifier)) { + list_add(seat_list, seat); + } } - } else { - for (int i = 0; i < seat_config->attachments->length; ++i) { - struct seat_attachment_config *attachment = - seat_config->attachments->items[i]; - - struct sway_input_device *device = - input_sway_device_from_identifier(input, - attachment->identifier); - if (device) { - sway_seat_add_device(seat, device); + if (seat_list->length) { + wl_list_for_each(seat, &input->seats, link) { + bool attached = false; + for (int i = 0; i < seat_list->length; ++i) { + if (seat == seat_list->items[i]) { + attached = true; + break; + } + } + if (attached) { + sway_seat_add_device(seat, input_device); + } else { + sway_seat_remove_device(seat, input_device); + } + } + } else { + wl_list_for_each(seat, &input->seats, link) { + if (seat->config && seat->config->fallback == 1) { + sway_seat_add_device(seat, input_device); + } else { + sway_seat_remove_device(seat, input_device); + } } } } - - sway_seat_set_config(seat, seat_config); } void sway_input_manager_configure_xcursor(struct sway_input_manager *input) { diff --git a/sway/input/seat.c b/sway/input/seat.c index 8fe82b46..94503687 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -120,6 +120,7 @@ void sway_seat_configure_device(struct sway_seat *seat, void sway_seat_add_device(struct sway_seat *seat, struct sway_input_device *input_device) { if (sway_seat_get_device(seat, input_device)) { + sway_seat_configure_device(seat, input_device); return; } @@ -246,7 +247,5 @@ void sway_seat_set_config(struct sway_seat *seat, seat_device->attachment_config = seat_config_get_attachment(seat_config, seat_device->input_device->identifier); - sway_seat_configure_device(seat, seat_device->input_device); } - } -- cgit v1.2.3 From a27736adcdfe01c5232adce58201463df34da5e7 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 17 Dec 2017 10:44:53 -0500 Subject: cleanup input-manager --- sway/input/input-manager.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 16301489..12a66917 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -94,17 +94,6 @@ static struct sway_input_device *input_sway_device_from_config( return NULL; } -static struct sway_input_device *input_sway_device_from_identifier( - struct sway_input_manager *input, char *identifier) { - struct sway_input_device *input_device = NULL; - wl_list_for_each(input_device, &input->devices, link) { - if (strcmp(input_device->identifier, identifier) == 0) { - return input_device; - } - } - return NULL; -} - static bool input_has_seat_configuration(struct sway_input_manager *input) { struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { @@ -154,7 +143,8 @@ static void input_add_notify(struct wl_listener *listener, void *data) { bool added = false; wl_list_for_each(seat, &input->seats, link) { if (seat->config && - (seat_config_get_attachment(seat->config, input_device->identifier) || + (seat_config_get_attachment(seat->config, + input_device->identifier) || seat_config_get_attachment(seat->config, "*"))) { sway_seat_add_device(seat, input_device); added = true; @@ -263,7 +253,8 @@ void sway_input_manager_apply_input_config(struct sway_input_manager *input, void sway_input_manager_apply_seat_config(struct sway_input_manager *input, struct seat_config *seat_config) { - sway_log(L_DEBUG, "applying new seat config for seat %s", seat_config->name); + sway_log(L_DEBUG, "applying new seat config for seat %s", + seat_config->name); struct sway_seat *seat = input_manager_get_seat(input, seat_config->name); if (!seat) { return; @@ -282,7 +273,8 @@ void sway_input_manager_apply_seat_config(struct sway_input_manager *input, continue; } if (seat_config_get_attachment(seat->config, "*") || - seat_config_get_attachment(seat->config, input_device->identifier)) { + seat_config_get_attachment(seat->config, + input_device->identifier)) { list_add(seat_list, seat); } } @@ -311,6 +303,7 @@ void sway_input_manager_apply_seat_config(struct sway_input_manager *input, } } } + list_free(seat_list); } } -- cgit v1.2.3 From b0291d126f1362cd5f9c00ff16043fd903f257a7 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Sun, 17 Dec 2017 21:00:17 -0500 Subject: Fix compile error --- sway/input/seat.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sway/input') diff --git a/sway/input/seat.c b/sway/input/seat.c index 94503687..df1427fa 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -180,7 +180,8 @@ void sway_seat_configure_xcursor(struct sway_seat *seat) { sway_assert(!result, "Cannot load xcursor theme for output '%s' with scale %f", - output->name, output->scale); + // TODO: Fractional scaling + output->name, (double)output->scale); } wlr_xcursor_manager_set_cursor_image(seat->cursor->xcursor_manager, -- cgit v1.2.3 From 4c436a1a6f78ce9eae40791b85c02d44458de727 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Mon, 18 Dec 2017 10:44:51 -0500 Subject: remove assumption of one device per identifier --- sway/input/input-manager.c | 29 +++++++++-------------------- sway/input/keyboard.c | 2 ++ 2 files changed, 11 insertions(+), 20 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 12a66917..52da8f5e 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -83,17 +83,6 @@ static struct sway_input_device *input_sway_device_from_wlr( return NULL; } -static struct sway_input_device *input_sway_device_from_config( - struct sway_input_manager *input, struct input_config *config) { - struct sway_input_device *input_device = NULL; - wl_list_for_each(input_device, &input->devices, link) { - if (strcmp(input_device->identifier, config->identifier) == 0) { - return input_device; - } - } - return NULL; -} - static bool input_has_seat_configuration(struct sway_input_manager *input) { struct sway_seat *seat = NULL; wl_list_for_each(seat, &input->seats, link) { @@ -238,16 +227,16 @@ void sway_input_manager_set_focus(struct sway_input_manager *input, void sway_input_manager_apply_input_config(struct sway_input_manager *input, struct input_config *input_config) { - struct sway_input_device *input_device = - input_sway_device_from_config(input, input_config); - if (!input_device) { - return; - } - input_device->config = input_config; + struct sway_input_device *input_device = NULL; + wl_list_for_each(input_device, &input->devices, link) { + if (strcmp(input_device->identifier, input_config->identifier) == 0) { + input_device->config = input_config; - struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { - sway_seat_configure_device(seat, input_device); + struct sway_seat *seat = NULL; + wl_list_for_each(seat, &input->seats, link) { + sway_seat_configure_device(seat, input_device); + } + } } } diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index ce0df3c5..bb18edd2 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -91,6 +91,8 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); wlr_keyboard_set_repeat_info(wlr_device->keyboard, 25, 600); xkb_context_unref(context); + struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; + wlr_seat_set_keyboard(seat, wlr_device); wl_list_remove(&keyboard->keyboard_key.link); wl_signal_add(&wlr_device->keyboard->events.key, &keyboard->keyboard_key); -- cgit v1.2.3 From 730af5e721f04cf12b613341e00b44a93f3397c6 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 19 Dec 2017 04:57:42 -0500 Subject: use snprintf to get identifier len --- sway/input/input-manager.c | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 52da8f5e..b20b7b7e 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -34,13 +34,6 @@ static struct sway_seat *input_manager_get_seat( return sway_seat_create(input, seat_name); } -static inline int strlen_num(int num) { - if (num == 0) { - return 2; - } - return (int)((ceil(log10(abs(num)))+2)); -} - static char *get_device_identifier(struct wlr_input_device *device) { int vendor = device->vendor; int product = device->product; @@ -54,19 +47,14 @@ static char *get_device_identifier(struct wlr_input_device *device) { } } - int len = - (strlen(name) + - strlen_num(device->vendor) + - strlen_num(device->product) + - 3) * sizeof(char); - + const char *fmt = "%d:%d:%s"; + int len = snprintf(NULL, 0, fmt, vendor, product, name) + 1; char *identifier = malloc(len); if (!identifier) { sway_log(L_ERROR, "Unable to allocate unique input device name"); return NULL; } - const char *fmt = "%d:%d:%s"; snprintf(identifier, len, fmt, vendor, product, name); free(name); return identifier; -- cgit v1.2.3 From 39e7871a859df5ce82f9d3d10088a3bc2b4ff356 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 19 Dec 2017 05:28:06 -0500 Subject: dont set cursor image on motion --- sway/input/cursor.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 24d4642d..3b5cfce5 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -15,9 +15,6 @@ static void cursor_update_position(struct sway_cursor *cursor) { double x = cursor->cursor->x; double y = cursor->cursor->y; - wlr_xcursor_manager_set_cursor_image(cursor->xcursor_manager, - "left_ptr", cursor->cursor); - cursor->x = x; cursor->y = y; } -- cgit v1.2.3 From f35575f71dfab5be9a935bc5e21ca5ee5dc4c2c2 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Tue, 19 Dec 2017 05:36:17 -0500 Subject: handle keymap not found --- sway/input/keyboard.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'sway/input') diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index bb18edd2..724941d8 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -85,10 +85,19 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { return; } - xkb_keymap_unref(keyboard->keymap); - keyboard->keymap = + struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); + + if (!keymap) { + sway_log(L_DEBUG, "cannot configure keyboard: keymap does not exist"); + xkb_context_unref(context); + return; + } + + xkb_keymap_unref(keyboard->keymap); + keyboard->keymap = keymap; wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); + wlr_keyboard_set_repeat_info(wlr_device->keyboard, 25, 600); xkb_context_unref(context); struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; -- cgit v1.2.3 From 63f7fb95172a72436698a1562b4f7ea1e9100a7e Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Wed, 20 Dec 2017 06:12:08 -0500 Subject: cleanup --- sway/input/input-manager.c | 9 +++++---- sway/input/seat.c | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) (limited to 'sway/input') diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index b20b7b7e..4459c43b 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -119,10 +119,11 @@ static void input_add_notify(struct wl_listener *listener, void *data) { bool added = false; wl_list_for_each(seat, &input->seats, link) { - if (seat->config && - (seat_config_get_attachment(seat->config, - input_device->identifier) || - seat_config_get_attachment(seat->config, "*"))) { + bool has_attachment = seat->config && + (seat_config_get_attachment(seat->config, input_device->identifier) || + seat_config_get_attachment(seat->config, "*")); + + if (has_attachment) { sway_seat_add_device(seat, input_device); added = true; } diff --git a/sway/input/seat.c b/sway/input/seat.c index df1427fa..fe90565a 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -30,6 +30,7 @@ struct sway_seat *sway_seat_create(struct sway_input_manager *input, seat->wlr_seat = wlr_seat_create(input->server->wl_display, seat_name); if (!sway_assert(seat->wlr_seat, "could not allocate seat")) { + free(seat); return NULL; } -- cgit v1.2.3