So ermitteln Sie anhand des Bash-Skripts, ob das Fenster maximiert oder minimiert ist


11

Ich habe ein Bash-Skript, das meine Fenster im Dual-Screen-Setup vom linken zum rechten Bildschirm verschiebt. Derzeit werden die Fenster-IDs, die von angegeben werden, durchlaufen xdotool search --onlyvisible --maxdepth 2 --class ""und dann um die Bildschirmbreite nach rechts verschoben. Es funktioniert bereits ... es sei denn, das betreffende Fenster wird maximiert oder minimiert.

Was also benötigt wird, ist eine Möglichkeit, den aktuellen Status des Fensters zu überprüfen. Ich habe eine Antwort gefunden , die die Möglichkeit bietet, diese Bits hinzuzufügen und zu entfernen, aber wo kann überprüft werden, ob sie bereits gesetzt sind?

Wenn dies nicht über xdotool möglich ist , sollte es möglich sein, die durch den oben genannten Befehl bereitgestellte Fenster-ID wiederzuverwenden.


Sie können sich auch ansehen, devilspiewelche genau für diese Art von Fensterarbeiten ausgelegt sind. Sie müssen also nicht neu codieren, sondern müssen nur konfigurieren
Ciprian Tomoiagă

Antworten:


11

Informationen zum Fensterstatus abrufen

Sie können die Informationen (und vieles mehr) über den Befehl abrufen:

xprop -id <window_id>

Um das zu bekommen, wonach Sie speziell suchen:

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

Die Ausgabe sieht folgendermaßen aus:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

in einem Fenster, das maximiert (h + v) und gleichzeitig minimiert ist, oder nur

_NET_WM_STATE(ATOM) =

(oder überhaupt keine Ausgabe), wenn keine davon der Fall ist.

Mehr Spaß

Natürlich können Sie in verschiedenen Sprachen Wnck verwenden , wie im folgenden Python-Snippet. (Ausschnitt aus dem Fenster-Shuffler ). Das Snippet gibt eine Liste aus, in der der Fenstername + entweder Trueoder False(minimiert) angezeigt wird.

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

Die Ausgabe sieht aus wie:

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

  • xpropbehandelt sowohl hexadezimale (als Ausgabe von zB wmctrl) als auch dezimale (als Ausgabe von zB xdotool) IDs gleichermaßen, z.

    xprop -id 111371626
    

    oder

    xprop -id 0x06a3656a
    
  • Methoden funktionieren nicht auf Wayland!


1
Hervorragender Vorschlag +1. Als Kommentar habe ich es versucht (unter Linux, X11) und etwas andere Ergebnisse erhalten. Wenn ein Fenster weder ausgeblendet noch maximiert ist, _NET_WM_STATE(ATOM)wird es, wie in der Antwort gezeigt, nicht mit einem leeren Wert angezeigt. Stattdessen ist es überhaupt nicht in der Ausgabe.
John1024

@ John1024 Ah, danke! wird es der Antwort hinzufügen.
Jacob Vlijm

Auf meinem System wird es in beiden Fällen angezeigt, auch wenn es leer ist.
v010dya

Ich möchte hinzufügen, dass die Fenster-ID als Dezimalzahl angegeben werden kann, sodass keine Konvertierung in Hex erforderlich ist. Nur für den Fall, dass dies jemandem hilft.
v010dya

@ v010dya Danke! Siehe aktualisierte Antwort.
Jacob Vlijm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.