KDE Waylandでウィンドウリストを取得する方法はありますか?

KDE Waylandでウィンドウリストを取得する方法はありますか?

X11時代には、wmctrl -lスクリプトで利用可能なウィンドウを一覧表示できました。

$ wmctrl -l
0x01000050  0 my-pc project1 – Readme.md

しかし今、ほとんどのアプリケーションはWaylandを使用しています。上記のコマンドは、XWaylandを使用して実行されているウィンドウのみを表示します。

私のスクリプトのウィンドウを一覧表示している間、Waylandモードでアプリケーションを使用できるようにしたいです。それは可能ですか?私はアーチLinuxとKDEを使用しています。

答え1

はい、可能です。アイデアはkwinにこの情報を要求することです。これはkwinスクリプトを介して行われます。 dbusとのみ通信できるため、kwinスクリプトでシェルコマンドを実行することはできません(少なくとも直接は実行できません)。しかし、私たちは実行できますシェルスクリプトのkwinスクリプト。

次のスクリプトを作成します~/bin/list_windows.js

const clients = workspace.clientList();
for (var i = 0; i < clients.length; i++) {
  print(clients[i].caption);
}

残念ながら、標準出力出力は現在破損しています。エラーレポート。しかし、解決策があります。開いているkde systemdが起動します。これでJournalctlを使用して出力を抽出できます。生成されたget_list_of_windowsスクリプトは次のとおりです。

#!/usr/bin/env python3

import subprocess
from datetime import datetime


def get_list_of_windows():
   datetime_now = datetime.now()

   script = "/home/andrew/bin/list_windows.js"

   reg_script_number = subprocess.run("dbus-send --print-reply --dest=org.kde.KWin \
                        /Scripting org.kde.kwin.Scripting.loadScript \
                        string:" + script + " | awk 'END {print $2}'",
                           capture_output=True, shell=True).stdout.decode().split("\n")[0]

   subprocess.run("dbus-send --print-reply --dest=org.kde.KWin /" + reg_script_number + " org.kde.kwin.Script.run",
                  shell=True, stdout=subprocess.DEVNULL)
   subprocess.run("dbus-send --print-reply --dest=org.kde.KWin /" + reg_script_number + " org.kde.kwin.Script.stop",
                  shell=True, stdout=subprocess.DEVNULL)  # unregister number

   since = str(datetime_now)

   msg = subprocess.run("journalctl _COMM=kwin_wayland -o cat --since \"" + since + "\"",
                        capture_output=True, shell=True).stdout.decode().rstrip().split("\n")
   msg = [el.lstrip("js: ") for el in msg]

   return msg


print('\n'.join(get_list_of_windows()))

これでスクリプトを実行すると、次のような出力が得られます。

$ get_list_of_windows
Рабочий стол по умолчанию — Plasma
Plasma
Is there a way to get list of windows on KDE Wayland? - Unix & Linux Stack Exchange - Vivaldi
get_list_of_windows — Kate
Andrew Shark / Davinci Resolve Scripts · GitLab — Falkon
project1 – README.md

この時間は私の倉庫

関連情報