Expogesture
Version 1.1.4b
by NAKAHASHI Ichiro

What is Expogesture?
Expogestrue は、マウスでのジェスチャーに反応し、設定されたキーイベントを送信するアプリケーションです。
例1: マウスで右回りに小さな円を描くと、アプリケーションが隠れる(Cmd+H)
例2: 左回りに小さな円を描くと、Expose (F9)Expogesture の最新版は、次の web site で入手可能です。
http://ichiro.nnip.org/osx/

動作環境
・Mac OS X 10.3 (Panther) 以降。
・Mac OS X 10.2 では、バージョン 0.8.3 をご利用ください。 10.1 以前で動作するバージョンは存在しません。
・「メニュー項目を実行」機能を使用する場合は，「システム環境設定」の「ユニバーサルアクセス」ペインで，「補助装置にアクセスできるようにする」を有効にしてください。

What's new in this release
Version 1.1.4
・Universal Binary化（立川さん、ありがとうございます）
・その他、よく覚えていない修正多少（たぶんメモリリーク関係）
Version 1.1.3
・繁体字中国語サポート(Thanks to Jack M. H. Lin)・日本語リソースの微修正。
・機能上の変更点はありません。
1.0.4 以前のバージョンからアップグレードする場合の注意事項
・初期設定ファイルの名称が変更されています。設定は自動的に引き継がれますが、古いファイルが不要な場合は手動で削除してください。
(新) ~/Library/Preferences/org.nnip.Expogesture.plist(旧) ~/Library/Preferences/forbidden̲methods.Expogesture.plist
1.0.2 以前のバージョンからアップグレードする場合の注意事項
・ポーリングモードを使用している方は、環境設定パネルで再度設定を行ってください。

既知の問題・起動中にUSBキーボードを抜き差しすると、送信されるキーイベントが一部おかしくなる(USキーボードのキーマッピングになってしまう?)。
・ジェスチャー感度スライダをドラッグすると、ジェスチャーが認識されなくなる。どこか任意の場所を一度クリックすることで回復する（適用ボタンはそのためのフェイク）。
・USB Overdrive など、一部のサードパーティー製マウス・タブレットはポーリングモードでのみ利用できる。

インストールとアンインストール
インストールは、Expogesture アプリケーションをハードディスクの適当な場所（/Applications や ~/Applications）にコピーするだけで充分です。しばらく使ってみて問題ないようであれば、「システム環境設定」でログイン項目に追加してもいいでしょう。
アンインストールしたい場合には、コピーした Expogesture を削除してください。ログイン
項目に登録している場合には、「システム環境設定」で削除してください。環境設定は ~/Library/Preferences/org.nnip.Expogesture.plist に保存されていますので、不要なら削除してくください。

ジェスチャーの入力方法
Expogesture の起動中に、マウスポインタで決められた図形を描いてください。マウスやキーボードのいずれかのボタン／キーが押されていると、ジェスチャーは無視されます。
Expogesture は、以下の6種類のジェスチャーを解釈します（詳しくは「ジェスチャーの認識アルゴリズム」を参照してください）。
・右回りの円・左回りの円・ポインタを左右に振る
・ポインタを上下に振る
・Z を描いて、描き始めに戻る
・N を描いて、描き始めに戻る
ジェスチャーが認識された場合、設定されたキーイベントを送信したり、内蔵のタスクスイッチャを呼び出すことができます。
アクション定義のデフォルト値は、
右回り＝アプリケーションを隠す(Cmd+H)
左回り＝(Safariで)ひとつ前のページ(Cmd+[)
左右に振る＝新しく開く(Cmd+N)
上下に振る＝ウインドウを隠す(Cmd+M)

に設定してあります（変更方法は次節で説明します）。
ジェスチャーが全然認識されない場合、設定パネルの「その他」タブにあるポーリングモードを有効にする必要があるかもしれません。
Version 0.5 以前の設定は引き継がれません。バージョンアップした場合は設定パネルの内容を確認してください。

アイコンとメニュー
Expogesture は Dock ではなく、メニューバーの右端(ステータスバー)に自分のアイコンを表示します。このアイコンをクリックすると、次のようなメニューが表示されます。
Expogesture について - Expogesture のバージョン情報を表示します。
環境設定... - 設定パネルを表示します。
Expogesture を終了- Expogesture を終了します。

設定パネル
ステータスバー(メニューバー)の右端の Expogesture アイコンからメニュー項目「環境設定...」を選択すると、設定パネルが表示されます。
ステータスバーにアイコンが表示されていない場合には、Expogesture を Finder で再度開いてください。設定パネルが表示されます。

「アクション」タブ・アプリケーション定義
ここにアプリケーションを登録することによって、アプリケーション毎にイベント定義を切り替えて使うことができます。「基本設定」は、個別に定義されていないアプリケーションに対するデフォルト設定を表しています（削除できません）。
アプリケーションをリストに追加したい場合には、「追加...」ボタンを押してください。アプリ
ケーションのアイコンを Finder からのドロップしても構いません。
・ジェスチャーのアクション
上のテーブルで選択したアプリケーションに対して、ジェスチャーとアクションの対応を設定します。
基本設定を使用 - 「基本設定」で指定されたアクションが実行されます。
無効 - ジェスチャーは無視されます。
キーイベント - 指定されたキーイベントが送信されます。
メニュー項目を実行 - 指定されたメニュー項目を実行します。項目名は画面に表示されている通り、正確に入力してください※。
タスクスイッチ - 簡易タスクスイッチャが起動します。

※この機能を利用するには，「システム環境設定」→「ユニバーサルアクセス」で，「補助装置にアクセスできるようにする」を有効にする必要があります。

「一般」タブ・ジェスチャーの感度設定された感度より「大きな」ジェスチャーを認識します。値を変更した後は、「適用」ボタンを押してください。
値を「小さい」側に設定すると、より小さなジェスチャーにも反応します。「大きい」側に設定すると、大きなジェスチャーのみに反応するようになります。ジェスチャーの大きさは相対的なもので、ポーリングモードと通常モードで異なりますので注意してください。
・タスクスイッチ
タスクスイッチ使用時の挙動を選択できます。
全てのウインドウを前面にがチェックされている場合、選択されたアプリケーションの全てのウインドウが前面に表示されます。チェックされていない場合、そのアプリケーションのメインウインドウとパネルのみが前面表示されます（アクティブでないドキュメントは他のアプリケー
ションの後ろに隠れたままになります）。
ドキュメントがない場合に新規作成がチェックされている場合、選択されたアプリケーションがひとつもドキュメントを開いていなければ、新たに作成します。
デフォルトでは両方がチェックされています。これは Dock の動作と同等です。
・ジェスチャーの感度ジェスチャーの感度を設定します。値を変更した後は、「適用」ボタンを押してください。
値を「小さい」側に設定すると、より小さなジェスチャーにも反応します。「大きい」側に設定すると、大きなジェスチャーのみに反応するようになります。ポーリングモードと通常モードで値の解釈が異なりますので注意してください。

「その他」タブ・ステータスバーにメニューを表示する
ステータスバー（画面の右上端）に Expogesture メニューを表示したくない場合、このチェックを外します。Finder で Expogesture のアイコンをダブルクリックすると、環境設定パネルとメニューが一時的に表示されます。
・マウスポインタの移動をポーリングで検出する（ポーリングモード）
システムがマウスドライバとして認識しないポインタデバイス(タブレット)を使用している場
合、この項目をチェックして Expogesture を再起動してください。
[解説] Ver. 0.5 以降のデフォルト動作では、Expogesture はマウスポインタの移動をマウスドライバから直接取得しています。マウスポインタが移動したときだけイベントを拾えるので(たぶん)効率的なのですが、マウス以外でのポインタ移動は無視されます。対して polling mode では、[NSEvent mouseLocation] を約 20ms 間隔で呼び出すことで、マウスポインタを追跡します。あまりエレガントじゃないんですが、とりあえずあらゆるデバイスで動作します。

タスクスイッチ
タスクスイッチ機能が割り当てられたジェスチャーが認識されると、タスクスイッチャウインドウが表示されます。ウインドウには起動中のアプリケーションのアイコンが円を描くように並んでいます。
アプリケーションのアイコンをクリックすると、そのアプリケーションが前面表示（アクティブ）になります。
アイコンを Ctrl+クリック（もしくは、第二ボタンでクリック）すると、コンテキストメニューが表示されます。コンテキストメニューの項目は以下の通りです。
表示 - アプリケーションを前面に表示します。アイコンを普通にクリックするのと全く同じです。
隠す - アプリケーションを隠します。
他を隠す - 選択されたアプリケーションを前面にし、他の全てのアプリケーションを隠します。
終了 - アプリケーションを終了します。

ジェスチャーの認識アルゴリズム
Expogesture は、マウスポインタの移動から「回転移動」と「直線移動」を検出します。検出された移動の列が特定のテンプレートに一致した場合、対応するアクションを実行します。
・回転移動の検出
マウスポインタの移動速度を v = (r, φ) とします（極座標系）。ポインタが理想的な円を描いているとき、

r = constantdφ/dt = constantです。ここでは、dφ/dt が一定の範囲に入っていれば、円を描いていると判断します（速さ r は無視します）。φ は 1周で 2π だけ増える（もしくは減る）ので、dφ/dt の積分が 2π に達した
ら 1周です。
なお、描いている円が感度設定値よりも小さい場合は、検出をキャンセルします。
・直線移動の検出
マウスポインタの移動方向（φ）を8段階に丸めたものを、そのまま移動方向としています。移動距離が感度設定値を越えるまで同じ移動方向が続けば、直線移動が行われたと解釈します。

・テンプレートとの照合
回転移動は1周を単位として認識されるので、検出され次第アクションが実行されます。
直線系のジェスチャーは、次のように定義されています。
左右に振る
上下に振る→←→←↑↓↑↓Z Path→↙→↖

N Path↑↘↑↙

移動と移動との時間的な間隔が一定値を越えると、照合作業はリセットされます。また、「チャタリング」防止のため、ジェスチャーとジェスチャーの間に一定の時間的間隔を設けています。

その他
ジェスチャーの誤認識が起こる可能性がありますので、えげつないキー(Cmd+Qとか、Cmd+Xとか)は割り当てないほうがいいです。

著作権とライセンス
Copyright (C) 2003-2004 NAKAHASHI Ichiro
このソフトウェアは GPL V2 ライセンスの元で配布されています。このソフトウェアは無保証です。
アイコンは Takahashi Tadakazu さんに提供していただきました。ありがとうございます。

今後の改良方針・設定パネルのUIがダサいのをなんとかする。
・設定項目の見直し（アプリケーション毎に設定できる項目／全体で共有する項目、などよく考える）。
・感度設定の改良。
・ジェスチャーのユーザー定義。

Revision History
Version 1.1.2
・Takahashi Tadakazuさん提供の新しいアプリケーションアイコン。
・メニュー項目実行のパフォーマンスを改善。
Version 1.1.1
・メニュー項目の検索方法に関するバグを修正。
・通知ウィンドウのサイズを、表示内容に応じて自動的に調整するようにした。

Version 1.1.0
・任意のメニュー項目を実行する機能を追加。
・起動中、Expogestureをもう一度開く（多重起動する）ことにより環境設定パネルを呼び出すことができる機能の信頼性を改善。
・環境設定パネルを開いている時にタスクスイッチャを呼び出し、キャンセルすると、Expogestureが前面のアプリケーションになってしまう問題を修正。
Version 1.0.5
・デュアルモニタ環境に対応。
・著作権表記の改定。
Version 1.0.4
・キーボード配列「Australian」使用時に環境設定パネルを表示すると不正終了するバグを修正(Unicodeに対応していないscriptでも動くようになった?)。
Version 1.0.3
・タスクスイッチャを呼び出したときに環境設定パネルが表示されるバグを修正。
・Fast User Switch に対応したつもり。
Version 1.0.2
・ポーリングモードのON/OFFを記憶するキー名が間違っていた。ポーリングモードを使用している方は再設定してください。
・ステータスバーのメニュー表示をON/OFFできるようにした。
・Optionキーと組み合わせたショートカットが正しく表示されない問題を修正。
・国広氏の指摘により、アルゴリズムに関するドキュメント記述を修正。
Version 1.0.1
・UIの翻訳ミスを修正。
・ホットキー設定時、キー押下後にフォーカスを解放するようにした。
Version 1.0beta
・通知ウィンドウの位置をカスタマイズ可能にした。
・送信するキーを、直接キーを押下することで設定できるようにした。
Version 0.8.3
・Xcode がインストールされていない環境で動作しない問題を修正。
・タスクスイッチャの反応をより自然にした(ホットスポットを矩形から扇型へ変更)。
Version 0.8.2
・Caps Lock が ON の時にジェスチャーが認識されない不具合を修正(ダサい...)。
・アニメーションのフレームレートを 15fps から 30fps にした。
・開発環境を Xcode に移行。
Version 0.8.1
・高負荷時の描画速度を改善。
Version 0.8
・ジェスチャーを2種追加。
・ジェスチャー認識時のアクションとして、「基本設定を使用」を追加。
・ドラッグ・アンド・ドロップでアプリケーション定義を追加できるようにした。
・アプリケーション定義を削除する時に、確認ダイアログを表示するようにした。

・タスクスイッチャのコンテキストメニューに「他を隠す」を追加。
Version 0.7.2
・タスクスイッチャでアプリケーションを前面表示にしたとき、(1)全てのウインドウを前面に出すかどうか (2)ドキュメントがひとつも開いていない場合に新規作成するかどうか を選択可能にした（環境設定パネル）。
・タスクスイッチャにコンテキストメニューを追加した。
・Safari 使用時に、タスクスイッチャの再描画が正しく行われないことがある問題を修正。
Version 0.7.1
・タスクスイッチャでアプリケーションが前面に出された時の動作を、Dockと同等にした（＝ドキュメントをひとつも開いていない場合、新規に作成）。
・フローティングウインドウをフェードアウトするようにした。
・タスクスイッチャを呼び出してから表示されるまでの待ち時間を減らした。
Version 0.7
・タスクスイッチ機能を追加。
・個々のジェスチャーの有効／無効を設定できる。
・環境設定パネルが前面に表示されるようになった。
Version 0.6.5
・Shift 使用可能な組み合わせをさらに増やした。
・マウスボタン、修飾キーの検出方法をより汎用的なものに変えた。
・英語リソースを復活。
Version 0.6.4
・ジェスチャー感度の調整方法を改善。
・Shift 使用可能な組み合わせを増やした。
Version 0.6.3
・インタフェースを日本語化。
・ジェスチャーの感度を調整可能に。
・修飾キーとして Shift を使用可能。
Version 0.6.2
・Polling mode で左右回転が逆にあるのを修正。
・Polling mode での感度を調整。
・メモリリーク修正。
Version 0.6.1
・非HIDのポインタデバイス(タブレット)との互換性を復活(「設定パネル」を参照)。
・マウス・キーボードのホットプラグに対応。
・メモリリーク修正。
Version 0.6beta
・アプリケーション毎のキー定義を可能にした。
・約4,000時間周期で動かなくなるバグを修正。
・Version 0.5 以前の設定は引き継がれません。
Version 0.5beta
・マウスポインタの移動状況をマウスドライバに直接問い合わせるようにした。タブレットペン

での移動は無視される(はず)。
・スペースバーが押されている間もジェスチャーを無視。
・Dock ではなく、ステータスバー(メニューバーの右端)にアイコンを表示するようにした。
Version 0.4.1beta
・タブレットの Barrel Switch, Tip Pressure でもジェスチャーを無視するようにした、つもり。
Version 0.4beta
・Shift, Control, Option, Command, Mouse Button 1/2 のいずれかがが押されている間はキーイベントを発生しないようにした。
Version 0.3.1beta
・送信したキーイベントを画面に表示するようにした（ログの出力は廃止）。
・キー表記を一部変更（Leftから←など）
Version 0.3beta
・認識できるジェスチャーが追加されました。全体の認識率も向上しています。
・以前のバージョンの設定は初期化されます。手抜きでごめん。