diff --git a/Cargo.lock b/Cargo.lock index 960428b..1f027e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "aho-corasick" @@ -247,6 +247,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "lazy_static" version = "1.4.0" @@ -385,18 +391,18 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -432,6 +438,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "scoped-tls" version = "1.0.1" @@ -440,24 +452,36 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "serde" -version = "1.0.163" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.163" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "serde_spanned" version = "0.6.2" @@ -518,9 +542,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "2.0.16" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -688,6 +712,7 @@ dependencies = [ "crossbeam-utils", "regex", "serde", + "serde_json", "smithay-client-toolkit", "toml", "tracing", diff --git a/Cargo.toml b/Cargo.toml index 162f1f5..4a8b6b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ clap = { version = "4.3.0", features = ["derive"] } crossbeam-utils = "0.8.15" regex = "1.8" serde = { version = "1.0.163", features = ["derive"] } +serde_json = "1.0.143" smithay-client-toolkit = "0.16.1" toml = "0.7.4" tracing = "0.1.37" diff --git a/README.md b/README.md index 3ce05a4..5d5bcc9 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,9 @@ timeout_ms = 250 # default # (Useful for debugging purposes when setting up several hot corners.) color = "#FFFF0000" # default +# Whether waycorner should work when fullscreen +disable_when_fullscreen = true # default + # Optional output config to specify what output to use. [main-monitor.output] # Regex to match output descriptions on. diff --git a/src/config.rs b/src/config.rs index f55791d..a141754 100644 --- a/src/config.rs +++ b/src/config.rs @@ -35,6 +35,10 @@ fn default_command() -> Vec { Vec::new() } +fn default_disable_when_fullscreen() -> bool { + true +} + fn from_hex<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, @@ -77,6 +81,8 @@ pub struct CornerConfig { pub timeout_ms: u16, #[serde(default = "default_color", deserialize_with = "from_hex")] pub color: u32, + #[serde(default = "default_disable_when_fullscreen")] + pub disable_when_fullscreen: bool, } #[derive(Clone, Debug, Deserialize)] diff --git a/src/corner.rs b/src/corner.rs index 817834a..dec519f 100644 --- a/src/corner.rs +++ b/src/corner.rs @@ -7,11 +7,13 @@ use std::{ Arc, Mutex, }, time::{Duration, Instant}, + env, }; use anyhow::Result; use regex::Regex; use tracing::{debug, info}; +use serde_json::{Value, from_slice}; use crate::config::CornerConfig; @@ -66,12 +68,16 @@ impl Corner { } Err(_error) => { if let Some(event) = last_event { - if event == CornerEvent::Enter { - self.execute_command(&self.config.enter_command)?; - } else if event == CornerEvent::Leave { - self.execute_command(&self.config.exit_command)?; + if self.config.disable_when_fullscreen && self.is_fullscreen() { + debug!("In fullscreen mode"); + } else { + if event == CornerEvent::Enter { + self.execute_command(&self.config.enter_command)?; + } else if event == CornerEvent::Leave { + self.execute_command(&self.config.exit_command)?; + } + command_done_at = Some(Instant::now()); } - command_done_at = Some(Instant::now()); } last_event = None; } @@ -108,6 +114,30 @@ impl Corner { .unwrap_or(true) } + pub fn is_fullscreen(&self) -> bool { + let desktop = env::var("XDG_CURRENT_DESKTOP") + .ok() + .map(|s| s.to_lowercase()); + match desktop.as_deref() { + Some("hyprland") => { + let status = Command::new("hyprctl") + .args(["activewindow", "-j"]) + .output() + .ok() + .and_then(|output| from_slice::(&output.stdout).ok()) + .unwrap() + .get("fullscreen") + .and_then(|v| v.as_i64()); + return status == Some(2); + }, + Some("sway") => { + // TODO: add sway equivalent + return false; + }, + _ => false + } + } + fn execute_command(&self, command: &[String]) -> Result<()> { if let Some(binary) = command.first() { let args = command