最終更新日:2012/11/17

KantanGesture - マウスジェスチャーでAppleScriptを実行するバックグラウンドで動くアプリケーション

KantanGestureについて

マウスジェスチャーでAppleScriptを実行できるアプリケーションです。GUIはいっさい無くて、設定、命令をすべてAppleScriptで書くのでAppleScriptを知らないと使えません。何が簡単かというとGUIが無いなどいろいろとプログラムの作りが簡単ということです。

ジェスチャーと言えばMagic Mouse、xGestures、ブラウザ用では拡張などでいろいろありますが使ったことありません。しかし、興味はあったので、この作り方この命令の実行の仕方なら簡単に作れると思い作ってみました。マウスジェスチャーに付いて全然知らないので用語とかが一般のものと違っているかもしれません。

利用対象者

  1. Mac OS Xに詳しい。
  2. AppleScriptに詳しい。
  3. 普通の3ボタン以上のマウスを使っている。
  4. できればキーボードは使わずにマウスだけでいろいろしたいと思っている。
  5. ちなみに自分は5ボタンマウスとUSB Overdriveを使っています。
  6. 自分の使用OSは10.6.8で10.7でちゃんと動作するかは未確認です。追記:一週間ぐらい10.7を使ったことがあるのですが、大丈夫そうでした。

準備

  1. KantanGesture.scptを~/Library/Scripts/Applications/KantanGesture/KantanGesture.scptに置きます。フォルダが無ければ作成してください。KantanGesture.scptを実行するとコピーすることが可能です。
  2. KantanGesture.scptにジェスチャーで実行するハンドラを書きます。また、設定も書きます。詳しくは同梱のスクリプトを見てください。
  3. KantanGesture.appを実行します。メニューやドックには表示されません。終了はアクティビティモニタなどを使ってください。
  4. ジェスチャーを実行するとKantanGesture.scptに書いたハンドラが実行されます。KantanGesture.scptは実行時に読み込むので常時修正が可能です。
  5. クリックのみで実行されるAppleScriptでマウス下のGUIパーツの属性を取得するには「ユニバーサルアクセス」環境設定で「補助装置にアクセスできるようにする」にチェックを入れる必要があります。

ジェスチャーで実行されるハンドラ

ジェスチャーで実行する命令はAppleScriptのハンドラとして書きます。ジェスチャーに対応するハンドラを作成します。例えばFinderでドラッグで左に移動した場合に実行されるハンドラは「do_Finder_Left」になります。このハンドラが無い場合はアプリケーション名がDefaultの「do_Default_Left」が実行されます。

アプリケーション名に半角スペースがある場合は_に置換します。また英語名になります。例えば「AppleScript エディタ」の場合は「AppleScript_Editor」になります。

特殊なハンドラ

do_Setting
KantanGestureの起動時に実行されます。設定を返します。
do_FirstRunAfterPressRight
右ボタンを押した後の最初の実行前に実行されます。右クリックで表示されたコンテキストメニューを消す為に使います。

ジェスチャーの種類

ジェスチャー名 ジェスチャーの説明 NoMenuの有無 Movedの有無 ハンドラの引数
Left
Right
Up
Down
センターボタンドラッグで左、右、上、下に移動。マウスのボタンを上げた時に実行します。 (theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(Active)となっているものです。
Press○Click◇
例:
PressLeftClickRight
PressLeftClickCenter
PressRightClickLeft
PressRightClickCenter
PressCenterClickLeft
PressCenterClickRight
PressButton4ClickLeft
マウスの○ボタンを押しながら◇ボタンをクリック。
ボタンの種類はLeft,Right,Center,Button4〜Button8
(theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(Active)となっているものです。
Pressm○ScrollWheel◇
例:
PressLeftScrollWheelUp
PressLeftScrollWheelDown
PressRightScrollWheelUp
PressRightScrollWheelDown
PressButton5ScrollWheelDown
マウスボタン○を押しながらホイールのスクロール◇
ボタンの種類はLeft,Right,Center,Button4〜Button8
ホイールのスクロールはUp,Down。
マウスを最初に押した場所とホイールを回した場所が違う場合はジェスチャー名にMovedが付きます。例えばPressLeftScrollWheelUpMovedになります。
(theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(Active)となっているものです。

特殊ジェスチャー名

LeftSide, RightSide, TopSide, BottomSide
マウスカーソルが画面の端にある場合ジェスチャー名に上記名前が付きます。
例:
do_Default_PressLeftScrollWheelUpTopSide
do_Default_PressCenterClickLeftTopSide
左上の場合LeftSideTopSideのようになります。
NoMenu
ジェスチャー実行時にメニューバーが無い場合はジェスチャー名にNoMenuが付きます。エクスポゼ中は別ジェスチャーを実行したいけどエクスポゼ中か判定する方法がわからなかったのでメニューバーの有無で別のジェスチャーが実行できるようにしました。これでよかったのかどうかはわかりません。
例:PressLeftClickCenterNoMenu
NoMenuを付けるか付けないか設定できます。
Moved
マウスを最初に押した場所と次のボタンをクリックした場所が違う場合はジェスチャー名にMovedが付きます。
例:PressLeftScrollWheelUpMoved
Movedを付けるか付けないか設定できます。

LeftSide、NoMenu、Movedが同時に付く場合はLeftSideNoMenuMovedになります。

クリックのみで実行されるAppleScript

このAppleScriptは同時押しやジェスチャーをしなくても実行されます。マウスクリック時等に常に実行されるということになります。

クリック時等に常時実行されるので重くならないか気になる方も居ると思いますが、Core 2 Duo 2.4GHzという今では遅いMacで使っていますが、全く気にはなりません。

具体的に何ができるのかというと、自分が下記のような事をできるようにしています(一例です)。可能性は大きいと思いましたが面白いアイデアはあまり思いつきませんでした。

ジェスチャー名 ジェスチャーの説明 ハンドラの引数
LeftMouseUp
RightMouseUp
3MouseUp
4MouseUp(マウスボタンの番号 + MouseUp)
マウスのボタンを上げた時に実行します。 (theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(Passive)となっているものです。
ScrollWheelUp
ScrollWheelDown
ホイールを回した時に実行します。 (theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(Passive)となっているものです。

実行されるハンドラ名は下記のようになります。

do_「クリックしたところにあるアプリケーション名」_「クリックしたボタンの上記ジェスチャー名」「特殊ジェスチャー名」

アプリケーション名はアクティブなアプリケーション名じゃなくてマウスの下にあるアプリケーションということに注意して下さい。

ハンドラ名の例

do_Xcode_LeftMouseUp
do_Default_LeftMouseUp -- アプリケーション毎のハンドラが無い場合はアプリケーション名Defaultで実行します
do_Safari_RightMouseUpLeftSideBottomSide
do_Default_ScrollWheelDownTopSide
do_Dock_LeftMouseUp

URLから実行されるAppleScript

自分はマウスの左右のチルトにHomeとEndのキーを設定しているのですが、USB Overdriveでキーを設定するとマウスの左ボタンを押したままチルトを押した時に別のことをするということができません。これをできるように、チルトを押した時にAppleScriptを実行するようにして、AppleScript側で処理するようにしました。その為の仕組みです。USBOverdriveでAppleScriptを直接設定するよりこの方法の方がAppleScriptが書きやすくていいと思います。

URLの形式
kantangesture:TiltLeft
TiltLeftが実行されるハンドラ名で任意の文字列を指定できます。
USB Overdriveでの設定例:
多ボタンマウスを使用している場合、マウスボタンNoで処理を分けるのではなく、このURLで名前を付けて処理を実行するようにすると、ボタンに意味を付けられて分かりやすいです。自分は、アプリケーション毎に違った処理をするボタンに「MouseAppButton1」(kantangesture:MouseAppButton1)、全アプリケーション共通の処理をするボタンに「MouseSystemButton1」と名前を付けています。ただし、組み合わせジェスチャーはできません。
実行されるAppleScriptハンドラ名
do_Default_TiltRight
do_Finder_TiltRight
do_Default_TiltRightTopSide
ハンドラの引数
(theArgvRecord) -- レコードの内容はKantanGestureの用語説明を見て下さい。(URL)となっているものです。
modifierKeysは修飾キーの種類を参照して下さい。

キーボード入力で実行されるAppleScript

キーボード入力でAppleScriptを実行することができます。修飾キーを押していなくても実行されます。

調整中

ジェスチャーハンドラの書き方

on do_Finder_MouseAppButton1(theArgv)
using terms from application "KantanGesture" -- theArgvのレコードにアクセスするのに必要
-- FinderSafariなどにtellをしたブロックでは
-- cursorYPercentAtWindow of theArgv
-- などで値にアクセスできないのでtellする前に変数にコピーする必要があるようです。
if isClickWindow of theArgv is false then -- ウインドウをクリックしていない時は終了
return
end if
if cursorYPercentAtWindow of theArgv > 80 then -- ウインドウの下の方でボタンを押したら
my keyDown("space", {}) -- QuickLook
else if cursorYPercentAtWindow of theArgv < 20 then -- ウインドウの上の方でボタンを押したら
my keyDown("space", {}) -- QuickLook
else if cursorXPercentAtWindow of theArgv > 55 then -- ウインドウの右側でボタンを押した
my keyDown("]", {command down}) -- 進む
else if cursorXPercentAtWindow of theArgv < 45 then -- ウインドウの左側でボタンを押した
my keyDown("[", {command down}) -- 戻る
end if
end using terms from
end do_Finder_MouseAppButton1

修飾キー(modifierKeys)の種類

押している修飾キーの他、マウスボタンも入っています。

キーの種類:
command shift option control fn caps
kana eisuu
mouseButtonLeft mouseButtonRight mouseButtonCenter mouseButton4 mouseButton5 mouseButton6 mouseButton7 mouseButton8

注意点

  1. KantanGestureはイベントを監視してジェスチャーの判定を行います。CGEventTapCreateなどを使っています。最初のクリック(プレス)イベントはアプリケーションに届きますが、次のジェスチャーとなるイベントは削除します(ドラッグ以外)。よって、右クリックから開始するジェスチャー(PressRightClickCenter、PressRightScrollWheelUp等)の場合、コンテキストメニューが表示されます。しかし、ジェスチャー判定のイベントが右クリックの場合(PressLeftClickRight等)はイベントは削除されるのでコンテキストメニューは表示されません。ScrollWheel系のホイールのイベントも削除されます。
  2. 追記:この問題は2.0では起こらなくなっています。PressLeftClickRight系のジェスチャーのマウスを押している状態を"MousePressStatusByMouseDownCount"(詳しくは同梱のKantanGesture.scptを参照)で取得する場合、ごくまれに(マウスのボタンを同時にいろいろ押した後等)マウスを押していないのにマウスジェスチャーが発動されるようになる場合があります。この場合は、英数キーを押しながらセンターボタン以降をクリックするとリセットできます。成功すると声で知らせます。もしくは、KantanGesture.appを再起動するか下記AppleScriptでも可能です。
    tell application "KantanGesture"
    	open location "kantangesture://resetMouseDownCount"
    end tell
  3. 右クリックでコンテキストメニューが表示された場合、コンテキストメニューが表示されている間はキーボードショートカットが効かないので、キーボードショートカットを使うにはエスケープキーを押す等してコンテキストメニューを閉じる必要があります。その為の仕組みとしてdo_FirstRunAfterPressRightがあります。
  4. クリックのみで実行されるジェスチャーの場合イベントは削除されません。
  5. アプリケーションの種類が"Application is background only"なのでdisplay alert "hoge"など直接ダイアログの表示ができません。適当なアプリケーションにtellしてください。
  6. LibreOffice3.4.4のCalcのセルの色の「塗りつぶしなし」をクリックするとLibreOfficeが落ちます。他にも相性の悪いソフトがあるかもしれません。
  7. KantanGestureで実行されるAppleScriptでダイアログを表示する等時間がかかる処理をするとEventTapがタイムアウトする場合があります。その際、OSの反応が悪くなります。
  8. TextExpander 3.4.2と相性が悪いです。

メモ

  1. AppleScriptの実行時にエラーになると、コンソールにエラーメッセージを出力します。デバッグの時に使って下さい。
  2. do_Default_PressLeftScrollWheelUp、do_Default_PressLeftScrollWheelUpMoved、PressLeftClickCenterMovedなどExposéを割り当てると、マウスでドラッグした後にホイールなどでExposéにできるので便利だと思った。でも、イマイチ安定しないので止めた。
  3. マウスを押したままExposéするとウインドウ選択後クリック等が反応しなくなるアプリケーションがある(ウインドウを切り替えたりしていると直る)。AppleScript エディタ、Finder。一回AppleScriptでクリックしてからExposéすると大丈夫みたい。
  4. do_Mail_PressLeftClickCenterではハンドラ中でmy mouseClick({"mouse", "mouse"}, "left", 1, "command", 0.1)を実行してもOpenFileHelperに正しく届く。
  5. GUIパーツのAXホゲホゲはUIElementInspectorで調べることができます。「Download Sample Code」をダウンロードするとアプリケーションが入っています。

ダウンロード

使用した感想

バージョン 3.0b1

追加した引数で、ウインドウの右側をクリックした時と左側をクリックした時等で処理を分けられるようになりました。Safariでウインドウの左右に戻る/進むを割り当てると結構いいかな?、と思いつつテスト中です。

バージョン 2.0

以前は別のアプリケーションでやっていたチルトとマウスボタンの同時押しもKantanGestureでできるようになりました。相変わらず、ハンドラの引数が適当で、あとでこの方が良かったなあってことにならないか心配です。ジェスチャー名の付け方もちょっと失敗だったかなと思いましたが、直すのがめんどくさいのでそのままいきます。

バージョン 1.2

音量の調整をマウスのみで手軽にしたいと思い、ディスプレイ一番上で左ボタンを押しながらホイールをまわすと音量を変更できるようにしてみました。通常の作業には影響しなくて、素早くマウスのみで音量の調整ができるので便利です。

バージョン 1.0

3週間ぐらい使いましたが特に問題なく使えています(開発中にはマウスクリックできなくなることがありましたが直っているようです)。ジェスチャーはいろいろ設定してみましたが実際によく使っているのはSafari、FirefoxでPressCenterClickLeftで戻る、PressLeftScrollWheelUp、PressLeftScrollWheelDownでタブ切り替えぐらいです。あと、Mail、Xcodeにもいくつか設定してたまに使ってます。このジェスチャーだけでもかなり使いやすくなったので作って良かったと思います。

今は実際に使用しているジェスチャーが少ないですが徐々に増やしていくのがいいのかな。ただ実際に使うとして手軽に実行できるジェスチャーは上でも書いたPressCenterClickLeft、PressLeftScrollWheelUp、PressLeftScrollWheelDownとPressLeftClickCenterぐらいになります。Left、Right、Up、Downは一回だけ実行するならいいけど連続して実行するにはめんどくさいかな。

NoMenuやMovedなどいろいろな仕掛けを作りましたが今のところ実用では使っていません。エクスポゼ関係で機能を付けたのですが、自分はやっぱり全然エクスポゼを使わないので出番がありません。

ジェスチャーをしたマウスの位置にあるUIElementをAppleScriptに渡したらもっといろいろできるかと思ったけど、そこまで複雑な物は使いこなせなさそうなのでやってません。Safariの場合、リンクのURLが取得できてリンクのURLに対して何かできたりするので、興味はあります。