@@ -17,9 +17,11 @@ use cosmic_randr_shell::{
17
17
AdaptiveSyncAvailability , AdaptiveSyncState , List , Output , OutputKey , Transform ,
18
18
} ;
19
19
use cosmic_settings_page:: { self as page, section, Section } ;
20
+ use futures:: pin_mut;
20
21
use once_cell:: sync:: Lazy ;
21
22
use slab:: Slab ;
22
23
use slotmap:: { Key , SecondaryMap , SlotMap } ;
24
+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
23
25
use std:: { collections:: BTreeMap , process:: ExitStatus , sync:: Arc } ;
24
26
use tokio:: sync:: oneshot;
25
27
use tracing:: error;
@@ -91,8 +93,6 @@ pub enum Message {
91
93
Pan ( arrangement:: Pan ) ,
92
94
/// Status of an applied display change.
93
95
RandrResult ( Arc < std:: io:: Result < ExitStatus > > ) ,
94
- /// Request to reload the page.
95
- Refresh ,
96
96
/// Set the refresh rate of a display.
97
97
RefreshRate ( usize ) ,
98
98
/// Set the VRR mode of a display.
@@ -132,6 +132,8 @@ enum Randr {
132
132
133
133
/// The page struct for the display settings page.
134
134
pub struct Page {
135
+ /// Set when the page is being refreshed
136
+ refreshing_page : Arc < AtomicBool > ,
135
137
list : List ,
136
138
display_tabs : segmented_button:: SingleSelectModel ,
137
139
mirror_map : SecondaryMap < OutputKey , OutputKey > ,
@@ -167,6 +169,7 @@ impl Default for Page {
167
169
} ) ;
168
170
169
171
Self {
172
+ refreshing_page : Arc :: new ( AtomicBool :: new ( false ) ) ,
170
173
list : List :: default ( ) ,
171
174
display_tabs : segmented_button:: SingleSelectModel :: default ( ) ,
172
175
mirror_map : SecondaryMap :: new ( ) ,
@@ -258,16 +261,15 @@ impl page::Page<crate::pages::Message> for Page {
258
261
fl ! ( "orientation" , "rotate-270" ) ,
259
262
] ;
260
263
261
- use std:: time:: Duration ;
262
-
263
- use futures:: pin_mut;
264
-
265
264
if let Some ( canceller) = self . background_service_cancel . take ( ) {
266
265
_ = canceller. send ( ( ) ) ;
267
266
}
268
267
268
+ self . refreshing_page . store ( true , Ordering :: SeqCst ) ;
269
+
269
270
#[ cfg( feature = "wayland" ) ]
270
271
{
272
+ let refreshing_page = self . refreshing_page . clone ( ) ;
271
273
let ( tx, mut rx) = tachyonix:: channel ( 4 ) ;
272
274
let ( canceller, cancelled) = oneshot:: channel ( ) ;
273
275
let runtime = tokio:: runtime:: Handle :: current ( ) ;
@@ -299,15 +301,11 @@ impl page::Page<crate::pages::Message> for Page {
299
301
}
300
302
301
303
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
+ } ) ;
311
309
}
312
310
}
313
311
}
@@ -510,12 +508,6 @@ impl Page {
510
508
511
509
Message :: Position ( display, x, y) => return self . set_position ( display, x, y) ,
512
510
513
- Message :: Refresh => {
514
- return cosmic:: task:: future ( async move {
515
- crate :: Message :: PageMessage ( on_enter ( ) . await )
516
- } ) ;
517
- }
518
-
519
511
Message :: RefreshRate ( rate) => return self . set_refresh_rate ( rate) ,
520
512
521
513
Message :: VariableRefreshRate ( mode) => return self . set_vrr ( mode) ,
@@ -537,17 +529,21 @@ impl Page {
537
529
}
538
530
}
539
531
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
+ }
544
541
545
- Some ( Err ( why) ) => {
546
- tracing:: error!( ?why, "error fetching displays" ) ;
542
+ None => ( ) ,
547
543
}
548
544
549
- None => ( ) ,
550
- } ,
545
+ self . refreshing_page . store ( false , Ordering :: SeqCst ) ;
546
+ }
551
547
552
548
Message :: SetXwaylandDescaling ( descale) => {
553
549
self . comp_config_descale_xwayland = descale;
@@ -655,11 +651,6 @@ impl Page {
655
651
return ;
656
652
} ;
657
653
658
- let selected_scale = DPI_SCALES
659
- . iter ( )
660
- . position ( |scale| self . config . scale <= * scale)
661
- . unwrap_or ( DPI_SCALES . len ( ) - 1 ) ;
662
-
663
654
self . display_tabs . activate ( display) ;
664
655
self . active_display = output_id;
665
656
self . config . refresh_rate = None ;
@@ -681,6 +672,12 @@ impl Page {
681
672
self . cache . resolution_selected = None ;
682
673
self . cache . refresh_rate_selected = None ;
683
674
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
+
684
681
self . adjusted_scale = ( ( self . config . scale % 25 ) . min ( 20 ) as f32 / 5.0 ) . round ( ) as u32 * 5 ;
685
682
self . cache . scale_selected = Some ( if self . adjusted_scale != 0 && selected_scale > 0 {
686
683
selected_scale - 1
0 commit comments