forked from mirror/dwl
Implement the idle protocol
It allows clients such as swayidle and chat applications to monitor user idle time.
This commit is contained in:
parent
1024928c15
commit
41cc23e1cf
3 changed files with 73 additions and 2 deletions
14
Makefile
14
Makefile
|
@ -33,12 +33,22 @@ wlr-layer-shell-unstable-v1-protocol.c:
|
||||||
|
|
||||||
wlr-layer-shell-unstable-v1-protocol.o: wlr-layer-shell-unstable-v1-protocol.h
|
wlr-layer-shell-unstable-v1-protocol.o: wlr-layer-shell-unstable-v1-protocol.h
|
||||||
|
|
||||||
|
idle-protocol.h:
|
||||||
|
$(WAYLAND_SCANNER) server-header \
|
||||||
|
protocols/idle.xml $@
|
||||||
|
|
||||||
|
idle-protocol.c:
|
||||||
|
$(WAYLAND_SCANNER) private-code \
|
||||||
|
protocols/idle.xml $@
|
||||||
|
|
||||||
|
idle-protocol.o: idle-protocol.h
|
||||||
|
|
||||||
config.h: | config.def.h
|
config.h: | config.def.h
|
||||||
cp config.def.h $@
|
cp config.def.h $@
|
||||||
|
|
||||||
dwl.o: config.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h
|
dwl.o: config.h xdg-shell-protocol.h wlr-layer-shell-unstable-v1-protocol.h idle-protocol.h
|
||||||
|
|
||||||
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o
|
dwl: xdg-shell-protocol.o wlr-layer-shell-unstable-v1-protocol.o idle-protocol.o
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f dwl *.o *-protocol.h *-protocol.c
|
rm -f dwl *.o *-protocol.h *-protocol.c
|
||||||
|
|
12
dwl.c
12
dwl.c
|
@ -20,6 +20,7 @@
|
||||||
#include <wlr/types/wlr_export_dmabuf_v1.h>
|
#include <wlr/types/wlr_export_dmabuf_v1.h>
|
||||||
#include <wlr/types/wlr_gamma_control_v1.h>
|
#include <wlr/types/wlr_gamma_control_v1.h>
|
||||||
#include <wlr/types/wlr_input_device.h>
|
#include <wlr/types/wlr_input_device.h>
|
||||||
|
#include <wlr/types/wlr_idle.h>
|
||||||
#include <wlr/types/wlr_layer_shell_v1.h>
|
#include <wlr/types/wlr_layer_shell_v1.h>
|
||||||
#include <wlr/types/wlr_keyboard.h>
|
#include <wlr/types/wlr_keyboard.h>
|
||||||
#include <wlr/types/wlr_matrix.h>
|
#include <wlr/types/wlr_matrix.h>
|
||||||
|
@ -292,6 +293,7 @@ static struct wl_list clients; /* tiling order */
|
||||||
static struct wl_list fstack; /* focus order */
|
static struct wl_list fstack; /* focus order */
|
||||||
static struct wl_list stack; /* stacking z-order */
|
static struct wl_list stack; /* stacking z-order */
|
||||||
static struct wl_list independents;
|
static struct wl_list independents;
|
||||||
|
static struct wlr_idle *idle;
|
||||||
static struct wlr_layer_shell_v1 *layer_shell;
|
static struct wlr_layer_shell_v1 *layer_shell;
|
||||||
static struct wlr_xdg_decoration_manager_v1 *xdeco_mgr;
|
static struct wlr_xdg_decoration_manager_v1 *xdeco_mgr;
|
||||||
static struct wlr_output_manager_v1 *output_mgr;
|
static struct wlr_output_manager_v1 *output_mgr;
|
||||||
|
@ -611,6 +613,7 @@ axisnotify(struct wl_listener *listener, void *data)
|
||||||
/* This event is forwarded by the cursor when a pointer emits an axis event,
|
/* This event is forwarded by the cursor when a pointer emits an axis event,
|
||||||
* for example when you move the scroll wheel. */
|
* for example when you move the scroll wheel. */
|
||||||
struct wlr_event_pointer_axis *event = data;
|
struct wlr_event_pointer_axis *event = data;
|
||||||
|
wlr_idle_notify_activity(idle, seat);
|
||||||
/* Notify the client with pointer focus of the axis event. */
|
/* Notify the client with pointer focus of the axis event. */
|
||||||
wlr_seat_pointer_notify_axis(seat,
|
wlr_seat_pointer_notify_axis(seat,
|
||||||
event->time_msec, event->orientation, event->delta,
|
event->time_msec, event->orientation, event->delta,
|
||||||
|
@ -626,6 +629,8 @@ buttonpress(struct wl_listener *listener, void *data)
|
||||||
Client *c;
|
Client *c;
|
||||||
const Button *b;
|
const Button *b;
|
||||||
|
|
||||||
|
wlr_idle_notify_activity(idle, seat);
|
||||||
|
|
||||||
switch (event->state) {
|
switch (event->state) {
|
||||||
case WLR_BUTTON_PRESSED:;
|
case WLR_BUTTON_PRESSED:;
|
||||||
/* Change focus if the button was _pressed_ over a client */
|
/* Change focus if the button was _pressed_ over a client */
|
||||||
|
@ -1217,6 +1222,9 @@ keypress(struct wl_listener *listener, void *data)
|
||||||
|
|
||||||
int handled = 0;
|
int handled = 0;
|
||||||
uint32_t mods = wlr_keyboard_get_modifiers(kb->device->keyboard);
|
uint32_t mods = wlr_keyboard_get_modifiers(kb->device->keyboard);
|
||||||
|
|
||||||
|
wlr_idle_notify_activity(idle, seat);
|
||||||
|
|
||||||
/* On _press_, attempt to process a compositor keybinding. */
|
/* On _press_, attempt to process a compositor keybinding. */
|
||||||
if (event->state == WLR_KEY_PRESSED)
|
if (event->state == WLR_KEY_PRESSED)
|
||||||
for (i = 0; i < nsyms; i++)
|
for (i = 0; i < nsyms; i++)
|
||||||
|
@ -1346,6 +1354,8 @@ motionnotify(uint32_t time)
|
||||||
time = now.tv_sec * 1000 + now.tv_nsec / 1000000;
|
time = now.tv_sec * 1000 + now.tv_nsec / 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wlr_idle_notify_activity(idle, seat);
|
||||||
|
|
||||||
/* Update selmon (even while dragging a window) */
|
/* Update selmon (even while dragging a window) */
|
||||||
if (sloppyfocus)
|
if (sloppyfocus)
|
||||||
selmon = xytomon(cursor->x, cursor->y);
|
selmon = xytomon(cursor->x, cursor->y);
|
||||||
|
@ -1999,6 +2009,8 @@ setup(void)
|
||||||
wl_list_init(&stack);
|
wl_list_init(&stack);
|
||||||
wl_list_init(&independents);
|
wl_list_init(&independents);
|
||||||
|
|
||||||
|
idle = wlr_idle_create(dpy);
|
||||||
|
|
||||||
layer_shell = wlr_layer_shell_v1_create(dpy);
|
layer_shell = wlr_layer_shell_v1_create(dpy);
|
||||||
wl_signal_add(&layer_shell->events.new_surface, &new_layer_shell_surface);
|
wl_signal_add(&layer_shell->events.new_surface, &new_layer_shell_surface);
|
||||||
|
|
||||||
|
|
49
protocols/idle.xml
Normal file
49
protocols/idle.xml
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<protocol name="idle">
|
||||||
|
<copyright><![CDATA[
|
||||||
|
Copyright (C) 2015 Martin Gräßlin
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation, either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
]]></copyright>
|
||||||
|
<interface name="org_kde_kwin_idle" version="1">
|
||||||
|
<description summary="User idle time manager">
|
||||||
|
This interface allows to monitor user idle time on a given seat. The interface
|
||||||
|
allows to register timers which trigger after no user activity was registered
|
||||||
|
on the seat for a given interval. It notifies when user activity resumes.
|
||||||
|
|
||||||
|
This is useful for applications wanting to perform actions when the user is not
|
||||||
|
interacting with the system, e.g. chat applications setting the user as away, power
|
||||||
|
management features to dim screen, etc..
|
||||||
|
</description>
|
||||||
|
<request name="get_idle_timeout">
|
||||||
|
<arg name="id" type="new_id" interface="org_kde_kwin_idle_timeout"/>
|
||||||
|
<arg name="seat" type="object" interface="wl_seat"/>
|
||||||
|
<arg name="timeout" type="uint" summary="The idle timeout in msec"/>
|
||||||
|
</request>
|
||||||
|
</interface>
|
||||||
|
<interface name="org_kde_kwin_idle_timeout" version="1">
|
||||||
|
<request name="release" type="destructor">
|
||||||
|
<description summary="release the timeout object"/>
|
||||||
|
</request>
|
||||||
|
<request name="simulate_user_activity">
|
||||||
|
<description summary="Simulates user activity for this timeout, behaves just like real user activity on the seat"/>
|
||||||
|
</request>
|
||||||
|
<event name="idle">
|
||||||
|
<description summary="Triggered when there has not been any user activity in the requested idle time interval"/>
|
||||||
|
</event>
|
||||||
|
<event name="resumed">
|
||||||
|
<description summary="Triggered on the first user activity after an idle event"/>
|
||||||
|
</event>
|
||||||
|
</interface>
|
||||||
|
</protocol>
|
Loading…
Reference in a new issue