backend/wayland: Support running without toplevel manager protocol

This commit is contained in:
Ian Douglas Scott 2025-04-21 14:21:57 -07:00
parent 77ff4e62e9
commit 94ec10686e
2 changed files with 17 additions and 13 deletions

View file

@ -53,7 +53,7 @@ pub struct AppData {
screencopy_state: ScreencopyState, screencopy_state: ScreencopyState,
seat_state: SeatState, seat_state: SeatState,
shm_state: Shm, shm_state: Shm,
toplevel_manager_state: ToplevelManagerState, toplevel_manager_state: Option<ToplevelManagerState>,
sender: mpsc::Sender<Event>, sender: mpsc::Sender<Event>,
capture_filter: CaptureFilter, capture_filter: CaptureFilter,
captures: RefCell<HashMap<CaptureSource, Arc<Capture>>>, captures: RefCell<HashMap<CaptureSource, Arc<Capture>>>,
@ -78,27 +78,31 @@ impl AppData {
let info = self.toplevel_info_state.info(&toplevel_handle); let info = self.toplevel_info_state.info(&toplevel_handle);
if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) { if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) {
for seat in self.seat_state.seats() { for seat in self.seat_state.seats() {
self.toplevel_manager_state if let Some(state) = &self.toplevel_manager_state {
.manager state.manager.activate(cosmic_toplevel, &seat);
.activate(cosmic_toplevel, &seat); }
} }
} }
} }
Cmd::CloseToplevel(toplevel_handle) => { Cmd::CloseToplevel(toplevel_handle) => {
let info = self.toplevel_info_state.info(&toplevel_handle); let info = self.toplevel_info_state.info(&toplevel_handle);
if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) { if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) {
self.toplevel_manager_state.manager.close(cosmic_toplevel); if let Some(state) = &self.toplevel_manager_state {
state.manager.close(cosmic_toplevel);
}
} }
} }
Cmd::MoveToplevelToWorkspace(toplevel_handle, workspace_handle, output) => { Cmd::MoveToplevelToWorkspace(toplevel_handle, workspace_handle, output) => {
let info = self.toplevel_info_state.info(&toplevel_handle); let info = self.toplevel_info_state.info(&toplevel_handle);
if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) { if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) {
if self.toplevel_manager_state.manager.version() >= 2 { if let Some(state) = &self.toplevel_manager_state {
self.toplevel_manager_state.manager.move_to_ext_workspace( if state.manager.version() >= 2 {
cosmic_toplevel, state.manager.move_to_ext_workspace(
&workspace_handle, cosmic_toplevel,
&output, &workspace_handle,
); &output,
);
}
} }
} }
} }
@ -240,7 +244,7 @@ fn start(conn: Connection) -> mpsc::Receiver<Event> {
dmabuf_state, dmabuf_state,
workspace_state: WorkspaceState::new(&registry_state, &qh), // Create before toplevel info state workspace_state: WorkspaceState::new(&registry_state, &qh), // Create before toplevel info state
toplevel_info_state: ToplevelInfoState::new(&registry_state, &qh), toplevel_info_state: ToplevelInfoState::new(&registry_state, &qh),
toplevel_manager_state: ToplevelManagerState::new(&registry_state, &qh), toplevel_manager_state: ToplevelManagerState::try_new(&registry_state, &qh),
screencopy_state: ScreencopyState::new(&globals, &qh), screencopy_state: ScreencopyState::new(&globals, &qh),
registry_state, registry_state,
seat_state: SeatState::new(&globals, &qh), seat_state: SeatState::new(&globals, &qh),

View file

@ -51,7 +51,7 @@ impl ToplevelInfoHandler for AppData {
impl ToplevelManagerHandler for AppData { impl ToplevelManagerHandler for AppData {
fn toplevel_manager_state(&mut self) -> &mut ToplevelManagerState { fn toplevel_manager_state(&mut self) -> &mut ToplevelManagerState {
&mut self.toplevel_manager_state self.toplevel_manager_state.as_mut().unwrap()
} }
fn capabilities( fn capabilities(