server: impl Deref(Mut) for ServerState to Inner coercion

This commit is contained in:
En-En 2025-08-05 15:31:37 +00:00 committed by Supreeeme
parent fe28bcb880
commit cbabd591a3
4 changed files with 121 additions and 240 deletions

View file

@ -88,7 +88,8 @@ impl Event for SurfaceEvents {
SurfaceEvents::Popup(event) => Self::popup_event(event, target, state),
SurfaceEvents::FractionalScale(event) => match event {
wp_fractional_scale_v1::Event::PreferredScale { scale } => {
let entity = state.inner.world.entity(target).unwrap();
let state = state.deref_mut();
let entity = state.world.entity(target).unwrap();
let factor = scale as f64 / 120.0;
debug!(
"{} scale factor: {}",
@ -100,14 +101,14 @@ impl Event for SurfaceEvents {
if let Some(OnOutput(output)) = entity.get::<&OnOutput>().as_deref().copied() {
if update_output_scale(
state.inner.world.query_one(output).unwrap(),
state.world.query_one(output).unwrap(),
OutputScaleFactor::Fractional(factor),
) {
state.inner.updated_outputs.push(output);
state.updated_outputs.push(output);
}
}
if entity.has::<WindowData>() {
update_surface_viewport(state.inner.world.query_one(target).unwrap());
update_surface_viewport(state.world.query_one(target).unwrap());
}
}
_ => unreachable!(),
@ -416,18 +417,13 @@ pub(super) fn update_surface_viewport(
impl Event for client::wl_buffer::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
// The only event from a buffer would be the release.
state
.inner
.world
.get::<&WlBuffer>(target)
.unwrap()
.release();
state.world.get::<&WlBuffer>(target).unwrap().release();
}
}
impl Event for client::wl_seat::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state.inner.world.get::<&WlSeat>(target).unwrap();
let server = state.world.get::<&WlSeat>(target).unwrap();
simple_event_shunt! {
server, self => [
Capabilities { |capabilities| convert_wenum(capabilities) },
@ -457,12 +453,13 @@ impl Event for client::wl_pointer::Event {
surface_x,
surface_y,
} => {
let connection = &mut state.connection;
let state = &mut state.inner;
let mut cmd = CommandBuffer::new();
let pending_enter = state.inner.world.remove_one::<PendingEnter>(target).ok();
let server = state.inner.world.get::<&WlPointer>(target).unwrap();
let pending_enter = state.world.remove_one::<PendingEnter>(target).ok();
let server = state.world.get::<&WlPointer>(target).unwrap();
let mut query = surface.data().copied().and_then(|e| {
state
.inner
.world
.query_one::<(&WlSurface, &SurfaceRole, &SurfaceScaleFactor, &x::Window)>(e)
.ok()
@ -479,9 +476,9 @@ impl Event for client::wl_pointer::Event {
let mut do_enter = || {
debug!("pointer entering {} ({serial} {})", surface.id(), scale.0);
server.enter(serial, surface, surface_x * scale.0, surface_y * scale.0);
state.connection.raise_to_top(*window);
connection.raise_to_top(*window);
if !surface_is_popup {
state.inner.last_hovered = Some(*window);
state.last_hovered = Some(*window);
}
};
@ -510,22 +507,21 @@ impl Event for client::wl_pointer::Event {
}
drop(query);
drop(server);
cmd.run_on(&mut state.inner.world);
cmd.run_on(&mut state.world);
}
client::wl_pointer::Event::Leave { serial, surface } => {
let _ = state.inner.world.remove_one::<PendingEnter>(target);
let _ = state.world.remove_one::<PendingEnter>(target);
if !surface.is_alive() {
return;
}
debug!("leaving surface ({serial})");
let _ = state.inner.world.remove_one::<PendingEnter>(target);
let _ = state.world.remove_one::<PendingEnter>(target);
if let Some(surface) = surface
.data()
.copied()
.and_then(|key| state.inner.world.get::<&WlSurface>(key).ok())
.and_then(|key| state.world.get::<&WlSurface>(key).ok())
{
state
.inner
.world
.get::<&WlPointer>(target)
.unwrap()
@ -539,7 +535,7 @@ impl Event for client::wl_pointer::Event {
surface_x,
surface_y,
} => {
let pending_enter = state.inner.world.get::<&PendingEnter>(target).ok();
let pending_enter = state.world.get::<&PendingEnter>(target).ok();
match pending_enter.as_deref() {
Some(p) => {
let PendingEnter(client::wl_pointer::Event::Enter {
@ -554,7 +550,7 @@ impl Event for client::wl_pointer::Event {
if surface
.data()
.copied()
.is_some_and(|key| state.inner.world.contains(key))
.is_some_and(|key| state.world.contains(key))
{
trace!("resending enter ({serial}) before motion");
let enter_event = client::wl_pointer::Event::Enter {
@ -574,7 +570,6 @@ impl Event for client::wl_pointer::Event {
None => {
drop(pending_enter);
let (server, scale) = state
.inner
.world
.query_one_mut::<(&WlPointer, &SurfaceScaleFactor)>(target)
.unwrap();
@ -589,7 +584,7 @@ impl Event for client::wl_pointer::Event {
}
}
_ => {
let server = state.inner.world.get::<&WlPointer>(target).unwrap();
let server = state.world.get::<&WlPointer>(target).unwrap();
simple_event_shunt! {
server, self => [
Frame,
@ -632,7 +627,7 @@ impl Event for client::wl_pointer::Event {
impl Event for client::wl_keyboard::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let data = state.world.entity(target).unwrap();
let keyboard = data.get::<&WlKeyboard>().unwrap();
match self {
@ -723,7 +718,7 @@ impl Event for client::wl_keyboard::Event {
impl Event for client::wl_touch::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
match self {
Self::Down {
serial,
@ -1039,7 +1034,7 @@ impl OutputEvent {
y,
state,
);
let state = state.inner_mut();
let state = state.deref_mut();
let (output, dimensions, xdg) = state
.world
@ -1081,7 +1076,7 @@ impl OutputEvent {
height,
refresh,
} => {
let state = state.inner_mut();
let state = state.deref_mut();
let (output, dimensions) = state
.world
.query_one_mut::<(&WlOutput, &mut OutputDimensions)>(target)
@ -1098,7 +1093,7 @@ impl OutputEvent {
output.mode(convert_wenum(flags), width, height, refresh);
}
Event::Scale { factor } => {
let state = state.inner_mut();
let state = state.deref_mut();
debug!(
"{} scale: {factor}",
state.world.get::<&WlOutput>(target).unwrap().id()
@ -1114,7 +1109,7 @@ impl OutputEvent {
}
}
Event::Name { name } => {
let state = state.inner_mut();
let state = state.deref_mut();
state
.world
.get::<&WlOutput>(target)
@ -1123,7 +1118,7 @@ impl OutputEvent {
state.world.insert(target, (OutputName(name),)).unwrap();
}
_ => simple_event_shunt! {
state.inner.world.get::<&WlOutput>(target).unwrap(),
state.world.get::<&WlOutput>(target).unwrap(),
event: client::wl_output::Event => [
Description { description },
Done
@ -1142,7 +1137,7 @@ impl OutputEvent {
match event {
Event::LogicalPosition { x, y } => {
update_output_offset(target, OutputDimensionsSource::Xdg, x, y, state);
let state = state.inner_mut();
let state = state.deref_mut();
state
.world
.get::<&XdgOutputServer>(target)
@ -1153,7 +1148,7 @@ impl OutputEvent {
);
}
Event::LogicalSize { .. } => {
let state = state.inner_mut();
let state = state.deref_mut();
let (xdg, dimensions) = state
.world
.query_one_mut::<(&XdgOutputServer, &OutputDimensions)>(target)
@ -1165,7 +1160,7 @@ impl OutputEvent {
}
}
_ => simple_event_shunt! {
state.inner.world.get::<&XdgOutputServer>(target).unwrap(),
state.world.get::<&XdgOutputServer>(target).unwrap(),
event: zxdg_output_v1::Event => [
Done,
Name { name },
@ -1178,7 +1173,7 @@ impl OutputEvent {
impl Event for wl_drm::client::wl_drm::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state.inner.world.get::<&WlDrmServer>(target).unwrap();
let server = state.world.get::<&WlDrmServer>(target).unwrap();
simple_event_shunt! {
server, self => [
Device { name },
@ -1193,7 +1188,6 @@ impl Event for wl_drm::client::wl_drm::Event {
impl Event for c_dmabuf::zwp_linux_dmabuf_feedback_v1::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state
.inner
.world
.get::<&s_dmabuf::zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1>(target)
.unwrap();
@ -1213,11 +1207,7 @@ impl Event for c_dmabuf::zwp_linux_dmabuf_feedback_v1::Event {
impl Event for zwp_relative_pointer_v1::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state
.inner
.world
.get::<&RelativePointerServer>(target)
.unwrap();
let server = state.world.get::<&RelativePointerServer>(target).unwrap();
simple_event_shunt! {
server, self => [
RelativeMotion {
@ -1235,11 +1225,7 @@ impl Event for zwp_relative_pointer_v1::Event {
impl Event for zwp_locked_pointer_v1::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state
.inner
.world
.get::<&LockedPointerServer>(target)
.unwrap();
let server = state.world.get::<&LockedPointerServer>(target).unwrap();
simple_event_shunt! {
server, self => [
Locked,
@ -1251,11 +1237,7 @@ impl Event for zwp_locked_pointer_v1::Event {
impl Event for zwp_confined_pointer_v1::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let server = state
.inner
.world
.get::<&ConfinedPointerServer>(target)
.unwrap();
let server = state.world.get::<&ConfinedPointerServer>(target).unwrap();
simple_event_shunt! {
server, self => [
Confined,
@ -1267,7 +1249,7 @@ impl Event for zwp_confined_pointer_v1::Event {
impl Event for zwp_tablet_seat_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let seat = state.world.get::<&TabletSeatServer>(target).unwrap();
match self {
Self::TabletAdded { id } => {
@ -1295,7 +1277,7 @@ impl Event for zwp_tablet_seat_v2::Event {
impl Event for zwp_tablet_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let tab = state.inner.world.get::<&TabletServer>(target).unwrap();
let tab = state.world.get::<&TabletServer>(target).unwrap();
simple_event_shunt! {
tab, self => [
Name { name },
@ -1310,7 +1292,7 @@ impl Event for zwp_tablet_v2::Event {
impl Event for zwp_tablet_pad_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let pad = state.world.get::<&TabletPadServer>(target).unwrap();
let s_surf;
match self {
@ -1364,7 +1346,7 @@ impl Event for zwp_tablet_pad_v2::Event {
impl Event for zwp_tablet_tool_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
match self {
Self::ProximityIn {
serial,
@ -1465,7 +1447,7 @@ where
impl Event for zwp_tablet_pad_group_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let group = state.world.get::<&TabletPadGroupServer>(target).unwrap();
match self {
Self::Buttons { buttons } => group.buttons(buttons),
@ -1494,7 +1476,7 @@ impl Event for zwp_tablet_pad_group_v2::Event {
impl Event for zwp_tablet_pad_ring_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let ring = state.world.get::<&TabletPadRingServer>(target).unwrap();
simple_event_shunt! {
ring, self => [
@ -1509,7 +1491,7 @@ impl Event for zwp_tablet_pad_ring_v2::Event {
impl Event for zwp_tablet_pad_strip_v2::Event {
fn handle<C: XConnection>(self, target: Entity, state: &mut ServerState<C>) {
let state = state.inner_mut();
let state = state.deref_mut();
let strip = state.world.get::<&TabletPadStripServer>(target).unwrap();
simple_event_shunt! {
strip, self => [