From 82cedc6b78eb06d9846176d6680a0ceb41d185fd Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 4 Jan 2023 15:17:57 -0800 Subject: [PATCH] WIP toplevel management --- src/main.rs | 34 +++++++++++++++++++++++++--------- src/wayland.rs | 34 +++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3c11dc5..7dabcd2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use cctk::{ cosmic_protocols::{ toplevel_info::v1::client::zcosmic_toplevel_handle_v1, + toplevel_management::v1::client::zcosmic_toplevel_manager_v1, workspace::v1::client::{zcosmic_workspace_handle_v1, zcosmic_workspace_manager_v1}, }, sctk::shell::layer::{Anchor, KeyboardInteractivity, Layer}, @@ -32,6 +33,7 @@ enum Msg { Close, Closed(SurfaceIdWrapper), ActivateWorkspace(zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1), + ActivateToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1), } #[derive(Debug)] @@ -63,10 +65,9 @@ struct App { layer_surfaces: HashMap, workspaces: Vec, toplevels: Vec, - workspace_manager: Option<( - Connection, - zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1, - )>, + conn: Option, + workspace_manager: Option, + toplevel_manager: Option, } impl App { @@ -164,8 +165,14 @@ impl Application for App { }, Msg::Wayland(evt) => { match evt { - wayland::Event::WorkspaceManager(conn, manager) => { - self.workspace_manager = Some((conn, manager)); + wayland::Event::Connection(conn) => { + self.conn = Some(conn); + } + wayland::Event::ToplevelManager(manager) => { + self.toplevel_manager = Some(manager); + } + wayland::Event::WorkspaceManager(manager) => { + self.workspace_manager = Some(manager); } wayland::Event::Workspaces(workspaces) => { let old_workspaces = mem::take(&mut self.workspaces); @@ -223,11 +230,19 @@ impl Application for App { } Msg::Closed(_) => {} Msg::ActivateWorkspace(workspace_handle) => { - println!("Activate: {:?}", workspace_handle); - let (conn, workspace_manager) = self.workspace_manager.as_ref().unwrap(); + let workspace_manager = self.workspace_manager.as_ref().unwrap(); workspace_handle.activate(); workspace_manager.commit(); - conn.flush(); + self.conn.as_ref().unwrap().flush(); + } + Msg::ActivateToplevel(toplevel_handle) => { + /* + if let Some(toplevel_manager) = self.toplevel_manager.as_ref() { + toplevel_manager.activate(&toplevel_handle, todo!()); + self.conn.as_ref().unwrap().flush(); + std::process::exit(0); // Can we assume flush is suficient to ensure this takes effect? + } + */ } } @@ -316,6 +331,7 @@ fn toplevel_preview<'a>(toplevel: &'a Toplevel) -> cosmic::Element<'a, Msg> { widget::button(widget::Image::new(toplevel.img.clone().unwrap_or_else( || widget::image::Handle::from_pixels(0, 0, vec![0, 0, 0, 255]), ))) + .on_press(Msg::ActivateToplevel(toplevel.handle.clone())) .into() } diff --git a/src/wayland.rs b/src/wayland.rs index 3017e26..950fa78 100644 --- a/src/wayland.rs +++ b/src/wayland.rs @@ -10,6 +10,7 @@ use cctk::{ cosmic_protocols::{ screencopy::v1::client::{zcosmic_screencopy_manager_v1, zcosmic_screencopy_session_v1}, toplevel_info::v1::client::zcosmic_toplevel_handle_v1, + toplevel_management::v1::client::zcosmic_toplevel_manager_v1, workspace::v1::client::{zcosmic_workspace_handle_v1, zcosmic_workspace_manager_v1}, }, screencopy::{BufferInfo, ScreencopyHandler, ScreencopyState}, @@ -20,6 +21,7 @@ use cctk::{ shm::{raw::RawPool, ShmHandler, ShmState}, }, toplevel_info::{ToplevelInfo, ToplevelInfoHandler, ToplevelInfoState}, + toplevel_management::{ToplevelManagerHandler, ToplevelManagerState}, wayland_client::{ backend::ObjectId, globals::registry_queue_init, @@ -39,10 +41,9 @@ use std::{collections::HashMap, thread}; #[derive(Clone, Debug)] pub enum Event { - WorkspaceManager( - Connection, - zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1, - ), + Connection(Connection), + ToplevelManager(zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1), + WorkspaceManager(zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1), // XXX Output name rather than `WlOutput` Workspaces(Vec<(Option, cctk::workspace::Workspace)>), WorkspaceCapture( @@ -82,6 +83,7 @@ pub struct AppData { workspace_state: WorkspaceState, screencopy_state: ScreencopyState, shm_state: ShmState, + toplevel_manager_state: ToplevelManagerState, sender: mpsc::Sender, frames: HashMap, output_names: HashMap>, @@ -307,6 +309,22 @@ impl ScreencopyHandler for AppData { } } +impl ToplevelManagerHandler for AppData { + fn toplevel_manager_state(&mut self) -> &mut ToplevelManagerState { + &mut self.toplevel_manager_state + } + + fn capabilities( + &mut self, + conn: &Connection, + qh: &QueueHandle, + capabilities: Vec< + WEnum, + >, + ) { + } +} + impl Dispatch for AppData { fn event( _app_data: &mut Self, @@ -333,6 +351,7 @@ fn start() -> mpsc::Receiver { output_state: OutputState::new(&globals, &qh), workspace_state: WorkspaceState::new(®istry_state, &qh), // Create before toplevel info state toplevel_info_state: ToplevelInfoState::new(®istry_state, &qh), + toplevel_manager_state: ToplevelManagerState::new(®istry_state, &qh), screencopy_state: ScreencopyState::new(&globals, &qh), registry_state, shm_state: ShmState::bind(&globals, &qh).unwrap(), @@ -341,8 +360,12 @@ fn start() -> mpsc::Receiver { output_names: HashMap::new(), }; + app_data.send_event(Event::Connection(conn)); + app_data.send_event(Event::ToplevelManager( + app_data.toplevel_manager_state.manager.clone(), + )); if let Ok(manager) = app_data.workspace_state.workspace_manager().get() { - app_data.send_event(Event::WorkspaceManager(conn, manager.clone())); + app_data.send_event(Event::WorkspaceManager(manager.clone())); } thread::spawn(move || loop { @@ -356,5 +379,6 @@ sctk::delegate_output!(AppData); sctk::delegate_registry!(AppData); sctk::delegate_shm!(AppData); cctk::delegate_toplevel_info!(AppData); +cctk::delegate_toplevel_manager!(AppData); cctk::delegate_workspace!(AppData); cctk::delegate_screencopy!(AppData);