Scripting

如何從控制台執行 KWin 腳本(將焦點設置到 KDE 中的特定視窗)?

  • December 30, 2017

我需要在 KDE 中將焦點設置為 VirtualBox,為此我編寫了一個 KWin 腳本,但我不知道如何從控制台執行它。

我試過的:

此 KWin 腳本在Desktop 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];
 }
}

但是當我嘗試在 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

我不知道 dbus 在內部是如何工作的,所以從這裡開始我只是嘗試一下。

我試圖解決這些由新版本 KDE 中的變化引起的問題:

QDBusViewer

所以我執行qdbusviewer來看看。

它應該是 KWin 而不是 kwin.Scripting。

我在左側列表中找到 org.kde.KWin,在右側找到 Scripting,在 org.kde.kwin.Scripting 下找到方法 loadScript 並啟動。我可以通過點兩下手動使用這些方法,載入我的腳本文件並且它可以工作,我的腳本開始執行,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

這些命令不會給出錯誤,但它也不起作用。

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"

編號條目

所以在上面連結的腳本中有這個業務,帶有某種編號的路徑,我發現在 QDBusViewer 中,有時在右窗格中有編號的條目(它們來來去去)。當數字存在時,其中實際上有一個 Scripting 項和一個 run 方法。所以我試試這個:

該命令確實給出了一個與 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方法之前執行start方法(如上)也不起作用,然後它抱怨數字消失了。

Error org.freedesktop.DBus.Error.UnknownObject: No such object path '/1'

經過比我想要的更多的試驗和錯誤,似乎可以通過與 Plasmashell 通信直接執行包含腳本的字元串,如下例所示(這恰好是我正在嘗試的,作為移動當我旋轉螢幕時面板):

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

經過這麼多麻煩,我找到了另一種設置焦點的方法(將焦點設置為新打開的視窗):

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

仍然有興趣了解如何執行 KWin 腳本。

引用自:https://unix.stackexchange.com/questions/385697