state: add node_at helper
This commit is contained in:
parent
c5b7c44000
commit
bae92d90d0
4 changed files with 34 additions and 41 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
23
src/state.rs
23
src/state.rs
|
|
@ -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)]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue