server: allow moving and closing windows through decorations with touch
This commit is contained in:
parent
f997e81ee7
commit
c7d96d52f5
2 changed files with 23 additions and 15 deletions
|
|
@ -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:?}"),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue