mirror of
https://github.com/cage-kiosk/cage.git
synced 2025-10-29 05:40:19 -04:00
Add idle inhibitor support
With this, some apps (e.g. mpv) can block the idle tracker from kicking in. This way, the screen won't blank (or whatever you configured) when the application doesn't want it to.
This commit is contained in:
parent
bf58eadf50
commit
21c01c9ee0
5 changed files with 96 additions and 0 deletions
13
cage.c
13
cage.c
|
|
@ -21,6 +21,7 @@
|
|||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_data_device.h>
|
||||
#include <wlr/types/wlr_idle.h>
|
||||
#include <wlr/types/wlr_idle_inhibit_v1.h>
|
||||
#include <wlr/types/wlr_output_layout.h>
|
||||
#if CAGE_HAS_XWAYLAND
|
||||
#include <wlr/types/wlr_xcursor_manager.h>
|
||||
|
|
@ -31,6 +32,7 @@
|
|||
#include <wlr/xwayland.h>
|
||||
#endif
|
||||
|
||||
#include "idle_inhibit_v1.h"
|
||||
#include "output.h"
|
||||
#include "seat.h"
|
||||
#include "server.h"
|
||||
|
|
@ -159,6 +161,16 @@ main(int argc, char *argv[])
|
|||
goto end;
|
||||
}
|
||||
|
||||
server.idle_inhibit_v1 = wlr_idle_inhibit_v1_create(server.wl_display);
|
||||
if (!server.idle_inhibit_v1) {
|
||||
wlr_log(WLR_ERROR, "Cannot create the idle inhibitor");
|
||||
ret = 1;
|
||||
goto end;
|
||||
}
|
||||
server.new_idle_inhibitor_v1.notify = handle_idle_inhibitor_v1_new;
|
||||
wl_signal_add(&server.idle_inhibit_v1->events.new_inhibitor, &server.new_idle_inhibitor_v1);
|
||||
wl_list_init(&server.inhibitors);
|
||||
|
||||
xdg_shell = wlr_xdg_shell_create(server.wl_display);
|
||||
if (!xdg_shell) {
|
||||
wlr_log(WLR_ERROR, "Unable to create the XDG shell interface");
|
||||
|
|
@ -236,6 +248,7 @@ end:
|
|||
wlr_xcursor_manager_destroy(xcursor_manager);
|
||||
#endif
|
||||
wlr_xdg_shell_destroy(xdg_shell);
|
||||
wlr_idle_inhibit_v1_destroy(server.idle_inhibit_v1);
|
||||
if (server.idle) {
|
||||
wlr_idle_destroy(server.idle);
|
||||
}
|
||||
|
|
|
|||
69
idle_inhibit_v1.c
Normal file
69
idle_inhibit_v1.c
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Cage: A Wayland kiosk.
|
||||
*
|
||||
* Copyright (C) 2018-2019 Jente Hidskes
|
||||
*
|
||||
* See the LICENSE file accompanying this file.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <wayland-server.h>
|
||||
#include <wlr/types/wlr_idle.h>
|
||||
#include <wlr/types/wlr_idle_inhibit_v1.h>
|
||||
|
||||
#include "idle_inhibit_v1.h"
|
||||
#include "server.h"
|
||||
|
||||
struct cg_idle_inhibitor_v1 {
|
||||
struct cg_server *server;
|
||||
|
||||
struct wl_list link; // server::inhibitors
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
static void
|
||||
idle_inhibit_v1_check_active(struct cg_server *server)
|
||||
{
|
||||
/* Due to Cage's unique window management, we don't need to
|
||||
check for visibility. In the worst cage, the inhibitor is
|
||||
spawned by a dialog that _may_ be obscured by another
|
||||
dialog, but this is really an edge case that, until
|
||||
reported, does not warrant the additional complexity.
|
||||
Hence, we simply check for any inhibitors and inhibit
|
||||
accordingly. */
|
||||
bool inhibited = !wl_list_empty(&server->inhibitors);
|
||||
wlr_idle_set_enabled(server->idle, NULL, !inhibited);
|
||||
}
|
||||
|
||||
static void
|
||||
handle_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct cg_idle_inhibitor_v1 *inhibitor = wl_container_of(listener, inhibitor, destroy);
|
||||
struct cg_server *server = inhibitor->server;
|
||||
|
||||
wl_list_remove(&inhibitor->link);
|
||||
wl_list_remove(&inhibitor->destroy.link);
|
||||
free(inhibitor);
|
||||
|
||||
idle_inhibit_v1_check_active(server);
|
||||
}
|
||||
|
||||
void
|
||||
handle_idle_inhibitor_v1_new(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct cg_server *server = wl_container_of(listener, server, new_idle_inhibitor_v1);
|
||||
struct wlr_idle_inhibitor_v1 *wlr_inhibitor = data;
|
||||
|
||||
struct cg_idle_inhibitor_v1 *inhibitor = calloc(1, sizeof(struct cg_idle_inhibitor_v1));
|
||||
if (!inhibitor) {
|
||||
return;
|
||||
}
|
||||
|
||||
inhibitor->server = server;
|
||||
wl_list_insert(&server->inhibitors, &inhibitor->link);
|
||||
|
||||
inhibitor->destroy.notify = handle_destroy;
|
||||
wl_signal_add(&wlr_inhibitor->events.destroy, &inhibitor->destroy);
|
||||
|
||||
idle_inhibit_v1_check_active(server);
|
||||
}
|
||||
8
idle_inhibit_v1.h
Normal file
8
idle_inhibit_v1.h
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#ifndef CG_IDLE_INHIBIT_H
|
||||
#define CG_IDLE_INHIBIT_H
|
||||
|
||||
#include <wayland-server.h>
|
||||
|
||||
void handle_idle_inhibitor_v1_new(struct wl_listener *listener, void *data);
|
||||
|
||||
#endif
|
||||
|
|
@ -56,6 +56,7 @@ conf_data.set10('CAGE_HAS_XWAYLAND', get_option('xwayland'))
|
|||
|
||||
cage_sources = [
|
||||
'cage.c',
|
||||
'idle_inhibit_v1.c',
|
||||
'output.c',
|
||||
'seat.c',
|
||||
'view.c',
|
||||
|
|
@ -66,6 +67,7 @@ cage_headers = [
|
|||
configure_file(input: 'config.h.in',
|
||||
output: 'config.h',
|
||||
configuration: conf_data),
|
||||
'idle_inhibit_v1.h',
|
||||
'output.h',
|
||||
'seat.h',
|
||||
'server.h',
|
||||
|
|
|
|||
4
server.h
4
server.h
|
|
@ -6,6 +6,7 @@
|
|||
#include <wayland-server.h>
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/types/wlr_idle.h>
|
||||
#include <wlr/types/wlr_idle_inhibit_v1.h>
|
||||
#include <wlr/types/wlr_output_layout.h>
|
||||
#if CAGE_HAS_XWAYLAND
|
||||
#include <wlr/xwayland.h>
|
||||
|
|
@ -23,6 +24,9 @@ struct cg_server {
|
|||
|
||||
struct cg_seat *seat;
|
||||
struct wlr_idle *idle;
|
||||
struct wlr_idle_inhibit_manager_v1 *idle_inhibit_v1;
|
||||
struct wl_listener new_idle_inhibitor_v1;
|
||||
struct wl_list inhibitors;
|
||||
|
||||
struct wlr_output_layout *output_layout;
|
||||
struct cg_output *output;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue