1
0
Fork 0
forked from wry/wry

state: add node_at helper

This commit is contained in:
Julian Orth 2025-07-01 08:23:16 +02:00
parent c5b7c44000
commit bae92d90d0
4 changed files with 34 additions and 41 deletions

View file

@ -334,6 +334,7 @@ fn start_compositor2(
tl_matcher_manager: TlMatcherManager::new(&crit_ids), tl_matcher_manager: TlMatcherManager::new(&crit_ids),
caps_thread, caps_thread,
toplevel_managers: Default::default(), toplevel_managers: Default::default(),
node_at_tree: Default::default(),
}); });
state.tracker.register(ClientId::from_raw(0)); state.tracker.register(ClientId::from_raw(0));
create_dummy_output(&state); create_dummy_output(&state);

View file

@ -547,21 +547,11 @@ impl PointerOwner for DndPointerOwner {
fn apply_changes(&self, seat: &Rc<WlSeatGlobal>) { fn apply_changes(&self, seat: &Rc<WlSeatGlobal>) {
let (x, y) = seat.pointer_cursor.position(); let (x, y) = seat.pointer_cursor.position();
let (x_int, y_int) = (x.round_down(), y.round_down()); let FoundNode {
let (node, x_int, y_int) = { node,
let mut found_tree = seat.found_tree.borrow_mut(); x: x_int,
found_tree.push(FoundNode { y: y_int,
node: seat.state.root.clone(), } = seat.state.node_at(x.round_down(), y.round_down());
x: x_int,
y: y_int,
});
seat.state
.root
.node_find_tree_at(x_int, y_int, &mut found_tree, FindTreeUsecase::None);
let FoundNode { node, x, y } = found_tree.pop().unwrap();
found_tree.clear();
(node, x, y)
};
let (x, y) = (x.apply_fract(x_int), y.apply_fract(y_int)); let (x, y) = (x.apply_fract(x_int), y.apply_fract(y_int));
let mut target = self.target.get(); let mut target = self.target.get();
if node.node_id() != target.node_id() { if node.node_id() != target.node_id() {

View file

@ -2,7 +2,7 @@ use {
crate::{ crate::{
fixed::Fixed, fixed::Fixed,
ifs::wl_seat::WlSeatGlobal, ifs::wl_seat::WlSeatGlobal,
tree::{FindTreeUsecase, FoundNode, Node}, tree::Node,
utils::{clonecell::CloneCell, smallmap::SmallMap}, utils::{clonecell::CloneCell, smallmap::SmallMap},
}, },
std::rc::Rc, std::rc::Rc,
@ -69,29 +69,14 @@ trait TouchOwner {
impl TouchOwner for DefaultTouchOwner { impl TouchOwner for DefaultTouchOwner {
fn down(&self, seat: &Rc<WlSeatGlobal>, time_usec: u64, id: i32, x: Fixed, y: Fixed) { fn down(&self, seat: &Rc<WlSeatGlobal>, time_usec: u64, id: i32, x: Fixed, y: Fixed) {
let mut found_tree = seat.found_tree.borrow_mut(); let node = seat.state.node_at(x.round_down(), y.round_down());
let x_int = x.round_down(); node.node.node_seat_state().touch_begin(seat);
let y_int = y.round_down(); let owner = Rc::new(GrabTouchOwner {
found_tree.push(FoundNode { node: node.node,
node: seat.state.root.clone(), down_ids: Default::default(),
x: x_int,
y: y_int,
}); });
seat.state seat.touch_owner.owner.set(owner.clone());
.root owner.down(seat, time_usec, id, x, y);
.node_find_tree_at(x_int, y_int, &mut found_tree, FindTreeUsecase::None);
let node = found_tree.pop();
found_tree.clear();
drop(found_tree);
if let Some(node) = node {
node.node.node_seat_state().touch_begin(seat);
let owner = Rc::new(GrabTouchOwner {
node: node.node,
down_ids: Default::default(),
});
seat.touch_owner.owner.set(owner.clone());
owner.down(seat, time_usec, id, x, y);
}
} }
fn up(&self, _seat: &Rc<WlSeatGlobal>, _time_usec: u64, _id: i32) { fn up(&self, _seat: &Rc<WlSeatGlobal>, _time_usec: u64, _id: i32) {

View file

@ -83,9 +83,10 @@ use {
theme::{Color, Theme}, theme::{Color, Theme},
time::Time, time::Time,
tree::{ tree::{
ContainerNode, ContainerSplit, Direction, DisplayNode, FloatNode, LatchListener, Node, ContainerNode, ContainerSplit, Direction, DisplayNode, FindTreeUsecase, FloatNode,
NodeIds, NodeVisitorBase, OutputNode, PlaceholderNode, TearingMode, ToplevelData, FoundNode, LatchListener, Node, NodeIds, NodeVisitorBase, OutputNode, PlaceholderNode,
ToplevelNode, ToplevelNodeBase, VrrMode, WorkspaceNode, generic_node_visitor, TearingMode, ToplevelData, ToplevelNode, ToplevelNodeBase, VrrMode, WorkspaceNode,
generic_node_visitor,
}, },
utils::{ utils::{
activation_token::ActivationToken, asyncevent::AsyncEvent, bindings::Bindings, activation_token::ActivationToken, asyncevent::AsyncEvent, bindings::Bindings,
@ -251,6 +252,7 @@ pub struct State {
pub cl_matcher_manager: ClMatcherManager, pub cl_matcher_manager: ClMatcherManager,
pub tl_matcher_manager: TlMatcherManager, pub tl_matcher_manager: TlMatcherManager,
pub caps_thread: Option<PrCapsThread>, pub caps_thread: Option<PrCapsThread>,
pub node_at_tree: RefCell<Vec<FoundNode>>,
} }
// impl Drop for State { // impl Drop for State {
@ -975,6 +977,7 @@ impl State {
self.workspace_managers.clear(); self.workspace_managers.clear();
self.cl_matcher_manager.clear(); self.cl_matcher_manager.clear();
self.tl_matcher_manager.clear(); self.tl_matcher_manager.clear();
self.node_at_tree.borrow_mut().clear();
} }
pub fn remove_toplevel_id(&self, id: ToplevelIdentifier) { pub fn remove_toplevel_id(&self, id: ToplevelIdentifier) {
@ -1400,6 +1403,20 @@ impl State {
pub fn initial_tile_state(&self, data: &ToplevelData) -> Option<TileState> { pub fn initial_tile_state(&self, data: &ToplevelData) -> Option<TileState> {
self.config.get()?.initial_tile_state(data) self.config.get()?.initial_tile_state(data)
} }
pub fn node_at(&self, x: i32, y: i32) -> FoundNode {
let mut found_tree = self.node_at_tree.borrow_mut();
found_tree.push(FoundNode {
node: self.root.clone(),
x,
y,
});
self.root
.node_find_tree_at(x, y, &mut found_tree, FindTreeUsecase::None);
let node = found_tree.pop().unwrap();
found_tree.clear();
node
}
} }
#[derive(Debug, Error)] #[derive(Debug, Error)]