如何从控制台运行 KWin 脚本(将焦点设置到 KDE 中的特定窗口)?

JKA*_*ams 3 scripting kwin focus window

我需要在 KDE 中将焦点设置为 VirtualBox,为此我编写了一个 KWin 脚本,但我不知道如何从控制台运行它。

我尝试过的:

此 KWin 脚本可在桌面 Shell 脚本控制台中运行

如何打开桌面 Shell 脚本控制台:

  1. Alt+ F2,输入

  2. 运行 wm 控制台

剧本:

// Main reference: http://techbase.kde.org/Development/Tutorials/KWin/Scripting
// API: https://techbase.kde.org/Development/Tutorials/KWin/Scripting/API_4.9

// Sets focus to VirtualBox
var clients = workspace.clientList(); 
for (var i=0; i<clients.length; i++) {
  print(clients[i].caption);
  var cap = clients[i].caption;
  if (cap.indexOf("- Oracle VM VirtualBox") != -1) {
    workspace.activeClient = clients[i];
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在 Bash 中运行它时(根据这个方法)脚本似乎没有设置,因为我收到这些错误:

Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.kwin.Scripting was not provided by any .service files
Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.kwin.Scripting was not provided by any .service files
Run Code Online (Sandbox Code Playgroud)

我不知道 dbus 内部是如何工作的,所以从这里开始我只是尝试一下。

我试图修复由较新版本的 KDE 中的变化引起的这些问题:

QDBusViewer

所以我运行qdbusviewer来看看。

它应该是 KWin 而不是 kwin.Scripting。

我在左侧列表中找到 org.kde.KWin,在右侧找到 Scripting,在 org.kde.kwin.Scripting 下,我找到了 loadScript 和 start 方法。我可以通过双击这些方法手动使用这些方法,加载我的脚本文件并且它可以工作,我的脚本运行并且 VirtualBox 获得焦点。

所以我尝试相应地修改加载命令:

dbus-send --print-reply --dest=org.kde.KWin /Scripting org.kde.kwin.Scripting.loadScript string:"/home/jk/msexcel_setfocus.kwinscript"

dbus-send --print-reply --dest=org.kde.KWin /Scripting org.kde.kwin.Scripting.start
Run Code Online (Sandbox Code Playgroud)

这些命令不会出错,但也不起作用。

dbus 是否正常工作?

我尝试其他方法只是为了查看 dbus 是否正常工作,这有效(启用/禁用 FPS 效果):

dbus-send --print-reply --session --dest=org.kde.KWin /Effects org.kde.kwin.Effects.loadEffect string:"showfps"

dbus-send --print-reply --session --dest=org.kde.KWin /Effects org.kde.kwin.Effects.unloadEffect string:"showfps"
Run Code Online (Sandbox Code Playgroud)

编号条目

所以在上面链接的脚本中有这个业务,带有某种编号的路径,我发现在 QDBusViewer 中有时右侧窗格中有编号条目(它们来来去去)。当数字存在时,实际上有一个脚本项和一个运行方法。所以我试试这个:

该命令确实给出了一个与 QDBusViewer 中出现的数字相对应的数字。

num=$(dbus-send --print-reply --dest=org.kde.KWin /Scripting org.kde.kwin.Scripting.loadScript string:"/home/jk/msexcel_setfocus.kwinscript" | awk 'END {print $2}')
echo $num
dbus-send --print-reply --dest=org.kde.KWin /$num org.kde.kwin.Scripting.run
Run Code Online (Sandbox Code Playgroud)

但是最后一个命令不起作用,它也不起作用在 run 方法之前运行 start 方法(如上所述),然后它抱怨数字不见了。

Error org.freedesktop.DBus.Error.UnknownObject: No such object path '/1'
Run Code Online (Sandbox Code Playgroud)

JKA*_*ams 6

经过所有这些麻烦,我找到了另一种设置焦点的方法(将焦点设置为新打开的窗口):

wmctrl -i -a $(wmctrl -l | grep "\- Oracle VM VirtualBox" | tail -n 1 | cut -d ' ' -f1)
Run Code Online (Sandbox Code Playgroud)

仍然有兴趣了解如何运行 KWin 脚本。


小智 5

经过比我希望的多得多的反复试验,似乎可以通过与 Plasmashell 通信直接运行包含脚本的字符串,如下例所示(这恰好是我正在尝试的,作为移动旋转屏幕时的面板):

qdbus org.kde.plasmashell /PlasmaShell evaluateScript \ "panelById(panelIds[0]).location='right'"