Key remapping για συγκεκριμένη συσκευή

Καλησπέρα σε όλους!

Έχω ένα πληκτρολόγιο στο οποίο θέλω να κάνω remap το alt σε super key. Το έκανα σχετικά εύκολα με την παρακάτω εντολή.

setxkbmap -option altwin:swap_alt_win

Όμως;, όπως είναι λογικό αυτό κάνει remap το συγκεκριμένο κουμπί για όλα τα πιθανά πληκτρολόγια που πρόκειται να συνδεθούν στον υπολογιστή.

Δοκίμασα για να κάνω την ρύθμιση device specific με τα παρακάτω:

  1. όπου device 9 είναι το πληκτρολόγιο που θέλω την αλλαγή. και πάλι όμως έπαιζε “universal” η αλλαγή
setxkbmap -device 9 -option altwin:swap_alt_win
  1. Έφτιαξα ένα αρχείο /etc/X11/xorg.conf.d/00-keyboard.conf και μέσα έβαλα τα εξής:
Section "InputClass"
    Identifier "system-keyboard"
    MatchIsKeyboard "1"
    MatchVendor "VENDOR_NAME"
    MatchUSBID "USB_ID"
    Option "XkbOptions" "altwin:swap_alt_win"
EndSection

Στο παραπάνω δοκίμασα μόνο με το 1 directive περι vendror, μόνο με το usb κλπ (γενικά έπαιξα με πιθανούς συνδυασμούς.) Και πάλι η αλλαγή εφαρμόζεται για όλες τις συσκευές…

Το σύστημά μου είναι Arch Linux :arch: και το περιβάλλον μου είναι i3.

Any ideas?

Με μια γρήγορη αναζήτηση πέφτω εδώ :

Τις δοκίμασες αυτές τις λύσεις (κυρίως την 2η)?

Ως 2η εννοούμε αυτή του udev?

Ναι αυτήν να φτιάξεις έναν κανόνα για το hardware.
https://wiki.archlinux.org/title/Map_scancodes_to_keycodes

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

H δουλεία δε θα γίνει σήμερα με το X11, θα γίνει σε ένα χαμηλότερο επίπεδο. Υπάρχουν δυο λύσεις

  • Μέσω κανόνων στο udev (ζόρικο)
  • Με κάτι που σε χαμηλό επίπεδο παίρνει το πληκτρολόγιο και φτιάχνει ένα εικονικό πληκτρολόγιο (με τη βοήθεια του uinput αν κάποιος θέλει να το ψάξει). Κάποιο πρόγραμμα κλέβει το πραγματικό πληκτρολόγιο (συνήθως μπορείς να επιλέξεις ποιο), και στέλνει ότι θέλει στο εικονικό. Και μπορείς να κάνεις πραγματικά τα πάντα.

Συνετιστώ τη δεύτερη λύση. Υπάρχουν πολλές λύσεις (έχω και στο σκληρό μια δική μου ανολοκλήρωτη). Μια καλή ανάγνωση είναι:

Υπάρχουν πολλά προγράμματά που παίζουν με αυτή τη λογική. Τα παρακάτω επιπλέον projects είναι από τα πιο αξιόλογα, τα έχω δοκιμάσει, και κατά σειρά προτίμησης:

(Τουλάχιστον μέχρι να γκρεμιστεί κανένας φούρνος περάσουν 3 πανδημίες και βγάλω το δικό μου λολ)

Συνετιστώ το πρώτο είναι από τον ίδιο που έχει γράψει το αγαπημένο μου τερματικό, αλλά θα πρέπει να το κάνεις compile. Είναι γραμμένο σε Rust.

ΥΓ1: Επειδή θα είναι σαν να συνδέεις ένα πληκτρολόγιο, θα τρέξει παντού (Χ11, Wayland), αλλά δεν υπάρχει το context για ποιο παράθυρο παίρνει την είσοδο.

ΥΓ2: Δείτε και ότι έχω γράψει εδώ για το libinput

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

Δοκίμασα να φτιάξω udev .hwdb file.
Το οποίο το έκανα κάπως έτσι:

evdev:input:b0003v24f0p0141*
     KEYBOARD_KEY_700e2=leftmeta
     KEYBOARD_KEY_700e3=leftalt

έκανα μετά update την βάση και udevadm trigger αλλά δεν είδα φως…

@Asfodelus Πολύ χρήσιμες πληροφορίες! Θα τις ρίξω μια ματιά και θα δω με τι θα βγάλω άκρη. Όσο για την τρίτη πανδημία δεν ξέρω πόσο μακριά είμαστε, οπότε μην λες πολλά πολλά! :joy:

Μετά από πολυυυυ ψάξιμο, κατέληξα στο εξής:

Ο κανόνας δεν δούλευε διότι στο δεύτερο part που ορίζεται η δεκαεξαδική τετράδα που είναι ο vendor, ήθελε κεφαλαίο “F” και όχι μικρό… (σε όλα που έχω δει (ακόμα και στο ArchWiki) το έχουν με μικρό…)

Ο κανόνας δούλεψε. Κάνει match την συσκευή καθώς η εντολή

udevadm info /device/path | grep KEYBOARD_KEY

δίνει τις αλλαγές που έχω ορίσει

E: KEYBOARD_KEY_700e2=leftmeta
E: KEYBOARD_KEY_700e3=leftalt

Άλλες 2 φορές έχω ασχοληθεί με το udev. Τη μία πήγε καλά και παίζει ακόμα η λύση. Την άλλη μετά από πολύ προσπάθεια δεν έβγαλα άκρη και το παράτησα…

Τώρα πέραν του προβλήματος που ήθελα να λύσω. Γιατί είναι τόσο περίεργο το udev??? Όταν ένας άνθρωπος που δουλεύει σαν sysadmin ζορίζεται να βγάλει άκρη, ποιος υποτίθεται ότι είναι να το διαχειριστεί και να το αντιμετωπίσει;;; (απλά από απορία ρωτάω!)

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

Αυτό το νήμα έκλεισε αυτόματα 2 ημέρες μετά την τελευταία απάντηση. Δεν επιτρέπονται πλέον νέες απαντήσεις.