Skip to content

Commit c7d96d5

Browse files
committed
server: allow moving and closing windows through decorations with touch
1 parent f997e81 commit c7d96d5

2 files changed

Lines changed: 23 additions & 15 deletions

File tree

src/server/dispatch.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,6 @@ impl<S: X11Selection> Dispatch<WlTouch, Entity> for InnerServerState<S> {
425425
.get::<&client::wl_touch::WlTouch>(*entity)
426426
.unwrap()
427427
.release();
428-
state.world.despawn(*entity).unwrap();
429428
}
430429
_ => unreachable!(),
431430
}
@@ -466,16 +465,15 @@ impl<S: X11Selection> Dispatch<WlSeat, Entity> for InnerServerState<S> {
466465
state.world.insert(*entity, (client, server)).unwrap();
467466
}
468467
Request::<WlSeat>::GetTouch { id } => {
469-
let new_entity = state.world.reserve_entity();
470468
let client = {
471469
state
472470
.world
473471
.get::<&client::wl_seat::WlSeat>(*entity)
474472
.unwrap()
475-
.get_touch(&state.qh, new_entity)
473+
.get_touch(&state.qh, *entity)
476474
};
477-
let server = data_init.init(id, new_entity);
478-
state.world.spawn_at(new_entity, (client, server));
475+
let server = data_init.init(id, *entity);
476+
state.world.insert(*entity, (client, server)).unwrap();
479477
}
480478
other => warn!("unhandled seat request: {other:?}"),
481479
}

src/server/event.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -934,27 +934,37 @@ impl Event for client::wl_touch::Event {
934934
} => {
935935
let mut cmd = CommandBuffer::new();
936936
{
937-
let mut s_query = surface.data().copied().and_then(|key| {
937+
let s_entity = surface.data().copied();
938+
let mut s_query = s_entity.and_then(|key| {
938939
state
939940
.world
940941
.query_one::<(&WlSurface, &SurfaceScaleFactor)>(key)
941942
.ok()
942943
});
943-
let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) else {
944-
return;
945-
};
946-
947-
cmd.insert(target, (*s_factor,));
948-
let touch = state.world.get::<&WlTouch>(target).unwrap();
949-
touch.down(serial, time, s_surface, id, x * s_factor.0, y * s_factor.0);
944+
if let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) {
945+
cmd.insert_one(target, *s_factor);
946+
let touch = state.world.get::<&WlTouch>(target).unwrap();
947+
touch.down(serial, time, s_surface, id, x * s_factor.0, y * s_factor.0);
948+
} else if let Some(&DecorationMarker { parent }) = surface.data() {
949+
drop(s_query);
950+
let seat = {
951+
let seat =
952+
&*state.world.get::<&client::wl_seat::WlSeat>(target).unwrap();
953+
seat.clone()
954+
};
955+
decoration::handle_pointer_motion(state, parent, x, y);
956+
decoration::handle_pointer_click(state, parent, &seat, serial);
957+
}
950958
}
951959
cmd.run_on(&mut state.world);
952960
}
953961
Self::Motion { time, id, x, y } => {
954-
let (touch, scale) = state
962+
let Ok((touch, scale)) = state
955963
.world
956964
.query_one_mut::<(&WlTouch, &SurfaceScaleFactor)>(target)
957-
.unwrap();
965+
else {
966+
return;
967+
};
958968
touch.motion(time, id, x * scale.0, y * scale.0);
959969
}
960970
_ => {

0 commit comments

Comments
 (0)