Skip to content

Commit 862562c

Browse files
ids1024jackpot51
authored andcommitted
feat: Primitive support for multiple keyboards
1 parent 4176fea commit 862562c

File tree

1 file changed

+59
-19
lines changed

1 file changed

+59
-19
lines changed

src/application/mod.rs

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use keyboard::Keyboard;
1616
use picker::Picker;
1717

1818
//TODO: allow multiple keyboards
19-
fn main_keyboard(app: &gtk::Application, keyboard: Rc<Keyboard>) {
19+
fn main_keyboard(app: &gtk::Application, keyboard: Rc<Keyboard>) -> gtk::Box {
2020
let picker = Picker::new();
2121
picker.set_keyboard(Some(keyboard.clone()));
2222

@@ -28,6 +28,64 @@ fn main_keyboard(app: &gtk::Application, keyboard: Rc<Keyboard>) {
2828
..add(&picker);
2929
};
3030

31+
vbox
32+
}
33+
34+
fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
35+
let boards = daemon.boards().expect("Failed to load boards");
36+
37+
let board_dropdown = cascade! {
38+
gtk::ComboBoxText::new();
39+
};
40+
41+
let stack = cascade! {
42+
gtk::Stack::new();
43+
..set_transition_duration(0);
44+
};
45+
46+
board_dropdown.connect_changed(clone!(@weak stack => @default-panic, move |combobox| {
47+
if let Some(id) = combobox.get_active_id() {
48+
stack.set_visible_child_name(&id);
49+
}
50+
}));
51+
52+
let mut count = 0;
53+
for (i, board) in boards.iter().enumerate() {
54+
if let Some(keyboard) = Keyboard::new_board(board, Some(daemon.clone()), i) {
55+
let widget = main_keyboard(app, keyboard);
56+
board_dropdown.append(Some(&board), &board);
57+
stack.add_named(&widget, &board);
58+
count += 1;
59+
60+
if count == 1 {
61+
widget.show();
62+
board_dropdown.set_active_id(Some(&board));
63+
}
64+
} else {
65+
eprintln!("Failed to locate layout for '{}'", board);
66+
}
67+
}
68+
69+
if count == 0 {
70+
eprintln!("Failed to locate any keyboards, showing demo");
71+
let board = "system76/launch_alpha_2";
72+
let keyboard = Keyboard::new_board(board, None, 0)
73+
.expect("Failed to load demo layout");
74+
75+
let widget = main_keyboard(app, keyboard);
76+
board_dropdown.append(Some(board), board);
77+
stack.add_named(&widget, board);
78+
79+
widget.show();
80+
board_dropdown.set_active_id(Some(board));
81+
}
82+
83+
let vbox = cascade! {
84+
gtk::Box::new(gtk::Orientation::Vertical, 32);
85+
..add(&board_dropdown);
86+
..add(&stack);
87+
};
88+
3189
let scrolled_window = cascade! {
3290
gtk::ScrolledWindow::new::<gtk::Adjustment, gtk::Adjustment>(None, None);
3391
..add(&vbox);
@@ -49,24 +107,6 @@ fn main_keyboard(app: &gtk::Application, keyboard: Rc<Keyboard>) {
49107
});
50108
}
51109

52-
fn main_app(app: &gtk::Application, daemon: Rc<dyn Daemon>) {
53-
let boards = daemon.boards().expect("Failed to load boards");
54-
let i = 0;
55-
if let Some(board) = boards.get(i) {
56-
if let Some(keyboard) = Keyboard::new_board(board, Some(daemon), i) {
57-
main_keyboard(app, keyboard);
58-
return;
59-
} else {
60-
eprintln!("Failed to locate layout for '{}'", board);
61-
}
62-
}
63-
64-
eprintln!("Failed to locate any keyboards, showing demo");
65-
let keyboard = Keyboard::new_board("system76/launch_alpha_2", None, 0)
66-
.expect("Failed to load demo layout");
67-
main_keyboard(app, keyboard);
68-
}
69-
70110
#[cfg(target_os = "linux")]
71111
fn daemon() -> Rc<dyn Daemon> {
72112
use std::{

0 commit comments

Comments
 (0)