From 2f3c6cccf5d6b2d6ffd3cee62e7b624dc80dc6e6 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Wed, 11 Dec 2019 11:00:39 -0500 Subject: Add seat idle_{inhibit,wake} This adds seat configuration options which can be used to configure what events affect the idle behavior of sway. An example use-case is mobile devices: you would remove touch from the list of idle_wake events. This allows the phone to stay on while you're actively using it, but doesn't wake from idle on touch events while it's sleeping in your pocket. --- sway/input/cursor.c | 16 ++++++++-------- sway/input/keyboard.c | 2 +- sway/input/seat.c | 31 +++++++++++++++++++++++++++++++ sway/input/switch.c | 4 ++-- 4 files changed, 42 insertions(+), 11 deletions(-) (limited to 'sway/input') diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 83b5212d..680fe39e 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -206,7 +206,7 @@ void cursor_handle_activity(struct sway_cursor *cursor) { wl_event_source_timer_update( cursor->hide_source, cursor_get_timeout(cursor)); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_POINTER); if (cursor->hidden) { cursor_unhide(cursor); } @@ -341,7 +341,7 @@ static void handle_cursor_frame(struct wl_listener *listener, void *data) { static void handle_touch_down(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_down); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TOUCH); struct wlr_event_touch_down *event = data; struct sway_seat *seat = cursor->seat; @@ -372,7 +372,7 @@ static void handle_touch_down(struct wl_listener *listener, void *data) { static void handle_touch_up(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_up); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TOUCH); struct wlr_event_touch_up *event = data; struct wlr_seat *seat = cursor->seat->wlr_seat; // TODO: fall back to cursor simulation if client has not bound to touch @@ -382,7 +382,7 @@ static void handle_touch_up(struct wl_listener *listener, void *data) { static void handle_touch_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_motion); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TOUCH); struct wlr_event_touch_motion *event = data; struct sway_seat *seat = cursor->seat; @@ -492,7 +492,7 @@ static void handle_tablet_tool_position(struct sway_cursor *cursor, static void handle_tool_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_axis); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TABLET_TOOL); struct wlr_event_tablet_tool_axis *event = data; struct sway_tablet_tool *sway_tool = event->tool->data; @@ -548,7 +548,7 @@ static void handle_tool_axis(struct wl_listener *listener, void *data) { static void handle_tool_tip(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_tip); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TABLET_TOOL); struct wlr_event_tablet_tool_tip *event = data; struct sway_tablet_tool *sway_tool = event->tool->data; struct wlr_tablet_v2_tablet *tablet_v2 = sway_tool->tablet->tablet_v2; @@ -589,7 +589,7 @@ static struct sway_tablet *get_tablet_for_device(struct sway_cursor *cursor, static void handle_tool_proximity(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_proximity); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TABLET_TOOL); struct wlr_event_tablet_tool_proximity *event = data; struct wlr_tablet_tool *tool = event->tool; @@ -619,7 +619,7 @@ static void handle_tool_proximity(struct wl_listener *listener, void *data) { static void handle_tool_button(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_button); - wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); + seat_idle_notify_activity(cursor->seat, IDLE_SOURCE_TABLET_TOOL); struct wlr_event_tablet_tool_button *event = data; struct sway_tablet_tool *sway_tool = event->tool->data; struct wlr_tablet_v2_tablet *tablet_v2 = sway_tool->tablet->tablet_v2; diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index c4ce8246..1d55c165 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -326,7 +326,7 @@ static void handle_key_event(struct sway_keyboard *keyboard, keyboard->seat_device->input_device->wlr_device; char *device_identifier = input_device_get_identifier(wlr_device); bool exact_identifier = wlr_device->keyboard->group != NULL; - wlr_idle_notify_activity(server.idle, wlr_seat); + seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD); bool input_inhibited = seat->exclusive_client != NULL; // Identify new keycode, raw keysym(s), and translated keysym(s) diff --git a/sway/input/seat.c b/sway/input/seat.c index bc72ff0c..371de56e 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -71,6 +72,25 @@ static void seat_node_destroy(struct sway_seat_node *seat_node) { free(seat_node); } +void seat_idle_notify_activity(struct sway_seat *seat, + enum sway_input_idle_source source) { + uint32_t mask = seat->idle_inhibit_sources; + struct wlr_idle_timeout *timeout; + int ntimers = 0, nidle = 0; + wl_list_for_each(timeout, &server.idle->idle_timers, link) { + ++ntimers; + if (timeout->idle_state) { + ++nidle; + } + } + if (nidle == ntimers) { + mask = seat->idle_wake_sources; + } + if ((source & mask) > 0) { + wlr_idle_notify_activity(server.idle, seat->wlr_seat); + } +} + /** * Activate all views within this container recursively. */ @@ -491,6 +511,14 @@ struct sway_seat *seat_create(const char *seat_name) { return NULL; } + seat->idle_inhibit_sources = seat->idle_wake_sources = + IDLE_SOURCE_KEYBOARD | + IDLE_SOURCE_POINTER | + IDLE_SOURCE_TOUCH | + IDLE_SOURCE_TABLET_PAD | + IDLE_SOURCE_TABLET_TOOL | + IDLE_SOURCE_SWITCH; + // init the focus stack wl_list_init(&seat->focus_stack); @@ -1325,6 +1353,9 @@ void seat_apply_config(struct sway_seat *seat, return; } + seat->idle_inhibit_sources = seat_config->idle_inhibit_sources; + seat->idle_wake_sources = seat_config->idle_wake_sources; + wl_list_for_each(seat_device, &seat->devices, link) { seat_configure_device(seat, seat_device->input_device); } diff --git a/sway/input/switch.c b/sway/input/switch.c index 72d1245f..b7c28df1 100644 --- a/sway/input/switch.c +++ b/sway/input/switch.c @@ -70,8 +70,8 @@ static void handle_switch_toggle(struct wl_listener *listener, void *data) { struct sway_switch *sway_switch = wl_container_of(listener, sway_switch, switch_toggle); struct wlr_event_switch_toggle *event = data; - struct wlr_seat* wlr_seat = sway_switch->seat_device->sway_seat->wlr_seat; - wlr_idle_notify_activity(server.idle, wlr_seat); + struct sway_seat *seat = sway_switch->seat_device->sway_seat; + seat_idle_notify_activity(seat, IDLE_SOURCE_SWITCH); struct wlr_input_device *wlr_device = sway_switch->seat_device->input_device->wlr_device; -- cgit v1.2.3