Skip to content

Commit 723f758

Browse files
ids1024Drakulix
authored andcommitted
protocol/workspace: Add support for ext-workspace-v1
To support both `ext-workspace-v1` and `cosmic-workspace-unstable-v1`, the API exposed by `wayland/protocols/workspace` now uses the ext workspace `State` and `GroupCapabilties` bitfields, and converts them to the cosmic types for the cosmic implementation. `WorkspaceCapabilities` is a custom type that has cosmic-specific and ext-specific variants, and is mapped on both backends. The ext protocol adds an `.assign` request on workspaces, which is added here, though not currently used. It also adds an `.id` event. Which we'll probably want when we have persistent workspaces, but it isn't needed currently. We still need to add an extension protocol of ext-workspaces to replace a couple cosmic protocol features.
1 parent aa15c00 commit 723f758

File tree

6 files changed

+734
-107
lines changed

6 files changed

+734
-107
lines changed

Cargo.lock

Lines changed: 21 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/shell/mod.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ use cosmic_comp_config::{
1515
workspace::{WorkspaceLayout, WorkspaceMode},
1616
TileBehavior,
1717
};
18-
use cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::{
19-
State as WState, TilingState,
20-
};
18+
use cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::TilingState;
2119
use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection, ResizeDirection};
2220
use cosmic_settings_config::{shortcuts, window_rules::ApplicationException};
2321
use keyframe::{ease, functions::EaseInOutCubic};
@@ -40,7 +38,10 @@ use smithay::{
4038
},
4139
output::Output,
4240
reexports::{
43-
wayland_protocols::ext::session_lock::v1::server::ext_session_lock_v1::ExtSessionLockV1,
41+
wayland_protocols::ext::{
42+
session_lock::v1::server::ext_session_lock_v1::ExtSessionLockV1,
43+
workspace::v1::server::ext_workspace_handle_v1::State as WState,
44+
},
4445
wayland_server::{protocol::wl_surface::WlSurface, Client},
4546
},
4647
utils::{IsAlive, Logical, Point, Rectangle, Serial, Size},
@@ -350,15 +351,14 @@ fn create_workspace(
350351
} else {
351352
TilingState::FloatingOnly
352353
},
354+
// TODO Set id for persistent workspaces
355+
None,
353356
)
354357
.unwrap();
355358
if active {
356359
state.add_workspace_state(&workspace_handle, WState::Active);
357360
}
358-
state.set_workspace_capabilities(
359-
&workspace_handle,
360-
[WorkspaceCapabilities::Activate].into_iter(),
361-
);
361+
state.set_workspace_capabilities(&workspace_handle, WorkspaceCapabilities::Activate);
362362
Workspace::new(workspace_handle, output.clone(), tiling, theme.clone())
363363
}
364364

@@ -376,12 +376,11 @@ fn move_workspace_to_group(
376376
} else {
377377
TilingState::FloatingOnly
378378
},
379+
// TODO Set id for persistent workspaces
380+
None,
379381
)
380382
.unwrap();
381-
workspace_state.set_workspace_capabilities(
382-
&workspace.handle,
383-
[WorkspaceCapabilities::Activate].into_iter(),
384-
);
383+
workspace_state.set_workspace_capabilities(&workspace.handle, WorkspaceCapabilities::Activate);
385384
for window in workspace.mapped() {
386385
for (surface, _) in window.windows() {
387386
toplevel_leave_workspace(&surface, &old_workspace_handle);

src/wayland/handlers/xdg_activation.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use crate::{shell::ActivationKey, state::ClientState, utils::prelude::*};
22
use crate::{state::State, wayland::protocols::workspace::WorkspaceHandle};
3-
use cosmic_protocols::workspace::v1::server::zcosmic_workspace_handle_v1::State as WState;
43
use smithay::{
54
delegate_xdg_activation,
65
input::Seat,
7-
reexports::wayland_server::protocol::wl_surface::WlSurface,
6+
reexports::{
7+
wayland_protocols::ext::workspace::v1::server::ext_workspace_handle_v1::State as WState,
8+
wayland_server::protocol::wl_surface::WlSurface,
9+
},
810
wayland::xdg_activation::{
911
XdgActivationHandler, XdgActivationState, XdgActivationToken, XdgActivationTokenData,
1012
},

src/wayland/protocols/workspace/cosmic.rs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
// SPDX-License-Identifier: GPL-3.0-only
22

3-
use smithay::reexports::wayland_server::{
4-
backend::{ClientData, ClientId},
5-
Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource,
3+
use smithay::{
4+
reexports::wayland_protocols::ext::workspace::v1::server::ext_workspace_handle_v1::{self},
5+
reexports::wayland_server::{
6+
backend::{ClientData, ClientId},
7+
Client, DataInit, Dispatch, DisplayHandle, GlobalDispatch, New, Resource,
8+
},
69
};
710

811
use super::{
9-
Request, Workspace, WorkspaceClientHandler, WorkspaceData, WorkspaceGlobalData, WorkspaceGroup,
10-
WorkspaceGroupData, WorkspaceGroupHandle, WorkspaceHandler, WorkspaceState,
12+
GroupCapabilities, Request, Workspace, WorkspaceCapabilities, WorkspaceClientHandler,
13+
WorkspaceData, WorkspaceGlobalData, WorkspaceGroup, WorkspaceGroupData, WorkspaceGroupHandle,
14+
WorkspaceHandler, WorkspaceState,
1115
};
1216

1317
use cosmic_protocols::workspace::v1::server::{
@@ -342,7 +346,11 @@ where
342346
let caps = group
343347
.capabilities
344348
.iter()
345-
.flat_map(|cap| (*cap as u32).to_ne_bytes())
349+
.filter_map(|cap| match cap {
350+
GroupCapabilities::CreateWorkspace => Some(zcosmic_workspace_group_handle_v1::ZcosmicWorkspaceGroupCapabilitiesV1::CreateWorkspace),
351+
_ => None,
352+
})
353+
.flat_map(|cap| (cap as u32).to_ne_bytes())
346354
.collect::<Vec<u8>>();
347355
instance.capabilities(caps);
348356
handle_state.capabilities = group.capabilities.clone();
@@ -424,7 +432,25 @@ where
424432
let caps = workspace
425433
.capabilities
426434
.iter()
427-
.flat_map(|cap| (*cap as u32).to_ne_bytes())
435+
.filter_map(|cap| match cap {
436+
WorkspaceCapabilities::Activate => {
437+
Some(zcosmic_workspace_handle_v1::ZcosmicWorkspaceCapabilitiesV1::Activate)
438+
}
439+
WorkspaceCapabilities::Deactivate => {
440+
Some(zcosmic_workspace_handle_v1::ZcosmicWorkspaceCapabilitiesV1::Deactivate)
441+
}
442+
WorkspaceCapabilities::Remove => {
443+
Some(zcosmic_workspace_handle_v1::ZcosmicWorkspaceCapabilitiesV1::Remove)
444+
}
445+
WorkspaceCapabilities::Rename => {
446+
Some(zcosmic_workspace_handle_v1::ZcosmicWorkspaceCapabilitiesV1::Rename)
447+
}
448+
WorkspaceCapabilities::SetTilingState => Some(
449+
zcosmic_workspace_handle_v1::ZcosmicWorkspaceCapabilitiesV1::SetTilingState,
450+
),
451+
_ => None,
452+
})
453+
.flat_map(|cap| (cap as u32).to_ne_bytes())
428454
.collect::<Vec<u8>>();
429455
instance.capabilities(caps);
430456
handle_state.capabilities = workspace.capabilities.clone();
@@ -434,7 +460,19 @@ where
434460
let states = workspace
435461
.states
436462
.iter()
437-
.flat_map(|state| (*state as u32).to_ne_bytes())
463+
.filter_map(|state| match state {
464+
ext_workspace_handle_v1::State::Active => {
465+
Some(zcosmic_workspace_handle_v1::State::Active)
466+
}
467+
ext_workspace_handle_v1::State::Urgent => {
468+
Some(zcosmic_workspace_handle_v1::State::Urgent)
469+
}
470+
ext_workspace_handle_v1::State::Hidden => {
471+
Some(zcosmic_workspace_handle_v1::State::Hidden)
472+
}
473+
_ => None,
474+
})
475+
.flat_map(|state| (state as u32).to_ne_bytes())
438476
.collect::<Vec<u8>>();
439477
instance.state(states);
440478
handle_state.states = workspace.states.clone();

0 commit comments

Comments
 (0)