diff --git a/src/server/dispatch.rs b/src/server/dispatch.rs index 84a71ec..969b50a 100644 --- a/src/server/dispatch.rs +++ b/src/server/dispatch.rs @@ -425,7 +425,6 @@ impl Dispatch for InnerServerState { .get::<&client::wl_touch::WlTouch>(*entity) .unwrap() .release(); - state.world.despawn(*entity).unwrap(); } _ => unreachable!(), } @@ -466,16 +465,15 @@ impl Dispatch for InnerServerState { state.world.insert(*entity, (client, server)).unwrap(); } Request::::GetTouch { id } => { - let new_entity = state.world.reserve_entity(); let client = { state .world .get::<&client::wl_seat::WlSeat>(*entity) .unwrap() - .get_touch(&state.qh, new_entity) + .get_touch(&state.qh, *entity) }; - let server = data_init.init(id, new_entity); - state.world.spawn_at(new_entity, (client, server)); + let server = data_init.init(id, *entity); + state.world.insert(*entity, (client, server)).unwrap(); } other => warn!("unhandled seat request: {other:?}"), } diff --git a/src/server/event.rs b/src/server/event.rs index f4e9973..8221208 100644 --- a/src/server/event.rs +++ b/src/server/event.rs @@ -934,27 +934,37 @@ impl Event for client::wl_touch::Event { } => { 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 .world .query_one::<(&WlSurface, &SurfaceScaleFactor)>(key) .ok() }); - let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) else { - return; - }; - - cmd.insert(target, (*s_factor,)); - let touch = state.world.get::<&WlTouch>(target).unwrap(); - touch.down(serial, time, s_surface, id, x * s_factor.0, y * s_factor.0); + if let Some((s_surface, s_factor)) = s_query.as_mut().and_then(|q| q.get()) { + cmd.insert_one(target, *s_factor); + let touch = state.world.get::<&WlTouch>(target).unwrap(); + 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); } Self::Motion { time, id, x, y } => { - let (touch, scale) = state + let Ok((touch, scale)) = state .world .query_one_mut::<(&WlTouch, &SurfaceScaleFactor)>(target) - .unwrap(); + else { + return; + }; touch.motion(time, id, x * scale.0, y * scale.0); } _ => {