Skip to content

Commit 8246b8a

Browse files
committedFeb 19, 2025··
fix(displays): fix display data refresh spam & mismatched scale value
1 parent 804340f commit 8246b8a

File tree

1 file changed

+31
-34
lines changed
  • cosmic-settings/src/pages/display

1 file changed

+31
-34
lines changed
 

‎cosmic-settings/src/pages/display/mod.rs

+31-34
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ use cosmic_randr_shell::{
1717
AdaptiveSyncAvailability, AdaptiveSyncState, List, Output, OutputKey, Transform,
1818
};
1919
use cosmic_settings_page::{self as page, section, Section};
20+
use futures::pin_mut;
2021
use once_cell::sync::Lazy;
2122
use slab::Slab;
2223
use slotmap::{Key, SecondaryMap, SlotMap};
24+
use std::sync::atomic::{AtomicBool, Ordering};
2325
use std::{collections::BTreeMap, process::ExitStatus, sync::Arc};
2426
use tokio::sync::oneshot;
2527
use tracing::error;
@@ -91,8 +93,6 @@ pub enum Message {
9193
Pan(arrangement::Pan),
9294
/// Status of an applied display change.
9395
RandrResult(Arc<std::io::Result<ExitStatus>>),
94-
/// Request to reload the page.
95-
Refresh,
9696
/// Set the refresh rate of a display.
9797
RefreshRate(usize),
9898
/// Set the VRR mode of a display.
@@ -132,6 +132,8 @@ enum Randr {
132132

133133
/// The page struct for the display settings page.
134134
pub struct Page {
135+
/// Set when the page is being refreshed
136+
refreshing_page: Arc<AtomicBool>,
135137
list: List,
136138
display_tabs: segmented_button::SingleSelectModel,
137139
mirror_map: SecondaryMap<OutputKey, OutputKey>,
@@ -167,6 +169,7 @@ impl Default for Page {
167169
});
168170

169171
Self {
172+
refreshing_page: Arc::new(AtomicBool::new(false)),
170173
list: List::default(),
171174
display_tabs: segmented_button::SingleSelectModel::default(),
172175
mirror_map: SecondaryMap::new(),
@@ -258,16 +261,15 @@ impl page::Page<crate::pages::Message> for Page {
258261
fl!("orientation", "rotate-270"),
259262
];
260263

261-
use std::time::Duration;
262-
263-
use futures::pin_mut;
264-
265264
if let Some(canceller) = self.background_service_cancel.take() {
266265
_ = canceller.send(());
267266
}
268267

268+
self.refreshing_page.store(true, Ordering::SeqCst);
269+
269270
#[cfg(feature = "wayland")]
270271
{
272+
let refreshing_page = self.refreshing_page.clone();
271273
let (tx, mut rx) = tachyonix::channel(4);
272274
let (canceller, cancelled) = oneshot::channel();
273275
let runtime = tokio::runtime::Handle::current();
@@ -299,15 +301,11 @@ impl page::Page<crate::pages::Message> for Page {
299301
}
300302

301303
if let cosmic_randr::Message::ManagerDone = message {
302-
if matches!(
303-
tokio::time::timeout(
304-
Duration::from_secs(1),
305-
sender.send(pages::Message::Displays(Message::Refresh))
306-
)
307-
.await,
308-
Err(_) | Ok(Err(_))
309-
) {
310-
return;
304+
if !refreshing_page.swap(true, Ordering::SeqCst) {
305+
let sender = sender.clone();
306+
tokio::spawn(async move {
307+
_ = sender.send(on_enter().await).await;
308+
});
311309
}
312310
}
313311
}
@@ -510,12 +508,6 @@ impl Page {
510508

511509
Message::Position(display, x, y) => return self.set_position(display, x, y),
512510

513-
Message::Refresh => {
514-
return cosmic::task::future(async move {
515-
crate::Message::PageMessage(on_enter().await)
516-
});
517-
}
518-
519511
Message::RefreshRate(rate) => return self.set_refresh_rate(rate),
520512

521513
Message::VariableRefreshRate(mode) => return self.set_vrr(mode),
@@ -537,17 +529,21 @@ impl Page {
537529
}
538530
}
539531

540-
Message::Update { randr } => match Arc::into_inner(randr) {
541-
Some(Ok(outputs)) => {
542-
self.update_displays(outputs);
543-
}
532+
Message::Update { randr } => {
533+
match Arc::into_inner(randr) {
534+
Some(Ok(outputs)) => {
535+
self.update_displays(outputs);
536+
}
537+
538+
Some(Err(why)) => {
539+
tracing::error!(?why, "error fetching displays");
540+
}
544541

545-
Some(Err(why)) => {
546-
tracing::error!(?why, "error fetching displays");
542+
None => (),
547543
}
548544

549-
None => (),
550-
},
545+
self.refreshing_page.store(false, Ordering::SeqCst);
546+
}
551547

552548
Message::SetXwaylandDescaling(descale) => {
553549
self.comp_config_descale_xwayland = descale;
@@ -655,11 +651,6 @@ impl Page {
655651
return;
656652
};
657653

658-
let selected_scale = DPI_SCALES
659-
.iter()
660-
.position(|scale| self.config.scale <= *scale)
661-
.unwrap_or(DPI_SCALES.len() - 1);
662-
663654
self.display_tabs.activate(display);
664655
self.active_display = output_id;
665656
self.config.refresh_rate = None;
@@ -681,6 +672,12 @@ impl Page {
681672
self.cache.resolution_selected = None;
682673
self.cache.refresh_rate_selected = None;
683674
self.cache.vrr_selected = None;
675+
676+
let selected_scale = DPI_SCALES
677+
.iter()
678+
.position(|scale| self.config.scale <= *scale)
679+
.unwrap_or(DPI_SCALES.len() - 1);
680+
684681
self.adjusted_scale = ((self.config.scale % 25).min(20) as f32 / 5.0).round() as u32 * 5;
685682
self.cache.scale_selected = Some(if self.adjusted_scale != 0 && selected_scale > 0 {
686683
selected_scale - 1

0 commit comments

Comments
 (0)
Please sign in to comment.