aboutsummaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/mod.rs3
-rw-r--r--src/protocols/mutter_x11_interop.rs93
-rw-r--r--src/protocols/raw.rs25
3 files changed, 121 insertions, 0 deletions
diff --git a/src/protocols/mod.rs b/src/protocols/mod.rs
index a58b48bf..3328fb7c 100644
--- a/src/protocols/mod.rs
+++ b/src/protocols/mod.rs
@@ -1,4 +1,7 @@
pub mod foreign_toplevel;
pub mod gamma_control;
+pub mod mutter_x11_interop;
pub mod output_management;
pub mod screencopy;
+
+pub mod raw;
diff --git a/src/protocols/mutter_x11_interop.rs b/src/protocols/mutter_x11_interop.rs
new file mode 100644
index 00000000..cce41f15
--- /dev/null
+++ b/src/protocols/mutter_x11_interop.rs
@@ -0,0 +1,93 @@
+use mutter_x11_interop::MutterX11Interop;
+use smithay::reexports::wayland_server::{
+ Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource,
+};
+
+use super::raw::mutter_x11_interop::v1::server::mutter_x11_interop;
+
+const VERSION: u32 = 1;
+
+pub struct MutterX11InteropManagerState {}
+
+pub struct MutterX11InteropManagerGlobalData {
+ filter: Box<dyn for<'c> Fn(&'c Client) -> bool + Send + Sync>,
+}
+
+pub trait MutterX11InteropHandler {}
+
+impl MutterX11InteropManagerState {
+ pub fn new<D, F>(display: &DisplayHandle, filter: F) -> Self
+ where
+ D: GlobalDispatch<MutterX11Interop, MutterX11InteropManagerGlobalData>,
+ D: Dispatch<MutterX11Interop, ()>,
+ D: MutterX11InteropHandler,
+ D: 'static,
+ F: for<'c> Fn(&'c Client) -> bool + Send + Sync + 'static,
+ {
+ let global_data = MutterX11InteropManagerGlobalData {
+ filter: Box::new(filter),
+ };
+ display.create_global::<D, MutterX11Interop, _>(VERSION, global_data);
+
+ Self {}
+ }
+}
+
+impl<D> GlobalDispatch<MutterX11Interop, MutterX11InteropManagerGlobalData, D>
+ for MutterX11InteropManagerState
+where
+ D: GlobalDispatch<MutterX11Interop, MutterX11InteropManagerGlobalData>,
+ D: Dispatch<MutterX11Interop, ()>,
+ D: MutterX11InteropHandler,
+ D: 'static,
+{
+ fn bind(
+ _state: &mut D,
+ _handle: &DisplayHandle,
+ _client: &Client,
+ manager: New<MutterX11Interop>,
+ _manager_state: &MutterX11InteropManagerGlobalData,
+ data_init: &mut DataInit<'_, D>,
+ ) {
+ data_init.init(manager, ());
+ }
+
+ fn can_view(client: Client, global_data: &MutterX11InteropManagerGlobalData) -> bool {
+ (global_data.filter)(&client)
+ }
+}
+
+impl<D> Dispatch<MutterX11Interop, (), D> for MutterX11InteropManagerState
+where
+ D: Dispatch<MutterX11Interop, ()>,
+ D: MutterX11InteropHandler,
+ D: 'static,
+{
+ fn request(
+ _state: &mut D,
+ _client: &Client,
+ _resource: &MutterX11Interop,
+ request: <MutterX11Interop as Resource>::Request,
+ _data: &(),
+ _dhandle: &DisplayHandle,
+ _data_init: &mut DataInit<'_, D>,
+ ) {
+ match request {
+ mutter_x11_interop::Request::Destroy => (),
+ mutter_x11_interop::Request::SetX11Parent { .. } => (),
+ }
+ }
+}
+
+#[macro_export]
+macro_rules! delegate_mutter_x11_interop {
+ ($(@<$( $lt:tt $( : $clt:tt $(+ $dlt:tt )* )? ),+>)? $ty: ty) => {
+ smithay::reexports::wayland_server::delegate_global_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
+ $crate::protocols::raw::mutter_x11_interop::v1::server::mutter_x11_interop::MutterX11Interop: $crate::protocols::mutter_x11_interop::MutterX11InteropManagerGlobalData
+ ] => $crate::protocols::mutter_x11_interop::MutterX11InteropManagerState);
+
+ smithay::reexports::wayland_server::delegate_dispatch!($(@< $( $lt $( : $clt $(+ $dlt )* )? ),+ >)? $ty: [
+ $crate::protocols::raw::mutter_x11_interop::v1::server::mutter_x11_interop::MutterX11Interop: ()
+ ] => $crate::protocols::mutter_x11_interop::MutterX11InteropManagerState);
+ };
+}
diff --git a/src/protocols/raw.rs b/src/protocols/raw.rs
new file mode 100644
index 00000000..fac1e4df
--- /dev/null
+++ b/src/protocols/raw.rs
@@ -0,0 +1,25 @@
+pub mod mutter_x11_interop {
+ pub mod v1 {
+ pub use self::generated::server;
+
+ mod generated {
+ pub mod server {
+ #![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)]
+
+ use smithay::reexports::wayland_server;
+ use wayland_server::protocol::*;
+
+ pub mod __interfaces {
+ use smithay::reexports::wayland_server;
+ use wayland_server::protocol::__interfaces::*;
+ wayland_scanner::generate_interfaces!("resources/mutter-x11-interop.xml");
+ }
+ use self::__interfaces::*;
+
+ wayland_scanner::generate_server_code!("resources/mutter-x11-interop.xml");
+ }
+ }
+ }
+}