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

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

이 답변마우스 기본 버튼과 보조 버튼을 바꾸는 명령줄을 보여줍니다. 하지만 실행될 때마다 마우스 버튼을 자동으로 바꾸는 스크립트를 원합니다. 누군가 나에게 이 작업을 수행하는 방법에 대해 힌트를 줄 수 있습니까? 저는 bash 스크립트에 대해 거의 아무것도 모릅니다.

답변1

xinput liston 의 출력을 제공하지 않고당신의시스템에서는 누구도 귀하가 직접 사용할 수 있는 답변을 제공할 수 없습니다. 이는 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!" 배열이 가능함).

가장 간단한 구성(및 해석)이 있다고 가정하면 스크립트에서 다음과 같은 작업을 수행할 수 있습니다.

#!/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 =>> left3 =>> right의 스크립트가 현재 매핑을 읽고 첫 번째와 세 번째 값을 바꾼 다음 새 매핑을 설정합니다.

답변4

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

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

xinput set-button-map 12 3 2 1 실행 시 해당 파일에 'normal'을 씁니다.

xinput set-button-map 12 2 3 취할 실제 조치는 파일 읽기에 따라 다릅니다. 스크립트가 시작될 때 파일 내용이 있거나 normal파일이 없으면 첫 번째 단계를 수행하고, 내용이 있으면 두 번째 단계를 수행합니다. 이다 reverse.

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

관련 정보