@@ -4,18 +4,16 @@ use gtk::prelude::*;
4
4
use gtk:: subclass:: prelude:: * ;
5
5
use std:: {
6
6
cell:: RefCell ,
7
- collections:: HashSet ,
8
- rc:: Rc ,
9
7
sync:: atomic:: { AtomicUsize , Ordering } ,
10
8
} ;
11
9
12
10
use super :: { shortcuts_window, ConfiguratorApp , Keyboard , KeyboardLayer , Page , Picker } ;
13
11
use crate :: DerefCell ;
14
- use backend:: { Board , Daemon , DaemonClient , DaemonDummy , DaemonServer } ;
12
+ use backend:: { Backend , Board } ;
15
13
16
14
#[ derive( Default ) ]
17
15
pub struct MainWindowInner {
18
- daemon : DerefCell < Rc < dyn Daemon > > ,
16
+ backend : DerefCell < Backend > ,
19
17
back_button : DerefCell < gtk:: Button > ,
20
18
count : AtomicUsize ,
21
19
header_bar : DerefCell < gtk:: HeaderBar > ,
@@ -167,65 +165,34 @@ impl MainWindow {
167
165
let window: Self = glib:: Object :: new ( & [ ] ) . unwrap ( ) ;
168
166
app. add_window ( & window) ;
169
167
170
- let daemon = daemon ( ) ;
171
-
172
- for i in daemon. boards ( ) . expect ( "Failed to load boards" ) {
173
- match Board :: new ( daemon. clone ( ) , i) {
174
- Ok ( board) => window. add_keyboard ( board) ,
175
- Err ( err) => error ! ( "{}" , err) ,
176
- }
177
- }
168
+ let backend = cascade ! {
169
+ daemon( ) ;
170
+ ..connect_board_added( clone!( @weak window => move |board| window. add_keyboard( board) ) ) ;
171
+ ..connect_board_removed( clone!( @weak window => move |board| {
172
+ let mut boards = window. inner( ) . keyboards. borrow_mut( ) ;
173
+ if let Some ( idx) = boards. iter( ) . position( |( kb, _) | kb. board( ) == & board) {
174
+ let ( keyboard, row) = boards. remove( idx) ;
175
+ window. inner( ) . stack. remove( & keyboard) ;
176
+ window. inner( ) . keyboard_list_box. remove( & row) ;
177
+ }
178
+ } ) ) ;
179
+ ..refresh( ) ;
180
+ } ;
178
181
179
182
let phony_board_names = app. phony_board_names ( ) . to_vec ( ) ;
180
183
if !phony_board_names. is_empty ( ) {
181
- let daemon = Rc :: new ( DaemonDummy :: new ( phony_board_names) ) ;
182
-
183
- for i in daemon. boards ( ) . unwrap ( ) {
184
- match Board :: new ( daemon. clone ( ) , i) {
185
- Ok ( board) => window. add_keyboard ( board) ,
186
- Err ( err) => error ! ( "{}" , err) ,
187
- }
188
- }
184
+ let backend = Backend :: new_dummy ( phony_board_names) . unwrap ( ) ;
185
+ backend. connect_board_added (
186
+ clone ! ( @weak window => move |board| window. add_keyboard( board) ) ,
187
+ ) ;
188
+ backend. refresh ( ) ;
189
189
}
190
190
191
- window. inner ( ) . daemon . set ( daemon ) ;
191
+ window. inner ( ) . backend . set ( backend ) ;
192
192
glib:: timeout_add_seconds_local (
193
193
1 ,
194
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
-
195
+ window. inner( ) . backend. refresh( ) ;
229
196
glib:: Continue ( true )
230
197
} ) ,
231
198
) ;
@@ -319,14 +286,15 @@ impl MainWindow {
319
286
}
320
287
321
288
#[ cfg( target_os = "linux" ) ]
322
- fn daemon ( ) -> Rc < dyn Daemon > {
289
+ fn daemon ( ) -> Backend {
323
290
if unsafe { libc:: geteuid ( ) == 0 } {
324
291
info ! ( "Already running as root" ) ;
325
- Rc :: new ( DaemonServer :: new_stdio ( ) . expect ( "Failed to create server" ) )
292
+ Backend :: new ( )
326
293
} else {
327
294
info ! ( "Not running as root, spawning daemon with pkexec" ) ;
328
- Rc :: new ( DaemonClient :: new_pkexec ( ) )
295
+ Backend :: new_pkexec ( )
329
296
}
297
+ . expect ( "Failed to create server" )
330
298
}
331
299
332
300
#[ cfg( not( target_os = "linux" ) ) ]
0 commit comments