1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Weston/Wayland入門⑥ シェルを実装する(ivi_application編)

Last updated at Posted at 2025-07-03

Weston/Wayland入門まとめ

前回シェルプロトコルなしでシェルを実装してみた。
今回はそのシェルにシェルプロトコルを実装していく。

ivi_applicationプロトコル

Westonはいくつかのシェルプロトコルをサポートしているが、その中で今回はivi_applicationプロトコルを実装してみる。

ivi_applicationを選んだ理由は簡単で「実装項目が非常に少ない」からである。

後の回で詳しく説明する予定だが、ivi_applicationはIVI(in-vehicle infotainment)向けのプロトコルであり、サーバー側でクライアントの位置やサイズ等表示方法を完全に制御するのに適したシェルプロトコルとなっている。

通常のデスクトップシェルと異なりサーバー側で完全にコントロールするためクライアントからの要求等が非常に少ないプロトコルとなっているのが特徴である。

プロトコル概要

wl_surfaceを引数として作成するivi_surfaceに対して、サーバー側からサイズを伝えるconfigureイベントとクライアント側から削除を要求するdestroy()リクエストがあるだけの非常にシンプルな構成となっている。

課題
ivi_applicationプロトコルを定義しているファイルivi-application.xmlを確認しよう。

実装

ivi_applicationインターフェイス

まずはivi_applicationインターフェイスのバインドを実装する。1

CMakeLists.txtでivi-application.xmlからヘッダ、ソースコードを生成する部分は第三回と同様であるため割愛する。2

インターフェイスのバインド処理も第三回と違いはない。
(ivi_application_surface_create()は後ほど実装する)

my-shell.cpp(抜粋)
static const struct ivi_application_interface ivi_application_impl = {
    .surface_create = ivi_application_surface_create,
};

static void unbind_ivi_application(wl_resource *resource)
{
    // noop
}

static void bind_ivi_application(wl_client *client, void *data, uint32_t version, uint32_t id)
{
    weston_log("my-shell: bind_ivi_application\n");

    MyShell *shell = static_cast<MyShell *>(data);

    wl_resource *resource = wl_resource_create(client, &ivi_application_interface, version, id);

    wl_resource_set_implementation(resource, &ivi_application_impl, shell, unbind_ivi_application);
}

wet_shell_init()内でグローバルオブジェクトを作成する。

my-shell.cpp(抜粋)
    if (!wl_global_create(compositor->wl_display, &ivi_application_interface, 1, shell,
                          bind_ivi_application)) {
        weston_log("my-shell: Failed to create global\n");
        return -1;
    }

これでクライアンがivi_applicationプロトコルをバインドできるようになる。

ivi_surface実装

続いてivi_surfaceを実装する。

前回シェルプロトコルなしでシェルを実装したときはコンポジタのcreate_surface_signalにフックする形でサーフェスコミットのコールバックを実装したが、今回は素直にivi_surfaceを作る際にいっしょにサーフェスコミットのコールバックを設定すれば良い。

my-shell.cpp(抜粋)
struct MyShellSurface {
    MyShell* shell;
    weston_surface *wet_surf;
    wl_listener destroy_listener;
};

static const struct ivi_surface_interface ivi_surface_impl = {
    .destroy = [](wl_client*, wl_resource*){}, // noop
};

void ivi_application_surface_create(struct wl_client *client, struct wl_resource *resource,
                                    uint32_t ivi_id, struct wl_resource *surface, uint32_t id)
{
    weston_log("my-shell: ivi_application_surface_create\n");

    auto *shell = static_cast<MyShell *>(wl_resource_get_user_data(resource));
    auto *wet_surf = static_cast<weston_surface *>(wl_resource_get_user_data(surface));

    auto *shell_surf = new MyShellSurface{shell, wet_surf};

    wl_resource *res = wl_resource_create(client, &ivi_surface_interface, 1, id);
    wl_resource_set_implementation(res, &ivi_surface_impl, shell_surf,
                                   [](wl_resource *r) {
                                       auto *surf = static_cast<MyShellSurface*>(wl_resource_get_user_data(r));
                                       delete surf;
                                   });

    wet_surf->committed = surface_committed;
    wet_surf->committed_private = shell_surf;
}

いままでコールバックの空実装は空の関数を用意してきたがC++であればivi_surface_impl.destroyのように空のlambda関数を登録しても良い。

また今回はivi_surfaceのアンバインド関数もlambda関数にしている。

注意
surface_committed()は前回の記事に記載されているものをそのまま流用すると落ちるため上記コードに適合するよう改良すること。

アプリの実行

前回使ったEGLWLMockNavigationivi_applicationに対応しているため前回同様表示することができる。

またQtアプリケーションも以下の環境変数付を利用することでivi_applicationに対応するため、表示することが可能となる。

$ QT_WAYLAND_SHELL_INTEGRATION=ivi-shell QT_QPA_PLATFORM=wayland qalculate

image.png

  1. まぎらわしいが、ivi_applicationプロトコルの中にあるivi_applicationインターフェイスである。

  2. ただしivi-application.xmlの場所についてはオプションで指定できるようにしておくとよいだろう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?