Wayland - 接続と切断

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

Wayland のクライアントプログラムを動かすためには、Wayland サーバーの起動が必要になります。

X11 の場合は、X サーバーの他に、デスクトップの構築に必要となるウィンドウマネージャなどが必要になりますが、Wayland サーバーの場合は、Wayland デスクトップ自体が Wayland サーバーとなる形になります。

そのため、Wayland に対応したデスクトップ環境のインストールと、その起動が必要になります。
Wayland サーバーの起動方法
基本的に3通りあります。

  • Wayland デスクトップを、メインの環境で起動させる。
    PC 起動後、ディスプレイマネージャ (PC 起動後に最初に表示される GUI 画面) で、Wayland デスクトップを選択してログインすると、Wayland サーバー (デスクトップ) が起動されます。
  • X11 の環境で weston を起動して、X ウィンドウ内に Wayland デスクトップを構築する。
    X11 がメイン環境の状態で、Wayland プログラムをテストしたい場合に使います。
    ただし、実際にはうまく動作しないことがあったり、他の Wayland デスクトップを使って動作確認ができないので、あまり推奨できません。
  • 「Ctrl+Alt+F2」などで切り替えた仮想端末上で、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 の両方に対応しています。

メイン環境で Wayland 用の GNOME を起動したい場合は、ディスプレイマネージャでそれを選択して、ログインしてください。

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」を実行します。
Wayland プログラムの実行方法
weston でも、仮想端末上でも、Wayland サーバーが起動している状態であれば、メイン環境の方で Wayland プログラムを実行しても問題ありません。
(Wayland のウィンドウは、Wayland デスクトップ画面上に表示されます)
X/Wayland 両対応のプログラム
X11 がメインの環境で、仮想端末上で Wayland サーバーが起動している場合、GTK+ などで作られたプログラムを実行すると、X11 上ではなく、Wayland デスクトップ上にウィンドウが表示される場合があります。

GTK+ や Qt などで作られたプログラムは、ライブラリの方で X11 と Wayland の両方に対応している場合があるため、Wayland サーバーに接続できるかどうかを優先的に判断して、自動で Wayland クライアントとして動作させることがあります。

GTK+ のプログラムを、Wayland 上ではなく、X11 上で起動したい場合は、「GDK_BACKEND=x11」の環境変数を設定します。
開発用パッケージ
Wayland の開発用パッケージとして、
Debian/Ubuntu 系の場合は「libwayland-dev」、
RedHat 系は「wayland-devel」が必要です。
プログラム
まずは、Wayland サーバーに接続&切断するだけのプログラムを作って、実行してみます。

$ cc -o test 01_connect.c -lwayland-client

<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 プログラムに必要なヘッダとライブラリは、以下のファイルです。

/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