本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Wayland でのマウスカーソル

今までの実装では、ウィンドウの移動したときや、マウスの 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” を別のものに変えると他のマウスカーソルがデフォルトとして表示されることは確認できました。

プログラミング
すらりんをフォローする
すらりん日記

コメント

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