refactor (wayland): move seat to client

This commit is contained in:
Nova
2023-07-25 14:45:53 -04:00
parent 1047f5242b
commit 4ffab6580d
5 changed files with 17 additions and 18 deletions

View File

@@ -11,6 +11,7 @@ mod xdg_shell;
pub mod xwayland; pub mod xwayland;
use self::{state::WaylandState, surface::CORE_SURFACES}; use self::{state::WaylandState, surface::CORE_SURFACES};
use crate::wayland::seat::SeatData;
use crate::{core::task, wayland::state::ClientState}; use crate::{core::task, wayland::state::ClientState};
use color_eyre::eyre::{ensure, Result}; use color_eyre::eyre::{ensure, Result};
use global_counter::primitive::exact::CounterU32; use global_counter::primitive::exact::CounterU32;
@@ -146,9 +147,13 @@ impl Wayland {
} }
acc = listen_async.accept() => { // New client connected acc = listen_async.accept() => { // New client connected
let (stream, _) = acc?; let (stream, _) = acc?;
let client = dh2.insert_client(stream.into_std()?, Arc::new(ClientState::default()))?; let client_state = Arc::new(ClientState {
compositor_state: Default::default(),
state.lock().new_client(client.id(), &dh2); display: Arc::downgrade(&display),
seat: SeatData::new(&dh1)
});
let client = dh2.insert_client(stream.into_std()?, client_state.clone())?;
client_state.seat.client.set(client.id()).unwrap();
} }
e = dispatch_poll_listener.readable() => { // Dispatch e = dispatch_poll_listener.readable() => { // Dispatch
let mut guard = e?; let mut guard = e?;

View File

@@ -253,7 +253,7 @@ impl SurfaceInfo {
} }
pub struct SeatData { pub struct SeatData {
client: ClientId, pub client: OnceCell<ClientId>,
global_id: OnceCell<GlobalId>, global_id: OnceCell<GlobalId>,
surfaces: Mutex<FxHashMap<ObjectId, SurfaceInfo>>, surfaces: Mutex<FxHashMap<ObjectId, SurfaceInfo>>,
pointer: OnceCell<(WlPointer, Mutex<ObjectId>)>, pointer: OnceCell<(WlPointer, Mutex<ObjectId>)>,
@@ -261,9 +261,9 @@ pub struct SeatData {
touch: OnceCell<WlTouch>, touch: OnceCell<WlTouch>,
} }
impl SeatData { impl SeatData {
pub fn new(dh: &DisplayHandle, client: ClientId) -> Arc<Self> { pub fn new(dh: &DisplayHandle) -> Arc<Self> {
let seat_data = Arc::new(SeatData { let seat_data = Arc::new(SeatData {
client, client: OnceCell::new(),
global_id: OnceCell::new(), global_id: OnceCell::new(),
surfaces: Mutex::new(FxHashMap::default()), surfaces: Mutex::new(FxHashMap::default()),
pointer: OnceCell::new(), pointer: OnceCell::new(),
@@ -439,7 +439,8 @@ impl GlobalDispatch<WlSeat, Arc<SeatData>, WaylandState> for WaylandState {
} }
fn can_view(client: Client, data: &Arc<SeatData>) -> bool { fn can_view(client: Client, data: &Arc<SeatData>) -> bool {
client.id() == data.client let Some(seat_client) = data.client.get().cloned() else {return false};
client.id() == seat_client
} }
} }

View File

@@ -1,6 +1,5 @@
use crate::wayland::seat::SeatData; use crate::wayland::seat::SeatData;
use parking_lot::Mutex; use parking_lot::Mutex;
use rustc_hash::FxHashMap;
use smithay::{ use smithay::{
backend::{ backend::{
allocator::dmabuf::Dmabuf, allocator::dmabuf::Dmabuf,
@@ -37,10 +36,10 @@ use std::sync::{Arc, Weak};
use tokio::sync::mpsc::UnboundedSender; use tokio::sync::mpsc::UnboundedSender;
use tracing::{info, warn}; use tracing::{info, warn};
#[derive(Default)]
pub struct ClientState { pub struct ClientState {
pub compositor_state: CompositorClientState, pub compositor_state: CompositorClientState,
pub display: Weak<Mutex<Display<WaylandState>>>, pub display: Weak<Mutex<Display<WaylandState>>>,
pub seat: Arc<SeatData>,
} }
impl ClientState { impl ClientState {
pub fn flush(&self) { pub fn flush(&self) {
@@ -73,7 +72,6 @@ pub struct WaylandState {
dmabuf_state: (DmabufState, DmabufGlobal, Option<DmabufFeedback>), dmabuf_state: (DmabufState, DmabufGlobal, Option<DmabufFeedback>),
dmabuf_tx: UnboundedSender<Dmabuf>, dmabuf_tx: UnboundedSender<Dmabuf>,
pub output: Output, pub output: Output,
pub seats: FxHashMap<ClientId, Arc<SeatData>>,
} }
impl WaylandState { impl WaylandState {
@@ -166,15 +164,9 @@ impl WaylandState {
dmabuf_state, dmabuf_state,
dmabuf_tx, dmabuf_tx,
output, output,
seats: FxHashMap::default(),
}) })
}) })
} }
pub fn new_client(&mut self, client: ClientId, dh: &DisplayHandle) {
let seat_data = SeatData::new(dh, client.clone());
self.seats.insert(client, seat_data);
}
} }
impl Drop for WaylandState { impl Drop for WaylandState {
fn drop(&mut self) { fn drop(&mut self) {

View File

@@ -278,7 +278,7 @@ impl Dispatch<XdgSurface, Mutex<XdgSurfaceData>, WaylandState> for WaylandState
xdg_surface.configure(SERIAL_COUNTER.inc()); xdg_surface.configure(SERIAL_COUNTER.inc());
let client_credentials = client.get_credentials(&state.display_handle).ok(); let client_credentials = client.get_credentials(&state.display_handle).ok();
let seat_data = state.seats.get(&client.id()).unwrap().clone(); let Some(seat_data) = client.get_data::<ClientState>().map(|s| s.seat.clone()) else {return};
let Some(wl_surface) = xdg_surface_data.lock().wl_surface() else {return}; let Some(wl_surface) = xdg_surface_data.lock().wl_surface() else {return};
CoreSurface::add_to( CoreSurface::add_to(
state.display_handle.clone(), state.display_handle.clone(),

View File

@@ -1,5 +1,6 @@
use super::{ use super::{
seat::{KeyboardEvent, PointerEvent, SeatData}, seat::{KeyboardEvent, PointerEvent, SeatData},
state::ClientState,
xdg_shell::PopupData, xdg_shell::PopupData,
}; };
use crate::{ use crate::{
@@ -59,7 +60,7 @@ impl XWaylandState {
client_fd: _, client_fd: _,
display: _, display: _,
} => { } => {
handler.seat = Some(SeatData::new(&dh, client.id())); handler.seat = client.get_data::<ClientState>().map(|s| s.seat.clone());
handler.wm = handler.wm =
X11Wm::start_wm(handle.clone(), dh.clone(), connection, client) X11Wm::start_wm(handle.clone(), dh.clone(), connection, client)
.ok(); .ok();