]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add support for basic idle and idle inhibitor protocols
authorARDiDo <90479315+ARDiDo@users.noreply.github.com>
Mon, 22 Nov 2021 21:35:57 +0000 (16:35 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Mon, 22 Nov 2021 21:58:07 +0000 (21:58 +0000)
include/labwc.h
src/cursor.c
src/keyboard.c
src/seat.c

index 2285b4082b3aa9146f1a55e0e73e9b719812320d..dfbf739308e93b2502dabcc5f37ab5dde2d07084 100644 (file)
@@ -15,6 +15,8 @@
 #include <wlr/types/wlr_cursor.h>
 #include <wlr/types/wlr_data_device.h>
 #include <wlr/types/wlr_foreign_toplevel_management_v1.h>
+#include <wlr/types/wlr_idle.h>
+#include <wlr/types/wlr_idle_inhibit_v1.h>
 #include <wlr/types/wlr_input_device.h>
 #include <wlr/types/wlr_keyboard.h>
 #include <wlr/types/wlr_keyboard_group.h>
@@ -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);
index 13107c7a68e09fee34c902c8d2447a6ecd8842e5..ef650004a43ef640b7f08132dc05284f2f43cb53 100644 (file)
@@ -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,
index 7fa85d338bf15c4f82c3a1cb28e0b863a37930b5..6c45b7b5d7132b84a45669fc4bd8f7e53da22d9f 100644 (file)
@@ -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;
 
index f912762b37a74e014c9961ac7d92eff518d03b7a..aeb13d7200277cc19d2316c5256aaa66e5c6ce1f 100644 (file)
@@ -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");