ここでは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, ®istry_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では、描画完了コールバックを受信後、次の描画を行い、描画サイクルを回しています。
コメント