Punto Switcher baru untuk linux: xswitcher

Penghentian dukungan xneur membuat saya menderita selama enam bulan terakhir (dengan munculnya OpenSUSE 15.1 di desktop saya: ketika xneur dinyalakan, jendela kehilangan fokus dan berkedip-kedip mengasyikkan dengan ketukan input keyboard) .

"Ah, sial, aku mulai mengetik lagi di tata letak yang salah" - sering kali pekerjaan cabul. Dan tidak menambah positif.


Pada saat yang sama, saya (sebagai insinyur desain) dapat mengartikulasikan dengan jelas apa yang saya inginkan. Dan saya ingin (pertama dari Punto Switcher, dan kemudian, berkat Windows Vista, akhirnya penanaman kembali di Linux, dari xneur) persis satu. Menyadari bahwa sampah di layar berada dalam tata letak yang salah (ini biasanya terjadi pada akhir mengetik kata baru), injak "Pause / Break". Dan dapatkan apa yang saya cetak.

Saat ini, produk memiliki rasio fungsionalitas / kompleksitas yang optimal (dari sudut pandang saya). Saatnya berbagi.

TL.DR


Segala macam detail teknis akan berlanjut, jadi pertama - tautan "sentuh" untuk yang tidak sabar.

Perilaku berikut saat ini hardcode:

  • "Jeda / Istirahat": mundur kata terakhir, mengganti tata letak di jendela aktif (antara 0 dan 1) dan mengetik lagi.
  • Ctrl Kiri Tanpa Apa-apa: Mengubah tata letak di jendela aktif (antara 0 dan 1).
  • “Shift Kiri tanpa apa pun”: mengaktifkan tata letak 0 di jendela aktif.
  • “Right Shift without Nothing”: mengaktifkan tata letak No. 1 di jendela aktif.

Mulai sekarang, saya berencana untuk menyesuaikan perilaku. Tanpa umpan balik, itu tidak menarik (toh saya senang dengan itu). Saya percaya bahwa di Habré akan ada persentase yang cukup dari penonton dengan masalah yang sama.

NB Sejak dalam versi saat ini, keylogger disekrup ke "/ dev / input /", xswitcher harus dijalankan dengan hak root:

chown root:root xswitcher
chmod +xs xswitcher

Harap dicatat: pemilik file dengan suid harus root, sebagai siapa pemiliknya adalah suid dan akan mengaktifkan startup.

Paranoid (saya tidak terkecuali) dapat mengkloning dari GIT dan berkumpul di tempat. Seperti itu:

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

Autostart menambah selera (tergantung DE).

Ini berfungsi, "jangan minta bubur" (≈30 detik CPU per hari, ≈12 MB dalam RSS).

Detail


Sekarang untuk detailnya.

Seluruh repositori awalnya didedikasikan untuk proyek peliharaan saya, dan memulai yang lain terlalu malas. Jadi, semuanya ditumpuk (hanya dalam folder) dan ditutup dengan AGPL ("paten sebaliknya").

Kode xswitcher ditulis dalam golang, dengan sedikit percikan C. Diasumsikan bahwa pendekatan ini akan memberikan upaya yang paling sedikit (sejauh ini). Sambil mempertahankan kemampuan untuk menghubungkan yang hilang melalui cgo.

Teks komentar diletakkan, dari mana dipinjam dan mengapa. Karena kode xneur "tidak menginspirasi saya", loloswitcher mengambil sebagai titik awal .

Menggunakan "/ dev / input /" memiliki kelebihan (semuanya bisa dilihat, termasuk tombol yang ditekan dengan auto-repeat), dan minusnya. Kontra adalah:

  • Ulangi otomatis (peristiwa dengan kode "2") tidak berkorelasi dengan pengulangan dengan X.
  • Anda tidak dapat melihat input melalui antarmuka X11 (misalnya, VNC berfungsi).
  • Perlu root.

Atau, Anda dapat berlangganan acara X melalui "XSelectExtensionEvent ()". Anda dapat mengintip kode xinput . Untuk pergi, saya tidak menemukan yang seperti itu, dan rancangan implementasi memberi seratus baris kode-C dalam perjalanan. Sejauh ini sisihkan.

Kesimpulan "kembali" sejauh ini telah dibuat dengan mengacaukan keyboard virtual. Terima kasih kepada penulis keybd_event, tetapi ada abstraksi tingkat terlalu tinggi dan harus diperbaiki lebih lanjut. Sebagai contoh, saya memiliki Win-key yang tepat, baris ke-3 memilih. Dan hanya Win kiri yang disiarkan kembali.

Bug yang dikenal


  • Kami tidak tahu apa-apa tentang input "komposit" (contoh: ½). Itu tidak dibutuhkan saat ini.
  • Kami salah mereproduksi Win yang tepat. Dalam kasus saya, itu melanggar pengaturan aksen.
  • Tidak ada penguraian input yang jelas. Sebagai gantinya, ada beberapa fungsi: Bandingkan (), CtrlSequence (), RepeatSequence (), SpaceSequence (). terima kasihnsmcanuntuk perhatian: diperbaiki dalam kode di sini. Dengan probabilitas tertentu, Anda dapat menangkap bug saat mengganti.
    Di tempat ini saya tidak tahu "bagaimana" dan saya akan senang dengan saran.
  • (Oh, horor) penggunaan kompetitif saluran (keyboardEvents, miceEvents).

Kesimpulan


Kode adalah prosedur paling sederhana. Dan bodoh seperti saya. Jadi, saya menghibur diri dengan harapan bahwa hampir semua teknisi dapat menyelesaikan apa yang diinginkannya. Dan produk ini karena ini tidak akan hilang tanpa dukungan seperti kebanyakan hanya untuk bersenang-senang.

Semoga berhasil

All Articles