ぼちぼち Wayland というものが標準で使用可能になっていく気配を感じたので、
Xorg ベースから切り替えが必要かと思って調べてみました。
先日は X11 なしで OpenGL の連載をしていましたが、今度は Wayland を使って OpenGL を使うというゴールに向かって話を進めていきたいと思います。前回はフルスクリーンのみでの動作でしたが今回はウィンドウシステムありでとなります。
Wayland とは
検索してもらうといろいろと情報が出てくると思いますが、
これはディスプレイサーバーのプロトコルであり、Wayland-client というライブラリが存在します。またwayland コンポジッタというものが画面の表示を行います。
そして weston というものが wayland コンポジッタのリファレンス実装となっています。
X-Windowの場合ではサーバ、クライアントは別のPCでも使用可能でしたが、Wayland の場合には同一端末上を想定しています。
実験環境
以下の環境で実験しています。
- ArchLinux (64bit)
- VMware Workstation 12 Player
- weston 1.10
はじめてのWayland通信
まだ何もウィンドウが出せませんが以下のコードで、
ディスプレイサーバーに接続して情報を少し出してみることが可能です。
#include#include #include #include struct wl_display *display = NULL; struct wl_compositor *compositor = NULL; static void global_registry_handler( void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version ) { printf( "global_registry_handler %s %d\n", interface, id ); if( strcmp( interface, "wl_compositor" ) == 0 ) { compositor = (struct wl_compositor *)wl_registry_bind( registry, id, &wl_compositor_interface, 1); } } static void global_registry_remover( void *data, struct wl_registry *registry, uint32_t id ) { printf("Got a registry losing event for %d\n", id); } static const struct wl_registry_listener registry_listener = { global_registry_handler, global_registry_remover }; int main() { display = wl_display_connect( NULL ); if( display == NULL ) { fprintf( stderr, "Can't connect to display\n" ); exit(1); } printf("connected to display\n"); struct wl_registry *registry = wl_display_get_registry( display ); wl_registry_add_listener( registry, ®istry_listener, NULL ); wl_display_dispatch( display ); wl_display_roundtrip( display ); wl_display_disconnect(display); printf("disconnected from display\n"); return 0; }
これを実行すると以下のような結果が出てくると思います。
global_registry_handler wl_compositor 1 global_registry_handler wl_subcompositor 2 global_registry_handler wl_scaler 3 global_registry_handler presentation 4 global_registry_handler wl_data_device_manager 5 global_registry_handler wl_shm 6 global_registry_handler wl_drm 7 global_registry_handler wl_seat 8 global_registry_handler wl_output 9 global_registry_handler zwp_linux_dmabuf_v1 10 global_registry_handler zwp_input_panel_v1 11 global_registry_handler zwp_input_method_v1 12 global_registry_handler zwp_text_input_manager_v1 13 global_registry_handler wl_shell 14 global_registry_handler xdg_shell 15 global_registry_handler weston_desktop_shell 16 global_registry_handler weston_screenshooter 17