Skip to content

Commit 0817b49

Browse files
ids1024jackpot51
authored andcommitted
improv: Use interior mutability in Key
1 parent d45376b commit 0817b49

File tree

3 files changed

+30
-26
lines changed

3 files changed

+30
-26
lines changed

src/application/key.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use gtk::prelude::*;
22
use std::{
3+
cell::RefCell,
34
collections::HashMap,
45
};
56

@@ -22,14 +23,14 @@ pub struct Key {
2223
// Electrical name (output, input)
2324
pub(crate) electrical_name: String,
2425
// Currently loaded scancodes and their names
25-
pub(crate) scancodes: Vec<(u16, String)>,
26+
pub(crate) scancodes: RefCell<Vec<(u16, String)>>,
2627
// Background color
2728
pub(crate) background_color: String,
2829
// Foreground color
2930
pub(crate) foreground_color: String,
3031
// GTK buttons by page
3132
//TODO: clean up this crap
32-
pub(crate) gtk: HashMap<Page, (gtk::Button, gtk::Label)>,
33+
pub(crate) gtk: RefCell<HashMap<Page, (gtk::Button, gtk::Label)>>,
3334
}
3435

3536
impl Key {
@@ -60,14 +61,15 @@ button {{
6061
}
6162

6263
pub fn refresh(&self) {
63-
for (layer, (_button, label)) in self.gtk.iter() {
64+
let scancodes = self.scancodes.borrow();
65+
for (layer, (_button, label)) in self.gtk.borrow().iter() {
6466
label.set_label(match layer {
6567
Page::Layer1 => {
66-
let scancode_name = &self.scancodes[0].1;
68+
let scancode_name = &scancodes[0].1;
6769
SCANCODE_LABELS.get(scancode_name).unwrap_or(scancode_name)
6870
},
6971
Page::Layer2 => {
70-
let scancode_name = &self.scancodes[1].1;
72+
let scancode_name = &scancodes[1].1;
7173
SCANCODE_LABELS.get(scancode_name).unwrap_or(scancode_name)
7274
},
7375
Page::Keycaps => &self.physical_name,

src/application/keyboard.rs

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub struct KeyboardInner {
3232
daemon: OnceCell<Rc<dyn Daemon>>,
3333
daemon_board: OnceCell<usize>,
3434
keymap: OnceCell<HashMap<String, u16>>,
35-
keys: RefCell<Vec<Key>>,
35+
keys: OnceCell<Box<[Key]>>,
3636
page: Cell<Page>,
3737
picker: RefCell<WeakRef<Picker>>,
3838
selected: Cell<Option<usize>>,
@@ -105,7 +105,7 @@ impl ObjectSubclass for KeyboardInner {
105105
daemon: OnceCell::new(),
106106
daemon_board: OnceCell::new(),
107107
keymap: OnceCell::new(),
108-
keys: RefCell::new(Vec::new()),
108+
keys: OnceCell::new(),
109109
page: Cell::new(Page::Layer1),
110110
picker: RefCell::new(WeakRef::new()),
111111
selected: Cell::new(None),
@@ -186,10 +186,10 @@ impl Keyboard {
186186
};
187187
println!(" Scancode Name: {}", scancode_name);
188188

189-
key.scancodes.push((scancode, scancode_name));
189+
key.scancodes.borrow_mut().push((scancode, scancode_name));
190190
}
191191
}
192-
*keyboard.inner().keys.borrow_mut() = keys;
192+
let _ = keyboard.inner().keys.set(keys.into_boxed_slice());
193193

194194
let _ = keyboard.inner().daemon.set(daemon);
195195
let _ = keyboard.inner().daemon_board.set(daemon_board);
@@ -258,12 +258,15 @@ impl Keyboard {
258258
self.keymap().contains_key(scancode_name)
259259
}
260260

261+
fn keys(&self) -> &[Key] {
262+
self.inner().keys.get().unwrap()
263+
}
264+
261265
pub fn keymap_set(&self, key_index: usize, layer: usize, scancode_name: &str) {
262-
let mut keys = self.inner().keys.borrow_mut();
263-
let k = &mut keys[key_index];
266+
let k = &self.keys()[key_index];
264267
let mut found = false;
265268
if let Some(scancode) = self.keymap().get(scancode_name) {
266-
k.scancodes[layer] = (*scancode, scancode_name.to_string());
269+
k.scancodes.borrow_mut()[layer] = (*scancode, scancode_name.to_string());
267270
k.refresh();
268271
found = true;
269272
}
@@ -272,19 +275,18 @@ impl Keyboard {
272275
}
273276
println!(
274277
" set {}, {}, {} to {:04X}",
275-
layer, k.electrical.0, k.electrical.1, k.scancodes[layer].0
278+
layer, k.electrical.0, k.electrical.1, k.scancodes.borrow()[layer].0
276279
);
277280
if let Err(err) = self.daemon().keymap_set(
278281
self.daemon_board(),
279282
layer as u8,
280283
k.electrical.0,
281284
k.electrical.1,
282-
k.scancodes[layer].0,
285+
k.scancodes.borrow_mut()[layer].0,
283286
) {
284287
eprintln!("Failed to set keymap: {:?}", err);
285288
}
286289

287-
drop(keys);
288290
self.set_selected(self.selected());
289291
}
290292

@@ -325,10 +327,10 @@ impl Keyboard {
325327
// TODO: Replace with something type-safe
326328
unsafe { fixed.set_data("keyboard_confurator_page", page) };
327329

328-
let keys_len = self.inner().keys.borrow().len();
330+
let keys_len = self.keys().len();
329331
for i in 0..keys_len {
330332
let (button, label) = {
331-
let keys = self.inner().keys.borrow();
333+
let keys = self.keys();
332334
let k = &keys[i];
333335

334336
let scale = 64.0;
@@ -374,10 +376,9 @@ impl Keyboard {
374376
}
375377
}));
376378

377-
let mut keys = self.inner().keys.borrow_mut();
378-
let k = &mut keys[i];
379+
let k = &self.keys()[i];
379380
k.refresh();
380-
k.gtk.insert(page, (button, label));
381+
k.gtk.borrow_mut().insert(page, (button, label));
381382
}
382383
}
383384
}
@@ -395,10 +396,10 @@ impl Keyboard {
395396
Some(picker) => picker,
396397
None => { return; },
397398
};
398-
let keys = self.inner().keys.borrow();
399+
let keys = self.keys();
399400

400401
if let Some(selected) = self.selected() {
401-
for (_page, (button, _label)) in keys[selected].gtk.iter() {
402+
for (_page, (button, _label)) in keys[selected].gtk.borrow().iter() {
402403
button.get_style_context().remove_class("selected");
403404
}
404405
picker.set_selected(None);
@@ -407,10 +408,10 @@ impl Keyboard {
407408
if let Some(i) = i {
408409
let k = &keys[i];
409410
println!("{:#?}", k);
410-
for (_page, (button, _label)) in keys[i].gtk.iter() {
411+
for (_page, (button, _label)) in keys[i].gtk.borrow().iter() {
411412
button.get_style_context().add_class("selected");
412413
}
413-
if let Some((_scancode, scancode_name)) = keys[i].scancodes.get(self.layer()) {
414+
if let Some((_scancode, scancode_name)) = keys[i].scancodes.borrow().get(self.layer()) {
414415
picker.set_selected(Some(scancode_name.to_string()));
415416
}
416417
}

src/application/layout/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::cell::RefCell;
12
use std::char;
23
use std::collections::HashMap;
34

@@ -131,10 +132,10 @@ impl<'a> Layout<'a> {
131132
physical_name: name.clone(),
132133
electrical: electrical.clone(),
133134
electrical_name: format!("{}, {}", electrical.0, electrical.1),
134-
scancodes: Vec::new(),
135+
scancodes: RefCell::new(Vec::new()),
135136
background_color: background_color.clone(),
136137
foreground_color: foreground_color.clone(),
137-
gtk: HashMap::new(),
138+
gtk: RefCell::new(HashMap::new()),
138139
});
139140

140141
x += w;

0 commit comments

Comments
 (0)