如何检测所有窗口/应用程序何时最小化且仅桌面可见?

如何检测所有窗口/应用程序何时最小化且仅桌面可见?

我有一个 cronjob,它每 5 分钟从抽认卡图像目录更改一次我的桌面背景(学习一门新语言)。

现在,当我打开窗口时壁纸会发生变化(并且看不到桌面背景)。理想情况下,我希望此脚本在我关闭或最小化所有窗口时运行。

当抽认卡有特定顺序且缺少一些过渡会破坏体验时,这会有所帮助。因此,当我的 cronjob 运行时,我需要检测窗口/应用程序是否可见 = 0,然后才更改桌面背景。

我环顾四周,发现了 wmctrl 和 xlsclients,但即使没有打开或可见的应用程序,它们也会显示各种信息。

有没有办法从命令行检测这种状态,以便我可以在我的脚本中使用它?

谢谢!

答案1

查看所有窗口是否都已最小化

现有的答案提到了正确的工具,但是存在很多问题,并且无法正常工作。

一些重要的内容:

  1. 使用时:

     s = Wnck.Screen.get_default()
    

    在“独立”情况下(不是来自现有循环),您需要添加(请参阅下文)*:

     s.force_update()
    
  2. is_minimzed()方法,如果没有()

  3. 除了 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的值执行相关函数

相关内容