aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien de Graffenried <seb.degraff@gmail.com>2025-08-16 16:47:10 +0200
committerSebastien de Graffenried <seb.degraff@gmail.com>2025-08-16 16:47:10 +0200
commit2ea71bea4c856af9a54ac05e9362d887cdbea27a (patch)
tree4f39eee18ba47aed6e8d3ec35a32f78c273d12ae
parentebf3b8476a393d0cb905ab61ed09e9035ae6b00d (diff)
sapp custom cursor image: cleanup, remove sapp_mouse_cursor_image from interface and macos backend
-rw-r--r--sokol_app.h130
1 files changed, 55 insertions, 75 deletions
diff --git a/sokol_app.h b/sokol_app.h
index 9c23506d..e98e7f05 100644
--- a/sokol_app.h
+++ b/sokol_app.h
@@ -1910,11 +1910,6 @@ typedef enum sapp_mouse_cursor {
_SAPP_MOUSECURSOR_NUM,
} sapp_mouse_cursor;
-// @todo remove
-typedef struct sapp_mouse_cursor_image {
- uint64_t opaque; // opaque handle to the platform-specific cursor resource. Guarenteed to be non-zero if valid.
-} sapp_mouse_cursor_image;
-
/* user-provided functions */
extern sapp_desc sokol_main(int argc, char* argv[]);
@@ -1962,14 +1957,6 @@ SOKOL_APP_API_DECL sapp_mouse_cursor sapp_get_mouse_cursor(void);
SOKOL_APP_API_DECL sapp_mouse_cursor 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 */
@@ -3019,7 +3006,6 @@ typedef struct {
bool locked;
bool pos_valid;
sapp_mouse_cursor current_cursor;
- sapp_mouse_cursor_image current_cursor_image;
} _sapp_mouse_t;
typedef struct {
@@ -3082,7 +3068,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.
+ uint64_t mousecursor_images[_SAPP_MOUSECURSOR_NUM]; // contains opaque system dependent handles, zero if unset. @cleanup @rename @todo
} _sapp_t;
static _sapp_t _sapp;
@@ -4271,9 +4257,9 @@ _SOKOL_PRIVATE void _sapp_macos_update_cursor(sapp_mouse_cursor cursor, bool sho
[ns_cursor set];
}
-_SOKOL_PRIVATE sapp_mouse_cursor_image _sapp_macos_make_mouse_cursor_image(const sapp_image_desc* desc) {
+_SOKOL_PRIVATE uint64_t _sapp_macos_make_mouse_cursor_image(const sapp_image_desc* desc) {
// NOTE: see glfw for reference https://github.com/glfw/glfw/blob/ac10768495837eb98da27d01fe706073d6d251c2/src/cocoa_window.m#L1712
- sapp_mouse_cursor_image ret = {};
+ uint64_t opaque_handle = 0;
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:desc->width
@@ -4293,18 +4279,18 @@ _SOKOL_PRIVATE sapp_mouse_cursor_image _sapp_macos_make_mouse_cursor_image(const
NSImage* native = [[NSImage alloc] initWithSize:NSMakeSize(desc->width, desc->height)];
[native addRepresentation:rep];
- ret.opaque = (uint64_t) (__bridge const void*) [[NSCursor alloc]
+ opaque_handle = (uint64_t) (__bridge const void*) [[NSCursor alloc]
initWithImage:native
hotSpot:NSMakePoint(desc->cursor_hotspot_x, desc->cursor_hotspot_y)];
_SAPP_OBJC_RELEASE(native);
_SAPP_OBJC_RELEASE(rep);
}
- return ret;
+ return opaque_handle;
}
-_SOKOL_PRIVATE void _sapp_macos_destroy_mouse_cursor_image(sapp_mouse_cursor_image cursor_image) {
- NSCursor* cursor = (__bridge NSCursor*) (void*) cursor_image.opaque;
+_SOKOL_PRIVATE void _sapp_macos_destroy_mouse_cursor_image(uint64_t opaque_handle) {
+ NSCursor* cursor = (__bridge NSCursor*) (void*) opaque_handle;
_SOKOL_UNUSED(cursor);
_SAPP_OBJC_RELEASE(cursor);
}
@@ -5612,9 +5598,9 @@ EM_JS(void, sapp_js_set_cursor, (int cursor_type, int cursor_image_handle, int s
}
})
-_SOKOL_PRIVATE void _sapp_emsc_update_cursor(sapp_mouse_cursor cursor, sapp_mouse_cursor_image cursor_image, bool shown) {
+_SOKOL_PRIVATE void _sapp_emsc_update_cursor(sapp_mouse_cursor cursor, bool shown) {
SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM));
- sapp_js_set_cursor((int)cursor, (int) cursor_image.opaque, shown ? 1 : 0);
+ sapp_js_set_cursor((int)cursor, _sapp.mouse.current_cursor, (int) cursor_image.opaque, shown ? 1 : 0);
}
EM_JS(int, sapp_js_make_mouse_cursor_image, (uint8_t* bmp_ptr, int bmp_size, int hotspot_x, int hotspot_y), {
@@ -7925,7 +7911,7 @@ _SOKOL_PRIVATE LRESULT CALLBACK _sapp_win32_wndproc(HWND hWnd, UINT uMsg, WPARAM
break;
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCLIENT) {
- _sapp_win32_update_cursor(_sapp.mouse.current_cursor, _sapp.mouse.current_cursor_image, _sapp.mouse.shown, true);
+ _sapp_win32_update_cursor(_sapp.mouse.current_cursor, _sapp.mouse.shown, true);
return TRUE;
}
break;
@@ -12307,25 +12293,24 @@ SOKOL_API_IMPL void sapp_toggle_fullscreen(void) {
#endif
}
-_SOKOL_PRIVATE void _sapp_update_cursor(sapp_mouse_cursor cursor, sapp_mouse_cursor_image image, bool shown) {
+_SOKOL_PRIVATE void _sapp_update_cursor(sapp_mouse_cursor cursor, bool shown) {
#if defined(_SAPP_MACOS)
_sapp_macos_update_cursor(cursor, shown);
#elif defined(_SAPP_WIN32)
- _sapp_win32_update_cursor(cursor, image, shown, false);
+ _sapp_win32_update_cursor(cursor, shown, false);
#elif defined(_SAPP_LINUX)
- _sapp_x11_update_cursor(cursor, image, shown);
+ _sapp_x11_update_cursor(cursor, shown);
#elif defined(_SAPP_EMSCRIPTEN)
- _sapp_emsc_update_cursor(cursor, image, shown);
+ _sapp_emsc_update_cursor(cursor, shown);
#endif
_sapp.mouse.current_cursor = cursor;
- _sapp.mouse.current_cursor_image = image;
_sapp.mouse.shown = shown;
}
/* NOTE that sapp_show_mouse() does not "stack" like the Win32 or macOS API functions! */
SOKOL_API_IMPL void sapp_show_mouse(bool show) {
if (_sapp.mouse.shown != show) {
- _sapp_update_cursor(_sapp.mouse.current_cursor, _sapp.mouse.current_cursor_image, show);
+ _sapp_update_cursor(_sapp.mouse.current_cursor, show);
}
}
@@ -12354,8 +12339,7 @@ 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));
if (_sapp.mouse.current_cursor != cursor) {
- sapp_mouse_cursor_image img = {0};
- _sapp_update_cursor(cursor, img, _sapp.mouse.shown);
+ _sapp_update_cursor(cursor, _sapp.mouse.shown);
}
}
@@ -12363,37 +12347,7 @@ SOKOL_API_IMPL sapp_mouse_cursor sapp_get_mouse_cursor(void) {
return _sapp.mouse.current_cursor;
}
-SOKOL_API_IMPL sapp_mouse_cursor sapp_bind_mouse_cursor_image(sapp_mouse_cursor cursor, const sapp_image_desc* desc) {
- SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM));
- sapp_unbind_mouse_cursor_image(cursor);
- _sapp.mousecursor_images[(int) cursor] = sapp_make_mouse_cursor_image(desc).opaque;
- // Update the displayed cursor in case the current cursor is the one we just bound.
- if (_sapp.mouse.current_cursor == cursor) {
- sapp_mouse_cursor_image img = {0};
- _sapp_update_cursor(cursor, img, _sapp.mouse.shown);
- }
- return cursor; // returning the passed-in cursor puerly for convenience, in case you want to asign the value to a variable.
-}
-
-SOKOL_APP_API_DECL void sapp_unbind_mouse_cursor_image(sapp_mouse_cursor cursor) {
- SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM));
-
- uint64_t* slot = &_sapp.mousecursor_images[(int) cursor];
- if (*slot) {
- sapp_mouse_cursor_image mci = {};
- mci.opaque = *slot;
- sapp_destroy_mouse_cursor_image(mci);
- *slot = 0;
- }
-
- // Update the displayed cursor in case the current cursor is the one we just unbound.
- if (_sapp.mouse.current_cursor == cursor) {
- sapp_mouse_cursor_image img = {0};
- _sapp_update_cursor(cursor, img, _sapp.mouse.shown);
- }
-}
-
-SOKOL_API_IMPL sapp_mouse_cursor_image sapp_make_mouse_cursor_image(const sapp_image_desc* desc) {
+_SOKOL_PRIVATE uint64_t _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
// that is 32 by 32 px, a hotspot of x = 30 works, but not x = 31.
@@ -12401,35 +12355,61 @@ SOKOL_API_IMPL sapp_mouse_cursor_image sapp_make_mouse_cursor_image(const sapp_i
// the behaviour consistent.
SOKOL_ASSERT(desc->cursor_hotspot_x < desc->width - 1 && desc->cursor_hotspot_y < desc->height - 1);
SOKOL_ASSERT(desc->width * desc->height * 4 == (int) desc->pixels.size);
- sapp_mouse_cursor_image ret = {0};
+ uint64_t opaque_handle = 0;
#if defined(_SAPP_MACOS)
- ret = _sapp_macos_make_mouse_cursor_image(desc);
+ opaque_handle = _sapp_macos_make_mouse_cursor_image(desc);
#elif defined(_SAPP_EMSCRIPTEN)
- ret = _sapp_emsc_make_mouse_cursor_image(desc);
+ opaque_handle = _sapp_emsc_make_mouse_cursor_image(desc);
#elif defined(_SAPP_WIN32)
- ret = _sapp_win32_make_mouse_cursor_image(desc);
+ opaque_handle = _sapp_win32_make_mouse_cursor_image(desc);
#elif defined(_SAPP_LINUX)
- ret = _sapp_x11_make_mouse_cursor_image(desc);
+ opaque_handle = _sapp_x11_make_mouse_cursor_image(desc);
#else
_SOKOL_UNUSED(desc);
#endif
- return ret;
+ return opaque_handle;
}
-SOKOL_API_IMPL void sapp_destroy_mouse_cursor_image(sapp_mouse_cursor_image cursor_image) {
+_SOKOL_PRIVATE void _sapp_destroy_mouse_cursor_image(uint64_t opaque_handle) {
#if defined(_SAPP_MACOS)
- _sapp_macos_destroy_mouse_cursor_image(cursor_image);
+ _sapp_macos_destroy_mouse_cursor_image(opaque_handle);
#elif defined(_SAPP_EMSCRIPTEN)
- _sapp_emsc_destroy_mouse_cursor_image(cursor_image);
+ _sapp_emsc_destroy_mouse_cursor_image(opaque_handle);
#elif defined(_SAPP_WIN32)
- _sapp_win32_destroy_mouse_cursor_image(cursor_image);
+ _sapp_win32_destroy_mouse_cursor_image(opaque_handle);
#elif defined(_SAPP_LINUX)
- _sapp_x11_destroy_mouse_cursor_image(cursor_image);
+ _sapp_x11_destroy_mouse_cursor_image(opaque_handle);
#else
- _SOKOL_UNUSED(cursor_image);
+ _SOKOL_UNUSED(opaque_handle);
#endif
}
+SOKOL_API_IMPL sapp_mouse_cursor sapp_bind_mouse_cursor_image(sapp_mouse_cursor cursor, const sapp_image_desc* desc) {
+ SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM));
+ sapp_unbind_mouse_cursor_image(cursor);
+ _sapp.mousecursor_images[(int) cursor] = _sapp_make_mouse_cursor_image(desc);
+ // Update the displayed cursor in case the current cursor is the one we just bound.
+ if (_sapp.mouse.current_cursor == cursor) {
+ _sapp_update_cursor(cursor, _sapp.mouse.shown);
+ }
+ return cursor; // returning the passed-in cursor puerly for convenience, in case you want to asign the value to a variable.
+}
+
+SOKOL_APP_API_DECL void sapp_unbind_mouse_cursor_image(sapp_mouse_cursor cursor) {
+ SOKOL_ASSERT((cursor >= 0) && (cursor < _SAPP_MOUSECURSOR_NUM));
+
+ uint64_t* slot = &_sapp.mousecursor_images[(int) cursor];
+ if (*slot) {
+ _sapp_destroy_mouse_cursor_image(*slot);
+ *slot = 0;
+ }
+
+ // Update the displayed cursor in case the current cursor is the one we just unbound.
+ if (_sapp.mouse.current_cursor == cursor) {
+ _sapp_update_cursor(cursor, _sapp.mouse.shown);
+ }
+}
+
SOKOL_API_IMPL void sapp_request_quit(void) {
_sapp.quit_requested = true;
}