Как определить, когда все окна / приложения свернуты и виден только рабочий стол?
У меня есть cronjob, который меняет фон моего рабочего стола каждые 5 минут из каталога изображений с флэшкартами (изучение нового языка).
Прямо сейчас обои меняются, когда у меня открыты окна (и я не вижу фон рабочего стола). В идеале я хочу, чтобы этот скрипт запускался всякий раз, когда я закрыл или свернул все свои окна.
Это помогает, когда есть определенный порядок для карточек, и пропущенные несколько переходов портят впечатление. Поэтому, когда мой cronjob запускается, мне нужно определить, видимы ли окна / приложения = 0, и только потом менять фон рабочего стола.
Я огляделся и нашел wmctrl и xlsclients, но они отображают всевозможную информацию, даже когда нет открытых или видимых приложений.
Есть ли способ обнаружить это состояние из командной строки, чтобы я мог использовать его в своем сценарии?
Спасибо!
2 ответа
Узнайте, все ли окна свернуты
В существующем ответе упоминаются правильные инструменты, но есть немало проблем, и они не будут работать как есть.
Несколько важных:
Когда используешь:
s = Wnck.Screen.get_default()
В "автономной" ситуации (не из существующего цикла) вам необходимо добавить (см. Ниже)*:
s.force_update()
is_minimzed()
это метод, и не будет работать без()
Ответ не может быть использован в другой ситуации, чем ОП
Общий сценарий, чтобы просто увидеть, все ли окна свернуты, будет:
#!/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