기본 마우스 버튼과 보조 마우스 버튼을 교체하는 스크립트

기본 마우스 버튼과 보조 마우스 버튼을 교체하는 스크립트

이 답변기본 마우스 버튼과 보조 마우스 버튼을 교체하기 위한 명령줄을 표시합니다. 하지만 실행할 때마다 마우스 버튼을 자동으로 바꾸는 스크립트를 갖고 싶습니다. 누군가 나에게 이 작업을 수행하는 방법에 대한 힌트를 줄 수 있습니까? 저는 bash 스크립팅에 대해 전혀 모릅니다.

답변1

xinput list출력을 제공하지 않습니다.당신의시스템의 어느 누구도 귀하가 직접 사용할 수 있는 답변을 제공할 수 없습니다. xinput표시된 것과 다른 장치가 표시될 수 있기 때문입니다.터미널에서 마우스 버튼을 왼손 버튼으로 전환하는 방법은 무엇입니까?.

예를 들어 OSX의 출력은 다음과 같습니다.

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ xquartz virtual pointer                   id=6    [slave  pointer  (2)]
⎜   ↳ pen                                       id=8    [slave  pointer  (2)]
⎜   ↳ cursor                                    id=9    [slave  pointer  (2)]
⎜   ↳ eraser                                    id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ xquartz virtual keyboard                  id=7    [slave  keyboard (3)]

이것은 내 데비안/테스트의 결과입니다:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ VMware VMware Virtual USB Mouse           id=7    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=9    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=10   [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)]
    ↳ AT Translated Set 2 keyboard              id=8    [slave  keyboard (3)]

따라서 한 시스템에는 선택할 수 있는 ID가 하나 있을 수 있으며(xquartz 가상 포인터), 다른 시스템에는 세 가지 가능성이 있습니다. 이 내용을 주의 깊게 읽으면 여기에 인용된 예가 인위적인 것이 아님을 알 수 있습니다.

변경 사항(및 모호함)을 고려하여선적 서류 비치xinput), 마우스 장치 ID를 가져오는 부분을 자동화하지 못할 수도 있습니다.

사용 가능한 식별자 중 하나를 선택한다고 가정하고 설명을 위해 이를 "12"라고 부르겠습니다. 스크립트는 출력을 읽을 수 있습니다

xinput get-button-map 12

배열로. 예를 들어 일부 스크립팅 언어는 배열을 제공합니다 bash. 그러나 몇 가지 함정이 있습니다.

  • 내 OSX 시스템에서는 "1 2 3" 목록이 반환되는 반면 Debian 시스템에서는 "1 2 3 4 5 6 7 8 9 10 11 12" 목록이 반환됩니다.
  • 추가 버튼이 무엇을 의미하는지 추측해야 합니다.
  • 버튼 번호 3개를 할당해도 왼쪽/가운데/오른쪽이 명확하지 않을 수 있습니다.

키를 전환하는 스크립트는 홈 디렉터리의 파일과 같은 어딘가에 상태를 저장해야 합니다. 관리 스크립트는 다음과 같아야 합니다.

  • 현재 버튼을 사용하여 파일 초기화
  • 토글 버튼 구성에 따라 업데이트하세요(3개의 버튼에는 "3!" 배열이 가능함).

가장 간단한 구성(및 설명)이 있다고 가정하면 스크립트에서 다음을 수행할 수 있습니다.

#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
    mode=reverse
else
    mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id

스크립트는 하나의 매개변수(마우스 장치의 식별자)를 허용합니다. 주어진 예에 대해(그리고 스크립트 이름을 "toggle-buttons"로 지정하고 실행 가능하게 만든 후 사용자의 스크립트에 넣습니다 $PATH):

toggle-buttons 12

일을 해야 합니다.

답변2

메인 마우스 버튼(1과 3)을 교체하는 간단한 작업에 비해 다른 답변이 지나치게 복잡해 보이기 때문에 내 솔루션을 추가하겠습니다.

#!/bin/bash                                                                                           
set -e

# To get the name of a devices, do "xinput list --name-only"                                          
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"

current_button_map=$(xinput get-button-map "$DEVICE_NAME")

if [[ $current_button_map =~ "1 2 3" ]]; then
    echo "Making the mouse a lefty"
    xinput set-button-map "$DEVICE_NAME" 3 2 1
else
    echo "Making the mouse a righty"
    xinput set-button-map "$DEVICE_NAME" 1 2 3
fi

답변3

나는 다음과 같은 일을 할 것입니다 :

#!/bin/sh

mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap

이는 귀하가 마우스의 "이름"(제 경우에는 그렇습니다 Razer)을 알고 있고 기본 버튼 매핑(즉, 교체할 수 있도록 왼쪽과 오른쪽에 어떤 버튼이 있는지)을 알고 있다고 가정합니다 xinput list $mxid.

Button labels: "Button Left" "Button Middle" "Button Right"....

그리고 xinput get-button-map $mxid:

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

1 =>> left보시다시피 , 제 경우 3 =>> right위 스크립트는 현재 매핑을 읽고 첫 번째와 세 번째 값을 바꾼 다음 새 매핑을 설정합니다.

답변4

장치의 상태를 전환해야 하는 경우(마우스 키의 순서를 뒤집거나 반전시키는 것이 이러한 상태임) 장치의 현재 상태를 쿼리하거나 일부 파일에서 상태를 유지할 수 있어야 합니다.

xinput마우스에게 버튼 매핑을 요청하는 방법이 있는지 찾을 수 없으므로 상태를 파일(예: )에 저장해야 합니다 ~/.config/mousebuttons. 스크립트는 실행될 때 파일에 "reverse"를 써야 합니다.

xinput set-button-map 12 3 2 1 실행 시 파일에 "정상적으로" 기록됩니다.

xinput set-button-map 12 2 3 실제로 수행되는 작업은 파일 읽기에 따라 다릅니다. 스크립트가 시작될 때 파일 내용이 있거나 파일이 존재하지 않으면 normal첫 번째 단계가 수행되고, 내용이 다음과 같으면 그런 다음 두 번째 단계가 수행됩니다 reverse.

호출할 때마다 파일 내용이 반전됩니다 reverse. normal재부팅 후와 같이 실제 상태가 파일 내용을 반영하지 않을 수 있으므로 시각적 알림으로 새 상태를 화면에 인쇄하십시오. 파일이 상태와 동기화되지 않은 경우 스크립트를 한 번만 호출하여 다시 동기화하면 됩니다.

관련 정보