Ich versuche derzeit zu finden, wenn eines meiner Windows unter dem Mauszeiger ist. Dies geschieht nicht in meinem Prozess, der das Fenster erstellt, sondern in einem anderen Prozess.X11: XQueryPointer gibt mir fuzzy Windows
Was ich gerade mache ist das Finden des Fensters über die Prozess-PID (und ich stellte sicher, dass _NET_WM_PID
richtig von meinem Programm eingestellt ist). Dies funktioniert grundsätzlich über XQueryTree
und XGetWindowProperty
. Das funktioniert gut und ist nicht das Problem.
Das Problem ist, dass XQueryPointer
gibt mir fuzzy Windows zurück. Ich habe ein einfaches Testprogramm geschrieben, um zu zeigen, was ich meine. Sammeln Sie zuerst eine ID aus einem beliebigen Fenster mit dem Befehl xprop
via bash. Es wird Ihnen die Window ID geben.
Dann dieses einfache Testprogramm laufen I (quick and dirty) schrieb, es gibt Ihnen jede 0,5s die aktuelle ID aus dem Fenster unter dem Cursor der Maus:
#include <X11/Xlib.h>
#include <iostream>
#include <unistd.h>
#include <stdint.h>
int main()
{
Display *display = XOpenDisplay(0);
Window root = XDefaultRootWindow(display);
Window root_return;
Window child_return;
int root_x_return;
int root_y_return;
int win_x_return;
int win_y_return;
uint32_t mask_return;
while (true)
{
if (::XQueryPointer(display, root, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &mask_return) == True)
{
std::cout << "Window ID: " << child_return << std::endl;
}
usleep(500000);
}
return 0;
}
Kann jemand mir sagen, was das Problem ist?
Und hier ist mein Beispiel für die Ausgabe: Mein Programm findet ID Fenster 73400324
xprop
Fenster ID findet 73400324
Das Testprogramm findet Fenster ID 20996726
Aus verschiedenen Gründen kann ich diese Ereignisse nicht abfangen und muss dies über ein externes Programm tun. Kann ich irgendwie das "Master" -Fenster einer beliebigen Fenster-ID erkennen? Wird das immer ein Fenster sein, das ein Kind des Root-Fensters ist? In diesem Fall könnte ich die Elternfenster der XID erreichen, die ich finde, bis ich das Fenster über der Wurzel erreichen würde? – Nidhoegger
Ja, die Reihenfolge sollte RootWindow -> DecorationWindow -> AppWindow sein (wobei DecorationWindow vom Fenstermanager hinzugefügt wird). Ein XQueryTree sollte Ihnen mehr sagen können ... – JvO