Added desktop cursor getter and setter functions (#1407)

* [core] Added desktop cursor getter and setter functions

* Example: Set mouse cursor in text input box

* Setup standard cursors _after_ GLFW window initialization

* Remove old `int GetMouseWheelMove` declaration
This commit is contained in:
Chance Snow 2020-10-21 03:55:52 -05:00 committed by GitHub
parent eb3e9e4df5
commit 9833fe45eb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 84 additions and 1 deletions

View file

@ -423,6 +423,8 @@ typedef struct CoreData {
Vector2 offset; // Mouse offset
Vector2 scale; // Mouse scaling
MouseCursor cursor; // Tracks current mouse cursor
void* standardCursors[10]; // Opaque pointers to GLFW cursors
bool cursorHidden; // Track if cursor is hidden
bool cursorOnScreen; // Tracks if cursor is inside client area
@ -653,8 +655,9 @@ void InitWindow(int width, int height, const char *title)
// Initialize required global values different than 0
CORE.Input.Keyboard.exitKey = KEY_ESCAPE;
CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f };
CORE.Input.Mouse.cursor = MOUSE_CURSOR_ARROW;
CORE.Input.Gamepad.lastButtonPressed = -1;
#if defined(PLATFORM_UWP)
// The axis count is 6 (2 thumbsticks and left and right trigger)
CORE.Input.Gamepad.axisCount = 6;
@ -753,6 +756,26 @@ void InitWindow(int width, int height, const char *title)
#endif
#endif
#if defined(PLATFORM_DESKTOP)
// Initialize GLFW's standard cursors
const int shapes[] = {
0x00036001, // MOUSE_CURSOR_ARROW
0x00036002, // MOUSE_CURSOR_IBEAM
0x00036003, // MOUSE_CURSOR_CROSSHAIR
0x00036004, // MOUSE_CURSOR_POINTING_HAND
0x00036005, // MOUSE_CURSOR_RESIZE_EW
0x00036006, // MOUSE_CURSOR_RESIZE_NS
0x00036007, // MOUSE_CURSOR_RESIZE_NWSE
0x00036008, // MOUSE_CURSOR_RESIZE_NESW
0x00036009, // MOUSE_CURSOR_RESIZE_ALL
0x0003600A, // MOUSE_CURSOR_NOT_ALLOWED
};
for (int i = 0; i < sizeof(CORE.Input.Mouse.standardCursors) / sizeof(CORE.Input.Mouse.standardCursors[0]); i += 1)
{
CORE.Input.Mouse.standardCursors[i] = glfwCreateStandardCursor(shapes[i]);
}
#endif
#if defined(PLATFORM_WEB)
// Detect fullscreen change events
emscripten_set_fullscreenchange_callback("#canvas", NULL, 1, EmscriptenFullscreenChangeCallback);
@ -797,6 +820,11 @@ void CloseWindow(void)
rlglClose(); // De-init rlgl
#if defined(PLATFORM_DESKTOP)
for (int i = 0; i < sizeof(CORE.Input.Mouse.standardCursors) / sizeof(CORE.Input.Mouse.standardCursors[0]); i += 1)
glfwDestroyCursor(CORE.Input.Mouse.standardCursors[i]);
#endif
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
glfwDestroyWindow(CORE.Window.handle);
glfwTerminate();
@ -2733,6 +2761,29 @@ float GetMouseWheelMove(void)
#endif
}
// Returns mouse cursor
MouseCursor GetMouseCursor(void)
{
return CORE.Input.Mouse.cursor;
}
// Set mouse cursor
// NOTE: This is a no-op on platforms other than PLATFORM_DESKTOP
void SetMouseCursor(MouseCursor cursor)
{
#if defined(PLATFORM_DESKTOP)
CORE.Input.Mouse.cursor = cursor;
if (cursor == MOUSE_CURSOR_DEFAULT)
{
glfwSetCursor(CORE.Window.handle, NULL);
}
else
{
glfwSetCursor(CORE.Window.handle, CORE.Input.Mouse.standardCursors[cursor]);
}
#endif
}
// Returns touch position X for touch point 0 (relative to screen size)
int GetTouchX(void)
{