aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-20 09:28:23 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-20 09:28:23 +0400
commit1963aaa7755759442a2d25fffdc5af0938bf7c78 (patch)
treebf72eb6d7a1e0ed3241b4b469e761cedb26465bd /src/dbus
parent8b4f2cf4834a1fc4e6c72c70a4d64ed0236c05e7 (diff)
downloadniri-1963aaa7755759442a2d25fffdc5af0938bf7c78.tar.gz
niri-1963aaa7755759442a2d25fffdc5af0938bf7c78.tar.bz2
niri-1963aaa7755759442a2d25fffdc5af0938bf7c78.zip
Add initial impl of org.gnome.Shell.Screenshot
Enough to make the portal all-outputs screenshot work. With this, Flameshot kinda-works.
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;