Update for toplevel-info cctk changes

This commit is contained in:
Ian Douglas Scott 2025-02-10 14:33:51 -08:00 committed by Ian Douglas Scott
parent e283cfe456
commit 4acd62abb0
9 changed files with 90 additions and 68 deletions

View file

@ -89,7 +89,7 @@ impl ZcosmicWorkspaceHandleV1 {
}
#[derive(Eq, PartialEq, Clone, Debug, Hash)]
pub struct ZcosmicToplevelHandleV1(MockObjectId);
pub struct ExtForeignToplevelHandleV1(MockObjectId);
#[derive(Clone, Debug, Default)]
pub struct CaptureFilter {
@ -147,7 +147,7 @@ impl AppData {
};
// Add three toplevels for each workspace
for j in 0..=3 {
let toplevel_handle = ZcosmicToplevelHandleV1(MockObjectId::new());
let toplevel_handle = ExtForeignToplevelHandleV1(MockObjectId::new());
let toplevel_info = ToplevelInfo {
title: format!("App {}", j),
app_id: "com.example.app".to_string(),

View file

@ -18,13 +18,12 @@ use std::collections::HashSet;
mod wayland;
#[cfg(not(feature = "mock-backend"))]
pub use cosmic::cctk::{
cosmic_protocols::{
toplevel_info::v1::client::zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
workspace::v1::client::zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1,
},
toplevel_info::ToplevelInfo,
workspace::Workspace,
cosmic_protocols::workspace::v1::client::zcosmic_workspace_handle_v1::ZcosmicWorkspaceHandleV1,
toplevel_info::ToplevelInfo, workspace::Workspace,
};
#[cfg(not(feature = "mock-backend"))]
pub use wayland_protocols::ext::foreign_toplevel_list::v1::client::ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1;
#[cfg(not(feature = "mock-backend"))]
pub use wayland::subscription;
@ -33,7 +32,7 @@ pub use wayland::subscription;
mod mock;
#[cfg(feature = "mock-backend")]
pub use mock::{
subscription, ToplevelInfo, Workspace, ZcosmicToplevelHandleV1, ZcosmicWorkspaceHandleV1,
subscription, ExtForeignToplevelHandleV1, ToplevelInfo, Workspace, ZcosmicWorkspaceHandleV1,
};
#[derive(Clone, Debug, Default)]
@ -59,19 +58,19 @@ pub enum Event {
CmdSender(calloop::channel::Sender<Cmd>),
Workspaces(Vec<(HashSet<wl_output::WlOutput>, Workspace)>),
WorkspaceCapture(ZcosmicWorkspaceHandleV1, CaptureImage),
NewToplevel(ZcosmicToplevelHandleV1, ToplevelInfo),
UpdateToplevel(ZcosmicToplevelHandleV1, ToplevelInfo),
CloseToplevel(ZcosmicToplevelHandleV1),
ToplevelCapture(ZcosmicToplevelHandleV1, CaptureImage),
NewToplevel(ExtForeignToplevelHandleV1, ToplevelInfo),
UpdateToplevel(ExtForeignToplevelHandleV1, ToplevelInfo),
CloseToplevel(ExtForeignToplevelHandleV1),
ToplevelCapture(ExtForeignToplevelHandleV1, CaptureImage),
}
#[derive(Debug)]
pub enum Cmd {
CaptureFilter(CaptureFilter),
ActivateToplevel(ZcosmicToplevelHandleV1),
CloseToplevel(ZcosmicToplevelHandleV1),
ActivateToplevel(ExtForeignToplevelHandleV1),
CloseToplevel(ExtForeignToplevelHandleV1),
MoveToplevelToWorkspace(
ZcosmicToplevelHandleV1,
ExtForeignToplevelHandleV1,
ZcosmicWorkspaceHandleV1,
wl_output::WlOutput,
),

View file

@ -75,22 +75,31 @@ impl AppData {
self.invalidate_capture_filter();
}
Cmd::ActivateToplevel(toplevel_handle) => {
for seat in self.seat_state.seats() {
self.toplevel_manager_state
.manager
.activate(&toplevel_handle, &seat);
let info = self.toplevel_info_state.info(&toplevel_handle);
if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) {
for seat in self.seat_state.seats() {
self.toplevel_manager_state
.manager
.activate(&cosmic_toplevel, &seat);
}
}
}
Cmd::CloseToplevel(toplevel_handle) => {
self.toplevel_manager_state.manager.close(&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()) {
self.toplevel_manager_state.manager.close(&cosmic_toplevel);
}
}
Cmd::MoveToplevelToWorkspace(toplevel_handle, workspace_handle, output) => {
if self.toplevel_manager_state.manager.version() >= 2 {
self.toplevel_manager_state.manager.move_to_workspace(
&toplevel_handle,
&workspace_handle,
&output,
);
let info = self.toplevel_info_state.info(&toplevel_handle);
if let Some(cosmic_toplevel) = info.and_then(|x| x.cosmic_toplevel.as_ref()) {
if self.toplevel_manager_state.manager.version() >= 2 {
self.toplevel_manager_state.manager.move_to_workspace(
&cosmic_toplevel,
&workspace_handle,
&output,
);
}
}
}
Cmd::ActivateWorkspace(workspace_handle) => {
@ -105,12 +114,19 @@ impl AppData {
fn matches_capture_filter(&self, source: &CaptureSource) -> bool {
match source {
CaptureSource::CosmicToplevel(toplevel) => {
let info = self.toplevel_info_state.info(toplevel).unwrap();
info.workspace.iter().any(|workspace| {
self.capture_filter
.toplevels_on_workspaces
.contains(workspace)
})
let info = self
.toplevel_info_state
.toplevels()
.find(|info| info.cosmic_toplevel.as_ref() == Some(&toplevel));
if let Some(info) = info {
info.workspace.iter().any(|workspace| {
self.capture_filter
.toplevels_on_workspaces
.contains(workspace)
})
} else {
false
}
}
CaptureSource::CosmicWorkspace(workspace) => self
.workspace_state

View file

@ -193,7 +193,13 @@ impl ScreencopyHandler for AppData {
};
match &capture.source {
CaptureSource::CosmicToplevel(toplevel) => {
self.send_event(Event::ToplevelCapture(toplevel.clone(), image))
let info = self
.toplevel_info_state
.toplevels()
.find(|info| info.cosmic_toplevel.as_ref() == Some(&toplevel));
if let Some(info) = info {
self.send_event(Event::ToplevelCapture(info.foreign_toplevel.clone(), image))
}
}
CaptureSource::CosmicWorkspace(workspace) => {
self.send_event(Event::WorkspaceCapture(workspace.clone(), image));

View file

@ -1,13 +1,11 @@
use cctk::{
cosmic_protocols::{
toplevel_info::v1::client::zcosmic_toplevel_handle_v1,
toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
},
cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
toplevel_info::{ToplevelInfoHandler, ToplevelInfoState},
toplevel_management::{ToplevelManagerHandler, ToplevelManagerState},
wayland_client::{Connection, QueueHandle, WEnum},
};
use cosmic::cctk;
use wayland_protocols::ext::foreign_toplevel_list::v1::client::ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1;
use super::{AppData, CaptureSource, Event};
@ -21,19 +19,20 @@ impl ToplevelInfoHandler for AppData {
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
toplevel: &ExtForeignToplevelHandleV1,
) {
let info = self.toplevel_info_state.info(toplevel).unwrap();
let cosmic_toplevel = info.cosmic_toplevel.clone().unwrap();
self.send_event(Event::NewToplevel(toplevel.clone(), info.clone()));
self.add_capture_source(CaptureSource::CosmicToplevel(toplevel.clone()));
self.add_capture_source(CaptureSource::CosmicToplevel(cosmic_toplevel));
}
fn update_toplevel(
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
toplevel: &ExtForeignToplevelHandleV1,
) {
let info = self.toplevel_info_state.info(toplevel).unwrap();
self.send_event(Event::UpdateToplevel(toplevel.clone(), info.clone()));
@ -43,11 +42,13 @@ impl ToplevelInfoHandler for AppData {
&mut self,
_conn: &Connection,
_qh: &QueueHandle<Self>,
toplevel: &zcosmic_toplevel_handle_v1::ZcosmicToplevelHandleV1,
toplevel: &ExtForeignToplevelHandleV1,
) {
let info = self.toplevel_info_state.info(toplevel).unwrap();
let cosmic_toplevel = info.cosmic_toplevel.clone().unwrap();
self.send_event(Event::CloseToplevel(toplevel.clone()));
self.remove_capture_source(CaptureSource::CosmicToplevel(toplevel.clone()));
self.remove_capture_source(CaptureSource::CosmicToplevel(cosmic_toplevel));
}
}