westonクライアントサンプル解析

wayland
スポンサーリンク

ここではwestonクライアントのサンプルコードであるsimple-egl.cを解析したいと思います。

スポンサーリンク

ソースコード

westonクライアントのソースコードは、いろいろありますが一番シンプルかつ基本的な構成であるsimple-egl.cについて解析していきます。
https://github.com/wayland-project/weston/blob/master/clients/simple-egl.c
※解析を間違えているようでしたら、アドバイス頂ければと思います。

westonサーバーへの接続

int main(int argc, char **argv)

がsimple-eglクライアントの入り口になります。

display.display = wl_display_connect(NULL);

wl_display_connectでwestonサーバーに接続できます。
引数は接続したいwestonのサーバー名を指定します。

NULLを指定すると、環境変数[WAYLAND_DISPLAY]に設定されているサーバー、
環境変数がなければ “wayland-0” という名前のサーバーに接続されます。

接続に失敗すると戻り値がNULLで返ってきます。
よくある原因は、下記の通りです。
1.westonサーバーが起動していない
2.westonサーバー名を間違ている
3.環境変数[XDG_RUNTIME_DIR]が正しく設定出来ていない。

レジストリ取得

display.registry = wl_display_get_registry(display.display);
wl_registry_add_listener(display.registry, &registry_listener, &display);

westonサーバーとのI/Fで、何が使用可能なのかを取得します。
使用可能なI/Fが、registry_handle_globalコールバック関数の引数で入ってきます。
引数interfaceにwayland形式のプロトコル名が入っており、
使用したいプロトコルは、wl_registry_bindを行い、不要であればスルーします。

wl_display_roundtrip(display.display);

これはwestonサーバーに空メッセージを送信して、サーバーからの応答を待つ処理です。
目的はサーバー側でイベント処理が行われたかを確認するために使用します。

描画システム初期化

init_egl(&display, window.opaque);
init_gl(&window);

EGLやOpenGLの初期化を行います。
詳細は別途、解説したいと思います。

ウィンドウ作成

window->surface = wl_compositor_create_surface(display->compositor);
window->native = wl_egl_window_create(window->surface, window->window_size.width, window->window_size.height);
window->egl_surface = eglCreateWindowSurface(display->egl.dpy, display->egl.conf, window->native, NULL);

NativeWindowの作成とそれをもとにEGLWindowの作成を行います。

イベント処理

while (running && ret != -1)
	ret = wl_display_dispatch(display.display);

westonサーバーからクライアントに送られたイベントの受信処理とコールバック処理を行います。
※リスナー登録を行うとこの処理からコールバックが呼ばれます。

描画サイクル

static const struct wl_callback_listener frame_listener = {
	redraw
};
window->callback = wl_surface_frame(window->surface);
wl_callback_add_listener(window->callback, &frame_listener, window);

wl_surface_frameはwestonサーバーで描画が完了すると返ってくるコールバックです。
simple-egl.cでは、描画完了コールバックを受信後、次の描画を行い、描画サイクルを回しています。

wayland
スポンサーリンク
muffinをフォローする
エンジニア情報局

コメント

タイトルとURLをコピーしました