Remmaping with kanata: Ανακυκλώνοντας ένα πεταμένο πληκτρολόγιο

Πρόσφατα βρήκα πεταμένο ένα μηχανικό πληκτρολόγιο Razer Black Window Elite. Είχε πάνω του μια στρώση σκόνης, και το πλήκτρο ENTER απουσίαζε. Μετά από ένα πολύ καλό καθάρισμα και απολύμανση βρήκα πως το πλήκτρο space ήταν πολύ χαλαρό, 4 πλήκτρα του αριθμητικού πληκτρολογίου δε λειτουργούσαν, και η ροδέλα ρύθμισης του ήχου ήταν εντελώς αναξιόπιστη. Αλλά αποφάσισα να το αναστήσω. Αγόρασα κάποια ανταλλακτικά σε πολύ φτηνή τιμή, το πλήκτρο space ακόμα και με το ανταλλακτικό ήταν χαλαρό, αλλά δεν τόλμησα να αλλάξω τους διακόπτες από φόβο. Με έσωσε ένας φίλος που είχε ένα μικρό που δεν το ήθελε. Επί τη ευκαιρία, έκανα το macro keyboard λίγο ποιο όμορφο Και ιδού το πληκτρολόγιο Φρανκενστάιν:

Τα leds ήταν πανεύκολο να ρυθμισθούν με το OpenRGB ή το RazerGenie, αλλά τα νεκρά πλήκτρα και η ροδέλα ήταν σπαστικά. Ώρα για λίγο Remmaping! Θα μεταφερθεί το αριθμητικό πληκτρολόγιο μια σειρά πάνω και θα απενεργοποιηθεί η ροδέλα.

Remaping πληκτρολογίου

Στο παρελθόν χρησιμοποιούσα το kmonad για αυτό τον σκοπό, αλλά βρήκα το kanata πολύ καλύτερο και συμβατό με το kmonad. Γιατί δεν έγραψα για αυτά; Γιατί μπορείς να κάνεις τόσα πολλά που για να τα περιγράψω ήθελα σελίδες και είχα και έχω κενά στα ποιο προχωρημένα χαρακτηριστικά τους. Αν αντέχεις δες εδώ μια μη πρακτική δοκιμή που είχα κάνει με το kmonad (μέχρι 6 ενέργειες σε ένα πλήκτρο).

Αλλά πίσω στο kmonad. Πρώτα θα πρέπει να το εγκαταστήσουμε. Μιας και είναι γραμμένο σε Rust ο καλύτερο τρόπος είναι με το cargo-binstall για να έχεις και αυτόματες αναβαθμίσεις με το topgrade. Αλλιώς απλά το κατεβάζεις από εδώ.

Ιντερλούδιο: Permissins & Systemd Custom User Target

Για να ενργοποιώ τα πληκτρολόγια, ο καλύτερος τρόπος είναι να χρησιμοποιείς systemd unit services. Και για να τα ομαδοποιώ έχω φτιάξει ένα custom user target.

function install_user() {
    cat <<EOF >"${HOME}/.config/systemd/user/macro-keyboards.target"
[Unit]
Description=All Macro Keyboards
Documentation=http://berry.local/code/crusty-desktop/crusty-keyboard

[Install]
WantedBy=default.target
EOF

    systemctl --user daemon-reload
    systemctl --user enable --now macro-keyboards.target
    systemctl --user --no-pager status macro-keyboards.target
}

install_user

Αυτό είναι προαιρετικό, τα παρακάτω όμως δεν είναι

sudo groupadd uinput
sudo usermod -aG uinput "$USER"
sudo usermod -aG input "$USER"

και θα πρέπει να βγεις και να μπεις να πάρει τις αλλαγές.

Αρχίζοντας το Remmaping

Θα φτιάξουμε ένα αρχείο με όνομα black-window.elite με τα παρακάτω:

(defcfg
  linux-dev (
    /dev/input/by-id/usb-Razer_Razer_BlackWidow_Elite-if01-event-kbd
    /dev/input/by-id/usb-Razer_Razer_BlackWidow_Elite-if02-event-mouse
  )
  log-layer-changes no
  allow-hardware-repeat false
  process-unmapped-keys yes
)

To βασικό είναι να βρεις το σταθερό μονοπάτι της συσκευής με την βοήθεια των udevadm info /dev/input/eventXX και evtest. Διαβάστε εδώ για περισσότερα. Αλλά μισό τι βλέπω δυο συσκευές; Ο λόγος είναι πως η ροδέλα είναι στο mouse, οπότε κάνουμε remmaping και το mouse.

Στη συνέχεια ορίζουμε τα πλήκτρα του πληκτρολογίου που θέλουμε να αλλάξουμε

;; https://github.com/jtroo/kanata/blob/main/parser/src/keys/mod.rs
;; (defsrc
;;   esc  f1   f2   f3   f4   f5   f6   f7   f8   f9   f10  f11  f12        ssrq slck pause prev prev pp         volu
;;   grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc  ins  home pgup  nlck kp/  kp*  kp-   mute
;;   tab  q    w    e    r    t    y    u    i    o    p    [    ]    ret   del  end  pgdn  kp7  kp8  kp9  kp+   vold
;;   caps a    s    d    f    g    h    j    k    l    ;    '    \                          kp4  kp5  kp6
;;   lsft z    x    c    v    b    n    m    ,    .    /    rsft            up              kp1  kp2  kp3  kprt
;;   lctl lmet lalt           spc                 ralt rmet cmp  rctl       left down rght  kp0  kp.
;; )

(defsrc        
  nlck kp/  kp*
  kp7  kp8  kp9
  kp4  kp5  kp6
  kp1  kp2  kp3
  kp0  kp.
  kp+  kp-  kprt
  prev pp   next
  volu mute vold
)

Εδώ μια σημαντική παρατήρηση. Στο defsrc βάζουμε τα πλήκτρα που θέλουμε να αλλάξουμε μόνο ή όλα με τον τρόπο που δείχνω στα σχόλια. Μιας και με ενδιαφέρει μόνο το αριθμητικό κομμάτι βάζω μόνο αυτό. Η διάταξη δεν έχει καμία σημασία αρκεί να είμαστε συνεπείς.

Στη συνέχεια ορίζω το πρώτο και (μοναδικό στη συγκεκριμένη περίπτωση) layer:

(deflayer base
  7    8    9
  4    5    6
  1    2    3
  XX   XX   0
  XX   XX
  kp+  kp-  kprt
  vold next volu
  XX   pp   XX
)

Ιντερλούδιο knomad και ελάχιστα προχωρημένο kanata

Αν είχα το kmonad η μόνη αλλαγή είναι στην αρχή. Αλλά με το kanata θα μπορούσα να το κάνω και ως εξής

;; defsrc is still necessary
(defsrc)
(deflayermap (base)
  nlck 7
)

Το παραπάνω βάζει στο numlock το “7”. Επέλεξα το “7” αντί για το “kp7” μιας και δεν έχω numlock (δες στη φωτογραφία γιατί). Η σύνταξη αυτή είναι ο λόγος που προτιμώ το kanata, αλλά εδώ δείχνω ένα τρόπο συμβατό και με τα δύο προγράμματα. Επίσης, στο knomad δεν μπορεί να χειριστεί δυο συσκευές ταυτόχρονο, απο όσο γνωρίζω τουλάχιστον.

Στα παραπάνω κάλυψα μόνο τα εντελώς βασικά. Ο ουρανός είναι το όριο, αλλά μπορείς έστω και με αυτά να κάνεις πράγματα όπως πχ να αλλάξεις τη θέση στο CAPS. Αλλά για ένα ποιο προχωρημένο παράδειγμα μια απλοποιημένη έκδοση του μικρού 3χ3 πληκτρολογίου

(defcfg
  linux-dev /dev/input/by-id/usb-wch.cn_CH57x-event-kbd
  log-layer-changes yes
  allow-hardware-repeat false
)


(defsrc
    1 2 3    a b c   j k l
    4 5 6    d e f   m n o
    7 8 9    g h i   p q r
)


(deflayermap (base)
    1 ∅
    2 M-up   ;; switch window focus
    3 ∅
    4 M-left  ;; switch window focus
    ;; When press "5" enter launcher mode
    5 (multi (layer-switch arrows) M-/ )
    6 M-right ;; switch window focus
    7 ∅
    8 M-down  ;; switch window focus
    9 ∅
)

;; Used when on launcher mode
(deflayermap (arrows)
    1 (multi (layer-switch base) esc)
    2 up
    3 (macro S-` / )
    4 (macro d d g ␣ )
    5 (multi (layer-switch base) ret)
    6 (macro g o o g l e ␣ )
    7 (macro f i n d ␣ )
    8 down 
    9 (macro r e c e n t ␣ )
)

Ώρα για το systemd unit

Θα φτιάξω ένα αρχείο kanata-black-window.service με τα παρακάτω:

[Unit]
Description=Razer Black Window Elite
PartOf=macro-keyboards.target
After=default.target

[Service]
ExecStart=%h/.cargo/bin/kanata  --cfg %h/.config/crusty/keyboards/black-window.kbd                     

[Install]
WantedBy=macro-keyboards.target

Προσέξτε το WantedBy=macro-keyboards.target, αν δεν είχα κάνει το custom target θα ήταν WantedBy=graphical-session.target. Τέλος μια μικρή συνάρτηση που εγκαθιστά τα πάντα στις σωστές θέσεις, αλλά μπορείτε ποιο απλά να γράψετε τις εντολές στο τερματικό.

#!/usr/bin/env bash
current_dir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
keyboard_files="$(readlink -f "${current_dir}/keyboards")"

function install_kbd() {
    keyboard="$1"
    ctrem "Installing macro keyboard: [green]$keyboard[/]."
    mkdir -p "${HOME}/.config/crusty/keyboards"
    cp "${keyboard_files}/${keyboard}/${keyboard}.kbd" "${HOME}/.config/crusty/keyboards"

    # Systemd user service
    service_name="kanata-${keyboard}.service"
    cp "${keyboard_files}/${keyboard}/${service_name}" "${HOME}/.config/systemd/user/${service_name}"
    systemctl --user daemon-reload
    systemctl --user enable --now "${service_name}"
    systemctl --user status --no-pager "${service_name}"
}

install_kbd "black-window"

image

Και αυτό ήταν, ένα άχρηστο πεταμένο και ακριβό πληκρολόγιο, που προσωπικά δεν θα αγόραζα ποτέ απέκτησε νέα ζωή, και μου αρέσει. Εντάξει είναι λιγάκι Φραγκενσταίν :slight_smile:

Αλλά δεν είναι αυτό το θέμα, ελπίζω να πήρατε ιδέες για να φτιάξετε το δικό σας macro keyboard.

8 «Μου αρέσει»

Για το Volume dial, λίγο σπρέι επαφών θα διορθώσει το πρόβλημα, ρίξε και μια ματιά εδώ, είναι αντίστοιχο πρόβλημα όπως με τα mouse wheels:

Ποιους διακόπτες έχει?

3 «Μου αρέσει»

Πράσινο χρώμα έχουν. Ευχαριστώ για το σπρέι, τα συμπτώματα ακριβώς ίδια, αλλά για αγορά πάει πολύ, αλλά ίσως έχει ο μάστορας στη γειτονιά.

2 «Μου αρέσει»

Ως λάτρης της παλιατζούρας,
απλά υποκλίνομαι στον σωστό
ελευθερολογισμιακό κατσαβιδά!

4 «Μου αρέσει»