summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChance Snow <[email protected]>2020-10-21 03:55:52 -0500
committerGitHub <[email protected]>2020-10-21 10:55:52 +0200
commit9833fe45eb5cd6cfd3593b7f4d1aae9cf7367729 (patch)
treeb231ff0cb2fc2c9ba43858f6ac7f272aa1efe077
parenteb3e9e4df53c0908a4ae3dd91cbe0e3a42134794 (diff)
downloadraylib-9833fe45eb5cd6cfd3593b7f4d1aae9cf7367729.tar.gz
raylib-9833fe45eb5cd6cfd3593b7f4d1aae9cf7367729.zip
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
-rw-r--r--examples/text/text_input_box.c7
-rw-r--r--projects/Notepad++/raylib_npp_parser/raylib_to_parse.h2
-rw-r--r--src/core.c53
-rw-r--r--src/raylib.h23
4 files changed, 84 insertions, 1 deletions
diff --git a/examples/text/text_input_box.c b/examples/text/text_input_box.c
index 650ca207..b68f762c 100644
--- a/examples/text/text_input_box.c
+++ b/examples/text/text_input_box.c
@@ -43,6 +43,9 @@ int main(void)
if (mouseOnText)
{
+ // Set the window's cursor to the I-Beam
+ SetMouseCursor(MOUSE_CURSOR_IBEAM);
+
// Get pressed key (character) on the queue
int key = GetKeyPressed();
@@ -67,6 +70,10 @@ int main(void)
if (letterCount < 0) letterCount = 0;
}
}
+ else if (GetMouseCursor() != MOUSE_CURSOR_DEFAULT)
+ {
+ SetMouseCursor(MOUSE_CURSOR_DEFAULT);
+ }
if (mouseOnText) framesCounter++;
else framesCounter = 0;
diff --git a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h
index 7ef12f93..a03d5b8f 100644
--- a/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h
+++ b/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h
@@ -148,6 +148,8 @@ RLAPI void SetMousePosition(int x, int y); // Set mouse posit
RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset
RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling
RLAPI float GetMouseWheelMove(void); // Returns mouse wheel movement Y
+RLAPI MouseCursor GetMouseCursor(void); // Returns mouse cursor
+RLAPI void SetMouseCursor(MouseCursor cursor); // Set mouse cursor
// Input-related functions: touch
RLAPI int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size)
diff --git a/src/core.c b/src/core.c
index f1d7241a..3534caed 100644
--- a/src/core.c
+++ b/src/core.c
@@ -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)
{
diff --git a/src/raylib.h b/src/raylib.h
index f0eef587..bb5a3c47 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -617,6 +617,27 @@ typedef enum {
MOUSE_MIDDLE_BUTTON = 2
} MouseButton;
+// Mouse cursor types
+typedef enum {
+ MOUSE_CURSOR_DEFAULT = -1,
+ MOUSE_CURSOR_ARROW = 0,
+ MOUSE_CURSOR_IBEAM = 1,
+ MOUSE_CURSOR_CROSSHAIR = 2,
+ MOUSE_CURSOR_POINTING_HAND = 3,
+ // The horizontal resize/move arrow shape.
+ MOUSE_CURSOR_RESIZE_EW = 4,
+ // The vertical resize/move arrow shape.
+ MOUSE_CURSOR_RESIZE_NS = 5,
+ // The top-left to bottom-right diagonal resize/move arrow shape.
+ MOUSE_CURSOR_RESIZE_NWSE = 6,
+ // The top-right to bottom-left diagonal resize/move arrow shape.
+ MOUSE_CURSOR_RESIZE_NESW = 7,
+ // The omni-directional resize/move cursor shape.
+ MOUSE_CURSOR_RESIZE_ALL = 8,
+ // The operation-not-allowed shape.
+ MOUSE_CURSOR_NOT_ALLOWED = 9
+} MouseCursor;
+
// Gamepad number
typedef enum {
GAMEPAD_PLAYER1 = 0,
@@ -1016,6 +1037,8 @@ RLAPI void SetMousePosition(int x, int y); // Set mouse posit
RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset
RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling
RLAPI float GetMouseWheelMove(void); // Returns mouse wheel movement Y
+RLAPI MouseCursor GetMouseCursor(void); // Returns mouse cursor
+RLAPI void SetMouseCursor(MouseCursor cursor); // Set mouse cursor
// Input-related functions: touch
RLAPI int GetTouchX(void); // Returns touch position X for touch point 0 (relative to screen size)