aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/gnome_shell_screenshot.rs57
-rw-r--r--src/dbus/mod.rs1
2 files changed, 58 insertions, 0 deletions
diff --git a/src/dbus/gnome_shell_screenshot.rs b/src/dbus/gnome_shell_screenshot.rs
new file mode 100644
index 00000000..fad3649b
--- /dev/null
+++ b/src/dbus/gnome_shell_screenshot.rs
@@ -0,0 +1,57 @@
+use std::path::PathBuf;
+
+use smithay::reexports::calloop;
+use zbus::{dbus_interface, fdo};
+
+pub struct Screenshot {
+ to_niri: calloop::channel::Sender<ScreenshotToNiri>,
+ from_niri: async_channel::Receiver<NiriToScreenshot>,
+}
+
+pub enum ScreenshotToNiri {
+ TakeScreenshot { include_cursor: bool },
+}
+
+pub enum NiriToScreenshot {
+ ScreenshotResult(Option<PathBuf>),
+}
+
+#[dbus_interface(name = "org.gnome.Shell.Screenshot")]
+impl Screenshot {
+ async fn screenshot(
+ &self,
+ include_cursor: bool,
+ _flash: bool,
+ _filename: PathBuf,
+ ) -> fdo::Result<(bool, PathBuf)> {
+ if let Err(err) = self
+ .to_niri
+ .send(ScreenshotToNiri::TakeScreenshot { include_cursor })
+ {
+ warn!("error sending message to niri: {err:?}");
+ return Err(fdo::Error::Failed("internal error".to_owned()));
+ }
+
+ let filename = match self.from_niri.recv().await {
+ Ok(NiriToScreenshot::ScreenshotResult(Some(filename))) => filename,
+ Ok(NiriToScreenshot::ScreenshotResult(None)) => {
+ return Err(fdo::Error::Failed("internal error".to_owned()));
+ }
+ Err(err) => {
+ warn!("error receiving message from niri: {err:?}");
+ return Err(fdo::Error::Failed("internal error".to_owned()));
+ }
+ };
+
+ Ok((true, filename))
+ }
+}
+
+impl Screenshot {
+ pub fn new(
+ to_niri: calloop::channel::Sender<ScreenshotToNiri>,
+ from_niri: async_channel::Receiver<NiriToScreenshot>,
+ ) -> Self {
+ Self { to_niri, from_niri }
+ }
+}
diff --git a/src/dbus/mod.rs b/src/dbus/mod.rs
index 84a8bc30..459af258 100644
--- a/src/dbus/mod.rs
+++ b/src/dbus/mod.rs
@@ -1,3 +1,4 @@
+pub mod gnome_shell_screenshot;
pub mod mutter_display_config;
pub mod mutter_screen_cast;
pub mod mutter_service_channel;