aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2023-09-03 07:31:44 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2023-09-03 07:31:44 +0400
commit14729f772bfc049cfe04d43b5a5ab7186c2bc021 (patch)
tree1529d773c747a8f865ad87f28c9df50cf908275c /src
parent2c1d2ce0d33401990734d07d5910def97dc82998 (diff)
downloadniri-14729f772bfc049cfe04d43b5a5ab7186c2bc021.tar.gz
niri-14729f772bfc049cfe04d43b5a5ab7186c2bc021.tar.bz2
niri-14729f772bfc049cfe04d43b5a5ab7186c2bc021.zip
Add suspend key handling
Diffstat (limited to 'src')
-rw-r--r--src/input.rs17
-rw-r--r--src/tty.rs14
-rw-r--r--src/winit.rs1
3 files changed, 28 insertions, 4 deletions
diff --git a/src/input.rs b/src/input.rs
index 05a7d0f1..7dc34b31 100644
--- a/src/input.rs
+++ b/src/input.rs
@@ -24,6 +24,7 @@ enum Action {
None,
Quit,
ChangeVt(i32),
+ Suspend,
Spawn(String),
Screenshot,
CloseWindow,
@@ -57,6 +58,7 @@ enum Action {
pub enum BackendAction {
None,
ChangeVt(i32),
+ Suspend,
Screenshot,
}
@@ -78,9 +80,15 @@ fn action(comp_mod: CompositorMod, keysym: KeysymHandle, mods: ModifiersState) -
use keysyms::*;
let modified = keysym.modified_sym();
- if matches!(modified, KEY_XF86Switch_VT_1..=KEY_XF86Switch_VT_12) {
- let vt = (modified - KEY_XF86Switch_VT_1 + 1) as i32;
- return Action::ChangeVt(vt);
+
+ #[allow(non_upper_case_globals)] // wat
+ match modified {
+ modified @ KEY_XF86Switch_VT_1..=KEY_XF86Switch_VT_12 => {
+ let vt = (modified - KEY_XF86Switch_VT_1 + 1) as i32;
+ return Action::ChangeVt(vt);
+ }
+ KEY_XF86PowerOff => return Action::Suspend,
+ _ => (),
}
let mod_down = match comp_mod {
@@ -182,6 +190,9 @@ impl Niri {
Action::ChangeVt(vt) => {
return BackendAction::ChangeVt(vt);
}
+ Action::Suspend => {
+ return BackendAction::Suspend;
+ }
Action::Spawn(command) => {
if let Err(err) = Command::new(command).spawn() {
warn!("error spawning alacritty: {err}");
diff --git a/src/tty.rs b/src/tty.rs
index 79b9e3c4..1fde9e96 100644
--- a/src/tty.rs
+++ b/src/tty.rs
@@ -3,7 +3,7 @@ use std::os::fd::FromRawFd;
use std::path::{Path, PathBuf};
use std::time::Duration;
-use anyhow::anyhow;
+use anyhow::{anyhow, Context};
use smithay::backend::allocator::dmabuf::Dmabuf;
use smithay::backend::allocator::gbm::{GbmAllocator, GbmBufferFlags, GbmDevice};
use smithay::backend::allocator::{Format as DrmFormat, Fourcc};
@@ -179,6 +179,11 @@ impl Tty {
match niri.process_input_event(CompositorMod::Super, event) {
BackendAction::None => (),
BackendAction::ChangeVt(vt) => tty.change_vt(vt),
+ BackendAction::Suspend => {
+ if let Err(err) = suspend() {
+ warn!("error suspending: {err:?}");
+ }
+ }
BackendAction::Screenshot => {
let active = niri.monitor_set.active_output().cloned();
if let Some(active) = active {
@@ -609,3 +614,10 @@ fn refresh_interval(mode: DrmMode) -> Duration {
let refresh_interval = (numerator + denominator / 2) / denominator;
Duration::from_nanos(refresh_interval)
}
+
+fn suspend() -> anyhow::Result<()> {
+ let conn = zbus::blocking::Connection::system().context("error connecting to system bus")?;
+ let manager = logind_zbus::manager::ManagerProxyBlocking::new(&conn)
+ .context("error creating login manager proxy")?;
+ manager.suspend(true).context("error suspending")
+}
diff --git a/src/winit.rs b/src/winit.rs
index 69fad6ee..7148f961 100644
--- a/src/winit.rs
+++ b/src/winit.rs
@@ -149,6 +149,7 @@ impl Winit {
match niri.process_input_event(CompositorMod::Alt, event) {
BackendAction::None => (),
BackendAction::ChangeVt(_) => (),
+ BackendAction::Suspend => (),
BackendAction::Screenshot => {
let active = niri.monitor_set.active_output().cloned();
if let Some(active) = active {