xbindkey를 사용하여 수정 자 (예 : CTRL)를 마우스 썸 버튼에 매핑하는 방법


13

이 질문은 이미 요청되었지만 제대로 답변되지 않았습니다. @ Seth와의 정리 후 이제 다시 묻습니다. 이렇게하면 질문에 훨씬 쉽게 응답하고 수정할 수 있습니다. 원래 질문은 여기에서 찾을 수 있습니다.

Ctrl 및 Alt를 마우스 썸 버튼에 매핑


발행물:

사용하여 마우스 버튼에 모든 키 입력을 매핑 할 매우 간단하지만 xbindkeys와 함께 xdotool또는 xte(예를 들어, 그것은 수정 자 키를 매핑 할 훨씬 더 문제가 보인다 ALT , CTRL , SHIFT 그것에 등).

최종 soloution은 마우스만으로 CTRL + 클릭 (예 : 목록의 여러 항목을 선택 하는 경우)을 허용해야합니다 .

이 문제를 해결하기위한 몇 가지 가능한 접근 방법은 Stack Exchange와 다른 Linux 관련 포럼에서 찾을 수 있습니다. 그러나 다른 문제와 부작용으로 이어질 것으로 예상되는대로 작동하지 않습니다.

노트:

아래 예 중 일부는 Guile with Scheme 구문을 사용하고 .xbindkeysrc.scm파일을 사용하는 반면 다른 일부는 해당 구문을 사용하여 파일을 사용 .xbindkeysrc합니다. 나는 그들이 함께 작동하지 않는다는 것을 알고 있습니다.

또한 아래 스 니펫은 의지 xdotool에만 의존 하지만 예 xte를 들어 다른 응용 프로그램과 관련된 접근 방식에도 개방적입니다. 두 가지 모두 동일한 결과를 초래하므로 xdotool여기에서 조치를 사용하고 있습니다.

접근법 A :

다음을 사용하여 .xbindkeysrc파일 업데이트

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

그것이 처음에 시도한 것이지만 수정자가 보류되어 해제 할 수 없다는 부작용이 있습니다.

접근법 B :

다음을 사용하여 .xbindkeysrc.scm파일 업데이트

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

에서 발견 http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html 및 방법에서 설명한 바와 같이 개질제 (유지되고있는 문제를 해결하기위한 시도 ㅏ).

엄지 버튼을 누르고있는 동안 다른 마우스 클릭을 수행 할 수 없으므로 부분적으로 만 작동하도록 수정되었습니다.

접근법 C :

다음을 사용하여 .xbindkeysrc파일 업데이트

"xdotool keydown ctrl"
  b:8

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

askubuntu에서 연결된 질문의 OP로 시도했습니다. 수정 자 상태를 포함하지 않으므로 훨씬 간단하고 견고합니다. 그럼에도 불구하고 문제는 여전히 남아 있습니다. 즉 CTRL + 클릭 이 불가능합니다.

xbindkeys클릭을 인식하지만 실행하지는 않으므로 여기에서 문제가되는 것 같습니다 . 이것은 xev | grep buttonand를 사용하여 테스트 할 수 있습니다 xbindkeys -v.

기록 된 일반적인 마우스 클릭 xev은 다음과 같아야합니다.

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

엄지 버튼뿐만 아니라 :

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

그러나 위의 xbindkeys구성을 활성화하면 아무것도 기록되지 않습니다. 썸 버튼이 CTRL에 매핑되어 더 이상 마우스 버튼이 아니기 때문에 썸 버튼이 의미가 있지만 버튼 1 도 기록되지 않는 것이 이상합니다 . 이것은 xbindkeys실행하지 않지만 자체 인식하기 때문에 가능합니다.

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

접근법 D :

다음을 사용하여 .xbindkeysrc파일 업데이트

"xdotool keydown ctrl"
  b:8

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

"xdotool click 1"
  b:1

너무 간단하지만 ... 클릭의 무한 루프로 이어집니다.


최신 정보:

그 동안 Logitech G502를 구입하고 Windows에서 드라이버를 통해 구성한 후에는 프로필 자체가 장치 메모리에 저장 될뿐만 아니라 실제 키 누름이 마우스로 수행되는 것을 알 수있었습니다. 그것은 실제로 리눅스에서 내 문제를 해결했습니다!

내가 할 수 있었던 유일한 다른 마우스는 당시 Razer Copperhead였습니다. 그러나 오늘도 동일한 마우스를 사용할 수있는 다른 마우스가 있다고 생각합니다.


1
다음은 Easystroke를 사용하는 솔루션입니다. askubuntu.com/a/1010647/27202
atti

답변:


8

나는 그 구속력있는 일을하려고 많은 시간을 보냈다. 결국 복잡하지만 잘 작동하며 타사 소프트웨어를 암시하지 않는 솔루션을 찾았습니다. 사람들에게 도움이되기를 바랍니다. 게다가, 이것이 보안 측면에서 완벽하지는 않다는 것을 알고 있으므로 건설적인 피드백은 환영 이상입니다.

여기제안 된 것과 같이 정말 좋은 솔루션이 있지만 항상 마우스 전체를 잡는 xbindkeys의 한계로 인해 modifers + 마우스 클릭 매핑이 불확실합니다. 또한 위 링크의 guile 기반 솔루션은 예를 들어 Gimp가 인식하지 못하는 ctrl + plus / ctrl + 빼기를 사용합니다.

우리가 원하는 것은 키보드 역할을하는 마우스 버튼이라는 것을 알았으므로 python을 통해 액세스 할 수있는 uinput을 사용 하여 엄지 버튼 클릭을 위해 / 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. 파이썬 스크립트

당신은 설치해야 파이썬 uinput 라이브러리 (명백하게)과 파이썬 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. 즐기십시오!

이제 필요한 것은 파이썬 파일을 실행 가능하게 만들고 시작시 파일을로드하도록 데스크톱 관리자에게 요청하십시오. 아마 좋은 일을 축하하기 위해 와인 한 잔!

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. 결론

처음에 말했듯이, "mxgrabber"그룹이라고 생각 되더라도 / dev / uinput에 쓸 수 있도록 라이트를 스스로에게 제공해야한다는 사실에 완전히 만족하지 않습니다. 더 안전한 방법이 있다고 확신하지만 방법을 모르겠습니다.

밝은면에서는 정말 잘 작동합니다. 키보드의 Ctrl 버튼으로 작동하는 키보드 또는 마우스 키 조합은 이제 마우스 중 하나와 작동합니다 !!


노력해 주셔서 감사합니다. +1 ... 아직 테스트하지는 않았습니다. BTW 나는 거의 이것을 포기했다
그것이

천만에요 ! 나를 위해, 그것은 완벽하게 작동합니다. 문제가 있으면 알려주세요. 나는 대답을 완성하려고 노력하지만, 거의 이틀 동안 그것을 작동 시키려고 노력하면서 무언가를 잊었을 수 있습니다. 내 게시물을 도와 주거나 수정하게되어 기쁩니다.
Aurélien Cibrario

방금 ctrl + click1이 새 탭에서 링크를 열기 때문에 탭을 닫는 것이 매우 나쁜 선택임을 깨달았습니다. 나는 파이썬 스크립트의 마지막 부분을 제거하고 xbindkeys으로 조정, 청소기 솔루션 내 대답을 편집
오렐리 Cibrario

아직 테스트 할 시간이 없었다는 사실을 알려 드리고 싶지만 예상대로 작동하는 경우 허용 된 답변으로 작성하겠습니다. 잠시 기다려 죄송합니다. 조금 바빠요.
conceptdeluxe

위의 스크립트를 사용하여 잘못된 마우스 스위치를 디 바운싱 할 수 있는지 궁금합니다. 마우스가 닳았습니다. Windows에서는 autohotkey 스크립트를 사용하여 문제를 해결하지만 Linux에서는이를 수정하는 도구가 없습니다. 여기 Autohhotkey 스크립트는 왼쪽 버튼 수정을위한 autohotkey.com/board/topic/63555-debounce-mouse-keys evdev - 내가 python3 사용하여 Linux에 누군가 포트를 희망

4

PyUserInput 솔루션을 찾았습니다 . 이것은 매우 간단하고 관리 권한이 필요하지 않습니다. python 2와 PyUserInput이 설치된 상태에서 다음 스크립트를 사용했습니다.

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

스크립트에 실행 권한을 부여 후, 나는에서 선으로 전화를 ~/.xsessionrc예를 들면,

~ / path / to / script.py &

참고 . 이것은 마우스 버튼 이벤트가 발생하는 것을 막지 않습니다. 필자의 경우 xinput set-button-mapxinput 버튼 매핑을 변경하고 사용하지 않은 버튼에 관심있는 버튼 수를 할당했습니다.

예를 들어, 마우스에서 버튼 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은 OS에 의미가 없으며 위에서 설명한 스크립트의 버튼 12에 사용자 정의 기능을 할당합니다 .xbuttonmodifier.py.


그러나 원래 이벤트가 실행되는 것을 막지는 않습니다. 따라서 버튼 8을 Shift로 매핑하고 Firefox에서 버튼 8을 누르고 있으면 이전 페이지로 돌아 가려고하지만 바람직하지 않습니다.
user23013

1
진실. 이 문제를 해결하기 위해에 사용 된 버튼의 관심있는 버튼의 ID를 변경했습니다 xinput. 편집 된 질문을 참조하십시오.
Maxim

2

부분적인 해결책이 있습니다. 기존 버튼을 매핑 해제하는 방법을 알지 못했기 때문에 버튼 클릭과 원하는 수정자가 생깁니다. 따라서 해당 마우스 버튼에 기존 목적이있는 경우에도 여전히 작동합니다. 예를 들어, 마우스 오른쪽 버튼을 컨트롤 키에 다시 매핑하면 컨트롤 + 클릭이 전송됩니다.

어쨌든, btnx를 설치하고 수정자를 구성하는 질문과 유사한 포럼 게시물을 찾았습니다. btnx는 더 이상 repo를 통해 사용할 수없는 것 같습니다. ppa가 있지만 최신 우분투에서는 작동하지 않습니다.

포럼 게시물 : 게시물 : 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

소스에서 아무것도 만들지 않았다면 빌드 필수가 필요할 수도 있습니다.

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

마우스 버튼 감지를 클릭하십시오. 도구를 사용하는 동안 지시를 읽으려면 팝업 창 크기를 조정하십시오. 그렇지 않으면 대화 상자 텍스트가 나중에 잘리고 감지 중에 크기 조정을 시도하면 취소됩니다 탐지. 창을 조금 크게 만드십시오.

Press를 클릭하여 마우스 감지를 시작한 다음 텍스트가 변경 될 때까지 마우스를 움직이지 마십시오 ... 5-10 초 정도 걸립니다. 텍스트가 변경됩니다. 메시지가 표시되면 내용을 무시하고 전달을 클릭하십시오.

"누르면 버튼 감지 시작"버튼을 클릭하십시오

여기에서 마우스의 버튼 하나를 여러 번 클릭합니다 (상태 표시 줄이 채워질 때까지). 그런 다음 단추 이름을 나중에 인식 할 수있는 이름으로 설정하십시오 (예 : LeftButton) 추가 단추를 클릭하십시오.

각 마우스 버튼에 대해이 작업을 반복하십시오 (스크롤 휠, 스크롤 클릭 등을 잊지 마십시오). 다시 매핑하지 않으려는 버튼은 건너 뛸 수 있습니다.

모든 버튼을 추가했으면 확인을 클릭하십시오.

메인 GUI에서 버튼을 클릭하고 왼쪽 창에서 다시 매핑하려는 버튼을 선택하십시오. 이전 단계에서 입력 한 이름을 사용합니다. 목적에 따라 오른쪽의 키 조합에서 키 수정 자만 선택하려고합니다.

이 화면에서 삭제를 클릭하지 않으면 버튼이 제거됩니다. 다시 돌아가서 버튼을 다시 감지해야합니다.

구성 화면으로 돌아가서 btnx 재시작을 클릭하십시오.

새로운 버튼을 사용해보십시오.

응용 프로그램을 설치 제거하려면 btnx 프로그램을 중지 한 후 해당 git 체크 아웃 디렉토리로 이동하여 설치 제거하십시오.

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -

2
pastebin에 게시 한 자세한 답변에 감사드립니다. 그러나 신뢰할 수없는 PPA를 사용하거나 내 장치에서 자세히 검토하지 않고 알 수없는 소스에서 응용 프로그램을 빌드 할 수 없다는 것이 두려워 있습니다. 그럼에도 불구하고 나는 당신이 그 노력에 대해 투표를 할 것입니다. 그 외에도이 정보가 다른 사람에게 도움이 될 수 있지만 간과 될 수 있으므로 여기에서 답변을 업데이트하고 여기에 작성한 내용을 복사하는 것이 좋습니다. 마지막으로 우분투 또는 데비안에서 패키지가 컴파일되지 않을 수도 있다는 것을 읽었습니다. 실제로 시도해 보셨습니까?
conceptdeluxe

Btw : askubuntu 계정을 Linux 및 Unix와 같은 다른 Stack Exchange 계정과 연결하면 쉽게 100 점의 평판을 얻을 수 있습니다.
conceptdeluxe

예, 우분투 14.04에서 테스트했습니다. 마우스 오른쪽 버튼으로 컨트롤 키를 보내고 게시하기 전에 작동하는지 확인했습니다. 그런 다음 평판 요구 사항으로 인해 게시물을 거의 포기했습니다.
Stephen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.