diff --git a/include/labwc.h b/include/labwc.h index 2285b408..dfbf7393 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -76,6 +78,8 @@ struct seat { struct wlr_xcursor_manager *xcursor_manager; struct wlr_drag_icon *drag_icon; struct wlr_pointer_constraint_v1 *current_constraint; + struct wlr_idle *wlr_idle; + struct wlr_idle_inhibit_manager_v1 *wlr_idle_inhibit_manager; /* if set, views cannot receive focus */ struct wlr_layer_surface_v1 *focused_layer; @@ -101,6 +105,7 @@ struct seat { struct wl_listener start_drag; struct wl_listener destroy_drag; struct wl_listener constraint_commit; + struct wl_listener idle_inhibitor_create; }; struct server { @@ -329,6 +334,12 @@ struct constraint { struct wl_listener destroy; }; +struct idle_inhibitor { + struct seat *seat; + struct wlr_idle_inhibitor_v1 *wlr_inhibitor; + struct wl_listener destroy; +}; + void xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup); void xdg_toplevel_decoration(struct wl_listener *listener, void *data); diff --git a/src/cursor.c b/src/cursor.c index 13107c7a..ef650004 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -326,6 +326,7 @@ cursor_motion(struct wl_listener *listener, void *data) struct seat *seat = wl_container_of(listener, seat, cursor_motion); struct server *server = seat->server; struct wlr_event_pointer_motion *event = data; + wlr_idle_notify_activity(seat->wlr_idle, seat->seat); wlr_relative_pointer_manager_v1_send_relative_motion( server->relative_pointer_manager, @@ -372,6 +373,7 @@ cursor_motion_absolute(struct wl_listener *listener, void *data) struct seat *seat = wl_container_of( listener, seat, cursor_motion_absolute); struct wlr_event_pointer_motion_absolute *event = data; + wlr_idle_notify_activity(seat->wlr_idle, seat->seat); double lx, ly; wlr_cursor_absolute_to_layout_coords(seat->cursor, event->device, @@ -495,6 +497,7 @@ cursor_button(struct wl_listener *listener, void *data) struct seat *seat = wl_container_of(listener, seat, cursor_button); struct server *server = seat->server; struct wlr_event_pointer_button *event = data; + wlr_idle_notify_activity(seat->wlr_idle, seat->seat); double sx, sy; struct wlr_surface *surface; @@ -592,6 +595,7 @@ cursor_axis(struct wl_listener *listener, void *data) */ struct seat *seat = wl_container_of(listener, seat, cursor_axis); struct wlr_event_pointer_axis *event = data; + wlr_idle_notify_activity(seat->wlr_idle, seat->seat); /* Notify the client with pointer focus of the axis event. */ wlr_seat_pointer_notify_axis(seat->seat, event->time_msec, diff --git a/src/keyboard.c b/src/keyboard.c index 7fa85d33..6c45b7b5 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -157,6 +157,7 @@ keyboard_key_notify(struct wl_listener *listener, void *data) struct wlr_event_keyboard_key *event = data; struct wlr_seat *wlr_seat = server->seat.seat; struct wlr_input_device *device = seat->keyboard_group->input_device; + wlr_idle_notify_activity(seat->wlr_idle, seat->seat); bool handled = false; diff --git a/src/seat.c b/src/seat.c index f912762b..aeb13d72 100644 --- a/src/seat.c +++ b/src/seat.c @@ -169,6 +169,38 @@ new_input_notify(struct wl_listener *listener, void *data) wlr_seat_set_capabilities(seat->seat, caps); } +static void +destroy_idle_inhibitor(struct wl_listener *listener, void *data) +{ + struct idle_inhibitor *idle_inhibitor = wl_container_of(listener, + idle_inhibitor, destroy); + struct seat *seat = idle_inhibitor->seat; + wl_list_remove(&idle_inhibitor->destroy.link); + wlr_idle_set_enabled(seat->wlr_idle, seat->seat, wl_list_length( + &seat->wlr_idle_inhibit_manager->inhibitors) <= 1); + free(idle_inhibitor); +} + +static void +new_idle_inhibitor(struct wl_listener *listener, void *data) +{ + struct wlr_idle_inhibitor_v1 *wlr_inhibitor = data; + struct seat *seat = wl_container_of(listener, seat, + idle_inhibitor_create); + + struct idle_inhibitor *inhibitor = calloc(1, + sizeof(struct idle_inhibitor)); + if (!inhibitor) { + return; + } + + inhibitor->seat = seat; + inhibitor->wlr_inhibitor = wlr_inhibitor; + inhibitor->destroy.notify = destroy_idle_inhibitor; + wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy); + wlr_idle_set_enabled(seat->wlr_idle, seat->seat, 0); +} + void seat_init(struct server *server) { @@ -186,6 +218,14 @@ seat_init(struct server *server) seat->new_input.notify = new_input_notify; wl_signal_add(&server->backend->events.new_input, &seat->new_input); + seat->wlr_idle = wlr_idle_create(server->wl_display); + seat->wlr_idle_inhibit_manager = wlr_idle_inhibit_v1_create( + server->wl_display); + wl_signal_add(&seat->wlr_idle_inhibit_manager->events.new_inhibitor, + &seat->idle_inhibitor_create); + seat->idle_inhibitor_create.notify = new_idle_inhibitor; + + seat->cursor = wlr_cursor_create(); if (!seat->cursor) { wlr_log(WLR_ERROR, "unable to create cursor");