Νέο ανάλογο του Punto Switcher για linux: xswitcher

Το τέλος της υποστήριξης του xneur μου έχει προκαλέσει κάποια ταλαιπωρία τους τελευταίους έξι μήνες. (με την εμφάνιση του OpenSUSE 15.1 στους επιτραπέζιους υπολογιστές μου: με ενεργοποιημένο το xneur, τα παράθυρα χάνουν την εστίαση και τρεμοπαίζουν αστεία στο χρόνο με την είσοδο πληκτρολογίου).

"Ω, διάολε, άρχισα να πληκτρολογώ ξανά με λάθος διάταξη" - στη δουλειά μου αυτό συμβαίνει απρεπώς συχνά. Και δεν προσθέτει τίποτα θετικό.

Νέο ανάλογο του Punto Switcher για linux: xswitcher
Ταυτόχρονα, εγώ (ως σχεδιαστής μηχανικός) μπορώ να διατυπώσω ξεκάθαρα αυτό που θέλω. Ήθελα όμως (πρώτα από το Punto Switcher και μετά, χάρη στα Windows Vista, τελικά να μεταβώ στο Linux, από το xneur) ακριβώς ένα πράγμα. Έχοντας συνειδητοποιήσει ότι τα σκουπίδια στην οθόνη είναι σε λάθος διάταξη (αυτό συμβαίνει συνήθως στο τέλος της πληκτρολόγησης μιας νέας λέξης), βάλτε "Παύση/Διάλειμμα". Και πάρτε αυτό που εκτυπώσατε.

Αυτή τη στιγμή, το προϊόν έχει τη βέλτιστη (από την άποψή μου) αναλογία λειτουργικότητας/πολυπλοκότητας. Ήρθε η ώρα να μοιραστείτε.

TL.DR

Περαιτέρω θα υπάρχουν όλα τα είδη των τεχνικών λεπτομερειών, οπότε πρώτα - σύνδεσμος "to touch" για τους ανυπόμονους.

Επί του παρόντος, η ακόλουθη συμπεριφορά είναι κωδικοποιημένη:

  • "Pause/Break": επαναφέρει την τελευταία λέξη, αλλάζει τη διάταξη στο ενεργό παράθυρο (μεταξύ 0 και 1) και καλεί ξανά.
  • "Αριστερό Ctrl χωρίς τίποτα": αλλάζει τη διάταξη στο ενεργό παράθυρο (μεταξύ 0 και 1).
  • "Left Shift χωρίς τίποτα": ενεργοποιεί τη διάταξη Νο. 0 στο ενεργό παράθυρο.
  • "Δεξιά Shift χωρίς τίποτα": ενεργοποιεί τη διάταξη Νο. 1 στο ενεργό παράθυρο.

Από εδώ και πέρα ​​σκοπεύω να προσαρμόσω τη συμπεριφορά. Χωρίς σχόλια, δεν είναι ενδιαφέρον (είμαι καλά με αυτό ούτως ή άλλως). Πιστεύω ότι στο Habré θα υπάρχει ένα ικανό ποσοστό κοινού με παρόμοια προβλήματα.

Σημείωση Επειδή στην τρέχουσα έκδοση, το keylogger είναι συνδεδεμένο στο "/dev/input/", το xswitcher πρέπει να εκκινηθεί με δικαιώματα root:

chown root:root xswitcher
chmod +xs xswitcher

Παρακαλώ σημειώστε: Ο κάτοχος του αρχείου με suid πρέπει να είναι root, γιατί όποιος και αν είναι ο ιδιοκτήτης θα μετατραπεί σε suid κατά την εκκίνηση.

Οι παρανοϊκοί (δεν είμαι εξαίρεση) μπορούν να κλωνοποιηθούν από GIT και συναρμολογήστε επί τόπου. Σαν αυτό:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

Προσθέστε την αυτόματη εκκίνηση στη γεύση (ανάλογα με το DE).

Λειτουργεί, "δεν ζητάει χυλό" (≈30 δευτερόλεπτα CPU την ημέρα, ≈12 MB σε RSS).

Λεπτομέρειες

Τώρα - οι λεπτομέρειες.

Ολόκληρο το αποθετήριο ήταν αρχικά αφιερωμένο στο έργο μου για κατοικίδια και είμαι πολύ τεμπέλης για να ξεκινήσω ένα άλλο. Έτσι, όλα είναι συσσωρευμένα (μόνο σε φακέλους) και καλύπτονται από AGPL ("αντίστροφη ευρεσιτεχνία").

Ο κώδικας xswitcher είναι γραμμένος σε golang, με ελάχιστες συμπεριλήψεις C. Θεωρείται ότι αυτή η προσέγγιση θα έχει ως αποτέλεσμα τη μικρότερη προσπάθεια (μέχρι στιγμής). Διατηρώντας παράλληλα τη δυνατότητα σύνδεσης ό,τι λείπει χρησιμοποιώντας το cgo.

Το κείμενο περιέχει σχόλια για το από πού δανείστηκε και γιατί. Επειδή ο κωδικός xneur «δεν με ενέπνευσε», τον πήρα ως σημείο εκκίνησης loloswitcher.

Η χρήση του "/dev/input/" έχει τόσο πλεονεκτήματα (όλα είναι ορατά, συμπεριλαμβανομένου του πατημένου πλήκτρου αυτόματης επανάληψης) όσο και μειονεκτήματα. Τα μειονεκτήματα είναι:

  • Η αυτόματη επανάληψη (γεγονότα με κωδικό "2") δεν συσχετίζεται με την επανάληψη με x.
  • Η είσοδος μέσω των διασυνδέσεων X11 δεν είναι ορατή (έτσι λειτουργεί, για παράδειγμα, το VNC).
  • Χρειάζεται root.

Από την άλλη πλευρά, είναι δυνατή η εγγραφή σε X συμβάντα μέσω του "XSelectExtensionEvent()". Μπορείτε να κοιτάξετε κωδικός xinput. Δεν βρήκα κάτι παρόμοιο και η πρόχειρη εφαρμογή πήρε αμέσως εκατό γραμμές κώδικα C. Αφήστε το στην άκρη προς το παρόν.

Η έξοδος "αντίστροφη" γίνεται αυτή τη στιγμή με το βίδωμα του εικονικού πληκτρολογίου. Ευχαριστώ τον συγγραφέα του keybd_event, αλλά η αφαίρεση εκεί είναι πολύ υψηλού επιπέδου και θα πρέπει να επαναληφθεί περαιτέρω. Για παράδειγμα, χρησιμοποιώ το δεξί πλήκτρο Win για να επιλέξω την 3η σειρά. Και μόνο το αριστερό Win μεταδίδεται πίσω.

Γνωστά σφάλματα

  • Δεν γνωρίζουμε τίποτα για την "σύνθετη" είσοδο (παράδειγμα: ½). Δεν χρειάζεται αυτή τη στιγμή.
  • Παίζουμε λάθος το σωστό Win. Στην περίπτωσή μου, σπάει την έμφαση.
  • Δεν υπάρχει σαφής ανάλυση εισόδου. Αντίθετα, υπάρχουν διάφορες συναρτήσεις: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). σας ευχαριστώ nsmcan για τη φροντίδα σας: το διορθώθηκε στον κώδικα και εδώ. Με μια συγκεκριμένη πιθανότητα, μπορείτε να εντοπίσετε σφάλματα κατά την αντικατάσταση.
    Σε αυτό το σημείο δεν ξέρω «πώς να» και θα χαιρόμουν οποιεσδήποτε προτάσεις.
  • (Ω Θεέ μου) ανταγωνιστική χρήση καναλιών (keyboardEvents, miceEvents).

Συμπέρασμα

Ο κώδικας είναι η απλούστερη διαδικαστική. Και ηλίθιος σαν εμένα. Οπότε, κολακεύω τον εαυτό μου με την ελπίδα ότι σχεδόν οποιοσδήποτε τεχνικός θα μπορέσει να ολοκληρώσει αυτό που θέλει. Και χάρη σε αυτό, αυτό το προϊόν δεν θα χαθεί χωρίς υποστήριξη, όπως τα περισσότερα απλά για διασκέδαση.

Καλή τύχη!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο