Làm cách nào để tôi lập bản đồ phím bàn phím thành nút chuột?


14

Tóm tắt câu hỏi: Tôi muốn một trong những nút chuột của tôi được đăng ký là nút Windows bên trái Super_Lcủa X11.


Trong trình quản lý cửa sổ của mình, tôi có thể di chuyển các cửa sổ xung quanh bằng cách giữ "nút Windows bên trái" (Left Super) và kéo một cửa sổ bằng nút chuột trái. Tôi muốn có thể làm điều đó mà không cần chạm vào bàn phím, vì vậy tôi muốn ánh xạ phím Super trái sang nút chuột 11, bằng cách đó tôi có thể giữ nút chuột 11 và nhấp + kéo các cửa sổ.

Giải pháp rõ ràng nhất là sử dụng xbindkeys và xte như thế này ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  b:11 + release

Điều này hoạt động như thế này:

  • Khi tôi nhấn nút chuột 11, Super_Lcũng được nhấn xuống
  • Khi tôi nhả nút chuột 11, Super_Lcũng được phát hành

Nhưng có một vấn đề: Tôi không thể di chuyển các cửa sổ bằng cách sử dụng Super_L+ Mouse1nếu tôi cũng đang giữ một nút chuột khác, như nút Chuột 11. Sử dụng giải pháp ở trên, nút chuột 11 vẫn được đăng ký là nhấn và phát hành, và vì vậy không ai trong số các hoạt động quản lý cửa sổ làm việc.

Tôi đã cố gắng này sử dụng cả Quế và Awesome WM, và hoàn toàn không có các Super_Ltổ hợp phím tắt làm việc trong khi nút chuột 10 hoặc 11 được tổ chức xuống.

Một hack phụ

Tôi hiện đang khắc phục sự cố này bằng cách khiến chuột 11 lần nhấp để giữ Super_Lnút trong một khoảng thời gian nhất định. Bằng cách đó, tôi có thể nhấp vào nút chuột, sau đó kéo công cụ xung quanh trong một khoảng thời gian ngắn sau đó:

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'"
  b:11

Một nỗ lực khác

Theo đề xuất của totti, tôi đã thử xbindkeyscấu hình này :

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

"xte 'keyup Super_L'"
  b:10 + Release

Nó không hoạt động. Có vẻ như Super_Lphím đang được giữ, vì ngay khi tôi nhả nút 10, nó vẫn được giữ mãi mãi (cho đến khi tôi nhấn Super_Lphím lại trên bàn phím) nhưng nút chuột vẫn được đăng ký, vì tôi không thể nhấp và kéo các cửa sổ . Tôi không nghĩ rằng tôi sẽ có thể thực hiện công việc này bằng cách sử dụng xbindkeysxte.


1
Thay vì ràng buộc nút chuột với siêu phím, hãy ánh xạ lại. Đối với điều này sử dụng xmodmap . xem trang wiki xmodmap vòm để thiết lập hoàn chỉnh.
totti

@totti: Vòm trang xmodmap wiki mô tả làm thế nào để bản đồ phím để phím khác, làm thế nào để các phím modifier trao đổi và làm thế nào để đảo ngược di chuyển, nhưng nó không đề cập đến các phím bàn phím lập bản đồ các nút chuột
Hubro

@totti: Với xmodmap tôi có thể ánh xạ các phím sang các phím khác và với tiện ích mở rộng XKB cho X (và xkbset) Tôi có thể ánh xạ các nút chuột thành các phím bàn phím, nhưng tôi đang cố gắng ánh xạ phím bàn phím sang nút chuột. Tôi vẫn chưa tìm ra cách để làm điều đó.
Hubro 17/03/2015

thử: Trên nút chuột 11 giữ, mô phỏng siêu giữ + phát hành nút chuột 11. Trình quản lý cửa sổ hiện có thể phát hiện siêu và chuột 1 chứ không phải chuột 11.
totti

@totti: Đã thử và đã chỉnh sửa câu hỏi
Hubro 18/03/2015

Câu trả lời:


5

Một bài đăng trên Askubfox chứa câu trả lời mà tôi sẽ tóm tắt dưới đây.

Vấn đề là xbindkey chộp lấy toàn bộ con chuột, khiến cho việc sửa đổi + ánh xạ nhấp chuột không chắc chắn. Câu trả lời sử dụng uinput thông qua tập lệnh python-uinput để theo dõi /dev/my-mousenút bấm và gửi Ctrlphím đế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

Đối với chuột, tập tin /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 các thiết bị kernel có tên như event5. SYMLINK là để tìm chuột /dev/my_mx_mouse, nhóm có thể đọc được mxgrabber.

Để tìm thông tin phần cứng chạy một cái gì đó như:

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

Đối với uinput, tập tin /etc/udev/rules.d/94-mxkey.rules:

KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

Rút phích cắm và cắm chuột của bạn hoặc buộc udev kích hoạt các quy tắc với udevadm trigger.

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

sudo modprobe uinput

Và trong /etc/modules-load.d/uinput.conf:

uinput

3. Tạo nhóm mới

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Tập lệnh Python

Cài đặt python-uinput librarypython-evdev library.

Kịch bản dưới đây yêu cầu xác định 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. Hoàn thiện

Làm cho tập tin python có thể thực thi được và đảm bảo nó được tải khi khởi động.


Tôi đã cập nhật kịch bản để gán một mã phím không sử dụng đến các nút chuột (tôi đặt họ lên F13, F14F15, và vô hiệu hóa chức năng chuột sử dụng xinput. Sau đó, tôi chỉ có thể phân công lại những chìa khóa để bất cứ điều gì tôi cần phải sử dụng một cách đơn giản xmodmap. Ý tưởng chính là soạn thảo trong một ý chính (có một số giá trị được mã hóa cứng và tôi không khôi phục xinputchức năng chuột sau đó), tôi sẽ tạo một bài đăng blog về điều này với phiên bản cuối cùng của tập lệnh (và chia sẻ liên kết ở đây khi nó được thực hiện. Cảm ơn bạn đã giúp đỡ! ☺ ♥
zmo

Ngoài ra, hãy kiểm tra câu trả lời mới của tôi trên chuỗi khác để biết giải pháp dựa trên x11, hỏiubfox.com / a / 903389/69589
Maxim

1

Khi bạn có thể chạy tập lệnh khi nhấp chuột, bạn có thể sử dụng mẹo sau.
1. Nhấn nút 11 để giữ các chìa khóa siêu . ( Nút 11 tạo ra một tập lệnh)
2. Di chuyển các cửa sổ bằng các nút chuột khác
3. Nhấn lại nút chuột 11 để nhả phím siêu

script
Sử dụng xdotoolđể giữ siêu khóa
Khi nhấp vào nút đầu tiên, tạo tệp tạm thời và giữ phím. Ở lần nhấp tiếp theo, xóa tập tin tmp và giải phóng khóa,

cập nhật

Theo trang trợ giúp của Ubuntu (nhiều nút chuột làm thế nào) imwheelcó thể ánh xạ lại vào một phím.


Một vài vấn đề với điều đó: # 1 Đây vẫn chỉ là một hack / cách giải quyết khác và không trả lời câu hỏi. # 2 xbindkeys không hoạt động trong khi siêu khóa đang được giữ. Như thể xbindkeys bị tạm dừng và không đăng ký bất cứ điều gì, cho đến khi siêu khóa được phát hành.
Hubro

Ok, sau khoảng 5 phút nghiên cứu, tôi rút lại điểm # 2. Tôi dường như phải thêm + Mod4vào cấu hình xbindkeys của mình để tính đến siêu khóa đang bị giữ. Cách giải quyết mà bạn đề xuất là tốt hơn của tôi và tôi đang chuyển sang nó :-) Nhưng nó vẫn không trả lời được câu hỏi.
Hubro

1

Đề xuất gỡ lỗi: Tôi sẽ cố gắng theo dõi /dev/input/eventXtệp để xem những sự kiện nào được tạo khi bạn nhấn và nhả nút đó, đặc biệt là trong các kết hợp với BTN_LEFT. Đây là một mã mẫu để giúp bạn bắt đầu. Rõ ràng bạn sẽ phải sửa đổi nó để ghi lại tất cả các sự kiện, không chỉ nhấn phím.

Bạn cũng có thể muốn kiểm tra xevđầu ra, nếu bạn chưa có. Phân tích cả hai nhật ký sẽ tiết lộ chính xác vấn đề bạn đang gặp phải.

Rất có thể là chuột của bạn đang tạo thêm các sự kiện phát hành nút khi nhấn nhiều nút. Trong trường hợp đó, các tùy chọn của bạn sẽ là sử dụng các cách giải quyết ràng buộc chính hoặc sửa đổi xf86-input-evdevthư viện để lọc các sự kiện không mong muốn (hoặc mô phỏng các sự kiện bị thiếu). Tôi đã làm một cái gì đó tương tự một lúc trước cho một màn hình cảm ứng tạo ra các sự kiện "nhấp chuột" khi cố gắng kéo và thả. Ý tưởng là lọc các sự kiện "phát hành" gần như đồng thời (trong một cửa sổ thời gian nhỏ) với các sự kiện "nhấp chuột". Nếu dự đoán của tôi là chính xác, về cơ bản bạn sẽ cần phải thực hiện một cái gì đó tương tự.


1

Tôi đã tìm ra điều này sớm hơn ngày hôm nay với các phím bổ trợ khác. Vấn đề là bạn phải bao gồm công cụ sửa đổi trong tổ hợp nút để phát hành. Giả sử khóa Super của bạn được ánh xạ tới Mod4 (phải là mặc định, afaik):

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  Mod4 + b:11 + release

EDIT: Chỉ nhận ra rằng điều này không hoàn toàn trả lời câu hỏi của bạn vì bạn vẫn không thể sử dụng LMB trong khi nhấn giữ b: 11

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.