Skip to content

Commit

Permalink
test gtk4
Browse files Browse the repository at this point in the history
  • Loading branch information
A6GibKm committed Jun 8, 2022
1 parent dfd187b commit 0deb5a5
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 59 deletions.
61 changes: 10 additions & 51 deletions src/activation_token/gtk4.rs
Original file line number Diff line number Diff line change
@@ -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<Self> {
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::<gdk4wayland::WaylandSurface>()
.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<N: glib::IsA<gdk::Display>>(native: &N) -> Option<Self> {
match native.backend() {
gdk::Backend::Wayland => native
.startup_notification_id()
.map(|token| Self {
token: token.to_string(),
}),
gdk::Backend::X11 => todo!(),
_ => None,
}
}
}

impl From<WaylandActivationToken> 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();
}
}
14 changes: 7 additions & 7 deletions src/activation_token/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"))]
Expand All @@ -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"))]
Expand Down Expand Up @@ -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<Self> {
#[cfg(feature = "gtk4")]
pub fn from_native<N: ::gtk4::glib::IsA<::gtk4::gdk::Display>>(native: &N) -> Option<Self> {
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<Self> {
pub fn from_window(window: &impl ::gtk3::glib::IsA<::gtk3::gdk::Root>) -> Option<Self> {
let token = Gtk3ActivationToken::from_window(window)?;

Some(Self::Gtk3(token))
Expand All @@ -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(),
Expand Down
4 changes: 3 additions & 1 deletion src/activation_token/wayland.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 0deb5a5

Please sign in to comment.