Skip to content

Commit ccbc3bf

Browse files
committed
settings: Support button_placement key
See github.com/flatpak/xdg-desktop-portal/pull/1821 for reference
1 parent 2477a1b commit ccbc3bf

File tree

4 files changed

+162
-2
lines changed

4 files changed

+162
-2
lines changed

src/app.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ impl cosmic::Application for CosmicPortal {
163163
subscription::Event::Config(config) => self.update(Msg::ConfigSubUpdate(config)),
164164
subscription::Event::Accent(_)
165165
| subscription::Event::IsDark(_)
166-
| subscription::Event::HighContrast(_) => cosmic::iced::Task::none(),
166+
| subscription::Event::HighContrast(_) |
167+
subscription::Event::ButtonPlacement(_) => cosmic::iced::Task::none(),
167168
subscription::Event::Init(tx) => {
168169
self.tx = Some(tx);
169170
Task::none()

src/main.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,13 @@ const APPEARANCE_NAMESPACE: &str = "org.freedesktop.appearance";
191191
const COLOR_SCHEME_KEY: &str = "color-scheme";
192192
const ACCENT_COLOR_KEY: &str = "accent-color";
193193
const CONTRAST_KEY: &str = "contrast";
194+
const BUTTON_PLACEMENT_KEY: &str = "button-placement";
194195

195196
struct Settings {
196197
pub color_scheme: ColorScheme,
197198
pub contrast: Contrast,
198199
pub accent: Srgba<f64>,
200+
pub button_placement: (Vec<String>, Vec<String>),
199201
}
200202

201203
impl Settings {
@@ -214,8 +216,25 @@ impl Settings {
214216
ColorScheme::PreferLight
215217
},
216218
accent: cosmic.accent_color().into_format(),
219+
button_placement: {
220+
let mut leading = Vec::<String>::new();
221+
if cosmic::config::show_minimize() {
222+
leading.push("minimize".to_string());
223+
}
224+
if cosmic::config::show_maximize() {
225+
leading.push("maximize".to_string());
226+
}
227+
leading.push("close".to_string());
228+
(Vec::<String>::default(), leading)
229+
},
217230
}
218231
}
232+
233+
fn button_placement_key_to_value(&self) -> zvariant::OwnedValue {
234+
let temp: &zvariant::Value = &self.button_placement.clone().into();
235+
let value = temp.try_into().unwrap();
236+
return value;
237+
}
219238
}
220239

221240
#[zbus::interface(name = "org.freedesktop.impl.portal.Settings")]
@@ -256,6 +275,7 @@ impl Settings {
256275
}) {
257276
inner.insert(ACCENT_COLOR_KEY.to_string(), value);
258277
}
278+
inner.insert(BUTTON_PLACEMENT_KEY.to_string(), self.button_placement_key_to_value());
259279
map.insert(APPEARANCE_NAMESPACE.to_string(), inner);
260280
}
261281
map
@@ -274,6 +294,7 @@ impl Settings {
274294
blue: self.accent.blue,
275295
})
276296
.map_err(|e| zbus::fdo::Error::Failed(e.to_string())),
297+
(APPEARANCE_NAMESPACE, BUTTON_PLACEMENT_KEY) => Ok(self.button_placement_key_to_value()),
277298
_ => Err(zbus::fdo::Error::Failed(
278299
"Unknown namespace or key".to_string(),
279300
)),

src/subscription.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tokio::sync::mpsc::Receiver;
88
use zbus::{Connection, zvariant};
99

1010
use crate::{
11-
ACCENT_COLOR_KEY, APPEARANCE_NAMESPACE, COLOR_SCHEME_KEY, CONTRAST_KEY, ColorScheme, Contrast,
11+
ACCENT_COLOR_KEY, APPEARANCE_NAMESPACE, COLOR_SCHEME_KEY, CONTRAST_KEY, BUTTON_PLACEMENT_KEY, ColorScheme, Contrast,
1212
DBUS_NAME, DBUS_PATH, Settings, access::Access, config, file_chooser::FileChooser,
1313
screencast::ScreenCast, screenshot::Screenshot, wayland,
1414
};
@@ -23,6 +23,7 @@ pub enum Event {
2323
Accent(Srgba),
2424
IsDark(bool),
2525
HighContrast(bool),
26+
ButtonPlacement((Vec<String>, Vec<String>)),
2627
Config(config::Config),
2728
Init(tokio::sync::mpsc::Sender<Event>),
2829
}
@@ -174,6 +175,21 @@ pub(crate) async fn process_changes(
174175
zvariant::Value::from(iface.contrast as u32),
175176
)
176177
.await?;
178+
},
179+
Event::ButtonPlacement(placement_key) => {
180+
let object_server = conn.object_server();
181+
let iface_ref = object_server.interface::<_, Settings>(DBUS_PATH).await?;
182+
let mut iface = iface_ref.get_mut().await;
183+
iface.button_placement = placement_key;
184+
185+
iface
186+
.setting_changed(
187+
iface_ref.signal_emitter(),
188+
APPEARANCE_NAMESPACE,
189+
BUTTON_PLACEMENT_KEY,
190+
iface.button_placement_key_to_value().into(),
191+
)
192+
.await?;
177193
}
178194
Event::Config(config) => {
179195
if let Err(err) = output.send(Event::Config(config)).await {

tags.MSOb46

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package Cargo.toml /^[package]$/;" t
2+
name Cargo.toml /^name = "xdg-desktop-portal-cosmic"$/;" K table:package
3+
xdg-desktop-portal-cosmic Cargo.toml /^name = "xdg-desktop-portal-cosmic"$/;" p
4+
version Cargo.toml /^version = "0.1.0"$/;" K table:package
5+
edition Cargo.toml /^edition = "2024"$/;" K table:package
6+
license Cargo.toml /^license = "GPL-3.0-or-later"$/;" K table:package
7+
features Cargo.toml /^[features]$/;" t
8+
default Cargo.toml /^default = []$/;" K table:features
9+
wgpu Cargo.toml /^wgpu = ["libcosmic\/wgpu"]$/;" K table:features
10+
workspace Cargo.toml /^[workspace]$/;" t
11+
members Cargo.toml /^members = ["cosmic-portal-config"]$/;" K table:workspace
12+
dependencies Cargo.toml /^[dependencies]$/;" t
13+
anyhow Cargo.toml /^anyhow = "1.0.99"$/;" K table:dependencies
14+
ashpd Cargo.toml /^ashpd = "0.12"$/;" K table:dependencies
15+
cosmic-files Cargo.toml /^cosmic-files = { git = "https:\/\/github.com\/pop-os\/cosmic-files", default-features = false, f/;" K table:dependencies
16+
git Cargo.toml /^cosmic-files = { git = "https:\/\/github.com\/pop-os\/cosmic-files", default-features = false, f/;" K table:dependencies
17+
default-features Cargo.toml /^cosmic-files = { git = "https:\/\/github.com\/pop-os\/cosmic-files", default-features = false, f/;" K table:dependencies
18+
features Cargo.toml /^cosmic-files = { git = "https:\/\/github.com\/pop-os\/cosmic-files", default-features = false, f/;" K table:dependencies
19+
cosmic-protocols Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50" }$/;" K table:dependencies
20+
git Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50" }$/;" K table:dependencies
21+
rev Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50" }$/;" K table:dependencies
22+
cosmic-client-toolkit Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50/;" K table:dependencies
23+
git Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50/;" K table:dependencies
24+
rev Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols", rev = "6254f50/;" K table:dependencies
25+
futures Cargo.toml /^futures = "0.3"$/;" K table:dependencies
26+
image Cargo.toml /^image = "0.25"$/;" K table:dependencies
27+
cosmic-bg-config Cargo.toml /^cosmic-bg-config = { git = "https:\/\/github.com\/pop-os\/cosmic-bg" }$/;" K table:dependencies
28+
git Cargo.toml /^cosmic-bg-config = { git = "https:\/\/github.com\/pop-os\/cosmic-bg" }$/;" K table:dependencies
29+
cosmic-portal-config Cargo.toml /^cosmic-portal-config = { path = ".\/cosmic-portal-config" }$/;" K table:dependencies
30+
path Cargo.toml /^cosmic-portal-config = { path = ".\/cosmic-portal-config" }$/;" K table:dependencies
31+
memmap2 Cargo.toml /^memmap2 = "0.9.8"$/;" K table:dependencies
32+
pipewire Cargo.toml /^pipewire = { git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-rs", features = [$/;" K table:dependencies
33+
git Cargo.toml /^pipewire = { git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-rs", features = [$/;" K table:dependencies
34+
features Cargo.toml /^pipewire = { git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-rs", features = [$/;" K table:dependencies
35+
png Cargo.toml /^png = "0.18"$/;" K table:dependencies
36+
rustix Cargo.toml /^rustix = { version = "1.1", features = ["fs"] }$/;" K table:dependencies
37+
version Cargo.toml /^rustix = { version = "1.1", features = ["fs"] }$/;" K table:dependencies
38+
features Cargo.toml /^rustix = { version = "1.1", features = ["fs"] }$/;" K table:dependencies
39+
zbus Cargo.toml /^zbus = { version = "5.11.0", default-features = false, features = ["tokio"] }$/;" K table:dependencies
40+
version Cargo.toml /^zbus = { version = "5.11.0", default-features = false, features = ["tokio"] }$/;" K table:dependencies
41+
default-features Cargo.toml /^zbus = { version = "5.11.0", default-features = false, features = ["tokio"] }$/;" K table:dependencies
42+
features Cargo.toml /^zbus = { version = "5.11.0", default-features = false, features = ["tokio"] }$/;" K table:dependencies
43+
gbm Cargo.toml /^gbm = "0.18.0"$/;" K table:dependencies
44+
wayland-protocols Cargo.toml /^wayland-protocols = "0.32.9"$/;" K table:dependencies
45+
env_logger Cargo.toml /^env_logger = "0.11.8"$/;" K table:dependencies
46+
dirs Cargo.toml /^dirs = "6.0.0"$/;" K table:dependencies
47+
chrono Cargo.toml /^chrono = "0.4"$/;" K table:dependencies
48+
url Cargo.toml /^url = "2.5"$/;" K table:dependencies
49+
i18n-embed Cargo.toml /^i18n-embed = { version = "0.16", features = [$/;" K table:dependencies
50+
version Cargo.toml /^i18n-embed = { version = "0.16", features = [$/;" K table:dependencies
51+
features Cargo.toml /^i18n-embed = { version = "0.16", features = [$/;" K table:dependencies
52+
i18n-embed-fl Cargo.toml /^i18n-embed-fl = "0.10"$/;" K table:dependencies
53+
rust-embed Cargo.toml /^rust-embed = "8.7.2"$/;" K table:dependencies
54+
cosmic-config.workspace Cargo.toml /^cosmic-config.workspace = true$/;" K table:dependencies
55+
log.workspace Cargo.toml /^log.workspace = true$/;" K table:dependencies
56+
serde.workspace Cargo.toml /^serde.workspace = true$/;" K table:dependencies
57+
freedesktop-desktop-entry Cargo.toml /^freedesktop-desktop-entry = "0.7.14"$/;" K table:dependencies
58+
spa_sys Cargo.toml /^spa_sys = { package = "libspa-sys", git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-/;" K table:dependencies
59+
package Cargo.toml /^spa_sys = { package = "libspa-sys", git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-/;" K table:dependencies
60+
git Cargo.toml /^spa_sys = { package = "libspa-sys", git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-/;" K table:dependencies
61+
pipewire-sys Cargo.toml /^pipewire-sys = { git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-rs" }$/;" K table:dependencies
62+
git Cargo.toml /^pipewire-sys = { git = "https:\/\/gitlab.freedesktop.org\/pipewire\/pipewire-rs" }$/;" K table:dependencies
63+
tempfile Cargo.toml /^tempfile = "3.22.0"$/;" K table:dependencies
64+
tokio Cargo.toml /^tokio = { version = "1.47.1", features = ["macros", "net", "rt", "sync"] }$/;" K table:dependencies
65+
version Cargo.toml /^tokio = { version = "1.47.1", features = ["macros", "net", "rt", "sync"] }$/;" K table:dependencies
66+
features Cargo.toml /^tokio = { version = "1.47.1", features = ["macros", "net", "rt", "sync"] }$/;" K table:dependencies
67+
wayland-client Cargo.toml /^wayland-client = { version = "0.31.11" }$/;" K table:dependencies
68+
version Cargo.toml /^wayland-client = { version = "0.31.11" }$/;" K table:dependencies
69+
dependencies.libcosmic Cargo.toml /^[dependencies.libcosmic]$/;" t
70+
git Cargo.toml /^git = "https:\/\/github.com\/pop-os\/libcosmic"$/;" K table:dependencies.libcosmic
71+
default-features Cargo.toml /^default-features = false$/;" K table:dependencies.libcosmic
72+
features Cargo.toml /^features = [$/;" K table:dependencies.libcosmic
73+
workspace.dependencies Cargo.toml /^[workspace.dependencies]$/;" t
74+
cosmic-config Cargo.toml /^cosmic-config = { git = "https:\/\/github.com\/pop-os\/libcosmic" }$/;" K table:workspace.dependencies
75+
git Cargo.toml /^cosmic-config = { git = "https:\/\/github.com\/pop-os\/libcosmic" }$/;" K table:workspace.dependencies
76+
log Cargo.toml /^log = "0.4.28"$/;" K table:workspace.dependencies
77+
serde Cargo.toml /^serde = "1.0.219"$/;" K table:workspace.dependencies
78+
dev-dependencies Cargo.toml /^[dev-dependencies]$/;" t
79+
gst Cargo.toml /^gst = { package = "gstreamer", version = "0.24.1" }$/;" K table:dev-dependencies
80+
package Cargo.toml /^gst = { package = "gstreamer", version = "0.24.1" }$/;" K table:dev-dependencies
81+
version Cargo.toml /^gst = { package = "gstreamer", version = "0.24.1" }$/;" K table:dev-dependencies
82+
clap Cargo.toml /^clap = { version = "4.5.47", features = ["derive"] }$/;" K table:dev-dependencies
83+
version Cargo.toml /^clap = { version = "4.5.47", features = ["derive"] }$/;" K table:dev-dependencies
84+
features Cargo.toml /^clap = { version = "4.5.47", features = ["derive"] }$/;" K table:dev-dependencies
85+
profile.release Cargo.toml /^[profile.release]$/;" t
86+
opt-level Cargo.toml /^opt-level = 3$/;" K table:profile.release
87+
lto Cargo.toml /^lto = "thin"$/;" K table:profile.release
88+
patch."https://github.com/pop-os/cosmic-protocols" Cargo.toml /^[patch."https:\/\/github.com\/pop-os\/cosmic-protocols"]$/;" t
89+
cosmic-protocols Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "main"/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
90+
git Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "main"/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
91+
branch Cargo.toml /^cosmic-protocols = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "main"/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
92+
cosmic-client-toolkit Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
93+
git Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
94+
branch Cargo.toml /^cosmic-client-toolkit = { git = "https:\/\/github.com\/pop-os\/cosmic-protocols\/\/", branch = "/;" K table:patch."https://github.com/pop-os/cosmic-protocols"
95+
patch.crates-io Cargo.toml /^[patch.crates-io]$/;" t
96+
license Cargo.toml /^license = { git = "https:\/\/github.com\/evenorog\/license.git" }$/;" K table:patch.crates-io
97+
git Cargo.toml /^license = { git = "https:\/\/github.com\/evenorog\/license.git" }$/;" K table:patch.crates-io
98+
prefix Makefile /^prefix ?= \/usr$/;" m
99+
bindir Makefile /^bindir = $(prefix)\/bin$/;" m
100+
libdir Makefile /^libdir = $(prefix)\/lib$/;" m
101+
libexecdir Makefile /^libexecdir = $(prefix)\/libexec$/;" m
102+
includedir Makefile /^includedir = $(prefix)\/include$/;" m
103+
datarootdir Makefile /^datarootdir = $(prefix)\/share$/;" m
104+
datadir Makefile /^datadir = $(datarootdir)$/;" m
105+
iconsdir Makefile /^iconsdir = $(datarootdir)\/icons\/hicolor$/;" m
106+
CARGO_TARGET_DIR Makefile /^CARGO_TARGET_DIR ?= target$/;" m
107+
TARGET Makefile /^TARGET = debug$/;" m
108+
DEBUG Makefile /^DEBUG ?= 0$/;" m
109+
TARGET Makefile /^ TARGET = release$/;" m
110+
VENDOR Makefile /^VENDOR ?= 0$/;" m
111+
BIN Makefile /^BIN = xdg-desktop-portal-cosmic$/;" m
112+
DBUS_NAME Makefile /^DBUS_NAME = org.freedesktop.impl.portal.desktop.cosmic$/;" m
113+
all Makefile /^all: $(BIN)$/;" t
114+
clean Makefile /^clean:$/;" t
115+
distclean Makefile /^distclean: clean$/;" t
116+
$(BIN) Makefile /^$(BIN): Cargo.toml Cargo.lock src\/main.rs vendor-check$/;" t
117+
install Makefile /^install:$/;" t
118+
vendor Makefile /^vendor:$/;" t
119+
vendor-check Makefile /^vendor-check:$/;" t
120+
fallback_language i18n.toml /^fallback_language = "en"$/;" K
121+
fluent i18n.toml /^[fluent]$/;" t
122+
assets_dir i18n.toml /^assets_dir = ".\/i18n"/;" K table:fluent

0 commit comments

Comments
 (0)