Jak ustalić, czy okno jest zmaksymalizowane czy zminimalizowane ze skryptu bash

11

Mam skrypt bash, który przenosi moje okna z lewego ekranu na prawy ekran w konfiguracji z dwoma ekranami. Obecnie sposób, w jaki to działa, polega na przewijaniu identyfikatorów okien, które są podawane przez, xdotool search --onlyvisible --maxdepth 2 --class ""a następnie przesuwa je w prawo o szerokość ekranu. Działa już ... chyba że okno jest zmaksymalizowane lub zminimalizowane.

Potrzebny jest więc sposób sprawdzenia aktualnego stanu okna. Znalazłem odpowiedź, która umożliwia dodawanie i usuwanie tych bitów, ale gdzie jest sposób, aby sprawdzić, czy są już ustawione?

Jeśli nie można tego zrobić za pomocą xdotool , powinno być możliwe ponowne użycie identyfikatora okna dostarczonego przez komendę wspomnianą powyżej.

v010dya
źródło
możesz również sprawdzić, devilspiektóry jest przeznaczony do wykonywania dokładnie tego rodzaju prac okiennych. Więc nie trzeba przekodowywać, wystarczy skonfigurować
Ciprian Tomoiagă

Odpowiedzi:

11

Pobierz informacje o stanie okna

Możesz uzyskać informacje (i wiele więcej) z polecenia:

xprop -id <window_id>

Aby uzyskać to, czego konkretnie szukasz:

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

Dane wyjściowe będą wyglądać następująco:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

w oknie, które jest zmaksymalizowane (h + v) i zminimalizowane w tym samym czasie lub po prostu

_NET_WM_STATE(ATOM) =

(lub brak danych wyjściowych), jeśli żadna z nich nie ma miejsca.

Więcej zabawy

Oczywiście, używając różnych języków, możesz użyć Wnck , podobnie jak w poniższym fragmencie python. (fragment z shufflera okien ). Fragment generuje listę z nazwą okna + albo Truealbo False(zminimalizowaną).

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

Wyjście wygląda następująco:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - [email protected] - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

NB

  • xpropbędzie handel zarówno szesnastkowym (jako wyjście z np. wmctrl), jak i dziesiętnym (jako wyjście z np. xdotool) id w równym stopniu np. użyj:

    xprop -id 111371626
    

    lub

    xprop -id 0x06a3656a
    
  • Metody nie będą działać na Wayland!

Jacob Vlijm
źródło
1
Doskonała sugestia +1. Jako komentarz spróbowałem (pod Linuksem, X11) i uzyskałem nieco inne wyniki. Gdy okno nie jest ani ukryte, ani zmaksymalizowane, _NET_WM_STATE(ATOM)nie pojawia się, jak pokazano w odpowiedzi, z pustą wartością. Zamiast tego nie ma go wcale na wyjściu.
John1024,
@ John1024 Ach, dzięki! doda to do odpowiedzi.
Jacob Vlijm,
W moim systemie jest to pokazane w obu przypadkach, nawet gdy jest puste.
v010dya
Chcę dodać, że identyfikator okna można podać jako liczbę cecimal, więc nie trzeba konwertować na hex. Na wszelki wypadek to komuś pomoże.
v010dya
@ v010dya Thanks! Zobacz zaktualizowaną odpowiedź.
Jacob Vlijm