Set busy cursor when the application is busy.

This commit is contained in:
Bartosz Taudul 2024-03-24 17:40:30 +01:00
parent 5b2cce0a02
commit e071b9043f
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3

View File

@ -164,6 +164,7 @@ constexpr ImGuiKey s_keyTable[] = {
static std::function<void()> s_redraw; static std::function<void()> s_redraw;
static std::function<void(float)> s_scaleChanged; static std::function<void(float)> s_scaleChanged;
static std::function<int(void)> s_isBusy;
static RunQueue* s_mainThreadTasks; static RunQueue* s_mainThreadTasks;
static struct wl_display* s_dpy; static struct wl_display* s_dpy;
@ -200,7 +201,7 @@ static struct xkb_state* s_xkbState;
static struct xkb_compose_table* s_xkbComposeTable; static struct xkb_compose_table* s_xkbComposeTable;
static struct xkb_compose_state* s_xkbComposeState; static struct xkb_compose_state* s_xkbComposeState;
static xkb_mod_index_t s_xkbCtrl, s_xkbAlt, s_xkbShift, s_xkbSuper; static xkb_mod_index_t s_xkbCtrl, s_xkbAlt, s_xkbShift, s_xkbSuper;
static ImGuiMouseCursor s_mouseCursor; static wp_cursor_shape_device_v1_shape s_mouseCursor;
static uint32_t s_mouseCursorSerial; static uint32_t s_mouseCursorSerial;
struct Output struct Output
@ -243,7 +244,7 @@ static void PointerEnter( void*, struct wl_pointer* pointer, uint32_t serial, st
if( s_cursorShapeDev ) if( s_cursorShapeDev )
{ {
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, serial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT ); wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, serial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT );
s_mouseCursor = ImGuiMouseCursor_Arrow; s_mouseCursor = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT;
s_mouseCursorSerial = serial; s_mouseCursorSerial = serial;
} }
else else
@ -732,7 +733,9 @@ Backend::Backend( const char* title, const std::function<void()>& redraw, const
{ {
s_redraw = redraw; s_redraw = redraw;
s_scaleChanged = scaleChanged; s_scaleChanged = scaleChanged;
s_isBusy = isBusy;
s_mainThreadTasks = mainThreadTasks; s_mainThreadTasks = mainThreadTasks;
s_prevWidth = s_width = m_winPos.w; s_prevWidth = s_width = m_winPos.w;
s_prevHeight = s_height = m_winPos.h; s_prevHeight = s_height = m_winPos.h;
s_maximized = m_winPos.maximize; s_maximized = m_winPos.maximize;
@ -943,38 +946,61 @@ void Backend::NewFrame( int& w, int& h )
if( s_cursorShapeDev ) if( s_cursorShapeDev )
{ {
ImGuiMouseCursor cursor = ImGui::GetMouseCursor(); ImGuiMouseCursor cursor = ImGui::GetMouseCursor();
if( cursor != s_mouseCursor ) wp_cursor_shape_device_v1_shape shape;
{
s_mouseCursor = cursor;
switch( cursor ) switch( cursor )
{ {
case ImGuiMouseCursor_None: case ImGuiMouseCursor_None:
wl_pointer_set_cursor( s_pointer, s_mouseCursorSerial, nullptr, 0, 0 ); shape = (wp_cursor_shape_device_v1_shape)0;
break; break;
case ImGuiMouseCursor_Arrow: case ImGuiMouseCursor_Arrow:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT ); switch( s_isBusy() )
{
default:
case 0:
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT;
break;
case 1:
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS;
break;
case 2:
shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT;
break;
}
break; break;
case ImGuiMouseCursor_TextInput: case ImGuiMouseCursor_TextInput:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT;
break; break;
case ImGuiMouseCursor_ResizeNS: case ImGuiMouseCursor_ResizeNS:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE;
break; break;
case ImGuiMouseCursor_ResizeEW: case ImGuiMouseCursor_ResizeEW:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE;
break; break;
case ImGuiMouseCursor_ResizeNESW: case ImGuiMouseCursor_ResizeNESW:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE;
break; break;
case ImGuiMouseCursor_ResizeNWSE: case ImGuiMouseCursor_ResizeNWSE:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE;
break; break;
case ImGuiMouseCursor_NotAllowed: case ImGuiMouseCursor_NotAllowed:
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED ); shape = WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED;
break; break;
default: default:
break; break;
}; };
if( shape != s_mouseCursor )
{
s_mouseCursor = shape;
if( shape == 0 )
{
wl_pointer_set_cursor( s_pointer, s_mouseCursorSerial, nullptr, 0, 0 );
}
else
{
wp_cursor_shape_device_v1_set_shape( s_cursorShapeDev, s_mouseCursorSerial, shape );
}
} }
} }
} }