Memanipulasi kunci X dan pointer meraih di baris perintah

20

Alat baris perintah apa yang ada untuk membuat daftar dan mengelola server X? (Itu ambil seperti pada ambil kunci dan pointer, yaitu membatasi penggunaan tombol atau tombol mouse tertentu untuk aplikasi tertentu, atau membatasi pointer mouse untuk tetap berada di area layar tertentu.) Saya mencari xgrabutilitas hipotetis yang akan tunjukkan hal-hal seperti

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

yang berarti bahwa telah panggilan ke XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)dan sebagainya dengan XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(jika memungkinkan). Format tampilan tidak masalah, yang saya inginkan adalah beberapa cara untuk melihat siapa yang mengambil apa, dan mungkin beberapa cara untuk mencabut ini (jika mungkin, saya tidak yakin apakah API X11 memungkinkan itu).

Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

21

Versi terbaru dari X (server X.org ≥1.11) mendukung beberapa kunci debug, diperkenalkan dalam komit ini . Ketika dipicu, ini melakukan tindakan yang terkait dengan pengambilan.

Secara default ( setidaknya dalam versi terbaru ), ini dinonaktifkan (absen dari keymap default).

Namun, jika Anda telah xdotoolterinstal, adalah mungkin untuk memanggil mereka, dengan menjalankan pada baris perintah:

xdotool key NameOfKey

di mana NameOfKeykunci tombol yang ingin Anda aktifkan. Misalnya, untuk mencetak daftar pengambilan aktif ke log X server, gunakan xdotool key XF86LogGrabInfo.

Kata kunci yang relevan adalah:

Perhatikan bahwa XF86LogGrabInfohanya mencantumkan penarikan aktif, bukan penarikan pasif seperti ambil pada tombol yang saat ini tidak ditekan. Jika Anda ingin mendapatkan informasi tentang perampasan pasif, Anda perlu mengaktifkan perampasan: jalankan xdotool key XF86LogGrabInfosementara kord kunci atau kombinasi tombol mouse yang Anda minati ditekan. Lakukan sesuatu seperti:

  1. Menjalankan sleep 1; xdotool key XF86LogGrabInfo
  2. Dalam 1 detik, tekan kombinasi tombol atau tombol mouse.
  3. Setelah 1 detik, lepaskan tombol / tombol.
  4. Periksa informasi "Ambil aktif ..." di log server X (sering /var/log/Xorg.0.log).
Siput mekanik
sumber
2
Menguji sekarang di Debian wheezy dengan Xorg 1.12.4, xdotool key XF86LogGrabInfomemicu hanya dua entri dalam log X: "Mencetak semua perangkat yang saat ini mengambil:" segera diikuti oleh "Daftar akhir dari perangkat yang mengambil yang aktif". Namun manajer jendela saya mengambil banyak kunci. Pernahkah Anda melihat pekerjaan ini untuk mengambil kunci?
Gilles 'SANGAT berhenti menjadi jahat'
4
@Gilles - tidak, Anda tidak akan mendapatkan output apa pun jika Anda menjalankannya seperti itu ... coba jalankan dengan sleep 2; xdotool key "XF86LogGrabInfo"dan segera mulai menekan tombol (mis. Tombol "Win") sangat cepat, maka Anda akan melihat beberapa output dalam Xorg.log. Atau gunakan xdotooluntuk menekan tombol + XF86LogGrabInfopada saat yang sama, seperti di sini
don_crissti
@don_crissti Ah, begitu, XF86LogGrabInfohanya mencetak informasi tentang kunci yang saat ini ditekan? Itu membatasi kegunaannya. Saya ingin membuat daftar semua grab - semua grab pasif, jika saya memahami terminologi dengan benar.
Gilles 'SANGAT berhenti menjadi jahat'
Mungkin ada beberapa cara pintar untuk menggabungkan ini dengan pencarian lengkap dari kombinasi tombol, semoga tanpa keyboard virtual. Tentunya diluar pengetahuan saya.
Adam Katz
Terima kasih! Ini membantu saya menemukan bahwa xfsettingsdmencuri Win+ Lshortcut saya .
Mikel
8

Saya tidak tahu apa-apa dari tangan untuk diperebutkan pasif 1 dari kunci tunggal atau tombol yang mungkin ada, tapi ada beberapa cara untuk daftar diperebutkan aktif seluruh keyboard atau mouse perangkat.

  1. Pada semua platform, tetapi hanya dengan Xorg 1.11 dan yang lebih baru (atau versi yang lebih lama dengan patch diterapkan), memetakan hotkey untuk membuang ambil data ke log seperti yang dijelaskan dalam catatan patch ini .
  2. Pada Solaris 11 (baik Solaris 11 Express 2010.11 atau rilis Solaris 11 yang sebenarnya), gunakan skrip debugger seperti /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, seperti yang dijelaskan dalam Grabbing Information dari X Server . Ada juga satu di sini untuk diperebutkan server, yang saat ini tidak mencakup hotkey Xorg 1.11.

1 Lihat http://tronche.com/gui/x/xlib/input/pointer-grabbing.html untuk definisi pengambilan aktif vs pasif.

alanc
sumber
4

Ini adalah tambahan untuk jawaban siput Mekanik -

Entri dalam log Xorg bisa sangat tidak dapat diuraikan. Saya menulis sebuah program yang mem-parsing mereka dan menyajikannya dalam bentuk yang bisa ditelusuri manusia:

https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e

Untuk menggunakan, jalankan pertama xdotool key XF86LogGrabInfo, seperti yang dijelaskan dalam jawaban siput mekanik. Kemudian, jalankan program yang ditautkan di atas. Jika file log Xorg Anda tidak terletak di /var/log/Xorg.0.log, Anda dapat menentukan lokasinya menggunakan --xorg-logopsi. Lihat --helpdetailnya.

Vladimir Panteleev
sumber
1
Inti yang disebutkan di sini diprogram dalam bahasa D. Untuk mendapatkan file yang dapat dieksekusi, seseorang dapat menginstal paket gdc(kompiler D GNU) dan libx11-devkemudian menjalankannya gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Stéphane Gourichon