Dari skrip bash, apakah ada cara untuk mendapatkan ID dari jendela X di bawah penunjuk tetikus?
(sunting) Saya perlu prosesnya menjadi non-interaktif.
xdotool
memperlihatkan lokasi penunjuk ( xdotool getmouselocation
), dan versi terbaru (sejak 2.20110530.1) menunjukkan jendela mana yang berada di lokasi itu juga . Tak satu pun dari xwininfo
, wmctrl
atau versi yang lebih lama dari xdotool
tampaknya memiliki cara untuk mencocokkan jendela dengan posisi layar di mana itu terlihat.
Panggilan pustaka X yang mendasarinya adalah XQueryPointer
(terkait dengan QueryPointer
pesan). Berikut ini skrip pembungkus Python sederhana untuk panggilan ini (menggunakan ctypes
). Pemeriksaan kesalahan sebagian besar dihilangkan. Asumsikan Anda menggunakan layar 0 (jika Anda tidak tahu bahwa tampilan bisa memiliki lebih dari satu layar, abaikan ini).
#! /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
Contoh penggunaan:
xwininfo -tree -id $(XQueryPointer)
xdotool click 1
metode yang disebutkan dalam komentar untuk Bruce Ediger ini jawabannya .. The-nol non ID desktop sedemikian rupa berlaku karena mengembalikan gambar yang sesuai melaluiimport -window $nonzeroID screen.png
.... Apakah ada beberapa Tweak sederhana untuk script python untuk kembali bahwa nilai untuk desktop ?$(XQueryPointer)
untuk0
, dan menyerukanxwininfo -root
untuk kondisi ini menyelesaikan permainan kata-kata ini .. Terima kasih ..root_id.value
jikachild_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))
The
xwininfo
perintah memberikan semacam ini output, tetapi Anda harus mengklik pada jendela Anda ingin info tentang:Melakukan hal itu:
xwininfo | grep 'Window id:'
mungkin memberi Anda sesuatu yang bisa Anda uraikan dari ID.sumber
xwinfo |grep window id:' &
, dan mengikutinya denganxdotool click 1
... tapi itu berisikoclick
mengeksekusi foreground sebelumxdotool
meraih mouse. Saya tidak akan menggunakan nominal `sleep n, jadi meskipun jawaban ini tepat, saya akan menunggu sebentar untuk melihat apakah sesuatu yang lebih inline muncul ...coba ini, ini hanya menggunakan xdotool, tetapi versinya paling tidak "2.20110530.1"
untuk mendapatkan id jendela secara langsung, Anda dapat menggunakan ini:
sumber
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool cukup baik untuk melakukannya.
Jalankan
xdotool getactivewindow
dan Anda akan melihat hasilnya (int) Jendela bisa melalui monitor APAPUN. Cukup baca di mana letak pointer x11 menunggu klik :), dan tidak masalah apakah itu jendela jarak jauh, vncserver, atau desktop ke-3 dari lingkungan desktop kubus. Hanya bekerja.Anda dapat memainkannya menggunakan sleep untuk pengujian yang lebih baik
sleep 3; xdotool click 1+2; xdotool getactivewindow
.Saya telah melihat bahwa
getwindowsfocus
mengembalikan nilai yang sama daripadagetactivewindow
.Jika Anda melakukan klik secara manual Anda akan melihat menu kontekstual, tetapi klik 1 + 2 menembakkan kedua klik pada saat mengklik pada lokasi mouse saat ini dan mendapatkan id yang diinginkan.
Cobalah :)
sumber
Jika Anda memiliki akses ke python-xlib , berikut ini persamaan yang lebih pendek dan lebih pythonic dengan jawaban Gilles:
sumber
Saya bermain-main dengan jawaban dari Peter.O dan muncul dengan:
sumber
ArchWiki memiliki jawaban yang bagus untuk ini:
Menggunakan
sed
Anda dapat melakukan ini dalam satu baris, yang mungkin merupakan cara yang paling mudah dibaca untuk melakukannya:Catat itu
xdotool
hilang di Debian minimal X11 saya saatxprop
dimasukkan (jugased
tentu saja).Jika Anda tidak ingin melakukan fork, Anda
sed
juga tidakgrep
dapat melakukan transformasi teks seluruhnyabash
, yang mungkin sedikit lebih aman jika output darixprop
perubahan sedikit:Bagaimanapun, ini masih merupakan cara aneh untuk mengarsipkan tugas yang begitu sederhana.
sumber
sumber
xdotool getwindowsfocus
dari konsol dan menggerakkan mouse. Nilai akan sama sampai Anda mengklik mouse atau berinteraksi keyboard (alt + tab, dll)