dothikoのカクカクワールド2D REBOOT

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか色々。

本当に駄目なマウスだろうか?自分の使い方が悪いのでは?と思って足掻く & 中ボタンの凝った使い方

実は買ったのはこのマウスなのですが

f:id:dothiko:20161016165838j:plain

このマウス、微妙である。

(糞WiiUさんのブログ「 俺的糞ゲー処刑ブログ 」様の、真似w)

握り具合自体は悪くないのと、特に変な事をしていないので (一時期、Win8対応!とかいってサイドボタンから迷惑至極なキーコードを吐くマウスがありましたが、そういうことはまったくない)、素直にLinuxでも全ての機能を挿すだけで使用できるのは実に良いのですけども。

なにが悪いってホイールの位置(高さ)なのですね。 実の所、ロジクール以外のサプライ各社のマウスでホイールの位置がマトモな奴を見たことがない気がするのですが。 多分、数ミリレベルの差だと思う。

指の付け根が接しないのでホイールを駆使したとき、指というか指を動かす腱が疲れるのだと思います。

そこで思いました。まずサイズが間違えた(Lサイズを買うべきだったのでしょう…)のと、もうひとつの可能性としては、使い方が根本的に間違っている可能性。

普通の人はそんなホイール動かさない、のではないかという。

ではホイールを動かしたいワタクシと普通の使い方を整合させるにはどうしたらいいのか、と考えていて思い当たりました。

そういえば、昔のLinuxはデフォで3ボタンマウスを挿すと中ボタンが押しているあいだホイールの代わりとなり、マウスを動かした分がスクロールとなる、フォトショなどの「手のひらスクロール」のような挙動を示していました。 当時Windowsユーザーだった自分は、コレ便利じゃん!コレwindowsに欲しいわ〜と思いましたが、まぁいわゆるオートスクロールで代用できるし…と通り過ぎたのでした。

これなら、大量に動かすときはホイール押し込みでマウスを回してスクロールさせ、少しだけ動かすときは指の腹で撫でればいい。

アレはまだ生きていないのだろうか?と思ったわけです。 ぐぐったら、生きてました! 今は、evdevの機能を使うらしい…

unix.stackexchange.com

自分なりの設定

とりあえず実験用として、次のようなスクリプトを書きました。

#!/bin/sh

id=$1

xinput --set-prop $id 'Evdev Wheel Emulation' 1
xinput --set-prop $id 'Evdev Wheel Emulation Button' 2
xinput --set-prop $id 'Evdev Wheel Emulation Axes' 6 7 4 5

xinput --set-prop $id 'Evdev Wheel Emulation Inertia' 3

xinput --set-prop $id 'Evdev Wheel Emulation Timeout' 16

Inertiaは、どれだけマウスを移動させるとイベントを発するかという設定です。高速スクロールを目指して3ピクセルという極短距離で発動するように設定。

Timeoutは、「そのミリ秒内にボタンを離せば、エミュレーションせず単体ボタンの発動とみなす」時間です。 中ボタンとしては使わないと思えばすぐに発動したほうがよいため、1フレームの16msに設定してみました。

やってみて感動、これはすばらしい。

マウスでもいいですが、M570のようなトラックボールでさらに大威力を発揮する設定でしょう…!! でもトラックボールは掃除がめんどい。誰かなんとかして。

さらに思いついた応用

やっているうちに思いついたことがあります。

「機能しないボタンにエミュレーションさせれば、xbindkeys/xvkbdと組み合わせてジェスチャ的にボタンを増やせる」

#!/bin/sh

id=$1

xinput --set-prop $id 'Evdev Wheel Emulation' 1
xinput --set-prop $id 'Evdev Wheel Emulation Button' 2
xinput --set-prop $id 'Evdev Wheel Emulation Axes' 8 9 10 11

xinput --set-prop $id 'Evdev Wheel Emulation Inertia' 64

xinput --set-prop $id 'Evdev Wheel Emulation Timeout' 200

このスクリプトだと今度は、中ボタン押してマウスを動かしても横で8,9ボタン、(進む・戻るボタン)縦では10,11ボタンという誰も使わない高次ボタンの機能を発して、そのままだと何の反応もありません。

そこでxbindkeysで次のように設定します

#mouse-to-top
"xvkbd -text "\[Control_L]\[Home]""
  m:0x10 + b:10

#mouse-to-bottom
"xvkbd -text "\[Control_L]\[End]""
  m:0x10 + b:11

これにより、中ボタン押して左右で「戻る/進む」、上下でページ先頭・ページ末尾というジェスチャ的機能に代わります。

平凡な3ボタンマウスにこういうのを設定すれば、平凡な安マウスが多機能マウスにクラスチェンジです。

なお、Inertiaが64なのは、このタイプではあまりイベントを発動しまくってもらっては困るからです。64でも小さすぎるぐらいで、200とかでも良いかも知れません。

また、Timeoutを活かせば中ボタンよりむしろ右クリックでもよいかもしれない…?右クリックって、右ドラッグにはまず使わないです…よね?(オイラだけ?)

最終的なスクリプト

なんか、id周りが上手く処理できなかった(ダブルクォートすると、デバイス名をスペースで区切ってしまって?正常に認識してくれない)ので、必死こいてナントカ動くようにしましたが…無駄でダサい処理をしているのでしょう…。

とにかくユニバーサルな処理を心がけました。

#!/bin/bash
timeout=16
button=2
inertia=3
mapping="6 7 4 5"

#====================#
while [ "$1" != "" ];do

    case $1 in
    -t | --timeout)
        timeout=$2
        shift 1
        ;;
    -b | --button)
        button=$2
        shift 1
        ;;
    -i | --inertia | --length | --pixel)
        inertia=$2
        shift 1
        ;;
    --id)
        id=$2
        shift 1
        ;;
    --name)
        id=\'$2\'
        shift 1
        ;;
    -m | --mapping):
        mapping=$2
        shift 1
        ;;
    -h | --help)
        linenum_start=`cat $0 | grep -n -e '^#==*#' | sed -e 's/:.*//g'`
        linenum_end=`cat $0 | grep -n -e '^#--*#' | sed -e 's/:.*//g'`
        linenum_end=$((linenum_end - 1))
        tail_cnt=$((linenum_end - linenum_start))
        echo "help document of $0"
        echo "-------------------"
        cat $0 | head -n $linenum_end | tail -n $tail_cnt 
        exit 0
        ;;
    * )
        expr "$1" + 1 >/dev/null 2>&1
        if [ $? -le 1 ];then
            id=$1
        else
            id=\'$1\'
        fi
        ;;
    esac

shift 1
done
#--------------------#

function set_xinput {

call="xinput --set-prop $1 '$2' $3"
#echo $call
eval $call

}

if [ "$id" = "" ];then
    echo "ERROR: you must specify id or device name"
    exit 1
fi

set_xinput "${id}" 'Evdev Wheel Emulation' 1
set_xinput "${id}" 'Evdev Wheel Emulation Button' $button
set_xinput "${id}" 'Evdev Wheel Emulation Axes' "$mapping"
set_xinput "${id}" 'Evdev Wheel Emulation Inertia' $inertia
set_xinput "${id}" 'Evdev Wheel Emulation Timeout' $timeout

バッファローのマウスで、ホイールではなく右クリックをエミュレーションスクロールに割り当ててみました。

上記のスクリプト「middle_button_setup.sh」で以下のように設定しますと (全然ミドルボタンじゃないというツッコミはさておき)

./middle_button_setup.sh "SONiX Full-Speed Mouse" -b 3 -t 180

な、なんだこの使いやすさは!!!

大規模スクロールは辛くなく…しかも右クリとも一応共存出来ています。 今の所、右ドラッグを行うソフトの記憶が無いのでこれで十分では…という…

ていうか…だとするとえっ…マウスってもしかして3ボタンどころか2ボタンで十分…(汗

まぁ、右ドラッグ要るぞ!という状況が出てくるかもなので、なんとも言えないですけどね。まぁキーボードショートカットでこの機能をトグルすることも原理的には可能なので、とりあえずは大丈夫ではないかと…

あっ、ちなみに先日書いたサイド化M100rは結局、サイドボタン、それも小さいタクトスイッチでのホールドには無理があると判断。シングルワンショットの戻るボタンとして機能させ、右ボタンで上記のスクロール機能を割り当てたところ、これまた結構使いやすいです。(進む機能は、Firefoxのアドイン「Firegestures」のロッカージェスチャ機能で行っています。戻るより頻度が少ないのでこれでok)

どっちも結構良くなってしまった。 うーむどっちを使うべきか悩むなぁ…

問題はコレはWindowsでどう再現できるのか?という点なのですが、まぁ、自分はあんまりWin使わないので良いのですが ますますLinuxから抜け出せなくなりそうです…