Doku zu Atom und sonstige Fragen zu X11



  • Ich beschäftige mich momentan mit den Atomen von xlib.
    Was ich bis jetzt über diese raus gefunden habe, wie man das [ x ] in der Fensterleiste abfangen kann. Oder wie das Clipboard unter xlib funktioniert oder wie man ein Fenster in Fullscreen schaltet.
    Wen man xlsatoms in der Konsole eingibt, kommen über 1000Stk. von diesen. Wobei nur etwa die ersten 500 interessant sind. Welche mit höheren Nummern sind meistens anwendunsspezifisch.
    Ich vermute, da gibt es noch recht viele Sachen, die man mit Atomen ausprobieren kann.

    Nun zur Frage.
    Kennt jemand eine Doku, wie die Angewendet werden ?



  • Wie ich Dir letztlich schon mitgeteilt habe solltest Du zuerst in die O'Reilly X Series reinschauen. Konkrekt geht es um Band 1 Xlib Programming Manual.



  • Danke, habe gerade das erste Beispiel ausprobiert.

    Dabei bin ich auf XGetIconSizes gestossen, aber da wird mir 0 zurück geliefert.

    Ich habe hier nachgeguckt:
    https://tronche.com/gui/x/xlib/ICC/client-to-window-manager/XGetIconSizes.html

    Kann es sein, das Moderne Fenstermanager dies nicht mehr unterstützen ?



  • Dann probiere das einfach mit einem anderen Window Manager aus z.B. mwm, das ist der sehr simple WindowManager von Motif.



  • @john-0
    Habe den MWM probiert, da kommt ein Icon-Eintrag. Den FVWM habe ich auch probiert, da kommt keiner.

    Was auch noch spannend ist, da gibt es noch XQueryBestxxxx. Da kann man total unrunde Werte mit geben, und es werden dies auch wieder ausgespuckt, ausser beim Cursor, da wird auf 2^x gerundet.

    Da kann ich mir noch gut vorstellen, da bei uralten Fenstermanagern immer auf einen 2^x Wert gerundet wurde.
    Bei OpenGL war dies bei den Texturgrössen mal so.



  • Ich wollte den Fenster-Titel auslesen, welchen ich mit XStoreName() gesetzt habe.
    Nur bleibt der Name leer, erst wen ich ChangeProperty aufrufe und den Titel nochmals neu schreibe, erst dann kommt er richtig.
    Oder hat XStoreName() nicht direkt mit _NET_WM_NAME zu tun ?
    Warum ?

    #include <X11/Xlib.h>
    #include <stdio.h>
    #include <string.h>
    
    Display* d;
    Window w, root;
    int s;
    XEvent xev;
    int quit = 0;
    
    void setTitel()
    {
        Atom nameAtom = XInternAtom(d,"_NET_WM_NAME",0);
        Atom utf8Atom = XInternAtom(d,"UTF8_STRING",0);
        char * title = "Mein zweiter Titel";
    
        XChangeProperty( d, w,   XInternAtom(d, "_NET_WM_NAME", False),  XInternAtom(d, "UTF8_STRING", False),
                         8, PropModeReplace, (unsigned char *) title,   strlen(title));
    }
    
    void getTitel()
    {
        Atom nameAtom = XInternAtom(d,"_NET_WM_NAME",0);
        Atom utf8Atom = XInternAtom(d,"UTF8_STRING",0);
        Atom type;
        int format;
        unsigned long nitems, after;
        unsigned char *data = 0;
    
        XGetWindowProperty(d, w, nameAtom, 0, 65536, 0, utf8Atom, &type, &format, &nitems, &after, &data);
        printf("len: %d\n", nitems);
        printf("Name: %s\n", data);
    }
    
    int main ()
    {
        d = XOpenDisplay(0);
        s = DefaultScreen(d);
        root = DefaultRootWindow(d);
        w = XCreateSimpleWindow(d, root, 0, 0, 200, 200, 0, 0,255);
        XSelectInput(d, w, ExposureMask|ButtonPressMask|KeyPressMask|PropertyChangeMask);
    
        XMapWindow(d,w);
        XStoreName(d,w,"Mein erster Titel"); // Wo schreibt der hin ?
    
        getTitel(); // Hier kommt nichts
        setTitel(); // Mit Property Titel nochmals setzten
        getTitel(); // Jetzt kommt der Titel
    
        while (!quit)
        {
            XNextEvent (d, &xev);
        }
    
        XDestroyWindow(d, w);
        XCloseDisplay (d);
    
        return 0;
    }
    


  • Weil XStoreName auch WM_NAME setzt und nicht _NET_WM_NAME.
    https://www.x.org/releases/current/doc/man/man3/XSetWMName.3.xhtml
    Und du versucht in getTitle _NET_WM_NAME auszulesen...

    Um WM_NAME auszulesen gibt es XFetchName.
    https://stackoverflow.com/questions/14759674/acessing-other-windows-title-in-xwindow

    Eine kurze suche im internet nach XStoreName und _NET_WM_NAME hätte dir da weiter geholfen.
    Oder mal die manpages/docu der X11 API mal lesen

    Und WM_NAME kann kein UNICODE



  • Ich bin unterdessen mit den Atomen einiges weiter gekommen.

    Dabei habe ich 2 Varianten gefunden, um die Atome zu beschreiben. Mit XChangeProperty(...) und mit XSendEvent(...), was ein wenig komplizierter ist.
    Weis einer, was der Unterschied zwischen den beiden Varianten ist ?
    Ich meine damit, wen ein Atom nach der einten oder anderen Variante verlangt.

    In diesen beiden Links ist es wenigsten gut beschrieben:
    https://specifications.freedesktop.org/wm-spec/1.3/ar01s05.html
    https://specifications.freedesktop.org/wm-spec/1.4/ar01s06.html

    Was ich noch raus gefunden habe, Funktionen wie XSetWMProtocols(...), verwenden intern
    einfach nur XChangeProperty(...)

    Es ist echt spannend, was man mit den Atomen alles einstellen kann.
    ZB. kann man mit "_NET_MOVERESIZE_WINDOW" das Fenster positionieren, wo man will.
    Mit XMoveResizeWindow() oder XCreateSimpleWindow() hat x,y keinen Einfluss, ausser bei den Sub-Fenstern.



  • char * c = XGetAtomName(dis, Atom_Nr);
    

    Mit obigen Code, kann ich den zugehörige String eines Atoms auslesen.
    Ist aber der Atom_Nr grösser als die Anzahl Atome, bekomme ich einen X Error of failed request: BadAtom (invalid Atom parameter)
    Wie kann ich dies unterbinden ?
    Ich habe nirgends eine Methode gefunden, mit der man die Anzahl Atome ermitteln kann, und der Error abfangen kann.


Anmelden zum Antworten