- マルチモニタ環境で,ウィンドウを主モニタの横幅いっぱいにしたい。
- それをTouch Barからできるとなお嬉しい。
ちょっと力技ですが,やってみました。JXA*をAutomatorのサービスとして動かすやつです。
*JXA: JavaScriptでAppleScriptみたいなことするやつ(←雑)
ウィンドウを横幅いっぱいに使う。
筆者のメインモニタはFullHDモニタを縦置きしているので,横幅は1080pxです。
普通に考えると,現在のウィンドウのX座標を0に,widthを1080にすれば良さそうです。
var app = Application.currentApplication();
var new_bound = app.windows[0].bounds();
new_bound.x = 0;
new_bound.width = 1080;
app.windows[0].bounds = new_bound;
ところがどっこい,マルチモニタ環境では,どうやら「その」モニタの左端のx座標が0とは限らないようです。(仮想的に,複数のモニタを全部合わせた大きな矩形になっている?)
なので,「その」モニタの左端のx座標をどうにかして指定しなくちゃいけません。
が,それをスクリプトで取得するのは意外とめんどくさそうなのでパス。適当なウィンドウを左端に置いてx座標を調べる,というアナログな方法で調べた結果,私の 今現在の設定だと,お目当のモニタの左端はx=359らしいです。
ということで,これをそのまま練り込むとこんな感じ。
var app = Application.currentApplication();
var new_bound = app.windows[0].bounds();
new_bound.x = 359; //マジックナンバー!!
new_bound.width = 1080;
app.windows[0].bounds = new_bound;
うーん,糞コード。
Automatorでクイックアクション化する。
Automatorでは「クイックアクション」を作ることができます。「サービス」に登録できたりする優れもの。
そこで,「JavaScriptを実行」アクションだけのワークフローを作ります。(「ワークフローが受け取る項目」は「入力なし」でOK)
内容は,アクションのデフォルト値の// Your script goes here
以下に上記コードをペーストすればOK…というわけでは無かったりします。
というのは,「サービス」として動作する場合,カレントアプリケーションはサービスだからなのか,アクティブなウィンドウを操作してくれません。
そこで,System Eventsを使ってfrontmostなアプリケーションを取得し,そのアプリケーションの先頭ウィンドウを操作するようにします。
結論としては,こんな感じに。
var TARGET_X = 359; //お目当てモニタの左端x座標(手作業で取得)
var TARGET_WIDTH = 1080; //お目当てモニタの幅
function run(input, parameters) {
// Your script goes here
var processes = Application("System Events").processes();
getApp: for( var i in processes ){
if( processes[i].frontmost() ){
var app = Application(processes[i].name());
break getApp;
}
}
var bound = app.windows[0].bounds();
bound.x = TARGET_X;
bound.width = TARGET_WIDTH;
app.windows()[0].bounds = bound;
}
適当に「画面幅に合わせる.workflow」とでも名付けて,サービスとして保存します。
Touch Barに登録する
システム環境設定.appから,「キーボード」→「キーボード」内の「Touch Barをカスタマイズ…」をクリックし,「クイックアクション」をTouch Barに追加。
そうすると,Touch Barでこの「クイックアクション」に触れば,すぐに上記「画面幅に合わせる」を動作させられちまうんだ!