Em um script bash, existe alguma maneira de obter o ID da janela X sob o ponteiro do mouse?
(editar) Preciso que o processo seja não interativo.
xdotool
expõe o local do ponteiro ( xdotool getmouselocation
) e versões recentes (desde 2.20110530.1) indicam qual janela também está nesse local . Nada xwininfo
, wmctrl
ou versões mais antigas do xdotool
parecem ter uma maneira de combinar uma janela por uma posição da tela onde é visível.
A chamada da biblioteca X subjacente é XQueryPointer
(correspondente a uma QueryPointer
mensagem). Aqui está um script simples do wrapper Python em torno dessa chamada (usando ctypes
). A verificação de erros foi omitida em grande parte. Supõe que você esteja usando a tela 0 (se você não sabia que os monitores poderiam ter mais de uma tela, ignore).
#! /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)
xdotool click 1
método assíncrono mencionado no comentário à resposta de Bruce Ediger . O ID da área de trabalho diferente de zero é válido, pois retorna a imagem apropriada viaimport -window $nonzeroID screen.png
.... Existe algum ajuste simples para o script python retornar esse valor para a área de trabalho ?$(XQueryPointer)
para0
, e chamandoxwininfo -root
para esta condição resolve esse capricho .. Obrigado ..root_id.value
sechild_id.value == 0
.if child_id.value == 0: print root_id.value
else: print child_id.value
:)sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
O
xwininfo
comando fornece esse tipo de saída, mas você precisa clicar na janela em que deseja obter informações:Assim:
xwininfo | grep 'Window id:'
pode dar a você algo do qual você pode analisar o ID.fonte
xwinfo |grep window id:' &
e seguindo-o atéxdotool click 1
... mas isso corre o risco de o primeiro plano serclick
executado antes dexdotool
agarrar o mouse. I Rathen não usaria um `sono nominal n, por isso, embora esta resposta é na pista, eu vou esperar um wihile para ver se algo mais em linha transforma-se ...tente isso, ele usa apenas xdotool, mas sua versão é pelo menos "2.20110530.1"
para obter o ID da janela diretamente, você pode usar isso:
fonte
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
O xdotool é bom o suficiente para fazê-lo.
Execute
xdotool getactivewindow
e você verá o resultado (int) A janela pode estar em QUALQUER monitor. Basta ler onde está localizado o ponteiro x11 aguardando um clique :) e não importa se é uma janela remota, um servidor vncserver ou a terceira área de trabalho do ambiente de área de trabalho do cubo. Apenas funciona.Você pode reproduzi-lo usando o sono para obter melhores testes
sleep 3; xdotool click 1+2; xdotool getactivewindow
.Eu vi que
getwindowsfocus
retorna o mesmo valor quegetactivewindow
.Se você clicar manualmente, verá o menu contextual, mas clique em 1 + 2 para acionar os dois cliques ao mesmo tempo, clicando no local atual do mouse e obtendo o ID desejado.
Tente :)
fonte
Se você tem acesso ao python-xlib , aqui está um equivalente mais curto e mais pitônico da resposta de Gilles:
fonte
Eu brinquei com a resposta de Peter.O e descobri:
fonte
O ArchWiki tem uma boa resposta para isso:
Usando
sed
você pode fazer isso em uma única linha, que é provavelmente a maneira mais legível de fazer isso:Note que
xdotool
estava faltando no meu Debian X11 mínimo enquantoxprop
estava incluído (da mesma forma ésed
claro).Se você não deseja bifurcar
sed
nemgrep
pode fazer a transformação do texto inteiramentebash
, o que talvez seja um pouco mais seguro, caso a saída dasxprop
alterações mude um pouco:De qualquer forma, ainda é uma maneira estranha de arquivar uma tarefa tão simples.
fonte
fonte
xdotool getwindowsfocus
em um console e mover o mouse. Valor seria o mesmo até que você clique de mouse ou teclado interagem (alt + tab, etc)