Wayland - 接続と切断

接続と切断
まずは、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 は必須です。
実行環境
X11 上で Wayland のプログラムを実行すると、エラーになります。
Wayland サーバーが動作しているデスクトップ環境上で実行しなければなりません。

X11 上で動作させたい場合は weton を使います。
実際の Wayland 環境で実行する場合は、Wayland 対応のデスクトップを導入してください。

なお、weston は、あくまでテスト環境用として作られているため、デスクトップの機能が十分でなかったり、実際の Wayland 環境で実行した時と動作が異なる場合があります。
そのため、きちんとした Wayland プログラムとして作るなら、実際の Wayland 環境は必須となります。
GNOME
GNOME は現在、デフォルトで Wayland セッションが選択されるようになっています。
ログイン時に、歯車アイコンから 「GNOME on Xorg」 を選択すると、X11 環境となります。

別の仮想端末で起動する
X11 をメインにしつつ、Ctrl+Alt+F2 などで切り替えられる仮想端末上で GNOME デスクトップを起動すると、両方同時に使うことができます。
GNOME をメインのデスクトップにしたくない場合は、こちらの方法を使ってください。

GNOME 付属のアプリなどは使わず、最小限のパッケージだけインストールしたい場合は、gnome-shell パッケージをインストールします。

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

$ XDG_SESSION_TYPE=wayland dbus-run-session gnome-session
weston
Wayland のテスト環境用です。
X11 のウィンドウ内で仮想環境を作ったり、実際の Wayland 環境としても起動できます。
weston パッケージをインストールしてください。

X ウィンドウ内で仮想環境を作る
X11 上で 「$ weston」 を実行すると、ウィンドウが出て、その中で Wayland のデスクトップが動いている状態になるので、左上のアイコンから端末を開いて、Wayland プログラムを実行してください。
終了したい場合は、ウィンドウを閉じます。

うちの環境で試した所、起動してしばらくすると結構な頻度でフリーズするので、あまり安定していません。

ネイティブに動作させる
仮想端末上で、「$ weston-launch」 で起動すると、実際の Wayland 環境としてフルスクリーンで動作させることができます。

なお、この場合、デフォルトのままだとキーボードが日本語レイアウトになっていないので、記号が思い通りに入力できなくて不便です。
weston の設定は、「~/.config/weston.ini」 ファイルを作成&記述すれば変更できます。

[core]
xwayland=true

[keyboard]
keymap_rules=evdev
keymap_layout=jp
numlock-on=true
仮想端末の使い方
Ubuntu などCtrl + Alt + F1 〜 F6 : 各仮想端末に切り替え。
Ctrl+Alt+F7 : 元の画面に戻る。
Arch LinuxCtrl + Alt + F2 〜 F6 : 各仮想端末に切り替え。
Ctrl+Alt+F1 : 元の画面に戻る。

仮想端末の切り替え時は、最初にログインする必要があります。

起動した weston-launch を終了させたい場合は、「Ctrl+Alt+Backspace」 を押します。

GNOME デスクトップを終了したい場合は、メニューからログアウトを選択するか、
GNOME 上の端末内で 「$ gnome-session-quit --logout」 を実行します。
関数
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-* のファイル名になっています。