Як визначити, чи вікно максимізоване чи мінімізоване від bash script


11

У мене є сценарій bash, який переміщує мої вікна з лівого на правий екран у режимі подвійного екрана. В даний час спосіб її роботи проходить через ідентифікатори вікон, які задаються, xdotool search --onlyvisible --maxdepth 2 --class ""а потім переміщує їх праворуч по ширині екрана. Він вже працює ... якщо тільки вікно, про яке йдеться, не максимізоване чи мінімізоване.

Отже, необхідний спосіб перевірити поточний стан вікна. Я знайшов відповідь, яка пропонує спосіб додавати та видаляти ці біти, але де це спосіб перевірити, чи вони вже встановлені?

Якщо це неможливо зробити через xdotool , слід мати можливість повторного використання ідентифікатора вікна, передбаченого командою, згаданою вище.


Ви також можете подивитися, devilspieщо призначено для виконання саме таких видів роботи з вікнами. Тому не потрібно перекодувати, просто налаштуйте
Ciprian Tomoiagă

Відповіді:


11

Отримайте інформацію про стан вікна

Ви можете отримати інформацію (та багато іншого) з команди:

xprop -id <window_id>

Щоб отримати те, що ви конкретно шукаєте:

xprop -id 0x04c00010 | grep "_NET_WM_STATE(ATOM)"

Вихід буде виглядати так:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

у вікні, яке максимально (h + v) і мінімізоване одночасно, або просто

_NET_WM_STATE(ATOM) =

(або взагалі немає результатів), якщо жодного з них не відбувається.

більше веселощів

Звичайно, використовуючи різні мови, ви можете використовувати Wnck , як у фрагменті пітона нижче. (фрагмент від вікна-шуфлера ). Фрагмент виводить список, показуючи ім'я вікна + або Trueабо False(мінімізоване).

#!/usr/bin/env python3
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck


def get_winlist(scr=None, selecttype=None):
    """
    get the window list. possible args: screen, select_type, in case it is
    already fetched elsewhere. select type is optional, to fetch only
    specific window types.
    """
    if not scr:
        scr = Wnck.Screen.get_default()
        scr.force_update()
    windows = scr.get_windows()
    if selecttype:
        windows = [w for w in windows if check_windowtype(w, selecttype)]
    return windows

wlist = get_winlist()
for w in wlist:
    print(w.get_name(), ",", w.is_maximized())

Результат виглядає так:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - vlijm@planet.nl - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

NB

  • xpropбуде обробляти як шістнадцятковий (як вихід з напр. wmctrl), так і десятковий (як вихід з напр. xdotool) id однаково, наприклад, або використання:

    xprop -id 111371626
    

    або

    xprop -id 0x06a3656a
    
  • Методи не будуть працювати на Wayland!


1
Відмінна пропозиція +1. Як коментар, я спробував це (під Linux, X11) і отримав трохи інші результати. Якщо вікно не є ні прихованим, ні максимальним, _NET_WM_STATE(ATOM)воно, як показано у відповіді, не відображається з порожнім значенням. Натомість це зовсім не у виході.
John1024

@ John1024 Ах, дякую! додасть це у відповідь.
Яків Влійм

У моїй системі це відображається в будь-якому випадку, навіть якщо він порожній.
v010dya

Я хочу додати, що ідентифікатор вікна може бути заданий у вигляді краткового числа, тому не потрібно перетворювати у шістнадцятковий. Про всяк випадок це комусь допоможе.
v010dya

@ v010dya Дякую! Дивіться оновлену відповідь.
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.