Skip to content

Commit 29d53f0

Browse files
committed
improv: Display message when firmware doesn't support keymap API
Systems without Open EC firmware won't be detected at all, and this doesn't change that.
1 parent d3bf668 commit 29d53f0

File tree

7 files changed

+52
-1
lines changed

7 files changed

+52
-1
lines changed

backend/src/board.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub struct BoardInner {
1616
thread_client: DerefCell<Arc<ThreadClient>>,
1717
board: DerefCell<BoardId>,
1818
model: DerefCell<String>,
19+
version: DerefCell<String>,
1920
layout: DerefCell<Layout>,
2021
keys: DerefCell<Vec<Key>>,
2122
layers: DerefCell<Vec<Layer>>,
@@ -25,6 +26,7 @@ pub struct BoardInner {
2526
led_save_blocked: Cell<bool>,
2627
has_matrix: DerefCell<bool>,
2728
is_fake: DerefCell<bool>,
29+
has_keymap: DerefCell<bool>,
2830
}
2931

3032
#[glib::object_subclass]
@@ -66,6 +68,10 @@ impl Board {
6668
return Err(format!("Failed to get board model: {}", err));
6769
}
6870
};
71+
let version = daemon.version(board).unwrap_or_else(|err| {
72+
error!("Error getting firmware version: {}", err);
73+
String::new()
74+
});
6975
let layout = Layout::from_board(&model)
7076
.ok_or_else(|| format!("Failed to locate layout for '{}'", model))?;
7177

@@ -82,16 +88,20 @@ impl Board {
8288

8389
let has_led_save = daemon.led_save(board).is_ok();
8490
let has_matrix = daemon.matrix_get(board).is_ok();
91+
let logical = layout.layout.values().next().unwrap();
92+
let has_keymap = daemon.keymap_get(board, 0, logical.0, logical.1).is_ok();
8593

8694
let self_ = glib::Object::new::<Board>(&[]).unwrap();
8795
self_.inner().thread_client.set(thread_client);
8896
self_.inner().board.set(board);
8997
self_.inner().model.set(model);
98+
self_.inner().version.set(version);
9099
self_.inner().layout.set(layout);
91100
self_.inner().max_brightness.set(max_brightness);
92101
self_.inner().has_led_save.set(has_led_save);
93102
self_.inner().has_matrix.set(has_matrix);
94103
self_.inner().is_fake.set(daemon.is_fake());
104+
self_.inner().has_keymap.set(has_keymap);
95105

96106
let keys = self_
97107
.layout()
@@ -162,6 +172,10 @@ impl Board {
162172
&self.inner().model
163173
}
164174

175+
pub fn version(&self) -> &str {
176+
&self.inner().version
177+
}
178+
165179
pub fn has_matrix(&self) -> bool {
166180
*self.inner().has_matrix
167181
}
@@ -206,6 +220,10 @@ impl Board {
206220
*self.inner().has_led_save
207221
}
208222

223+
pub fn has_keymap(&self) -> bool {
224+
*self.inner().has_keymap
225+
}
226+
209227
pub fn layout(&self) -> &Layout {
210228
&*self.inner().layout
211229
}

backend/src/daemon/dummy.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ impl Daemon for DaemonDummy {
6767
Ok(self.board(board)?.name.clone())
6868
}
6969

70+
fn version(&self, _board: BoardId) -> Result<String, String> {
71+
Ok("1970-01-01-deadbee".to_string())
72+
}
73+
7074
fn is_fake(&self) -> bool {
7175
true
7276
}

backend/src/daemon/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ macro_rules! commands {
110110
commands! {
111111
fn boards(&self) -> Result<Vec<BoardId>, String>;
112112
fn model(&self, board: BoardId) -> Result<String, String>;
113+
fn version(&self, board: BoardId) -> Result<String, String>;
113114
fn refresh(&self) -> Result<(), String>;
114115
fn keymap_get(&self, board: BoardId, layer: u8, output: u8, input: u8) -> Result<u16, String>;
115116
fn keymap_set(&self, board: BoardId, layer: u8, output: u8, input: u8, value: u16) -> Result<(), String>;

backend/src/daemon/s76power.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ impl Daemon for DaemonS76Power {
8585
Ok("system76/darp6".to_string())
8686
}
8787

88+
fn version(&self, _board: BoardId) -> Result<String, String> {
89+
Err("Unimplemented".to_string())
90+
}
91+
8892
fn keymap_get(
8993
&self,
9094
_board: BoardId,

backend/src/daemon/server.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ impl<R: Read + Send + 'static, W: Write + Send + 'static> Daemon for DaemonServe
129129
Ok(board.to_string())
130130
}
131131

132+
fn version(&self, board: BoardId) -> Result<String, String> {
133+
let mut ec = self.board(board)?;
134+
let data_size = unsafe { ec.access().data_size() };
135+
let mut data = vec![0; data_size];
136+
let len = unsafe { ec.version(&mut data).map_err(err_str)? };
137+
let version = str::from_utf8(&data[..len]).map_err(err_str)?;
138+
Ok(version.to_string())
139+
}
140+
132141
fn keymap_get(&self, board: BoardId, layer: u8, output: u8, input: u8) -> Result<u16, String> {
133142
let mut ec = self.board(board)?;
134143
unsafe { ec.keymap_get(layer, output, input).map_err(err_str) }

i18n/en/system76_keyboard_configurator.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ error-set-layer-mode = Failed to set layer mode
2626
error-unsupported-keymap = Unsupported keymap file
2727
error-unsupported-keymap-desc = Keymap file appears to be from newer Configurator version.
2828
29+
firmware-version = Firmware version {$version} does not support keymap configuration.
30+
2931
keyboard-brightness = Brightness:
3032
keyboard-color = Color:
3133

src/main_window.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ impl MainWindow {
289289
let app: ConfiguratorApp = self.get_application().unwrap().downcast().unwrap();
290290

291291
let keyboard = cascade! {
292-
Keyboard::new(board, app.debug_layers(), app.launch_test());
292+
Keyboard::new(board.clone(), app.debug_layers(), app.launch_test());
293293
..set_halign(gtk::Align::Center);
294294
..show_all();
295295
};
@@ -330,6 +330,19 @@ impl MainWindow {
330330
};
331331
self.inner().keyboard_box.add(&row);
332332

333+
if !board.has_keymap() {
334+
button.hide();
335+
let label = cascade! {
336+
gtk::Label::new(Some(&fl!("firmware-version", version = board.version())));
337+
..set_attributes(Some(&cascade! {
338+
pango::AttrList::new();
339+
..insert(pango::Attribute::new_foreground(65535, 0, 0));
340+
}));
341+
..show();
342+
};
343+
keyboard_box.add(&label);
344+
}
345+
333346
self.inner().stack.add(&keyboard);
334347
self.inner().keyboards.borrow_mut().push((keyboard, row));
335348

0 commit comments

Comments
 (0)