Porting GTK+ applications to Wayland

GTK+ is using a backend architecture to isolate platform-specific code from the portable GTK+ API. The bulk of the platform-specific code is inside GDK, and you have to explicitly include a header file such as gdkx.h or gdkwin32.h. There are a few exceptions, such as the GtkPlug/GtkSocket API in GTK+, which also requires you to include a special header, gtkx.h.

Trying out if your application works under Wayland

For a very quick test of your application under Wayland, you can run either weston (the Wayland reference compositor) or mutter-wayland nested under X:

$ weston
$ mutter-wayland --wayland

Then run your application using the Wayland backend:

GDK_BACKEND=wayland your-app

If everything works alright, you should have your application appear inside the weston (or mutter-wayland) window.

The page at Initiatives/Wayland/TryingIt has more details about running mutter or gnome-shell as a Wayland compositor.

Porting your application to Wayland

If your application is not including any backend-specific header such as gdkx.h or gdkwin32.h, it will most likely just work under Wayland without any porting.

Otherwise, you should find the places in your code where backend-specific API is being used. You can recognize these functions by having names starting with gdk_x11_ (or gdk_win32, gdk_quartz, etc). For any such API call, you need to wrap it in a check for the current backend, and possibly supplant it by equivalent code for the other backends, like this:

  gdk_x11_window_set_user_time (window, timestamp);

will become:

#ifdef GDK_WINDOWING_X11
  if (GDK_IS_X11_WINDOW (window))
    gdk_x11_window_set_user_time (window, timestamp);
#endif
#ifdef GDK_WINDOWING_WAYLAND
  if (GDK_IS_WAYLAND_WINDOW (window))
    /* do something else */
#endif

Initiatives/Wayland/Applications/Porting (last edited 2016-10-07 16:30:37 by AndreKlapper)