시작할 때 마우스의 버튼을 자동으로 다시 매핑하려면 어떻게합니까?


30

나는 주말 동안 이것으로 어려움을 겪었고 마우스 버튼을 다시 매핑해야합니다.

답변:


47

9 개의 버튼이있는 Logitech 마우스가 있는데 "중간 버튼"(# 2)을 누르면 스크롤 휠을 클릭합니다. 나는 어색하고 일반적으로 바퀴를 클릭하려고 할 때 나는 창을 스크롤하기 때문에 이것을 싫어합니다. 그래서 상단 버튼 (이 경우 # 9)을 중간 버튼 (# 2)에 자동으로 다시 매핑하고 싶었습니다. 또한 왼쪽 버튼 (# 1)을 두 번 클릭 할 수 있도록 아래쪽 버튼 (# 8)을 매핑하고 싶었습니다.

내 목표는 구체적이지만 아래 솔루션은 시작할 때 마우스 버튼을 자동으로 다시 매핑하려는 모든 상황으로 일반화 될 수 있습니다.

마우스 버튼을 다른 마우스 버튼에 매핑

xinput이 작업을 설치 해야합니다 . 이것은 전적으로 .xsessionrc파일 에서 수행 할 수 있습니다 . 먼저, xinput마우스에 지정된 이름을 찾은 다음이를 사용하여 입력 장치 ID와 상관시킵니다. 아래는 내 랩탑에서 출력 된 샘플입니다.

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

마우스가 스스로 호출 Logitech USB Laser Mouse하고로 표시됩니다 id=11. 마우스의 이름이 다릅니다. 독자를위한 연습으로 남겨둔다는 것을 알았습니다.

세션 에서 장치의 ID를 여전히 알고있는 동안을 사용하여 입력 핸들러가 마우스에있는 버튼 수를 확인하십시오 . 장치에 표시되는 버튼 수와 다를 수 있습니다.xinput list deviceID

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

내 마우스에는 9 개의 명백한 물리적 버튼이 있지만 xinput16은보고됩니다.

USB의 특성상이 ID는 다시 시작할 때마다 변경 될 수 있으므로 한 번 발견 한 ID에 정적으로 입력 된 것을 스크립팅하는 것만으로는 충분하지 않습니다. 시작시이를 동적으로 구문 분석하고 현재 ID를 기반으로 다시 매핑을 실행해야합니다.

이제 이름을 알았 xinput test으므로 다시 매핑 할 키를 알아낼 수 있습니다 . 색인을 가져 오려면 맵핑하려는 마우스 단추를 누르십시오. 참고로 1, 2 및 3 "항상"(즉, 일반적으로)은 3 버튼 마우스의 왼쪽, 가운데 및 오른쪽 버튼을 나타냅니다. 공통 재 맵핑은 마우스를 왼손잡이로 만듭니다. )

button press   2
button release 2
button press   9
button release 9

이 경우 버튼 # 9 (측면, 상단)를 버튼 # 2 (중간)에 매핑하려고합니다.

마우스가 무엇인지, 어떤 버튼을 변경하고자하는지 알았 ~/.xsessionrc으므로 xinput시작시 버튼 다시 매핑을 실행 하는 스크립트를 작성할 수 있습니다 . 아래는 내 완전한 스크립트입니다.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

여기서 첫 번째 줄은에서보고 한대로 마우스의 ID와 동일한 임시 세션 변수를 설정합니다 xinput. 이것은에 의해 수행 grep에서 보고서에서 마우스의 알려진 이름을 보내고 xinput다음 사용하여, sed그에서 ID 번호 추출 id=xxx보고서에 토큰을. 그런 다음이 값은 xinput set-button-map지시문 에서 사용되어 다시 매핑을 실행합니다. 위의 예에서 유일한 변경 사항은 버튼 # 9가 버튼 # 2를 모방하도록 다시 매핑되고 있다는 것입니다. 다른 모든 설정은 기본 설정으로 유지됩니다.

업데이트 : @Lokasenna가 아래에 지적한 것처럼 장치 자체가 마우스와 키보드로보고되면 grep사용 결과를 제한해야 할 수도 있습니다 -m 1.

임의의 기능에 마우스 버튼 매핑

이 답변 도 참조하십시오 .

당신이 필요합니다 xinput, xbindkeys그리고 xautomation(포함 xte)이 작업을 위해 설치.

xinput listxinput test을 사용 하여 마우스의 장치 ID와 할당하려는 버튼 번호를 찾으십시오. 필자의 경우 하단 버튼 (# 8)을 왼쪽 버튼 (# 1)을 두 번 클릭하여 매핑하려고했습니다.

작성 또는 편집하십시오 ~/.xbindkeysrc. 이 파일의 형식은 일련의 짝을 이루는 줄입니다. 첫 번째 줄은 이벤트에 대해 실행되는 명령입니다. 두 번째 줄은 이벤트 설명입니다. 의 xte구성 요소를 사용하여 xautomation이벤트를 입력 핸들러로 직접 보냅니다.

버튼을 놓을 때 더블 클릭 이벤트를 만들려면 다음을 추가했습니다.

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

이 구성은 버튼 # 1에서 두 번의 마우스 클릭 순서를 버튼 # 8의 릴리스로 매핑합니다. (이론적으로 모든 명령을 마우스 버튼에 매핑 할 수 있다고 생각 하지만 가장 일반적인 경우입니다. 다른 실제 예는 이 답변 을 참조하십시오 .)

16.04 우분투 업데이트

시스템에 여러 개의 마우스가 연결된 사용자의 경우 장치의 ID도 전달해야합니다. 이것은 모든 사용자에게 적용되지 않을 수 있으며 Unity와 함께 Ubuntu 16.04에서 발견되었습니다.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

그런 다음 명령 출력 (이 예에서는 id = 9)에서 id = 값을 참조하여 .xbindkeysrc 파일을 수정하십시오.

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

7
정보 주셔서 감사합니다. 장치의 단어 수에 따라 awk가 변경되어야하는 것처럼 보입니다. 내가 사용sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

xinput 테스트 엄지 키에 따르면 세 가지 다른 키 누름이 발생합니다. .xbindkeysrc에서 모두 결합하는 방법은 무엇입니까?
axltop

@ jbo5112 방금 업무용 랩톱에서 여러 마우스를 사용하기 시작했으며 귀하의 의견을 다시 확인할만한 좋은 이유가있었습니다. 나는 나의 예에서 나의 이전 awk진술을 귀하의 sed진술 로 대체했습니다 . 개선 주셔서 감사합니다!
zerobandwidth

2
set-button-map에서 id를 사용할 필요는 없습니다. 예 :xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

비정상적인 문제 : 다음 xinput과 같이 마우스를 두 번 표시합니다 : ↳ USB OPTICAL MOUSE id = 12 [슬레이브 포인터 (2)] ↳ USB OPTICAL MOUSE id = 13 [슬레이브 포인터 (2)] ID 13 만 명령을 사용 xinput test합니다. 스크립트는 항상 첫 번째 ID를 포착합니다. 그런데 왜 어쨌든 두 번입니까? 이 마우스를 분리하면 사라지고 연결되면 다시 나타납니다.
w-sky

6

이를위한 짧은 단계는 다음과 같습니다.

라는 유틸리티가 xinput있습니다. xinput list또는 xinput모든 X 입력 장치와 해당 ID를 표시합니다. 여기에 다시 매핑하려는 마우스의 ID가 있습니다.

설정에서 21로 ID를 예로 사용하고 xinput --get-button-map 21출력합니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

예를 들어 왼쪽 및 오른쪽 버튼을 바꾸려면 간단히 실행하십시오.

xinput --set-button-map 21 3 2 1

여기서 우리는 다시 매핑이 완료되었습니다.

시작할 때 실행하려면 파일에 넣으십시오.

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

실행 권한을 부여하십시오

chmod +x leftmouseremap.sh 

마지막으로 이것을 GUI에서 Statrtup Application에 수동으로 추가하거나 CLI에서 원하는 경우 아래 텍스트를 경로로 변경 ~/.config/autostart하십시오 less .config/autostart/leftmouseremap.sh.desktop.

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

KDE의 경로는 다음과 같습니다 ~/.kde/Autosart. 다른 데스크톱 관리자의 경우이 방법이 크게 다를 수 있습니다. 또는을 사용하여 일반적인 접근 방식으로 시작 실행을 수행 할 수 있습니다 /etc/rc.local.


이것은 내 물 유출 문제를 해결했습니다. 랩탑 터치 패드 아래에 왼쪽 / 오른쪽 클릭 버튼이 있습니다. 나는 물을 쏟았고 이제 두 버튼 모두 중간 클릭 신호를 OS로 보냅니다 ( 'keymon'앱을 사용하여 이것을 발견했습니다). 나는 당신의 방법을 사용하여 가운데 클릭을 왼쪽 클릭으로 다시 매핑하므로 최소한 왼쪽 클릭 경험을 즐길 수 있습니다. 나는 중간 클릭을 사용하지 않으므로 완벽하게 작동합니다. :) 간단한 지침에 감사드립니다. 입력 장치 ID가 11이므로 "xinput --set-button-map 11 1 1 3"Thanks !!
Vahid Pazirandeh

3

대역폭이 0 인 위대한 답변을 사용 하는 경우 Logitech의 MX Ergo와 같은 일부 장치는 포인터키보드 장치로 표시됩니다.

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

결과적 grep "Logitech MX Ergo"으로 두 값을 반환합니다. 후자는 매핑 문자열의 첫 번째 항목으로 포함되어 모든 마우스 버튼을 조입니다.

수정은 쉽습니다-그냥 grep최대 개수 인수를 사용하십시오 -m 1.

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

좋은 팁; 답변을 편집하여 포함 시켰습니다. 감사!
zerobandwidth

1

Ubuntu Software Center에서 다운로드 한 Easystroke Gesture Recognition을 사용하여 Logitech 마우스의 중간 버튼 매핑을 'Return'으로 변경할 수있었습니다. 편집 : 응용 프로그램에서 작업 추가, 이름 지정, 키 유형을 선택하고 세부 정보를 클릭 한 다음 Enter 키를 누르고 기록 스트로크를 누르고 프롬프트 중에 가운데 버튼을 누릅니다.


1
AskUbuntu에 오신 것을 환영합니다. 답변에 대한 자세한 내용을 제공해야합니다.
David

좋아, 위의 편집을 참조하십시오.
atr15

잘 잡았습니다. 그러나 당신이 설명 한 것은 지시대로 xork하지 않습니다. 실제로 중간 버튼은 해당 앱을 '제스처 인식 모드'로 전환하는 기본 버튼입니다. 누르면 앱이 제스처를 인식하기 시작합니다. 그러나이 앱에는 마우스 버튼 ID를 표시하는 모듈이 있기 때문에 +1입니다. 이것은 사용할 xinput때 표시되지 않는 버튼 으로 사용하고 싶을 때 도움이됩니다 xinput list <devID>.
1111161171159459134 16:29

1
아, 일년 나중에 온 - 당신의 대답은 +1 worths
1111161171159459134

1

12.04 이전에는 표준 저장소에 "btnx"라는 쉬운 그래픽 도구가 있었으며 시스템 구성에서 "버튼 속성"으로 추가되었습니다. 슬프게도 그러나 그것은 떨어졌다. 는 "신뢰할 수없는이"PPA 현재 14.04, 16.04 및 18.04 유지가 여기에 있습니다 : https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (에서 발견 https://launchpad.net/ubuntu/xenial/+source / btnx )

시스템 설정과 통합되지 않지만 저렴한 5 버튼 마우스로 랩톱에서 잘 작동합니다. 키 입력 및 명령으로 다시 매핑 할 수 있으며 구성은 다른 방법보다 훨씬 간단합니다!


도구가 백그라운드에서 동일한 변경을 수행하는지 궁금합니다. ^ _ ^
제로 대역폭

0

HP elitebook 2570p, Ubuntu 18.04.2가 있습니다. 여기에는 나에게 쓸모없는 트랙 포인트가 있으며 여기에는 공간 아래에 쓸모없는 트랙 포인트 버튼이 2 개 있습니다

터치 패드 아래에 있기 때문에이 키를 사용하지 않습니다. 이 버튼을 left = back_button (Alt_L + Left), 오른쪽 버튼 = middle_mouse_button으로 다시 매핑하고 싶습니다. "xinput"의 트랙 포인트는 id = 11이고 왼쪽 버튼은 1, 오른쪽은 3입니다.

누군가 터미널에 복사하기 위해 올바른 코드를 작성할 수 있습니까? xbindkeysrc와 결합했지만 모든 작업을 (트랙 포인트 및 터치 패드) 버튼으로 설정합니다.


<code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </ code> 터치 포인트 버튼 (id 11)이 왼쪽을 8 번째 버튼으로 만들고, 왼쪽 클릭 (1 번)으로 가운데, 오른쪽 미드 델드 (middel)로 한 다음 'code'echo -e "\"/ usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L'& amp; \ "\ nb : 8">> ~ / .xbindkeysrc 'code'버튼 번호 8 (b : 8)을 Alt_L + Left => go back :)으로 설정합니다. 이제 유용한 2 개의 마우스 버튼이 있습니다.
Atom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.