Wayland - 接続と切断

Wayland 実行環境
まずは、Wayland の実行環境を構築します。

Wayland のクライアントプログラムを動かすためには、Wayland サーバー (デスクトップ) が起動されていることが必要になります。

すでに Wayland デスクトップを使用しているのであれば問題ありませんが、X11 がメインの環境で動作させたい場合は、「weston」を使うか、「Ctrl+Alt+F2」などで切り替えた仮想端末上で Wayland デスクトップを起動させます。

なお、Wayland サーバーが起動していれば、X11 のデスクトップ上で Wayland プログラムを実行することもできます。
(表示したウィンドウは Wayland デスクトップ画面上に表示されます)

よって、Wayland のデスクトップで開いた端末上で、プログラムを実行するというような必要はありません。
仮想端末の切り替え方
Ubuntu などCtrl + Alt + F1 〜 F6 : 各仮想端末に切り替え。
Ctrl+Alt+F7 : 元の画面に戻る。
Arch LinuxCtrl + Alt + F2 〜 F6 : 各仮想端末に切り替え。
Ctrl+Alt+F1 : 元の画面に戻る。

仮想端末の切り替え時は、最初にログインする必要があります。
weston
weston は、X11 上でも実行できる、Wayland テスト環境用のデスクトップです。

X11 のウィンドウ内で仮想 Wayland 環境を作ったり、実際の Wayland デスクトップとして起動させることもできます。

※ あくまでテスト環境用として作られたものなので、デスクトップには最低限の機能しかありません。

weston」パッケージをインストールしてください。

X11 ウィンドウ内で仮想環境を作る
X11 上で 「$ weston」 を実行すると、ウィンドウが出て、その中で Wayland のデスクトップが動いている状態になります。

終了したい場合は、ウィンドウを閉じます。

Wayland デスクトップとして動作させる
「Ctrl+Alt+F2」などで仮想端末を切り替え、その中で「$ weston-launch」を実行すると、実際の Wayland デスクトップとしてフルスクリーンで動作させることができます。

ただし、デフォルトのままだと、キーボードが日本語レイアウトになっていないので、入力が不便です。

weston の設定は、「~/.config/weston.ini」ファイルを作成して記述することで、変更できます。

[core]
xwayland=true

[keyboard]
keymap_rules=evdev
keymap_layout=jp
numlock-on=true

デスクトップを終了させたい場合は、「Ctrl+Alt+Backspace」を押します。
GNOME デスクトップ
GNOME デスクトップは、X11 と Wayland のセッションに対応しています。

X11 デスクトップをメインにした状態で、テスト用として GNOME の Wayland デスクトップを使いたい場合、仮想端末上で GNOME デスクトップを起動してください。

仮想端末上で起動する
GNOME デスクトップの最小限のパッケージだけインストールしたい場合は、「gnome-shell」パッケージをインストールします。

「Ctrl+Alt+F*」で端末を切り替え、以下のコマンドを実行すると、GNOME の Wayland セッションが起動できます。

$ XDG_SESSION_TYPE=wayland dbus-run-session gnome-session

XDG_SESSION_TYPE=wayland」は、環境変数の指定です。
これで Wayland セッションを指定しています。

GNOME デスクトップを終了したい場合は、メニューからログアウトを選択するか、
$ gnome-session-quit --logout」を実行します。
X11 上で実行した GUI が Wayland 上に表示される
Wayland サーバーが起動している状態で、X11 デスクトップから GUI プログラムを実行すると、Wayland デスクトップ上にウィンドウが表示される場合があります。

GTK+3 や Qt5 などで作られたプログラムは、X11 と Wayland の両方に対応している場合があるため、Wayland サーバーが起動している場合は、自動的に Wayland クライアントとして動作することがあります。

GTK+3 のプログラムを X11 上で起動したい場合は、「GDK_BACKEND=x11」の環境変数を設定します。
プログラム
まずは、Wayland サーバーに接続&切断するだけのプログラムを作って、実行してみます。

<01_connect.c>
#include <stdio.h>
#include <wayland-client.h>

int main(void)
{
    struct wl_display *display;

    display = wl_display_connect(NULL);
    if(!display)
    {
        printf("can not connect\n");
        return 1;
    }

    printf("connect\n");

    wl_display_disconnect(display);

    printf("disconnect\n");

    return 0;
}

開発用パッケージ
Wayland の開発用パッケージとして、
Debian/Ubuntu 系の場合は「libwayland-dev」、
RedHat 系は「wayland-devel」が必要です。

コンパイル
$ cc -o test 01_connect.c -lwayland-client
ヘッダとライブラリ
Wayland プログラムに必要なヘッダとライブラリは、以下のファイルです。

/usr/include/wayland-*.h
/usr/lib/libwayland-*.so


$ cd /usr/include
$ ls -1 wayland-*.h

wayland-client-core.h
wayland-client-protocol.h
wayland-client.h
wayland-cursor.h
wayland-egl-core.h
wayland-egl.h
wayland-server-core.h
wayland-server-protocol.h
wayland-server.h
wayland-util.h
wayland-version.h

$ cd /usr/lib
$ ls -1 libwayland-*.so

libwayland-client.so
libwayland-cursor.so
libwayland-egl.so
libwayland-server.so

実際に使うファイル
ヘッダファイル・ライブラリ共に、以下の4種類を必要に応じて使います。

他のヘッダファイルは、以下のファイル内で内部的に読み込まれているので、明示的にインクルードする必要はありません。

wayland-client.h
libwayland-client
クライアントプログラムが使う機能
wayland-server.h
libwayland-server
サーバープログラムが使う機能
wayland-egl.h
libwayland-egl
OpenGL ES (EGL) を使う場合
wayland-cursor.h
libwayland-cursor
マウスカーソルの読み込み

クライアントプログラムを作る場合、wayland-client は必須です。
関数
struct wl_display *wl_display_connect(const char *name);
指定名の Wayland ディスプレイに接続します。

name が NULL の場合は、環境変数 WAYLAND_DISPLAY で指定されている名前が使われます。
環境変数が設定されていない場合は、デフォルトの "wayland-0" となります。

なお、ここで言う "ディスプレイ" とは、モニタのことではありません。
wl_display は、Wayland 上で一番最初に使うオブジェクトです。

void wl_display_disconnect(struct wl_display *display);
ディスプレイの接続を閉じて、全てのリソースを解放します。
サンプルプログラム
Wayland のサンプルプログラムは、weston のソースファイル内にあります。

https://cgit.freedesktop.org/wayland/weston/tree/

clients ディレクトリ内に、クライアント用のサンプルプログラムがあります。

ちなみに、weston パッケージ内には、クライアントのデモプログラムの実行ファイルも含まれているので、それらを実行して動作を確かめてみるのも良いです。

デモプログラムは、weston-* のファイル名になっています。

$ ls /usr/bin/weston-*
/usr/bin/weston-calibrator          /usr/bin/weston-resizor
/usr/bin/weston-clickdot            /usr/bin/weston-scaler
/usr/bin/weston-cliptest            /usr/bin/weston-screenshooter
/usr/bin/weston-confine             /usr/bin/weston-simple-damage
/usr/bin/weston-content_protection  /usr/bin/weston-simple-dmabuf-drm
/usr/bin/weston-debug               /usr/bin/weston-simple-dmabuf-egl
/usr/bin/weston-dnd                 /usr/bin/weston-simple-dmabuf-v4l
/usr/bin/weston-editor              /usr/bin/weston-simple-egl
/usr/bin/weston-eventdemo           /usr/bin/weston-simple-shm
/usr/bin/weston-flower              /usr/bin/weston-simple-touch
/usr/bin/weston-fullscreen          /usr/bin/weston-smoke
/usr/bin/weston-image               /usr/bin/weston-stacking
/usr/bin/weston-info                /usr/bin/weston-subsurfaces
/usr/bin/weston-launch              /usr/bin/weston-terminal
/usr/bin/weston-multi-resource      /usr/bin/weston-touch-calibrator
/usr/bin/weston-presentation-shm    /usr/bin/weston-transformed