Como determinar se a janela é maximizada ou minimizada a partir do script bash

11

Eu tenho um script bash que move minhas janelas da tela esquerda para a direita na configuração de tela dupla. Atualmente, o modo como funciona é percorrer os IDs da janela fornecidos xdotool search --onlyvisible --maxdepth 2 --class ""e os move para a direita pela largura da tela. Ele já funciona ... a menos que a janela em questão seja maximizada ou minimizada.

Portanto, o que é necessário é uma maneira de verificar o status atual da janela. Eu encontrei uma resposta que fornece a maneira de adicionar e remover esses bits, mas onde é o caminho para verificar se eles já estão definidos?

Se não for possível fazê-lo através do xdotool , deve ser possível reutilizar o ID da janela fornecido pelo comando mencionado acima.

v010dya
fonte
você também pode ver devilspiequal é projetado para fazer exatamente esse tipo de trabalho de janela. Portanto, não há necessidade de recodificar, apenas configure
Ciprian Tomoiagă

Respostas:

11

Recuperar informações no estado da janela

Você pode obter as informações (e muito mais) no comando:

xprop -id <window_id>

Para obter o que você está procurando especificamente:

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

A saída será semelhante a:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

em uma janela que é maximizada (h + v) e minimizada ao mesmo tempo, ou apenas

_NET_WM_STATE(ATOM) =

(ou nenhuma saída) se nenhum desses for o caso.

Mais divertido

Obviamente, usando várias linguagens, você pode usar o Wnck , como no snippet de python abaixo. (trecho do shuffler de janela ). O trecho gera uma lista, mostrando o nome da janela + Trueou False(minimizado).

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

A saída se parece com:

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

  • xpropmanipulará os IDs hexadecimal (como saída de, por exemplo wmctrl) e decimal (como saída de, por exemplo xdotool), por exemplo , igualmente:

    xprop -id 111371626
    

    ou

    xprop -id 0x06a3656a
    
  • Métodos não funcionarão em Wayland!

Jacob Vlijm
fonte
1
Excelente sugestão +1. Como comentário, tentei (no Linux, X11) e obtive resultados ligeiramente diferentes. Quando uma janela não está oculta nem maximizada, _NET_WM_STATE(ATOM)ela não aparece, como mostra a resposta, com um valor vazio. Em vez disso, ele não está na saída.
precisa saber é o seguinte
@ John1024 Ah, obrigado! irá adicioná-lo à resposta.
Jacob Vlijm
No meu sistema, é mostrado nos dois casos, mesmo quando vazio.
precisa saber é o seguinte
Quero acrescentar que o ID da janela pode ser dado como um número cecimal, portanto, não há necessidade de converter para hexadecimal. Apenas no caso de isso ajudar alguém.
precisa saber é o seguinte
@ v010dya Obrigado! Veja a resposta atualizada.
Jacob Vlijm