Respostas:
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)
$(XQueryPointer)
para 0
, e chamando xwininfo -root
para esta condição resolve esse capricho .. Obrigado ..
root_id.value
se child_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:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Assim: xwininfo | grep 'Window id:'
pode dar a você algo do qual você pode analisar o ID.
xwinfo |grep window id:' &
e seguindo-o até xdotool click 1
... mas isso corre o risco de o primeiro plano ser click
executado antes de xdotool
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"
xdotool getmouselocation --shell | grep WINDOW
para obter o ID da janela diretamente, você pode usar isso:
sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
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 que getactivewindow
.
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 :)
Se você tem acesso ao python-xlib , aqui está um equivalente mais curto e mais pitônico da resposta de Gilles:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Eu brinquei com a resposta de Peter.O e descobri:
xdotool click 1|xwininfo|grep 'Window id:'
O 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 Debian X11 mínimo enquanto xprop
estava incluído (da mesma forma é sed
claro).
Se você não deseja bifurcar sed
nem grep
pode fazer a transformação do texto inteiramente bash
, o que talvez seja um pouco mais seguro, caso a saída das xprop
alterações 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.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
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)
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 ?