1
- use once_cell:: unsync:: OnceCell ;
2
- use std:: {
3
- cell:: Cell ,
4
- collections:: HashMap ,
5
- rc:: { Rc , Weak } ,
6
- } ;
7
-
8
- use crate :: { BoardId , Daemon , Key , KeyMap , Layer , Layout } ;
9
-
10
- pub ( crate ) struct DaemonBoardInner {
11
- pub ( crate ) daemon : Rc < dyn Daemon > ,
12
- pub ( crate ) board : BoardId ,
13
- model : String ,
14
- layout : Layout ,
15
- keys : OnceCell < Vec < Key > > ,
16
- layers : OnceCell < Vec < Layer > > ,
17
- max_brightness : i32 ,
1
+ use glib:: subclass:: prelude:: * ;
2
+ use std:: { cell:: Cell , collections:: HashMap , rc:: Rc } ;
3
+
4
+ use crate :: { BoardId , Daemon , DerefCell , Key , KeyMap , Layer , Layout } ;
5
+
6
+ // GObject
7
+ // Add changed signal
8
+ // Want DerefCell, I guess... Or use OnceCell
9
+
10
+ #[ derive( Default ) ]
11
+ pub struct DaemonBoardInner {
12
+ daemon : DerefCell < Rc < dyn Daemon > > ,
13
+ board : DerefCell < BoardId > ,
14
+ model : DerefCell < String > ,
15
+ layout : DerefCell < Layout > ,
16
+ keys : DerefCell < Vec < Key > > ,
17
+ layers : DerefCell < Vec < Layer > > ,
18
+ max_brightness : DerefCell < i32 > ,
18
19
pub ( crate ) leds_changed : Cell < bool > ,
19
- has_led_save : bool ,
20
- has_matrix : bool ,
20
+ has_led_save : DerefCell < bool > ,
21
+ has_matrix : DerefCell < bool > ,
21
22
}
22
23
23
- #[ derive( Clone , glib:: GBoxed ) ]
24
- #[ gboxed( type_name = "S76DaemonBoard" ) ]
25
- pub struct DaemonBoard ( pub ( crate ) Rc < DaemonBoardInner > ) ;
26
-
27
- pub ( crate ) struct DaemonBoardWeak ( Weak < DaemonBoardInner > ) ;
28
-
29
- impl std:: fmt:: Debug for DaemonBoardWeak {
30
- fn fmt ( & self , f : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
31
- write ! ( f, "DaemonBoardWeak({:p})" , self )
32
- }
24
+ #[ glib:: object_subclass]
25
+ impl ObjectSubclass for DaemonBoardInner {
26
+ const NAME : & ' static str = "S76DaemonBoard" ;
27
+ type ParentType = glib:: Object ;
28
+ type Type = DaemonBoard ;
33
29
}
34
30
35
- impl DaemonBoardWeak {
36
- pub fn upgrade ( & self ) -> Option < DaemonBoard > {
37
- self . 0 . upgrade ( ) . map ( DaemonBoard )
38
- }
31
+ impl ObjectImpl for DaemonBoardInner { }
32
+
33
+ glib :: wrapper! {
34
+ pub struct DaemonBoard ( ObjectSubclass < DaemonBoardInner > ) ;
39
35
}
40
36
41
37
impl DaemonBoard {
@@ -63,51 +59,55 @@ impl DaemonBoard {
63
59
let has_led_save = daemon. led_save ( board) . is_ok ( ) ;
64
60
let has_matrix = daemon. matrix_get ( board) . is_ok ( ) ;
65
61
66
- let self_ = Self ( Rc :: new ( DaemonBoardInner {
67
- daemon,
68
- board,
69
- keys : OnceCell :: new ( ) ,
70
- layers : OnceCell :: new ( ) ,
71
- layout,
72
- max_brightness,
73
- model,
74
- leds_changed : Cell :: new ( false ) ,
75
- has_led_save,
76
- has_matrix,
77
- } ) ) ;
62
+ let self_ = glib:: Object :: new :: < DaemonBoard > ( & [ ] ) . unwrap ( ) ;
63
+ self_. inner ( ) . daemon . set ( daemon) ;
64
+ self_. inner ( ) . board . set ( board) ;
65
+ self_. inner ( ) . model . set ( model) ;
66
+ self_. inner ( ) . layout . set ( layout) ;
67
+ self_. inner ( ) . max_brightness . set ( max_brightness) ;
68
+ self_. inner ( ) . has_led_save . set ( has_led_save) ;
69
+ self_. inner ( ) . has_matrix . set ( has_matrix) ;
78
70
79
71
let keys = self_
80
- . 0
72
+ . inner ( )
81
73
. layout
82
74
. physical
83
75
. keys
84
76
. iter ( )
85
77
. map ( |i| Key :: new ( & self_, i) )
86
78
. collect ( ) ;
87
- self_. 0 . keys . set ( keys) . unwrap ( ) ;
79
+ self_. inner ( ) . keys . set ( keys) ;
88
80
89
81
let layers = ( 0 ..num_layers)
90
82
. map ( |layer| Layer :: new ( & self_, layer) )
91
83
. collect ( ) ;
92
- self_. 0 . layers . set ( layers) . unwrap ( ) ;
84
+ self_. inner ( ) . layers . set ( layers) ;
93
85
94
86
Ok ( self_)
95
87
}
96
88
97
- pub ( crate ) fn downgrade ( & self ) -> DaemonBoardWeak {
98
- DaemonBoardWeak ( Rc :: downgrade ( & self . 0 ) )
89
+ pub ( crate ) fn inner ( & self ) -> & DaemonBoardInner {
90
+ DaemonBoardInner :: from_instance ( self )
91
+ }
92
+
93
+ pub ( crate ) fn daemon ( & self ) -> & dyn Daemon {
94
+ self . inner ( ) . daemon . as_ref ( )
95
+ }
96
+
97
+ pub ( crate ) fn board ( & self ) -> BoardId {
98
+ * self . inner ( ) . board
99
99
}
100
100
101
101
pub fn model ( & self ) -> & str {
102
- & self . 0 . model
102
+ & self . inner ( ) . model
103
103
}
104
104
105
105
pub fn has_matrix ( & self ) -> bool {
106
- self . 0 . has_matrix
106
+ * self . inner ( ) . has_matrix
107
107
}
108
108
109
109
pub fn refresh_matrix ( & self ) -> Result < bool , String > {
110
- let matrix = self . 0 . daemon . matrix_get ( self . 0 . board ) ?;
110
+ let matrix = self . daemon ( ) . matrix_get ( self . board ( ) ) ?;
111
111
let mut changed = false ;
112
112
for key in self . keys ( ) {
113
113
let pressed = matrix
@@ -119,36 +119,36 @@ impl DaemonBoard {
119
119
}
120
120
121
121
pub fn max_brightness ( & self ) -> i32 {
122
- self . 0 . max_brightness
122
+ * self . inner ( ) . max_brightness
123
123
}
124
124
125
125
pub fn led_save ( & self ) -> Result < ( ) , String > {
126
- if self . has_led_save ( ) && self . 0 . leds_changed . get ( ) {
127
- self . 0 . daemon . led_save ( self . 0 . board ) ?;
128
- self . 0 . leds_changed . set ( false ) ;
126
+ if self . has_led_save ( ) && self . inner ( ) . leds_changed . get ( ) {
127
+ self . daemon ( ) . led_save ( self . board ( ) ) ?;
128
+ self . inner ( ) . leds_changed . set ( false ) ;
129
129
debug ! ( "led_save" ) ;
130
130
}
131
131
Ok ( ( ) )
132
132
}
133
133
134
134
pub fn is_fake ( & self ) -> bool {
135
- self . 0 . daemon . is_fake ( )
135
+ self . daemon ( ) . is_fake ( )
136
136
}
137
137
138
138
pub fn has_led_save ( & self ) -> bool {
139
- self . 0 . has_led_save
139
+ * self . inner ( ) . has_led_save
140
140
}
141
141
142
142
pub fn layout ( & self ) -> & Layout {
143
- & self . 0 . layout
143
+ & * self . inner ( ) . layout
144
144
}
145
145
146
146
pub fn layers ( & self ) -> & [ Layer ] {
147
- self . 0 . layers . get ( ) . unwrap ( )
147
+ & * self . inner ( ) . layers
148
148
}
149
149
150
150
pub fn keys ( & self ) -> & [ Key ] {
151
- self . 0 . keys . get ( ) . unwrap ( )
151
+ & * self . inner ( ) . keys
152
152
}
153
153
154
154
pub fn export_keymap ( & self ) -> KeyMap {
0 commit comments