私は、フラッシュカードイメージのディレクトリから新しい背景を5分ごとに変更するcronjobを持っています(新しい言語を学習しています)。
現在、ウィンドウを開いていると壁紙が変化します(デスクトップの背景が見えません)。理想的には、すべてのウィンドウを閉じるか最小化したときに、このスクリプトを実行したいです。
これは、フラッシュカードに特定の順序があり、いくつかの遷移がないとエクスペリエンスが損なわれる場合に役立ちます。そのため、私のcronjobを実行するときに、windows/apps visible = 0かどうかを検出して、デスクトップの背景を変更する必要があります。
私は周りを見回して、wmctrlとxlsclientsを見つけましたが、アプリが開いていない、または表示されていない場合でも、すべての種類の情報が表示されます。
スクリプトで使用できるように、コマンドラインからこの状態を検出する方法はありますか?
ありがとう!
既存の回答は適切なツールについて言及していますが、かなりの数の問題があり、そのままでは機能しません。
いくつかの重要なもの:
使用する場合:
_s = Wnck.Screen.get_default()
_
「スタンドアロン」の状況(既存のループではない)では、追加する必要があります(以下を参照)*:
_s.force_update()
_
is_minimzed()
は メソッド であり、_()
_なしでは機能しません
答えはOP以外の状況では使用できません
すべてのウィンドウが最小化されているかどうかを確認する一般的なスクリプトは、次のようになります。
_#!/usr/bin/env python3
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck
s = Wnck.Screen.get_default()
# when not run from a loop, tell it to force_update
# else there will be no output
s.force_update()
all_minimized = True
# go through all windows
for window in s.get_windows():
# exclude windows like the desktop etc.
if window.get_window_type() == Wnck.WindowType.NORMAL:
# see if it is minimized
if not window.is_minimized():
# if any of the windows is not minimized -> all_minimized = False
all_minimized = False
print(all_minimized)
_
から ここ :
よくある落とし穴
libwnckによって提供されるAPIは一般に大部分が単純であるはずですが、いくつかの落とし穴がライブラリのユーザーによってしばしば打たれます。情報の明示的なフェッチWnckScreenオブジェクトは、作成時にXサーバーから情報をフェッチしていません。作成直後に(たとえば、wnck_screen_get_windows()またはwnck_screen_get_workspaces()を介して)照会すると、WnckScreenオブジェクトは、画面にワークスペースもウィンドウもないように見えます。この情報は、起動時にコストのかかる同期操作を回避するために、アイドルソースのあるメインイベントループでフェッチされます。メインイベントループが使用されていない場合、またはオブジェクトの作成後できるだけ早く情報が必要な場合は、wnck_screen_force_update()を使用して明示的に情報をフェッチできます。
結局、pythonスクリプトを使用して、この「すべてのアプリが最小化されている」状態を検出しました。
changebg = True
from gi.repository import Wnck
s = Wnck.Screen.get_default()
for window in s.get_windows():
if window.get_window_type() == Wnck.WindowType.NORMAL:
if not window.is_minimized:
changebg = False
Changebg値に基づいて関連する機能を実行する