Skip to content

Commit 8f9f287

Browse files
authored
feat(window_management): add window edge snapping setting
1 parent a44071b commit 8f9f287

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

cosmic-settings/src/pages/desktop/window_management.rs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub enum Message {
2525
ShowActiveWindowHint(bool),
2626
ShowMaximizeButton(bool),
2727
ShowMinimizeButton(bool),
28+
SetEdgeSnapThreshold(u32),
2829
}
2930

3031
pub struct Page {
@@ -36,6 +37,7 @@ pub struct Page {
3637
focus_delay_text: String,
3738
cursor_follows_focus: bool,
3839
show_active_hint: bool,
40+
edge_snap_threshold: u32,
3941
}
4042

4143
impl Default for Page {
@@ -76,6 +78,15 @@ impl Default for Page {
7678
})
7779
.unwrap_or(true);
7880

81+
let edge_snap_threshold = comp_config
82+
.get("edge_snap_threshold")
83+
.inspect_err(|err| {
84+
if !matches!(err, cosmic_config::Error::NoConfigDirectory) {
85+
error!(?err, "Failed to read config 'edge_snap_threshold'")
86+
}
87+
})
88+
.unwrap_or(0);
89+
7990
Page {
8091
super_key_selections: vec![
8192
fl!("super-key", "launcher"),
@@ -90,6 +101,7 @@ impl Default for Page {
90101
focus_delay_text: format!("{focus_follows_cursor_delay}"),
91102
cursor_follows_focus,
92103
show_active_hint,
104+
edge_snap_threshold,
93105
}
94106
}
95107
}
@@ -168,6 +180,12 @@ impl Page {
168180
error!(?err, "Failed to set config 'active_hint'");
169181
}
170182
}
183+
Message::SetEdgeSnapThreshold(value) => {
184+
self.edge_snap_threshold = value;
185+
if let Err(err) = self.comp_config.set("edge_snap_threshold", value) {
186+
error!(?err, "Failed to set config 'edge_snap_threshold'");
187+
}
188+
}
171189
}
172190
}
173191
}
@@ -179,7 +197,7 @@ impl page::Page<crate::pages::Message> for Page {
179197
sections: &mut SlotMap<section::Entity, Section<crate::pages::Message>>,
180198
) -> Option<page::Content> {
181199
Some(vec![
182-
sections.insert(super_key_action()),
200+
sections.insert(window_management()),
183201
sections.insert(window_controls()),
184202
sections.insert(focus_navigation()),
185203
])
@@ -197,7 +215,7 @@ impl page::Page<crate::pages::Message> for Page {
197215

198216
impl page::AutoBind<crate::pages::Message> for Page {}
199217

200-
pub fn super_key_action() -> Section<crate::pages::Message> {
218+
pub fn window_management() -> Section<crate::pages::Message> {
201219
let mut descriptions = Slab::new();
202220

203221
let super_key = descriptions.insert(fl!("super-key"));
@@ -206,6 +224,8 @@ pub fn super_key_action() -> Section<crate::pages::Message> {
206224
let _applications = descriptions.insert(fl!("super-key", "applications"));
207225
let _disable = descriptions.insert(fl!("super-key", "disable"));
208226

227+
let edge_gravity = descriptions.insert(fl!("edge-gravity"));
228+
209229
Section::default()
210230
.descriptions(descriptions)
211231
.view::<Page>(move |_binder, page, section| {
@@ -220,6 +240,12 @@ pub fn super_key_action() -> Section<crate::pages::Message> {
220240
Message::SuperKey,
221241
)),
222242
)
243+
.add(settings::item(
244+
&descriptions[edge_gravity],
245+
toggler(page.edge_snap_threshold != 0).on_toggle(|is_enabled| {
246+
Message::SetEdgeSnapThreshold(if is_enabled { 10 } else { 0 })
247+
}),
248+
))
223249
.apply(Element::from)
224250
.map(crate::pages::Message::WindowManagement)
225251
})

i18n/en/cosmic_settings.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ super-key = Super key action
302302
.applications = Open Applications
303303
.disable = Disable
304304
305+
edge-gravity = Floating windows gravitate to nearby edges
306+
305307
window-controls = Window Controls
306308
.maximize = Show maximize button
307309
.minimize = Show minimize button

0 commit comments

Comments
 (0)