@@ -2,22 +2,28 @@ use cascade::cascade;
2
2
use glib:: clone;
3
3
use gtk:: prelude:: * ;
4
4
use gtk:: subclass:: prelude:: * ;
5
- use std:: rc:: Rc ;
6
- use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
5
+ use std:: {
6
+ cell:: RefCell ,
7
+ collections:: HashSet ,
8
+ rc:: Rc ,
9
+ sync:: atomic:: { AtomicUsize , Ordering } ,
10
+ } ;
7
11
8
12
use super :: { shortcuts_window, ConfiguratorApp , Keyboard , KeyboardLayer , Page , Picker } ;
9
13
use crate :: DerefCell ;
10
14
use backend:: { Board , Daemon , DaemonClient , DaemonDummy , DaemonServer } ;
11
15
12
16
#[ derive( Default ) ]
13
17
pub struct MainWindowInner {
18
+ daemon : DerefCell < Rc < dyn Daemon > > ,
14
19
back_button : DerefCell < gtk:: Button > ,
15
20
count : AtomicUsize ,
16
21
header_bar : DerefCell < gtk:: HeaderBar > ,
17
22
keyboard_list_box : DerefCell < gtk:: ListBox > ,
18
23
layer_switcher : DerefCell < gtk:: StackSwitcher > ,
19
24
picker : DerefCell < Picker > ,
20
25
stack : DerefCell < gtk:: Stack > ,
26
+ keyboards : RefCell < Vec < ( Keyboard , gtk:: ListBoxRow ) > > ,
21
27
}
22
28
23
29
#[ glib:: object_subclass]
@@ -182,6 +188,48 @@ impl MainWindow {
182
188
}
183
189
}
184
190
191
+ window. inner ( ) . daemon . set ( daemon) ;
192
+ glib:: timeout_add_seconds_local (
193
+ 1 ,
194
+ clone ! ( @weak window => move || {
195
+ let daemon = & * window. inner( ) . daemon;
196
+
197
+ if let Err ( err) = daemon. refresh( ) {
198
+ error!( "Failed to refresh boards: {}" , err) ;
199
+ }
200
+
201
+ let boards = match daemon. boards( ) {
202
+ Ok ( boards) => boards,
203
+ Err ( _) => return glib:: Continue ( true ) ,
204
+ } ;
205
+
206
+ // Remove boards that aren't detected now
207
+ let mut ids = HashSet :: new( ) ;
208
+ window. inner( ) . keyboards. borrow_mut( ) . retain( |( keyboard, row) | {
209
+ let board = keyboard. board( ) . board( ) ;
210
+ ids. insert( board) ;
211
+ if boards. iter( ) . find( |i| * * i == board) . is_none( ) {
212
+ window. inner( ) . stack. remove( keyboard) ;
213
+ window. inner( ) . keyboard_list_box. remove( row) ;
214
+ return false ;
215
+ }
216
+ true
217
+ } ) ;
218
+
219
+ // Add new boards
220
+ for i in boards {
221
+ if !ids. contains( & i) {
222
+ match Board :: new( daemon. clone( ) , i) {
223
+ Ok ( board) => window. add_keyboard( board) ,
224
+ Err ( err) => error!( "{}" , err) ,
225
+ }
226
+ }
227
+ }
228
+
229
+ glib:: Continue ( true )
230
+ } ) ,
231
+ ) ;
232
+
185
233
window
186
234
}
187
235
@@ -263,6 +311,7 @@ impl MainWindow {
263
311
self . inner ( ) . keyboard_list_box . add ( & row) ;
264
312
265
313
self . inner ( ) . stack . add ( & keyboard) ;
314
+ self . inner ( ) . keyboards . borrow_mut ( ) . push ( ( keyboard, row) ) ;
266
315
267
316
// XXX if only one keyboard, show that with no back button
268
317
self . inner ( ) . count . fetch_add ( 1 , Ordering :: Relaxed ) ;
0 commit comments