From c75f0b97747b26fecd0811be4be505adfec05cfa Mon Sep 17 00:00:00 2001 From: Maximiliano Sandoval R Date: Wed, 8 Jun 2022 21:24:55 +0200 Subject: [PATCH] test gtk4 --- src/activation_token/gtk4.rs | 61 ++++++--------------------------- src/activation_token/mod.rs | 14 ++++---- src/activation_token/wayland.rs | 4 ++- 3 files changed, 20 insertions(+), 59 deletions(-) diff --git a/src/activation_token/gtk4.rs b/src/activation_token/gtk4.rs index 06df8772b..61345d1f2 100644 --- a/src/activation_token/gtk4.rs +++ b/src/activation_token/gtk4.rs @@ -1,61 +1,20 @@ -use super::wayland::WaylandActivationToken; -use gtk4::{gdk, glib::translate::ToGlibPtr, prelude::*}; -use wayland_client::{ - backend::ObjectId, - protocol::{__interfaces::WL_SURFACE_INTERFACE, wl_surface::WlSurface}, - Proxy, -}; -use wayland_protocols::xdg::activation::v1::client::xdg_activation_token_v1::XdgActivationTokenV1; +use gtk4::{gdk, glib, prelude::*}; #[derive(Debug)] pub struct Gtk4ActivationToken { - pub token: String, - inner: XdgActivationTokenV1, + pub(crate) token: String, } impl Gtk4ActivationToken { - pub fn from_native(native: &impl ::gtk4::glib::IsA<::gtk4::Native>) -> Option { - let surface = native.surface(); - match surface.display().backend() { - gdk::Backend::Wayland => { - // TODO use WaylandSurface::wl_surface(), see - // https://github.com/gtk-rs/gtk4-rs/pull/1053 - let cnx = wayland_client::Connection::connect_to_env().unwrap(); - let surface_id = unsafe { - let ptr = gdk4wayland::ffi::gdk_wayland_surface_get_wl_surface( - surface - .downcast_ref::() - .unwrap() - .to_glib_none() - .0, - ); - - ObjectId::from_ptr(&WL_SURFACE_INTERFACE, ptr as *mut _).unwrap() - }; - let wl_surface = WlSurface::from_id(&cnx, surface_id).unwrap(); - - let wl = WaylandActivationToken::from_surface(&wl_surface).unwrap(); - - Some(Self::from(wl)) - } - // TODO Can this be implemented for X11? + pub fn from_native>(native: &N) -> Option { + match display.backend() { + gdk::Backend::Wayland => native + .startup_notification_id() + .map(|token| Self { + token: token.to_string(), + }), + gdk::Backend::X11 => todo!(), _ => None, } } } - -impl From for Gtk4ActivationToken { - fn from(mut wl_token: WaylandActivationToken) -> Self { - let token = std::mem::take(&mut wl_token.token); - // NOTE Safe unwrap, WlActivationToken has a inner set at construction. - let inner = wl_token.inner.take().unwrap(); - - Self { inner, token } - } -} - -impl Drop for Gtk4ActivationToken { - fn drop(&mut self) { - self.inner.destroy(); - } -} diff --git a/src/activation_token/mod.rs b/src/activation_token/mod.rs index ba1ece09f..eb6ee395e 100644 --- a/src/activation_token/mod.rs +++ b/src/activation_token/mod.rs @@ -3,9 +3,9 @@ mod gtk3; #[cfg(all(feature = "gtk3", feature = "wayland"))] pub use self::gtk3::Gtk3ActivationToken; -#[cfg(all(feature = "gtk4", feature = "wayland"))] +#[cfg(feature = "gtk4")] mod gtk4; -#[cfg(all(feature = "gtk4", feature = "wayland"))] +#[cfg(feature = "gtk4")] pub use self::gtk4::Gtk4ActivationToken; #[cfg(any(feature = "wayland"))] @@ -25,7 +25,7 @@ pub enum ActivationToken { #[cfg(feature = "wayland")] #[doc(hidden)] Wayland(WaylandActivationToken), - #[cfg(all(feature = "gtk4", feature = "wayland"))] + #[cfg(feature = "gtk4")] #[doc(hidden)] Gtk4(Gtk4ActivationToken), #[cfg(all(feature = "gtk3", feature = "wayland"))] @@ -54,15 +54,15 @@ impl ActivationToken { Ok(Self::Wayland(token)) } - #[cfg(all(feature = "gtk4", feature = "wayland"))] - pub fn from_native(native: &impl ::gtk4::glib::IsA<::gtk4::Native>) -> Option { + #[cfg(feature = "gtk4")] + pub fn from_native>(native: &N) -> Option { let token = Gtk4ActivationToken::from_native(native)?; Some(Self::Gtk4(token)) } #[cfg(all(feature = "gtk3", feature = "wayland"))] - pub fn from_window(window: &impl ::gtk3::glib::IsA<::gtk3::gdk::Window>) -> Option { + pub fn from_window(window: &impl ::gtk3::glib::IsA<::gtk3::gdk::Root>) -> Option { let token = Gtk3ActivationToken::from_window(window)?; Some(Self::Gtk3(token)) @@ -72,7 +72,7 @@ impl ActivationToken { match self { #[cfg(feature = "wayland")] Self::Wayland(activation_token) => activation_token.token.as_str(), - #[cfg(all(feature = "gtk4", feature = "wayland"))] + #[cfg(feature = "gtk4")] Self::Gtk4(activation_token) => activation_token.token.as_str(), #[cfg(all(feature = "gtk3", feature = "wayland"))] Self::Gtk3(activation_token) => activation_token.token.as_str(), diff --git a/src/activation_token/wayland.rs b/src/activation_token/wayland.rs index 6197164dd..2b30c6eed 100644 --- a/src/activation_token/wayland.rs +++ b/src/activation_token/wayland.rs @@ -25,7 +25,9 @@ impl WaylandActivationToken { let wl_activation = XdgActivationV1::from_id(&cnx, surface.id()).unwrap(); let mut queue = cnx.new_event_queue(); let queue_handle = queue.handle(); - let inner = wl_activation.get_activation_token(&queue_handle, ()).unwrap(); + let inner = wl_activation + .get_activation_token(&queue_handle, ()) + .unwrap(); let mut exported_token = ExportedActivationToken::default(); queue.blocking_dispatch(&mut exported_token).unwrap();