Skip to content
Merged
7 changes: 1 addition & 6 deletions examples/daemon.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,7 @@ fn with_daemon<F: Fn(Box<dyn Daemon>)>(f: F) {
let stdin = child.stdin.take().expect("Failed to get stdin of daemon");
let stdout = child.stdout.take().expect("Failed to get stdout of daemon");

f(Box::new(DaemonClient::new(stdout, stdin)));

let status = child.wait().expect("Failed to wait for daemon");
if ! status.success() {
panic!("Failed to run daemon with exit status {:?}", status);
}
f(Box::new(DaemonClient::new(child, stdout, stdin)));
}

#[cfg(not(target_os = "linux"))]
Expand Down
66 changes: 33 additions & 33 deletions layouts/picker.csv
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ Number keys,4,1
0,),0
,,
Modifier keys,4,1
LEFT_ALT,Left,Alt
RIGHT_ALT,Right,Alt
LEFT_CTRL,Left,Ctrl
RIGHT_CTRL,Right,Ctrl
LEFT_SHIFT,Left,Shift
RIGHT_SHIFT,Right,Shift
LEFT_SUPER,Left,Super
RIGHT_SUPER,Right,Super
LEFT_ALT,Left Alt,
RIGHT_ALT,Right Alt,
LEFT_CTRL,Left Ctrl,
RIGHT_CTRL,Right Ctrl,
LEFT_SHIFT,Left Shift,
RIGHT_SHIFT,Right Shift,
LEFT_SUPER,Left Super,
RIGHT_SUPER,Right Super,
,,
Actions,4,1
ENTER,Enter,
Expand Down Expand Up @@ -77,7 +77,7 @@ F11,F11,
F12,F12,
,,
Numpad,6,1
NUM_LOCK,Num,Lock
NUM_LOCK,Num Lock,
NUM_7,7,
NUM_8,8,
NUM_9,9,
Expand Down Expand Up @@ -120,35 +120,35 @@ END,End,
,,
Media,3,1
MUTE,Mute,
VOLUME_UP,Vol,Up
VOLUME_DOWN,Vol,Down
PLAY_PAUSE,Play,Pause
MEDIA_NEXT,Next,Track
MEDIA_PREV,Prev,Track
VOLUME_UP,Vol Up,
VOLUME_DOWN,Vol Down,
PLAY_PAUSE,Play Pause,
MEDIA_NEXT,Next Track,
MEDIA_PREV,Prev Track,
,,
Controls,4,2
DISPLAY_TOGGLE,Screen,Toggle
BRIGHTNESS_UP,Screen,Up
BRIGHTNESS_DOWN,Screen,Down
DISPLAY_MODE,Screen,Mode
DISPLAY_TOGGLE,Screen Toggle,
BRIGHTNESS_UP,Screen Up,
BRIGHTNESS_DOWN,Screen Down,
DISPLAY_MODE,Screen Mode,
SUSPEND,Suspend,
CAMERA_TOGGLE,Camera,Toggle
AIRPLANE_MODE,Airplane,Mode
CAMERA_TOGGLE,Camera Toggle,
AIRPLANE_MODE,Airplane Mode,
TOUCHPAD,Touchpad,Toggle
,,
LED controls,4,1
KBD_TOGGLE,LED,Toggle
KBD_UP,LED,Up
KBD_DOWN,LED,Down
KBD_BKL,LED,Cycle
KBD_COLOR,LED,Color
KBD_TOGGLE,LED Toggle,
KBD_UP,LED Up,
KBD_DOWN,LED Down,
KBD_BKL,LED Cycle,
KBD_COLOR,LED Color,
,,
Layer keys,4,1
LAYER_ACCESS_1,Access,Layer 1
FN,Access,Layer 2
LAYER_ACCESS_3,Access,Layer 3
LAYER_ACCESS_4,Access,Layer 4
LAYER_TOGGLE_1,Toggle,Layer 1
LAYER_TOGGLE_2,Toggle,Layer 2
LAYER_TOGGLE_3,Toggle,Layer 3
LAYER_TOGGLE_4,Toggle,Layer 4
LAYER_ACCESS_1,Access Layer 1,
FN,Access Layer 2,
LAYER_ACCESS_3,Access Layer 3,
LAYER_ACCESS_4,Access Layer 4,
LAYER_TOGGLE_1,Toggle Layer 1,
LAYER_TOGGLE_2,Toggle Layer 2,
LAYER_TOGGLE_3,Toggle Layer 3,
LAYER_TOGGLE_4,Toggle Layer 4,
22 changes: 11 additions & 11 deletions src/application/key.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use std::{
collections::HashMap,
};

use super::page::Page;
use super::picker::Picker;
use super::rect::Rect;

Expand All @@ -28,7 +29,7 @@ pub struct Key {
pub(crate) foreground_color: String,
// GTK buttons by page
//TODO: clean up this crap
pub(crate) gtk: HashMap<String, gtk::Button>,
pub(crate) gtk: HashMap<Page, (gtk::Button, gtk::Label)>,
}

impl Key {
Expand Down Expand Up @@ -59,7 +60,7 @@ button {{
}

pub fn select(&self, picker: &Picker, layer: usize) {
for (_page, button) in self.gtk.iter() {
for (_page, (button, _label)) in self.gtk.iter() {
button.get_style_context().add_class("selected");
}
if let Some((_scancode, scancode_name)) = self.scancodes.get(layer) {
Expand All @@ -72,7 +73,7 @@ button {{
}

pub fn deselect(&self, picker: &Picker, layer: usize) {
for (_page, button) in self.gtk.iter() {
for (_page, (button, _label)) in self.gtk.iter() {
button.get_style_context().remove_class("selected");
}
if let Some((_scancode, scancode_name)) = self.scancodes.get(layer) {
Expand All @@ -85,28 +86,27 @@ button {{
}

pub fn refresh(&self, picker: &Picker) {
for (page, button) in self.gtk.iter() {
button.set_label(match page.as_str() {
"Layer 1" => {
for (layer, (_button, label)) in self.gtk.iter() {
label.set_label(match layer {
Page::Layer1 => {
let scancode_name = &self.scancodes[0].1;
if let Some(picker_key) = picker.keys.get(scancode_name) {
&picker_key.text
} else {
scancode_name
}
},
"Layer 2" => {
Page::Layer2 => {
let scancode_name = &self.scancodes[1].1;
if let Some(picker_key) = picker.keys.get(scancode_name) {
&picker_key.text
} else {
scancode_name
}
},
"Keycaps" => &self.physical_name,
"Logical" => &self.logical_name,
"Electrical" => &self.electrical_name,
_ => "",
Page::Keycaps => &self.physical_name,
Page::Logical => &self.logical_name,
Page::Electrical => &self.electrical_name,
});
}
}
Expand Down
87 changes: 62 additions & 25 deletions src/application/keyboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ use cascade::cascade;
use gtk::prelude::*;
use serde_json::Value;
use std::{
cell::RefCell,
cell::{
Cell,
RefCell,
},
char,
collections::HashMap,
fs,
Expand All @@ -17,6 +20,7 @@ use crate::daemon::Daemon;
use crate::keyboard::Keyboard as ColorKeyboard;
use crate::keyboard_color_button::KeyboardColorButton;
use super::key::Key;
use super::page::Page;
use super::picker::Picker;
use super::rect::Rect;

Expand All @@ -25,7 +29,7 @@ pub struct Keyboard {
daemon_board: usize,
keymap: HashMap<String, u16>,
keys: RefCell<Vec<Key>>,
page: RefCell<u32>,
page: Cell<Page>,
picker: Picker,
selected: RefCell<Option<usize>>,
}
Expand Down Expand Up @@ -240,17 +244,17 @@ impl Keyboard {
daemon_board,
keymap,
keys: RefCell::new(keys),
page: RefCell::new(0),
page: Cell::new(Page::Layer1),
picker: Picker::new(),
selected: RefCell::new(None),
})
}

pub fn layer(&self) -> usize {
//TODO: make this more robust
match *self.page.borrow() {
0 => 0, // Layer 1
1 => 1, // Layer 2
match self.page.get() {
Page::Layer1 => 0,
Page::Layer2 => 1,
_ => 0, // Any other page selects Layer 1
}
}
Expand Down Expand Up @@ -314,12 +318,20 @@ button {
}

for key in group.keys.iter() {
let label = cascade! {
gtk::Label::new(Some(&key.text));
..set_line_wrap(true);
..set_max_width_chars(1);
..set_margin_start(5);
..set_margin_end(5);
..set_justify(gtk::Justification::Center);
};

let button = cascade! {
gtk::Button::new();
..set_hexpand(false);
..set_size_request(48 * group.width, 48);
..set_label(&key.text);
..get_style_context().add_provider(&style_provider, gtk::STYLE_PROVIDER_PRIORITY_USER);
..add(&label);
};

// Check that scancode is available for the keyboard
Expand Down Expand Up @@ -383,12 +395,20 @@ button {
}

pub fn gtk(self: Rc<Self>) -> gtk::Box {
let notebook = gtk::Notebook::new();
let stack = cascade! {
gtk::Stack::new();
..set_transition_duration(0);
};
let kb = self.clone();
notebook.connect_switch_page(move |_, _, page| {
println!("{}", page);
stack.connect_property_visible_child_notify(move |stack| {
let page: Option<Page> = match stack.get_visible_child() {
Some(child) => unsafe { child.get_data("keyboard_confurator_page").cloned() },
None => None,
};

println!("{:?}", page);
let last_layer = kb.layer();
*kb.page.borrow_mut() = page;
kb.page.set(page.unwrap_or(Page::Layer1));
let layer = kb.layer();
if layer != last_layer {
if let Some(i) = *kb.selected.borrow() {
Expand Down Expand Up @@ -448,20 +468,16 @@ button {
let color_button = KeyboardColorButton::new(color_keyboard).widget().clone();
color_button.set_valign(gtk::Align::Center);

for page in &[
"Layer 1",
"Layer 2",
"Keycaps",
"Logical",
"Electrical"
] {
let page_label = gtk::Label::new(Some(page));
for page in Page::iter_all() {
let fixed = gtk::Fixed::new();
notebook.append_page(&fixed, Some(&page_label));
stack.add_titled(&fixed, page.name(), page.name());

// TODO: Replace with something type-safe
unsafe { fixed.set_data("keyboard_confurator_page", page) };

let keys_len = self.keys.borrow().len();
for i in 0..keys_len {
let button = {
let (button, label) = {
let keys = self.keys.borrow();
let k = &keys[i];

Expand All @@ -478,15 +494,25 @@ button {
..load_from_data(css.as_bytes()).expect("Failed to parse css");
};

let label = cascade! {
gtk::Label::new(None);
..set_line_wrap(true);
..set_margin_start(5);
..set_margin_end(5);
..set_justify(gtk::Justification::Center);
};

let button = cascade! {
gtk::Button::new();
..set_focus_on_click(false);
..set_size_request(w, h);
..get_style_context().add_provider(&style_provider, gtk::STYLE_PROVIDER_PRIORITY_USER);
..add(&label);
};

fixed.put(&button, x, y);
button

(button, label)
};

{
Expand Down Expand Up @@ -514,11 +540,21 @@ button {

let mut keys = self.keys.borrow_mut();
let k = &mut keys[i];
k.gtk.insert(page.to_string(), button);
k.gtk.insert(page, (button, label));
k.refresh(&self.picker);
}
}

let stack_switcher = cascade! {
gtk::StackSwitcher::new();
..set_stack(Some(&stack));
};

let toolbar = cascade!{
gtk::Box::new(gtk::Orientation::Horizontal, 8);
..set_center_widget(Some(&stack_switcher));
};

let hbox = cascade! {
gtk::Box::new(gtk::Orientation::Horizontal, 8);
..add(&brightness_label);
Expand All @@ -529,8 +565,9 @@ button {

let vbox = cascade! {
gtk::Box::new(gtk::Orientation::Vertical, 8);
..add(&toolbar);
..add(&hbox);
..add(&notebook);
..add(&stack);
};

vbox
Expand Down
Loading