Linux için Punto Switcher'ın yeni analogu: xswitcher

Xneur desteğinin sona ermesi, son altı ayda bana biraz acı çektirdi. (Masaüstlerime OpenSUSE 15.1'in gelişiyle: xneur etkinleştirildiğinde, pencereler klavye girişiyle birlikte odağı kaybediyor ve komik bir şekilde titriyor).

"Ah, kahretsin, yine yanlış düzeni yazmaya başladım" - bu işimde uygunsuz bir şekilde sık sık oluyor. Ve olumlu hiçbir şey katmıyor.

Linux için Punto Switcher'ın yeni analogu: xswitcher
Aynı zamanda ben (bir tasarım mühendisi olarak) ne istediğimi oldukça net bir şekilde formüle edebiliyorum. Ama ben tam olarak tek bir şey istedim (önce Punto Switcher'dan, sonra Windows Vista sayesinde, sonunda xneur'dan Linux'a geçiş). Ekrandaki saçmalıkların yanlış düzende olduğunu fark ettiğinizde (bu genellikle yeni bir kelime yazmanın sonunda olur), "Duraklat/Mola"ya basın. Ve yazdırdığınız şeyi alın.

Şu anda ürün (benim açımdan) optimal işlevsellik/karmaşıklık oranına sahip. Paylaşma zamanı.

TL.DR

Daha sonra her türlü teknik ayrıntı olacak, o yüzden öncelikle - "dokunmak" bağlantısı sabırsızlar için.

Şu anda aşağıdaki davranış sabit kodlanmıştır:

  • “Duraklat/Break”: son sözcüğü geri alır, etkin penceredeki düzeni değiştirir (0 ile 1 arasında) ve tekrar çevirir.
  • “Hiçbir şey olmadan Sol Ctrl”: etkin penceredeki düzeni değiştirir (0 ile 1 arasında).
  • “Hiçbir şey olmadan Sola Kaydırma”: etkin pencerede 0 numaralı düzeni açar.
  • “Hiçbir şey olmadan Sağa Kaydırma”: etkin pencerede 1 numaralı düzeni açar.

Şu andan itibaren davranışı özelleştirmeyi planlıyorum. Geri bildirim olmadan, ilginç değil (zaten bunda bir sakınca görmüyorum). Habré'de benzer sorunları yaşayan yeterli bir izleyici kitlesinin olacağına inanıyorum.

NB Çünkü mevcut sürümde, keylogger "/dev/input/" dizinine eklenmiştir, xswitcher'ın kök haklarıyla başlatılması gerekir:

chown root:root xswitcher
chmod +xs xswitcher

Lütfen dikkat: Suid içeren dosyanın sahibi root olmalıdır çünkü sahibi kim olursa olsun, başlangıçta suid haline getirilecek.

Paranoyaklar (ben istisna değilim) klonlayabilir GYTE ve yerinde toplayın. Bunun gibi:

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

Tadına göre otomatik başlatma ekleyin (DE'ye bağlı olarak).

Çalışıyor, "yulaf lapası istemiyor" (günde ≈30 saniye CPU, RSS'de ≈12 MB).

Ayrıntılar

Şimdi - ayrıntılar.

Deponun tamamı başlangıçta benim evcil hayvan projeme ayrılmıştı ve ben başka bir projeye başlayamayacak kadar tembelim. Yani her şey bir araya toplanıyor (sadece klasörler halinde) ve AGPL (“ters patent”) kapsamına giriyor.

Xswitcher kodu golang dilinde yazılmıştır ve minimum miktarda C eklenmiştir. Bu yaklaşımın en az çabayla sonuçlanacağı varsayılmaktadır (şu ana kadar öyle olmuştur). Cgo kullanarak eksik olanı bağlama yeteneğini korurken.

Metinde nereden ve neden ödünç alındığına ilişkin yorumlar yer almaktadır. Çünkü xneur kodu “bana ilham vermedi”, bunu başlangıç ​​noktası olarak aldım loloswitcher.

"/dev/input/" kullanmanın hem avantajları (basılan otomatik tekrarlama tuşu dahil her şey görünür) hem de dezavantajları vardır. Dezavantajları şunlardır:

  • Otomatik tekrar (“2” kodlu olaylar) x ile tekrarlamayla ilişkili değildir.
  • X11 arayüzleri aracılığıyla giriş görünmez (örneğin VNC bu şekilde çalışır).
  • Kök gerekiyor.

Öte yandan "XSelectExtensionEvent()" aracılığıyla X olaylarına abone olmak da mümkündür. Şuna göz atabilirsin xgiriş kodu. Go için buna benzer bir şey bulamadım ve kaba uygulama hemen yüz satır C kodu gerektirdi. Şimdilik bir kenara koyun.

“Ters” çıkış şu anda sanal klavyenin vidalanmasıyla yapılıyor. Keybd_event'in yazarına teşekkürler, ancak oradaki soyutlama çok yüksek düzeyde ve daha fazla yeniden yapılması gerekecek. Mesela 3. satırı seçmek için sağ Win tuşunu kullanıyorum. Ve yalnızca sol Kazan geri iletilir.

Bilinen Hatalar

  • “Bileşik” girdi hakkında hiçbir şey bilmiyoruz (örnek: ½). Şu anda buna ihtiyaç yok.
  • Doğru Win'i yanlış oynuyoruz. Benim durumumda vurguyu bozuyor.
  • Net bir giriş ayrıştırma yok. Bunun yerine çeşitli işlevler vardır: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Teşekkürler Nsmcan dikkatiniz için: kodda ve burada düzeltildi. Belirli bir olasılıkla, değiştirirken hataları yakalayabilirsiniz.
    Bu noktada "nasıl yapılacağını" bilmiyorum ve her türlü öneriyi memnuniyetle karşılarım.
  • (Aman Tanrım) Kanalların rekabetçi kullanımı (keyboardEvents, MouseEvents).

Sonuç

Kod en basit prosedürdür. Ve benim gibi aptal. Bu yüzden hemen hemen her teknisyenin istediğini tamamlayabileceği umuduyla kendimi övüyorum. Ve bu sayede bu ürün, çoğu eğlence amaçlı ürün gibi, destek olmadan yok olmayacak.

İyi şanslar!

Kaynak: habr.com

Yorum ekle