Como os ids de janelas são dados pelo gerenciador de janelas MATE?

1

Enquanto tentava escrever um script envolvendo wmctrl (já que o MATE no LMDE 2 não oferece tantos recursos avançados quanto outras configurações do WM envolvendo o Compiz, que eu não tenho no LMDE 2), me deparei com o problema de identificar a janela criada mais recentemente entre um conjunto de janelas com o mesmo título.
Esse problema surgiu porque como é declarado aqui , não consigo identificar essa janela usando PIDs.
Então, eu estou querendo saber se a minha suposição, que as identificações de janela são dadas em ordem crescente (EDIT: com algum limite, é claro) mantém.

Se assim for, por favor me dê uma explicação concisa (acho que isso deve ser bastante fácil de responder para qualquer um que saiba o suficiente).

Intimamente relacionado: Eu também ficaria feliz em saber se wmctrl -l ordena as janelas com o mesmo título em ordem numérica (hex). Parece assim, mas não encontrei nenhuma declaração oficialmente documentada sobre isso.

    
por polynomial_donut 30.08.2015 / 23:13

2 respostas

2

IDs de janela são fornecidos pelo servidor X. O gerenciador de janelas não diz nada.

IDs de janela codificam o cliente ao qual a janela pertence nos 12 bits superiores. Os 12 bits inferiores são atribuídos sequencialmente no início, mas se um número intermediário ficar livre, ele pode ser reutilizado. Portanto, comparar IDs de janela não fornece uma indicação confiável de qual janela foi criada por último.

Observe que, mesmo se você pudesse identificar a janela por um ID de processo, isso não ajudaria a descobrir qual é a mais recente, já que os PIDs nem sempre aumentam com o tempo. Mesmo em variantes Unix que atribuem PIDs sequencialmente (o que não é universal), elas são quebradas quando atingem o valor máximo (que é tão baixo quanto 32767 por padrão no Linux). Além disso, os clientes X11 podem ser executados em máquinas diferentes do servidor, mas os IDs de processo são significativos apenas em uma máquina.

Aplicativos compatíveis com Freedesktop, incluindo o Mate Terminal, defina a _NET_WM_USER_TIME property de uma janela sempre que houver atividade do usuário (para o Terminal Mate, isso significa entrada). Você pode consultar a propriedade com xprop -id … _NET_WM_USER_TIME . Isso indica quando uma janela estava ativa pela última vez, não quando foi criada.

Se você quiser identificar com segurança uma janela, uma possibilidade é definir seu título. Outra possibilidade é definir uma variável de ambiente com um valor exclusivo e usar ps ou /proc para localizar o processo com esse valor exclusivo. Você pode localizar o ID do processo do cliente que abriu uma janela do X11 através de sua _NET_WM_PID property , se presente, que você pode consultar com xprop ou com xdotool getwindowpid . As janelas que possuem a propriedade _NET_WM_PID também devem ter a propriedade WM_CLIENT_MACHINE definida como o nome do host da máquina em que o processo do cliente está sendo executado. Isso ajudará para que use processos separados para cada janela .

    
por 31.08.2015 / 02:48
1

Meu palpite é que eles são como PIDs, alocados em ordem crescente, exceto quando não são:

PIDs envolvem.

Vamos supor (por enquanto) que eles só subam. O que aconteceria em um sistema que está em execução há muito tempo? Id vai ficar muito grande, ou tamanho de ID deve ser permitido para crescer, 32 bits, 64 bits, 128 bits ...

Se eles tivessem que subir só então eles poderiam acabar, com muitos recursos do sistema ainda livres (sem reutilização, então eventualmente o sistema morreria de exaustão de ID).

    
por 30.08.2015 / 23:51