Compare commits
11 commits
240bb058a9
...
7393ce1ff1
| Author | SHA1 | Date | |
|---|---|---|---|
| 7393ce1ff1 | |||
|
|
cd729d045b | ||
|
|
12e449e050 | ||
|
|
d4071eae98 | ||
|
|
522ad626b1 | ||
|
|
d56a59208e | ||
|
|
e8a1927d42 | ||
|
|
2acf6f9f14 | ||
|
|
2b9906f941 | ||
|
|
4e9c902ee2 | ||
|
|
8542100f85 |
41 changed files with 499 additions and 692 deletions
15
.zed/settings.json
Normal file
15
.zed/settings.json
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"format_on_save": "on",
|
||||
"lsp": {
|
||||
"rust-analyzer": {
|
||||
"initialization_options": {
|
||||
"check": {
|
||||
"command": "clippy",
|
||||
},
|
||||
"rustfmt": {
|
||||
"extraArgs": ["+nightly"],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
590
Cargo.lock
generated
590
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
50
Cargo.toml
50
Cargo.toml
|
|
@ -1,17 +1,18 @@
|
|||
[package]
|
||||
name = "cosmic-workspaces"
|
||||
version = "1.0.0"
|
||||
version = "1.0.12"
|
||||
edition = "2024"
|
||||
rust-version = "1.93"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.102"
|
||||
calloop = { version = "0.14.4", features = ["executor"] }
|
||||
clap = { version = "4", features = ["derive"] }
|
||||
cosmic-bg-config = { git = "https://github.com/pop-os/cosmic-bg" }
|
||||
cosmic-bg-config = { path = "../cosmic-bg/config" }
|
||||
cosmic-comp-config = { git = "https://github.com/pop-os/cosmic-comp" }
|
||||
env_logger = "0.11.9"
|
||||
gbm = "0.18.0"
|
||||
libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = [
|
||||
cosmic = { package = "libcosmic-yoda", path = "../libcosmic", default-features = false, features = [
|
||||
"tokio",
|
||||
"wayland",
|
||||
"single-instance",
|
||||
|
|
@ -19,7 +20,7 @@ libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = fa
|
|||
"multi-window",
|
||||
"winit",
|
||||
] }
|
||||
cosmic-config = { git = "https://github.com/pop-os/libcosmic" }
|
||||
cosmic-config = { path = "../libcosmic/cosmic-config" }
|
||||
freedesktop-icons = { package = "cosmic-freedesktop-icons", git = "https://github.com/pop-os/freedesktop-icons" }
|
||||
|
||||
memmap2 = "0.9.10"
|
||||
|
|
@ -37,7 +38,7 @@ zbus = "5.13.2"
|
|||
tokio-stream = { version = "0.1.18", features = ["sync"] }
|
||||
ash = { version = "0.38.0", features = ["loaded"] }
|
||||
bytemuck = "1.25.0"
|
||||
cosmic-panel-config = { git = "https://github.com/pop-os/cosmic-panel" }
|
||||
cosmic-panel-config = { path = "../cosmic-panel/cosmic-panel-config" }
|
||||
|
||||
[dependencies.i18n-embed]
|
||||
version = "0.16"
|
||||
|
|
@ -45,12 +46,49 @@ features = ["fluent-system", "desktop-requester"]
|
|||
|
||||
[features]
|
||||
default = ["wgpu"]
|
||||
wgpu = ["libcosmic/wgpu"]
|
||||
wgpu = ["cosmic/wgpu"]
|
||||
# Debugging features
|
||||
force-shm-screencopy = []
|
||||
no-subsurfaces = ["force-shm-screencopy"]
|
||||
mock-backend = []
|
||||
|
||||
[patch.'https://github.com/pop-os/libcosmic']
|
||||
cosmic-config = { path = "../libcosmic/cosmic-config" }
|
||||
cosmic-theme = { path = "../libcosmic/cosmic-theme" }
|
||||
iced = { path = "../libcosmic/iced" }
|
||||
iced_accessibility = { path = "../libcosmic/iced/accessibility" }
|
||||
iced_core = { path = "../libcosmic/iced/core" }
|
||||
iced_futures = { path = "../libcosmic/iced/futures" }
|
||||
iced_graphics = { path = "../libcosmic/iced/graphics" }
|
||||
iced_renderer = { path = "../libcosmic/iced/renderer" }
|
||||
iced_runtime = { path = "../libcosmic/iced/runtime" }
|
||||
iced_tiny_skia = { path = "../libcosmic/iced/tiny_skia" }
|
||||
iced_wgpu = { path = "../libcosmic/iced/wgpu" }
|
||||
iced_widget = { path = "../libcosmic/iced/widget" }
|
||||
iced_winit = { path = "../libcosmic/iced/winit" }
|
||||
|
||||
[patch.'https://github.com/pop-os/cosmic-protocols']
|
||||
cosmic-protocols = { path = "../cosmic-protocols" }
|
||||
cosmic-client-toolkit = { path = "../cosmic-protocols/client-toolkit" }
|
||||
|
||||
[patch.'https://github.com/pop-os/cosmic-text.git']
|
||||
cosmic-text = { git = "https://forge.aditua.com/leyoda/cosmic-text.git", branch = "local/pr-503" }
|
||||
|
||||
[patch.'https://github.com/pop-os/cosmic-bg']
|
||||
cosmic-bg-config = { path = "../cosmic-bg/config" }
|
||||
|
||||
[patch.'https://github.com/pop-os/cosmic-panel']
|
||||
cosmic-panel-config = { path = "../cosmic-panel/cosmic-panel-config" }
|
||||
xdg-shell-wrapper-config = { path = "../cosmic-panel/xdg-shell-wrapper-config" }
|
||||
|
||||
[patch.'https://github.com/pop-os/cosmic-settings-daemon']
|
||||
cosmic-settings-config = { path = "../cosmic-settings-daemon/config" }
|
||||
|
||||
[patch.'https://forge.aditua.com/leyoda/window_clipboard.git']
|
||||
window_clipboard = { path = "../window_clipboard" }
|
||||
dnd = { path = "../window_clipboard/dnd" }
|
||||
mime = { path = "../window_clipboard/mime" }
|
||||
|
||||
[profile.dev]
|
||||
# Not usable at opt-level 0, at least with software renderer
|
||||
opt-level = 1
|
||||
|
|
|
|||
6
debian/changelog
vendored
6
debian/changelog
vendored
|
|
@ -1,3 +1,9 @@
|
|||
cosmic-workspaces (1.0.12) noble; urgency=medium
|
||||
|
||||
* Version bump
|
||||
|
||||
-- Michael Murphy <michael@mmurphy.dev> Wed, 29 Apr 2026 17:48:17 +0200
|
||||
|
||||
cosmic-workspaces (0.1.0) jammy; urgency=medium
|
||||
|
||||
* Initial release.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
workspace = Χώρος εργασίας { $number }
|
||||
new-workspace = Νέος χώρος εργασίας
|
||||
0
i18n/eu/cosmic_workspaces.ftl
Normal file
0
i18n/eu/cosmic_workspaces.ftl
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
workspace = Tallunt n umahil { $number }
|
||||
new-workspace = Tallunt n umahil tamaynut
|
||||
0
i18n/lo/cosmic_workspaces.ftl
Normal file
0
i18n/lo/cosmic_workspaces.ftl
Normal file
|
|
@ -1,2 +1,2 @@
|
|||
workspace = Área de trabalho { $number }
|
||||
new-workspace = Nova área de trabalho
|
||||
workspace = Espaço de trabalho { $number }
|
||||
new-workspace = Novo espaço de trabalho
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
new-workspace = Nova área de trabalho
|
||||
workspace = Área de trabalho{ $number }
|
||||
workspace = Área de trabalho { $number }
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
workspace = Радни простор { $number }
|
||||
new-workspace = Нови радни простор
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
workspace = 工作區 { $number }
|
||||
new-workspace = 新工作區
|
||||
new-workspace = 新建工作區
|
||||
|
|
|
|||
3
rust-toolchain.toml
Normal file
3
rust-toolchain.toml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[toolchain]
|
||||
channel = "1.93.0"
|
||||
components = ["clippy", "rustfmt"]
|
||||
|
|
@ -1 +1 @@
|
|||
imports_granularity = "Crate"
|
||||
imports_granularity = "Module"
|
||||
|
|
|
|||
|
|
@ -1,37 +1,23 @@
|
|||
// Copyright 2024 System76 <info@system76.com>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use cosmic::{
|
||||
cctk::{
|
||||
cosmic_protocols::{
|
||||
toplevel_info::v1::client::zcosmic_toplevel_handle_v1,
|
||||
toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
|
||||
workspace::v2::client::zcosmic_workspace_handle_v2,
|
||||
},
|
||||
wayland_client::{
|
||||
Connection, WEnum,
|
||||
protocol::{wl_output, wl_shm},
|
||||
},
|
||||
wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1,
|
||||
},
|
||||
iced::{
|
||||
self,
|
||||
futures::{FutureExt, SinkExt, executor::block_on},
|
||||
},
|
||||
iced_winit::platform_specific::wayland::subsurface_widget::{Shmbuf, SubsurfaceBuffer},
|
||||
};
|
||||
use cosmic::cctk::cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1;
|
||||
use cosmic::cctk::cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1;
|
||||
use cosmic::cctk::cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2;
|
||||
use cosmic::cctk::wayland_client::protocol::{wl_output, wl_shm};
|
||||
use cosmic::cctk::wayland_client::{Connection, WEnum};
|
||||
use cosmic::cctk::wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1;
|
||||
use cosmic::iced::futures::executor::block_on;
|
||||
use cosmic::iced::futures::{FutureExt, SinkExt};
|
||||
use cosmic::iced::{self};
|
||||
use cosmic::iced_winit::platform_specific::wayland::subsurface_widget::{Shmbuf, SubsurfaceBuffer};
|
||||
|
||||
use futures_channel::mpsc;
|
||||
use std::{
|
||||
collections::HashSet,
|
||||
fs,
|
||||
io::{self, Write},
|
||||
sync::{
|
||||
Arc,
|
||||
atomic::{AtomicU32, Ordering},
|
||||
},
|
||||
thread,
|
||||
};
|
||||
use std::collections::HashSet;
|
||||
use std::io::{self, Write};
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::{AtomicU32, Ordering};
|
||||
use std::{fs, thread};
|
||||
|
||||
use super::{CaptureImage, Cmd, Event};
|
||||
use crate::utils;
|
||||
|
|
|
|||
|
|
@ -7,13 +7,9 @@
|
|||
//! There are two backends: one that uses cosmic-comp protocols, and a mock
|
||||
//! backend for testing without any special protocols.
|
||||
|
||||
use cosmic::{
|
||||
cctk::{
|
||||
cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
|
||||
wayland_client::protocol::wl_output,
|
||||
},
|
||||
iced::platform_specific::shell::subsurface_widget::SubsurfaceBuffer,
|
||||
};
|
||||
use cosmic::cctk::cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1;
|
||||
use cosmic::cctk::wayland_client::protocol::wl_output;
|
||||
use cosmic::iced::platform_specific::shell::subsurface_widget::SubsurfaceBuffer;
|
||||
use std::collections::HashSet;
|
||||
|
||||
// Wayland backend using cosmic-comp specific protocols
|
||||
|
|
@ -98,6 +94,7 @@ pub enum Cmd {
|
|||
wl_output::WlOutput,
|
||||
),
|
||||
MoveWorkspaceBefore(ExtWorkspaceHandleV1, ExtWorkspaceHandleV1),
|
||||
#[allow(dead_code)]
|
||||
MoveWorkspaceAfter(ExtWorkspaceHandleV1, ExtWorkspaceHandleV1),
|
||||
ActivateWorkspace(ExtWorkspaceHandleV1),
|
||||
SetWorkspacePinned(ExtWorkspaceHandleV1, bool),
|
||||
|
|
|
|||
|
|
@ -1,15 +1,12 @@
|
|||
use cctk::{
|
||||
screencopy::{Formats, Rect},
|
||||
wayland_client::{
|
||||
Connection, Dispatch, QueueHandle,
|
||||
protocol::{wl_buffer, wl_shm, wl_shm_pool},
|
||||
},
|
||||
use cctk::screencopy::{Formats, Rect};
|
||||
use cctk::wayland_client::protocol::{wl_buffer, wl_shm, wl_shm_pool};
|
||||
use cctk::wayland_client::{Connection, Dispatch, QueueHandle};
|
||||
use cosmic::cctk;
|
||||
use cosmic::iced::platform_specific::shell::subsurface_widget::{
|
||||
BufferSource, Dmabuf, Plane, Shmbuf,
|
||||
};
|
||||
use cosmic::{
|
||||
cctk,
|
||||
iced::platform_specific::shell::subsurface_widget::{BufferSource, Dmabuf, Plane, Shmbuf},
|
||||
};
|
||||
use std::{os::fd::AsFd, sync::Arc};
|
||||
use std::os::fd::AsFd;
|
||||
use std::sync::Arc;
|
||||
use wayland_protocols::wp::linux_dmabuf::zv1::client::zwp_linux_buffer_params_v1;
|
||||
|
||||
use super::AppData;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
use cctk::{
|
||||
screencopy::{CaptureSession, CaptureSource, ScreencopyState},
|
||||
wayland_client::QueueHandle,
|
||||
};
|
||||
use cctk::screencopy::{CaptureSession, CaptureSource, ScreencopyState};
|
||||
use cctk::wayland_client::QueueHandle;
|
||||
use cosmic::cctk;
|
||||
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
|
|
|||
|
|
@ -1,16 +1,11 @@
|
|||
use cctk::{
|
||||
sctk::{
|
||||
self,
|
||||
dmabuf::{DmabufFeedback, DmabufHandler, DmabufState},
|
||||
},
|
||||
wayland_client::{Connection, QueueHandle, protocol::wl_buffer},
|
||||
};
|
||||
use cctk::sctk::dmabuf::{DmabufFeedback, DmabufHandler, DmabufState};
|
||||
use cctk::sctk::{self};
|
||||
use cctk::wayland_client::protocol::wl_buffer;
|
||||
use cctk::wayland_client::{Connection, QueueHandle};
|
||||
use cosmic::cctk;
|
||||
|
||||
use wayland_protocols::wp::linux_dmabuf::zv1::client::{
|
||||
zwp_linux_buffer_params_v1::ZwpLinuxBufferParamsV1,
|
||||
zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1,
|
||||
};
|
||||
use wayland_protocols::wp::linux_dmabuf::zv1::client::zwp_linux_buffer_params_v1::ZwpLinuxBufferParamsV1;
|
||||
use wayland_protocols::wp::linux_dmabuf::zv1::client::zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1;
|
||||
|
||||
use super::AppData;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
use std::{
|
||||
collections::hash_map::{self, HashMap},
|
||||
fs, io,
|
||||
os::unix::fs::MetadataExt,
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
use std::collections::hash_map::{self, HashMap};
|
||||
use std::os::unix::fs::MetadataExt;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::{fs, io};
|
||||
|
||||
// TODO Purge gbm devices that are no longer needed/valid?
|
||||
#[derive(Default)]
|
||||
|
|
|
|||
|
|
@ -2,35 +2,29 @@
|
|||
// subscription.
|
||||
|
||||
use calloop_wayland_source::WaylandSource;
|
||||
use cctk::{
|
||||
cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2,
|
||||
screencopy::{CaptureSource, ScreencopyState},
|
||||
sctk::{
|
||||
self,
|
||||
dmabuf::{DmabufFeedback, DmabufState},
|
||||
registry::{ProvidesRegistryState, RegistryState},
|
||||
seat::{SeatHandler, SeatState},
|
||||
shm::{Shm, ShmHandler},
|
||||
},
|
||||
toplevel_info::ToplevelInfoState,
|
||||
toplevel_management::ToplevelManagerState,
|
||||
wayland_client::{
|
||||
Connection, Proxy, QueueHandle, globals::registry_queue_init, protocol::wl_seat,
|
||||
},
|
||||
workspace::WorkspaceState,
|
||||
};
|
||||
use cosmic::{
|
||||
cctk,
|
||||
iced::{
|
||||
self,
|
||||
futures::{
|
||||
FutureExt, SinkExt,
|
||||
channel::mpsc,
|
||||
executor::{ThreadPool, block_on},
|
||||
},
|
||||
},
|
||||
};
|
||||
use std::{cell::RefCell, collections::HashMap, hash::Hash, sync::Arc, thread};
|
||||
use cctk::cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2;
|
||||
use cctk::screencopy::{CaptureSource, ScreencopyState};
|
||||
use cctk::sctk::dmabuf::{DmabufFeedback, DmabufState};
|
||||
use cctk::sctk::registry::{ProvidesRegistryState, RegistryState};
|
||||
use cctk::sctk::seat::{SeatHandler, SeatState};
|
||||
use cctk::sctk::shm::{Shm, ShmHandler};
|
||||
use cctk::sctk::{self};
|
||||
use cctk::toplevel_info::ToplevelInfoState;
|
||||
use cctk::toplevel_management::ToplevelManagerState;
|
||||
use cctk::wayland_client::globals::registry_queue_init;
|
||||
use cctk::wayland_client::protocol::wl_seat;
|
||||
use cctk::wayland_client::{Connection, Proxy, QueueHandle};
|
||||
use cctk::workspace::WorkspaceState;
|
||||
use cosmic::cctk;
|
||||
use cosmic::iced::futures::channel::mpsc;
|
||||
use cosmic::iced::futures::executor::{ThreadPool, block_on};
|
||||
use cosmic::iced::futures::{FutureExt, SinkExt};
|
||||
use cosmic::iced::{self};
|
||||
use std::cell::RefCell;
|
||||
use std::collections::HashMap;
|
||||
use std::hash::Hash;
|
||||
use std::sync::Arc;
|
||||
use std::thread;
|
||||
|
||||
mod buffer;
|
||||
use buffer::Buffer;
|
||||
|
|
|
|||
|
|
@ -1,21 +1,15 @@
|
|||
use cosmic::{
|
||||
cctk::{
|
||||
self,
|
||||
screencopy::{
|
||||
CaptureFrame, CaptureOptions, CaptureSession, CaptureSource, FailureReason, Formats,
|
||||
Frame, ScreencopyFrameData, ScreencopyFrameDataExt, ScreencopyHandler,
|
||||
ScreencopySessionData, ScreencopySessionDataExt, ScreencopyState,
|
||||
},
|
||||
wayland_client::{Connection, QueueHandle, WEnum},
|
||||
},
|
||||
iced::platform_specific::shell::subsurface_widget::{
|
||||
SubsurfaceBuffer, SubsurfaceBufferRelease,
|
||||
},
|
||||
use cosmic::cctk::screencopy::{
|
||||
CaptureFrame, CaptureOptions, CaptureSession, CaptureSource, FailureReason, Formats, Frame,
|
||||
ScreencopyFrameData, ScreencopyFrameDataExt, ScreencopyHandler, ScreencopySessionData,
|
||||
ScreencopySessionDataExt, ScreencopyState,
|
||||
};
|
||||
use std::{
|
||||
array,
|
||||
sync::{Arc, Weak},
|
||||
use cosmic::cctk::wayland_client::{Connection, QueueHandle, WEnum};
|
||||
use cosmic::cctk::{self};
|
||||
use cosmic::iced::platform_specific::shell::subsurface_widget::{
|
||||
SubsurfaceBuffer, SubsurfaceBufferRelease,
|
||||
};
|
||||
use std::array;
|
||||
use std::sync::{Arc, Weak};
|
||||
|
||||
use super::{AppData, Buffer, Capture, CaptureImage, Event};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
use cctk::{
|
||||
cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
|
||||
toplevel_info::{ToplevelInfoHandler, ToplevelInfoState},
|
||||
toplevel_management::{ToplevelManagerHandler, ToplevelManagerState},
|
||||
wayland_client::{Connection, QueueHandle, WEnum},
|
||||
};
|
||||
use cctk::cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1;
|
||||
use cctk::toplevel_info::{ToplevelInfoHandler, ToplevelInfoState};
|
||||
use cctk::toplevel_management::{ToplevelManagerHandler, ToplevelManagerState};
|
||||
use cctk::wayland_client::{Connection, QueueHandle, WEnum};
|
||||
use cosmic::cctk;
|
||||
use wayland_protocols::ext::foreign_toplevel_list::v1::client::ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
use ash::{prelude::VkResult, vk};
|
||||
use std::{collections::HashMap, ffi::CStr};
|
||||
use ash::prelude::VkResult;
|
||||
use ash::vk;
|
||||
use std::collections::HashMap;
|
||||
use std::ffi::CStr;
|
||||
|
||||
pub struct Vulkan {
|
||||
instance: ash::Instance,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
use cosmic::iced::{self, futures::StreamExt};
|
||||
use std::{any::TypeId, hash::Hash};
|
||||
use cosmic::iced::futures::StreamExt;
|
||||
use cosmic::iced::{self};
|
||||
use std::any::TypeId;
|
||||
use std::hash::Hash;
|
||||
use tokio::sync::broadcast;
|
||||
use tokio_stream::wrappers::BroadcastStream;
|
||||
|
||||
|
|
|
|||
10
src/dnd.rs
10
src/dnd.rs
|
|
@ -1,10 +1,10 @@
|
|||
//! Types related to drag-and-drop
|
||||
|
||||
use cosmic::{
|
||||
cctk::wayland_client::{Proxy, protocol::wl_output},
|
||||
iced::clipboard::mime::AsMimeTypes,
|
||||
};
|
||||
use std::{borrow::Cow, sync::LazyLock};
|
||||
use cosmic::cctk::wayland_client::Proxy;
|
||||
use cosmic::cctk::wayland_client::protocol::wl_output;
|
||||
use cosmic::iced::clipboard::mime::AsMimeTypes;
|
||||
use std::borrow::Cow;
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use crate::backend::{ExtForeignToplevelHandleV1, ExtWorkspaceHandleV1};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
// Copyright 2023 System76 <info@system76.com>
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use i18n_embed::{
|
||||
DefaultLocalizer, LanguageLoader, Localizer,
|
||||
fluent::{FluentLanguageLoader, fluent_language_loader},
|
||||
};
|
||||
use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader};
|
||||
use i18n_embed::{DefaultLocalizer, LanguageLoader, Localizer};
|
||||
use rust_embed::RustEmbed;
|
||||
use std::sync::LazyLock;
|
||||
|
||||
|
|
|
|||
63
src/main.rs
63
src/main.rs
|
|
@ -3,47 +3,38 @@
|
|||
|
||||
#![allow(clippy::single_match)]
|
||||
|
||||
use cctk::{
|
||||
cosmic_protocols::{
|
||||
toplevel_management::v1::client::zcosmic_toplevel_manager_v1,
|
||||
workspace::v2::client::zcosmic_workspace_handle_v2,
|
||||
},
|
||||
sctk::shell::wlr_layer::{Anchor, KeyboardInteractivity, Layer},
|
||||
wayland_client::{Connection, Proxy, protocol::wl_output},
|
||||
wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1,
|
||||
};
|
||||
use cctk::cosmic_protocols::toplevel_management::v1::client::zcosmic_toplevel_manager_v1;
|
||||
use cctk::cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2;
|
||||
use cctk::sctk::shell::wlr_layer::{Anchor, KeyboardInteractivity, Layer};
|
||||
use cctk::wayland_client::protocol::wl_output;
|
||||
use cctk::wayland_client::{Connection, Proxy};
|
||||
use cctk::wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1;
|
||||
use clap::Parser;
|
||||
use cosmic::{
|
||||
app::{Application, CosmicFlags},
|
||||
cctk, dbus_activation,
|
||||
iced::platform_specific::shell::commands::layer_surface::{
|
||||
destroy_layer_surface, get_layer_surface,
|
||||
},
|
||||
iced::runtime::platform_specific::wayland::layer_surface::{
|
||||
IcedOutput, SctkLayerSurfaceSettings,
|
||||
},
|
||||
iced::window::Id as SurfaceId,
|
||||
iced::{
|
||||
self, Size, Subscription, Task,
|
||||
clipboard::dnd::{DndEvent, SourceEvent},
|
||||
event::wayland::{Event as WaylandEvent, LayerEvent, OutputEvent},
|
||||
keyboard::key::{Key, Named},
|
||||
mouse::ScrollDelta,
|
||||
},
|
||||
scroll::DiscreteScrollState,
|
||||
use cosmic::app::{Application, CosmicFlags};
|
||||
use cosmic::iced::clipboard::dnd::{DndEvent, SourceEvent};
|
||||
use cosmic::iced::event::wayland::{Event as WaylandEvent, LayerEvent, OutputEvent};
|
||||
use cosmic::iced::keyboard::key::{Key, Named};
|
||||
use cosmic::iced::mouse::ScrollDelta;
|
||||
use cosmic::iced::platform_specific::shell::commands::layer_surface::{
|
||||
destroy_layer_surface, get_layer_surface,
|
||||
};
|
||||
use cosmic::iced::runtime::platform_specific::wayland::layer_surface::{
|
||||
IcedOutput, SctkLayerSurfaceSettings,
|
||||
};
|
||||
use cosmic::iced::window::Id as SurfaceId;
|
||||
use cosmic::iced::{self, Size, Subscription, Task};
|
||||
use cosmic::scroll::DiscreteScrollState;
|
||||
use cosmic::{cctk, dbus_activation};
|
||||
use cosmic_comp_config::CosmicCompConfig;
|
||||
use cosmic_config::{CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry};
|
||||
use cosmic_config::CosmicConfigEntry;
|
||||
use cosmic_config::cosmic_config_derive::CosmicConfigEntry;
|
||||
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfigEntry, PanelAnchor};
|
||||
use i18n_embed::DesktopLanguageRequester;
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
mem,
|
||||
path::PathBuf,
|
||||
process::Command,
|
||||
str,
|
||||
time::Duration,
|
||||
};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::time::Duration;
|
||||
use std::{mem, str};
|
||||
|
||||
mod dbus;
|
||||
mod desktop_info;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
use rustix::{io::Errno, shm};
|
||||
use std::{
|
||||
os::fd::OwnedFd,
|
||||
time::{SystemTime, UNIX_EPOCH},
|
||||
};
|
||||
use rustix::io::Errno;
|
||||
use rustix::shm;
|
||||
use std::os::fd::OwnedFd;
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn create_memfd() -> rustix::io::Result<OwnedFd> {
|
||||
|
|
|
|||
|
|
@ -1,34 +1,22 @@
|
|||
use cosmic::{
|
||||
Apply,
|
||||
cctk::{
|
||||
cosmic_protocols::{
|
||||
toplevel_info::v1::client::zcosmic_toplevel_handle_v1,
|
||||
workspace::v2::client::zcosmic_workspace_handle_v2,
|
||||
},
|
||||
wayland_client::protocol::wl_output,
|
||||
wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1,
|
||||
},
|
||||
iced::core::{
|
||||
Shadow,
|
||||
text::{Ellipsize, EllipsizeHeightLimit},
|
||||
},
|
||||
iced::{
|
||||
self, Alignment, Border, Length,
|
||||
advanced::layout::flex::Axis,
|
||||
clipboard::mime::{AllowedMimeTypes, AsMimeTypes},
|
||||
platform_specific::shell::subsurface_widget::Subsurface,
|
||||
widget::{column, row},
|
||||
},
|
||||
widget::{self, Widget},
|
||||
};
|
||||
use cosmic::Apply;
|
||||
use cosmic::cctk::cosmic_protocols::toplevel_info::v1::client::zcosmic_toplevel_handle_v1;
|
||||
use cosmic::cctk::cosmic_protocols::workspace::v2::client::zcosmic_workspace_handle_v2;
|
||||
use cosmic::cctk::wayland_client::protocol::wl_output;
|
||||
use cosmic::cctk::wayland_protocols::ext::workspace::v1::client::ext_workspace_handle_v1;
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
use cosmic::iced::clipboard::mime::{AllowedMimeTypes, AsMimeTypes};
|
||||
use cosmic::iced::core::Shadow;
|
||||
use cosmic::iced::core::text::{Ellipsize, EllipsizeHeightLimit};
|
||||
use cosmic::iced::platform_specific::shell::subsurface_widget::Subsurface;
|
||||
use cosmic::iced::widget::{column, row};
|
||||
use cosmic::iced::{self, Alignment, Border, Length};
|
||||
use cosmic::widget::{self, Widget};
|
||||
use cosmic_comp_config::workspace::WorkspaceLayout;
|
||||
use std::collections::HashSet;
|
||||
|
||||
use crate::{
|
||||
App, LayerSurface, Msg, Toplevel, Workspace,
|
||||
backend::{self, CaptureImage},
|
||||
dnd::{Drag, DragSurface, DragToplevel, DragWorkspace, DropTarget},
|
||||
};
|
||||
use crate::backend::{self, CaptureImage};
|
||||
use crate::dnd::{Drag, DragSurface, DragToplevel, DragWorkspace, DropTarget};
|
||||
use crate::{App, LayerSurface, Msg, Toplevel, Workspace};
|
||||
|
||||
fn dnd_source_with_drag_surface<D: AsMimeTypes + Send + Clone + 'static>(
|
||||
drag_content: D,
|
||||
|
|
|
|||
|
|
@ -1,19 +1,15 @@
|
|||
// Renders image behind widget, and otherwise passes through all behavior
|
||||
|
||||
use cosmic::iced::{
|
||||
Length, Rectangle, Size, Vector,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget,
|
||||
layout::{self},
|
||||
mouse, overlay, renderer,
|
||||
widget::{Operation, Tree, tree},
|
||||
},
|
||||
core::Renderer,
|
||||
event::Event,
|
||||
};
|
||||
use cosmic::iced::advanced::layout::{self};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree, tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, mouse, overlay, renderer};
|
||||
use cosmic::iced::core::Renderer;
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size, Vector};
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn image_bg<'a, Msg, T1: Into<cosmic::Element<'a, Msg>>, T2: Into<cosmic::Element<'a, Msg>>>(
|
||||
content: T1,
|
||||
bg: T2,
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
//! Show one surface, sized to match the size of another (invisible) widget
|
||||
|
||||
use cosmic::iced::{
|
||||
Length, Rectangle, Size,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget, layout, mouse, renderer,
|
||||
widget::{Operation, Tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, layout, mouse, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub fn match_size<
|
||||
|
|
|
|||
|
|
@ -1,11 +1,7 @@
|
|||
use cosmic::iced::{
|
||||
Length, Rectangle, Size, Vector,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget, layout, mouse, overlay, renderer,
|
||||
widget::{Id, Operation, Tree, tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::widget::{Id, Operation, Tree, tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, layout, mouse, overlay, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size, Vector};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
mod image_bg;
|
||||
|
|
|
|||
|
|
@ -1,14 +1,11 @@
|
|||
use cosmic::iced::{
|
||||
Length, Rectangle, Size, Vector,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget, layout, mouse, overlay, renderer,
|
||||
widget::{Id, Operation, Tree, tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::widget::{Id, Operation, Tree, tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, layout, mouse, overlay, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size, Vector};
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn mouse_interaction_wrapper<'a, Msg, T: Into<cosmic::Element<'a, Msg>>>(
|
||||
mouse_interaction: mouse::Interaction,
|
||||
content: T,
|
||||
|
|
|
|||
|
|
@ -1,15 +1,11 @@
|
|||
// This widget defines it's cross axis size as the `index`th child's size
|
||||
|
||||
use cosmic::iced::{
|
||||
Length, Point, Rectangle, Size,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget,
|
||||
layout::{self, flex::Axis},
|
||||
mouse, renderer,
|
||||
widget::{Operation, Tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
use cosmic::iced::advanced::layout::{self, Limits};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, mouse, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Point, Rectangle, Size};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
// Duplicate of private methods
|
||||
|
|
@ -78,25 +74,38 @@ impl<Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for SizeCrossNth<'_, Msg>
|
|||
&mut self,
|
||||
tree: &mut Tree,
|
||||
renderer: &cosmic::Renderer,
|
||||
limits: &layout::Limits,
|
||||
limits: &Limits,
|
||||
) -> layout::Node {
|
||||
let max_main = self.axis.main(limits.max());
|
||||
let max_cross = self.axis.cross(limits.max());
|
||||
|
||||
// XXX cleaner solution
|
||||
// Get layout of main widget, to set overall cross axis size
|
||||
let (max_width, max_height) = self.axis.pack(max_main, max_cross);
|
||||
let child_limits = layout::Limits::new(Size::ZERO, Size::new(max_width, max_height));
|
||||
// Lay out all non-reference children to get their total main size
|
||||
let mut total_main = 0.0;
|
||||
for (i, (child, tree)) in self
|
||||
.children
|
||||
.iter_mut()
|
||||
.zip(tree.children.iter_mut())
|
||||
.enumerate()
|
||||
{
|
||||
if i != self.index {
|
||||
let (max_width, max_height) = self.axis.pack(max_main - total_main, max_cross);
|
||||
let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height));
|
||||
let layout = child.as_widget_mut().layout(tree, renderer, &child_limits);
|
||||
total_main += self.axis.main(layout.size());
|
||||
}
|
||||
}
|
||||
|
||||
// Lay out reference child with remaining main to get max cross size
|
||||
let (max_width, max_height) = self.axis.pack(max_main - total_main, max_cross);
|
||||
let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height));
|
||||
let layout = self.children[self.index].as_widget_mut().layout(
|
||||
&mut tree.children[self.index],
|
||||
renderer,
|
||||
&child_limits,
|
||||
);
|
||||
|
||||
let max_cross = self.axis.cross(layout.size());
|
||||
|
||||
// XXX sill allocating maximum main axis?
|
||||
// - what was it doing before?
|
||||
// Lay out all children constrained to reference cross
|
||||
let mut total_main = 0.0;
|
||||
let nodes = self
|
||||
.children
|
||||
|
|
@ -104,8 +113,7 @@ impl<Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for SizeCrossNth<'_, Msg>
|
|||
.zip(tree.children.iter_mut())
|
||||
.map(|(child, tree)| {
|
||||
let (max_width, max_height) = self.axis.pack(max_main - total_main, max_cross);
|
||||
let child_limits =
|
||||
layout::Limits::new(Size::ZERO, Size::new(max_width, max_height));
|
||||
let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height));
|
||||
let mut layout = child.as_widget_mut().layout(tree, renderer, &child_limits);
|
||||
// Center on cross axis
|
||||
let cross = ((max_cross - self.axis.cross(layout.size())) / 2.).max(0.);
|
||||
|
|
|
|||
|
|
@ -1,13 +1,9 @@
|
|||
use cosmic::iced::{
|
||||
Length, Rectangle, Size, Vector,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget,
|
||||
layout::{self, flex::Axis},
|
||||
mouse, renderer,
|
||||
widget::{Operation, Tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
use cosmic::iced::advanced::layout::{self};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, mouse, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size, Vector};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
mod toplevel_layout;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
use aliasable::vec::AliasableVec;
|
||||
use cosmic::iced::{Length, Point, Rectangle, Size, advanced::layout::flex::Axis};
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
use cosmic::iced::{Length, Point, Rectangle, Size};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use super::{LayoutToplevel, ToplevelLayout};
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
use cosmic::iced::{Length, advanced::layout::flex::Axis};
|
||||
use cosmic::iced::Length;
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
|
||||
use super::{
|
||||
LayoutToplevel,
|
||||
axis_toplevel_layout::{AxisPoint, AxisRectangle, AxisSize, AxisToplevelLayout},
|
||||
};
|
||||
use super::LayoutToplevel;
|
||||
use super::axis_toplevel_layout::{AxisPoint, AxisRectangle, AxisSize, AxisToplevelLayout};
|
||||
|
||||
pub(crate) struct RowColToplevelLayout {
|
||||
pub axis: Axis,
|
||||
|
|
|
|||
|
|
@ -1,10 +1,9 @@
|
|||
use cosmic::iced::{Length, advanced::layout::flex::Axis};
|
||||
use cosmic::iced::Length;
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
|
||||
use super::{
|
||||
LayoutToplevel,
|
||||
axis_toplevel_layout::{AxisRectangle, AxisSize, AxisToplevelLayout},
|
||||
row_col_toplevel_layout::RowColToplevelLayout,
|
||||
};
|
||||
use super::LayoutToplevel;
|
||||
use super::axis_toplevel_layout::{AxisRectangle, AxisSize, AxisToplevelLayout};
|
||||
use super::row_col_toplevel_layout::RowColToplevelLayout;
|
||||
|
||||
pub(crate) struct TwoRowColToplevelLayout(RowColToplevelLayout);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +1,10 @@
|
|||
//! If `visible` is set to `true`, behaves exactly as wrapped widget. If `false`,
|
||||
//! takes the same space but does not draw.
|
||||
|
||||
use cosmic::iced::{
|
||||
Length, Rectangle, Size,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget, layout, mouse, renderer,
|
||||
widget::{Operation, Tree},
|
||||
},
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, layout, mouse, renderer};
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Rectangle, Size};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub fn visibility_wrapper<'a, Msg, T: Into<cosmic::Element<'a, Msg>>>(
|
||||
|
|
|
|||
|
|
@ -1,17 +1,13 @@
|
|||
// Custom varian of row/column
|
||||
// Gives each child widget a maximum size on main axis of total/n
|
||||
|
||||
use cosmic::iced::{
|
||||
Length, Point, Rectangle, Size,
|
||||
advanced::{
|
||||
Clipboard, Layout, Shell, Widget,
|
||||
layout::{self, flex::Axis},
|
||||
mouse, renderer,
|
||||
widget::{Operation, Tree},
|
||||
},
|
||||
core::clipboard::DndDestinationRectangles,
|
||||
event::{self, Event},
|
||||
};
|
||||
use cosmic::iced::advanced::layout::flex::Axis;
|
||||
use cosmic::iced::advanced::layout::{self};
|
||||
use cosmic::iced::advanced::widget::{Operation, Tree};
|
||||
use cosmic::iced::advanced::{Clipboard, Layout, Shell, Widget, mouse, renderer};
|
||||
use cosmic::iced::core::clipboard::DndDestinationRectangles;
|
||||
use cosmic::iced::event::Event;
|
||||
use cosmic::iced::{Length, Point, Rectangle, Size};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
// Duplicate of private methods
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue