diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-20 09:28:23 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2023-09-20 09:28:23 +0400 |
| commit | 1963aaa7755759442a2d25fffdc5af0938bf7c78 (patch) | |
| tree | bf72eb6d7a1e0ed3241b4b469e761cedb26465bd /src/dbus | |
| parent | 8b4f2cf4834a1fc4e6c72c70a4d64ed0236c05e7 (diff) | |
| download | niri-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.rs | 57 | ||||
| -rw-r--r-- | src/dbus/mod.rs | 1 |
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; |
