🐧

KWin Script を作ってみた

に公開

普段 Kubuntu を使ってるんだけど、アクティブウィンドウの上に重なっているウィンドウだけを半透明化する機能がなかったので、X11 の機能を使って自作のツールを作って対応していた。

https://gitlab.com/tmtms/wmadd

けど X11 じゃなくて Wayland になると外部アプリからウィンドウの操作ができなくなってしまった。
KWin Script を書けばできるんじゃないかと思ってやってみた。

KWin Script についてはこちら

https://develop.kde.org/docs/plasma/kwin/

構文は JavaScript。

たとえば次のファイル(hoge.js)を用意して:

workspace.windowActivated.connect(function(win) {
    if (win) { print(win.caption) }
})

次のようにすると登録できる:

qdbus org.kde.KWin /Scripting loadScript /tmp/hoge.js hoge

実行:

qdbus org.kde.KWin /Scripting start

ログ確認:

journalctl --user -f

これでアクティブウィンドウが変わる度にログにウィンドウ名が出力される。

登録を解除するには:

qdbus org.kde.KWin /Scripting unloadScript hoge

workspace と win のプロパティで使えそうなのはこんな感じ:

  • workspace.stackingOrder - ウィンドウ(KWin::Window)の一覧が取れる。配置が奥から手前の順。
  • workspace.activeWindow - アクティブウィンドウが取れる。
  • win.x, win.y, win.width, win.height - X, Y 座標と幅と高さ。
  • win.opacity - 設定するとウィンドウの透明度を指定できる。

あと色んなイベントをウォッチできる。次のが使えそう:

  • workspace.windowActivated.connect() - アクティブウィンドウが変わると呼び出される関数を登録する
  • workspace.windowAdded.connect() - ウィンドウが追加されたら呼び出される関数を登録する
  • workspace.windowRemoved.connect() - ウィンドウが消されたら呼び出される関数を登録する
  • win.stackingOrderChanged.connect() - ウィンドウの前後が変わったら呼び出される関数を登録する

というわけでスクリプトはできた。

https://gitlab.com/tmtms/fade-overlap/-/blob/master/contents/code/main.js

ところで、KWin script は、「KDEシステム設定」→「ウィンドウの管理」→「KWin スクリプト」でインストールして有効化することができる。毎回 qdbus コマンド叩きたくないので、次にこれをやってみる。

こんなディレクトリ構造を用意する:

fade-overlap
├── contents
│   ├── code
│   │   └── main.js
│   ├── config
│   │   └── main.xml
│   └── ui
│       └── config.ui
├── metadata.json

fade-overlap はスクリプトにつけた名前。

main.js は上で作ったスクリプト。

metadata.json はメタデータ。詳しくはこちら https://develop.kde.org/docs/plasma/kwin/#metadata

これだけでもいいんだけど、設定画面から透明度を設定させようと思って、main.xml と config.ui も用意した。

main.xml は設定ファイルの名前とか型とかが書かれた XML ファイル。
https://develop.kde.org/docs/plasma/widget/configuration/

config.ui は設定画面の UI を定義する XML ファイル。

QT Designer というツールで作れる。designer コマンドで起動して、新しいフォームで Widget を指定してテキトーに作った。

これらを上のようなディレクトリ構造において、

kpackagetool6 --type=KWin/Script -i fade-overlap

とするとインストールされる。

または、ディレクトリを ZIP ファイルに固めて、拡張子を kwinscript にすると、設定の「KWin スクリプト」の「ファイルからインストール」からインストールできる。

KWin script の存在は前から知ってたけど、ずっと調べてなかった。やってみたら簡単だった。

Discussion