@@ -23,12 +23,13 @@ use gio::Settings;
23
23
use glib:: {
24
24
once_cell:: sync:: Lazy , once_cell:: sync:: OnceCell , signal:: Inhibit ,
25
25
subclass:: InitializingObject , FromVariant , ParamSpec , Value ,
26
+ clone
26
27
} ;
27
28
use gtk:: {
28
29
subclass:: prelude:: * , Button , CompositeTemplate , PolicyType , ScrolledWindow , Stack ,
29
30
TemplateChild ,
30
31
} ;
31
- use std:: { cell:: Cell , cell:: RefCell , cell:: RefMut , rc:: Rc } ;
32
+ use std:: { cell:: Cell , cell:: RefCell , cell:: RefMut , rc:: Rc , sync :: Arc , sync :: Mutex , sync :: MutexGuard } ;
32
33
33
34
// Modules
34
35
use crate :: {
@@ -1409,34 +1410,82 @@ impl MainWindow {
1409
1410
match provider_container {
1410
1411
// If provider does exist
1411
1412
Some ( existing_provider) => {
1412
- // Update GPU list
1413
- match existing_provider. get_gpu_uuids ( ) {
1414
- Ok ( gpu_uuids) => {
1415
- // Construct a row for each GPU
1416
- for uuid in gpu_uuids {
1417
- // Grab current provider
1418
- let provider_container: Option < Provider > = self . provider . take ( ) ;
1419
- self . provider . set ( provider_container. clone ( ) ) ;
1420
-
1421
- // Get GPU data
1422
- match provider_container {
1423
- Some ( prov) => match prov. get_gpu_data ( & uuid, "name" ) {
1424
- Ok ( gpu_name) => {
1425
- // Create new GpuPage object and Add to list of pages
1426
- self . create_gpu_page ( & uuid, & gpu_name, prov) ;
1427
- } ,
1428
- Err ( err) => {
1429
- println ! ( "..Attempt to read GPU name failed, returning: {}" , err) ;
1413
+ // Check provider type in settings
1414
+ let provider_type: i32 = self . get_setting :: < i32 > ( "provider" ) ;
1430
1415
1431
- // Create new GpuPage object and Add to list of pages
1432
- self . create_gpu_page ( & uuid, & uuid, prov) ;
1416
+ // If type has been changed, update provider
1417
+ if existing_provider. property :: < i32 > ( "provider_type" ) != provider_type {
1418
+ // Create new provider
1419
+ let new_provider_container: Option < Provider > =
1420
+ Some ( self . create_provider ( provider_type) ) ;
1421
+ self . provider . set ( new_provider_container. clone ( ) ) ;
1422
+
1423
+ // Using the new provider
1424
+ match new_provider_container {
1425
+ Some ( new_provider) => {
1426
+ // Update GPU list
1427
+ match new_provider. get_gpu_uuids ( ) {
1428
+ Ok ( gpu_uuids) => {
1429
+ // Construct a row for each GPU
1430
+ for uuid in gpu_uuids {
1431
+ // Grab current provider
1432
+ let provider_container: Option < Provider > = self . provider . take ( ) ;
1433
+ self . provider . set ( provider_container. clone ( ) ) ;
1434
+
1435
+ // Get GPU data
1436
+ match provider_container {
1437
+ Some ( prov) => match prov. get_gpu_data ( & uuid, "name" ) {
1438
+ Ok ( gpu_name) => {
1439
+ // Create new GpuPage object and Add to list of pages
1440
+ self . create_gpu_page ( & uuid, & gpu_name, prov) ;
1441
+ } ,
1442
+ Err ( err) => {
1443
+ println ! ( "..Attempt to read GPU name failed, returning: {}" , err) ;
1444
+
1445
+ // Create new GpuPage object and Add to list of pages
1446
+ self . create_gpu_page ( & uuid, & uuid, prov) ;
1447
+ }
1448
+ }
1449
+ None => panic ! ( "Something weird has happened! Cannot grab known existing provider.." ) ,
1450
+ }
1451
+ }
1452
+ }
1453
+ Err ( err) => {
1454
+ println ! ( "..Attempt to update GPU list failed, returning: {}" , err)
1455
+ }
1456
+ }
1457
+ }
1458
+ None => todo ! ( ) ,
1459
+ }
1460
+ } else {
1461
+ // Update GPU list
1462
+ match existing_provider. get_gpu_uuids ( ) {
1463
+ Ok ( gpu_uuids) => {
1464
+ // Construct a row for each GPU
1465
+ for uuid in gpu_uuids {
1466
+ // Grab current provider
1467
+ let provider_container: Option < Provider > = self . provider . take ( ) ;
1468
+ self . provider . set ( provider_container. clone ( ) ) ;
1469
+ // Get GPU data
1470
+ match provider_container {
1471
+ Some ( prov) => match prov. get_gpu_data ( & uuid, "name" ) {
1472
+ Ok ( gpu_name) => {
1473
+ // Create new GpuPage object and Add to list of pages
1474
+ self . create_gpu_page ( & uuid, & gpu_name, prov) ;
1475
+ } ,
1476
+ Err ( err) => {
1477
+ println ! ( "..Attempt to read GPU name failed, returning: {}" , err) ;
1478
+
1479
+ // Create new GpuPage object and Add to list of pages
1480
+ self . create_gpu_page ( & uuid, & uuid, prov) ;
1481
+ }
1433
1482
}
1483
+ None => panic ! ( "Something weird has happened! Cannot grab known existing provider.." ) ,
1434
1484
}
1435
- None => panic ! ( "Something weird has happened! Cannot grab known existing provider.." ) ,
1436
1485
}
1437
1486
}
1487
+ Err ( err) => println ! ( "..Attempt to update GPU list failed, returning: {}" , err) ,
1438
1488
}
1439
- Err ( err) => println ! ( "..Attempt to update GPU list failed, returning: {}" , err) ,
1440
1489
}
1441
1490
}
1442
1491
// If provider does not exist
@@ -1488,6 +1537,63 @@ impl MainWindow {
1488
1537
}
1489
1538
}
1490
1539
}
1540
+
1541
+ /*
1542
+ // Load refresh time (s) from settings
1543
+ let refresh_rate: u32 = self.get_setting::<i32>("refreshrate") as u32;
1544
+
1545
+ // Create thread safe container for provider
1546
+ // Grab copy of current provider
1547
+ let provider_container: Option<Provider> = self.provider.take();
1548
+ self.provider.set(provider_container.clone());
1549
+ let provider_store: Arc<Mutex<Option<Provider>>> = Arc::new(Mutex::new(provider_container));
1550
+
1551
+ // Wrapper around `NonNull<RawType>` that just implements `Send`
1552
+ struct WrappedPointer(Settings);
1553
+ unsafe impl Send for WrappedPointer {}
1554
+ // Safe wrapper around `WrappedPointer` that gives access to the pointer
1555
+ // only with the mutex locked.
1556
+ struct SafeType {
1557
+ inner: Mutex<WrappedPointer>,
1558
+ }
1559
+ let settings_store: SafeType = SafeType
1560
+ {
1561
+ inner: Mutex::new(WrappedPointer(self.settings.get().expect("").to_owned()))
1562
+ };
1563
+
1564
+ // Async check for provider changes
1565
+ //glib::timeout_add_seconds(refresh_rate, clone!(@strong self as window => move || {
1566
+ //glib::timeout_add_seconds(refresh_rate, clone!(@strong settings_store as window => move || {
1567
+ glib::timeout_add_seconds_local(refresh_rate, move || {
1568
+ // Grab locked data
1569
+ // settings object
1570
+ let settings_container: MutexGuard<WrappedPointer> = settings_store.inner.lock().unwrap();
1571
+ // current provider for scanning gpu data
1572
+ let provider_lock: Arc<Mutex<Option<Provider>>> = Arc::clone(&provider_store);
1573
+ let mut provider_container: MutexGuard<Option<Provider>> = provider_lock.lock().unwrap();
1574
+
1575
+
1576
+ // Check provider type in settings
1577
+ let provider_type: i32 = settings_container.0.get("provider");
1578
+
1579
+ // If type has been changed, update provider
1580
+ match &mut *provider_container {
1581
+ Some(prov) => {
1582
+ if prov.property::<i32>("provider_type") != provider_type {
1583
+ //
1584
+ }
1585
+ }
1586
+ None => todo!(),
1587
+ }
1588
+
1589
+ Continue(true)
1590
+ });
1591
+ */
1592
+ }
1593
+
1594
+ fn update_prov ( & ' static self ) {
1595
+ //
1596
+ println ! ( "FUCKER" ) ;
1491
1597
}
1492
1598
}
1493
1599
0 commit comments