Cách ánh xạ các công cụ sửa đổi (ví dụ CTRL) sang các nút ngón tay cái bằng xbindkeys


13

Câu hỏi này đã được hỏi nhưng không bao giờ được trả lời đúng. Sau khi giải phóng mặt bằng với @ Bây giờ tôi đang hỏi lại. Điều này sẽ cho phép tôi trả lời và có thể sửa đổi câu hỏi dễ dàng hơn rất nhiều. Câu hỏi ban đầu có thể được tìm thấy ở đây:

Ánh xạ các nút Ctrl và Alt sang chuột


Vấn đề:

Mặc dù rất đơn giản để ánh xạ bất kỳ tổ hợp phím nào vào nút chuột bằng cách sử dụng xbindkeyscùng với xdotoolhoặc xtecó vẻ khó khăn hơn nhiều khi ánh xạ một phím bổ trợ (ví dụ ALT , CTRL , SHIFT , v.v.) sang nó.

Giải pháp cuối cùng sẽ cho phép tôi nhấp vào CTRL + (ví dụ: để chọn nhiều mục trong danh sách) chỉ bằng chuột.

Một vài cách tiếp cận khả thi để giải quyết vấn đề này có thể được tìm thấy ở đây tại Stack Exchange cũng như tại các diễn đàn liên quan đến Linux khác. Nhưng không ai trong số họ làm việc như mong đợi vì chúng dẫn đến các vấn đề và tác dụng phụ khác.

Ghi chú:

Một số ví dụ dưới đây liên quan đến cú pháp Guile với Scheme và dựa vào .xbindkeysrc.scmtệp trong khi những ví dụ khác dựa vào .xbindkeysrctệp với cú pháp tương ứng. Tôi biết rằng họ sẽ không làm việc cùng nhau.

Hơn nữa, các đoạn dưới đây chỉ dựa vào xdotoolnhưng tôi sẵn sàng tiếp cận các ứng dụng liên quan đến các ứng dụng khác như vd xte- mặc dù dường như cả hai đều dẫn đến cùng một kết quả và do đó tôi chỉ sử dụng xdotoolcác hành động ở đây.

Cách tiếp cận A:

Cập nhật .xbindkeysrctệp với:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

Đó là những gì tôi đã thử ban đầu nhưng nó có tác dụng phụ là công cụ sửa đổi đang được giữ và không thể được phát hành.

Cách tiếp cận B:

Cập nhật .xbindkeysrc.scmtệp với:

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

Tìm thấy tại http://www.linuxforums.org/forum/hardware-perodesals/169773-solve-map-mouse-button-modifier-key.html và cố gắng giải quyết vấn đề mà trình sửa đổi đang được giữ (như được mô tả tại phương pháp tiếp cận a).

Mặc dù nó khắc phục rằng nó chỉ hoạt động một phần vì không thể thực hiện các lần nhấp chuột khác trong khi nhấn nút ngón tay cái.

Cách tiếp cận C:

Cập nhật .xbindkeysrctệp với:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

Đã thử nghiệm bởi OP của câu hỏi được liên kết ở đây tại Askubfox. Rất đơn giản và vững chắc hơn vì nó không liên quan đến các trạng thái sửa đổi. Tuy nhiên, vấn đề vẫn còn, tức là nhấp chuột CTRL + là không thể.

Có vẻ như xbindkeyschính nó là vấn đề ở đây vì nó nhận ra nhấp chuột nhưng sẽ không thực thi nó. Điều này có thể được kiểm tra bằng cách sử dụng xev | grep buttonxbindkeys -v:

Một lần nhấp chuột bình thường như được ghi bởi xevsẽ trông giống như:

state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES

Cũng như cho nút ngón tay cái:

state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES

Nhưng khi xbindkeyskích hoạt cấu hình trên, nó không ghi lại bất cứ điều gì. Mặc dù nó có ý nghĩa đối với nút ngón tay cái vì nó được ánh xạ tới CTRL và do đó không phải là nút chuột nữa, thật lạ là nút 1 cũng không được ghi lại. Điều này có thể là do xbindkeyskhông thực thi nó nhưng chính nó đang nhận ra nó:

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

Cách tiếp cận D:

Cập nhật .xbindkeysrctệp với:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

"xdotool click 1"
  b:1

Chỉ đơn giản là ... nhưng dẫn đến một vòng lặp vô hạn.


CẬP NHẬT:

Trong thời gian chờ đợi, tôi đã mua Logitech G502 và nhận thấy rằng một khi được định cấu hình qua trình điều khiển trên Windows, không chỉ cấu hình được lưu trên bộ nhớ thiết bị mà cả phím nhấn thực tế được thực hiện bằng chuột. Điều đó thực tế đã giải quyết vấn đề của tôi trên Linux!

Con chuột khác duy nhất tôi nhớ có thể làm điều đó là Razer Copperhead ngày trước. Nhưng tôi đoán có những con chuột khác có sẵn ngày hôm nay có thể làm điều tương tự.


1
đây là một giải pháp sử dụng Easystroke: askubfox.com/a/1010647/27202
atti

Câu trả lời:


8

Tôi đã dành rất nhiều thời gian để cố gắng để làm cho công việc ràng buộc đó. Cuối cùng tôi đã tìm thấy một giải pháp phức tạp nhưng hoạt động tốt và không ngụ ý phần mềm của bên thứ ba. Tôi chia sẻ nó ở đây hy vọng nó sẽ giúp mọi người. Bên cạnh đó, tôi biết điều này không hoàn hảo về mặt bảo mật, vì vậy mọi phản hồi mang tính xây dựng đều được chào đón nhiều hơn.

Có những giải pháp thực sự tốt, giống như giải pháp được đề xuất ở đây , nhưng nó luôn phải chịu sự hạn chế của xbindkey, người đã lấy toàn bộ con chuột, làm cho việc sửa đổi + ánh xạ nhấp chuột không chắc chắn. Cộng với giải pháp dựa trên guile từ liên kết trên, hãy sử dụng ctrl + plus / ctrl + trừ mà Gimp không nhận ra.

Tôi phát hiện ra rằng thứ chúng tôi muốn là một nút chuột hoạt động như một bàn phím, vì vậy tôi đã sử dụng uinput, người có thể truy cập qua python , đã viết một đoạn script theo dõi / dev / my-mouse cho nút bấm và gửi phím ctrl đến bàn phím ảo. Dưới đây là các bước chi tiết:

1. Thực hiện các quy tắc udev

Chúng tôi muốn các thiết bị có thể truy cập (quyền và vị trí).

Đối với chuột:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

Udev sẽ tìm kiếm một thiết bị được nhận dạng bởi kernel có tên như event5 và tôi chọn con chuột của mình với tên đó. Hướng dẫn SYMLINK đảm bảo tôi sẽ tìm thấy chuột của mình trong / dev / my_mx_mouse. Thiết bị sẽ được đọc bởi một thành viên của nhóm "mxgrabber".

Để tìm thông tin về phần cứng của bạn, bạn nên chạy một cái gì đó như

udevadm info -a -n /dev/input/eventX

Đối với uinput:

/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

Không cần symlink, uinput sẽ luôn ở trong $/dev/uinputhoặc $/dev/input/uinputtùy thuộc vào hệ thống bạn đang bật. Chỉ cần cho anh ta nhóm và quyền đọc VÀ viết tất nhiên.

Bạn cần rút phích cắm - cắm chuột và liên kết mới sẽ xuất hiện trong / dev. Bạn có thể buộc udev kích hoạt quy tắc của mình với$udevadm trigger

2. Kích hoạt Mô-đun UINPUT

sudo modprobe uinput

Và để làm cho nó khởi động liên tục:

/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput

3. Tạo nhóm mới

sudo groupadd mxgrabber

Hoặc bất cứ điều gì bạn đã gọi nhóm truy cập của bạn. Sau đó, bạn nên thêm chính mình vào nó:

sudo usermod -aG mxgrabber your_login

4. Tập lệnh Python

Bạn cần cài đặt thư viện python-uinput (rõ ràng) và thư viện python-evdev . Sử dụng pip hoặc gói phân phối của bạn.

Kịch bản khá đơn giản, bạn chỉ cần xác định nút event.code của nút.

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Thưởng thức!

Tất cả những gì bạn cần bây giờ là làm cho tệp python của bạn có thể thực thi được và yêu cầu trình quản lý máy tính để bàn của bạn tải tệp khi khởi động. Có lẽ cũng một ly rượu để chúc mừng công việc tốt!

6. Thêm miễn phí

Tôi sử dụng xbindkeys cho hành vi bổ sung. Chẳng hạn, cấu hình sau có thể tốt nếu bạn có chuột với các lần nhấp bên bánh xe:

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

Để combinaison cuối cùng này hoạt động, bạn phải vô hiệu hóa nút bạn đã cấu hình cho tập lệnh python , nếu không nó sẽ bị xbindkeys lấy. Chỉ phím Ctrl phải duy trì:

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

Tải lại với $ xmodmap ~/.Xmodmap

7. Kết luận

Như tôi đã nói lúc đầu, tôi không hoàn toàn hài lòng với thực tế là tôi phải dành cho bản thân mình những điều thú vị để viết cho / dev / uinput, ngay cả khi nó nghĩ nhóm "mxgrabber". Tôi chắc chắn có một cách an toàn hơn để làm điều đó, nhưng tôi không biết làm thế nào.

Về mặt tươi sáng, nó hoạt động thực sự, thực sự tốt. Bất kỳ tổ hợp bàn phím hoặc phím chuột nào hoạt động với nút Ctrl của bàn phím giờ đều hoạt động với một trong những con chuột !!


Cảm ơn rất nhiều cho những nỗ lực và chia sẻ nó với chúng tôi! +1 ... Mặc dù tôi chưa thử nghiệm nó. BTW Tôi gần như đã từ bỏ việc này - sẽ rất tuyệt nếu nó hoạt động như mong đợi :)
conIGHTtdeluxe

Không có gì ! Đối với tôi, nó hoạt động hoàn hảo. Nếu bạn gặp khó khăn, hãy cho tôi biết. Tôi cố gắng để làm cho câu trả lời của mình hoàn thành, nhưng vì tôi đã dành gần hai ngày để làm cho nó hoạt động, tôi có thể đã quên một cái gì đó. Sẽ vui mừng được giúp đỡ / chỉnh sửa bài viết của tôi.
Aurélien Cibrario

Tôi mới nhận ra rằng ctrl + click1 là một lựa chọn rất tệ để đóng một tab vì nó mở một liên kết trong một tab mới. Tôi đã chỉnh sửa câu trả lời của mình để xóa phần cuối của tập lệnh python và chỉnh sửa bằng xbindkeys, giải pháp sạch hơn
Aurélien Cibrario

chỉ muốn cho bạn biết, rằng tôi chưa có thời gian để kiểm tra nó - nhưng tôi chắc chắn sẽ đưa ra câu trả lời được chấp nhận nếu nó hoạt động như mong đợi - xin lỗi vì sự chờ đợi - tôi hơi bận một chút
conIGHTtdeluxe

Tôi tự hỏi nếu chúng ta có thể sử dụng kịch bản trên để gỡ lỗi một chuyển đổi chuột bị lỗi. Tôi có một con chuột bị mòn. Tôi sử dụng tập lệnh autohotkey để sửa nó trong Windows nhưng không có công cụ nào để sửa nó trong Linux. Đây là kịch bản Autohhotkey cho nút bên trái sửa autohotkey.com/board/topic/63555-debounce-mouse-keys Tôi hy vọng ai đó chuyển nó sang Linux bằng python3 - evdev
kenn

4

Tôi tìm thấy một giải pháp với PyUserInput . Điều này kết thúc khá đơn giản và không yêu cầu quyền quản trị. Với python 2 và PyUserInput được cài đặt, tôi đã sử dụng tập lệnh sau:

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

Sau khi quyền thực hiện để kịch bản, tôi gọi nó với một dòng trong ~/.xsessionrc, ví dụ

~ / đường dẫn / đến / script.py &

Lưu ý . điều này không ngăn sự kiện nút chuột bắn. Trong trường hợp của tôi, tôi đã sử dụng xinput set-button-mapđể thay đổi ánh xạ nút xinput và chỉ định số lượng nút mà tôi quan tâm đến thứ không được sử dụng.

Chẳng hạn, nếu bạn muốn sử dụng nút 8 trên chuột nhưng nút 8 đã có chức năng (ví dụ page-next:), bạn có thể sử dụng cách sau.xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
xinput set-button-map $logitech_mouse_id 1 2 3 4 5 6 7 12 9 10 11 12 13 14 15 16 17 18 19 20
./.xbuttonmodifier.py &

nút được cung cấp 12không có ý nghĩa gì với HĐH và gán một chức năng tùy chỉnh cho nút 12trong .xbuttonmodifier.pytập lệnh mà tôi đã mô tả ở trên.


Nhưng nó không ngăn sự kiện ban đầu nổ súng. Vì vậy, nếu tôi ánh xạ nút 8 để dịch chuyển và giữ nút 8 trong Firefox, nó cũng cố gắng quay lại trang trước, điều không mong muốn.
dùng23013

1
Thật. Để giải quyết vấn đề này, tôi đã sử dụng thay đổi id của nút mà tôi quan tâm đến một nút đã sử dụng xinput. Xem câu hỏi được chỉnh sửa.
Maxim

2

Tôi có một giải pháp một phần. Tôi chưa tìm ra cách hủy sơ đồ nút hiện có, vì vậy bạn kết thúc bằng một lần bấm nút và công cụ sửa đổi mà bạn muốn. Vì vậy, nếu nút chuột đó có một số mục đích hiện có, nó sẽ vẫn bắn. Ví dụ: chỉnh lại nút chuột phải thành phím điều khiển sẽ dẫn đến việc điều khiển + nhấp được gửi.

Dù sao, tôi đã tìm thấy một bài đăng diễn đàn tương tự như câu hỏi của bạn mà câu trả lời là cài đặt btnx và cấu hình các sửa đổi của bạn thông qua đó. Có vẻ như btnx không còn có sẵn thông qua repo. Có một ppa, nhưng nó không hoạt động cho Ubuntu mới nhất.

Bài đăng trên diễn đàn: bài đăng: http://ubuntuforums.org/showthread.php?t=1245930

Nhưng nguồn có sẵn:

Bạn có thể biên dịch nó từ nguồn, nhưng điều này sẽ đưa các tệp vào hệ thống của bạn mà trình quản lý gói không thể duy trì.

Cụ thể, các tập tin sau:

/usr/local/sbin/btnx
/etc/init.d/btnx
/usr/share/pixmaps/btnx.png
/usr/share/btnx-config (directory, multiple files)
/usr/share/applications/btnx-config.desktop
/usr/share/omf/btnx-config/btnx-manual-C.omf
/usr/share/locale/de/LC_MESSAGES/btnx-config.mo
/usr/share/locale/fr/LC_MESSAGES/btnx-config.mo
/usr/share/locale/nl/LC_MESSAGES/btnx-config.mo
/usr/share/locale/ru/LC_MESSAGES/btnx-config.mo

Các liên kết sau:

/etc/rc0.d/K49btnx -> ../init.d/btnx
/etc/rc1.d/K49btnx -> ../init.d/btnx
/etc/rc6.d/K49btnx -> ../init.d/btnx
/etc/rc2.d/S49btnx -> ../init.d/btnx
/etc/rc3.d/S49btnx -> ../init.d/btnx
/etc/rc4.d/S49btnx -> ../init.d/btnx
/etc/rc5.d/S49btnx -> ../init.d/btnx

Vì vậy, ... nếu bạn không nhớ xây dựng từ nguồn ...

Nhận phụ thuộc cho btnx:

sudo apt-get install libdaemon-dev git

Nếu bạn chưa bao giờ xây dựng bất cứ thứ gì từ nguồn, bạn cũng có thể cần xây dựng:

sudo apt-get install build-essential

Sau đó lấy và biên dịch btnx:

git clone https://github.com/cdobrich/btnx
cd btnx
./configure
make
sudo make install
cd -

Nó có một công cụ cấu hình GUI riêng. Lấy các phụ thuộc cho nó:

sudo apt-get install libgtk2.0-dev libglade2-dev

Bây giờ hãy lấy và biên dịch công cụ cấu hình gui:

git clone https://github.com/cdobrich/btnx-config
./configure
make
sudo make install

Bây giờ hãy chạy công cụ:

sudo btnx-config

Nhấp vào Phát hiện các nút chuột Nếu bạn muốn có thể đọc chỉ đường trong khi bạn sử dụng công cụ, hãy thay đổi kích thước cửa sổ bật lên, văn bản hộp thoại sẽ bị cắt sau nếu bạn không và nếu bạn cố gắng thay đổi kích thước trong khi phát hiện, nó sẽ hủy việc phát hiện. Chỉ cần làm cho cửa sổ lớn hơn một chút.

Nhấp vào Nhấn để bắt đầu phát hiện chuột, sau đó cố gắng không di chuyển chuột cho đến khi văn bản thay đổi ... Mất khoảng 5-10 giây. Văn bản sẽ thay đổi. Khi có, bỏ qua những gì nó nói và nhấp vào Chuyển tiếp.

Nhấp vào nút "Nhấn để bắt đầu phát hiện nút"

Tại đây bạn sẽ nhấp vào một nút chuột nhiều lần (cho đến khi thanh trạng thái đầy). Sau đó, đặt tên của nút thành một cái gì đó bạn sẽ nhận ra sau này (ví dụ: LeftButton) Nhấp vào nút Thêm.

Lặp lại điều này cho mỗi nút chuột (đừng quên bánh xe cuộn, nhấp chuột, v.v.). Bạn có thể bỏ qua bất kỳ nút nào bạn không muốn ánh xạ lại.

Khi bạn đã thêm tất cả các nút, bấm vào OK.

Trong GUI chính, nhấp vào Nút, trong khung bên trái chọn nút teh bạn muốn ánh xạ lại. Nó sẽ sử dụng tên bạn đã nhập trong các bước trước. Đối với mục đích của bạn, bạn sẽ muốn chỉ chọn một công cụ sửa đổi Khóa trong tổ hợp Khóa ở bên phải.

Đừng nhấp vào xóa trên màn hình này, nó sẽ loại bỏ nút. Bạn sẽ phải quay lại và phát hiện lại nút nếu bạn làm thế.

Quay trở lại màn hình Conrigurations và nhấp vào khởi động lại btnx.

Hãy thử nút mới.

Nếu bạn muốn gỡ cài đặt các applicaitons, hãy dừng chương trình btnx và sau đó vào các thư mục kiểm tra git tương ứng và thực hiện gỡ cài đặt:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -

2
Cảm ơn rất nhiều cho câu trả lời chi tiết bạn đã đăng tại pastebin. Nhưng tôi sợ rằng tôi không được phép sử dụng ppa không tin cậy hoặc xây dựng một ứng dụng từ nguồn không xác định mà không xem xét chi tiết về thiết bị của mình. Tuy nhiên, tôi sẽ cho bạn một phiếu bầu cho những nỗ lực bạn đã bỏ ra. Ngoài ra, tôi khuyên bạn nên cập nhật câu trả lời của mình tại đây và sao chép những gì bạn đã viết ở đó vì thông tin này có thể hữu ích cho những người khác nhưng có thể bị bỏ qua. Cuối cùng tôi đã đọc được rằng gói thậm chí có thể không được biên dịch trong Ubuntu hoặc Debian - bạn đã thử thực sự chưa?
conIGHTtdeluxe

Btw: Bạn có thể dễ dàng nhận được thêm 100 danh tiếng bằng cách liên kết tài khoản Askubfox của bạn với các tài khoản Stack Exchange khác, ví dụ như Linux & Unix.
conIGHTtdeluxe

Vâng, tôi đã thử nghiệm nó trong Ubuntu 14.04. Tôi đã làm nút chuột phải gửi một phím điều khiển và xác nhận rằng nó hoạt động trước khi đăng. Và sau đó gần như từ bỏ bài vì yêu cầu danh tiếng.
Stephen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.