Использование:
## testing
apt-add-update enable|disable default|security|updates|proposed|backports [file]
## real
sudo apt-add-update enable|disable default|security|updates|proposed|backports
Использование:
Я проанализировал файл, потому что сам искал некоторые другие варианты.
Проверяет, является ли какое-либо зеркало, официальное, включая (старые версии, порты) или другие зеркала, предоставленные сообществом, загруженным из пакета python-apt (он содержит файл со всеми зеркалами)./usr/share/python-apt/templates/Ubuntu.mirrors
Всегда сохраняйте официальный URI в файле. Таким образом, даже если все отключены, он сохранит прокомментированную строку для настройки настойчивости. Он разрешает строки до минимума с помощью типа алфавитной сортировки, url, dist, comp. Печатает на stdout, если он получает входной файл в качестве третьего аргумента или нет разрешения на запись /etc/apt/sources.list Не поддерживает [ options ], как [ arch=amd64 ]. Выпало disable default, которое я обязую пользователю указать, что отключить. Мне не нравится последний вариант (9), потому что я специально настраиваю репо. Поэтому их следует рассматривать как сторонние репозитории. Загрузить: с полным набором тестов.
https://github.com/sneetsher/au_700860_apt_channels
Загрузить:
#!/usr/bin/python3
import sys,os
import re
## official repo's
#http://ports.ubuntu.com/ubuntu-ports/
#http://old-releases.ubuntu.com/ubuntu/
#http://security.ubuntu.com/ubuntu/
#http://archive.ubuntu.com/ubuntu/
repo_official_uri_re = re.compile(r"\A(http|ftp)://(([a-zA-Z]*.)?archive|security|old-releases|ports).ubuntu.com/ubuntu(-ports)?[/]?\Z")
## load other mirrors
mirrors=[]
mir_re = re.compile(r"\A(http|ftp)://")
with open("/usr/share/python-apt/templates/Ubuntu.mirrors","r") as f:
for l in f:
if mir_re.match(l):
mirrors.append(l.strip())
f.close()
#print(mirrors)
## system release
with open("/etc/lsb-release","r") as f:
for l in f:
k,v=l.split("=")
if k=="DISTRIB_CODENAME":
release = v.strip()
break
#print(release)
f.close()
## load sources.list
##TODO: missing support deb line options like [ arch=whatever ]
emp_re = re.compile(r"\A\s*\Z")
repo_re = re.compile(r"\A#* *deb(-src)? *(http://|ftp://|file://|cdrom:)")
com_re = re.compile(r"\A#")
repo_details_re = re.compile(r"\A(?P<active>#*) *(?P<type>deb(-src)?) *(?P<uri>(http://|ftp://|file://|cdrom:\[[a-zA-Z0-9 \-_().]*\])?\S*) (?P<dist>[a-zA-Z\-_]*) (?P<comp>[a-zA-Z ]*\Z)")
##example
sources={
"http://archive.ubuntu.com/ubuntu/":{
"active":True,
"deb":{
"wily":["universe","multiverse","restricted","main"],
"wily-security":["main","restricted","universe","multiverse"]
},
"deb-src":{
"wily":["universe","multiverse","restricted","main"]
},
"mirror":True
}
}
sources={}
uri=""
##for testing
if len(sys.argv)>=4 and os.path.isfile(sys.argv[3]):
ifile = sys.argv[3]
else:
ifile = "/etc/apt/sources.list"
with open(ifile, "r") as f:
for l in f:
l=l.strip()
r = emp_re.match(l)
if r:
continue
else:
#print("raw:",l)
r = repo_re.match(l)
if r:
#print("repository:",l)
r = repo_details_re.match(l)
#print(r.groupdict())
uri=r.group("uri")
if uri[-1]!="/":
uri += "/"
if (uri not in sources):
sources[uri] = {"active":False,"deb":{},"deb-src":{},"mirror":False}
m = repo_official_uri_re.match(uri)
if m or uri in mirrors:
sources[uri]["mirror"] = True
if r.group("active")=="":
sources[uri]["active"]=True
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
else:
if r.group("active")=="" and sources[uri]["active"]==False:
sources[uri]["active"]=True
sources[uri]["deb"]={}
sources[uri]["deb-src"]={}
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
if (r.group("active")=="")==sources[uri]["active"]:
if r.group("dist") not in sources[uri][r.group("type")]:
sources[uri][r.group("type")][r.group("dist")]=r.group("comp").split()
else:
for c in r.group("comp").split():
if c not in sources[uri][r.group("type")][r.group("dist")]:
sources[uri][r.group("type")][r.group("dist")].append(c)
else:
r = com_re.match(l)
if r:
#print("comment",l)
continue
else:
print("unknown",l)
#print(sources)
f.close()
## process argumments
#fallback for default component to be copied from
comp=[release+"-security",release+"-update",release+"-proposed"]
found_other_comp=False
if sys.argv[2]=="default" and sys.argv[1]=="enable":
for u in sorted(sources.keys()):
if sources[u]["mirror"]:
if sources[u]["active"]:
for t in ["deb","deb-src"]:
if release not in sources[u][t]:
for d in range(len(comp)):
if comp[d] in sources[u][t]:
other_comp_found=True
for i in range(d):
sources[u][t][comp[i]]=sources[u][t][comp[d]]
sources[u][t][release]=sources[u][t][comp[d]]
###don't activate any thing if commented like an empty file.
#if not found_other_comp and t=="deb":
# sources[u][t][release]=["main"]
#else:
# sources[u]["active"]=True
# sources[u]["deb"]={release:["main"]}
# sources[u]["deb-src"]={}
## carry on enable security
sys.argv[2] = "security"
if sys.argv[2]=="security" or sys.argv[2]=="updates" or sys.argv[2]=="proposed" or sys.argv[2]=="backports":
for u in sorted(sources.keys()):
if sources[u]["mirror"] and sources[u]["active"]:
if sys.argv[1]=="disable":
if len(sources[u]["deb"])+len(sources[u]["deb-src"])>(release+"-"+sys.argv[2] in sources[u]["deb"])+(release+"-"+sys.argv[2] in sources[u]["deb-src"]):
if release+"-"+sys.argv[2] in sources[u]["deb"]:
del sources[u]["deb"][release+"-"+sys.argv[2]]
if release+"-"+sys.argv[2] in sources[u]["deb-src"]:
del sources[u]["deb-src"][release+"-"+sys.argv[2]]
else:
sources[u]["active"] = False
elif sys.argv[1]=="enable":
for t in ["deb","deb-src"]:
if release in sources[u][t]:
if release+"-"+sys.argv[2] not in sources[u][t]:
sources[u][t][release+"-"+sys.argv[2]]=sources[u][t][release]
else:
for c in sources[u][t][release]:
if c not in sources[u][t][release+"-"+sys.argv[2]]:
sources[u][t][release+"-"+sys.argv[2]].append(c)
## generate the new list
data_out=""
for u in sorted(sources.keys()):
#print(u)
for t in ["deb","deb-src"]:
for d in sorted(sources[u][t].keys()):
data_out += (not sources[u]["active"])*"#"+" ".join([t,u,d,""])+" ".join(sorted(sources[u][t][d]))+"\n"
if len(sys.argv)>=4 or not os.access("/etc/apt/sources.list", os.W_OK):
print(data_out)
else:
with open("/etc/apt/sources.list","w") as f:
f.write(data_out)
f.close()
sys.exit(0)
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не идеально с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно приятны, как и предлагаемые здесь, но всегда страдают от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из приведенной выше ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, чтобы кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ , как тот, который предлагается здесь , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Вот подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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.
Чтобы найти информацию о вашем оборудовании, вы должны запустить что-то вроде
udevadm info -a -n /dev/input/eventX
Для мыши :
/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"
Нет необходимости в symlink, uinput всегда будет находиться в $/dev/uinput или $/dev/input/uinput в зависимости от системы, в которой вы находитесь. Просто дайте ему группу и права читать и писать, конечно.
Вам нужно отключить - подключите вашу мышь, и новая ссылка должна появиться в / dev. Вы можете заставить udev инициировать ваши правила с помощью $udevadm trigger
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или независимо от того, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку python-uinput (очевидно) и библиотеку python-evdev. Используйте пип или ваш дистрибутив.
Скрипт довольно прост, вам просто нужно идентифицировать кнопку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Возможно, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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-uinput , в противном случае будут по-прежнему захватываться 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
Как я уже сказал в начале, я не совсем доволен тем, что мне приходится давать себе права писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из кнопок мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
В любом случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: http://ubuntuforums.org/showthread.php?t=1245930
доступен источник:
https://github.com/cdobrich/btnx https://github.com/cdobrich/btnx-configВы можете скомпилировать его из источника, но это будет помещать файлы в вашу систему, которые менеджер пакетов не может поддерживать.
А именно, следующие файлы:
/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 -
У этого есть отдельный инструмент настройки GUI. Получите зависимости для него:
sudo apt-get install libgtk2.0-dev libglade2-dev
Теперь получите и скомпилируйте инструмент настройки gui:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не идеально с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно приятны, как и предлагаемые здесь, но всегда страдают от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из приведенной выше ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, чтобы кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ , как тот, который предлагается здесь , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Вот подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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.
Чтобы найти информацию о вашем оборудовании, вы должны запустить что-то вроде
udevadm info -a -n /dev/input/eventX
Для мыши :
/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"
Нет необходимости в symlink, uinput всегда будет находиться в $/dev/uinput или $/dev/input/uinput в зависимости от системы, в которой вы находитесь. Просто дайте ему группу и права читать и писать, конечно.
Вам нужно отключить - подключите вашу мышь, и новая ссылка должна появиться в / dev. Вы можете заставить udev инициировать ваши правила с помощью $udevadm trigger
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или независимо от того, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку python-uinput (очевидно) и библиотеку python-evdev. Используйте пип или ваш дистрибутив.
Скрипт довольно прост, вам просто нужно идентифицировать кнопку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Возможно, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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-uinput , в противном случае будут по-прежнему захватываться 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
Как я уже сказал в начале, я не совсем доволен тем, что мне приходится давать себе права писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из кнопок мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
В любом случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: http://ubuntuforums.org/showthread.php?t=1245930
доступен источник:
https://github.com/cdobrich/btnx https://github.com/cdobrich/btnx-configВы можете скомпилировать его из источника, но это будет помещать файлы в вашу систему, которые менеджер пакетов не может поддерживать.
А именно, следующие файлы:
/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 -
У этого есть отдельный инструмент настройки GUI. Получите зависимости для него:
sudo apt-get install libgtk2.0-dev libglade2-dev
Теперь получите и скомпилируйте инструмент настройки gui:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
У меня есть частичное решение. Я не понял, как разблокировать существующую кнопку, поэтому вы получаете нажатие кнопки и требуемый модификатор. Поэтому, если эта кнопка мыши имеет какую-то существующую цель, она все равно срабатывает. Например, переназначение правой кнопки мыши на управляющий ключ приведет к отправке элемента управления +.
Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку btnx и настройте свои модификаторы. Кажется, btnx больше не доступен через репо. Существует ppa, но он не работает для последней ubuntu.
Сообщение в форуме: post: 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:
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 -
Я потратил много времени, пытаясь сделать эту обязательную работу. В итоге я нашел решение, которое сложно, но работает хорошо и не подразумевает стороннее программное обеспечение. Я разделяю его здесь, надеясь, что это поможет людям. Кроме того, я знаю, что это не является совершенным с точки зрения безопасности, поэтому любая конструктивная обратная связь более чем приветствуется.
Есть решения, которые действительно хороши, , как предложенный здесь но он всегда страдает от ограничения xbindkeys, которые захватывают всю мышь, делая модификаторы + отображение щелчка мыши неопределенным. Кроме того, решение на основе guile из вышеприведенной ссылки использует ctrl + plus / ctrl + минус, который не распознается Gimp, например.
Я понял, что мы хотим, это кнопка мыши, которая действует как клавиатура , поэтому я использовал uinput, к которому можно получить доступ через python , написал сценарий, который отслеживает / dev / my-mouse для нажатия кнопки большого пальца и передает ключ ctrl на виртуальную клавиатуру. Ниже приведены подробные шаги:
Мы хотим, чтобы устройства были доступны (права и местоположение).
Для мыши:
/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
sudo modprobe uinput
И сделать его загружаемым:
/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput
sudo groupadd mxgrabber
Или все, что вы назвали вашей группой доступа. Тогда вы должны добавить себя к этому:
sudo usermod -aG mxgrabber your_login
Вам необходимо установить библиотеку 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
Теперь вам нужно сделать исполняемый файл python и попросить менеджера вашего рабочего стола загрузить файл при запуске. Может быть, также бокал вина, чтобы отпраздновать хорошую работу!
Я использую 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
Как я уже сказал в начале, я не совсем доволен тем, что я должен дать себе право писать в / dev / uinput, даже если это считается группой «mxgrabber». Я уверен, что есть более безопасный способ сделать это, но я не знаю, как это сделать.
С яркой стороны это работает действительно, очень хорошо. Любая комбинация клавиш клавиатуры или мыши, как работает с кнопкой Ctrl на клавиатуре, теперь работает с одной из мыши!
Я нашел решение с 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 & amp;
Примечание. это не препятствует запуску события кнопки мыши. В моем случае я использовал 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
, сценарий, описанный выше.
xinput
. См. Отредактированный вопрос.
– Maxim
4 August 2017 в 16:51