Tương tự mới của Punto Switcher cho linux: xswitcher

Việc ngừng hỗ trợ xneur đã khiến tôi gặp nhiều khó khăn trong sáu tháng qua. (với sự ra đời của OpenSUSE 15.1 trên máy tính để bàn của tôi: khi bật xneur, các cửa sổ sẽ mất tiêu điểm và nhấp nháy buồn cười khi nhập bằng bàn phím).

“Ồ, chết tiệt, tôi lại bắt đầu gõ sai bố cục” - trong công việc của tôi, điều này thường xuyên xảy ra một cách không đứng đắn. Và nó không thêm bất cứ điều gì tích cực.

Tương tự mới của Punto Switcher cho linux: xswitcher
Đồng thời, tôi (với tư cách là một kỹ sư thiết kế) có thể hình thành khá rõ ràng những gì tôi muốn. Nhưng tôi muốn (đầu tiên là từ Punto Switcher, và sau đó, nhờ Windows Vista, cuối cùng chuyển sang Linux, từ xneur) chính xác một điều. Nhận ra rằng rác trên màn hình nằm sai bố cục (điều này thường xảy ra khi kết thúc gõ một từ mới), hãy nhấn nút “Tạm dừng/Nghỉ”. Và nhận được những gì bạn đã in.

Hiện tại, sản phẩm có tỷ lệ chức năng/độ phức tạp tối ưu (theo quan điểm của tôi). Đã đến lúc chia sẻ.

TL.DR

Sẽ có tất cả các loại chi tiết kỹ thuật sau, vì vậy trước tiên - liên kết "chạm" dành cho người thiếu kiên nhẫn.

Hiện nay hành vi sau đây được mã hóa cứng:

  • “Tạm dừng/Ngắt”: lùi lại từ cuối cùng, chuyển bố cục trong cửa sổ đang hoạt động (trong khoảng từ 0 đến 1) và quay số lại.
  • “Ctrl trái không có gì”: chuyển đổi bố cục trong cửa sổ đang hoạt động (từ 0 đến 1).
  • “Shift trái không có gì”: bật bố cục số 0 trong cửa sổ đang hoạt động.
  • “Shift phải không có gì”: bật bố cục số 1 trong cửa sổ đang hoạt động.

Từ giờ trở đi tôi dự định sẽ tùy chỉnh hành vi. Không có phản hồi thì sẽ không thú vị (dù sao thì tôi cũng thấy ổn). Tôi tin rằng trên Habré sẽ có đủ tỷ lệ khán giả gặp vấn đề tương tự.

NB Bởi vì trong phiên bản hiện tại, keylogger được gắn vào "/dev/input/", xswitcher phải được khởi chạy với quyền root:

chown root:root xswitcher
chmod +xs xswitcher

Xin lưu ý: Chủ sở hữu của file có suid phải là root, vì bất cứ ai là chủ sở hữu sẽ bị biến thành sus khi khởi động.

Những kẻ hoang tưởng (tôi cũng không ngoại lệ) có thể nhân bản từ GIT và lắp ráp tại chỗ. Như thế:

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

Thêm tính năng tự khởi động theo sở thích (tùy thuộc vào DE).

Nó hoạt động, "không yêu cầu cháo" (CPU ≈30 giây mỗi ngày, ≈12 MB trong RSS).

chi tiết

Bây giờ - các chi tiết.

Toàn bộ kho lưu trữ ban đầu được dành riêng cho dự án yêu thích của tôi và tôi quá lười để bắt đầu một dự án khác. Vì vậy, mọi thứ đều được xếp chồng lên nhau (chỉ trong các thư mục) và được AGPL (“bằng sáng chế ngược”) bảo vệ.

Mã xswitcher được viết bằng golang, với sự bao gồm tối thiểu của C. Người ta cho rằng phương pháp này sẽ tốn ít công sức nhất (cho đến nay nó đã có). Trong khi vẫn duy trì khả năng kết nối những gì còn thiếu bằng cgo.

Văn bản có chứa các nhận xét về việc nó được mượn từ đâu và tại sao. Bởi vì mã xneur “không truyền cảm hứng cho tôi”, tôi lấy nó làm điểm khởi đầu loloswitcher.

Việc sử dụng "/dev/input/" có cả ưu điểm (mọi thứ đều hiển thị, bao gồm cả phím tự động lặp lại được nhấn) và nhược điểm. Những nhược điểm là:

  • Tự động lặp lại (các sự kiện có mã “2”) không tương quan với việc lặp lại với x.
  • Đầu vào thông qua giao diện X11 không hiển thị (ví dụ: đây là cách VNC hoạt động).
  • Cần nguồn gốc.

Mặt khác, có thể đăng ký các sự kiện X thông qua "XSelectExtensionEvent()". Bạn có thể nhìn trộm mã xin nhập. Tôi không tìm thấy bất cứ thứ gì như thế này ngay lập tức và việc triển khai sơ bộ ngay lập tức tiêu tốn hàng trăm dòng mã C. Bây giờ hãy đặt nó sang một bên.

Đầu ra “đảo ngược” hiện được thực hiện thông qua việc vặn bàn phím ảo. Cảm ơn tác giả của keybd_event, nhưng tính trừu tượng ở đó quá cao và sẽ phải làm lại thêm. Ví dụ mình dùng phím Win bên phải để chọn hàng thứ 3. Và chỉ còn Win bên trái là được truyền ngược lại.

Lỗi đã biết

  • Chúng tôi không biết gì về đầu vào “tổng hợp” (ví dụ: ½). Nó không cần thiết ngay bây giờ.
  • Chúng ta đang chơi đúng Win không đúng. Trong trường hợp của tôi, nó phá vỡ sự nhấn mạnh.
  • Không có phân tích đầu vào rõ ràng. Thay vào đó, có một số hàm: Compare(), CtrlSequence(), RepeatSequence(), SpaceSequence(). Cảm ơn nsmcan để bạn chăm sóc: đã sửa nó trong mã và ở đây. Với một khả năng nhất định, bạn có thể gặp lỗi khi thay thế.
    Tại thời điểm này, tôi không biết “làm thế nào” và sẽ hoan nghênh mọi đề xuất.
  • (Ôi Chúa ơi) sử dụng cạnh tranh các kênh (keyboardEvents, mouseEvents).

Kết luận

Mã này là thủ tục đơn giản nhất. Và ngu ngốc như tôi. Vì vậy, tôi tự tâng bốc mình với hy vọng hầu như bất kỳ kỹ thuật viên nào cũng có thể hoàn thành được điều mình mong muốn. Và nhờ điều này, sản phẩm này sẽ không bị lụi tàn nếu không có sự hỗ trợ, giống như hầu hết các sản phẩm chỉ để giải trí.

Chúc may mắn!

Nguồn: www.habr.com

Thêm một lời nhận xét