今までの実装では、ウィンドウの移動したときや、マウスの In/Out でマウスカーソルの表示がおかしいままであることが発覚しました。まずはこれを修正したいと思います。
マウスカーソル用のサーフェース
wl_shm のオブジェクトを取得する際に、一緒にデフォルトのマウスカーソルの wl_surface を作成して準備してしまうのが通常の方法のようでした。
ウィンドウの更新の手続きと同じようにマウスカーソルについてもいえる、という感じでした。
mCursorTheme = wl_cursor_theme_load( "default", 32, mShm ); mDefaultCursor = wl_cursor_theme_get_cursor( mCursorTheme, "left_ptr" ); mCursorSurface = wl_compositor_create_surface( mCompositor ); wl_cursor_image* image = mDefaultCursor->images[0]; wl_buffer* cursor_buf = wl_cursor_image_get_buffer(image); wl_surface_attach(mCursorSurface, cursor_buf, 0, 0 ); wl_surface_damage(mCursorSurface, 0, 0, image->width, image->height ); wl_surface_commit(mCursorSurface);
マウスカーソルの適用
サーフェースが準備できても適用しなければいけないようなので、これを pointer_handler_enter_leave に追加しました。
このイベントリスナーに引数で渡ってくる serial 値が wl_pointer_set_cursor に必要になったので若干コードの修正を行いました。
if( is_enter ) { wl_pointer_set_cursor( mPointer, serial, mCursorSurface, 0, 0 ); wl_cursor_image* image = mDefaultCursor->images[0]; wl_buffer* cursor_buf = wl_cursor_image_get_buffer(image); wl_surface_attach(mCursorSurface, cursor_buf, 0, 0 ); wl_surface_damage(mCursorSurface, 0, 0, image->width, image->height ); wl_surface_commit(mCursorSurface);
ちなみに wl_cursor_theme_get_cursor で与えている文字列 “left_ptr” を別のものに変えると他のマウスカーソルがデフォルトとして表示されることは確認できました。