Linuxでは、マウスの中ボタンスクロールをWindowsの自動スクロールのようにすることはできますか?

Linuxでは、マウスの中ボタンスクロールをWindowsの自動スクロールのようにすることはできますか?

自動スクロールが何であるかわからない人なら誰でもChromiumで体験できます。自動スクロール拡張(速度は3に設定されています)Firefoxでは、[自動スクロールを使用]オプションを有効にします。

マウスの中ボタンスクロールを有効にすることは難しくありません。実際に私がしなければならないことは次のとおりです。

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

しかし、それは私が望む方法でまったく機能しません。

私が望む機能:

  • クリックすると「ロックされたスクロール」が有効になるため、ボタンを押さずにマウスを上下に動かすとスクロールする必要があります。マウスの中央ボタンをもう一度押すまで。
  • クリックまたは押すと、開始位置を示す記号が表示されます。
  • クリックまたは押しながらマウスを最初のクリックポイントで上下に動かすと、その方向に「自動スクロール」が有効になります。速度はマウスを移動した距離によって異なり、マウスを開始点に戻すとスクロールが停止します

私が持っている機能:

  • クリックしても何も起こりません(まあ、DEがする必要があることをしたい場合は、Ctrl + Vを使ってアイテムを貼り付けるのに慣れていたので、そのオプションを無効にしたい)。
  • 押し続けると、マウスの動きがスクロールホイールのように動作します。つまり、スクロールするには連続的なマウスの動きが必要で、「自動スクロール」は使用できません。

ご覧のとおり、欠けている機能がたくさんあります。もちろん、最初はChromeの自動スクロール拡張機能を使用でき、Chromeでも機能します。しかし、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の要求に応じて私の要件を満たしていますが、誰かがより良い解決策を持っている場合は、この答えを解決策としてマークする前に、より良い答えをしばらく待ちます。

関連情報