我有一个 cronjob,它每 5 分钟从抽认卡图像目录更改一次我的桌面背景(学习一门新语言)。
现在,当我打开窗口时壁纸会发生变化(并且看不到桌面背景)。理想情况下,我希望此脚本在我关闭或最小化所有窗口时运行。
当抽认卡有特定顺序且缺少一些过渡会破坏体验时,这会有所帮助。因此,当我的 cronjob 运行时,我需要检测窗口/应用程序是否可见 = 0,然后才更改桌面背景。
我环顾四周,发现了 wmctrl 和 xlsclients,但即使没有打开或可见的应用程序,它们也会显示各种信息。
有没有办法从命令行检测这种状态,以便我可以在我的脚本中使用它?
谢谢!
答案1
查看所有窗口是否都已最小化
现有的答案提到了正确的工具,但是存在很多问题,并且无法正常工作。
一些重要的内容:
使用时:
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() 显式获取信息。
答案2
我最终使用 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的值执行相关函数