@@ -25,16 +25,18 @@ use header::{
25
25
profile_rule_window:: ProfileRuleWindowMsg , Header , HeaderMsg , PROFILE_RULE_WINDOW_BROKER ,
26
26
} ;
27
27
use lact_client:: { ConnectionStatusMsg , DaemonClient } ;
28
- use lact_daemon:: MODULE_CONF_PATH ;
29
28
use lact_schema:: {
30
29
args:: GuiArgs ,
31
30
request:: { ConfirmCommand , SetClocksCommand } ,
32
31
FanOptions , GIT_COMMIT ,
33
32
} ;
34
33
use msg:: AppMsg ;
35
34
use pages:: {
36
- info_page:: InformationPage , oc_page:: OcPage , software_page:: SoftwarePage ,
37
- thermals_page:: ThermalsPage , PageUpdate ,
35
+ info_page:: InformationPage ,
36
+ oc_page:: { OcPage , OcPageMsg } ,
37
+ software_page:: SoftwarePage ,
38
+ thermals_page:: ThermalsPage ,
39
+ PageUpdate ,
38
40
} ;
39
41
use relm4:: {
40
42
actions:: { RelmAction , RelmActionGroup } ,
@@ -62,7 +64,7 @@ pub struct AppModel {
62
64
graphs_window : relm4:: Controller < GraphsWindow > ,
63
65
64
66
info_page : relm4:: Controller < InformationPage > ,
65
- oc_page : OcPage ,
67
+ oc_page : relm4 :: Controller < OcPage > ,
66
68
thermals_page : ThermalsPage ,
67
69
software_page : relm4:: Controller < SoftwarePage > ,
68
70
@@ -101,7 +103,7 @@ impl AsyncComponent for AppModel {
101
103
set_margin_end: 30 ,
102
104
103
105
add_titled[ Some ( "info_page" ) , "Information" ] = model. info_page. widget( ) ,
104
- add_titled[ Some ( "oc_page" ) , "OC" ] = & model. oc_page. container . clone ( ) ,
106
+ add_titled[ Some ( "oc_page" ) , "OC" ] = model. oc_page. widget ( ) ,
105
107
add_titled[ Some ( "thermals_page" ) , "Thermals" ] = & model. thermals_page. container. clone( ) ,
106
108
add_titled[ Some ( "software_page" ) , "Software" ] = model. software_page. widget( ) ,
107
109
} ,
@@ -165,6 +167,7 @@ impl AsyncComponent for AppModel {
165
167
. get_system_info ( )
166
168
. await
167
169
. expect ( "Could not fetch system info" ) ;
170
+ let system_info = Rc :: new ( system_info) ;
168
171
169
172
let devices = daemon_client
170
173
. list_devices ( )
@@ -178,7 +181,9 @@ impl AsyncComponent for AppModel {
178
181
179
182
let info_page = InformationPage :: builder ( ) . launch ( ( ) ) . detach ( ) ;
180
183
181
- let oc_page = OcPage :: new ( & system_info) ;
184
+ let oc_page = OcPage :: builder ( )
185
+ . launch ( system_info. clone ( ) )
186
+ . forward ( sender. input_sender ( ) , |msg| msg) ;
182
187
let thermals_page = ThermalsPage :: new ( & system_info) ;
183
188
184
189
let software_page = SoftwarePage :: builder ( )
@@ -193,13 +198,6 @@ impl AsyncComponent for AppModel {
193
198
. launch ( ( ) )
194
199
. forward ( sender. input_sender ( ) , |msg| msg) ;
195
200
196
- oc_page. clocks_frame . connect_clocks_reset ( clone ! (
197
- #[ strong]
198
- sender,
199
- move || {
200
- sender. input( AppMsg :: ResetClocks ) ;
201
- }
202
- ) ) ;
203
201
thermals_page. connect_reset_pmfw ( clone ! (
204
202
#[ strong]
205
203
sender,
@@ -208,21 +206,6 @@ impl AsyncComponent for AppModel {
208
206
}
209
207
) ) ;
210
208
211
- if let Some ( ref button) = oc_page. enable_overclocking_button {
212
- button. connect_clicked ( clone ! (
213
- #[ strong]
214
- sender,
215
- move |_| {
216
- sender. input( AppMsg :: ask_confirmation(
217
- AppMsg :: EnableOverdrive ,
218
- "Enable Overclocking" ,
219
- format!( "This will enable the overdrive feature of the amdgpu driver by creating a file at <b>{MODULE_CONF_PATH}</b> and updating the initramfs. Are you sure you want to do this?" ) ,
220
- gtk:: ButtonsType :: OkCancel ,
221
- ) ) ;
222
- }
223
- ) ) ;
224
- }
225
-
226
209
let graphs_window = GraphsWindow :: builder ( ) . launch ( ( ) ) . detach ( ) ;
227
210
228
211
let model = AppModel {
@@ -281,6 +264,9 @@ impl AppModel {
281
264
) -> Result < ( ) , Arc < anyhow:: Error > > {
282
265
match msg {
283
266
AppMsg :: Error ( err) => return Err ( err) ,
267
+ AppMsg :: SettingsChanged => {
268
+ self . apply_revealer . emit ( ApplyRevealerMsg :: Show ) ;
269
+ }
284
270
AppMsg :: ReloadProfiles { include_state } => {
285
271
self . reload_profiles ( include_state) . await ?;
286
272
sender. input ( AppMsg :: ReloadData { full : false } ) ;
@@ -329,10 +315,14 @@ impl AppModel {
329
315
} ) ;
330
316
}
331
317
AppMsg :: Stats ( stats) => {
332
- self . info_page . emit ( PageUpdate :: Stats ( stats. clone ( ) ) ) ;
318
+ let update = PageUpdate :: Stats ( stats. clone ( ) ) ;
319
+ self . info_page . emit ( update. clone ( ) ) ;
320
+ self . oc_page . emit ( OcPageMsg :: Update {
321
+ update,
322
+ initial : false ,
323
+ } ) ;
333
324
334
325
self . thermals_page . set_stats ( & stats, false ) ;
335
- self . oc_page . set_stats ( & stats, false ) ;
336
326
337
327
self . graphs_window . emit ( GraphsWindowMsg :: Stats ( stats) ) ;
338
328
}
@@ -454,9 +444,12 @@ impl AppModel {
454
444
sender. input ( AppMsg :: Error ( Arc :: new ( anyhow ! ( "Nvidia driver detected, but the management library could not be loaded. Check lact service status for more information." ) ) ) ) ;
455
445
}
456
446
457
- self . info_page . emit ( PageUpdate :: Info ( info. clone ( ) ) ) ;
458
-
459
- self . oc_page . set_info ( & info) ;
447
+ let update = PageUpdate :: Info ( info. clone ( ) ) ;
448
+ self . info_page . emit ( update. clone ( ) ) ;
449
+ self . oc_page . emit ( OcPageMsg :: Update {
450
+ update,
451
+ initial : true ,
452
+ } ) ;
460
453
461
454
let vram_clock_ratio = info
462
455
. drm_info
@@ -493,10 +486,14 @@ impl AppModel {
493
486
. context ( "Could not fetch stats" ) ?;
494
487
let stats = Arc :: new ( stats) ;
495
488
496
- self . oc_page . set_stats ( & stats, true ) ;
497
489
self . thermals_page . set_stats ( & stats, true ) ;
498
490
499
- self . info_page . emit ( PageUpdate :: Stats ( stats) ) ;
491
+ let update = PageUpdate :: Stats ( stats. clone ( ) ) ;
492
+ self . info_page . emit ( update. clone ( ) ) ;
493
+ self . oc_page . emit ( OcPageMsg :: Update {
494
+ update,
495
+ initial : true ,
496
+ } ) ;
500
497
501
498
let maybe_clocks_table = match self . daemon_client . get_device_clocks_info ( & gpu_id) . await {
502
499
Ok ( info) => info. table ,
@@ -505,7 +502,8 @@ impl AppModel {
505
502
None
506
503
}
507
504
} ;
508
- self . oc_page . set_clocks_table ( maybe_clocks_table) ;
505
+ self . oc_page
506
+ . emit ( OcPageMsg :: ClocksTable ( maybe_clocks_table) ) ;
509
507
510
508
let maybe_modes_table = match self
511
509
. daemon_client
@@ -519,14 +517,11 @@ impl AppModel {
519
517
}
520
518
} ;
521
519
self . oc_page
522
- . performance_frame
523
- . set_power_profile_modes ( maybe_modes_table) ;
520
+ . emit ( OcPageMsg :: ProfileModesTable ( maybe_modes_table) ) ;
524
521
525
522
match self . daemon_client . get_power_states ( & gpu_id) . await {
526
523
Ok ( power_states) => {
527
- self . oc_page
528
- . power_states_frame
529
- . set_power_states ( power_states) ;
524
+ self . oc_page . emit ( OcPageMsg :: PowerStates ( power_states) ) ;
530
525
}
531
526
Err ( err) => warn ! ( "could not get power states: {err:?}" ) ,
532
527
}
@@ -544,8 +539,6 @@ impl AppModel {
544
539
self . thermals_page
545
540
. connect_settings_changed ( show_revealer. clone ( ) ) ;
546
541
547
- self . oc_page . connect_settings_changed ( show_revealer) ;
548
-
549
542
self . apply_revealer
550
543
. sender ( )
551
544
. send ( ApplyRevealerMsg :: Hide )
@@ -571,7 +564,8 @@ impl AppModel {
571
564
572
565
debug ! ( "applying settings on gpu {gpu_id}" ) ;
573
566
574
- if let Some ( cap) = self . oc_page . get_power_cap ( ) {
567
+ let cap = self . oc_page . model ( ) . get_power_cap ( ) ;
568
+ if let Some ( cap) = cap {
575
569
self . daemon_client
576
570
. set_power_cap ( & gpu_id, Some ( cap) )
577
571
. await
@@ -593,7 +587,8 @@ impl AppModel {
593
587
. await
594
588
. context ( "Could not commit config" ) ?;
595
589
596
- if let Some ( level) = self . oc_page . get_performance_level ( ) {
590
+ let performance_level = self . oc_page . model ( ) . get_performance_level ( ) ;
591
+ if let Some ( level) = performance_level {
597
592
self . daemon_client
598
593
. set_performance_level ( & gpu_id, level)
599
594
. await
@@ -605,10 +600,12 @@ impl AppModel {
605
600
606
601
let mode_index = self
607
602
. oc_page
603
+ . model ( )
608
604
. performance_frame
609
605
. get_selected_power_profile_mode ( ) ;
610
606
let custom_heuristics = self
611
607
. oc_page
608
+ . model ( )
612
609
. performance_frame
613
610
. get_power_profile_mode_custom_heuristics ( ) ;
614
611
@@ -645,11 +642,11 @@ impl AppModel {
645
642
. context ( "Could not commit config" ) ?;
646
643
}
647
644
648
- let clocks_commands = self . oc_page . clocks_frame . get_commands ( ) ;
645
+ let clocks_commands = self . oc_page . model ( ) . get_clocks_commands ( ) ;
649
646
650
647
debug ! ( "applying clocks commands {clocks_commands:#?}" ) ;
651
648
652
- let enabled_power_states = self . oc_page . get_enabled_power_states ( ) ;
649
+ let enabled_power_states = self . oc_page . model ( ) . get_enabled_power_states ( ) ;
653
650
654
651
for ( kind, states) in enabled_power_states {
655
652
if !states. is_empty ( ) {
0 commit comments