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

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

Сопоставить Ctrl и Alt с кнопками большого пальца мыши


Выпуск:

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

Окончательное решение должно позволить, т. Е. 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")

Найдено на http://www.linuxforums.org/ forum / hardware-Периферийные устройства / 169773 -olved-map-mouse-button-modifier-key.html и пытается решить проблему, где хранится модификатор (как описано в подходе a).

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

Подход 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

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


ОБНОВЛЕНИЕ:

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

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

16
задан 13 April 2017 в 15:24

4 ответа

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

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

Сообщение на форуме: сообщение: http://ubuntuforums.org/showthread.php?t=1245930

Но исходный текст доступен:

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

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

/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 tool:

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

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

sudo btnx-config

Нажмите на кнопку Detect Mouse Buttons (Обнаружение кнопок мыши) Если вы хотите иметь возможность читать инструкции во время использования инструмента, измените размеры всплывающее окно, текст диалогового окна обрезается позже, если вы этого не сделаете, и если если вы попытаетесь изменить размер во время обнаружения, это отменит обнаружение. Просто сделайте окно немного больше.

Нажмите на кнопку Нажмите, чтобы начать обнаружение мыши, а затем постарайтесь не двигать мышь до тех пор, пока текст меняется... Это займет около 5-10 секунд. Текст изменится. Когда он Нажмите кнопку "Press to start button detection" (Нажмите, чтобы начать распознавание кнопок)

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

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

После добавления всех кнопок нажмите OK.

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

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

Вернитесь к экрану настройки и нажмите кнопку перезапустить btnx.

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

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

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -
2
ответ дан 13 April 2017 в 15:24

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

Есть действительно хорошие решения , подобные предложенному здесь , но они всегда страдают от ограничение xbindkeys, которые захватывают всю мышь, что делает ненадежным отображение модификаторов + мыши. Кроме того, в решении на основе хитрости из приведенной выше ссылки используется ctrl + plus / ctrl + minus, который, например, не распознается 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"

Символьная ссылка не нужна, 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 или ваш дистрибутив.

Сценарий довольно прост, вам просто нужно определить код события вашей кнопки.

#!/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 на клавиатуре, теперь работает с клавишей мыши !!

8
ответ дан 14 April 2017 в 01:24
  • 1
    Интересно, устанавливали ли Вы действительно просто серверную версию Ubuntu без какого-либо GUI?! Я проверю, существует ли папка "Удаленные" в этой версии. Это заправляет некоторое время, потому что я должен загрузить и установить его в VM. – Kev Inski 24 August 2016 в 20:24

Я нашел решение с помощью 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 , например

~ / path /to/script.py &

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

Например, если вы хотите использовать кнопку 8 мыши, но кнопка 8 уже имеет функцию (например, page-next ), вы можете использовать следующую .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 &

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

5
ответ дан 14 April 2017 в 01:24

Есть метод для мыши Logitech, используйте неофициальный драйвер с именем logiops https://github.com/PixlOne/logiops (Респект авторам). Я обнаружил, что в этом проекте мои боковые кнопки идеально имитируют Ctrl и Shift.

Вот моя конфигурация. Я использую мышь M720, и cid: 0x56 - это кнопка вперед, а cid: 0x53 - это кнопка назад. Дополнительную помощь можно найти в вики этой страницы репо.

devices: (
{
    name: "M720 Triathlon Multi-Device Mouse";
    buttons: (
        {
            cid: 0x56;
            action =
            {
                type: "Keypress";
                keys: ["KEY_LEFTCTRL"];
            };
        },
        {
            cid: 0x53;
            action =
            {
                type: "Keypress";
                keys: ["KEY_LEFTSHIFT"];
            };
        }
    );
    hiresscroll:
    {
        hires: true;
        invert: false;
        target: false;
    };
}
);
0
ответ дан 5 January 2021 в 22:53

Другие вопросы по тегам:

Похожие вопросы: