about summary refs log tree commit diff
path: root/cros-keyboard-map.py
diff options
context:
space:
mode:
Diffstat (limited to 'cros-keyboard-map.py')
-rwxr-xr-xcros-keyboard-map.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/cros-keyboard-map.py b/cros-keyboard-map.py
new file mode 100755
index 0000000..fb27a06
--- /dev/null
+++ b/cros-keyboard-map.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python3
+
+def vivaldi_scancode_to_keyd(scancode):
+    match scancode:
+        case "90":
+            return "previoussong"
+        case "91":
+            return "zoom"
+        case "92":
+            return "scale"
+        case "93":
+            return "print"
+        case "94":
+            return "brightnessdown"
+        case "95":
+            return "brightnessup"
+        case "97":
+            return "kbdillumdown"
+        case "98":
+            return "kbdillumup"
+        case "99":
+            return "nextsong"
+        case "9A":
+            return "playpause"
+        case "9B":
+            return "micmute"
+        case "9E":
+            return "kbdillumtoggle"
+        case "A0":
+            return "mute"
+        case "AE":
+            return "volumedown"
+        case "B0":
+            return "volumeup"
+        case "E9":
+            return "forward"
+        case "EA":
+            return "back"
+        case "E7":
+            return "refresh"
+
+def load_physmap_data():
+    try:
+        with open("/sys/bus/platform/devices/i8042/serio0/function_row_physmap", "r") as file:
+            return file.read().strip().split()
+    except FileNotFoundError:
+        return ""
+
+def create_keyd_config(physmap):
+    config = ""
+    config += """[ids]
+0001:0001
+
+[main]
+"""
+    # make fn keys act like vivaldi keys when super isn't held
+    i = 0
+    for scancode in physmap:
+        i += 1
+        config += f"f{i} = {vivaldi_scancode_to_keyd(scancode)}\n"
+    config += "\n"
+    
+    # make vivaldi keys act like vivaldi keys when super isn't held
+    i = 0
+    for scancode in physmap:
+        i += 1
+        config += f"{vivaldi_scancode_to_keyd(scancode)} = {vivaldi_scancode_to_keyd(scancode)}\n"
+
+    # make fn keys act like fn keys when super is held
+    i = 0
+    config += "\n[meta]\n"
+    for scancode in physmap:
+        i += 1
+        config += f"f{i} = f{i}\n"
+
+    # make vivaldi keys act like like fn keys when super is held
+    i = 0
+    config += "\n"
+    for scancode in physmap:
+        i += 1
+        config += f"{vivaldi_scancode_to_keyd(scancode)} = f{i}\n"
+
+    # Add various extra shortcuts
+    config += """\n[alt]
+backspace = delete
+meta = capslock
+brightnessdown = kbdillumdown
+brightnessup = kbdillumup
+f6 = kbdillumdown
+f7 = kbdillumup
+
+[control]
+f5 = print
+scale = print
+
+[control+alt]
+backspace = C-A-delete"""
+
+    return config
+
+def main():
+    physmap = load_physmap_data()
+    if not physmap:
+        print("no function row mapping found, using default mapping")
+        physmap = ['EA', 'E9', 'E7', '91', '92', '94', '95', 'A0', 'AE', 'B0']
+    
+    config = create_keyd_config(physmap)
+    with open("cros.conf", "w") as conf:
+        conf.write(config)
+
+main()