Skip to content

Commit 9996427

Browse files
committed
chore: Make DaemonBoard a glib object
1 parent 9756494 commit 9996427

File tree

6 files changed

+94
-97
lines changed

6 files changed

+94
-97
lines changed

backend/src/board.rs

Lines changed: 62 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,37 @@
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>,
1819
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>,
2122
}
2223

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;
3329
}
3430

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>);
3935
}
4036

4137
impl DaemonBoard {
@@ -63,51 +59,55 @@ impl DaemonBoard {
6359
let has_led_save = daemon.led_save(board).is_ok();
6460
let has_matrix = daemon.matrix_get(board).is_ok();
6561

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);
7870

7971
let keys = self_
80-
.0
72+
.inner()
8173
.layout
8274
.physical
8375
.keys
8476
.iter()
8577
.map(|i| Key::new(&self_, i))
8678
.collect();
87-
self_.0.keys.set(keys).unwrap();
79+
self_.inner().keys.set(keys);
8880

8981
let layers = (0..num_layers)
9082
.map(|layer| Layer::new(&self_, layer))
9183
.collect();
92-
self_.0.layers.set(layers).unwrap();
84+
self_.inner().layers.set(layers);
9385

9486
Ok(self_)
9587
}
9688

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
9999
}
100100

101101
pub fn model(&self) -> &str {
102-
&self.0.model
102+
&self.inner().model
103103
}
104104

105105
pub fn has_matrix(&self) -> bool {
106-
self.0.has_matrix
106+
*self.inner().has_matrix
107107
}
108108

109109
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())?;
111111
let mut changed = false;
112112
for key in self.keys() {
113113
let pressed = matrix
@@ -119,36 +119,36 @@ impl DaemonBoard {
119119
}
120120

121121
pub fn max_brightness(&self) -> i32 {
122-
self.0.max_brightness
122+
*self.inner().max_brightness
123123
}
124124

125125
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);
129129
debug!("led_save");
130130
}
131131
Ok(())
132132
}
133133

134134
pub fn is_fake(&self) -> bool {
135-
self.0.daemon.is_fake()
135+
self.daemon().is_fake()
136136
}
137137

138138
pub fn has_led_save(&self) -> bool {
139-
self.0.has_led_save
139+
*self.inner().has_led_save
140140
}
141141

142142
pub fn layout(&self) -> &Layout {
143-
&self.0.layout
143+
&*self.inner().layout
144144
}
145145

146146
pub fn layers(&self) -> &[Layer] {
147-
self.0.layers.get().unwrap()
147+
&*self.inner().layers
148148
}
149149

150150
pub fn keys(&self) -> &[Key] {
151-
self.0.keys.get().unwrap()
151+
&*self.inner().keys
152152
}
153153

154154
pub fn export_keymap(&self) -> KeyMap {
File renamed without changes.

backend/src/key.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
use glib::clone::Downgrade;
12
use std::{cell::Cell, char};
23

3-
use crate::{DaemonBoard, DaemonBoardWeak, Hs, PhysicalLayoutKey, Rect, Rgb};
4+
use crate::{DaemonBoard, Hs, PhysicalLayoutKey, Rect, Rgb};
45

56
#[derive(Debug)]
67
pub struct Key {
7-
pub(crate) board: DaemonBoardWeak,
8+
pub(crate) board: glib::WeakRef<DaemonBoard>,
89
// Logical position (row, column)
910
pub logical: (u8, u8),
1011
// Logical name (something like K01, where 0 is the row and 1 is the column)
@@ -76,9 +77,8 @@ impl Key {
7677
debug!(" Layer {}", layer);
7778
let scancode =
7879
match board
79-
.0
80-
.daemon
81-
.keymap_get(board.0.board, layer, electrical.0, electrical.1)
80+
.daemon()
81+
.keymap_get(board.board(), layer, electrical.0, electrical.1)
8282
{
8383
Ok(value) => value,
8484
Err(err) => {
@@ -97,7 +97,7 @@ impl Key {
9797

9898
let mut led_color = None;
9999
if board.layout().meta.has_mode && leds.len() > 0 {
100-
match board.0.daemon.color(board.0.board, leds[0]) {
100+
match board.daemon().color(board.board(), leds[0]) {
101101
Ok(color) => led_color = Some(color),
102102
Err(err) => error!("error getting key color: {}", err),
103103
}
@@ -135,10 +135,10 @@ impl Key {
135135
pub fn set_color(&self, color: Hs) -> Result<(), String> {
136136
let board = self.board();
137137
for index in &self.leds {
138-
board.0.daemon.set_color(board.0.board, *index, color)?;
138+
board.daemon().set_color(board.board(), *index, color)?;
139139
}
140140
self.led_color.set(Some(color));
141-
board.0.leds_changed.set(true);
141+
board.inner().leds_changed.set(true);
142142
Ok(())
143143
}
144144

@@ -158,8 +158,8 @@ impl Key {
158158
.layout()
159159
.scancode_from_name(scancode_name)
160160
.ok_or_else(|| format!("Unable to find scancode '{}'", scancode_name))?;
161-
board.0.daemon.keymap_set(
162-
board.0.board,
161+
board.daemon().keymap_set(
162+
board.board(),
163163
layer as u8,
164164
self.electrical.0,
165165
self.electrical.1,

backend/src/layer.rs

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
use glib::clone::Downgrade;
12
use std::cell::Cell;
23

3-
use crate::{DaemonBoard, DaemonBoardWeak, Hs, Mode};
4+
use crate::{DaemonBoard, Hs, Mode};
45

56
#[derive(Debug)]
67
pub struct Layer {
78
layer: u8,
89
index: u8,
9-
board: DaemonBoardWeak,
10+
board: glib::WeakRef<DaemonBoard>,
1011
mode: Cell<Option<(u8, u8)>>,
1112
brightness: Cell<i32>,
1213
color: Cell<Hs>,
@@ -21,9 +22,8 @@ impl Layer {
2122
};
2223
let mode = if board.layout().meta.has_mode {
2324
board
24-
.0
25-
.daemon
26-
.mode(board.0.board, layer)
25+
.daemon()
26+
.mode(board.board(), layer)
2727
.map(Some)
2828
.unwrap_or_else(|err| {
2929
error!("Error getting layer mode: {}", err);
@@ -33,17 +33,15 @@ impl Layer {
3333
None
3434
};
3535
let brightness = board
36-
.0
37-
.daemon
38-
.brightness(board.0.board, index)
36+
.daemon()
37+
.brightness(board.board(), index)
3938
.unwrap_or_else(|err| {
4039
error!("error getting layer brightness: {}", err);
4140
0
4241
});
4342
let color = board
44-
.0
45-
.daemon
46-
.color(board.0.board, index)
43+
.daemon()
44+
.color(board.board(), index)
4745
.unwrap_or_else(|err| {
4846
error!("error getting layer color: {}", err);
4947
Hs::new(0., 0.)
@@ -70,11 +68,10 @@ impl Layer {
7068
pub fn set_mode(&self, mode: &Mode, speed: u8) -> Result<(), String> {
7169
let board = self.board();
7270
board
73-
.0
74-
.daemon
75-
.set_mode(board.0.board, self.layer, mode.index, speed)?;
71+
.daemon()
72+
.set_mode(board.board(), self.layer, mode.index, speed)?;
7673
self.mode.set(Some((mode.index, speed)));
77-
board.0.leds_changed.set(true);
74+
board.inner().leds_changed.set(true);
7875
Ok(())
7976
}
8077

@@ -85,11 +82,10 @@ impl Layer {
8582
pub fn set_brightness(&self, brightness: i32) -> Result<(), String> {
8683
let board = self.board();
8784
board
88-
.0
89-
.daemon
90-
.set_brightness(board.0.board, self.index, brightness)?;
85+
.daemon()
86+
.set_brightness(board.board(), self.index, brightness)?;
9187
self.brightness.set(brightness);
92-
board.0.leds_changed.set(true);
88+
board.inner().leds_changed.set(true);
9389
Ok(())
9490
}
9591

@@ -99,9 +95,9 @@ impl Layer {
9995

10096
pub fn set_color(&self, color: Hs) -> Result<(), String> {
10197
let board = self.board();
102-
board.0.daemon.set_color(board.0.board, self.index, color)?;
98+
board.daemon().set_color(board.board(), self.index, color)?;
10399
self.color.set(color);
104-
board.0.leds_changed.set(true);
100+
board.inner().leds_changed.set(true);
105101
Ok(())
106102
}
107103
}

backend/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern crate log;
44
mod board;
55
mod color;
66
mod daemon;
7+
mod deref_cell;
78
mod key;
89
mod keymap;
910
mod layer;
@@ -12,5 +13,6 @@ mod mode;
1213
mod rect;
1314

1415
pub use self::{
15-
board::*, color::*, daemon::*, key::*, keymap::*, layer::*, layout::*, mode::*, rect::*,
16+
board::*, color::*, daemon::*, deref_cell::*, key::*, keymap::*, layer::*, layout::*, mode::*,
17+
rect::*,
1618
};

src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ pub mod application;
66
mod choose_color;
77
mod color_circle;
88
mod color_wheel;
9-
mod deref_cell;
109
mod keyboard_backlight_widget;
1110
mod keyboard_color;
1211
mod selected_keys;
1312

1413
use crate::{
15-
choose_color::*, color_circle::*, color_wheel::*, deref_cell::*, keyboard_color::*,
16-
selected_keys::*,
14+
choose_color::*, color_circle::*, color_wheel::*, keyboard_color::*, selected_keys::*,
1715
};
1816
pub use backend;
17+
use backend::DerefCell;
1918
pub use keyboard_backlight_widget::keyboard_backlight_widget;

0 commit comments

Comments
 (0)