diff options
| author | Sebastien de Graffenried <seb.degraff@gmail.com> | 2025-08-16 14:44:38 +0200 |
|---|---|---|
| committer | Sebastien de Graffenried <seb.degraff@gmail.com> | 2025-08-16 14:44:38 +0200 |
| commit | 90f57fcda1f6b2a1b843df2cd3daff8cbcbfe782 (patch) | |
| tree | 407c7e1e0997257db4856ca5324ef6e95449ae6d | |
| parent | dfa7e0ea4a912841e062714c28c40cf0513c2245 (diff) | |
sapp custom cursor image: start move to better api
as discussed in PR #1309
| -rw-r--r-- | sokol_app.h | 71 |
1 files changed, 58 insertions, 13 deletions
diff --git a/sokol_app.h b/sokol_app.h index 1330fe0e..9e97262e 100644 --- a/sokol_app.h +++ b/sokol_app.h @@ -1891,7 +1891,22 @@ typedef enum sapp_mouse_cursor { SAPP_MOUSECURSOR_RESIZE_NESW, SAPP_MOUSECURSOR_RESIZE_ALL, SAPP_MOUSECURSOR_NOT_ALLOWED, - SAPP_MOUSECURSOR_CUSTOM_IMAGE, + SAPP_MOUSECURSOR_CUSTOM_0, + SAPP_MOUSECURSOR_CUSTOM_1, + SAPP_MOUSECURSOR_CUSTOM_2, + SAPP_MOUSECURSOR_CUSTOM_3, + SAPP_MOUSECURSOR_CUSTOM_4, + SAPP_MOUSECURSOR_CUSTOM_5, + SAPP_MOUSECURSOR_CUSTOM_6, + SAPP_MOUSECURSOR_CUSTOM_7, + SAPP_MOUSECURSOR_CUSTOM_8, + SAPP_MOUSECURSOR_CUSTOM_9, + SAPP_MOUSECURSOR_CUSTOM_10, + SAPP_MOUSECURSOR_CUSTOM_11, + SAPP_MOUSECURSOR_CUSTOM_12, + SAPP_MOUSECURSOR_CUSTOM_13, + SAPP_MOUSECURSOR_CUSTOM_14, + SAPP_MOUSECURSOR_CUSTOM_15, _SAPP_MOUSECURSOR_NUM, } sapp_mouse_cursor; @@ -1942,12 +1957,18 @@ SOKOL_APP_API_DECL bool sapp_mouse_locked(void); SOKOL_APP_API_DECL void sapp_set_mouse_cursor(sapp_mouse_cursor cursor); /* get current mouse cursor type */ SOKOL_APP_API_DECL sapp_mouse_cursor sapp_get_mouse_cursor(void); -/* set mouse cursor custom image */ -SOKOL_APP_API_DECL void sapp_set_mouse_cursor_image(sapp_mouse_cursor_image cursor_image); +/* associate a custom mouse cursor image to a sapp_mouse_cursor enum entry */ +SOKOL_APP_API_DECL void sapp_bind_mouse_cursor_image(sapp_mouse_cursor cursor, const sapp_image_desc* desc); +/* restore the sapp_mouse_cursor enum entry to it's default system appearance */ +SOKOL_APP_API_DECL void sapp_unbind_mouse_cursor_image(sapp_mouse_cursor cursor); + +// /* set mouse cursor custom image */ +// SOKOL_APP_API_DECL void sapp_set_mouse_cursor_image(sapp_mouse_cursor_image cursor_image); /* returns a custom cursor image for use with sapp_set_mouse_cursor_image */ SOKOL_APP_API_DECL sapp_mouse_cursor_image sapp_make_mouse_cursor_image(const sapp_image_desc* desc); /* frees resource associated with the cursor image */ SOKOL_APP_API_DECL void sapp_destroy_mouse_cursor_image(sapp_mouse_cursor_image image); + /* return the userdata pointer optionally provided in sapp_desc */ SOKOL_APP_API_DECL void* sapp_userdata(void); /* return a copy of the sapp_desc structure */ @@ -3060,6 +3081,7 @@ typedef struct { char window_title[_SAPP_MAX_TITLE_LENGTH]; // UTF-8 wchar_t window_title_wide[_SAPP_MAX_TITLE_LENGTH]; // UTF-32 or UCS-2 */ sapp_keycode keycodes[SAPP_MAX_KEYCODES]; + uint64_t mousecursor_images[_SAPP_MOUSECURSOR_NUM]; // contains opaque system dependent handles, zero if unset. } _sapp_t; static _sapp_t _sapp; @@ -4220,7 +4242,7 @@ _SOKOL_PRIVATE void _sapp_macos_lock_mouse(bool lock) { } } -_SOKOL_PRIVATE void _sapp_macos_update_cursor(sapp_mouse_cursor cursor, sapp_mouse_cursor_image image, bool shown) { +_SOKOL_PRIVATE void _sapp_macos_update_cursor(sapp_mouse_cursor cursor, bool shown) { // show/hide cursor only if visibility status has changed (required because show/hide stacks) if (shown != _sapp.mouse.shown) { if (shown) { @@ -4230,11 +4252,13 @@ _SOKOL_PRIVATE void _sapp_macos_update_cursor(sapp_mouse_cursor cursor, sapp_mou [NSCursor hide]; } } - // update cursor type + + // update cursor SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM)); NSCursor* ns_cursor = 0; - if (cursor == SAPP_MOUSECURSOR_CUSTOM_IMAGE) { - ns_cursor = (__bridge NSCursor*) (void*) image.opaque; + uint64_t custom_cursor = _sapp.mousecursor_images[cursor]; + if (custom_cursor != 0) { + ns_cursor = (__bridge NSCursor*) (void*) custom_cursor; } else if (_sapp.macos.cursors[cursor]) { ns_cursor = _sapp.macos.cursors[cursor]; } else { @@ -12281,7 +12305,7 @@ SOKOL_API_IMPL void sapp_toggle_fullscreen(void) { _SOKOL_PRIVATE void _sapp_update_cursor(sapp_mouse_cursor cursor, sapp_mouse_cursor_image image, bool shown) { #if defined(_SAPP_MACOS) - _sapp_macos_update_cursor(cursor, image, shown); + _sapp_macos_update_cursor(cursor, shown); #elif defined(_SAPP_WIN32) _sapp_win32_update_cursor(cursor, image, shown, false); #elif defined(_SAPP_LINUX) @@ -12325,7 +12349,6 @@ SOKOL_API_IMPL bool sapp_mouse_locked(void) { SOKOL_API_IMPL void sapp_set_mouse_cursor(sapp_mouse_cursor cursor) { SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM)); - SOKOL_ASSERT(cursor != SAPP_MOUSECURSOR_CUSTOM_IMAGE); // call sapp_make_mouse_cursor_image instead. if (_sapp.mouse.current_cursor != cursor) { sapp_mouse_cursor_image img = {0}; _sapp_update_cursor(cursor, img, _sapp.mouse.shown); @@ -12336,13 +12359,35 @@ SOKOL_API_IMPL sapp_mouse_cursor sapp_get_mouse_cursor(void) { return _sapp.mouse.current_cursor; } -SOKOL_API_IMPL void sapp_set_mouse_cursor_image(sapp_mouse_cursor_image cursor_image) { - SOKOL_ASSERT(cursor_image.opaque != 0); - if (_sapp.mouse.current_cursor != SAPP_MOUSECURSOR_CUSTOM_IMAGE || _sapp.mouse.current_cursor_image.opaque != cursor_image.opaque) { - _sapp_update_cursor(SAPP_MOUSECURSOR_CUSTOM_IMAGE, cursor_image, _sapp.mouse.shown); +SOKOL_API_IMPL void sapp_bind_mouse_cursor_image(sapp_mouse_cursor cursor, const sapp_image_desc* desc) { + SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM)); + + // free slot if already used + uint64_t* slot = &_sapp.mousecursor_images[(int) cursor]; + if (*slot) { + sapp_mouse_cursor_image mci = {}; + mci.opaque = *slot; + sapp_destroy_mouse_cursor_image(mci); } + + // create new cursor and put it in slot + sapp_mouse_cursor_image mouse_cursor_image = sapp_make_mouse_cursor_image(desc); + *slot = mouse_cursor_image.opaque; +} + +SOKOL_APP_API_DECL void sapp_unbind_mouse_cursor_image(sapp_mouse_cursor cursor) { + sapp_mouse_cursor_image mci = {}; + mci.opaque = _sapp.mousecursor_images[(int) cursor]; + sapp_destroy_mouse_cursor_image(mci); } +// SOKOL_API_IMPL void sapp_set_mouse_cursor_image(sapp_mouse_cursor_image cursor_image) { +// SOKOL_ASSERT(cursor_image.opaque != 0); +// if (_sapp.mouse.current_cursor != SAPP_MOUSECURSOR_CUSTOM_IMAGE || _sapp.mouse.current_cursor_image.opaque != cursor_image.opaque) { +// _sapp_update_cursor(SAPP_MOUSECURSOR_CUSTOM_IMAGE, cursor_image, _sapp.mouse.shown); +// } +// } + SOKOL_API_IMPL sapp_mouse_cursor_image sapp_make_mouse_cursor_image(const sapp_image_desc* desc) { // NOTE: It seems that for some reason, the hotspot doesn't work if it is one less // than the dimention of the cursor image (or more), on windows. So for a cursor |