WIP toplevel management
This commit is contained in:
parent
65233e1a28
commit
82cedc6b78
2 changed files with 54 additions and 14 deletions
34
src/main.rs
34
src/main.rs
|
|
@ -1,6 +1,7 @@
|
||||||
use cctk::{
|
use cctk::{
|
||||||
cosmic_protocols::{
|
cosmic_protocols::{
|
||||||
toplevel_info::v1::client::zcosmic_toplevel_handle_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},
|
workspace::v1::client::{zcosmic_workspace_handle_v1, zcosmic_workspace_manager_v1},
|
||||||
},
|
},
|
||||||
sctk::shell::layer::{Anchor, KeyboardInteractivity, Layer},
|
sctk::shell::layer::{Anchor, KeyboardInteractivity, Layer},
|
||||||
|
|
@ -32,6 +33,7 @@ enum Msg {
|
||||||
Close,
|
Close,
|
||||||
Closed(SurfaceIdWrapper),
|
Closed(SurfaceIdWrapper),
|
||||||
ActivateWorkspace(zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1),
|
ActivateWorkspace(zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1),
|
||||||
|
ActivateToplevel(zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -63,10 +65,9 @@ struct App {
|
||||||
layer_surfaces: HashMap<SurfaceId, LayerSurface>,
|
layer_surfaces: HashMap<SurfaceId, LayerSurface>,
|
||||||
workspaces: Vec<Workspace>,
|
workspaces: Vec<Workspace>,
|
||||||
toplevels: Vec<Toplevel>,
|
toplevels: Vec<Toplevel>,
|
||||||
workspace_manager: Option<(
|
conn: Option<Connection>,
|
||||||
Connection,
|
workspace_manager: Option<zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1>,
|
||||||
zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1,
|
toplevel_manager: Option<zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1>,
|
||||||
)>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
|
|
@ -164,8 +165,14 @@ impl Application for App {
|
||||||
},
|
},
|
||||||
Msg::Wayland(evt) => {
|
Msg::Wayland(evt) => {
|
||||||
match evt {
|
match evt {
|
||||||
wayland::Event::WorkspaceManager(conn, manager) => {
|
wayland::Event::Connection(conn) => {
|
||||||
self.workspace_manager = Some((conn, manager));
|
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) => {
|
wayland::Event::Workspaces(workspaces) => {
|
||||||
let old_workspaces = mem::take(&mut self.workspaces);
|
let old_workspaces = mem::take(&mut self.workspaces);
|
||||||
|
|
@ -223,11 +230,19 @@ impl Application for App {
|
||||||
}
|
}
|
||||||
Msg::Closed(_) => {}
|
Msg::Closed(_) => {}
|
||||||
Msg::ActivateWorkspace(workspace_handle) => {
|
Msg::ActivateWorkspace(workspace_handle) => {
|
||||||
println!("Activate: {:?}", workspace_handle);
|
let workspace_manager = self.workspace_manager.as_ref().unwrap();
|
||||||
let (conn, workspace_manager) = self.workspace_manager.as_ref().unwrap();
|
|
||||||
workspace_handle.activate();
|
workspace_handle.activate();
|
||||||
workspace_manager.commit();
|
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::button(widget::Image::new(toplevel.img.clone().unwrap_or_else(
|
||||||
|| widget::image::Handle::from_pixels(0, 0, vec![0, 0, 0, 255]),
|
|| widget::image::Handle::from_pixels(0, 0, vec![0, 0, 0, 255]),
|
||||||
)))
|
)))
|
||||||
|
.on_press(Msg::ActivateToplevel(toplevel.handle.clone()))
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ use cctk::{
|
||||||
cosmic_protocols::{
|
cosmic_protocols::{
|
||||||
screencopy::v1::client::{zcosmic_screencopy_manager_v1, zcosmic_screencopy_session_v1},
|
screencopy::v1::client::{zcosmic_screencopy_manager_v1, zcosmic_screencopy_session_v1},
|
||||||
toplevel_info::v1::client::zcosmic_toplevel_handle_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},
|
workspace::v1::client::{zcosmic_workspace_handle_v1, zcosmic_workspace_manager_v1},
|
||||||
},
|
},
|
||||||
screencopy::{BufferInfo, ScreencopyHandler, ScreencopyState},
|
screencopy::{BufferInfo, ScreencopyHandler, ScreencopyState},
|
||||||
|
|
@ -20,6 +21,7 @@ use cctk::{
|
||||||
shm::{raw::RawPool, ShmHandler, ShmState},
|
shm::{raw::RawPool, ShmHandler, ShmState},
|
||||||
},
|
},
|
||||||
toplevel_info::{ToplevelInfo, ToplevelInfoHandler, ToplevelInfoState},
|
toplevel_info::{ToplevelInfo, ToplevelInfoHandler, ToplevelInfoState},
|
||||||
|
toplevel_management::{ToplevelManagerHandler, ToplevelManagerState},
|
||||||
wayland_client::{
|
wayland_client::{
|
||||||
backend::ObjectId,
|
backend::ObjectId,
|
||||||
globals::registry_queue_init,
|
globals::registry_queue_init,
|
||||||
|
|
@ -39,10 +41,9 @@ use std::{collections::HashMap, thread};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
WorkspaceManager(
|
Connection(Connection),
|
||||||
Connection,
|
ToplevelManager(zcosmic_toplevel_manager_v1::ZcosmicToplevelManagerV1),
|
||||||
zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1,
|
WorkspaceManager(zcosmic_workspace_manager_v1::ZcosmicWorkspaceManagerV1),
|
||||||
),
|
|
||||||
// XXX Output name rather than `WlOutput`
|
// XXX Output name rather than `WlOutput`
|
||||||
Workspaces(Vec<(Option<String>, cctk::workspace::Workspace)>),
|
Workspaces(Vec<(Option<String>, cctk::workspace::Workspace)>),
|
||||||
WorkspaceCapture(
|
WorkspaceCapture(
|
||||||
|
|
@ -82,6 +83,7 @@ pub struct AppData {
|
||||||
workspace_state: WorkspaceState,
|
workspace_state: WorkspaceState,
|
||||||
screencopy_state: ScreencopyState,
|
screencopy_state: ScreencopyState,
|
||||||
shm_state: ShmState,
|
shm_state: ShmState,
|
||||||
|
toplevel_manager_state: ToplevelManagerState,
|
||||||
sender: mpsc::Sender<Event>,
|
sender: mpsc::Sender<Event>,
|
||||||
frames: HashMap<ObjectId, Frame>,
|
frames: HashMap<ObjectId, Frame>,
|
||||||
output_names: HashMap<ObjectId, Option<String>>,
|
output_names: HashMap<ObjectId, Option<String>>,
|
||||||
|
|
@ -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<Self>,
|
||||||
|
capabilities: Vec<
|
||||||
|
WEnum<zcosmic_toplevel_manager_v1::ZcosmicToplelevelManagementCapabilitiesV1>,
|
||||||
|
>,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Dispatch<wl_buffer::WlBuffer, ()> for AppData {
|
impl Dispatch<wl_buffer::WlBuffer, ()> for AppData {
|
||||||
fn event(
|
fn event(
|
||||||
_app_data: &mut Self,
|
_app_data: &mut Self,
|
||||||
|
|
@ -333,6 +351,7 @@ fn start() -> mpsc::Receiver<Event> {
|
||||||
output_state: OutputState::new(&globals, &qh),
|
output_state: OutputState::new(&globals, &qh),
|
||||||
workspace_state: WorkspaceState::new(®istry_state, &qh), // Create before toplevel info state
|
workspace_state: WorkspaceState::new(®istry_state, &qh), // Create before toplevel info state
|
||||||
toplevel_info_state: ToplevelInfoState::new(®istry_state, &qh),
|
toplevel_info_state: ToplevelInfoState::new(®istry_state, &qh),
|
||||||
|
toplevel_manager_state: ToplevelManagerState::new(®istry_state, &qh),
|
||||||
screencopy_state: ScreencopyState::new(&globals, &qh),
|
screencopy_state: ScreencopyState::new(&globals, &qh),
|
||||||
registry_state,
|
registry_state,
|
||||||
shm_state: ShmState::bind(&globals, &qh).unwrap(),
|
shm_state: ShmState::bind(&globals, &qh).unwrap(),
|
||||||
|
|
@ -341,8 +360,12 @@ fn start() -> mpsc::Receiver<Event> {
|
||||||
output_names: HashMap::new(),
|
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() {
|
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 {
|
thread::spawn(move || loop {
|
||||||
|
|
@ -356,5 +379,6 @@ sctk::delegate_output!(AppData);
|
||||||
sctk::delegate_registry!(AppData);
|
sctk::delegate_registry!(AppData);
|
||||||
sctk::delegate_shm!(AppData);
|
sctk::delegate_shm!(AppData);
|
||||||
cctk::delegate_toplevel_info!(AppData);
|
cctk::delegate_toplevel_info!(AppData);
|
||||||
|
cctk::delegate_toplevel_manager!(AppData);
|
||||||
cctk::delegate_workspace!(AppData);
|
cctk::delegate_workspace!(AppData);
|
||||||
cctk::delegate_screencopy!(AppData);
|
cctk::delegate_screencopy!(AppData);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue