きりかノート 3冊め

おあそびプログラミング

mac-robotにスクロールホイールの機能を足してみた

まずみんなmac-robotを知らないと思うので簡単に説明すると、

mac-robot(https://github.com/youpy/mac-robot)は、

  • rubyのライブラリ
  • Mac上のマウス、キーボード操作をエミュレートできる

というもの。

内部的にはCGEventのラッパーみたいになってる。CGEventを使う副次的効果として、この手のものとしてはめずらしくシステム環境設定の「補助装置にアクセスできるようにする」と無関係に利用することができる。そのかわり、画面上の文字を読み取ったりということはできない。わりと使いどころを選ぶ感じの便利ツールである。

で、例のスクロールのバグ調査に際して、自動スクロールさせるツールがほしくなったのでmac-robotの機能追加として実装してみた。アプリが落ちるまでひたすらタッチパッドをすりすりするのって地味にツライのですよ……

たとえば10行分下にスクロールさせるのはこんなふうになる(ruby 1.9の場合)。

   robot = Mac::Robot.new
   robot.scroll_wheel(down: 10, unit: :line)
  • Mac::Robot#scroll_wheel() メソッドを追加。
  • ハッシュをパラメータにとる
    • スクロール方向とスクロールする量 :up, :down, :right, :left
    • スクロール量の単位 :unit 次のいずれかを指定 :pixel (デフォルト), :line

とりあえず動くレベル。確認した感じでは環境設定の「スクロール方向:ナチュラル」には関係なく指定した上下にスクロールする。

課題

  • もうちょっとAPIをどうにかしたい
  • Z方向がわからん

とりあえずCGEventCreateScrollWheelEvent()関数に合わせたけれど、なんだかなあな感じです。少なくとも自分的にはいちばん使うのが縦方向の行スクロールなので、これをいちばん短い名前のscroll_wheel()として数字受け取るだけにしたい。じゃ、今の全機能入りのメソッドの名前をどうしようか、、、という感じ。

最終的に呼び出されるCGEventCreateScrollWheelEvent()関数は、三次元のスクロール方向を受け付けることができる。ということで、Y(:up, :down)とX(:right, :left)の他にZ(:front, :back)があるんだけど、どっちがプラス方向でどっちがマイナスだかがわからん。Xがプラスが左方向なんで、通常のQuartzともちがうような気がするし。

ご存知の方がいたら教えてください!

ていうかさ、そもそもZ方向のホイールってどんな入力装置なの?マウスの側面にあるとか?

思ったこと

mac-robotがわりと最小限の機能で構成されてて、click|dclick|dragなんかはあってもいいのかなあとも思ってみたり。

あと、spec走らせたときに高速でマウスが動いてアップルメニューから「システム終了...」を選ぶのはどーかと思うのです。最初すげーびっくりしたよ!

robot-spec.rbのこのへんね。

   describe 'mouse event' do
     it 'should simulate mouse event' do
       subject.mouse_move(20, 0)           # りんごの位置に移動
       subject.mouse_press(:left)          # マウス押す→メニューがでてくる
       subject.mouse_move(20, 250)         # マウス押したまま下に
       subject.mouse_release(:left)        # マウス放す→そこは「システム終了...」だ!
     end
   end