Skip to content

Commit e9a3e77

Browse files
Rust
1 parent 2db6551 commit e9a3e77

File tree

5 files changed

+309
-18
lines changed

5 files changed

+309
-18
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
cros.conf
2+
target/

Cargo.lock

+150
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "cros-keyboard-map"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
fuser = "0.13.0"
10+
libc = "0.2.149"

install.sh

+19-18
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,36 @@ elif [ -f /usr/bin/apk ]; then
1717
distro="alpine"
1818
fi
1919

20-
2120
if ! [ -f /usr/bin/keyd ]; then
22-
# if keyd isnt installed
21+
# if keyd isnt installed
2322
echo "Installing keyd dependencies"
2423
case $distro in
25-
deb)
26-
sudo apt install -y build-essential git
24+
deb)
25+
sudo apt install -y build-essential git
2726
;;
28-
arch)
27+
arch)
2928
sudo pacman -S --noconfirm base-devel git
3029
;;
31-
fedora)
30+
fedora)
3231
sudo dnf groupinstall -y "Development Tools" "Development Libraries"
3332
;;
3433
esac
3534

3635
echo "Installing keyd"
3736
case $distro in
38-
suse)
37+
suse)
3938
sudo zypper --non-interactive install keyd
4039
;;
41-
arch)
40+
arch)
4241
git clone https://aur.archlinux.org/keyd.git
4342
cd keyd
4443
makepkg -si --noconfirm
4544
cd ..
4645
;;
47-
alpine)
46+
alpine)
4847
doas apk add --no-interactive keyd
4948
;;
50-
*)
49+
*)
5150
git clone https://github.com/rvaiya/keyd
5251
cd keyd
5352
make
@@ -58,30 +57,32 @@ if ! [ -f /usr/bin/keyd ]; then
5857
fi
5958

6059
echo "Generating config"
61-
python3 cros-keyboard-map.py
60+
echo "Not implemented"
61+
exit 1
62+
# python3 cros-keyboard-map.py
6263

6364
echo "Installing config"
6465
sudo mkdir -p /etc/keyd
6566
sudo cp cros.conf /etc/keyd
6667

6768
echo "Enabling keyd"
6869
case $distro in
69-
alpine)
70-
doas rc-update add keyd
71-
doas rc-service keyd restart
70+
alpine)
71+
doas rc-update add keyd
72+
doas rc-service keyd restart
7273
;;
73-
*)
74-
sudo systemctl enable keyd
74+
*)
75+
sudo systemctl enable keyd
7576
sudo systemctl restart keyd
7677
;;
7778
esac
7879

7980
echo "Installing libinput configuration"
8081
sudo mkdir -p /etc/libinput
8182
if [ -f /etc/libinput/local-overrides.quirks ]; then
82-
cat $ROOT/local-overrides.quirks | sudo tee -a /etc/libinput/local-overrides.quirks > /dev/null
83+
cat $ROOT/local-overrides.quirks | sudo tee -a /etc/libinput/local-overrides.quirks >/dev/null
8384
else
84-
sudo cp $ROOT/local-overrides.quirks /etc/libinput/local-overrides.quirks
85+
sudo cp $ROOT/local-overrides.quirks /etc/libinput/local-overrides.quirks
8586
fi
8687

8788
echo "Done"

src/main.rs

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
use std::{fmt::format, fs, io, path::Iter, str::SplitWhitespace};
2+
3+
fn vivaldi_scan_code_to_keyd(scan_code: &str) -> Result<&str, ()> {
4+
match scan_code {
5+
"90" => Ok("previoussong"),
6+
"91" => Ok("zoom"),
7+
"92" => Ok("scale"),
8+
"93" => Ok("print"),
9+
"94" => Ok("brightnessdown"),
10+
"95" => Ok("brightnessup"),
11+
"97" => Ok("kbdillumdown"),
12+
"98" => Ok("kbdillumup"),
13+
"99" => Ok("nextsong"),
14+
"9A" => Ok("playpause"),
15+
"9B" => Ok("micmute"),
16+
"9E" => Ok("kbdillumtoggle"),
17+
"A0" => Ok("mute"),
18+
"AE" => Ok("volumedown"),
19+
"B0" => Ok("volumeup"),
20+
"E9" => Ok("forward"),
21+
"EA" => Ok("back"),
22+
"E7" => Ok("refresh"),
23+
_ => Err(()),
24+
}
25+
}
26+
27+
fn load_physmap_scan_codes() -> Result<Vec<String>, io::Error> {
28+
match fs::read_to_string("/sys/bus/platform/devices/i8042/serio0/function_row_physmap") {
29+
Ok(contents) => Ok(contents.split_whitespace().map(|s| s.to_owned()).collect()),
30+
Err(e) => Err(e),
31+
}
32+
}
33+
34+
fn create_keyd_config(physmap: Vec<&str>) -> String {
35+
let p1 = "\
36+
[ids]
37+
0001:0001
38+
39+
[main]
40+
";
41+
// make fn keys act like vivaldi keys when super isn't held
42+
let vivaldi_for_non_vivaldi: Vec<_> = physmap
43+
.iter()
44+
.enumerate()
45+
.map(|(i, scan_code)| {
46+
let keyd = vivaldi_scan_code_to_keyd(scan_code).unwrap();
47+
let f_number = i + 1;
48+
format!("f{f_number} = ") + if keyd == "zoom" { "f11" } else { keyd }
49+
})
50+
.collect();
51+
let vivaldi = &(vivaldi_for_non_vivaldi.join("\n") + "\n");
52+
53+
// make vivaldi keys act like vivaldi keys when super isn't held
54+
let vivaldi_for_vivaldi: Vec<_> = physmap
55+
.iter()
56+
.map(|scan_code| {
57+
let vivaldi = vivaldi_scan_code_to_keyd(scan_code).unwrap();
58+
let mapping = if vivaldi == "zoom" { "f11" } else { vivaldi };
59+
format!("{vivaldi} = {mapping}")
60+
})
61+
.collect();
62+
let vivaldi_for_vivaldi = &(vivaldi_for_vivaldi.join("\n") + "\n");
63+
64+
// map lock button to coffee
65+
let lock = "\
66+
f13 = coffee
67+
sleep = coffee
68+
";
69+
70+
let meta = "\n[meta]\n";
71+
// make fn keys act like fn keys when super is held
72+
let meta_mappings_non_vivaldi: Vec<_> = physmap
73+
.iter()
74+
.enumerate()
75+
.map(|(i, _)| {
76+
let f_number = i + 1;
77+
format!("f{f_number} = f{f_number}")
78+
})
79+
.collect();
80+
let meta_mappings_non_vivaldi = &(meta_mappings_non_vivaldi.join("\n") + "\n");
81+
// make vivaldi keys act like like fn keys when super is held
82+
let meta_mappings_vivaldi: Vec<_> = physmap
83+
.iter()
84+
.enumerate()
85+
.map(|(i, scan_code)| {
86+
let vivaldi = vivaldi_scan_code_to_keyd(&scan_code).unwrap();
87+
let f_number = i + 1;
88+
format!("{vivaldi} = f{f_number}")
89+
})
90+
.collect();
91+
let meta_mappings_vivaldi = &(meta_mappings_vivaldi.join("\n") + "\n");
92+
let extra_shortcuts = "
93+
[alt]
94+
backspace = delete
95+
brightnessdown = kbdillumdown
96+
brightnessup = kbdillumup
97+
f6 = kbdillumdown
98+
f7 = kbdillumup
99+
100+
[control]
101+
f5 = print
102+
scale = print
103+
104+
[control+alt]
105+
backspace = C-A-delete
106+
";
107+
108+
"".to_owned()
109+
+ p1
110+
+ vivaldi
111+
+ vivaldi_for_vivaldi
112+
+ lock
113+
+ meta
114+
+ meta_mappings_non_vivaldi
115+
+ meta_mappings_vivaldi
116+
+ extra_shortcuts
117+
}
118+
119+
fn main() {
120+
let config = create_keyd_config(
121+
load_physmap_scan_codes()
122+
.unwrap()
123+
.iter()
124+
.map(|scan_code| scan_code.as_str())
125+
.collect(),
126+
);
127+
print!("{}", config);
128+
fs::write("cros.conf", config).unwrap();
129+
}

0 commit comments

Comments
 (0)