From 53266d56225497a09c29911c7f3b97cd884be316 Mon Sep 17 00:00:00 2001 From: Demmie <2e3s19@gmail.com> Date: Wed, 27 Dec 2023 13:58:02 -0500 Subject: [PATCH] Use Wayland protocols out of box --- Cargo.lock | 47 +++- Cargo.toml | 2 +- README.md | 4 +- watchers/Cargo.toml | 5 +- watchers/src/watchers.rs | 1 - .../wl-protocols/ext-idle-notify-v1.xml | 102 ------- watchers/src/watchers/wl-protocols/idle.xml | 49 ---- ...oreign-toplevel-management-unstable-v1.xml | 259 ------------------ watchers/src/watchers/wl_bindings.rs | 60 ---- watchers/src/watchers/wl_connection.rs | 13 +- watchers/src/watchers/wl_ext_idle_notify.rs | 11 +- watchers/src/watchers/wl_foreign_toplevel.rs | 13 +- watchers/src/watchers/wl_kwin_idle.rs | 5 +- 13 files changed, 70 insertions(+), 501 deletions(-) delete mode 100644 watchers/src/watchers/wl-protocols/ext-idle-notify-v1.xml delete mode 100644 watchers/src/watchers/wl-protocols/idle.xml delete mode 100644 watchers/src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml delete mode 100644 watchers/src/watchers/wl_bindings.rs diff --git a/Cargo.lock b/Cargo.lock index 7483622..a99b61a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -447,7 +447,7 @@ dependencies = [ [[package]] name = "awatcher" -version = "0.2.4-alpha1" +version = "0.2.4" dependencies = [ "anyhow", "aw-datastore", @@ -3821,7 +3821,7 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "watchers" -version = "0.2.4-alpha1" +version = "0.2.4" dependencies = [ "anyhow", "async-trait", @@ -3838,9 +3838,10 @@ dependencies = [ "tempfile", "tokio", "toml 0.8.1", - "wayland-backend", "wayland-client", - "wayland-scanner", + "wayland-protocols", + "wayland-protocols-plasma", + "wayland-protocols-wlr", "x11rb", "zbus", ] @@ -3871,6 +3872,44 @@ dependencies = [ "wayland-scanner", ] +[[package]] +name = "wayland-protocols" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" +dependencies = [ + "bitflags 2.4.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.4.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.4.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + [[package]] name = "wayland-scanner" version = "0.31.0" diff --git a/Cargo.toml b/Cargo.toml index 0ec1067..de6abc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ image = { version = "0.24.6" } members = ["watchers"] [workspace.package] -version = "0.2.4-alpha1" +version = "0.2.4" [workspace.dependencies] anyhow = "1.0.75" diff --git a/README.md b/README.md index b7c1a81..5326fa1 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,12 @@ as soon as the environment has the necessary interfaces. | Environment | Active window | Idle | | --------------- | -------------------- | ------------------- | | X11 | :green_circle: | :green_circle: | -| Wayland + Sway | :green_circle: [^1] | :green_circle: [^2] | +| Sway, Hyprland | :green_circle: [^1] | :green_circle: [^2] | | Wayland + KDE | :yellow_circle: [^3] | :green_circle: | | Wayland + Gnome | :yellow_circle: [^4] | :green_circle: | [^1]: A few other DEs besides Sway may implement [wlr foreign toplevel protocol](https://wayland.app/protocols/wlr-foreign-toplevel-management-unstable-v1), -[^2]: It implements [KWin idle protocol](https://wayland.app/protocols/kde-idle). +[^2]: [KWin idle](https://wayland.app/protocols/kde-idle) and [Idle notify](https://wayland.app/protocols/ext-idle-notify-v1) protocols are supported. [^3]: KWin doesn't implement any toplevel protocol yet, KWin script is utilized instead (builtin, no actions required). KDE partially supports XWayland, but inconsistently, hence X11 is not utilized for it. [^4]: Gnome doesn't implement any toplevel protocol yet, so [this extension](https://extensions.gnome.org/extension/5592/focused-window-d-bus/) should be installed. diff --git a/watchers/Cargo.toml b/watchers/Cargo.toml index ae3063a..748d89f 100644 --- a/watchers/Cargo.toml +++ b/watchers/Cargo.toml @@ -16,8 +16,9 @@ tempfile = "3.8.0" [dependencies] aw-client-rust = { git = "https://github.com/ActivityWatch/aw-server-rust", rev = "448312d" } wayland-client = "0.31.1" -wayland-scanner = "0.31.0" -wayland-backend = "0.3.2" +wayland-protocols = { version = "0.31.0", features = ["staging", "client" ]} +wayland-protocols-plasma = { version = "0.2.0", features = ["client"] } +wayland-protocols-wlr = { version = "0.2.0", features = ["client"] } x11rb = { version = "0.12.0", features = ["screensaver"] } zbus = {version = "3.14.1", optional = true} chrono = "0.4.31" diff --git a/watchers/src/watchers.rs b/watchers/src/watchers.rs index f376416..8ad9405 100644 --- a/watchers/src/watchers.rs +++ b/watchers/src/watchers.rs @@ -5,7 +5,6 @@ mod gnome_window; mod idle; #[cfg(feature = "kwin_window")] mod kwin_window; -mod wl_bindings; mod wl_connection; mod wl_ext_idle_notify; mod wl_foreign_toplevel; diff --git a/watchers/src/watchers/wl-protocols/ext-idle-notify-v1.xml b/watchers/src/watchers/wl-protocols/ext-idle-notify-v1.xml deleted file mode 100644 index 6fe97d7..0000000 --- a/watchers/src/watchers/wl-protocols/ext-idle-notify-v1.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - Copyright © 2015 Martin Gräßlin - Copyright © 2022 Simon Ser - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice (including the next - paragraph) shall be included in all copies or substantial portions of the - Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - - - - This interface allows clients to monitor user idle status. - - After binding to this global, clients can create ext_idle_notification_v1 - objects to get notified when the user is idle for a given amount of time. - - - - - Destroy the manager object. All objects created via this interface - remain valid. - - - - - - Create a new idle notification object. - - 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. - - - - - - - - - - This interface is used by the compositor to send idle notification events - to clients. - - Initially the notification object is not idle. The notification object - 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. - - When the notification object becomes idle, an idled event is sent. When - user activity starts again, the notification object stops being idle, - a resumed event is sent and the timeout is restarted. - - - - - Destroy the notification object. - - - - - - This event is sent when the notification object becomes idle. - - It's a compositor protocol error to send this event twice without a - resumed event in-between. - - - - - - This event is sent when the notification object stops being idle. - - It's a compositor protocol error to send this event twice without an - idled event in-between. It's a compositor protocol error to send this - event prior to any idled event. - - - - diff --git a/watchers/src/watchers/wl-protocols/idle.xml b/watchers/src/watchers/wl-protocols/idle.xml deleted file mode 100644 index 92d9989..0000000 --- a/watchers/src/watchers/wl-protocols/idle.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - . - ]]> - - - 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.. - - - - - - - - - - - - - - - - - - - - - - diff --git a/watchers/src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml b/watchers/src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml deleted file mode 100644 index a97738f..0000000 --- a/watchers/src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml +++ /dev/null @@ -1,259 +0,0 @@ - - - - Copyright © 2018 Ilia Bozhinov - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that copyright notice and this permission - notice appear in supporting documentation, and that the name of - the copyright holders not be used in advertising or publicity - pertaining to distribution of the software without specific, - written prior permission. The copyright holders make no - representations about the suitability of this software for any - purpose. It is provided "as is" without express or implied - warranty. - - THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF - THIS SOFTWARE. - - - - - The purpose of this protocol is to enable the creation of taskbars - and docks by providing them with a list of opened applications and - letting them request certain actions on them, like maximizing, etc. - - After a client binds the zwlr_foreign_toplevel_manager_v1, each opened - toplevel window will be sent via the toplevel event - - - - - This event is emitted whenever a new toplevel window is created. It - is emitted for all toplevels, regardless of the app that has created - them. - - All initial details of the toplevel(title, app_id, states, etc.) will - be sent immediately after this event via the corresponding events in - zwlr_foreign_toplevel_handle_v1. - - - - - - - Indicates the client no longer wishes to receive events for new toplevels. - However the compositor may emit further toplevel_created events, until - the finished event is emitted. - - The client must not send any more requests after this one. - - - - - - This event indicates that the compositor is done sending events to the - zwlr_foreign_toplevel_manager_v1. The server will destroy the object - immediately after sending this request, so it will become invalid and - the client should free any resources associated with it. - - - - - - - A zwlr_foreign_toplevel_handle_v1 object represents an opened toplevel - window. Each app may have multiple opened toplevels. - - Each toplevel has a list of outputs it is visible on, conveyed to the - client with the output_enter and output_leave events. - - - - - This event is emitted whenever the title of the toplevel changes. - - - - - - - This event is emitted whenever the app-id of the toplevel changes. - - - - - - - This event is emitted whenever the toplevel becomes visible on - the given output. A toplevel may be visible on multiple outputs. - - - - - - - This event is emitted whenever the toplevel stops being visible on - the given output. It is guaranteed that an entered-output event - with the same output has been emitted before this event. - - - - - - - Requests that the toplevel be maximized. If the maximized state actually - changes, this will be indicated by the state event. - - - - - - Requests that the toplevel be unmaximized. If the maximized state actually - changes, this will be indicated by the state event. - - - - - - Requests that the toplevel be minimized. If the minimized state actually - changes, this will be indicated by the state event. - - - - - - Requests that the toplevel be unminimized. If the minimized state actually - changes, this will be indicated by the state event. - - - - - - Request that this toplevel be activated on the given seat. - There is no guarantee the toplevel will be actually activated. - - - - - - - The different states that a toplevel can have. These have the same meaning - as the states with the same names defined in xdg-toplevel - - - - - - - - - - - This event is emitted immediately after the zlw_foreign_toplevel_handle_v1 - is created and each time the toplevel state changes, either because of a - compositor action or because of a request in this protocol. - - - - - - - - This event is sent after all changes in the toplevel state have been - sent. - - This allows changes to the zwlr_foreign_toplevel_handle_v1 properties - to be seen as atomic, even if they happen via multiple events. - - - - - - Send a request to the toplevel to close itself. The compositor would - typically use a shell-specific method to carry out this request, for - example by sending the xdg_toplevel.close event. However, this gives - no guarantees the toplevel will actually be destroyed. If and when - this happens, the zwlr_foreign_toplevel_handle_v1.closed event will - be emitted. - - - - - - The rectangle of the surface specified in this request corresponds to - the place where the app using this protocol represents the given toplevel. - It can be used by the compositor as a hint for some operations, e.g - minimizing. The client is however not required to set this, in which - case the compositor is free to decide some default value. - - If the client specifies more than one rectangle, only the last one is - considered. - - The dimensions are given in surface-local coordinates. - Setting width=height=0 removes the already-set rectangle. - - - - - - - - - - - - - - - - This event means the toplevel has been destroyed. It is guaranteed there - won't be any more events for this zwlr_foreign_toplevel_handle_v1. The - toplevel itself becomes inert so any requests will be ignored except the - destroy request. - - - - - - Destroys the zwlr_foreign_toplevel_handle_v1 object. - - This request should be called either when the client does not want to - use the toplevel anymore or after the closed event to finalize the - destruction of the object. - - - - - - - - Requests that the toplevel be fullscreened on the given output. If the - fullscreen state and/or the outputs the toplevel is visible on actually - change, this will be indicated by the state and output_enter/leave - events. - - The output parameter is only a hint to the compositor. Also, if output - is NULL, the compositor should decide which output the toplevel will be - fullscreened on, if at all. - - - - - - - Requests that the toplevel be unfullscreened. If the fullscreen state - actually changes, this will be indicated by the state event. - - - - diff --git a/watchers/src/watchers/wl_bindings.rs b/watchers/src/watchers/wl_bindings.rs deleted file mode 100644 index f200d84..0000000 --- a/watchers/src/watchers/wl_bindings.rs +++ /dev/null @@ -1,60 +0,0 @@ -#![forbid(improper_ctypes, unsafe_op_in_unsafe_fn)] -#![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![cfg_attr(rustfmt, rustfmt_skip)] - -pub mod idle { - #![allow(dead_code,non_camel_case_types,unused_unsafe,unused_variables)] - #![allow(non_upper_case_globals,non_snake_case,unused_imports)] - #![allow(missing_docs, clippy::all)] - #![allow(clippy::wildcard_imports)] - - //! Client-side API of this protocol - use wayland_client; - use wayland_client::protocol::*; - - pub mod __interfaces { - use wayland_client::protocol::__interfaces::*; - wayland_scanner::generate_interfaces!("src/watchers/wl-protocols/idle.xml"); - } - use self::__interfaces::*; - - wayland_scanner::generate_client_code!("src/watchers/wl-protocols/idle.xml"); -} - -pub mod ext_idle { - #![allow(dead_code,non_camel_case_types,unused_unsafe,unused_variables)] - #![allow(non_upper_case_globals,non_snake_case,unused_imports)] - #![allow(missing_docs, clippy::all)] - #![allow(clippy::wildcard_imports)] - - //! Client-side API of this protocol - use wayland_client; - use wayland_client::protocol::*; - - pub mod __interfaces { - use wayland_client::protocol::__interfaces::*; - wayland_scanner::generate_interfaces!("src/watchers/wl-protocols/ext-idle-notify-v1.xml"); - } - use self::__interfaces::*; - - wayland_scanner::generate_client_code!("src/watchers/wl-protocols/ext-idle-notify-v1.xml"); -} - -pub mod wlr_foreign_toplevel { - #![allow(dead_code,non_camel_case_types,unused_unsafe,unused_variables)] - #![allow(non_upper_case_globals,non_snake_case,unused_imports)] - #![allow(missing_docs, clippy::all)] - #![allow(clippy::wildcard_imports)] - - //! Client-side API of this protocol - use wayland_client; - use wayland_client::protocol::*; - - pub mod __interfaces { - use wayland_client::protocol::__interfaces::*; - wayland_scanner::generate_interfaces!("src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml"); - } - use self::__interfaces::*; - - wayland_scanner::generate_client_code!("src/watchers/wl-protocols/wlr-foreign-toplevel-management-unstable-v1.xml"); -} diff --git a/watchers/src/watchers/wl_connection.rs b/watchers/src/watchers/wl_connection.rs index 939cc28..03a1c65 100644 --- a/watchers/src/watchers/wl_connection.rs +++ b/watchers/src/watchers/wl_connection.rs @@ -1,4 +1,3 @@ -use super::wl_bindings; use anyhow::Context; use wayland_client::{ globals::{registry_queue_init, GlobalList, GlobalListContents}, @@ -6,11 +5,13 @@ use wayland_client::{ Connection, Dispatch, EventQueue, Proxy, QueueHandle, }; -use wl_bindings::ext_idle::ext_idle_notification_v1::ExtIdleNotificationV1; -use wl_bindings::ext_idle::ext_idle_notifier_v1::ExtIdleNotifierV1; -use wl_bindings::idle::org_kde_kwin_idle::OrgKdeKwinIdle; -use wl_bindings::idle::org_kde_kwin_idle_timeout::OrgKdeKwinIdleTimeout; -use wl_bindings::wlr_foreign_toplevel::zwlr_foreign_toplevel_manager_v1::ZwlrForeignToplevelManagerV1; +use wayland_protocols::ext::idle_notify::v1::client::{ + ext_idle_notification_v1::ExtIdleNotificationV1, ext_idle_notifier_v1::ExtIdleNotifierV1, +}; +use wayland_protocols_plasma::idle::client::{ + org_kde_kwin_idle::OrgKdeKwinIdle, org_kde_kwin_idle_timeout::OrgKdeKwinIdleTimeout, +}; +use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_manager_v1::ZwlrForeignToplevelManagerV1; macro_rules! subscribe_state { ($struct_name:ty, $data_name:ty, $state:ty) => { diff --git a/watchers/src/watchers/wl_ext_idle_notify.rs b/watchers/src/watchers/wl_ext_idle_notify.rs index 5a8d0bf..af31068 100644 --- a/watchers/src/watchers/wl_ext_idle_notify.rs +++ b/watchers/src/watchers/wl_ext_idle_notify.rs @@ -1,4 +1,3 @@ -use super::wl_bindings; use super::wl_connection::{subscribe_state, WlEventConnection}; use super::Watcher; use crate::report_client::ReportClient; @@ -11,9 +10,9 @@ use wayland_client::{ protocol::{wl_registry, wl_seat::WlSeat}, Connection, Dispatch, Proxy, QueueHandle, }; -use wl_bindings::ext_idle::ext_idle_notification_v1::Event as ExtIdleNotificationV1Event; -use wl_bindings::ext_idle::ext_idle_notification_v1::ExtIdleNotificationV1; -use wl_bindings::ext_idle::ext_idle_notifier_v1::ExtIdleNotifierV1; +use wayland_protocols::ext::idle_notify::v1::client::ext_idle_notification_v1::Event as IdleNotificationV1Event; +use wayland_protocols::ext::idle_notify::v1::client::ext_idle_notification_v1::ExtIdleNotificationV1; +use wayland_protocols::ext::idle_notify::v1::client::ext_idle_notifier_v1::ExtIdleNotifierV1; struct IdleState { idle_notification: ExtIdleNotificationV1, @@ -115,9 +114,9 @@ impl Dispatch for IdleState { _: &Connection, _: &QueueHandle, ) { - if let ExtIdleNotificationV1Event::Idled = event { + if let IdleNotificationV1Event::Idled = event { state.idle(); - } else if let ExtIdleNotificationV1Event::Resumed = event { + } else if let IdleNotificationV1Event::Resumed = event { state.resume(); } } diff --git a/watchers/src/watchers/wl_foreign_toplevel.rs b/watchers/src/watchers/wl_foreign_toplevel.rs index 88e3133..b10c4d8 100644 --- a/watchers/src/watchers/wl_foreign_toplevel.rs +++ b/watchers/src/watchers/wl_foreign_toplevel.rs @@ -1,9 +1,3 @@ -use super::wl_bindings::wlr_foreign_toplevel::zwlr_foreign_toplevel_handle_v1::{ - Event as HandleEvent, State as HandleState, ZwlrForeignToplevelHandleV1, -}; -use super::wl_bindings::wlr_foreign_toplevel::zwlr_foreign_toplevel_manager_v1::{ - Event as ManagerEvent, ZwlrForeignToplevelManagerV1, EVT_TOPLEVEL_OPCODE, -}; use super::wl_connection::WlEventConnection; use super::{wl_connection::subscribe_state, Watcher}; use crate::report_client::ReportClient; @@ -15,6 +9,12 @@ use wayland_client::{ event_created_child, globals::GlobalListContents, protocol::wl_registry, Connection, Dispatch, Proxy, QueueHandle, }; +use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_handle_v1::{ + Event as HandleEvent, State as HandleState, ZwlrForeignToplevelHandleV1, +}; +use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_manager_v1::{ + Event as ManagerEvent, ZwlrForeignToplevelManagerV1, EVT_TOPLEVEL_OPCODE, +}; struct WindowData { app_id: String, @@ -58,6 +58,7 @@ impl Dispatch for ToplevelState { ManagerEvent::Finished => { error!("Toplevel manager is finished, the application may crash"); } + _ => (), }; } diff --git a/watchers/src/watchers/wl_kwin_idle.rs b/watchers/src/watchers/wl_kwin_idle.rs index 232d706..6575b4d 100644 --- a/watchers/src/watchers/wl_kwin_idle.rs +++ b/watchers/src/watchers/wl_kwin_idle.rs @@ -1,4 +1,3 @@ -use super::wl_bindings; use super::wl_connection::{subscribe_state, WlEventConnection}; use super::Watcher; use crate::report_client::ReportClient; @@ -11,8 +10,8 @@ use wayland_client::{ protocol::{wl_registry, wl_seat::WlSeat}, Connection, Dispatch, Proxy, QueueHandle, }; -use wl_bindings::idle::org_kde_kwin_idle::OrgKdeKwinIdle; -use wl_bindings::idle::org_kde_kwin_idle_timeout::{ +use wayland_protocols_plasma::idle::client::org_kde_kwin_idle::OrgKdeKwinIdle; +use wayland_protocols_plasma::idle::client::org_kde_kwin_idle_timeout::{ Event as OrgKdeKwinIdleTimeoutEvent, OrgKdeKwinIdleTimeout, };