Как определить, когда все окна / приложения свернуты и виден только рабочий стол?

У меня есть cronjob, который меняет фон моего рабочего стола каждые 5 минут из каталога изображений с флэшкартами (изучение нового языка).

Прямо сейчас обои меняются, когда у меня открыты окна (и я не вижу фон рабочего стола). В идеале я хочу, чтобы этот скрипт запускался всякий раз, когда я закрыл или свернул все свои окна.

Это помогает, когда есть определенный порядок для карточек, и пропущенные несколько переходов портят впечатление. Поэтому, когда мой cronjob запускается, мне нужно определить, видимы ли окна / приложения = 0, и только потом менять фон рабочего стола.

Я огляделся и нашел wmctrl и xlsclients, но они отображают всевозможную информацию, даже когда нет открытых или видимых приложений.

Есть ли способ обнаружить это состояние из командной строки, чтобы я мог использовать его в своем сценарии?

Спасибо!

2 ответа

Решение

Узнайте, все ли окна свернуты

В существующем ответе упоминаются правильные инструменты, но есть немало проблем, и они не будут работать как есть.

Несколько важных:

  1. Когда используешь:

    s = Wnck.Screen.get_default()
    

    В "автономной" ситуации (не из существующего цикла) вам необходимо добавить (см. Ниже)*:

    s.force_update()
    
  2. is_minimzed() это метод, и не будет работать без ()

  3. Ответ не может быть использован в другой ситуации, чем ОП

Общий сценарий, чтобы просто увидеть, все ли окна свернуты, будет:

#!/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)



отсюда:

Общие Подводные камни

Хотя API, предоставляемый libwnck, в целом должен быть в основном простым, пользователи библиотеки часто сталкиваются с некоторыми подводными камнями. Явная выборка информации При создании объект 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

Другие вопросы по тегам