1
0
Fork 0
forked from wry/wry

config: add visibility window criteria

This commit is contained in:
Julian Orth 2025-05-01 18:35:29 +02:00
parent 8bb8b2a649
commit dcf57db3df
14 changed files with 50 additions and 3 deletions

View file

@ -1998,6 +1998,7 @@ impl ConfigProxyHandler {
mgr.client(&self.state, &self.get_client_matcher(*c)?.node)
}
WindowCriterionIpc::Floating => mgr.floating(),
WindowCriterionIpc::Visible => mgr.visible(),
};
let cached = Rc::new(CachedCriterion {
crit: criterion.clone(),

View file

@ -16,6 +16,7 @@ use {
tlmm_floating::TlmMatchFloating,
tlmm_kind::TlmMatchKind,
tlmm_string::{TlmMatchAppId, TlmMatchTitle},
tlmm_visible::TlmMatchVisible,
},
},
state::State,
@ -40,6 +41,7 @@ bitflags! {
TL_CHANGED_TITLE = 1 << 2,
TL_CHANGED_APP_ID = 1 << 3,
TL_CHANGED_FLOATING = 1 << 4,
TL_CHANGED_VISIBLE = 1 << 5,
}
type TlmFixedRootMatcher<T> = FixedRootMatcher<ToplevelData, T>;
@ -50,6 +52,7 @@ pub struct TlMatcherManager {
leaf_events: Rc<AsyncQueue<CritLeafEvent<ToplevelData>>>,
constant: TlmFixedRootMatcher<CritMatchConstant<ToplevelData>>,
floating: TlmFixedRootMatcher<TlmMatchFloating>,
visible: TlmFixedRootMatcher<TlmMatchVisible>,
matchers: Rc<RootMatchers>,
}
@ -101,6 +104,7 @@ impl TlMatcherManager {
Self {
constant: CritMatchConstant::create(&matchers, ids),
floating: bool!(TlmMatchFloating),
visible: bool!(TlmMatchVisible),
changes: Default::default(),
leaf_events: Default::default(),
ids: ids.clone(),
@ -168,6 +172,7 @@ impl TlMatcherManager {
conditional!(TL_CHANGED_TITLE, title);
conditional!(TL_CHANGED_APP_ID, app_id);
fixed_conditional!(TL_CHANGED_FLOATING, floating);
fixed_conditional!(TL_CHANGED_VISIBLE, visible);
false
}
@ -235,6 +240,7 @@ impl TlMatcherManager {
conditional!(TL_CHANGED_TITLE, title);
conditional!(TL_CHANGED_APP_ID, app_id);
fixed_conditional!(TL_CHANGED_FLOATING, floating);
fixed_conditional!(TL_CHANGED_VISIBLE, visible);
}
pub fn title(&self, string: CritLiteralOrRegex) -> Rc<TlmUpstreamNode> {
@ -256,6 +262,10 @@ impl TlMatcherManager {
pub fn client(&self, state: &Rc<State>, client: &Rc<ClmUpstreamNode>) -> Rc<TlmUpstreamNode> {
TlmMatchClient::new(state, client)
}
pub fn visible(&self) -> Rc<TlmUpstreamNode> {
self.visible[true].clone()
}
}
impl CritTarget for ToplevelData {

View file

@ -21,3 +21,4 @@ pub mod tlmm_client;
pub mod tlmm_floating;
pub mod tlmm_kind;
pub mod tlmm_string;
pub mod tlmm_visible;

View file

@ -0,0 +1,11 @@
use crate::{criteria::crit_graph::CritFixedRootCriterion, tree::ToplevelData};
pub struct TlmMatchVisible(pub bool);
fixed_root_criterion!(TlmMatchVisible, visible);
impl CritFixedRootCriterion<ToplevelData> for TlmMatchVisible {
fn matches(&self, data: &ToplevelData) -> bool {
data.visible.get()
}
}

View file

@ -5,7 +5,7 @@ use {
CritDestroyListener, CritMatcherId,
tlm::{
TL_CHANGED_APP_ID, TL_CHANGED_DESTROYED, TL_CHANGED_FLOATING, TL_CHANGED_NEW,
TL_CHANGED_TITLE, TlMatcherChange,
TL_CHANGED_TITLE, TL_CHANGED_VISIBLE, TlMatcherChange,
},
},
ifs::{
@ -631,7 +631,9 @@ impl ToplevelData {
}
pub fn set_visible(&self, node: &dyn Node, visible: bool) {
self.visible.set(visible);
if self.visible.replace(visible) != visible {
self.property_changed(TL_CHANGED_VISIBLE);
}
self.seat_state.set_visible(node, visible);
for sc in self.jay_screencasts.lock().values() {
sc.update_latch_listener();