Wayland 実行環境
まずは、Wayland アプリを実行するための環境を構築します。
Wayland のクライアントプログラムを動かすためには、Wayland サーバーの起動が必要になります。
X11 の場合は、X サーバーの他に、デスクトップの構築に必要となるウィンドウマネージャなどが必要になりますが、Wayland の場合は、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 プログラムをテストしたい場合に使います。
ただし、weston はあくまでテスト環境なので、実際にはアプリがうまく動作しないことがあったり、他の Wayland デスクトップを使った動作確認ができないので、あまり推奨できません。
- 「Ctrl+Alt+F* (ファンクションキー)」で切り替えた仮想端末上で、Wayland デスクトップを起動させる。
メイン環境とは別に、新しい仮想端末上で、別画面として Wayland デスクトップを動作させることができます。
weston
weston は、Wayland のテスト環境用のデスクトップです。
X11 のウィンドウ内で仮想的な Wayland 環境を作ることができますが、実際の Wayland デスクトップとして起動させることもできます。
ただし、あくまでテスト環境用として作られたものなので、デスクトップとしては最低限の機能しかありません。
「weston」パッケージをインストールしてください。
X11 のウィンドウ内で仮想的な Wayland 環境を作ることができますが、実際の Wayland デスクトップとして起動させることもできます。
ただし、あくまでテスト環境用として作られたものなので、デスクトップとしては最低限の機能しかありません。
「weston」パッケージをインストールしてください。
X11 ウィンドウ内で仮想環境を作る
X11 の環境で 「$ weston」 を実行すると、ウィンドウが出て、その中で Wayland のデスクトップが動いている状態になります。
終了したい場合は、ウィンドウを閉じます。
終了したい場合は、ウィンドウを閉じます。
Wayland デスクトップとして動作させる
「Ctrl+Alt+F*」で仮想端末を切り替え、その中で「$ weston-launch」を実行すると、実際の Wayland デスクトップとして、フルスクリーンで動作させることができます。
ただし、デフォルトのままだと、キーボードが日本語レイアウトになっていないので、入力が不便になります。
weston の設定は、「~/.config/weston.ini」ファイルを作成して、設定を記述することで、変更できます。
デスクトップを終了させたい場合は、「Ctrl+Alt+Backspace」を押します。
ただし、デフォルトのままだと、キーボードが日本語レイアウトになっていないので、入力が不便になります。
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 デスクトップを起動してください。
メイン環境で Wayland 用の GNOME を起動したい場合は、ディスプレイマネージャでそれを選択して、ログインしてください。
X11 がメイン環境の状態で、テスト用として GNOME の Wayland デスクトップを使いたい場合、仮想端末上で GNOME デスクトップを起動してください。
仮想端末上で起動する
GNOME デスクトップの最小限のパッケージだけをインストールしたい場合は、「gnome-shell」パッケージをインストールします。
「Ctrl+Alt+F*」で端末を切り替えた後、以下のコマンドを実行すると、GNOME の Wayland セッションが起動できます。
「XDG_SESSION_TYPE=wayland」は、環境変数の指定です。
これで、Wayland セッションを指定しています。
GNOME デスクトップを終了したい場合は、メニューからログアウトを選択するか、
「$ gnome-session-quit --logout」を実行します。
「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 プログラムの実行方法
メイン環境が X11 の場合は、X11 の端末内で Wayland プログラムを実行しても、ウィンドウは Wayland デスクトップの方に表示されます。
つまり、わざわざ Wayland のデスクトップ内で Wayland プログラムを実行しなくてもいいということです。
ただし、逆に言うと、X11 上で表示されてほしいアプリが、Wayland の方で表示されてしまう場合があるので、注意してください。
つまり、わざわざ Wayland のデスクトップ内で Wayland プログラムを実行しなくてもいいということです。
ただし、逆に言うと、X11 上で表示されてほしいアプリが、Wayland の方で表示されてしまう場合があるので、注意してください。
X/Wayland 両対応のプログラム
X11 と Wayland サーバーが同時に起動している場合、GTK+ や Qt などで作られたプログラムを実行すると、X11 上ではなく、Wayland デスクトップ上にウィンドウが表示される場合があります。
GTK+ や Qt などで作られたプログラムは、基本的に X11 と Wayland の両方に対応しているため、Wayland サーバーが起動している場合は、優先的に Wayland の方に接続されます。
GTK+ のプログラムを、明示的に X11 で動作させたい場合は、「GDK_BACKEND=x11」の環境変数を設定します。
Qt の場合は、「QT_QPA_PLATFORM=xcb」の環境変数を設定します。
GTK+ や Qt などで作られたプログラムは、基本的に X11 と Wayland の両方に対応しているため、Wayland サーバーが起動している場合は、優先的に Wayland の方に接続されます。
GTK+ のプログラムを、明示的に X11 で動作させたい場合は、「GDK_BACKEND=x11」の環境変数を設定します。
Qt の場合は、「QT_QPA_PLATFORM=xcb」の環境変数を設定します。
開発用パッケージ
Wayland の開発用パッケージとして、
Debian/Ubuntu 系の場合は「libwayland-dev」、
RedHat 系は「wayland-devel」が必要です。
Debian/Ubuntu 系の場合は「libwayland-dev」、
RedHat 系は「wayland-devel」が必要です。
プログラム
まずは、Wayland サーバーに接続&切断するだけのプログラムを作って、実行してみます。
<01-connect.c>
$ 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
/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 は必須です。
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-* のファイル名になっています。
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