如何从命令行运行 kwin 脚本?

gat*_*ado 11 kde kwin plasma

我写了一个非常基本的 kwin 脚本来按照我喜欢的方式平铺窗口,

// Main reference: http://techbase.kde.org/Development/Tutorials/KWin/Scripting

// Top-level parameters. Adjust these as suitable for your desktop.
var width = 3840;
var third = Math.round(width / 3);


var clients = workspace.clientList();
for (var i=0; i<clients.length; i++) {
  var client = clients[i];
  var cap = client.caption.toLowerCase();
  var g = client.geometry;

  if (cap.indexOf("firefox") != -1) {
    g.x = 0;
    g.width = third;
  } else if (cap.indexOf("vim") != -1) {
    g.x = third;
    g.width = third;
  } else if (cap.indexOf("konsole") != -1) {
    g.x = third * 2;
    g.width = third;
  }

  client.geometry = g;
}
Run Code Online (Sandbox Code Playgroud)

使用脚本控制台(qdbus org.kde.plasma-desktop /MainApplication showInteractiveKWinConsole,或wm console来自 krunner)。

我想将它绑定到一个热键。

我只能找到关于构建 Plasma 包的资源,我还没有开始工作(我有一个metadata.desktop与 中的类似/usr/share/kde4/apps/kwin/scripts,目录内容类似,但它说plasmapkg(3980)/libplasma Plasma::Package::installPackage: Could not register package as service (this is not necessarily fatal): "kwin-script-tilewindows")。

我有点厌倦了使用 Plasma 包装。如何从命令行调用基于 JavaScript 的 kwin 脚本?

编辑/注意

如果您不熟悉,在 KDE 中将命令绑定到热键很容易——只需右键单击应用程序启动器,转到“编辑应用程序”,添加一个新项目,在“命令”框中输入 shell 命令,然后在“高级”选项卡中设置快捷键。

Gra*_*eme 8

有了这里的一些提示,我设法使以下内容起作用:

script=/path/to/script

num=$(dbus-send --print-reply --dest=org.kde.kwin.Scripting \
  /Scripting \
  org.kde.kwin.Scripting.loadScript \
  string:"$script" |
  awk 'END {print $2}' )

dbus-send --print-reply --dest=org.kde.kwin.Scripting \
  /$num \
  org.kde.kwin.Scripting.run
Run Code Online (Sandbox Code Playgroud)


小智 7

这是我在 2022 年必须做的事情才能让它发挥作用

script="/path/to/script"

num=$(dbus-send --print-reply --dest=org.kde.KWin \
    /Scripting org.kde.kwin.Scripting.loadScript \
    string:"$script" | awk 'END {print $2}' )

dbus-send --print-reply --dest=org.kde.KWin /$num \
    org.kde.kwin.Script.run

# I'm not sure if some delay is in order here to let your script complete?
dbus-send --print-reply --dest=org.kde.KWin /$num \
    org.kde.kwin.Script.stop
Run Code Online (Sandbox Code Playgroud)

注意:2019 年我需要使用org.kde.kwin.Scripting.run而不是org.kde.kwin.Script.run.

我不清楚是否需要“停止”命令,但它们似乎会清理 dbus 树,所以也许应该使用它们。我不确定使用它们是否会产生负面影响,所以如果它们造成麻烦,也许尝试不使用它们。