Analog baru Punto Switcher untuk linux: xswitcher

Berakhirnya dukungan xneur telah menyebabkan saya menderita selama enam bulan terakhir. (dengan munculnya OpenSUSE 15.1 di desktop saya: dengan xneur diaktifkan, windows kehilangan fokus dan berkedip lucu seiring dengan input keyboard).

“Oh, sial, saya mulai mengetik dengan tata letak yang salah lagi” - dalam pekerjaan saya hal ini sering terjadi tidak senonoh. Dan itu tidak menambahkan sesuatu yang positif.

Analog baru Punto Switcher untuk linux: xswitcher
Pada saat yang sama, saya (sebagai seorang insinyur desain) dapat dengan jelas merumuskan apa yang saya inginkan. Tapi saya ingin (pertama dari Punto Switcher, dan kemudian, berkat Windows Vista, akhirnya beralih ke Linux, dari xneur) satu hal. Menyadari bahwa sampah di layar berada dalam tata letak yang salah (ini biasanya terjadi di akhir pengetikan kata baru), injak “Jeda/Istirahat”. Dan dapatkan apa yang Anda cetak.

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

TL.DR

Nanti akan ada berbagai macam detail teknis, jadi pertama - tautan "menyentuh" bagi yang tidak sabar.

Saat ini perilaku berikut di-hardcode:

  • “Pause/Break”: spasi mundur pada kata terakhir, mengganti tata letak jendela aktif (antara 0 dan 1) dan memutar lagi.
  • “Ctrl Kiri tanpa apa pun”: mengganti tata letak di jendela aktif (antara 0 dan 1).
  • “Pergeseran Kiri tanpa apa pun”: mengaktifkan tata letak No. 0 di jendela aktif.
  • “Pergeseran Kanan tanpa apa pun”: mengaktifkan tata letak No. 1 di jendela aktif.

Mulai sekarang saya berencana untuk menyesuaikan perilakunya. Tanpa umpan balik, ini tidak menarik (saya baik-baik saja). Saya yakin di Habré akan ada cukup banyak penonton yang mengalami masalah serupa.

NB Karena di versi saat ini, keylogger terpasang ke "/dev/input/", xswitcher harus diluncurkan dengan hak root:

chown root:root xswitcher
chmod +xs xswitcher

Harap dicatat: Pemilik file dengan suid harus root, karena siapa pun pemiliknya akan diubah menjadi suid saat startup.

Paranoid (tidak terkecuali saya) dapat mengkloning GIT dan berkumpul di lokasi. 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

Tambahkan autostart sesuai selera (tergantung DE).

Berhasil, “tidak minta bubur” (≈30 detik CPU per hari, ≈12 MB di RSS).

Detail

Sekarang - detailnya.

Seluruh repositori awalnya didedikasikan untuk proyek kesayangan saya, dan saya terlalu malas untuk memulai yang lain. Jadi, semuanya bertumpuk (hanya di folder) dan dilindungi oleh AGPL (“paten terbalik”).

Kode xswitcher ditulis dalam golang, dengan sedikit penyertaan C. Diasumsikan bahwa pendekatan ini akan menghasilkan usaha yang paling sedikit (sejauh ini). Sambil mempertahankan kemampuan menghubungkan apa yang hilang menggunakan cgo.

Teks tersebut berisi komentar tentang dari mana ia dipinjam dan mengapa. Karena kode xneur “tidak menginspirasi saya”, saya menganggapnya sebagai titik awal loloswitcher.

Menggunakan "/dev/input/" memiliki kelebihan (semuanya terlihat, termasuk tombol pengulangan otomatis yang ditekan) dan kekurangannya. Kerugiannya adalah:

  • Pengulangan otomatis (kejadian dengan kode “2”) tidak berkorelasi dengan pengulangan dengan x.
  • Input melalui antarmuka X11 tidak terlihat (inilah cara kerja VNC, misalnya).
  • Butuh akar.

Di sisi lain, dimungkinkan untuk berlangganan acara X melalui "XSelectExtensionEvent()". Anda bisa mengintip kode masukan. Saya tidak menemukan hal seperti ini untuk dijalankan, dan implementasi kasarnya segera membutuhkan seratus baris kode C. Sisihkan untuk saat ini.

Output “terbalik” saat ini dilakukan dengan memasang keyboard virtual. Terima kasih kepada penulis keybd_event, tetapi abstraksi di sana terlalu tinggi dan harus dikerjakan ulang lebih lanjut. Misalnya, saya menggunakan tombol Win kanan untuk memilih baris ke-3. Dan hanya kemenangan kiri yang dikirimkan kembali.

Bug yang Diketahui

  • Kami tidak tahu apa-apa tentang masukan “komposit” (contoh: ½). Itu tidak diperlukan saat ini.
  • Kami memainkan Kemenangan yang benar secara salah. Dalam kasus saya, ini merusak penekanannya.
  • Tidak ada penguraian input yang jelas. Sebaliknya, ada beberapa fungsi: Bandingkan(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Terima kasih nsmcan untuk perhatian Anda: perbaiki dalam kode dan di sini. Dengan kemungkinan tertentu, Anda dapat menemukan bug saat mengganti.
    Saat ini saya tidak tahu "bagaimana caranya" dan akan menerima saran apa pun.
  • (Ya Tuhan) penggunaan saluran yang kompetitif (keyboardEvents, mouseEvents).

Kesimpulan

Kode ini adalah prosedur paling sederhana. Dan bodoh sepertiku. Jadi, saya menyanjung diri sendiri dengan harapan hampir semua teknisi bisa menyelesaikan apa yang diinginkannya. Dan berkat ini, produk ini tidak akan binasa tanpa dukungan, seperti kebanyakan produk hanya untuk bersenang-senang.

Good luck!

Sumber: www.habr.com

Tambah komentar