Как привязать дополнительные кнопки мыши к модификаторам (Shift / Control)? [dубликат]

Использование:

## 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)
11
задан 13 April 2017 в 15:24

26 ответов

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

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

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

1. Сделать udev rules

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

Для мыши:

/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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

Вам необходимо установить библиотеку 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

5. Наслаждайтесь!

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

6. Экстра бесплатно

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

~/.xbindkeysrc --------------------------------------------- # Navigate between tabs with side wheel buttons "xdotool key ctrl+Tab" b:7 "xdotool key ctrl+shift+Tab" b:6 # Close tab with ctrl + right click # --clearmodifiers ensure that ctrl state will be # restored if button is still pressed "xdotool key --clearmodifiers ctrl+F4" control+b:3

. Для этого последнего объединения комбинаций библиотека python-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

7. Заключение

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

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

6
ответ дан 18 July 2018 в 01:39

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 18 July 2018 в 01:39

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

В любом случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 18 July 2018 в 01:39

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

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

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

1. Сделать udev rules

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

Для мыши:

/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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

Вам необходимо установить библиотеку 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

5. Наслаждайтесь!

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

6. Экстра бесплатно

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

~/.xbindkeysrc --------------------------------------------- # Navigate between tabs with side wheel buttons "xdotool key ctrl+Tab" b:7 "xdotool key ctrl+shift+Tab" b:6 # Close tab with ctrl + right click # --clearmodifiers ensure that ctrl state will be # restored if button is still pressed "xdotool key --clearmodifiers ctrl+F4" control+b:3

. Для этого последнего объединения комбинаций библиотека python-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

7. Заключение

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

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

6
ответ дан 24 July 2018 в 17:26
  • 1
    Большое спасибо за усилия и поделиться им с нами! +1 ... Хотя я еще не тестировал его. BTW, я почти отказался от этого - было бы здорово, если бы это работало, как ожидалось :) – conceptdeluxe 6 January 2016 в 17:39
  • 2
    Пожалуйста ! Для меня это работает безупречно. Если у вас есть проблемы, сообщите мне. Я пытаюсь сделать свой ответ полным, но поскольку я провел почти два дня, пытаясь заставить его работать, я, возможно, что-то забыл. Будем рады помочь / отредактировать мой пост. – Aurélien Cibrario 7 January 2016 в 11:37
  • 3
    Я просто понял, что ctrl + click1 был очень плохим выбором, чтобы закрыть вкладку, так как она открывает ссылку на новой вкладке. Я отредактировал мой ответ, удалив последнюю часть скрипта python и настроив xbindkeys, более чистое решение – Aurélien Cibrario 7 January 2016 в 12:21
  • 4
    просто хочу сообщить вам, что у меня не было времени проверить его, но я обязательно сделаю это принятым ответом, если он будет работать, как ожидалось, - извините за ожидание - я немного занят atm – conceptdeluxe 11 January 2016 в 21:14
  • 5
    Интересно, можем ли мы использовать вышеприведенный скрипт для отказа от неисправного переключателя мыши. У меня есть изношенная мышь. Я использую скрипт authotkey, чтобы исправить его в Windows, но нет никакого средства для его исправления в Linux. Вот сценарий Autohhotkey для исправления левой кнопки autohotkey.com/board/topic/63555-debounce-mouse-keys Я надеюсь, что кто-то поместит его в Linux с помощью python3 - evdev – kenn 20 November 2016 в 22:13

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 24 July 2018 в 17:26
  • 1
    Но это не мешает оригинальному событию стрелять. Поэтому, если я перехожу к кнопке 8 для переключения и удерживаю кнопку 8 в Firefox, она также пытается вернуться на предыдущую страницу, что нежелательно. – user23013 4 August 2017 в 16:24
  • 2
    Правда. Чтобы решить эту проблему, я использовал измененный идентификатор кнопки, которую меня интересовала используемая кнопка в xinput. См. Отредактированный вопрос. – Maxim 4 August 2017 в 16:51

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

В любом случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 24 July 2018 в 17:26
  • 1
    Большое спасибо за подробный ответ, который вы отправили в pastebin. Но я боюсь, что мне не разрешено использовать ненадежную ppa или создать приложение из неизвестного источника, не просмотрев его подробно на моем устройстве. Тем не менее я дам вам голосование за усилия, которые вы вложили в него. Кроме того, я рекомендую вам обновить свой ответ здесь и скопировать то, что вы там написали, поскольку эта информация может быть полезной для других, но может быть упущена. Наконец, я прочитал, что пакет может даже не компилироваться под Ubuntu или Debian - вы на самом деле пытались это сделать? – conceptdeluxe 24 May 2015 в 18:47
  • 2
    Btw: вы можете получить дополнительную 100 репутацию легко, связав свою учетную запись askubuntu с другими учетными записями Stack Exchange, например, например. Linux & amp; Unix. – conceptdeluxe 24 May 2015 в 18:59
  • 3
    Да, я тестировал его под Ubuntu 14.04. Я сделал правую кнопку мыши, чтобы отправить контрольный ключ и подтвердил, что он работал до публикации. И тогда почти оставил пост из-за требования к репутации. – Stephen 24 May 2015 в 19:30

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 31 July 2018 в 20:31

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 31 July 2018 в 20:31

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 31 July 2018 в 20:31

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 2 August 2018 в 13:34

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 2 August 2018 в 13:34

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 2 August 2018 в 13:34

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 3 August 2018 в 17:47

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 3 August 2018 в 17:47

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 3 August 2018 в 17:47

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 5 August 2018 в 02:57

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 5 August 2018 в 02:57

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 5 August 2018 в 02:57

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 6 August 2018 в 19:46

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 6 August 2018 в 19:46

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 6 August 2018 в 19:46

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 9 August 2018 в 00:14

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 9 August 2018 в 00:14

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

Во всяком случае, я нашел сообщение на форуме, похожее на ваш вопрос, для которого был ответ на установку 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 -
2
ответ дан 9 August 2018 в 00:14

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

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

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

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

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

Для мыши:

/etc/udev/rules.d/93-mxmouse.conf.rules
------------------------------------------------------------
KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

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

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

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

Для uinput:

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

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

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

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

sudo modprobe uinput

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

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

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

sudo groupadd mxgrabber

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

sudo usermod -aG mxgrabber your_login

4. Python script

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

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

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. Наслаждайтесь!

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

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

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

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

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

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

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

7. Заключение

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

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

6
ответ дан 14 August 2018 в 14:23
  • 1
    Большое спасибо за усилия и поделиться им с нами! +1 ... Хотя я еще не тестировал его. BTW, я почти отказался от этого - было бы здорово, если бы это работало, как ожидалось :) – conceptdeluxe 6 January 2016 в 17:39
  • 2
    Пожалуйста ! Для меня это работает безупречно. Если у вас есть проблемы, сообщите мне. Я пытаюсь сделать свой ответ полным, но поскольку я провел почти два дня, пытаясь заставить его работать, я, возможно, что-то забыл. Будем рады помочь / отредактировать мой пост. – Aurélien Cibrario 7 January 2016 в 11:37
  • 3
    Я просто понял, что ctrl + click1 был очень плохим выбором, чтобы закрыть вкладку, так как она открывает ссылку на новой вкладке. Я отредактировал мой ответ, удалив последнюю часть скрипта python и настроив xbindkeys, более чистое решение – Aurélien Cibrario 7 January 2016 в 12:21
  • 4
    просто хочу сообщить вам, что у меня не было времени проверить его, но я обязательно сделаю это принятым ответом, если он будет работать, как ожидалось, - извините за ожидание - я немного занят atm – conceptdeluxe 11 January 2016 в 21:14
  • 5

Я нашел решение с 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, сценарий, описанный выше.

2
ответ дан 14 August 2018 в 14:23
  • 1
    Но это не мешает оригинальному событию стрелять. Поэтому, если я перехожу к кнопке 8 для переключения и удерживаю кнопку 8 в Firefox, она также пытается вернуться на предыдущую страницу, что нежелательно. – user23013 4 August 2017 в 16:24
  • 2
    Правда. Чтобы решить эту проблему, я использовал измененный идентификатор кнопки, которую меня интересовала используемая кнопка в xinput. См. Отредактированный вопрос. – Maxim 4 August 2017 в 16:51

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

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