Xlib



  • Hallo!

    Ich würde mit der Xlib unter C++ gerne feststellen ob eine bestimmte Taste momentan gedrückt ist und wo sich der Mauscursor gerade befindet (+gedrückte Maustasten).

    Ich möchte dazu keine höheren Bibliotheken wie Qt, GTK oder ähnliches verwenden, sondern direkt die Xlib. Ich will außerdem nicht mit der Message-Loop ( while(XPending(...){} ) arbeiten, sondern es zu einem beliebigen Zeitpunkt abfragen. Es soll (wenn möglich) systemweit funktionieren, nicht nur im eigenen Fenster. Unter Windows liefert die Win32-API entsprechende Funktionen die das können und ich nehme an, dass das mit der Xlib auch geht, nur weiß ich nicht wie.

    Danke schonmal!

    mfg



  • Schau Dir doch mal die xev-Sourcen an! 🙂



  • Ok, ich habe es herausgefunden dass es irgendwie mit XQueryCursor geht. Ich verstehe aber die vielen Parameter nicht, oder besser gesagt: ich weiß zwar nach dem ich ins Manual geschaut habe was sie bedeuten, sie sind aber für meinen Zweck unnötig. Da steht was von root window und child window, ich möchte die Koordinaten aber absolut am Bildschirm haben. Wie geht denn das?

    mfg



  • RootWindow ist das Grundfenster, worauf auch der Hintergrund gezeichnet wird.

    http://tronche.com/gui/x/xlib/function-index.html



  • struct XDisplay
    {
        Display* display;
        Window rootwin;
    
        XDisplay()
        {
            if(!(display = XOpenDisplay(":0.0"))) // TODO
                assert(!"XOpenDisplay");
    
            rootwin = DefaultRootWindow(display);
        }
    
        ~XDisplay()
        {
            XCloseDisplay(display);
        }
    
        Point query_pointer()
        {
            int x, y, dummy;
            Window dummywin;
            XQueryPointer(display, rootwin, &dummywin, &dummywin, &x, &y,
                          &dummy, &dummy, (unsigned*)&dummy);
            return Point(x, y);
        }
    
        void warp_pointer(const Point& p) {
            XWarpPointer(display, 0, rootwin, 0, 0, 0, 0, p.x, p.y);
        }
    };
    

    kann sein das dummy auch null sein kann. Der Code ist älter, aber ich vermute ich hatte meine Gründe. Mit dem letzten Parameter von XQueryPointer müsstest du auch die Buttons feststellen können.


Anmelden zum Antworten