aboutsummaryrefslogtreecommitdiff
path: root/src/window/mapped.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/window/mapped.rs
parentf3f02aca2058dd7adc4d75707ded2b5d8887a258 (diff)
downloadniri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.tar.gz
niri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.tar.bz2
niri-b7ed2fb82a19afe73e3e51ef2331ac6ad9c175a0.zip
Add is-active window rule matcher
Diffstat (limited to 'src/window/mapped.rs')
-rw-r--r--src/window/mapped.rs47
1 files changed, 43 insertions, 4 deletions
diff --git a/src/window/mapped.rs b/src/window/mapped.rs
index b5caf8e2..0d3a3ac1 100644
--- a/src/window/mapped.rs
+++ b/src/window/mapped.rs
@@ -1,5 +1,6 @@
use std::cmp::{max, min};
+use niri_config::WindowRule;
use smithay::backend::renderer::element::{AsRenderElements as _, Id};
use smithay::desktop::space::SpaceElement as _;
use smithay::desktop::Window;
@@ -11,7 +12,7 @@ use smithay::utils::{Logical, Point, Rectangle, Scale, Size, Transform};
use smithay::wayland::compositor::{send_surface_state, with_states};
use smithay::wayland::shell::xdg::{SurfaceCachedState, ToplevelSurface};
-use super::ResolvedWindowRules;
+use super::{ResolvedWindowRules, WindowRef};
use crate::layout::{LayoutElement, LayoutElementRenderElement};
use crate::niri::WindowOffscreenId;
use crate::render_helpers::renderer::NiriRenderer;
@@ -22,16 +23,47 @@ pub struct Mapped {
/// Up-to-date rules.
pub rules: ResolvedWindowRules,
+
+ /// Whether the window rules need to be recomputed.
+ ///
+ /// This is not used in all cases; for example, app ID and title changes recompute the rules
+ /// immediately, rather than setting this flag.
+ pub need_to_recompute_rules: bool,
}
impl Mapped {
pub fn new(window: Window, rules: ResolvedWindowRules) -> Self {
- Self { window, rules }
+ Self {
+ window,
+ rules,
+ need_to_recompute_rules: false,
+ }
}
pub fn toplevel(&self) -> &ToplevelSurface {
self.window.toplevel().expect("no X11 support")
}
+
+ /// Recomputes the resolved window rules and returns whether they changed.
+ pub fn recompute_window_rules(&mut self, rules: &[WindowRule]) -> bool {
+ self.need_to_recompute_rules = false;
+
+ let new_rules = ResolvedWindowRules::compute(rules, WindowRef::Mapped(self));
+ if new_rules == self.rules {
+ return false;
+ }
+
+ self.rules = new_rules;
+ true
+ }
+
+ pub fn recompute_window_rules_if_needed(&mut self, rules: &[WindowRule]) -> bool {
+ if !self.need_to_recompute_rules {
+ return false;
+ }
+
+ self.recompute_window_rules(rules)
+ }
}
impl LayoutElement for Mapped {
@@ -155,8 +187,15 @@ impl LayoutElement for Mapped {
data.0.replace(id);
}
- fn set_activated(&self, active: bool) {
- self.window.set_activated(active);
+ fn set_activated(&mut self, active: bool) {
+ let changed = self.toplevel().with_pending_state(|state| {
+ if active {
+ state.states.set(xdg_toplevel::State::Activated)
+ } else {
+ state.states.unset(xdg_toplevel::State::Activated)
+ }
+ });
+ self.need_to_recompute_rules |= changed;
}
fn set_bounds(&self, bounds: Size<i32, Logical>) {