Skip to content

Commit

Permalink
Merge pull request #596 from jjramsey/ext-idle-notify-update
Browse files Browse the repository at this point in the history
Allow Workrave to ignore idle inhibitors if possible
  • Loading branch information
rcaelers authored Jan 15, 2025
2 parents f5afb09 + ed9c517 commit d7b417e
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 6 deletions.
22 changes: 21 additions & 1 deletion libs/input-monitor/src/unix/WaylandInputMonitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,28 @@ WaylandInputMonitor::init()
}

auto *wl_seat = gdk_wayland_seat_get_wl_seat(gdk_display_get_default_seat(gdk_display));
auto *wl_notification = ext_idle_notifier_v1_get_idle_notification(wl_notifier, timeout, wl_seat);

const auto wl_ntfr_ver = ext_idle_notifier_v1_get_version(wl_notifier);
const auto wl_ntfr_ver_w_input_idle = decltype(wl_ntfr_ver){2};

ext_idle_notification_v1 *wl_notification = nullptr;
if (wl_ntfr_ver < wl_ntfr_ver_w_input_idle)
{
TRACE_MSG("Falling back to version of ext-idle-notify-v1 protocol that "
"does not support ignoring idle inhibitors");

wl_notification = ext_idle_notifier_v1_get_idle_notification(wl_notifier,
timeout, wl_seat);
}
else
{
TRACE_MSG("Using version of ext-idle-notify-v1 protocol that "
"supports ignoring idle inhibitors");

wl_notification = ext_idle_notifier_v1_get_input_idle_notification(wl_notifier,
timeout, wl_seat);
}

ext_idle_notification_v1_add_listener(wl_notification, &idle_notification_listener, this);
monitor_thread = std::make_shared<std::thread>([this] { run(); });

Expand Down
39 changes: 34 additions & 5 deletions libs/input-monitor/src/unix/protocols/ext-idle-notify-v1.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
DEALINGS IN THE SOFTWARE.
</copyright>

<interface name="ext_idle_notifier_v1" version="1">
<interface name="ext_idle_notifier_v1" version="2">
<description summary="idle notification manager">
This interface allows clients to monitor user idle status.

Expand Down Expand Up @@ -54,9 +54,30 @@
<arg name="timeout" type="uint" summary="minimum idle timeout in msec"/>
<arg name="seat" type="object" interface="wl_seat"/>
</request>

<!-- Version 2 additions -->

<request name="get_input_idle_notification" since="2">
<description summary="create a notification object">
Create a new idle notification object to track input from the
user, such as keyboard and mouse movement. Because this object is
meant to track user input alone, it ignores idle inhibitors.

The notification object has a minimum timeout duration and is tied to a
seat. The client will be notified if the seat is inactive for at least
the provided timeout. See ext_idle_notification_v1 for more details.

A zero timeout is valid and means the client wants to be notified as
soon as possible when the seat is inactive.
</description>
<arg name="id" type="new_id" interface="ext_idle_notification_v1"/>
<arg name="timeout" type="uint" summary="minimum idle timeout in msec"/>
<arg name="seat" type="object" interface="wl_seat"/>
</request>

</interface>

<interface name="ext_idle_notification_v1" version="1">
<interface name="ext_idle_notification_v1" version="2">
<description summary="idle notification">
This interface is used by the compositor to send idle notification events
to clients.
Expand All @@ -65,9 +86,17 @@
becomes idle when no user activity has happened for at least the timeout
duration, starting from the creation of the notification object. User
activity may include input events or a presence sensor, but is
compositor-specific. If an idle inhibitor is active (e.g. another client
has created a zwp_idle_inhibitor_v1 on a visible surface), the compositor
must not make the notification object idle.
compositor-specific.

How this notification responds to idle inhibitors depends on how
it was constructed. If constructed from the
get_idle_notification request, then if an idle inhibitor is
active (e.g. another client has created a zwp_idle_inhibitor_v1
on a visible surface), the compositor must not make the
notification object idle. However, if constructed from the
get_input_idle_notification request, then idle inhibitors are
ignored, and only input from the user, e.g. from a keyboard or
mouse, counts as activity.

When the notification object becomes idle, an idled event is sent. When
user activity starts again, the notification object stops being idle,
Expand Down

0 comments on commit d7b417e

Please sign in to comment.