Skip to content

Commit 219a767

Browse files
ids1024jackpot51
authored andcommitted
improve: Use use once_cell::sync::Lazy for scancode labels
This means the `Key::refresh()` doesn't require a reference to the `Picker`.
1 parent 1b8b37e commit 219a767

File tree

3 files changed

+28
-19
lines changed

3 files changed

+28
-19
lines changed

src/application/key.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::{
44
};
55

66
use super::page::Page;
7-
use super::picker::Picker;
7+
use super::picker::SCANCODE_LABELS;
88
use super::rect::Rect;
99

1010
#[derive(Clone, Debug)]
@@ -59,16 +59,16 @@ button {{
5959
)
6060
}
6161

62-
pub fn refresh(&self, picker: &Picker) {
62+
pub fn refresh(&self) {
6363
for (layer, (_button, label)) in self.gtk.iter() {
6464
label.set_label(match layer {
6565
Page::Layer1 => {
6666
let scancode_name = &self.scancodes[0].1;
67-
picker.get_text(scancode_name).unwrap_or(scancode_name)
67+
SCANCODE_LABELS.get(scancode_name).unwrap_or(scancode_name)
6868
},
6969
Page::Layer2 => {
7070
let scancode_name = &self.scancodes[1].1;
71-
picker.get_text(scancode_name).unwrap_or(scancode_name)
71+
SCANCODE_LABELS.get(scancode_name).unwrap_or(scancode_name)
7272
},
7373
Page::Keycaps => &self.physical_name,
7474
Page::Logical => &self.logical_name,

src/application/keyboard.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,14 +258,13 @@ impl Keyboard {
258258
self.keymap().contains_key(scancode_name)
259259
}
260260

261-
pub fn keymap_set(&self, picker: &Picker, key_index: usize, layer: usize, scancode_name: &str) {
262-
// XXX avoid reference to Picker
261+
pub fn keymap_set(&self, key_index: usize, layer: usize, scancode_name: &str) {
263262
let mut keys = self.inner().keys.borrow_mut();
264263
let k = &mut keys[key_index];
265264
let mut found = false;
266265
if let Some(scancode) = self.keymap().get(scancode_name) {
267266
k.scancodes[layer] = (*scancode, scancode_name.to_string());
268-
k.refresh(&picker);
267+
k.refresh();
269268
found = true;
270269
}
271270
if !found {
@@ -377,6 +376,7 @@ impl Keyboard {
377376

378377
let mut keys = self.inner().keys.borrow_mut();
379378
let k = &mut keys[i];
379+
k.refresh();
380380
k.gtk.insert(page, (button, label));
381381
}
382382
}
@@ -388,12 +388,6 @@ impl Keyboard {
388388
Some(picker) => picker.downgrade(),
389389
None => WeakRef::new(),
390390
};
391-
392-
for k in self.inner().keys.borrow().iter() {
393-
if let Some(picker) = self.inner().picker.borrow().upgrade() {
394-
k.refresh(&picker);
395-
}
396-
}
397391
}
398392

399393
fn set_selected(&self, i: Option<usize>) {

src/application/picker/mod.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ use glib::subclass::prelude::*;
66
use gtk::prelude::*;
77
use gtk::subclass::prelude::*;
88
use glib::translate::{FromGlibPtrFull, ToGlib, ToGlibPtr};
9+
use once_cell::sync::Lazy;
910
use std::{
10-
cell::{Cell, RefCell},
11+
cell::RefCell,
1112
collections::HashMap,
1213
rc::Rc,
1314
};
@@ -33,6 +34,24 @@ button {
3334
}
3435
"#;
3536

37+
pub static SCANCODE_LABELS: Lazy<HashMap<String, String>> = Lazy::new(|| {
38+
let mut labels = HashMap::new();
39+
for record in picker_csv() {
40+
match record {
41+
PickerCsv::Group { .. } => {}
42+
PickerCsv::Key { name, top, bottom } => {
43+
let text = if bottom.is_empty() {
44+
top
45+
} else {
46+
format!("{}\n{}", top, bottom)
47+
};
48+
labels.insert(name, text);
49+
}
50+
}
51+
}
52+
labels
53+
});
54+
3655
pub struct PickerInner {
3756
groups: Vec<PickerGroup>,
3857
keys: HashMap<String, Rc<PickerKey>>,
@@ -180,7 +199,7 @@ impl Picker {
180199

181200
println!("Clicked {} layer {}", name, layer);
182201
if let Some(i) = kb.selected() {
183-
kb.keymap_set(&picker, i, layer, &name);
202+
kb.keymap_set(i, layer, &name);
184203
}
185204
}));
186205
}
@@ -191,10 +210,6 @@ impl Picker {
191210
self.inner().keys.get(scancode_name).map(|k| &k.gtk)
192211
}
193212

194-
pub(crate) fn get_text(&self, scancode_name: &str) -> Option<&str> {
195-
self.inner().keys.get(scancode_name).map(|k| k.text.as_ref())
196-
}
197-
198213
pub(crate) fn set_keyboard(&self, keyboard: Option<Keyboard>) {
199214
if let Some(old_kb) = &*self.inner().keyboard.borrow() {
200215
old_kb.set_picker(None);

0 commit comments

Comments
 (0)