server: allow moving and closing windows through decorations with touch

This commit is contained in:
Shawn Wallace 2025-11-28 16:19:07 -05:00
parent f997e81ee7
commit c7d96d52f5
2 changed files with 23 additions and 15 deletions

View file

@ -425,7 +425,6 @@ impl<S: X11Selection> Dispatch<WlTouch, Entity> for InnerServerState<S> {
.get::<&client::wl_touch::WlTouch>(*entity) .get::<&client::wl_touch::WlTouch>(*entity)
.unwrap() .unwrap()
.release(); .release();
state.world.despawn(*entity).unwrap();
} }
_ => unreachable!(), _ => unreachable!(),
} }
@ -466,16 +465,15 @@ impl<S: X11Selection> Dispatch<WlSeat, Entity> for InnerServerState<S> {
state.world.insert(*entity, (client, server)).unwrap(); state.world.insert(*entity, (client, server)).unwrap();
} }
Request::<WlSeat>::GetTouch { id } => { Request::<WlSeat>::GetTouch { id } => {
let new_entity = state.world.reserve_entity();
let client = { let client = {
state state
.world .world
.get::<&client::wl_seat::WlSeat>(*entity) .get::<&client::wl_seat::WlSeat>(*entity)
.unwrap() .unwrap()
.get_touch(&state.qh, new_entity) .get_touch(&state.qh, *entity)
}; };
let server = data_init.init(id, new_entity); let server = data_init.init(id, *entity);
state.world.spawn_at(new_entity, (client, server)); state.world.insert(*entity, (client, server)).unwrap();
} }
other => warn!("unhandled seat request: {other:?}"), other => warn!("unhandled seat request: {other:?}"),
} }

View file

@ -934,27 +934,37 @@ impl Event for client::wl_touch::Event {
} => { } => {
let mut cmd = CommandBuffer::new(); let mut cmd = CommandBuffer::new();
{ {
let mut s_query = surface.data().copied().and_then(|key| { let s_entity = surface.data().copied();
let mut s_query = s_entity.and_then(|key| {
state state
.world .world
.query_one::<(&WlSurface, &SurfaceScaleFactor)>(key) .query_one::<(&WlSurface, &SurfaceScaleFactor)>(key)
.ok() .ok()
}); });
let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) else { if let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) {
return; cmd.insert_one(target, *s_factor);
};
cmd.insert(target, (*s_factor,));
let touch = state.world.get::<&WlTouch>(target).unwrap(); let touch = state.world.get::<&WlTouch>(target).unwrap();
touch.down(serial, time, s_surface, id, x * s_factor.0, y * s_factor.0); touch.down(serial, time, s_surface, id, x * s_factor.0, y * s_factor.0);
} else if let Some(&DecorationMarker { parent }) = surface.data() {
drop(s_query);
let seat = {
let seat =
&*state.world.get::<&client::wl_seat::WlSeat>(target).unwrap();
seat.clone()
};
decoration::handle_pointer_motion(state, parent, x, y);
decoration::handle_pointer_click(state, parent, &seat, serial);
}
} }
cmd.run_on(&mut state.world); cmd.run_on(&mut state.world);
} }
Self::Motion { time, id, x, y } => { Self::Motion { time, id, x, y } => {
let (touch, scale) = state let Ok((touch, scale)) = state
.world .world
.query_one_mut::<(&WlTouch, &SurfaceScaleFactor)>(target) .query_one_mut::<(&WlTouch, &SurfaceScaleFactor)>(target)
.unwrap(); else {
return;
};
touch.motion(time, id, x * scale.0, y * scale.0); touch.motion(time, id, x * scale.0, y * scale.0);
} }
_ => { _ => {