2016-07-22 22 views
1

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

Antwort

1

Könnte Kind Fenster sein, oder die Dekoration, die die Window-Manager fügt ein einfaches Fenster.

Übrigens, der normale Weg zu erkennen, ob sich Ihr Fenster unter der Maus befindet, ist das Abfangen von XEnterWindowEvent und XLeaveWindowEvent, aber das geschieht normalerweise innerhalb des Programms selbst, nicht extern.

+0

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

+0

Ja, die Reihenfolge sollte RootWindow -> DecorationWindow -> AppWindow sein (wobei DecorationWindow vom Fenstermanager hinzugefügt wird). Ein XQueryTree sollte Ihnen mehr sagen können ... – JvO