Как сопоставить модификаторы (например, CTRL) с кнопками большого пальца мыши с помощью клавиш xbindkeys

10

Этот вопрос уже задан, но на него не ответил должным образом. После оформления с помощью @Seth теперь я снова спрашиваю его. Это позволит мне ответить и, возможно, изменить вопрос намного проще. Оригинальный вопрос можно найти здесь:

Карта Ctrl и Alt для кнопок с большим пальцем мыши

Вопрос:

Хотя очень просто сопоставить любые нажатия клавиш кнопке мыши с использованием xbindkeys в сочетании с xdotool или xte , представляется гораздо более проблематичным отобразить ключ-модификатор (например, ALT , CTRL , SHIFT и т. д.).

Окончательное растворение должно позволить i.a. a CTRL + нажмите (например, для выбора нескольких записей списка) с помощью мыши.

Несколько возможных подходов к решению этой проблемы можно найти здесь, в Stack Exchange, а также на других форумах, связанных с Linux. Но ни одна из них не работает так, как ожидалось, поскольку они приводят к другим проблемам и побочным эффектам.

Примечания:

Некоторые из приведенных ниже примеров включают Guile с синтаксисом Scheme и полагаются на файл .xbindkeysrc.scm , тогда как другие полагаются на файл .xbindkeysrc с соответствующим синтаксисом. Я знаю, что они не будут работать вместе.

Кроме того, приведенные ниже фрагменты полагаются только на xdotool , но я открыт для подходов, связанных с другими приложениями, например, например. xte , хотя, похоже, оба они приводят к одинаковым результатам, поэтому я использую здесь только xdotool .

Подход A:

Обновление файла .xbindkeysrc с помощью

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

Это то, что я изначально пробовал, но имеет побочный эффект, что модификатор удерживается и не может быть выпущен.

Подход B:

Обновление файла .xbindkeysrc.scm с помощью

(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")

Найдено на ссылке и пытается для решения проблемы, в которой хранится модификатор (как описано в подходе а).

Хотя он исправляет, что он работает только частично, поскольку при нажатии кнопки большого пальца невозможно выполнить другие щелчки мыши.

Подход C:

Обновление файла .xbindkeysrc с помощью

"xdotool keydown ctrl"
  b:8

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

Пробовал OP связанного вопроса здесь, в askubuntu. Гораздо проще и надежнее, так как он не включает состояния модификатора. Тем не менее проблема остается, то есть CTRL + нажмите не представляется возможным.

Кажется, что xbindkeys сама по себе является проблемой здесь, поскольку она распознает клик, но не выполняет ее. Это можно проверить, используя xev | grep button и xbindkeys -v :

Нормальный щелчок мыши, записанный xev , должен выглядеть так:

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

Как и для кнопки большого пальца:

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

Но если включенная конфигурация xbindkeys включена, она ничего не записывает. Хотя это имеет смысл для кнопки большого пальца, поскольку оно отображается на CTRL и, следовательно, не является кнопкой мыши, странно, что кнопка 1 также не записывается. Вероятно, это потому, что xbindkeys не выполняет его, но сам распознает его:

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

Подход D:

Обновление файла .xbindkeysrc с помощью

"xdotool keydown ctrl"
  b:8

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

"xdotool click 1"
  b:1

Просто слишком просто ... но приводит к бесконечному циклу кликов.

UPDATE:

Тем временем я купил Logitech G502 и заметил, что после настройки с помощью драйвера в Windows не только сам профиль хранится в памяти устройства, но фактическое нажатие клавиши выполняется. Это на самом деле решило мою проблему в Linux!

Единственная другая мышь, которую я помню, была в состоянии сделать, это был Razer Copperhead в те дни. Но, я думаю, сегодня есть другие мыши, которые могут сделать то же самое.

    
задан conceptdeluxe 24.05.2015 в 03:39
источник

3 ответа

5

Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не идеально с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.

Есть решения, которые действительно приятны, как тот, который предлагается здесь , но он всегда страдает от ограничение xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из приведенной выше ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.

Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура, поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные инструкции:

1. Сделать правила udev

Мы хотим, чтобы устройства были доступны (права и местоположение).

Для мыши:

/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 будет искать устройство, распознанное ядром с именами, такими как event5, и я выбираю свою мышь с именем. Команда SYMLINK уверяет, что найду свою мышь в / dev / my_mx_mouse. Устройство будет доступно для чтения членом группы «mxgrabber».

Чтобы найти информацию о вашем оборудовании, вы должны запустить что-то вроде

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

Для uinput:

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

Нет необходимости в symlink, uinput всегда будет в $/dev/uinput или $/dev/input/uinput в зависимости от системы, в которой вы находитесь. Просто дайте ему группу и права читать и писать, конечно.

Вам нужно отключить - подключите вашу мышь, и новая ссылка должна появиться в / dev. Вы можете заставить udev инициировать ваши правила с помощью $udevadm trigger

2. Активировать модуль UINPUT

sudo modprobe uinput

И чтобы сделать его загружаемым:

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

3. Создать новую группу

sudo groupadd mxgrabber

Или то, что вы назвали своей группой доступа. Тогда вы должны добавить себя к нему:

sudo usermod -aG mxgrabber your_login

4. Скрипт Python

Вам нужно установить библиотеку python-uinput (очевидно) и библиотеку python-evdev . Используйте pip или ваш дистрибутив.

Скрипт довольно прост, вам просто нужно идентифицировать кнопку event.code.

#!/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. Наслаждайтесь!

Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!

6. Дополнительно бесплатно

Я использую xbindkeys для дополнительного поведения. Например, следующая конфигурация может быть приятной, если у вас есть мышь с кликами на колесиках:

~/.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

Для того, чтобы этот последний комбинатор работал, , вы должны отключить кнопку, настроенную для скрипта python , в противном случае она будет по-прежнему привязана к xbindkeys. Остается только клавиша Ctrl:

~/.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

Перезагрузка с $ xmodmap ~/.Xmodmap

7. Вывод

Как я уже сказал в начале, я не совсем доволен тем, что мне приходится давать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.

На яркой стороне он работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мышей!     

ответ дан Aurélien Cibrario 06.01.2016 в 13:31
2

У меня есть частичное решение. Я не понял, как отменить существующий , поэтому вы получаете нажатие кнопки и требуемый модификатор. Так что если эта кнопка мыши имеет некоторую существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к управлению + щелчок отправляется.

В любом случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого Ответ заключался в установке btnx и настройке ваших модификаторов. Кажется btnx больше не доступен через репо. Существует ppa, но это не работайте для последней ubuntu.

Сообщение в форуме: post: Ссылка

Но доступен источник:

Вы можете скомпилировать его из исходного кода, но это поместит файлы в вашу систему, чтобы менеджер пакетов не может поддерживать.

А именно, следующие файлы:

/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

Следующие символические ссылки:

/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

Итак ... если вы не возражаете строить из источника ...

Получить зависимости для btnx:

sudo apt-get install libdaemon-dev git

Если вы никогда не строили что-либо из исходного кода, возможно, вам также понадобится build-essential:

sudo apt-get install build-essential

Затем получите и скомпилируйте btnx:

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

Он имеет отдельный инструмент настройки графического интерфейса. Получите зависимости для него:

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

Теперь создайте и скомпилируйте утилиту gui config:

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

Теперь запустите инструмент:

sudo btnx-config

Нажмите кнопку «Определить мыши» Если вы хотите, чтобы вы могли читать указания во время использования инструмента, измените размер окно, которое появляется, текст диалога обрезается позже, если вы этого не сделаете, и если вы пытаетесь изменить размер во время обнаружения, это отменит обнаружение. Просто сделайте окно немного больше.

Нажмите «Нажмите», чтобы начать обнаружение мыши, затем попробуйте не перемещать мышь до тех пор, пока текст меняется ... занимает около 5-10 секунд. Текст изменится. Когда это делает, игнорирует, что он говорит, и нажмите «Переслать».

Нажмите кнопку «Нажмите, чтобы начать поиск кнопки»

Здесь вы будете нажимать одну кнопку мыши несколько раз (пока строка состояния не заполнится). Затем установите имя кнопки на то, что вы узнаете позже (например: LeftButton) Нажмите кнопку «Добавить».

Повторите это для каждой кнопки мыши (не забудьте прокрутить колеса, прокрутить клики, и т.д). Вероятно, вы можете пропустить любые кнопки, которые вы не хотите переназначать.

Когда вы добавили все кнопки, нажмите «ОК».

В главном графическом интерфейсе нажмите кнопку «Кнопки», в левой панели выберите кнопку, которую вы хотите переназначить. Он будет использовать имена, введенные вами на предыдущих шагах. Для ваших целей вам нужно выбрать только модификатор ключа в комбинации клавиш справа.

Не нажимайте кнопку «Удалить» на этом экране, он удалит кнопку. Вы должны будете вернитесь назад и снова обнаружите кнопку, если вы это сделаете.

Вернитесь к экрану Conrigurations и нажмите «перезапустить btnx».

Попробуйте новую кнопку.

Если вы хотите удалить прикладные программы, остановите программу btnx, а затем перейдите в соответствующие git проверенные каталоги и деинсталлировать:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -
    
ответ дан Stephen 24.05.2015 в 14:24
2

Я нашел решение с PyUserInput . Это заканчивается довольно простым и не требует административных прав. Когда установлены python 2 и PyUserInput, я использовал следующий скрипт:

#!/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()

После предоставления прав выполнения скрипту я вызываю его с линией в ~/.xsessionrc , например

~ / путь / в / script.py & amp;

Примечание . это не препятствует запуску события кнопки мыши. В моем случае я использовал xinput set-button-map , чтобы изменить отображение кнопки xinput и присвоить номер кнопки, в которой меня интересовало то, что не использовалось.

Например, если вы хотите использовать кнопку 8 на вашей мыши, но кнопка 8 уже имеет функцию (например, page-next ), вы можете использовать следующие .xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$//')
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 &

если кнопка 12 не имеет никакого значения для ОС и назначает пользовательскую функцию кнопке 12 в .xbuttonmodifier.py , сценарий, описанный выше.

    
ответ дан Maxim 10.04.2017 в 23:59