Linux에서 마우스 가운데 버튼 스크롤을 Windows의 자동 스크롤처럼 만들 수 있나요?

Linux에서 마우스 가운데 버튼 스크롤을 Windows의 자동 스크롤처럼 만들 수 있나요?

자동 스크롤이 무엇인지 모르는 사람이라면 누구나 Chromium에서 경험할 수 있습니다.자동 스크롤 확장(속도는 3으로 설정) Firefox에서는 "자동 스크롤 사용" 옵션을 활성화합니다.

마우스 가운데 버튼 스크롤을 활성화하는 것은 어렵지 않습니다. 실제로 제가 해야 할 일은 다음과 같습니다.

xinput set-prop 8 "libinput Scroll Method Enabled" 0, 0, 1 

그러나 그것은 내가 원하는 방식으로 전혀 작동하지 않습니다.

내가 원하는 기능:

  • 클릭하면 "잠긴 스크롤"이 활성화되므로 버튼을 누르지 않은 채 마우스를 위나 아래로 움직이면 스크롤되어야 합니다. 마우스 가운데 버튼을 다시 누를 때까지.
  • 클릭하거나 누르고 있으면 시작 위치를 나타내는 기호가 나타납니다.
  • 클릭하거나 누른 채 마우스를 처음 클릭 지점에서 위/아래로 움직이면 해당 방향으로 "자동 스크롤"이 활성화되어야 합니다. 속도는 마우스를 이동한 거리에 따라 달라지며, 마우스를 시작 지점으로 다시 이동하면 스크롤 중지

내가 가지고 있는 기능:

  • 클릭해도 아무 작업도 수행되지 않습니다(글쎄, DE가 수행해야 하는 작업을 수행하려면 Ctrl+V를 사용하여 항목을 붙여넣는 데 완전히 익숙했기 때문에 해당 옵션을 비활성화하고 싶습니다).
  • 누르고 있으면 마우스 움직임이 스크롤 휠처럼 작동합니다. 즉, 스크롤하려면 지속적인 마우스 움직임이 필요하며 "자동 스크롤"을 사용할 수 없습니다.

보시다시피 빠진 기능이 많이 있습니다. 물론 처음에는 크롬의 자동 스크롤 확장 기능을 사용할 수 있으며 크롬에서도 작동합니다. 하지만 Windows에서 작동하는 방식인 시스템 전체에서 사용하고 싶습니다.

이제 시스템 전체에서 전체 자동 스크롤 기능을 얻으려면 약간의 작업이 필요할 수 있습니다(또는 그렇게 될까요? 모르겠습니다...). 구현 방법에 따라 중간 키 마우스를 사용하는 일부 사용자에게 작동할 수도 있습니다. 응용 프로그램 키 바인딩은 버튼에 문제를 일으킵니다(응용 프로그램 키 바인딩을 재정의하는 것은 확실히 큰 일이 아닙니다).

하지만 마우스 가운데 버튼을 누른 상태에서 자동 스크롤을 활성화할 수 있다면 매우 기쁠 것입니다. 비록 완전히 작동하지는 않더라도 충분히 가까워질 것입니다.

답변1

(제 생각에는) cestarian이 제공한 스크립트를 개선했고, 가로 스크롤을 원하고, Logitech 마우스가 올바르게 작동하지 않는 문제도 있다는 점을 제외하면 더 나은 답변이 없습니다.

또한 단일 루프가 훨씬 더 빠르고 동일한 주기에서 다방향 스크롤을 허용하는 루프가 너무 많은 이유도 없습니다. :D

xUbuntu 18.04.2 LTS에서 테스트되었습니다.

sudo apt 설치 xdotool xsel sxhkd

~/.config/sxkhd/sxhkdrc

~button2
    "~/.config/sxkhd/autoscroll.sh"
@button2

~control + c
    echo -n | xsel -n -i
~control + shift + c
    echo -n | xsel -n -i
~control + x
    echo -n | xsel -n -i

~/.config/sxkhd/autoscroll.sh

#!/bin/dash
# Autoscroll (hold only)

middlemousebutton=2

mousescrollup=4
mousescrolldown=5
mousescrollleft=6
mousescrollright=7

enableverticalscroll=1
enablehorizontalscroll=1

## Danger below :D

echo -n | xsel -n -i
eval $(xdotool getmouselocation --shell)
starty=$Y
startx=$X
toggle=$middlemousebutton
while [ $toggle -eq $middlemousebutton ]
do
    eval $(xdotool getmouselocation --shell)
    curry=$Y
    currx=$X
    if [ $enableverticalscroll -eq 1 ]
    then
        if [ $curry -gt $starty ]
        then
            speedy=$(expr $curry / 100 - $starty / 100)
            if [ $speedy -gt 0 ]
            then
                xdotool click --repeat $speedy --delay 1 $mousescrolldown
            fi
        else
            speedy=$(expr $curry / 100  - $starty / 100  | sed 's:-::')
            if [ $speedy -gt 0 ]
            then
                xdotool click --repeat $speedy --delay 1 $mousescrollup
            fi
        fi
    fi

    if [ $enablehorizontalscroll -eq 1 ]
    then
        if [ $currx -gt $startx ]
        then
            speedx=$(expr $currx / 100 - $startx / 100)
            if [ $speedx -gt 0 ]
            then
                xdotool click --repeat $speedx --delay 1 $mousescrollright
            fi
        else
            speedx=$(expr $currx / 100  - $startx / 100  | sed 's:-::')
            if [ $speedx -gt 0 ]
            then
                xdotool click --repeat $speedx --delay 1 $mousescrollleft
            fi
        fi
    fi

    toggle=$(xinput --list "Virtual core pointer" | grep -i -m 1 "Button state:" | grep -o "[$middlemousebutton]\+")
    sleep 0.02
done

chmod +x ~/.config/sxkhd/autoscroll.sh

sxhkd를 추가했는지 확인하세요.Session and Startup -> Autostart Applications

다음에 부팅하면 모든 것이 잘 작동할 것입니다.

답변2

(여기의 스크립트는 크게 개선되었습니다.아제로스, 또한이건 좀 더 수정된 버전이에요몇 가지 해결 방법과 팁을 추가하고 클릭 스크롤 기능을 추가했으며(기본적으로 비활성화되어 있지만 파일 상단에 "enableclickscroll=1"을 설정하면 얻을 수 있음) 몇 가지 주요 개선 사항을 적용했습니다. 이 스크립트는 기본적으로 bash를 사용하지만 대시와 호환됩니다)

나는 bash 스크립트 형태의 작업 솔루션을 가지고 있습니다. 완벽하지는 않지만 적어도 내 목적에 맞게 작업이 완료됩니다.

스크립트에는 다음이 필요합니다.xdo 도구그리고x 입력그리고셰르.sxhkd스크립트를 마우스 가운데 버튼에 바인딩하는 데 권장되는 솔루션입니다.

(참고: 스크립트는스프린트호환 가능, 변경#!/bin/bash도착하다#!/빈/대시더 빠른 통역사 사용(설치된 경우)

#!/bin/bash
#Autoscroll (hold only)
echo -n | xsel -n -i
eval $(xdotool getmouselocation --shell)
starty=$Y
mouseid=$(xinput --list | grep -i -m 1 'mouse' | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+')
toggle=0

while [ $toggle -eq 0 ]
do
    sleep 0.02
    mmouse=$(xinput --query-state $mouseid | grep 'button\[2' | cut -d \= -f2)
    toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
    eval $(xdotool getmouselocation --shell)
    curry=$Y

    #Scroll down
    while [ $curry -gt $starty ] && [ $toggle -eq 0 ]
    do
        eval $(xdotool getmouselocation --shell)
        curry=$Y
        speed=$(expr $curry / 100 - $starty / 100)
        xdotool click --repeat $speed --delay 1 5
        toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
        sleep 0.02
    done

    #Scroll up
    while [ $curry -lt $starty ] && [ $toggle -eq 0 ]
    do
        eval $(xdotool getmouselocation --shell)
        curry=$Y
        speed=$(expr $curry / 100  - $starty / 100  | sed 's:-::')
        xdotool click --repeat $speed --delay 1 4
        toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
        sleep 0.02
    done

done

sxhkd 구성은 다음과 같습니다../.config/.sxhkd/sxhkdrc

~button2
    "/path/to/autoscroll"
@button2

~control + c
    echo -n | xsel -n -i
~control + shift + c
    echo -n | xsel -n -i
~control + x
    echo -n | xsel -n -i

sxhkd에 의해 트리거될 때 위 스크립트는 시스템 전체 자동 스크롤을 허용하지만 마우스 가운데 버튼을 누르고 있는 동안에만 가능합니다. 가운데 클릭은 잘 작동하지만 붙여넣기 기능은 비활성화됩니다(컨텐츠를 복사하기 위해 ctrl+c 또는 ctrl+x를 사용하지 않는 한).

중간 클릭 붙여넣기를 활성화하려면(실수로 붙여넣는 것을 좋아하지 않는 한 권장되지 않음) 대신 다음 명령을 사용하십시오.

~button2
    "/path/to/autoscroll"
@button2

또한 자동 스크롤 스크립트의 첫 번째 줄을 주석 처리하거나 제거합니다(에코 -n | xsel -n -i 라인) 나는 몇 가지 이유로 사용합니다sxhkd설마xbindkeys.

  • sxhkd를 사용하면 스크립트를 트리거하기 전에 일반적으로 바인딩된 버튼을 먼저 클릭할 수 있으며(~button2가 수행하는 작업), 이를 통해 이 스크립트를 실행하는 동안 마우스 가운데 버튼이 이전 기능을 유지할 수 있습니다.
  • 어떤 이유에서인지 sxhkd 및 xbindkeys를 사용하여 스크립트를 마우스 가운데 버튼에 바인딩하려고 하면 libinput 마우스휠 에뮬레이션이 켜져 있는 경우에만 작동하고, 이를 끄면 스크립트가 해당 프로그램을 통해 실행되지 않습니다(심지어 자체적으로 잘 작동하는 경우) 간단히 말해서 이 문제에 대한 해결책은 sxhkd의 @ 접두사, 즉 @button2입니다.

좋은 소식은 마우스 가운데 버튼을 누른 상태에서 스크롤하는 것이 완벽하게 작동한다는 것입니다(마우스 가운데 버튼을 사용하여 내용을 붙여넣을 수 없는 것을 신경쓰지 않는 한).

나쁜 소식은 자동 스크롤을 전환하기 위해 가운데 버튼을 클릭하는 데 매우 심각한 문제가 있다는 것입니다. 이것이 바로 기본 스크립트에 두지 않은 이유입니다.

클릭하여 자동 스크롤을 전환하려면 다음의 모든 인스턴스를 바꾸십시오.

toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)

그리고:

if [ "$mmouse" = "down" ]; then
    toggle=$(xinput --query-state $mouseid | grep 'button\[2' | grep -c up)
else
    toggle=$(xinput --query-state $mouseid | grep 'button\[' | sort | grep -c down)
fi

길게 누르기 및 클릭 스크롤 관련 문제:

  • 가장 낮은 속도에서는 매우 빠르게 스크롤되며 대부분의 사용자에게는 괜찮을 수 있지만 개인적으로는 느린 속도를 선호합니다. 가장 가능성 있는 해결책은 libinput의 스크롤 속도를 줄이는 것입니다. 불행히도 이는 예상만큼 쉽지 않습니다(그래서 아직 테스트하지 않았습니다).
  • 가로 스크롤은 구현되지 않았지만 구현하기 쉽습니다(저는 사용해본 적이 없어서 사용할 이유가 없습니다). 현재 전체 스크립트는 Y축을 기반으로 하며 이미 여기에 있는 것을 복사하고 X축을 포함하는 것은 간단한 문제입니다. 세로 스크롤에는 마우스 버튼 4와 5 대신 6과 7을 사용할 수 있습니다. 가로로 스크롤합니다. (고정아제로스 버전& 개역 성서)
  • 스크롤 시작 위치를 나타내는 아이콘이 없으며 스크롤이 활성화되었음을 나타내는 커서 변경도 없습니다. 이 문제는 해결하기 어렵지 않을 것이라고 생각했지만, 제가 잘못 가정하고 있었습니다...
  • 마우스 커서가 스크롤 가능한 위치(예: 작업/탭 사이를 스크롤할 수 있는 브라우저 탭 또는 작업 표시줄)에 있는 경우 버튼을 놓으면 예기치 않게 스크롤됩니다. (해결 방법으로 완화됨개역 성서)

단 한 번의 클릭으로 스크롤할 때 문제가 발생합니다.

  • 항상 실행되지는 않습니다(이것은 sxhkd의 현재 구성에 있는 버그입니다. @button2를 스크립트로 사용하고 ~button2를 생략하면 제대로 작동하지만 이는 또한 더 이상 마우스 가운데 버튼을 사용하여 탐색 링크를 열 수 없다는 의미이기도 합니다) 클릭이 더 이상 전달되지 않으므로 브라우저의 새 탭에서)(수정됨)개역 성서클릭 스크롤을 활성화하려면 마우스 가운데 버튼을 놓아야 하는 "clickdelay" 변수를 추가하여 유예 기간을 제어합니다.
  • 가운데 클릭이 실제로 다른 용도로 사용되는 경우는 감지하지 못합니다. (예를 들어 새 탭에서 링크를 열기 위해 중간 클릭을 사용하는 경우 중간 클릭의 부작용으로 스크롤이 활성화될 가능성이 높습니다. 가능한 해결 방법은 커서 상태를 감지하고 활성화됩니다. 커서가 중립에 있거나 텍스트에 마우스를 올리면 스크립트가 활성화되지 않습니다. 또는 적어도 링크에 마우스를 올리면 스크립트가 활성화되지 않지만 그러한 소프트웨어는 모르겠습니다.)
  • 마우스 가운데 버튼을 다시 눌러 스크롤을 중지해도 작동하지 않습니다(단, 왼쪽 또는 오른쪽 클릭 등 다른 마우스 버튼을 눌러 스크롤을 중지할 수 있으므로 별 문제는 아닙니다). 대본이 조금 있었지만 이해하지 못했습니다. (고정개역 성서)
  • 스크롤은 커서의 시작 위치에 바인딩되지 않고 커서 자체에 바인딩됩니다(버튼을 누르고 있을 때는 문제가 되지 않음). 즉, 브라우저에 있고 이 자동 스크롤 스크립트를 사용한다고 가정할 때 화면에서 마우스를 너무 높게 움직이면 현재 페이지를 위아래로 스크롤하는 대신 탭을 스크롤하기 시작한다는 의미입니다. 이는 확실히 이상적이지 않습니다. , 이는 스크롤할 때 커서를 움직이는 위치에 주의해야 함을 의미합니다. (완화개역 성서)

첫 번째 문제는 구성을 통해 해결될 수 있습니다../.config/.sxhkd/sxhkdrc이와 같이

@button2
    "/path/to/autoscroll"

그러나 이렇게 하면 스크롤을 누르는 기능이 중단될 뿐만 아니라 마우스 가운데 버튼은 자동 스크롤에만 사용되며 ~button2 줄이 없으면 더 이상 마우스 가운데 버튼을 사용하여 새 탭에서 링크를 열 수 없습니다. . 이 기능을 전혀 사용하지 않고 콘텐츠를 붙여넣기 위해 마우스 가운데 버튼을 사용하지 않는다면 이 방법이 도움이 될 수 있지만 그렇지 않은 경우에는 사용하지 않는 것이 좋습니다.

게다가 자동 스크롤을 위해 마우스 가운데 버튼을 누른 상태에서는 훌륭하게 작동하지만 자동 스크롤을 전환하기 위해 클릭하는 경우에는 그리 좋지 않습니다(그래서 비활성화했습니다).

이것은 OP의 요청에 따라 내 요구 사항을 충족하지만 누군가 더 나은 솔루션을 가지고 있는 경우 이 답변을 솔루션으로 표시하기 전에 더 나은 답변을 잠시 기다릴 것입니다.

관련 정보