Я боровся з цим у вихідні, і мені потрібно переробити кнопки миші.
Я боровся з цим у вихідні, і мені потрібно переробити кнопки миші.
Відповіді:
У мене є мишка Logitech з 9 кнопок, а натискання «середньої кнопки» (№2) передбачає натискання колеса прокрутки. Мені це не подобається, тому що я незграбний і, як правило, прокручую вікно, в якому я перебуваю, коли намагаюся натиснути колесо. Тому я хотів автоматично перевстановити верхню бічну кнопку (№9 в даному випадку) на середню кнопку (№2). Я також хотів відобразити нижню бічну кнопку (№8), щоб вона виконала подвійне клацання лівої кнопки (№1).
Хоча мої цілі були конкретні, рішення нижче можна узагальнити до будь-якої ситуації, в якій потрібно автоматично перезавантажувати кнопки миші при запуску.
Вам потрібно буде xinput
встановити для цього завдання. Це можна зробити повністю у вашому .xsessionrc
файлі. Спочатку використовуйте xinput
для виявлення імені, призначеного вашій миші, яке потім співвідноситься з ідентифікатором пристрою введення. Нижче представлений зразок виводу з мого ноутбука:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
Моя миша дзвонить собі Logitech USB Laser Mouse
і відображається як id=11
. Ваша миша матиме інше ім’я; з'ясування того, що це залишається як вправа для читача.
Поки ви все ще знаєте ідентифікатор пристрою в цьому сеансі, дізнайтеся, скільки кнопок думає обробник вводу, використовуючи . Це може відрізнятися від кількості кнопок, яка помітна на пристрої.xinput list
deviceID
Logitech USB Laser Mouse id=11 [slave pointer (2)]
Reporting 7 classes:
Class originated from: 11. Type: XIButtonClass
Buttons supported: 16
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
У моєї миші є лише 9 очевидних фізичних кнопок, але xinput
16 звітів.
Враховуючи природу USB, цей ідентифікатор може змінюватися щоразу при перезапуску, тому недостатньо сценаріювати щось, що статично введено в ідентифікатор, який ви виявите один раз. Вам доведеться динамічно проаналізувати це при запуску та виконати свою повторну карту на основі поточного ідентифікатора.
Тепер, коли ви знаєте його назву, ви можете використовувати, xinput test
щоб визначити, який ключ для перезавантаження. Натискайте кнопки миші, які потрібно зіставити з і до, щоб отримати їхні індекси. (Для довідки, 1, 2 і 3 "завжди" (тобто зазвичай) посилаються на ліву, середню та праву кнопки миші з 3 клавішами. Загальна карта перевертає їх, щоб зробити мишу лівою рукою. )
button press 2
button release 2
button press 9
button release 9
У цьому випадку я виявив, що хочу відобразити кнопку №9 (збоку, вгорі) на кнопку №2 (посередині).
Тепер, коли ви знаєте, як називається ваша миша, і які кнопки ви хочете змінити, ви можете написати ~/.xsessionrc
скрипт, який викликає xinput
виконання кнопки повторного відображення при запуску. Нижче наводиться мій повний сценарій.
# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
Перший рядок тут встановлює змінну тимчасової сесії, рівну ідентифікатору миші, як повідомляється xinput
. Це робиться за grep
допомогою відомого імені миші у звіті xinput
, потім використовуючи sed
для вилучення ідентифікаційного номера з цього id=xxx
маркера у звіті. Це значення потім використовується в xinput set-button-map
директиві, яка виконує повторне відображення. У наведеному вище прикладі єдина зміна полягає в тому, що кнопка № 9 перевстановлюється на імітаційну кнопку №2. Усі інші залишаються за замовчуванням.
Оновлення: Як вказує @Lokasenna нижче , якщо ваш пристрій повідомляє про себе як мишу, так і клавіатуру, можливо, вам доведеться обмежити кількість результатів grep
використання -m 1
.
Дивіться також цю відповідь .
Вам потрібно буде xinput
, xbindkeys
і xautomation
( в тому числі xte
) , встановлені для цього завдання.
Використовуйте xinput list
та xinput test
виявляйте ідентифікатор пристрою миші та номер кнопки, яку потрібно призначити. У моєму випадку я хотів зіставити нижню бічну кнопку (№8) подвійним клацанням лівої кнопки (№1).
Створіть або відредагуйте ~/.xbindkeysrc
. Формат цього файлу - це ряд парних ліній. Перший рядок - це команда, яка виконується для події; другий рядок - опис події. Ми будемо використовувати xte
компонент, xautomation
щоб направляти події безпосередньо на вхідний обробник.
Щоб створити подію подвійного клацання, коли кнопка відпущена, я додав наступне:
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
Ця конфігурація відображає послідовність двох клацань миші на кнопку №1 до виходу кнопки №8. (Теоретично я гадаю, що ви можете зіставити будь-яку команду кнопкою миші, але це найпоширеніший випадок. Див. Цю відповідь для інших практичних прикладів.)
Користувачам з кількома мишами, приєднаними до вашої системи, вам також потрібно ввести ідентифікатор пристрою. Це може стосуватися не всіх користувачів, і було виявлено на Ubuntu 16.04 з Unity.
xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Kensington Kensington Expert Mouse id=9 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=13 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=14 [slave pointer (2)]
Потім змініть файл .xbindkeysrc, посилаючись на значення id = з виводу команди (id = 9 у цьому прикладі):
"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
awk
заяву на вашу sed
заяву. Дякуємо за покращення!
xinput set-button-map "Logitech Trackball" 1 3 3
xinput
, показує мишу двічі, як це: ↳ USB OPTICAL MOUSE id = 12 [slave pointer (2)] ↳ USB OPTICAL MOUSE id = 13 [slave pointer (2)] Only ID 13 буде ловити команди xinput test
. Сценарій завжди вловлює перший ідентифікатор. Але чому це все-таки двічі? Обидва зникають, коли я відключаю цю мишу, і знову з’являються при підключенні.
Короткі кроки для цього:
Є утиліта, яка називається xinput
. xinput list
або просто xinput
покаже всі пристрої введення X та їхні ідентифікатори. Тут ви знайдете ідентифікатор миші, який ви хочете перезаписати.
Я буду використовувати свій ідентифікатор як приклад, з моєї установки, яка становить 21, потім xinput --get-button-map 21
вивести
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Тепер, якщо ви хочете, скажімо, поміняти ліву та праву кнопки, ви просто запустите
xinput --set-button-map 21 3 2 1
Ось ми і робимо перепланування.
Для його запуску просто покладіть це у файл:
echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh
дати йому виконавчий дозвіл
chmod +x leftmouseremap.sh
Нарешті, додайте це до програми Statrtup вручну з графічного інтерфейсу або, якщо ви хочете, щоб це було з CLI, введіть текст нижче (змініть шляхи до вашого) в файл у вашому ~/.config/autostart
, ось мій ( less .config/autostart/leftmouseremap.sh.desktop
):
[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=
Майте на увазі, що для KDE шлях буде подібний ~/.kde/Autosart
, для інших менеджерів настільних ПК це може бути дещо іншим. Крім того, запуску запуску можна виконати із загальним підходом, використовуючи /etc/rc.local
.
Коли використовується чудова відповідь нульової ширини , деякі пристрої, наприклад, MX Ergo Logitech, відображаються як вказівник, так і пристрій клавіатури :
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech MX Ergo id=10 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=14 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
...
↳ Logitech MX Ergo id=15 [slave keyboard (3)]
Отже, grep "Logitech MX Ergo"
закінчується повернення двох значень. Останній в кінцевому підсумку включається в якості першого елемента в рядку зіставлення і вкручується всі ваші кнопки миші.
Виправити це просто - просто використовуйте grep
аргумент "максимальна кількість" -m 1
:
my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
Мені вдалося змінити відображення середньої кнопки миші Logitech на «Повернутись» за допомогою розпізнавання жестів Easystroke, яке я завантажив з програмного центру Ubuntu. Редагувати: У програмі ви виберете «Додати дію», «Назвіть це ім’я», виберіть тип клавіші, натисніть «Деталі» та натисніть клавішу Enter, натисніть «Запис обведення» та під час підказки натисніть середню кнопку.
xinput
кнопки, які не відображаються під час використання xinput list <devID>
.
До 12.04 в стандартному сховищі був простий графічний інструмент під назвою "btnx", який додався як "Властивості кнопки" в Конфігурації системи. На жаль, однак її відкинули. "Ненадійний" PPA, який зараз підтримується 14.04, 16.04 та 18.04, знаходиться тут: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (знайдений на веб- сайті https://launchpad.net/ubuntu/xenial/+source / btnx )
Він не буде інтегруватися з налаштуваннями системи, але працює на моєму ноутбуці за допомогою дешевої 5-кнопкової миші. Він також може перезавантажувати натискання клавіш і команди, і конфігурація набагато простіша, ніж будь-який інший метод!
У мене є HP elitebook 2570p HP, Ubuntu 18.04.2. Тут у мене є марна точка, яка є для мене марною, і ось дві непотрібні кнопки сліду під пробілом
Я не використовую ці клавіші, тому що у мене є під тачпада. Я хотів би перевстановити ці кнопки вліво = назад_ кнопка (Alt_L + ліворуч), права - = середня_маска_ кнопка. Точка доріжки в "xinput" - id = 11, а ліва кнопка - номер 1, права - 3.
Чи може хтось написати мені правильний код, щоб просто скопіювати в термінал? Я поєднував з xbindkeysrc, але це встановлює будь-яку дію на обидві кнопки (трекпойнт і тачпад)
sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'