Open Source im professionellen Einsatz
Linux-Magazin 01/2017
© Maksim Kostenko, 123RF

© Maksim Kostenko, 123RF

GTK+-Anwendungen unter Wayland

Neue Ufer für Gnome

Dass X11 abgewählt ist und alle Linux-Welt ins Wayland oder nach Mir aufbricht, kann an GTK+- und somit Gnome-Anwendungen nicht spurlos vorbeigehen. Der folgende Umsteiger-Leifaden eines GTK+-Maintainers zeigt den Weg, eigene oder fremde Programme fit für Wayland und Xwayland zu machen.

688

In Fedora Workstation, Version 25, hat der Displayserver Wayland schon X11 ersetzt, auch andere Distributionen stehen an dieser Schwelle oder haben sie schon überschritten. Den meisten GTK+-APIs ist es glücklicherweise gleichgültig, welchen Displayserver die darunterliegende Plattform benutzt. Viele GTK-Anwendungen brauchen daher keine oder nur kleine Änderungen, um mit Wayland genauso gut zu funktionieren wie mit X11. Doch es gibt Ausnahmen, bei denen der Code innige Beziehungen zu Portierungs-problematischen X11-APIs pflegt.

Die Anfänge von GTK gehen in die Mitte der 90er Jahre zurück. Damals war X11 das einzige Backend von Belang. So war es nur natürlich, dass viele X11-spezifischen Konzepte ihren Weg auch ins GTK+-API gefunden haben: Visual, Screen, Rootwindow, Windowmanager, Grab und so weiter. Viele davon waren wichtig zu einer Zeit, in der Grafikkarten nur 256 Farben gleichzeitig darstellten und Videospeicher in Kilo- und nicht in Gigabyte zu beziffern war.

Das Wayland-Protokoll (und auch Mir) werfen viele dieser historischen Spezialitäten über Bord und sind von daher in vielerlei Hinsicht einfacher als X11. Aus dem gleichen Grunde lassen sich manche GTK+-APIs unter Wayland leider nicht implementieren: Wenn das Displaysystem keine Grabs kennt, dann kann das Toolkit sie höchstens mehr schlecht als recht simulieren.

Die aktuelle Entwicklungsversion von GTK+, die auf GTK+ 4 zuläuft, ersetzt bereits viele der X11-nahen APIs durch Wayland-kompatible. In der momentan stabilen GTK+-Version 3.22 müssen die Anwendungsentwickler dagegen darauf achten, problematische APIs zu vermeiden. Dieser Artikel will auch dabei behilflich sein.

Erkennungsdienst

Der erste Schritt beim Portieren einer GTK+-Anwendung nach Wayland ist es, Backend-spezifische Aufrufe zu finden und sie nur dann weiterhin zu nutzen, wenn der ausführende Host das zuständige Backend verwendet. Ein offensichtliches Beispiel sind die »gdk_x11_...()« -APIs, die explizit für X11 gedacht sind. Ein weiteres Beispiel sind »GtkPlug« und »GtkSocket« (die ein Widget in einen anderen Prozess einbinden, [1]); sie verwenden das nur X11 eigene XEmbed-Protokoll [2].

Listing 1 zeigt eine bequeme Möglichkeit auf, das verwendete Backend herauszufinden, indem es den Typ des »GdkDisplay« -Objekts testet. Da GTK+ auf den einzelnen Zielplattformen mit verschiedenen Backends konfiguriert sein kann, ist es ratsam, auch einen »ifdef« -Test auf das Backend auszuführen, wie es im Listing geschieht. Der Test hilft sicherzustellen, dass die Anwendung immer kompiliert, auch wenn die lokale GTK+-Installation nicht alle Backends unterstützt. GTK+ definiert zu diesem Zweck ein »GDK_WINDOWING_...« -Symbol für jedes verfügbare Backend.

Listing 1

Plattform-Erkennung in GTK+

01 #include <gtk/gtk.h>
02 #ifdef GDK_WINDOWING_X11
03 #include <gdk/gdkx.h>
04 #endif
05 #ifdef GDK_WINDOWING_WAYLAND
06 #include <gdk/gdkwayland.h>
07 #endif
08
09 int main (int argc, char *argv[])
10 {
11   GdkDisplay *display;
12
13   gtk_init (&argc, &argv);
14
15   display = gdk_display_get_default ();
16
17 #ifdef GDK_WINDOWING_X11
18   if (GDK_IS_X11_DISPLAY (display))
19     {
20       g_print ("This code is running under X11");
21     }
22 #endif
23 #ifdef GDK_WINDOWING_WAYLAND
24   if (GDK_IS_WAYLAND_DISPLAY (display))
25     {
26       g_print ("This code is running under Wayland");
27     }
28 #endif
29
30   return 0;
31 }

Zeit stempeln

GTK+ macht es einfach, in Anwendungen Backend-spezifischen Code zu finden. Da diese Aufrufe nicht in »gtk.h« deklariert sind, sondern in den separaten Headerdateien »gdkx.h« und »gtkx.h« , kann der Entwickler einfach nach allen Dateien suchen, die diesen Header verwenden, um problematische Codebestandteile einzukreisen.

Ein typisches Beispiel für X11-spezifischen Code ist der Aufruf von »gtk_window_present_with_time()« [3] mit einem Zeitstempel, der vom X-Server stammt – siehe Listing 2. Der alternative Code in Listing 3 veranlasst einen Type-Check mit dem »GtkWindow« -Objekt und repariert so die Abhängigkeit.

Listing 2

X11-spezifischer Code …

01 static void
02 present_window (GtkWidget *window)
03 {
04   guint32 timestamp;
05
06   timestamp = gdk_x11_get_server_time (gtk_widget_get_window (window));
07   gtk_window_present_with_time (GTK_WINDOW (window), timestamp);
08 }

Listing 3

… nach Wayland portiert

01 static void
02 present_window (GtkWidget *window)
03 {
04 #ifdef GDK_WINDOWING_X11
05   if (GDK_IS_X11_WINDOW (window))
06     {
07       guint32 timestamp;
08
09       timestamp = gdk_x11_get_server_time (gtk_widget_get_window (window));
10       gtk_window_present_with_time (GTK_WINDOW (window), timestamp);
11     }
12   else
13 #endif
14     gtk_window_present (GTK_WINDOW (window));
15 }

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • GTK+ 3.10.0 mit neuen Widgets und Wayland-1.2-Support

    GTK+, das Toolkit für grafische Oberflächen, ist in Version 3.10.0 erschienen. Die Entwickler zählen auf der Mailingliste einige Neuerungen auf.

  • Wayland und Qt

    Der neue Displayserver Wayland unterschreibt gerade Dauermietverträge bei vielen Linux-Distributionen. Das wirkt sich auf die dort laufenden grafischen Anwendungen aus. Kwin-Entwickler Martin Gräßlin erklärt, wie Qt-Entwickler ihre Programme auch mit Wayland und Xwayland betreiben.

  • Wayland und Mir

    Das X-Window-System aus den 1980er Jahren bildet nach wie vor die Basis der grafischen Benutzeroberfläche unter Linux. Beim Umgang damit verzweifeln Entwickler aber an Altlasten und unzeitgemäßer Technologie. Mit Wayland und Mir streben nun gleich zwei vielversprechende Alternativen den Wachwechsel an.

  • Wayland-Support für Kwin rückt näher

    KDE- und Kwin-Entwickler Martin Gräßlin berichtet in seinem Blog über die Neuerungen für Kwin 5.3. Der Support für Rootless Xwayland sei ein weiterer Schritt auf dem Weg, Wayland-Clients zu handhaben.

  • Fosdem 2012: Wayland 1.0 wird dieses Jahr fertig

    Auf der Entwicklerkonferenz Fosdem hat Kristian Høgsberg von Intel den derzeitigen Entwicklungsstand der neuen Display-Server-Architektur Wayland dargestellt.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.