aboutsummaryrefslogtreecommitdiff
path: root/src/niri.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-23 14:38:07 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-23 15:45:44 +0400
commitb7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0 (patch)
tree8757c39889958bd6a8f87ac9089d8e5a7fd43a76 /src/niri.rs
parentf3f02aca2058dd7adc4d75707ded2b5d8887a258 (diff)
downloadniri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.tar.gz
niri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.tar.bz2
niri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.zip
Add is-active window rule matcher
Diffstat (limited to 'src/niri.rs')
-rw-r--r--src/niri.rs34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/niri.rs b/src/niri.rs
index 7984d3c4..5e425396 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -438,6 +438,7 @@ impl State {
self.update_keyboard_focus();
self.refresh_pointer_focus();
foreign_toplevel::refresh(self);
+ self.niri.refresh_window_rules();
self.niri.redraw_queued_outputs(&mut self.backend);
{
@@ -911,9 +912,9 @@ impl State {
let mut windows = vec![];
self.niri.layout.with_windows_mut(|mapped, _| {
- mapped.rules =
- ResolvedWindowRules::compute(window_rules, WindowRef::Mapped(mapped));
- windows.push(mapped.window.clone());
+ if mapped.recompute_window_rules(window_rules) {
+ windows.push(mapped.window.clone());
+ }
});
for win in windows {
self.niri.layout.update_window(&win);
@@ -2149,6 +2150,33 @@ impl Niri {
self.idle_notifier_state.set_is_inhibited(is_inhibited);
}
+ pub fn refresh_window_rules(&mut self) {
+ let _span = tracy_client::span!("Niri::refresh_window_rules");
+
+ let config = self.config.borrow();
+ let window_rules = &config.window_rules;
+
+ let mut windows = vec![];
+ let mut outputs = HashSet::new();
+ self.layout.with_windows_mut(|mapped, output| {
+ if mapped.recompute_window_rules_if_needed(window_rules) {
+ windows.push(mapped.window.clone());
+
+ if let Some(output) = output {
+ outputs.insert(output.clone());
+ }
+ }
+ });
+ drop(config);
+
+ for win in windows {
+ self.layout.update_window(&win);
+ }
+ for output in outputs {
+ self.queue_redraw(&output);
+ }
+ }
+
pub fn render<R: NiriRenderer>(
&self,
renderer: &mut R,