Como faço para encontrar o ID da janela X sob o ponteiro do mouse no bash?

17

De um script bash, existe alguma maneira de obter o ID da janela X sob o ponteiro do mouse?

(edit) Eu preciso que o processo seja não interativo.

    
por Peter.O 06.07.2011 / 05:52

8 respostas

21

xdotool expõe a localização do ponteiro ( xdotool getmouselocation ) e Versões recentes (desde 2.20110530.1) indicam qual janela está nesse local também . Nenhuma das versões xwininfo , wmctrl ou anterior de xdotool parece ter uma maneira de corresponder a uma janela por uma posição de tela visível.

A chamada da biblioteca X subjacente é XQueryPointer (correspondente a um QueryPointer message). Aqui está um script wrapper Python simples em torno desta chamada (usando ctypes ). Verificação de erros amplamente omitida. Supõe que você esteja usando a tela 0 (se você não sabia que as exibições poderiam ter mais de uma tela, ignore isso).

#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
                         byref(root_x), byref(root_y),
                         byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value

Exemplo de uso:

xwininfo -tree -id $(XQueryPointer)
    
por 06.07.2011 / 14:12
16

O comando xwininfo fornece esse tipo de saída, mas você precisa clicar na janela em que deseja obter informações:

% xwininfo
xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0xa0000d "flask"

...

Sendo assim: xwininfo | grep 'Window id:' pode fornecer algo do qual você pode analisar o ID.

    
por 06.07.2011 / 06:14
6

tente isso, ele usa apenas xdotool, mas sua versão é pelo menos "2.20110530.1"

xdotool getmouselocation --shell | grep WINDOW

para obter o ID da janela diretamente, você pode usar isto:

sedGetValue='s/.*=\(.*\)//'
windowId='xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"'
echo $windowId
    
por 01.04.2013 / 10:50
1

xdotool é bom o suficiente para fazer isso.

Execute xdotool getactivewindow e você verá o resultado (int) A janela pode estar em qualquer monitor. Apenas leia onde está localizado o ponteiro x11 esperando por um clique :), e não importa se é uma janela remota, um vncserver ou a terceira área de trabalho do ambiente de área de trabalho do cubo. Apenas funciona.

Você pode reproduzi-lo usando o modo de espera para testar melhor sleep 3; xdotool click 1+2; xdotool getactivewindow .

Eu vejo que getwindowsfocus retorna o mesmo valor que getactivewindow .

Se você fizer os cliques manualmente, verá o menu contextual, mas clique em 1 + 2 para disparar os dois cliques, clicando no local atual do mouse e obtendo o ID desejado.

Experimente:)

    
por 25.05.2015 / 06:33
0

Brinquei com a resposta de Peter.O e veio com:

xdotool click 1|xwininfo|grep 'Window id:'
    
por 20.05.2013 / 16:19
0

ArchWiki tem uma boa resposta para isso:

activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}

Usando sed , você pode fazer isso em uma única linha, que é provavelmente a maneira mais legível de fazer isso:

activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"

Note que xdotool estava faltando no meu X11 mínimo Debian enquanto xprop foi incluído (da mesma forma sed , claro).

Se você não quiser bifurcar sed nem grep você pode fazer a transformação do texto completamente em bash , o que talvez seja um pouco mais seguro caso a saída de xprop mude um pouco :

activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'

De qualquer forma, ainda é uma maneira estranha de arquivar uma tarefa tão simples.

    
por 21.09.2013 / 14:21
0
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
    
por 22.11.2014 / 13:11
0

Se você tiver acesso a python-xlib , aqui está um equivalente mais curto e mais patético da resposta de Gilles:

from Xlib.display import Display

display = Display()
window = display.screen().root
result = window.query_pointer()

print(result.child.id)
    
por 18.01.2018 / 03:05