InDesignでEventListenerなんかを実装していると、例えばInDesign側でダイアログが出ているタイミングで発火してしまうイベントがエラーになることがあります。
そこでInDesignが待機状態かそうでないか調べたいな〜と思ったんですが、BridgeTalkを使ってすごくシンプルに解決できました。
イベントのコールバック関数にこれを書き加えるだけです。
if (BridgeTalk.getStatus() === "BUSY") { return; }
BridgeTalk.getStatus()メソッドの戻り値は下記の通り*1。
戻り値(String) |
詳細 |
|---|---|
"BUSY" |
ビジー状態 |
"IDLE" |
待機状態 |
"PUMPING" |
(BridgeTalkメッセージの)処理中 |
"ISNOTRUNNING" |
起動していない(インストールはされている) |
"ISNOTINSTALLED" |
インストールされていない |
"UNDEFINED" |
起動しているが対応していない(CS2などで起きるらしい) |
この戻り値が"BUSY"ならコールバック関数をreturnで終了させる、というだけです。
ただし、もし複数のバージョンのInDesignが同時に起動していたらひと手間必要です。
BridgeTalk.getStatus()メソッドに引数を渡さない場合、動作中のアプリケーションについて状態を調べて返してくれます。特定のアプリケーションとバージョンを指定する場合は、メソッドの引数に特定の書式の文字列を渡します。
InDesign 2021の場合、メジャーバージョンの16に.064を付け加えて"indesign-16.064"となります*2。この.064というのは、64bit版という意味です。Windows版の少し古いアプリケーションだと32bit版もあるので、その場合は.032になります。Macの場合は.064でOKです。
VS Codeからこの値を確認する際は、たいてい"PUMPING"が返ります。
これはおそらくVS CodeがBridgeTalkの仕組みを利用しているからでしょうね。EventListenerに登録したり、アプリケーションから直接実行したりすると、ちゃんと"IDLE"などと値が返ってくるはずです。
*1:「JavaScript Tool Guide CC:BridgeTalk Class」を参照
*2:さらに末尾にロケール表記を続けると言語版まで指定できますが割愛