GTK+

Das Vorziehen der GUI-Entwicklung im GATE Projekt führte auch zur Entscheidung, welches UI Framework herangezogen werden soll.

Aus meiner Sicht bleibt für die Sprache C außer der GTK Bibliothek keine große Alternative. Es ist das einzige Framework, das sowohl unter Windows wie auch unter Linux einsetzbar und frei verfügbar ist.


Beginnen wir am Anfang

Im alten C++ GATE Projekt (vor 9 Jahren) kam ich auf die Idee, selbst einen plattformunabhängigen UI-Layer zu schreiben.
Hierfür wurden die Kernfunktionen für Fenster und das Zeichnen darauf abstrahiert und jeweils einmal für die WinAPI und einmal für die Xlib implementiert.

Basierend auf diesen Rendering-Klassen konnte ich erste Kontrollelemente wie Buttons und Text-Labels relativ leicht selbst erstellen.
Doch dann merkte ich, dass etwas so alltägliches wie ein Texteingabefeld recht mühsam zu Zeichnen ist.

Neben Kleinigkeiten wie einem blinkenden Cursor war das andauernde Berechnen, an welcher Stelle Text hingeschrieben werden sollte eine aufwändige Herausforderung.

Und als ich damit fertig war erkannt ich, dass Listen, Baumansichten und vieles mehr noch wesentlich komplexer werden würden und brach das Experiment ab.

In der neuen GATE Implementierung in C setzt die Abstraktionsschicht nicht so tief an und bedient sich der bereits bestehenden Implementierungen von Kontrollelementen.

In Windows werden diese Control-Klassen vom Betriebssystem selbst bereitgestellt, doch unter Linux beginnt die Suche nach der “richtigen” Bibliothek.

Viele Bibliotheken setzen heute auf OpenGL auf, doch aus den Erfahrungen mit dem Raspberry PI ist mir bewusst, dass OpenGL oft noch recht “buggy” auf einigen Plattformen ist, oder im schlimmsten Fall wegen fehlender Hardware (z.B. Server) gar nicht funktioniert.

GTK+, das gute alte GIMP ToolKit, bleibt als das einzige mir bekannte Framework übrig, das per C Schnittstelle direkten Zugang zu den üblichen Kontrollelementen wie Buttons, Textboxen oder Baumansichten eröffnet und diese im Hintergrund selbst rendert und verwaltet.

Der größte Vorteil für mich ist, dass GTK auch eine Windows Implementierung bereit stellt, und so kann die Entwicklung des Linux-Codes auch unter Windows stattfinden … was umgekehrt wesentlich problematischer wäre.

Und so beginnt nun die Unterstützung von 2 GUI Zweigen im GATE Projekt.

  1. Die WinAPI-Implementierung erlaubt den direkten Zugang zu Windows-Controls für WIN32 und Windows-CE
  2. Die GTK+ Implementierung ist primär Linux und MacOS gedacht, kann aber auch experimentell unter Windows eingesetzt werden.

So einfach wie es sich vielleicht anhört, ist das ganze jedoch nicht. Und so liegt noch viel Arbeit vor mir, den kleinsten gemeinsamen Nenner zwischen beiden UI-Konzepten und deren API zu finden.

Fazit

In einem früheren Projekt nutzte ich einen ähnlichen Ansatz mit wxWidgets unter C++. Das war anfangs ähnlich mühsam, doch mit der Zeit entwickelte sich daraus ein stabiler UI Layer, mit dem wahlweise zwischen WinAPI und wxWidgets umgeschaltet werden konnte.

Von daher bin ich sicher, dass mit der Zeit alle aktuellen Probleme und Herausforderungen gelöst werden können.

Der einzige Nachteil, den wxWidgets und GTK+ teilen, ist deren Bindung an die LGPL Lizenz. Sie ist damit aktuell als einzige Bibliothek nicht direkt mit den Zielen des GATE Projektes vereinbar und erfordert eine “externe” Abhängigkeit.
Doch da sich das nur auf GUI Programme unter Linux beziehen wird (und nicht auf die Kernfunktionen des Projektes), lässt sich diese Manko vorläufig ertragen.