Verschachtelte Fenster / xwininfo



  • Ich habe ein kleine X11-Programm mit verschachtelten Fenster geschrieben. Es sollte 2 Panels mit 2 Buttons darstellen. So werden die Fenster erzeugt:

      rw = RootWindow (display, screen);
    
      win = XCreateSimpleWindow ( display, rw, 100, 10, 600, 400, 5, 0x000000, 0xFFFFFF);
    
      Panelwin1 = XCreateSimpleWindow ( display, win, 5, 5, 400, 300, 5, 0xBB0000, 0xFFFFBB);
      Panelwin2 = XCreateSimpleWindow ( display, Panelwin1, 5, 5, 300, 200, 5, 0x00BB0, 0xFFBBFF);
    
      Buttonwin1 = XCreateSimpleWindow ( display, Panelwin2, 5, 5, 75, 25, 5, 0x000BB0, 0xFFBBFF);
      Buttonwin2 = XCreateSimpleWindow ( display, Panelwin2, 100, 5, 75, 25, 5, 0x000BB0, 0xFFBBFF);
    

    Wen ich auf dann "xwininfo -tree" auf dem Programm ausführe, kommt dies wie erwartet:

    xwininfo: Window id: 0x6000001 (has no name)
    
      Root window id: 0x2bf (the root window) (has no name)
      Parent window id: 0x2a01c8c (has no name)
         1 child:
         0x6000002 (has no name): ()  400x300+5+5  +91+119
            1 child:
            0x6000003 (has no name): ()  300x200+5+5  +101+129
               2 children:
               0x6000005 (has no name): ()  75x25+100+5  +206+139
               0x6000004 (has no name): ()  75x25+5+5  +111+139
    

    Probiere ich ich "xwininfo -tree" auf anderen bestehenden Programme wie "codeblocks", "nemo", "chrome", etc., dann kommt nur:

    xwininfo: Window id: 0x48000d2 "main.c [Erstes_Fenster] - Code::Blocks 20.03"
    
      Root window id: 0x2bf (the root window) (has no name)
      Parent window id: 0x2a00312 (has no name)
         1 child:
         0x48000d3 (has no name): ()  1x1+-1+-1  +532+70
    

    Woran liegt das ?
    Ich dachte immer, das das ganze Komponenten-System von GTK oder QT mit einzelnen Fenster arbeitet.
    In einem WinApi-Programm findet man auch zig mal CreateWindow(...).
    Wen GTK / QT anders arbeiten, wie sind diese aufgebaut ?
    Verwenden die etwa Wayland oder was ähnliches ?



  • Wie das bei GTK+ ist weis ich nicht.
    Aber für Qt kann ich es sagen.
    Mit Qt 4.4 wurden sogenannte alien widgets eingeführt. Diese existieren aus sicht des windowing systems (in deinem beispiel X11) nicht.
    https://doc.qt.io/qt-6/qwidget.html#native-widgets-vs-alien-widgets
    Hier der original blog post davon:
    https://web.archive.org/web/20101029055334/http://labs.qt.nokia.com/2007/08/09/qt-invaded-by-aliens-the-end-of-all-flicker/

    Vermutlich hat GTK+ mit 3.x eventuell sowas ähnliches implementiert.



  • Die verwendete Funktionen aus Deinem Programmschnibsel stammen aus der Xlib (es handelt sich also nur um X11 und Wayland ist definitiv nicht mit im Spiel) und diese ist die unterste Ebene bei X11 Programmierung. Xt (X Toolkit) liegt eine Ebene in der Abstraktion darüber. Früher war nur das Problem, dass es keine freie Widget Library (Widgets nennen sich in X11 die Elemente des GUIs, Buttons, Menübestandteile, ...) gab, außer den Athena Widgets Xaw. Motif und XView waren kommerzielle Projekte und nur für viel Geld zu bekommen.

    Da X11 in absehbarer Zeit von Wayland ersetzt werden wird, und Motif und XView nur noch von historischem Interesse sind, verschwende Deine Zeit nicht mehr mit X11 sondern nutze Gtk oder Qt. Ein Tutorial für Gtk findet sich hier https://docs.gtk.org/gtk4/getting_started.html. Bei Qt könnte ggf. die Lizenz ein Problem sein, das sollte man vorher abklären.

    Falls Du unbedingt X11 programmieren willst, dann wäre der Einstiegspunkt die O'Reilly X11 Serie, die gab es zumindest einige Zeit vom Verlag als kostenlosen Download, weil die Bücher so alt waren. Dann wäre aber OpenMotif der richtige Einstiegspunkt und nicht die Xlib.



  • @firefly sagte in Verschachtelte Fenster / xwininfo:

    Mit Qt 4.4 wurden sogenannte alien widgets eingeführt.
    Ist das sowas ähnliches, wie die Regionen von X11 ?
    Ich dachte immer, es mache Sinn, für jede Komponente ein eigenes Windows zu erstellen.



  • Der bevorzugte Weg ist ein neues aktuelles GUI Toolkit. Wenn Du keinen sehr triftigen Grund hast hör mit Xlib auf und nutze etwas anderes.

    Sehr simpel dargestellt ist die Struktur des klassischen X11 Softwarestacks wie folgt:

    • Xm (Motif), Xaw (Athena Widgets) oder XView als Widget Library, die zu Xt kompatibel ist
    • Xt (X Toolkit)
    • Xlib

    xwininfo ist ein Werkzeug aus dem alten X11 Werkzeugkasten, und kann Dir nur Informationen aus diesem Softwarestack ausgeben, da dazu das in Xt definierte Objektmodell genutzt wird. GUI Toolkits, die nicht auf Xt basieren, definieren ein anderes Objektmodell, so dass xwininfo die Informationen nicht auslesen kann. Sowohl Gtk wie auch Qt sind keine auf Xt basierenden GUI und verwenden ein komplett eigenes Objektmodell.

    Was Du in Deinem Beispiel machst ist nicht sinnvoll, und war es auch nie. Es ist sinnfrei hier den korrekten Weg der X11 Programmierung zu beschreiben, da X11 und vor allem die darauf basierenden GUI Toolkits ohnehin veraltet sind.

    Wie man es richtig machen könnte, ist u.a. in X Toolkit Intrinsics Programming Manual (Motif Edition) und in den Motif Büchern beschrieben. Motif ist mittlerweile für FOSS Plattformen LGPL Software und kann frei heruntergeladen werden.

    Noch ein für xwininfo bei dem es auch wirklich Informationen ausgeben kann. Das Fenster ist von nedit.

    xwininfo: Window id: 0x600017c "Untitled"
    
      Root window id: 0x1d8 (the root window) (has no name)
      Parent window id: 0x320b31e (has no name)
         2 children:
         0x600017e (has no name): ()  872x973+0+0  +1396+268
            3 children:
            0x6000194 (has no name): ()  872x21+0+25  +1396+293
               3 children:
               0x60001a3 (has no name): ()  367x23+0+0  +1396+293
                  6 children:
                  0x60001aa (has no name): ()  19x21+0+1  +1396+294
                  0x60001a9 (has no name): ()  53x22+314+1  +1710+294
                  0x60001a8 (has no name): ()  71x22+243+1  +1639+294
                  0x60001a7 (has no name): ()  47x22+196+1  +1592+294
                  0x60001a6 (has no name): ()  19x21+175+1  +1571+294
                  0x60001a4 (has no name): ()  156x23+19+0  +1415+293
               0x600019d (has no name): ()  121x22+0+0  +1396+293
                  2 children:
                  0x60001a2 (has no name): ()  13x13+105+6  +1501+299
                  0x600019e (has no name): ()  100x22+0+0  +1396+293
                     2 children:
                     0x60001a1 (has no name): ()  98x1+1+20  +1397+313
                     0x60001a0 (has no name): ()  96x17+2+2  +1398+295
               0x6000195 (has no name): ()  870x19+1+1  +1397+294
                  2 children:
                  0x600019c (has no name): ()  59x19+811+0  +2208+294
                  0x6000196 (has no name): ()  808x19+0+0  +1397+294
            0x600018b (has no name): ()  872x25+0+0  +1396+268
               8 children:
               0x6000193 (has no name): ()  36x23+4+1  +1400+269
               0x6000192 (has no name): ()  40x23+40+1  +1436+269
               0x6000191 (has no name): ()  58x23+80+1  +1476+269
               0x6000190 (has no name): ()  86x23+138+1  +1534+269
               0x600018f (has no name): ()  45x23+224+1  +1620+269
               0x600018e (has no name): ()  52x23+269+1  +1665+269
               0x600018d (has no name): ()  70x23+321+1  +1717+269
               0x600018c (has no name): ()  43x23+825+1  +2221+269
            0x600017f (has no name): ()  872x927+0+46  +1396+314
               2 children:
               0x600018a (has no name): ()  11x11+859+923  +2255+1237
               0x6000181 (has no name): ()  872x927+0+0  +1396+314
                  3 children:
                  0x6000185 (has no name): ()  857x15+0+912  +1396+1226
                  0x6000184 (has no name): ()  15x912+857+0  +2253+314
                  0x6000182 (has no name): ()  857x912+0+0  +1396+314
                     1 child:
                     0x6000183 (has no name): ()  855x910+1+1  +1397+315
         0x600017d (has no name): ()  10x10+0+0  +1396+268
    
    

Anmelden zum Antworten