Im Grossen und Ganzen wuerde ich es etwa so veranschlagen: Der Kernel liefert ein Treiberinterface [...].
Die Aufgabe des Grafiktreibers sind grundlegend, also Grafikmodus setzen, Pixel, Linien, Dreiecke, Rechtecke, (Polygone) zeichnen, Teile verschieben, Bildschirmspeicher sichern.
Klingt soweit sinnvoll.
Auf diesen Treiber setzt dann ein Fenstermanager auf (wie unter Linux), welcher dann die Highlevelfunktionen wie Fenster zeichnen, Fensterklassen und Steuerelemente anbietet. Auf diese Funktionen greift dann die Anwendung zurueck.
Wenn du dich an Unix/Linux orientierst, hast du dabei noch eine wichtige Schicht vergessen: Den X-Server. Bei dir müßte der Windowmanager z.B. auch das Eventhandling oder die Darstellung von Schrift mit übernehmen. Spätestens wenn man sich nicht auf einen Windowmanager beschränken will, ist das keine gute Idee mehr.
Ich glaube auch nicht, daß die Steuerelemente vom Windowmanager angeboten werden sollten - schon der Name sagt ja, daß sich der WM um Fenster kümmert.
Man kann Fenster als Fenster nehmen und Steuerelemente (wie Textfeld etc) von der Anwendung selbst machen lassen. Das hätte nur den Nachteil, dass jede Anwendung das Rad neu erfinden muesste und das OS keine xfach getesteten Funktionen zur Verfuegung stellt. Das wäre unelegant.
Es spricht ja nichts dagegen, daß die Anwendungen eine einheitliche Bibliothek einbinden. Für furchtbar unelegant halte ich diesen "light-weight"-Ansatz nicht.
Im übrigen, QT macht genau sowas. Und nachdem KDE, das auf QT aufbaut, der führende Desktop unter Linux ist, kann es so furchtbar schlecht nicht sein.
Man könnte auch die Steuerelemente vom OS als "Goodies" dazugeben, sei es festkompiliert oder extern nachgeladen (Bibliotheken).
Ok, auf das mit den Bibliotheken wollte ich wohl hinaus...
Aber nun muss man sich ueberlegen, wie weit die Integration der Steuerelemente funktionieren soll. Wenn ein Ereignis auftritt (und es sind viele, zB MouseMove), soll das Ereignis an die Applikation, an das Fenster oder an das Steuerelement gesendet werden? Dies beeinflusst das Programmieren der Anwendung nicht unerheblich.
Ein klassischer Windowmanager verwaltet Fenster, das wäre also die naheliegendste Sache. Wobei die anderen Widgets natürlich intern auch als Unterfenster verwaltet werden können (dann wären wir bei schwergewichtigen Toolkits), dann würden die Events direkt an das Steuerelement geliefert.
Wo übrigens die Nachteile für den Programmierer sein sollen, wenn man ans Fenster oder das Widget liefert, leuchtet mir grad nicht richtig ein. Nach oben durchreichen sollte doch kein Problem sein, wenn ich die Sache auf einer höheren Ebene bearbeiten will?
Ich persönlich wuerde Messages an das Hauptfenster senden, denke ich. Sollte ich nen Gedankenfehler drin haben... sagt's einfach.
Und ich an das Fenster, in dem das Ereignis aufgetreten ist. Schon allein, falls man mal irgendein Linux/Unix-Toolkit portieren wollte, wäre das sehr nützlich, weil man damit gleichzeitig leicht- und schwergewichtige Toolkits unterstützt.
Nun muss man ueberlegen, wie man Fenster ueberhaupt intern darstellt. Gibt es nur "das" Fenster, oder verschiedene Typen wie z.B. Dialog etc.
Ich denke, man sollte das Konzept Fenster von der grafischen Darstellung eines konkreten Fensters trennen. Ich schlage folgende grobe Definition vor: Ein Fenster ist ein vom WM verwaltetes Objekt, muß also optisch überhaupt nicht an ein Fenster erinnern, sondern kann auch ein Button, Icon oder sonstwas sein. Die konkreten Widgets, die dann als Fenster beim WM registriert werden, sind Sache der Anwendung (ja, natürlich auch hier wieder Bibliotheken).
Was die Ereignisverarbeitung nochmal angeht, so sollte sich ein Hauptfenster bei der Applikation "anmelden" und Ereignisse an eine gewisse Stelle im Code geliefert kriegen. Also dass man eine Prozedur erzeugt, welche dann vom Windowmanager aufgerufen wird.
Du meinst einen einzigen Callback für das ganze Programm? Ich hätte mir eher vorgestellt, daß ich für unterschiedliche Events unterschiedliche Callbacks habe - falls der WM was von den Widgets weiß, auch nach Widget getrennt. Als Anwendungsprogrammierer würde ich also am liebsten sowas schreiben (ich weiß, falsche Sprache
):
button.onClick := @handlerFunktion;
Man stelle sich vor, eine Anwendung schreibt drei Dutzend Funktionen fuer diverse Ereignisse und der Windowmanager ruft diese dann auf. Wäre fuer mich Schwachsinn, da ist eine Verteilerfunktion im Fenster dann schon besser.
Denke ich nicht. Sowas braucht jede Anwendung in etwa gleicher Form, also kann man es gleich in eine andere Schicht rausziehen.
Ich hoffe, daß ich nicht zu einseitig vom X-Server-Konzept ausgegangen bin, aber ihr könnt mich ja verbessern.
[/code]