diff --git a/include/sway/input-manager.h b/include/sway/input-manager.h index a3662f7b..4c01a043 100644 --- a/include/sway/input-manager.h +++ b/include/sway/input-manager.h @@ -1,12 +1,15 @@ -#ifndef _SWAY_INPUT_H -#define _SWAY_INPUT_H +#ifndef _SWAY_INPUT_MANAGER_H +#define _SWAY_INPUT_MANAGER_H #include #include "sway/server.h" #include "config.h" #include "list.h" struct sway_input_manager { - list_t *input_devices; + struct wl_listener input_add; + struct wl_listener input_remove; + struct sway_server *server; + list_t *seats; }; struct input_config *new_input_config(const char* identifier); diff --git a/include/sway/seat.h b/include/sway/seat.h new file mode 100644 index 00000000..a2b8fe51 --- /dev/null +++ b/include/sway/seat.h @@ -0,0 +1,20 @@ +#ifndef _SWAY_SEAT_H +#define _SWAY_SEAT_H + +#include +#include "sway/input-manager.h" + +struct sway_seat { + struct wlr_seat *seat; +}; + +struct sway_seat *sway_seat_create(struct wl_display *display, + const char *seat_name); + +void sway_seat_add_device(struct sway_seat *seat, + struct wlr_input_device *device); + +void sway_seat_remove_device(struct sway_seat *seat, + struct wlr_input_device *device); + +#endif 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); +} diff --git a/sway/meson.build b/sway/meson.build index b5cdbbf2..cea565d6 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -3,6 +3,7 @@ sway_sources = files( 'server.c', 'commands.c', 'input/input-manager.c', + 'input/seat.c', 'commands/exit.c', 'commands/exec.c', 'commands/exec_always.c',