basyura's blog

あしたになったらほんきだす。

ブラウザのウインドウサイズをコマンド実行で変更する

背景

Inkdrop の vim plugin を使ってウインドウサイズを変えられるようになったのに気を良くしてブラウザ (Vivaldi) でもやってみる。

主に mac ではアプリをフルスクリーン (cmd+control+f) で使ってはいないけどスクリーンいっぱいに広げて使う。フルスクリーンにするとアプリの切り替えがワンテンポ遅いので思考が止まる (遅いことが気になる)。嫌なのでフルスクリーンはほぼ使わない。フルスクリーンを独自にやっていて切り替えが早い MacVim ぐらい。特に Terminal は下に隙間が空くし、行間で微調整してもタブを追加したら空くので一番困り中 (BigSur の前は大丈夫だった気がするけど、Monterey にしたら直ったりする?)。

ブラウザと Inkdrop を並べて調べ物をしながらまとめていくことがよくある。その際に OS 標準の横並びを使ってもいいのだけど、他のウインドウとの切り替えが遅いし中央の黒線も気になる。

chromium-vim

ブラウザで vim キーバーインドが使えるようになる拡張である chromium-vim にウインドウサイズを変える機能を組み込んで見る。オリジナルはメンテされなくなったので fork した版に固有コマンドを定義できるようにカスタマイズ済み。

Vivaldi は Chrome ベースなので Chrome の API をそのまま叩けた。

const opt = {
  width: screen.availWidth / 2,
  height: screen.availHeight,
  top: screen.availTop,
  left: 0,
};
chrome.windows.update(
  chrome.windows.WINDOW_ID_CURRENT,
  opt,
);

fork 版 chromium-vim に組み込むとこんな感じで。

CommandExecuter.add("half", "half window", {
  match: function (value) {
    return value == "half" || value == "ha" || value == "hal";
  },
  execute: function (value, repeats, tab) {
    const opt = {
      width: screen.availWidth / 2,
      height: screen.availHeight,
      top: screen.availTop,
      left: 0,
    };
    chrome.windows.update(
      chrome.windows.WINDOW_ID_CURRENT,
      opt,
    );
  },
});

CommandExecuter.add("full", "full window", {
  match: function (value) {
    return value == "full" || value == "fu" || value == "ful";
  },
  execute: function (value, repeats, tab) {
    const opt = {
      width: screen.availWidth,
      height: screen.availHeight,
      top: screen.availTop,
      left: 0,
    };
    chrome.windows.update(
      chrome.windows.WINDOW_ID_CURRENT,
      opt,
    );
  },
});

まとめ

わりとまんぞく。 フルスクリーンのウインドウ切り替えが速くなれば解決しそうなのだけど、意図的にワンテンポ遅いのか何かしらの制限があるからなのかどっちなんだろう。

vivaldi + cVim でタブが意図せず閉じられてしまうのを修正

ちょっとした挙動が気になってしまい fork して使っている。数か月前の vivaldi のアップデートから cVim の closeTab でピン留めされたタブも、最後のタブも閉じてしまって困る。CPU とメモリがもったいなくて基本的にタブはすぐに閉じてしまう派なので特に最後のタブを閉じてしまったついでに vivaldi も閉じられてしまうことがよくある。vivaldi のアップデートで直ると思って待っていたのだけど、いっこうに直らないし報告しても取り上げてもらえない気がするので自分で直す。

chrome.tabs - Google Chrome

↑このへんをチラ見しながら。

diff --git a/background_scripts/actions.js b/background_scripts/actions.js
index 96b8591..dcd7bc7 100644
--- a/background_scripts/actions.js
+++ b/background_scripts/actions.js
@@ -162,6 +162,12 @@ Actions = (function() {
   };
 
   _.closeTab = function(o) {
+
+    if (o.sender.tab.pinned)
+    {
+      return;
+    }
+
     chrome.tabs.query({currentWindow: true}, function(tabs) {
       var sortedIds = tabs.map(function(e) { return e.id; });
       var base = o.sender.tab.index;
@@ -171,6 +177,12 @@ Actions = (function() {
       if (base < 0) {
         base = 0;
       }
+
+      if (tabs.length == 1)
+      {
+        chrome.tabs.create({ url: "about:blank" });
+      }
+
       chrome.tabs.remove(sortedIds.slice(base, base + o.request.repeats));
     });
   };

最後のタブを閉じた時に作り直すので微妙にちらつくのが気になるけど vivaldi ごと閉じられることに比べたら問題にならない。tabs#update を使う手もあるけど歴が残るので戻れてしまう。< が有効になるぐらいで実害は無いのだけど tabs#create で様子見することにする。

Vivaldi Edition

Vivaldi Edition