diff --git a/src/external/RGFW.h b/src/external/RGFW.h index a0ca21cec639..86e68a17f95f 100644 --- a/src/external/RGFW.h +++ b/src/external/RGFW.h @@ -112,16 +112,27 @@ extern "C" { #define RGFW_HEADER #if !defined(u8) - #include - - typedef uint8_t u8; - typedef int8_t i8; - typedef uint16_t u16; - typedef int16_t i16; - typedef uint32_t u32; - typedef int32_t i32; - typedef uint64_t u64; - typedef int64_t i64; + #if defined(_MSC_VER) || defined(__SYMBIAN32__) + typedef unsigned char u8; + typedef signed char i8; + typedef unsigned short u16; + typedef signed short i16; + typedef unsigned int u32; + typedef signed int i32; + typedef unsigned long u64; + typedef signed long i64; + #else + #include + + typedef uint8_t u8; + typedef int8_t i8; + typedef uint16_t u16; + typedef int16_t i16; + typedef uint32_t u32; + typedef int32_t i32; + typedef uint64_t u64; + typedef int64_t i64; + #endif #endif #if defined(RGFW_X11) && defined(__APPLE__) @@ -255,7 +266,7 @@ extern "C" { /*! key event note the code of the key pressed is stored in RGFW_Event.keyCode - !!Keycodes defined at the bottom of the header file!! + !!Keycodes defined at the bottom of the RGFW_HEADER part of this file!! while a string version is stored in RGFW_Event.KeyString @@ -281,7 +292,12 @@ extern "C" { RGFW_Event.axis holds the data of all the axis RGFW_Event.axisCount says how many axis there are */ -#define RGFW_windowAttribsChange 10 /*!< the window was moved or resized (by the user) */ +#define RGFW_windowMoved 10 /*!< the window was moved (by the user) */ +#define RGFW_windowResized 11 /*!< the window was resized (by the user) */ + +#define RGFW_focusIn 12 /*!< window is in focus now */ +#define RGFW_focusOut 13 /*!< window is out of focus now */ + /* attribs change event note The event data is sent straight to the window structure with win->r.x, win->r.y, win->r.w and win->r.h @@ -392,7 +408,7 @@ typedef struct { i32 x, y; } RGFW_vector; u32 type; /*!< which event has been sent?*/ RGFW_vector point; /*!< mouse x, y of event (or drop point) */ - u32 keyCode; /*!< keycode of event !!Keycodes defined at the bottom of the header file!! */ + u32 keyCode; /*!< keycode of event !!Keycodes defined at the bottom of the RGFW_HEADER part of this file!! */ u32 fps; /*the current fps of the window [the fps is checked when events are checked]*/ u64 frameTime, frameTime2; /* this is used for counting the fps */ @@ -420,7 +436,6 @@ typedef struct { i32 x, y; } RGFW_vector; #ifdef RGFW_X11 Display* display; /*!< source display */ Window window; /*!< source window */ - Cursor cursor; #endif #ifdef RGFW_MACOS u32 display; @@ -586,12 +601,8 @@ typedef struct { i32 x, y; } RGFW_vector; /*!< sets mouse to bitmap (very simular to RGFW_window_setIcon), image NOT resized by default*/ RGFWDEF void RGFW_window_setMouse(RGFW_window* win, u8* image, RGFW_area a, i32 channels); - /*!< sets the mouse to a standard API cursor (based on RGFW_MOUSE, as seen at the end of the file) */ -#ifdef RGFW_MACOS - RGFWDEF void RGFW_window_setMouseStandard(RGFW_window* win, void* mouse); -#else - RGFWDEF void RGFW_window_setMouseStandard(RGFW_window* win, i32 mouse); -#endif + /*!< sets the mouse to a standard API cursor (based on RGFW_MOUSE, as seen at the end of the RGFW_HEADER part of this file) */ + RGFWDEF void RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse); RGFWDEF void RGFW_window_setMouseDefault(RGFW_window* win); /* sets the mouse to1` the default mouse image */ /* @@ -600,7 +611,7 @@ typedef struct { i32 x, y; } RGFW_vector; this is useful for a 3D camera */ - RGFWDEF void RGFW_window_mouseHold(RGFW_window* win); + RGFWDEF void RGFW_window_mouseHold(RGFW_window* win, RGFW_area area); /* undo hold */ RGFWDEF void RGFW_window_mouseUnhold(RGFW_window* win); @@ -618,6 +629,9 @@ typedef struct { i32 x, y; } RGFW_vector; /* where the mouse is on the screen */ RGFWDEF RGFW_vector RGFW_getGlobalMousePoint(void); + /* where the mouse is on the window */ + RGFWDEF RGFW_vector RGFW_window_getMousePoint(RGFW_window* win); + /* show the mouse or hide the mouse*/ RGFWDEF void RGFW_window_showMouse(RGFW_window* win, i8 show); /* move the mouse to a set x, y pos*/ @@ -656,8 +670,13 @@ typedef struct { i32 x, y; } RGFW_vector; RGFWDEF u8 RGFW_isHeldI(RGFW_window* win, u32 key); /*!< if key is held (key code)*/ RGFWDEF u8 RGFW_isReleasedI(RGFW_window* win, u32 key); /*!< if key is released (key code)*/ + RGFWDEF u8 RGFW_isMousePressed(RGFW_window* win, u8 button); + RGFWDEF u8 RGFW_isMouseHeld(RGFW_window* win, u8 button); + RGFWDEF u8 RGFW_isMouseReleased(RGFW_window* win, u8 button); + RGFWDEF u8 RGFW_wasMousePressed(RGFW_window* win, u8 button); + /* - !!Keycodes defined at the bottom of the header file!! + !!Keycodes defined at the bottom of RGFW_HEADER part of this file!! */ /*!< converts a key code to it's key string */ RGFWDEF char* RGFW_keyCodeTokeyStr(u64 key); @@ -804,6 +823,132 @@ typedef struct { i32 x, y; } RGFW_vector; RGFWDEF u64 RGFW_getTime(void); /* get time in seconds */ RGFWDEF u64 RGFW_getTimeNS(void); /* get time in nanoseconds */ RGFWDEF void RGFW_sleep(u64 microsecond); /* sleep for a set time */ + + typedef enum { + RGFW_KEY_NULL = 0, + RGFW_Escape, + RGFW_F1, + RGFW_F2, + RGFW_F3, + RGFW_F4, + RGFW_F5, + RGFW_F6, + RGFW_F7, + RGFW_F8, + RGFW_F9, + RGFW_F10, + RGFW_F11, + RGFW_F12, + + RGFW_Backtick, + + RGFW_0, + RGFW_1, + RGFW_2, + RGFW_3, + RGFW_4, + RGFW_5, + RGFW_6, + RGFW_7, + RGFW_8, + RGFW_9, + + RGFW_Minus, + RGFW_Equals, + RGFW_BackSpace, + RGFW_Tab, + RGFW_CapsLock, + RGFW_ShiftL, + RGFW_ControlL, + RGFW_AltL, + RGFW_SuperL, + RGFW_ShiftR, + RGFW_ControlR, + RGFW_AltR, + RGFW_SuperR, + RGFW_Space, + + RGFW_a, + RGFW_b, + RGFW_c, + RGFW_d, + RGFW_e, + RGFW_f, + RGFW_g, + RGFW_h, + RGFW_i, + RGFW_j, + RGFW_k, + RGFW_l, + RGFW_m, + RGFW_n, + RGFW_o, + RGFW_p, + RGFW_q, + RGFW_r, + RGFW_s, + RGFW_t, + RGFW_u, + RGFW_v, + RGFW_w, + RGFW_x, + RGFW_y, + RGFW_z, + + RGFW_Period, + RGFW_Comma, + RGFW_Slash, + RGFW_Bracket, + RGFW_CloseBracket, + RGFW_Semicolon, + RGFW_Return, + RGFW_Quote, + RGFW_BackSlash, + + RGFW_Up, + RGFW_Down, + RGFW_Left, + RGFW_Right, + + RGFW_Delete, + RGFW_Insert, + RGFW_End, + RGFW_Home, + RGFW_PageUp, + RGFW_PageDown, + + RGFW_Numlock, + RGFW_KP_Slash, + RGFW_Multiply, + RGFW_KP_Minus, + RGFW_KP_1, + RGFW_KP_2, + RGFW_KP_3, + RGFW_KP_4, + RGFW_KP_5, + RGFW_KP_6, + RGFW_KP_7, + RGFW_KP_8, + RGFW_KP_9, + RGFW_KP_0, + RGFW_KP_Period, + RGFW_KP_Return + } RGFW_Key; + + typedef enum RGFW_mouseIcons { + RGFW_MOUSE_NORMAL = 0, + RGFW_MOUSE_ARROW, + RGFW_MOUSE_IBEAM, + RGFW_MOUSE_CROSSHAIR, + RGFW_MOUSE_POINTING_HAND, + RGFW_MOUSE_RESIZE_EW, + RGFW_MOUSE_RESIZE_NS, + RGFW_MOUSE_RESIZE_NWSE, + RGFW_MOUSE_RESIZE_NESW, + RGFW_MOUSE_RESIZE_ALL, + RGFW_MOUSE_NOT_ALLOWED, + } RGFW_mouseIcons; + #endif /* RGFW_HEADER */ /* @@ -871,7 +1016,6 @@ typedef struct { i32 x, y; } RGFW_vector; #ifdef RGFW_MACOS #define RGFW_OS_BASED_VALUE(l, w, m) m #endif - #ifdef RGFW_IMPLEMENTATION #include @@ -879,6 +1023,155 @@ typedef struct { i32 x, y; } RGFW_vector; #include #include +/* + + +This is the start of keycode data + + +*/ + + u8 RGFW_keycodes[] = { + [RGFW_OS_BASED_VALUE(49, 192, 50)] = RGFW_Backtick, + + [RGFW_OS_BASED_VALUE(19, 0x30, 29)] = RGFW_0, + [RGFW_OS_BASED_VALUE(10, 0x31, 18)] = RGFW_1, + [RGFW_OS_BASED_VALUE(11, 0x32, 19)] = RGFW_2, + [RGFW_OS_BASED_VALUE(12, 0x33, 20)] = RGFW_3, + [RGFW_OS_BASED_VALUE(13, 0x34, 21)] = RGFW_4, + [RGFW_OS_BASED_VALUE(14, 0x35, 23)] = RGFW_5, + [RGFW_OS_BASED_VALUE(15, 0x36, 22)] = RGFW_6, + [RGFW_OS_BASED_VALUE(16, 0x37, 26)] = RGFW_7, + [RGFW_OS_BASED_VALUE(17, 0x38, 28)] = RGFW_8, + [RGFW_OS_BASED_VALUE(18, 0x39, 25)] = RGFW_9, + + [RGFW_OS_BASED_VALUE(65, 0x20, 49)] = RGFW_Space, + + [RGFW_OS_BASED_VALUE(38, 0x41, 0)] = RGFW_a, + [RGFW_OS_BASED_VALUE(56, 0x42, 11)] = RGFW_b, + [RGFW_OS_BASED_VALUE(54, 0x43, 8)] = RGFW_c, + [RGFW_OS_BASED_VALUE(40, 0x44, 2)] = RGFW_d, + [RGFW_OS_BASED_VALUE(26, 0x45, 14)] = RGFW_e, + [RGFW_OS_BASED_VALUE(41, 0x46, 3)] = RGFW_f, + [RGFW_OS_BASED_VALUE(42, 0x47, 5)] = RGFW_g, + [RGFW_OS_BASED_VALUE(43, 0x48, 4)] = RGFW_h, + [RGFW_OS_BASED_VALUE(31, 0x49, 34)] = RGFW_i, + [RGFW_OS_BASED_VALUE(44, 0x4A, 38)] = RGFW_j, + [RGFW_OS_BASED_VALUE(45, 0x4B, 40)] = RGFW_k, + [RGFW_OS_BASED_VALUE(46, 0x4C, 37)] = RGFW_l, + [RGFW_OS_BASED_VALUE(58, 0x4D, 46)] = RGFW_m, + [RGFW_OS_BASED_VALUE(57, 0x4E, 45)] = RGFW_n, + [RGFW_OS_BASED_VALUE(32, 0x4F, 31)] = RGFW_o, + [RGFW_OS_BASED_VALUE(33, 0x50, 35)] = RGFW_p, + [RGFW_OS_BASED_VALUE(24, 0x51, 12)] = RGFW_q, + [RGFW_OS_BASED_VALUE(27, 0x52, 15)] = RGFW_r, + [RGFW_OS_BASED_VALUE(39, 0x53, 1)] = RGFW_s, + [RGFW_OS_BASED_VALUE(28, 0x54, 17)] = RGFW_t, + [RGFW_OS_BASED_VALUE(30, 0x55, 32)] = RGFW_u, + [RGFW_OS_BASED_VALUE(55, 0x56, 9)] = RGFW_v, + [RGFW_OS_BASED_VALUE(25, 0x57, 13)] = RGFW_w, + [RGFW_OS_BASED_VALUE(53, 0x58, 7)] = RGFW_x, + [RGFW_OS_BASED_VALUE(29, 0x59, 16)] = RGFW_y, + [RGFW_OS_BASED_VALUE(52, 0x5A, 6)] = RGFW_z, + + [RGFW_OS_BASED_VALUE(60, 190, 47)] = RGFW_Period, + [RGFW_OS_BASED_VALUE(59, 188, 43)] = RGFW_Comma, + [RGFW_OS_BASED_VALUE(61, 191, 44)] = RGFW_Slash, + [RGFW_OS_BASED_VALUE(34, 219, 33)] = RGFW_Bracket, + [RGFW_OS_BASED_VALUE(35, 221, 30)] = RGFW_CloseBracket, + [RGFW_OS_BASED_VALUE(47, 186, 41)] = RGFW_Semicolon, + [RGFW_OS_BASED_VALUE(48, 222, 39)] = RGFW_Quote, + [RGFW_OS_BASED_VALUE(51, 322, 42)] = RGFW_BackSlash, + + [RGFW_OS_BASED_VALUE(36, 0x0D, 36)] = RGFW_Return, + [RGFW_OS_BASED_VALUE(119, 0x2E, 118)] = RGFW_Delete, + [RGFW_OS_BASED_VALUE(77, 0x90, 72)] = RGFW_Numlock, + [RGFW_OS_BASED_VALUE(106, 0x6F, 82)] = RGFW_KP_Slash, + [RGFW_OS_BASED_VALUE(63, 0x6A, 76)] = RGFW_Multiply, + [RGFW_OS_BASED_VALUE(82, 0x6D, 67)] = RGFW_KP_Minus, + [RGFW_OS_BASED_VALUE(87, 0x61, 84)] = RGFW_KP_1, + [RGFW_OS_BASED_VALUE(88, 0x62, 85)] = RGFW_KP_2, + [RGFW_OS_BASED_VALUE(89, 0x63, 86)] = RGFW_KP_3, + [RGFW_OS_BASED_VALUE(83, 0x64, 87)] = RGFW_KP_4, + [RGFW_OS_BASED_VALUE(84, 0x65, 88)] = RGFW_KP_5, + [RGFW_OS_BASED_VALUE(85, 0x66, 89)] = RGFW_KP_6, + [RGFW_OS_BASED_VALUE(79, 0x67, 90)] = RGFW_KP_7, + [RGFW_OS_BASED_VALUE(80, 0x68, 92)] = RGFW_KP_8, + [RGFW_OS_BASED_VALUE(81, 0x69, 93)] = RGFW_KP_9, + [RGFW_OS_BASED_VALUE(90, 0x60, 83)] = RGFW_KP_0, + [RGFW_OS_BASED_VALUE(91, 0x6E, 65)] = RGFW_KP_Period, + [RGFW_OS_BASED_VALUE(104, 0x92, 77)] = RGFW_KP_Return, + + [RGFW_OS_BASED_VALUE(20, 189, 27)] = RGFW_Minus, + [RGFW_OS_BASED_VALUE(21, 187, 24)] = RGFW_Equals, + [RGFW_OS_BASED_VALUE(22, 8, 51)] = RGFW_BackSpace, + [RGFW_OS_BASED_VALUE(23, 0x09, 48)] = RGFW_Tab, + [RGFW_OS_BASED_VALUE(66, 20, 57)] = RGFW_CapsLock, + [RGFW_OS_BASED_VALUE(50, 0xA0, 56)] = RGFW_ShiftL, + [RGFW_OS_BASED_VALUE(37, 0x11, 59)] = RGFW_ControlL, + [RGFW_OS_BASED_VALUE(64, 164, 58)] = RGFW_AltL, + [RGFW_OS_BASED_VALUE(133, 0x5B, 55)] = RGFW_SuperL, + + #if !defined(RGFW_WINDOWS) && !defined(RGFW_MACOS) + [RGFW_OS_BASED_VALUE(105, 0x11, 59)] = RGFW_ControlR, + [RGFW_OS_BASED_VALUE(135, 0xA4, 55)] = RGFW_SuperR, + #endif + + #if !defined(RGFW_MACOS) + [RGFW_OS_BASED_VALUE(62, 0x5C, 56)] = RGFW_ShiftR, + [RGFW_OS_BASED_VALUE(108, 165, 58)] = RGFW_AltR, + #endif + + [RGFW_OS_BASED_VALUE(67, 0x70, 127)] = RGFW_F1, + [RGFW_OS_BASED_VALUE(68, 0x71, 121)] = RGFW_F2, + [RGFW_OS_BASED_VALUE(69, 0x72, 100)] = RGFW_F3, + [RGFW_OS_BASED_VALUE(70, 0x73, 119)] = RGFW_F4, + [RGFW_OS_BASED_VALUE(71, 0x74, 97)] = RGFW_F5, + [RGFW_OS_BASED_VALUE(72, 0x75, 98)] = RGFW_F6, + [RGFW_OS_BASED_VALUE(73, 0x76, 99)] = RGFW_F7, + [RGFW_OS_BASED_VALUE(74, 0x77, 101)] = RGFW_F8, + [RGFW_OS_BASED_VALUE(75, 0x78, 102)] = RGFW_F9, + [RGFW_OS_BASED_VALUE(76, 0x79, 110)] = RGFW_F10, + [RGFW_OS_BASED_VALUE(95, 0x7A, 104)] = RGFW_F11, + [RGFW_OS_BASED_VALUE(96, 0x7B, 112)] = RGFW_F12, + [RGFW_OS_BASED_VALUE(111, 0x26, 126)] = RGFW_Up, + [RGFW_OS_BASED_VALUE(116, 0x28, 125)] = RGFW_Down, + [RGFW_OS_BASED_VALUE(113, 0x25, 123)] = RGFW_Left, + [RGFW_OS_BASED_VALUE(114, 0x27, 124)] = RGFW_Right, + [RGFW_OS_BASED_VALUE(118, 0x2D, 115)] = RGFW_Insert, + [RGFW_OS_BASED_VALUE(115, 0x23, 120)] = RGFW_End, + [RGFW_OS_BASED_VALUE(112, 336, 117)] = RGFW_PageUp, + [RGFW_OS_BASED_VALUE(117, 325, 122)] = RGFW_PageDown, + [RGFW_OS_BASED_VALUE(9, 0x1B, 53)] = RGFW_Escape, + [RGFW_OS_BASED_VALUE(110, 0x24, 116)] = RGFW_Home, + }; + + #ifdef RGFW_X11 + u8 RGFW_mouseIconSrc[] = {68, 68, 152, 34, 60, 108, 116, 12, 14, 52, 0}; + #elif defined(RGFW_WINDOWS) + u32 RGFW_mouseIconSrc[] = {32512, 32512, 32513, 32515, 32649, 32644, 32645, 32642, 32643, 32646, 32648}; + #elif defined(RGFW_MACOS) + char* RGFW_mouseIconSrc[] = {"arrowCursor", "arrowCursor", "IBeamCursor", "crosshairCursor", "pointingHandCursor", "resizeLeftRightCursor", "resizeUpDownCursor", "_windowResizeNorthWestSouthEastCursor", "_windowResizeNorthEastSouthWestCursor", "closedHandCursor", "operationNotAllowedCursor"}; + #endif + + u8 RGFW_keyboard[128] = { 0 }; + u8 RGFW_keyboard_prev[128]; + + RGFWDEF u32 RGFW_apiKeyCodeToRGFW(u32 keycode); + + u32 RGFW_apiKeyCodeToRGFW(u32 keycode) { + if (keycode > sizeof(RGFW_keycodes) / sizeof(u8)) + return 0; + + return RGFW_keycodes[keycode]; + } + +/* + +this is the end of keycode data + +*/ + #ifdef RGFW_WINDOWS #include @@ -1044,14 +1337,7 @@ typedef struct { i32 x, y; } RGFW_vector; return array; } - - void si_array_free(void* array) { - if (array == NULL) - return; - - free(SI_ARRAY_HEADER(array)); - } - + unsigned char* NSBitmapImageRep_bitmapData(NSBitmapImageRep* imageRep) { return ((unsigned char* (*)(id, SEL))objc_msgSend) (imageRep, sel_registerName("bitmapData")); @@ -1371,9 +1657,6 @@ typedef struct { i32 x, y; } RGFW_vector; win->event.inFocus = 1; win->event.droppedFilesCount = 0; win->src.joystickCount = 0; -#ifdef RGFW_X11 - win->src.cursor = 0; -#endif #ifdef RGFW_MACOS RGFW_window_setMouseDefault(win); #endif @@ -1553,14 +1836,14 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ u32 deviceCount = 0; vkEnumeratePhysicalDevices(RGFW_vulkan_info.instance, &deviceCount, NULL); - VkPhysicalDevice* devices = (VkPhysicalDevice*) malloc(sizeof(VkPhysicalDevice) * deviceCount); + VkPhysicalDevice* devices = (VkPhysicalDevice*) RGFW_MALLOC(sizeof(VkPhysicalDevice) * deviceCount); vkEnumeratePhysicalDevices(RGFW_vulkan_info.instance, &deviceCount, devices); RGFW_vulkan_info.physical_device = devices[0]; u32 queue_family_count = 0; vkGetPhysicalDeviceQueueFamilyProperties(RGFW_vulkan_info.physical_device, &queue_family_count, NULL); - VkQueueFamilyProperties* queueFamilies = (VkQueueFamilyProperties*) malloc(sizeof(VkQueueFamilyProperties) * queue_family_count); + VkQueueFamilyProperties* queueFamilies = (VkQueueFamilyProperties*) RGFW_MALLOC(sizeof(VkQueueFamilyProperties) * queue_family_count); vkGetPhysicalDeviceQueueFamilyProperties(RGFW_vulkan_info.physical_device, &queue_family_count, queueFamilies); float queuePriority = 1.0f; @@ -1637,10 +1920,10 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ u32 imageCount; vkGetSwapchainImagesKHR(RGFW_vulkan_info.device, win->src.swapchain, &imageCount, NULL); - win->src.swapchain_images = (VkImage*) malloc(sizeof(VkImage) * imageCount); + win->src.swapchain_images = (VkImage*) RGFW_MALLOC(sizeof(VkImage) * imageCount); vkGetSwapchainImagesKHR(RGFW_vulkan_info.device, win->src.swapchain, &imageCount, win->src.swapchain_images); - win->src.swapchain_image_views = (VkImageView*) malloc(sizeof(VkImageView) * imageCount); + win->src.swapchain_image_views = (VkImageView*) RGFW_MALLOC(sizeof(VkImageView) * imageCount); for (u32 i = 0; i < imageCount; i++) { VkImageViewCreateInfo image_view_cre_infos = { 0 }; image_view_cre_infos.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; @@ -1724,7 +2007,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ int RGFW_createCommandBuffers(RGFW_window* win) { assert(win != NULL); - RGFW_vulkan_info.command_buffers = (VkCommandBuffer*) malloc(sizeof(VkCommandBuffer) * win->src.image_count); + RGFW_vulkan_info.command_buffers = (VkCommandBuffer*) RGFW_MALLOC(sizeof(VkCommandBuffer) * win->src.image_count); VkCommandBufferAllocateInfo allocInfo = { 0 }; allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; @@ -1742,10 +2025,10 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ int RGFW_createSyncObjects(RGFW_window* win) { assert(win != NULL); - RGFW_vulkan_info.available_semaphores = (VkSemaphore*) malloc(sizeof(VkSemaphore) * RGFW_MAX_FRAMES_IN_FLIGHT); - RGFW_vulkan_info.finished_semaphore = (VkSemaphore*) malloc(sizeof(VkSemaphore) * RGFW_MAX_FRAMES_IN_FLIGHT); - RGFW_vulkan_info.in_flight_fences = (VkFence*) malloc(sizeof(VkFence) * RGFW_MAX_FRAMES_IN_FLIGHT); - RGFW_vulkan_info.image_in_flight = (VkFence*) malloc(sizeof(VkFence) * win->src.image_count); + RGFW_vulkan_info.available_semaphores = (VkSemaphore*) RGFW_MALLOC(sizeof(VkSemaphore) * RGFW_MAX_FRAMES_IN_FLIGHT); + RGFW_vulkan_info.finished_semaphore = (VkSemaphore*) RGFW_MALLOC(sizeof(VkSemaphore) * RGFW_MAX_FRAMES_IN_FLIGHT); + RGFW_vulkan_info.in_flight_fences = (VkFence*) RGFW_MALLOC(sizeof(VkFence) * RGFW_MAX_FRAMES_IN_FLIGHT); + RGFW_vulkan_info.image_in_flight = (VkFence*) RGFW_MALLOC(sizeof(VkFence) * win->src.image_count); VkSemaphoreCreateInfo semaphore_info = { 0 }; semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; @@ -1773,7 +2056,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ int RGFW_createFramebuffers(RGFW_window* win) { assert(win != NULL); - RGFW_vulkan_info.framebuffers = (VkFramebuffer*) malloc(sizeof(VkFramebuffer) * win->src.image_count); + RGFW_vulkan_info.framebuffers = (VkFramebuffer*) RGFW_MALLOC(sizeof(VkFramebuffer) * win->src.image_count); for (size_t i = 0; i < win->src.image_count; i++) { VkImageView attachments[] = { win->src.swapchain_image_views[i] }; @@ -1819,12 +2102,12 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ vkDestroyDevice(RGFW_vulkan_info.device, NULL); vkDestroyInstance(RGFW_vulkan_info.instance, NULL); - free(RGFW_vulkan_info.framebuffers); - free(RGFW_vulkan_info.command_buffers); - free(RGFW_vulkan_info.available_semaphores); - free(RGFW_vulkan_info.finished_semaphore); - free(RGFW_vulkan_info.in_flight_fences); - free(RGFW_vulkan_info.image_in_flight); + RGFW_FREE(RGFW_vulkan_info.framebuffers); + RGFW_FREE(RGFW_vulkan_info.command_buffers); + RGFW_FREE(RGFW_vulkan_info.available_semaphores); + RGFW_FREE(RGFW_vulkan_info.finished_semaphore); + RGFW_FREE(RGFW_vulkan_info.in_flight_fences); + RGFW_FREE(RGFW_vulkan_info.image_in_flight); } #endif /* RGFW_VULKAN */ @@ -1844,7 +2127,6 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ #endif #endif -#define RGFW_MOUSE_CHANGED (1L<<1) /*!< mouse change (for winargs)*/ #define RGFW_HOLD_MOUSE (1L<<2) /*!< hold the moues still */ #ifdef RGFW_WINDOWS @@ -1855,11 +2137,40 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ #include #include #endif + + u8 RGFW_mouseButtons[5] = { 0 }; + u8 RGFW_mouseButtons_prev[5]; -#if defined(RGFW_MACOS) - u8 RGFW_keyBoard[128] = { 0 }; - u8 RGFW_keyBoard_prev[128]; -#endif + u8 RGFW_isMousePressed(RGFW_window* win, u8 button) { + if (win != NULL && !win->event.inFocus) + return 0; + + return RGFW_mouseButtons[button]; + } + u8 RGFW_wasMousePressed(RGFW_window* win, u8 button) { + if (win != NULL && !win->event.inFocus) + return 0; + + return RGFW_mouseButtons_prev[button]; + } + u8 RGFW_isMouseHeld(RGFW_window* win, u8 button) { + return (RGFW_isMousePressed(win, button) && RGFW_wasMousePressed(win, button)); + } + u8 RGFW_isMouseReleased(RGFW_window* win, u8 button) { + return (!RGFW_isMousePressed(win, button) && RGFW_wasMousePressed(win, button)); + } + + u8 RGFW_isPressedI(RGFW_window* win, u32 key) { + RGFW_UNUSED(win); + + return RGFW_keyboard[key]; + } + + u8 RGFW_wasPressedI(RGFW_window* win, u32 key) { + RGFW_UNUSED(win); + + return RGFW_keyboard_prev[key]; + } u8 RGFW_isHeldI(RGFW_window* win, u32 key) { return (RGFW_isPressedI(win, key) && RGFW_wasPressedI(win, key)); @@ -1870,31 +2181,14 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ } char* RGFW_keyCodeTokeyStr(u64 key) { -#if defined(RGFW_MACOS) - static char* keyStrs[128] = { "a", "s", "d", "f", "h", "g", "z", "x", "c", "v", "0", "b", "q", "w", "e", "r", "y", "t", "1", "2", "3", "4", "6", "5", "Equals", "9", "7", "Minus", "8", "0", "CloseBracket", "o", "u", "Bracket", "i", "p", "Return", "l", "j", "Apostrophe", "k", "Semicolon", "BackSlash", "Comma", "Slash", "n", "m", "Period", "Tab", "Space", "Backtick", "BackSpace", "0", "Escape", "0", "Super", "Shift", "CapsLock", "Alt", "Control", "0", "0", "0", "0", "0", "KP_Period", "0", "KP_Minus", "0", "0", "0", "0", "Numlock", "0", "0", "0", "KP_Multiply", "KP_Return", "0", "0", "0", "0", "KP_Slash", "KP_0", "KP_1", "KP_2", "KP_3", "KP_4", "KP_5", "KP_6", "KP_7", "0", "KP_8", "KP_9", "0", "0", "0", "F5", "F6", "F7", "F3", "F8", "F9", "0", "F11", "0", "F13", "0", "F14", "0", "F10", "0", "F12", "0", "F15", "Insert", "Home", "PageUp", "Delete", "F4", "End", "F2", "PageDown", "Left", "Right", "Down", "Up", "F1" }; + static char* keyStrs[128] = {"Escape", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Backtick", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "=", "BackSpace", "Tab", "CapsLock", "ShiftL", "ControlL", "AltL", "SuperL", "ShiftR", "ControlR", "AltR", "SuperR", " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ".", ",", "-", "[", "]", ";", "Return", "'", "\\", "Up", "Down", "Left", "Right", "Delete", "Insert", "End", "Home", "PageUp", "PageDown", "Numlock", "KP_Slash", "Multiply", "KP_Minus", "KP_1", "KP_2", "KP_3", "KP_4", "KP_5", "KP_6", "KP_7", "KP_8", "KP_9", "KP_0", "KP_Period", "KP_Return" }; return keyStrs[key]; -#endif -#ifdef RGFW_X11 - return XKeysymToString(key); -#endif -#ifdef RGFW_WINDOWS - static char keyName[16]; - GetKeyNameTextA((LONG) key, keyName, 16); - - if ((!(GetKeyState(VK_CAPITAL) & 0x0001) && !(GetKeyState(VK_SHIFT) & 0x8000)) || - ((GetKeyState(VK_CAPITAL) & 0x0001) && (GetKeyState(VK_SHIFT) & 0x8000))) { - CharLowerBuffA(keyName, 16); - } - - return keyName; -#endif } u32 RGFW_keyStrToKeyCode(char* key) { -#if defined(RGFW_MACOS) - static char* keyStrs[128] = { "a", "s", "d", "f", "h", "g", "z", "x", "c", "v", "0", "b", "q", "w", "e", "r", "y", "t", "1", "2", "3", "4", "6", "5", "Equals", "9", "7", "Minus", "8", "0", "CloseBracket", "o", "u", "Bracket", "i", "p", "Return", "l", "j", "Apostrophe", "k", "Semicolon", "BackSlash", "Comma", "Slash", "n", "m", "Period", "Tab", "Space", "Backtick", "BackSpace", "0", "Escape", "0", "Super", "Shift", "CapsLock", "Alt", "Control", "0", "0", "0", "0", "0", "KP_Period", "0", "KP_Minus", "0", "0", "0", "0", "Numlock", "0", "0", "0", "KP_Multiply", "KP_Return", "0", "0", "0", "0", "KP_Slash", "KP_0", "KP_1", "KP_2", "KP_3", "KP_4", "KP_5", "KP_6", "KP_7", "0", "KP_8", "KP_9", "0", "0", "0", "F5", "F6", "F7", "F3", "F8", "F9", "0", "F11", "0", "F13", "0", "F14", "0", "F10", "0", "F12", "0", "F15", "Insert", "Home", "PageUp", "Delete", "F4", "End", "F2", "PageDown", "Left", "Right", "Down", "Up", "F1" }; - + static char* keyStrs[128] = {"Escape", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "Backtick", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "=", "BackSpace", "Tab", "CapsLock", "ShiftL", "ControlL", "AltL", "SuperL", "ShiftR", "ControlR", "AltR", "SuperR", " ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", ".", ",", "-", "[", "]", ";", "Return", "'", "\\", "Up", "Down", "Left", "Right", "Delete", "Insert", "End", "Home", "PageUp", "PageDown", "Numlock", "KP_Slash", "Multiply", "KP_Minus", "KP_1", "KP_2", "KP_3", "KP_4", "KP_5", "KP_6", "KP_7", "KP_8", "KP_9", "KP_0", "KP_Period", "KP_Return" }; + key--; while (key++) { u32 i; @@ -1908,7 +2202,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ } if (*keyStrs[i] == '\0' && *key == '\0') - return i; + return RGFW_apiKeyCodeToRGFW(i); else keyStrs[i]++; @@ -1917,58 +2211,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ if (*key == '\0') break; } - -#endif -#ifdef RGFW_X11 - if (strcmp(key, "Space") == 0) key = (char*) "space"; - - return XStringToKeysym(key); -#endif -#ifdef RGFW_WINDOWS - if (key[1]) { - struct { char* key; i32 code; } keyStrs[] = { - {"Super_L", VK_LWIN}, - {"Super_R", VK_RWIN}, - {"Space", VK_SPACE}, - {"Return", VK_RETURN}, - {"Caps_Lock", VK_CAPITAL}, - {"Tab", VK_TAB}, - {"Right", VK_RIGHT}, - {"Left", VK_LEFT}, - {"Up", VK_UP}, - {"Down", VK_DOWN}, - {"ShiftL", VK_LSHIFT}, - {"ShiftR", VK_RSHIFT}, - {"ControlL", VK_RCONTROL}, - {"ControlR", VK_RCONTROL} - }; - - - while (key++) { - u32 i; - for (i = 0; i < 14; i++) { - if (*keyStrs[i].key != '\0' && *keyStrs[i].key != '\1') - keyStrs[i].key++; - - if (*keyStrs[i].key != *key) { - keyStrs[i].key = "\1"; - continue; - } - - if (*keyStrs[i].key == '\0' && *key == '\0') - return keyStrs[i].code; - } - - if (*key == '\0') - break; - } - } - - i32 vKey = VkKeyScan(key[0]); - - return vKey; -#endif /* RGFW_WINDOWS */ - + return 0; } @@ -2028,12 +2271,13 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ #define M_PI 3.14159265358979323846 /* pi */ #endif - typedef struct RGFW_Timespec { - time_t tv_sec; /* Seconds. */ - u32 tv_nsec; /* Nanoseconds. */ - } RGFW_Timespec; /*time struct for fps functions*/ - #ifndef RGFW_WINDOWS + struct timespec; + + int nanosleep(const struct timespec* duration, struct timespec* rem); + int clock_gettime(clockid_t clk_id, struct timespec* tp); + int setenv(const char *name, const char *value, int overwrite); + u32 RGFW_isPressedJS(RGFW_window* win, u16 c, u8 button) { return win->src.jsPressed[c][button]; } #else @@ -2498,7 +2742,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ u32 valuemask = CWBorderPixel | CWColormap; #else - XVisualInfo* vi = (XVisualInfo*) malloc(sizeof(XVisualInfo)); + XVisualInfo* vi = (XVisualInfo*) RGFW_MALLOC(sizeof(XVisualInfo)); vi->screen = DefaultScreen((Display*) win->src.display); vi->visual = DefaultVisual((Display*) win->src.display, vi->screen); @@ -2661,7 +2905,20 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ i32 x, y; u32 z; Window window1, window2; - XQueryPointer((Display*) RGFW_root->src.display, XDefaultRootWindow((Display*) RGFW_root->src.display), &window1, &window2, &x, &RGFWMouse.x, &RGFWMouse.y, &y, &z); + XQueryPointer((Display*) RGFW_root->src.display, XDefaultRootWindow((Display*) RGFW_root->src.display), &window1, &window2, &RGFWMouse.x, &RGFWMouse.y, &x, &y, &z); + + return RGFWMouse; + } + + RGFW_vector RGFW_window_getMousePoint(RGFW_window* win) { + assert(win != NULL); + + RGFW_vector RGFWMouse; + + i32 x, y; + u32 z; + Window window1, window2; + XQueryPointer((Display*) win->src.display, win->src.window, &window1, &window2, &x, &y, &RGFWMouse.x, &RGFWMouse.y, &z); return RGFWMouse; } @@ -2674,9 +2931,6 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ int xAxis = 0, yAxis = 0; - char RGFW_keyboard[32]; - char RGFW_keyboard_prev[32]; - RGFW_Event* RGFW_window_checkEvent(RGFW_window* win) { assert(win != NULL); win->event.type = 0; @@ -2749,30 +3003,28 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ } /* set event key data */ - win->event.keyCode = XkbKeycodeToKeysym((Display*) win->src.display, E.xkey.keycode, 0, E.xkey.state & ShiftMask ? 1 : 0); - win->event.keyName = XKeysymToString(win->event.keyCode); /* convert to string */ - - if (RGFW_isPressedI(win, win->event.keyCode)) - RGFW_keyboard_prev[E.xkey.keycode >> 3] |= (1 << (E.xkey.keycode & 7)); - else - RGFW_keyboard_prev[E.xkey.keycode >> 3] |= 0; + KeySym sym = XkbKeycodeToKeysym((Display*) win->src.display, E.xkey.keycode, 0, E.xkey.state & ShiftMask ? 1 : 0); + win->event.keyCode = RGFW_apiKeyCodeToRGFW(E.xkey.keycode); + win->event.keyName = XKeysymToString(sym); /* convert to string */ + RGFW_keyboard_prev[win->event.keyCode] = RGFW_isPressedI(win, win->event.keyCode); + /* get keystate data */ win->event.type = (E.type == KeyPress) ? RGFW_keyPressed : RGFW_keyReleased; if (win->event.type == RGFW_keyReleased) { - if (win->event.keyCode == XK_Caps_Lock && win->event.lockState & RGFW_CAPSLOCK) + if (sym == XK_Caps_Lock && win->event.lockState & RGFW_CAPSLOCK) win->event.lockState ^= RGFW_CAPSLOCK; - else if (win->event.keyCode == XK_Caps_Lock) + else if (sym == XK_Caps_Lock) win->event.lockState |= RGFW_CAPSLOCK; - else if (win->event.keyCode == XK_Num_Lock && win->event.lockState & RGFW_NUMLOCK) + else if (sym == XK_Num_Lock && win->event.lockState & RGFW_NUMLOCK) win->event.lockState ^= RGFW_NUMLOCK; - else if (win->event.keyCode == XK_Num_Lock) + else if (sym == XK_Num_Lock) win->event.lockState |= RGFW_NUMLOCK; } - - XQueryKeymap(win->src.display, RGFW_keyboard); /* query the keymap */ + + RGFW_keyboard[win->event.keyCode] = (E.type == KeyPress); break; case ButtonPress: @@ -2787,6 +3039,8 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ } win->event.button = E.xbutton.button; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = (E.type == ButtonPress); break; case MotionNotify: @@ -3038,7 +3292,7 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ index++; line++; } - + path[index] = '\0'; strcpy(win->event.droppedFiles[win->event.droppedFilesCount - 1], path); } @@ -3067,40 +3321,34 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ XGetKeyboardControl((Display*) win->src.display, &keystate); win->event.lockState = keystate.led_mask; + win->event.type = RGFW_focusIn; + break; + break; case FocusOut: win->event.inFocus = 0; - RGFW_window_setMouseDefault(win); + win->event.type = RGFW_focusOut; break; case ConfigureNotify: { -#ifndef RGFW_NO_X11_WINDOW_ATTRIB - XWindowAttributes a; - XGetWindowAttributes((Display*) win->src.display, (Window) win->src.window, &a); - win->r = RGFW_RECT(E.xconfigure.x, E.xconfigure.y, E.xconfigure.width, E.xconfigure.height); -#endif - - win->event.type = RGFW_windowAttribsChange; - break; + // detect resize + if (E.xconfigure.width != win->r.w || E.xconfigure.height != win->r.h) { + win->event.type = RGFW_windowResized; + win->r = RGFW_RECT(win->r.x, win->r.y, E.xconfigure.width, E.xconfigure.height); + break; + } + + // detect move + if (E.xconfigure.x != win->r.x || E.xconfigure.y != win->r.y) { + win->event.type = RGFW_windowMoved; + win->r = RGFW_RECT(E.xconfigure.x, E.xconfigure.y, win->r.w, win->r.h); + break; + } } default: { break; } } - if (win->event.inFocus && (win->src.winArgs & RGFW_MOUSE_CHANGED)) { - XDefineCursor((Display*) win->src.display, (Window) win->src.window, (Cursor) win->src.cursor); - - win->src.winArgs &= ~RGFW_MOUSE_CHANGED; - } - - if (win->src.winArgs & RGFW_HOLD_MOUSE && win->event.inFocus && win->event.type == RGFW_mousePosChanged) { - RGFW_window_moveMouse(win, RGFW_VECTOR(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); - - if (XEventsQueued((Display*) win->src.display, QueuedAfterReading) <= 1) - XSync(win->src.display, True); - } - - XFlush((Display*) win->src.display); if (win->event.type) @@ -3119,16 +3367,14 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ vkDestroySwapchainKHR(RGFW_vulkan_info.device, win->src.swapchain, NULL); vkDestroySurfaceKHR(RGFW_vulkan_info.instance, win->src.rSurf, NULL); - free(win->src.swapchain_image_views); - free(win->src.swapchain_images); + RGFW_FREE(win->src.swapchain_image_views); + RGFW_FREE(win->src.swapchain_images); #endif #ifdef RGFW_EGL RGFW_closeEGL(win); #endif - XFreeCursor((Display*) win->src.display, (Cursor) win->src.cursor); - #if defined(RGFW_OSMESA) || defined(RGFW_BUFFER) if (win->buffer != NULL) { XDestroyImage((XImage*) win->src.bitmap); @@ -3302,10 +3548,6 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ assert(win != NULL); #ifndef RGFW_NO_X11_CURSOR - /* free the previous cursor */ - if (win->src.cursor) - XFreeCursor((Display*) win->src.display, (Cursor) win->src.cursor); - XcursorImage* native = XcursorImageCreate(a.w, a.h); native->xhot = 0; native->yhot = 0; @@ -3322,9 +3564,10 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ *target = (alpha << 24) | (((source[0] * alpha) / 255) << 16) | (((source[1] * alpha) / 255) << 8) | (((source[2] * alpha) / 255) << 0); } - win->src.winArgs |= RGFW_MOUSE_CHANGED; - win->src.cursor = XcursorImageLoadCursor((Display*) win->src.display, native); + Cursor cursor = XcursorImageLoadCursor((Display*) win->src.display, native); + XDefineCursor((Display*) win->src.display, (Window) win->src.window, (Cursor) cursor); + XFreeCursor((Display*) win->src.display, (Cursor) cursor); XcursorImageDestroy(native); #else RGFW_UNUSED(image) RGFW_UNUSED(a.w) RGFW_UNUSED(channels) @@ -3353,18 +3596,21 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ } void RGFW_window_setMouseDefault(RGFW_window* win) { - RGFW_window_setMouseStandard(win, XC_left_ptr); + RGFW_window_setMouseStandard(win, RGFW_MOUSE_ARROW); } - void RGFW_window_setMouseStandard(RGFW_window* win, i32 mouse) { + void RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) { assert(win != NULL); - /* free the previous cursor */ - if (win->src.cursor) - XFreeCursor((Display*) win->src.display, (Cursor) win->src.cursor); + if (mouse > (sizeof(RGFW_mouseIconSrc) / sizeof(u8))) + return; + + mouse = RGFW_mouseIconSrc[mouse]; + + Cursor cursor = XCreateFontCursor((Display*) win->src.display, mouse); + XDefineCursor((Display*) win->src.display, (Window) win->src.window, (Cursor) cursor); - win->src.winArgs |= RGFW_MOUSE_CHANGED; - win->src.cursor = XCreateFontCursor((Display*) win->src.display, mouse); + XFreeCursor((Display*) win->src.display, (Cursor) cursor); } void RGFW_window_hide(RGFW_window* win) { @@ -3407,7 +3653,8 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ &format, &sizeN, &N, (unsigned char**) &data); if (target == UTF8 || target == XA_STRING) { - s = strndup(data, sizeN); + s = (char*)RGFW_MALLOC(sizeof(char) * sizeN); + strcpy(s, data); XFree(data); } @@ -3777,33 +4024,6 @@ RGFW_UNUSED(win); /* if buffer rendering is not being used */ RGFW_monitor RGFW_window_getMonitor(RGFW_window* win) { return RGFW_XCreateMonitor(DefaultScreen(win->src.display)); } - - u8 RGFW_isPressedI(RGFW_window* win, u32 key) { - Display* d; - if (win == (RGFW_window*) 0) - d = RGFW_root->src.display; - else if (!win->event.inFocus) - return 0; - else - d = (Display*) win->src.display; - - KeyCode kc2 = XKeysymToKeycode(d, key); /* convert the key to a keycode */ - return (RGFW_keyboard[kc2 >> 3] & (1 << (kc2 & 7))); /* check if the key is pressed */ - } - - u8 RGFW_wasPressedI(RGFW_window* win, u32 key) { - Display* d; - if (win == (RGFW_window*) 0) - d = RGFW_root->src.display; - else if (!win->event.inFocus) - return 0; - else - d = (Display*) win->src.display; - - KeyCode kc2 = XKeysymToKeycode(d, key); /* convert the key to a keycode */ - return !!(RGFW_keyboard_prev[kc2 >> 3] & (1 << (kc2 & 7))); /* check if the key is pressed */ - } - #endif #ifdef RGFW_WINDOWS @@ -4243,6 +4463,14 @@ static HMODULE wglinstance = NULL; return RGFW_VECTOR(p.x, p.y); } + RGFW_vector RGFW_window_getMousePoint(RGFW_window* win) { + POINT p; + GetCursorPos(&p); + ScreenToClient(win->src.window, &p); + + return RGFW_VECTOR(p.x, p.y); + } + void RGFW_window_setMinSize(RGFW_window* win, RGFW_area a) { assert(win != NULL); win->src.minSize = a; @@ -4398,9 +4626,6 @@ static HMODULE wglinstance = NULL; return 0; } - BYTE RGFW_keyBoard[256]; - BYTE RGFW_keyBoard_prev[256]; - RGFW_Event* RGFW_window_checkEvent(RGFW_window* win) { assert(win != NULL); @@ -4410,15 +4635,15 @@ static HMODULE wglinstance = NULL; if (RGFW_eventWindow.r.x != -1) { win->r.x = RGFW_eventWindow.r.x; win->r.y = RGFW_eventWindow.r.y; + win->event.type = RGFW_windowMoved; } if (RGFW_eventWindow.r.w != -1) { win->r.w = RGFW_eventWindow.r.w; win->r.h = RGFW_eventWindow.r.h; + win->event.type = RGFW_windowResized; } - win->event.type = RGFW_windowAttribsChange; - RGFW_eventWindow.src.window = NULL; RGFW_eventWindow.r = RGFW_RECT(-1, -1, -1, -1); @@ -4442,40 +4667,70 @@ static HMODULE wglinstance = NULL; win->event.type = RGFW_quit; break; - case WM_KEYUP: - win->event.keyCode = (u32) msg.wParam; - if (RGFW_isPressedI(win, win->event.keyCode)) - RGFW_keyBoard_prev[win->event.keyCode] |= 0x80; + case WM_ACTIVATE: + win->event.inFocus = (LOWORD(msg.wParam) == WA_INACTIVE); + + if (win->event.inFocus) + win->event.type = RGFW_focusIn; else - RGFW_keyBoard_prev[win->event.keyCode] = 0; + win->event.type = RGFW_focusOut; + + break; - strncpy(win->event.keyName, RGFW_keyCodeTokeyStr(msg.lParam), 16); - if (RGFW_isPressedI(win, VK_SHIFT)) { + case WM_KEYUP: { + win->event.keyCode = RGFW_apiKeyCodeToRGFW((u32) msg.wParam); + + RGFW_keyboard_prev[win->event.keyCode] = RGFW_isPressedI(win, win->event.keyCode); + + static char keyName[16]; + + { + GetKeyNameTextA((LONG) msg.lParam, keyName, 16); + + if ((!(GetKeyState(VK_CAPITAL) & 0x0001) && !(GetKeyState(VK_SHIFT) & 0x8000)) || + ((GetKeyState(VK_CAPITAL) & 0x0001) && (GetKeyState(VK_SHIFT) & 0x8000))) { + CharLowerBuffA(keyName, 16); + } + } + + strncpy(win->event.keyName, keyName, 16); + + if (RGFW_isPressedI(win, RGFW_ShiftL)) { ToAscii((UINT) msg.wParam, MapVirtualKey((UINT) msg.wParam, MAPVK_VK_TO_CHAR), keyboardState, (LPWORD) win->event.keyName, 0); } win->event.type = RGFW_keyReleased; - GetKeyboardState(RGFW_keyBoard); + RGFW_keyboard[win->event.keyCode] = 0; break; + } + case WM_KEYDOWN: { + win->event.keyCode = RGFW_apiKeyCodeToRGFW((u32) msg.wParam); - case WM_KEYDOWN: - win->event.keyCode = (u32) msg.wParam; + RGFW_keyboard_prev[win->event.keyCode] = RGFW_isPressedI(win, win->event.keyCode); - if (RGFW_isPressedI(win, win->event.keyCode)) - RGFW_keyBoard_prev[win->event.keyCode] |= 0x80; - else - RGFW_keyBoard_prev[win->event.keyCode] = 0; + static char keyName[16]; + + { + GetKeyNameTextA((LONG) msg.lParam, keyName, 16); + + if ((!(GetKeyState(VK_CAPITAL) & 0x0001) && !(GetKeyState(VK_SHIFT) & 0x8000)) || + ((GetKeyState(VK_CAPITAL) & 0x0001) && (GetKeyState(VK_SHIFT) & 0x8000))) { + CharLowerBuffA(keyName, 16); + } + } + + strncpy(win->event.keyName, keyName, 16); - strncpy(win->event.keyName, RGFW_keyCodeTokeyStr(msg.lParam), 16); - if (RGFW_isPressedI(win, VK_SHIFT) & 0x8000) { + if (RGFW_isPressedI(win, RGFW_ShiftL) & 0x8000) { ToAscii((UINT) msg.wParam, MapVirtualKey((UINT) msg.wParam, MAPVK_VK_TO_CHAR), keyboardState, (LPWORD) win->event.keyName, 0); } win->event.type = RGFW_keyPressed; - GetKeyboardState(RGFW_keyBoard); + RGFW_keyboard[win->event.keyCode] = 1; break; + } case WM_MOUSEMOVE: win->event.point.x = GET_X_LPARAM(msg.lParam); @@ -4486,15 +4741,21 @@ static HMODULE wglinstance = NULL; case WM_LBUTTONDOWN: win->event.button = RGFW_mouseLeft; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; win->event.type = RGFW_mouseButtonPressed; break; case WM_RBUTTONDOWN: win->event.button = RGFW_mouseRight; win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; break; case WM_MBUTTONDOWN: win->event.button = RGFW_mouseMiddle; win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; break; case WM_MOUSEWHEEL: @@ -4503,22 +4764,35 @@ static HMODULE wglinstance = NULL; else win->event.button = RGFW_mouseScrollDown; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; + win->event.scroll = (SHORT) HIWORD(msg.wParam) / (double) WHEEL_DELTA; win->event.type = RGFW_mouseButtonPressed; break; case WM_LBUTTONUP: + win->event.button = RGFW_mouseLeft; win->event.type = RGFW_mouseButtonReleased; + + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; break; case WM_RBUTTONUP: win->event.button = RGFW_mouseRight; win->event.type = RGFW_mouseButtonReleased; + + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; break; case WM_MBUTTONUP: win->event.button = RGFW_mouseMiddle; win->event.type = RGFW_mouseButtonReleased; + + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; break; /* @@ -4586,12 +4860,6 @@ static HMODULE wglinstance = NULL; else win->event.type = 0; - RGFW_vector mouse = RGFW_getGlobalMousePoint(); - if (win->src.winArgs & RGFW_HOLD_MOUSE && win->event.inFocus && - (mouse.x != win->r.x + (win->r.w / 2) || mouse.y != win->r.y + (win->r.h / 2))) { - RGFW_window_moveMouse(win, RGFW_VECTOR(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); - } - win->event.lockState = 0; if ((GetKeyState(VK_CAPITAL) & 0x0001) != 0) @@ -4741,26 +5009,6 @@ static HMODULE wglinstance = NULL; return win32CreateMonitor(src); } - u8 RGFW_isPressedI(RGFW_window* win, u32 key) { - if (win != NULL && !win->event.inFocus) - return 0; - - if (RGFW_keyBoard[key] & 0x80) - return 1; - - return 0; - } - - u8 RGFW_wasPressedI(RGFW_window* win, u32 key) { - if (win != NULL && !win->event.inFocus) - return 0; - - if (RGFW_keyBoard_prev[key] & 0x80) - return 1; - - return 0; - } - HICON RGFW_loadHandleImage(RGFW_window* win, u8* src, RGFW_area a, BOOL icon) { assert(win != NULL); @@ -4831,12 +5079,17 @@ static HMODULE wglinstance = NULL; } void RGFW_window_setMouseDefault(RGFW_window* win) { - RGFW_window_setMouseStandard(win, 32512); + RGFW_window_setMouseStandard(win, RGFW_MOUSE_ARROW); } - void RGFW_window_setMouseStandard(RGFW_window* win, i32 mouse) { + void RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) { assert(win != NULL); + if (mouse > (sizeof(RGFW_mouseIconSrc) / sizeof(u32))) + return; + + mouse = RGFW_mouseIconSrc[mouse]; + char* icon = MAKEINTRESOURCEA(mouse); SetClassLongPtrA(win->src.window, GCLP_HCURSOR, (LPARAM) LoadCursorA(NULL, icon)); @@ -4865,8 +5118,8 @@ static HMODULE wglinstance = NULL; vkDestroySwapchainKHR(RGFW_vulkan_info.device, win->src.swapchain, NULL); vkDestroySurfaceKHR(RGFW_vulkan_info.instance, win->src.rSurf, NULL); - free(win->src.swapchain_image_views); - free(win->src.swapchain_images); + RGFW_FREE(win->src.swapchain_image_views); + RGFW_FREE(win->src.swapchain_images); #endif #ifdef RGFW_EGL @@ -4995,7 +5248,7 @@ static HMODULE wglinstance = NULL; if (textLen == 0) return (char*) ""; - text = (char*) malloc((textLen * sizeof(char)) + 1); + text = (char*) RGFW_MALLOC((textLen * sizeof(char)) + 1); wcstombs(text, wstr, (textLen) +1); @@ -5149,11 +5402,11 @@ static HMODULE wglinstance = NULL; NSWindow* window = objc_msgSend_id(sender, sel_registerName("draggingDestinationWindow")); u32 i; - bool found = false; + bool found = 0; for (i = 0; i < RGFW_windows_size; i++) if (RGFW_windows[i]->src.window == window) { - found = true; + found = 1; break; } @@ -5173,7 +5426,7 @@ static HMODULE wglinstance = NULL; strcpy(RGFW_windows[i]->event.droppedFiles[y], droppedFiles[y]); RGFW_windows[i]->event.type = RGFW_dnd; - RGFW_windows[i]->src.dndPassed = false; + RGFW_windows[i]->src.dndPassed = 0; NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(sender, sel_registerName("draggingLocation")); @@ -5220,7 +5473,7 @@ static HMODULE wglinstance = NULL; if (RGFW_windows[i] && NSWindow_delegate(RGFW_windows[i]) == self) { RGFW_windows[i]->r.w = frameSize.width; RGFW_windows[i]->r.h = frameSize.height; - RGFW_windows[i]->event.type = RGFW_windowAttribsChange; + RGFW_windows[i]->event.type = RGFW_windowResized; return frameSize; } @@ -5239,7 +5492,7 @@ static HMODULE wglinstance = NULL; RGFW_windows[i]->r.x = (i32) frame.origin.x; RGFW_windows[i]->r.y = (i32) frame.origin.y; - RGFW_windows[i]->event.type = RGFW_windowAttribsChange; + RGFW_windows[i]->event.type = RGFW_windowMoved; return; } } @@ -5448,6 +5701,12 @@ static HMODULE wglinstance = NULL; return RGFW_VECTOR((u32) point.x, (u32) point.y); /* the point is loaded during event checks */ } + RGFW_vector RGFW_window_getMousePoint(RGFW_window* win) { + NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(win->src.window, sel_registerName("mouseLocationOutsideOfEventStream")); + + return RGFW_VECTOR((u32) p.x, (u32) (p.y)); + } + u32 RGFW_keysPressed[10]; /*10 keys at a time*/ typedef NS_ENUM(u32, NSEventType) { /* various types of events */ NSEventTypeLeftMouseDown = 1, @@ -5557,7 +5816,7 @@ static HMODULE wglinstance = NULL; if (eventFunc == NULL) eventFunc = sel_registerName("nextEventMatchingMask:untilDate:inMode:dequeue:"); - if (win->event.type == RGFW_windowAttribsChange && win->event.keyCode != 120) { + if ((win->event.type == RGFW_windowMoved || win->event.type == RGFW_windowResized) && win->event.keyCode != 120) { win->event.keyCode = 120; return &win->event; } @@ -5585,91 +5844,114 @@ static HMODULE wglinstance = NULL; win->event.droppedFilesCount = 0; win->event.type = 0; - win->event.inFocus = (bool) objc_msgSend_bool(win->src.window, sel_registerName("isKeyWindow")); + bool isKey = (bool) objc_msgSend_bool(win->src.window, sel_registerName("isKeyWindow")); + + if (win->event.inFocus != isKey) { + win->event.inFocus = isKey; + + if (win->event.inFocus) + win->event.type = RGFW_focusIn; + else + win->event.type = RGFW_focusOut; + + return &win->event; + } switch (objc_msgSend_uint(e, sel_registerName("type"))) { - case NSEventTypeKeyDown: - win->event.keyCode = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); - RGFW_keyBoard_prev[win->event.keyCode] = RGFW_keyBoard[win->event.keyCode]; + case NSEventTypeKeyDown: { + u32 key = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); + win->event.keyCode = RGFW_apiKeyCodeToRGFW(key); + RGFW_keyboard_prev[win->event.keyCode] = RGFW_keyboard[win->event.keyCode]; win->event.type = RGFW_keyPressed; win->event.keyName = (char*)(const char*) NSString_to_char(objc_msgSend_id(e, sel_registerName("characters"))); - RGFW_keyBoard[win->event.keyCode] = 1; + RGFW_keyboard[win->event.keyCode] = 1; break; + } - case NSEventTypeKeyUp: - win->event.keyCode = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); + case NSEventTypeKeyUp: { + u32 key = (u16) objc_msgSend_uint(e, sel_registerName("keyCode")); + win->event.keyCode = RGFW_apiKeyCodeToRGFW(key);; - RGFW_keyBoard_prev[win->event.keyCode] = RGFW_keyBoard[win->event.keyCode]; + RGFW_keyboard_prev[win->event.keyCode] = RGFW_keyboard[win->event.keyCode]; win->event.type = RGFW_keyReleased; win->event.keyName = (char*)(const char*) NSString_to_char(objc_msgSend_id(e, sel_registerName("characters"))); - RGFW_keyBoard[win->event.keyCode] = 0; + RGFW_keyboard[win->event.keyCode] = 0; break; + } case NSEventTypeFlagsChanged: { u32 flags = objc_msgSend_uint(e, sel_registerName("modifierFlags")); - memcpy(RGFW_keyBoard_prev + 55, RGFW_keyBoard + 55, 5); + memcpy(RGFW_keyboard_prev + RGFW_CapsLock, RGFW_keyboard + RGFW_CapsLock, 9); - if ((flags & NSEventModifierFlagCapsLock) && !RGFW_wasPressedI(win, 57)) { - RGFW_keyBoard[57] = 1; + if ((flags & NSEventModifierFlagCapsLock) && !RGFW_wasPressedI(win, RGFW_CapsLock)) { + RGFW_keyboard[RGFW_CapsLock] = 1; win->event.type = RGFW_keyPressed; - win->event.keyCode = 57; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(57); break; - } if (!(flags & NSEventModifierFlagCapsLock) && RGFW_wasPressedI(win, 57)) { - RGFW_keyBoard[57] = 0; + } if (!(flags & NSEventModifierFlagCapsLock) && RGFW_wasPressedI(win, RGFW_CapsLock)) { + RGFW_keyboard[RGFW_CapsLock] = 0; win->event.type = RGFW_keyReleased; - win->event.keyCode = 57; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(57); break; } - if ((flags & NSEventModifierFlagOption) && !RGFW_wasPressedI(win, 58)) { - RGFW_keyBoard[58] = 1; + if ((flags & NSEventModifierFlagOption) && !RGFW_wasPressedI(win, RGFW_AltL)) { + RGFW_keyboard[RGFW_AltL] = 1; + RGFW_keyboard[RGFW_AltR] = 1; win->event.type = RGFW_keyPressed; - win->event.keyCode = 58; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(58); break; - } if (!(flags & NSEventModifierFlagOption) && RGFW_wasPressedI(win, 58)) { - RGFW_keyBoard[58] = 0; + } if (!(flags & NSEventModifierFlagOption) && RGFW_wasPressedI(win, RGFW_AltL)) { + RGFW_keyboard[RGFW_AltL] = 0; + RGFW_keyboard[RGFW_AltR] = 0; win->event.type = RGFW_keyReleased; - win->event.keyCode = 58; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(58); break; } - if ((flags & NSEventModifierFlagControl) && !RGFW_wasPressedI(win, 59)) { - RGFW_keyBoard[59] = 1; + if ((flags & NSEventModifierFlagControl) && !RGFW_wasPressedI(win, RGFW_ControlL)) { + RGFW_keyboard[RGFW_ControlL] = 1; + RGFW_keyboard[RGFW_ControlR] = 1; win->event.type = RGFW_keyPressed; - win->event.keyCode = 59; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(59); break; - } if (!(flags & NSEventModifierFlagControl) && RGFW_wasPressedI(win, 59)) { - RGFW_keyBoard[59] = 0; + } if (!(flags & NSEventModifierFlagControl) && RGFW_wasPressedI(win, RGFW_ControlL)) { + RGFW_keyboard[RGFW_ControlL] = 0; + RGFW_keyboard[RGFW_ControlR] = 0; win->event.type = RGFW_keyReleased; win->event.keyCode = 59; break; } - if ((flags & NSEventModifierFlagCommand) && !RGFW_wasPressedI(win, 55)) { - RGFW_keyBoard[55] = 1; + if ((flags & NSEventModifierFlagCommand) && !RGFW_wasPressedI(win, RGFW_SuperL)) { + RGFW_keyboard[RGFW_SuperL] = 1; + RGFW_keyboard[RGFW_SuperR] = 1; win->event.type = RGFW_keyPressed; - win->event.keyCode = 55; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(55); break; - } if (!(flags & NSEventModifierFlagCommand) && RGFW_wasPressedI(win, 55)) { - RGFW_keyBoard[55] = 0; + } if (!(flags & NSEventModifierFlagCommand) && RGFW_wasPressedI(win, RGFW_SuperL)) { + RGFW_keyboard[RGFW_SuperL] = 0; + RGFW_keyboard[RGFW_SuperR] = 0; win->event.type = RGFW_keyReleased; - win->event.keyCode = 55; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(55); break; } - if ((flags & NSEventModifierFlagShift) && !RGFW_wasPressedI(win, 56)) { - RGFW_keyBoard[56] = 1; + if ((flags & NSEventModifierFlagShift) && !RGFW_wasPressedI(win, RGFW_ShiftL)) { + RGFW_keyboard[RGFW_ShiftL] = 1; + RGFW_keyboard[RGFW_ShiftR] = 1; win->event.type = RGFW_keyPressed; - win->event.keyCode = 56; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(56); break; - } if (!(flags & NSEventModifierFlagShift) && RGFW_wasPressedI(win, 56)) { - RGFW_keyBoard[56] = 0; + } if (!(flags & NSEventModifierFlagShift) && RGFW_wasPressedI(win, RGFW_ShiftL)) { + RGFW_keyboard[RGFW_ShiftL] = 0; + RGFW_keyboard[RGFW_ShiftR] = 0; win->event.type = RGFW_keyReleased; - win->event.keyCode = 56; + win->event.keyCode = RGFW_apiKeyCodeToRGFW(56); break; } @@ -5683,48 +5965,55 @@ static HMODULE wglinstance = NULL; NSPoint p = ((NSPoint(*)(id, SEL)) objc_msgSend)(e, sel_registerName("locationInWindow")); win->event.point = RGFW_VECTOR((u32) p.x, (u32) (win->r.h - p.y)); - - if (win->src.winArgs & RGFW_HOLD_MOUSE) { - RGFW_vector mouse = RGFW_getGlobalMousePoint(); - if ((mouse.x != win->r.x + (win->r.w / 2) || mouse.y != win->r.y + (win->r.h / 2))) { - RGFW_window_moveMouse(win, RGFW_VECTOR(win->r.x + (win->r.w / 2), win->r.y + (win->r.h / 2))); - } - } break; case NSEventTypeLeftMouseDown: win->event.button = RGFW_mouseLeft; win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; break; case NSEventTypeOtherMouseDown: win->event.button = RGFW_mouseMiddle; win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; break; case NSEventTypeRightMouseDown: win->event.button = RGFW_mouseRight; win->event.type = RGFW_mouseButtonPressed; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; break; case NSEventTypeLeftMouseUp: win->event.button = RGFW_mouseLeft; win->event.type = RGFW_mouseButtonReleased; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; break; case NSEventTypeOtherMouseUp: win->event.button = RGFW_mouseMiddle; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; win->event.type = RGFW_mouseButtonReleased; break; case NSEventTypeScrollWheel: { double deltaY = ((CGFloat(*)(id, SEL))abi_objc_msgSend_fpret)(e, sel_registerName("deltaY")); - if (deltaY > 0) + if (deltaY > 0) { win->event.button = RGFW_mouseScrollUp; - - else if (deltaY < 0) + } + else if (deltaY < 0) { win->event.button = RGFW_mouseScrollDown; + } + + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 1; win->event.scroll = deltaY; @@ -5733,6 +6022,8 @@ static HMODULE wglinstance = NULL; } case NSEventTypeRightMouseUp: win->event.button = RGFW_mouseRight; + RGFW_mouseButtons_prev[win->event.button] = RGFW_mouseButtons[win->event.button]; + RGFW_mouseButtons[win->event.button] = 0; win->event.type = RGFW_mouseButtonReleased; break; @@ -5846,7 +6137,7 @@ static HMODULE wglinstance = NULL; } void RGFW_window_setMouseDefault(RGFW_window* win) { - RGFW_window_setMouseStandard(win, NSCursor_arrowStr("arrowCursor")); + RGFW_window_setMouseStandard(win, RGFW_MOUSE_ARROW); } void RGFW_window_showMouse(RGFW_window* win, i8 show) { @@ -5860,7 +6151,16 @@ static HMODULE wglinstance = NULL; } } - void RGFW_window_setMouseStandard(RGFW_window* win, void* mouse) { + void RGFW_window_setMouseStandard(RGFW_window* win, u8 stdMouses) { + if (stdMouses > ((sizeof(RGFW_mouseIconSrc)) / (sizeof(char*)))) + return; + + char* mouseStr = RGFW_mouseIconSrc[stdMouses]; + void* mouse = NSCursor_arrowStr(mouseStr); + + if (mouse == NULL) + return; + RGFW_UNUSED(win); CGDisplayShowCursor(kCGDirectMainDisplay); objc_msgSend_void(mouse, sel_registerName("set")); @@ -5952,30 +6252,6 @@ static HMODULE wglinstance = NULL; return RGFW_NSCreateMonitor(win->src.display); } - u8 RGFW_isPressedI(RGFW_window* win, u32 key) { - RGFW_UNUSED(win); - if (key >= 128) { -#ifdef RGFW_PRINT_ERRORS - fprintf(stderr, "RGFW_isPressedI : invalid keycode\n"); -#endif - RGFW_error = 1; - } - - return RGFW_keyBoard[key]; - } - - u8 RGFW_wasPressedI(RGFW_window* win, u32 key) { - RGFW_UNUSED(win); - if (key >= 128) { -#ifdef RGFW_PRINT_ERRORS - fprintf(stderr, "RGFW_wasPressedI : invalid keycode\n"); -#endif - RGFW_error = 1; - } - - return RGFW_keyBoard_prev[key]; - } - #ifdef __cplusplus #define APPKIT_EXTERN extern "C" #else @@ -5983,9 +6259,14 @@ static HMODULE wglinstance = NULL; #endif char* RGFW_readClipboard(size_t* size) { - char* str = strdup((char*) NSPasteboard_stringForType(NSPasteboard_generalPasteboard(), NSPasteboardTypeString)); + char* clip = (char*)NSPasteboard_stringForType(NSPasteboard_generalPasteboard(), NSPasteboardTypeString); + size_t clip_len = strlen(clip); + + char* str = (char*)RGFW_MALLOC(sizeof(char) * clip_len); + strcpy(str, clip); + if (size != NULL) - *size = strlen(str); + *size = clip_len; return str; } @@ -6028,8 +6309,8 @@ static HMODULE wglinstance = NULL; vkDestroySwapchainKHR(RGFW_vulkan_info.device, win->src.swapchain, NULL); vkDestroySurfaceKHR(RGFW_vulkan_info.instance, win->src.rSurf, NULL); - free(win->src.swapchain_image_views); - free(win->src.swapchain_images); + RGFW_FREE(win->src.swapchain_image_views); + RGFW_FREE(win->src.swapchain_images); #endif release(win->src.view); @@ -6067,7 +6348,7 @@ static HMODULE wglinstance = NULL; CVDisplayLinkStop(win->src.displayLink); CVDisplayLinkRelease(win->src.displayLink); - free(win); + RGFW_FREE(win); } #endif @@ -6298,7 +6579,7 @@ static HMODULE wglinstance = NULL; assert(win != NULL); /* || RGFW_isPressedI(win, RGFW_Escape) */ - return (win->event.type == RGFW_quit || RGFW_isPressedI(win, RGFW_OS_BASED_VALUE(0xff1b, 0x1B, 53))); + return (win->event.type == RGFW_quit || RGFW_isPressedI(win, RGFW_Escape)); } void RGFW_window_setShouldClose(RGFW_window* win) { win->event.type = RGFW_quit; } @@ -6307,13 +6588,20 @@ static HMODULE wglinstance = NULL; RGFW_window_move(win, RGFW_VECTOR(m.rect.x + win->r.x, m.rect.y + win->r.y)); } - void RGFW_window_mouseHold(RGFW_window* win) { + void RGFW_window_mouseHold(RGFW_window* win, RGFW_area area) { + if (!(win->src.winArgs & RGFW_HOLD_MOUSE)) { + #ifdef RGFW_WINDOWS + RECT rect = {win->r.x, win->r.y, win->r.x + win->r.w, win->r.y + win->r.h}; + ClipCursor(&rect); + #endif + } + win->src.winArgs |= RGFW_HOLD_MOUSE; - #ifdef RGFW_WINDOWS - RECT rect = {win->r.x, win->r.y, win->r.x + win->r.w, win->r.y + win->r.h}; - ClipCursor(&rect); - #endif + if (!area.w && !area.h) + area = RGFW_AREA(win->r.w / 2, win->r.h / 2); + + RGFW_window_moveMouse(win, RGFW_VECTOR(win->r.x + (area.w), win->r.y + (area.h))); } void RGFW_window_mouseUnhold(RGFW_window* win) { @@ -6418,161 +6706,6 @@ static HMODULE wglinstance = NULL; #endif /*RGFW_IMPLEMENTATION*/ -#define RGFW_Escape RGFW_OS_BASED_VALUE(0xff1b, 0x1B, 53) -#define RGFW_F1 RGFW_OS_BASED_VALUE(0xffbe, 0x70, 127) -#define RGFW_F2 RGFW_OS_BASED_VALUE(0xffbf, 0x71, 121) -#define RGFW_F3 RGFW_OS_BASED_VALUE(0xffc0, 0x72, 100) -#define RGFW_F4 RGFW_OS_BASED_VALUE(0xffc1, 0x73, 119) -#define RGFW_F5 RGFW_OS_BASED_VALUE(0xffc2, 0x74, 97) -#define RGFW_F6 RGFW_OS_BASED_VALUE(0xffc3, 0x75, 98) -#define RGFW_F7 RGFW_OS_BASED_VALUE(0xffc4, 0x76, 99) -#define RGFW_F8 RGFW_OS_BASED_VALUE(0xffc5, 0x77, 101) -#define RGFW_F9 RGFW_OS_BASED_VALUE(0xffc6, 0x78, 102) -#define RGFW_F10 RGFW_OS_BASED_VALUE(0xffc7, 0x79, 110) -#define RGFW_F11 RGFW_OS_BASED_VALUE(0xffc8, 0x7A, 104) -#define RGFW_F12 RGFW_OS_BASED_VALUE(0xffc9, 0x7B, 112) -#define RGFW_F13 RGFW_OS_BASED_VALUE(0xffca, 0x7C, 106) -#define RGFW_F14 RGFW_OS_BASED_VALUE(0xffcb, 0x7D, 108) -#define RGFW_F15 RGFW_OS_BASED_VALUE(0xffcc, 0x7E, 114) - -#define RGFW_Backtick RGFW_OS_BASED_VALUE(96 , 192, 50) - -#define RGFW_0 RGFW_OS_BASED_VALUE(0x0030, 0x30, 29) -#define RGFW_1 RGFW_OS_BASED_VALUE(0x0031, 0x31, 18) -#define RGFW_2 RGFW_OS_BASED_VALUE(0x0032, 0x32, 19) -#define RGFW_3 RGFW_OS_BASED_VALUE(0x0033, 0x33, 20) -#define RGFW_4 RGFW_OS_BASED_VALUE(0x0034, 0x34, 21) -#define RGFW_5 RGFW_OS_BASED_VALUE(0x0035, 0x35, 23) -#define RGFW_6 RGFW_OS_BASED_VALUE(0x0036, 0x36, 22) -#define RGFW_7 RGFW_OS_BASED_VALUE(0x0037, 0x37, 26) -#define RGFW_8 RGFW_OS_BASED_VALUE(0x0038, 0x38, 28) -#define RGFW_9 RGFW_OS_BASED_VALUE(0x0039, 0x39, 25) - -#define RGFW_Minus RGFW_OS_BASED_VALUE(0x002d, 189, 27) -#define RGFW_Equals RGFW_OS_BASED_VALUE(0x003d, 187, 24) -#define RGFW_BackSpace RGFW_OS_BASED_VALUE(0xff08, 8, 51) -#define RGFW_Tab RGFW_OS_BASED_VALUE(0xff89, 0x09, 48) -#define RGFW_CapsLock RGFW_OS_BASED_VALUE(0xffe5, 20, 57) -#define RGFW_ShiftL RGFW_OS_BASED_VALUE(0xffe1, 0xA0, 56) -#define RGFW_ControlL RGFW_OS_BASED_VALUE(0xffe3, 0x11, 59) -#define RGFW_AltL RGFW_OS_BASED_VALUE(0xffe9, 164, 58) -#define RGFW_SuperL RGFW_OS_BASED_VALUE(0xffeb, 0x5B, 55) -#define RGFW_ShiftR RGFW_OS_BASED_VALUE(0xffe2, 0x5C, 56) -#define RGFW_ControlR RGFW_OS_BASED_VALUE(0xffe4, 0x11, 59) -#define RGFW_AltR RGFW_OS_BASED_VALUE(0xffea, 165, 58) -#define RGFW_SuperR RGFW_OS_BASED_VALUE(0xffec, 0xA4, 55) -#define RGFW_Space RGFW_OS_BASED_VALUE(0x0020, 0x20, 49) - -#define RGFW_A RGFW_OS_BASED_VALUE(0x0041, 0x41, 0) -#define RGFW_B RGFW_OS_BASED_VALUE(0x0042, 0x42, 11) -#define RGFW_C RGFW_OS_BASED_VALUE(0x0043, 0x43, 8) -#define RGFW_D RGFW_OS_BASED_VALUE(0x0044, 0x44, 2) -#define RGFW_E RGFW_OS_BASED_VALUE(0x0045, 0x45, 14) -#define RGFW_F RGFW_OS_BASED_VALUE(0x0046, 0x46, 3) -#define RGFW_G RGFW_OS_BASED_VALUE(0x0047, 0x47, 5) -#define RGFW_H RGFW_OS_BASED_VALUE(0x0048, 0x48, 4) -#define RGFW_I RGFW_OS_BASED_VALUE(0x0049, 0x49, 34) -#define RGFW_J RGFW_OS_BASED_VALUE(0x004a, 0x4A, 38) -#define RGFW_K RGFW_OS_BASED_VALUE(0x004b, 0x4B, 40) -#define RGFW_L RGFW_OS_BASED_VALUE(0x004c, 0x4C, 37) -#define RGFW_M RGFW_OS_BASED_VALUE(0x004d, 0x4D, 46) -#define RGFW_N RGFW_OS_BASED_VALUE(0x004e, 0x4E, 45) -#define RGFW_O RGFW_OS_BASED_VALUE(0x004f, 0x4F, 31) -#define RGFW_P RGFW_OS_BASED_VALUE(0x0050, 0x50, 35) -#define RGFW_Q RGFW_OS_BASED_VALUE(0x0051, 0x51, 12) -#define RGFW_R RGFW_OS_BASED_VALUE(0x0052, 0x52, 15) -#define RGFW_S RGFW_OS_BASED_VALUE(0x0053, 0x53, 1) -#define RGFW_T RGFW_OS_BASED_VALUE(0x0054, 0x54, 17) -#define RGFW_U RGFW_OS_BASED_VALUE(0x0055, 0x55, 32) -#define RGFW_V RGFW_OS_BASED_VALUE(0x0056, 0x56, 9) -#define RGFW_W RGFW_OS_BASED_VALUE(0x0057, 0x57, 13) -#define RGFW_X RGFW_OS_BASED_VALUE(0x0058, 0x58, 7) -#define RGFW_Y RGFW_OS_BASED_VALUE(0x0059, 0x59, 16) -#define RGFW_Z RGFW_OS_BASED_VALUE(0x005a, 0x5A, 6) - -#define RGFW_a RGFW_OS_BASED_VALUE(0x0061, 0x41, 0) -#define RGFW_b RGFW_OS_BASED_VALUE(0x0062, 0x42, 11) -#define RGFW_c RGFW_OS_BASED_VALUE(0x0063, 0x43, 8) -#define RGFW_d RGFW_OS_BASED_VALUE(0x0064, 0x44, 2) -#define RGFW_e RGFW_OS_BASED_VALUE(0x0065, 0x45, 14) -#define RGFW_f RGFW_OS_BASED_VALUE(0x0066, 0x46, 3) -#define RGFW_g RGFW_OS_BASED_VALUE(0x0067, 0x47, 5) -#define RGFW_h RGFW_OS_BASED_VALUE(0x0068, 0x48, 4) -#define RGFW_i RGFW_OS_BASED_VALUE(0x0069, 0x49, 34) -#define RGFW_j RGFW_OS_BASED_VALUE(0x006a, 0x4a, 38) -#define RGFW_k RGFW_OS_BASED_VALUE(0x006b, 0x4b, 40) -#define RGFW_l RGFW_OS_BASED_VALUE(0x006c, 0x4c, 37) -#define RGFW_m RGFW_OS_BASED_VALUE(0x006d, 0x4d, 46) -#define RGFW_n RGFW_OS_BASED_VALUE(0x006e, 0x4e, 45) -#define RGFW_o RGFW_OS_BASED_VALUE(0x006f, 0x4f, 31) -#define RGFW_p RGFW_OS_BASED_VALUE(0x0070, 0x50, 35) -#define RGFW_q RGFW_OS_BASED_VALUE(0x0071, 0x51, 12) -#define RGFW_r RGFW_OS_BASED_VALUE(0x0072, 0x52, 15) -#define RGFW_s RGFW_OS_BASED_VALUE(0x0073, 0x53, 1) -#define RGFW_t RGFW_OS_BASED_VALUE(0x0074, 0x54, 17) -#define RGFW_u RGFW_OS_BASED_VALUE(0x0075, 0x55, 32) -#define RGFW_v RGFW_OS_BASED_VALUE(0x0076, 0x56, 9) -#define RGFW_w RGFW_OS_BASED_VALUE(0x0077, 0x57, 13) -#define RGFW_x RGFW_OS_BASED_VALUE(0x0078, 0x58, 7) -#define RGFW_y RGFW_OS_BASED_VALUE(0x0079, 0x59, 16) -#define RGFW_z RGFW_OS_BASED_VALUE(0x007a, 0x5A, 6) - -#define RGFW_Period RGFW_OS_BASED_VALUE(0x002e, 190, 47) -#define RGFW_Comma RGFW_OS_BASED_VALUE(0x002c, 188, 43) -#define RGFW_Slash RGFW_OS_BASED_VALUE(0x002f, 191, 44) -#define RGFW_Bracket RGFW_OS_BASED_VALUE(0x005b, 219, 33) -#define RGFW_CloseBracket RGFW_OS_BASED_VALUE(0x005d, 221, 30) -#define RGFW_Semicolon RGFW_OS_BASED_VALUE(0x003b, 186, 41) -#define RGFW_Return RGFW_OS_BASED_VALUE(0xff0d, 0x0D, 36) -#define RGFW_Quote RGFW_OS_BASED_VALUE(0x0022, 222, 39) -#define RGFW_BackSlash RGFW_OS_BASED_VALUE(0x005c, 322, 42) - -#define RGFW_Up RGFW_OS_BASED_VALUE(0xff52, 0x26, 126) -#define RGFW_Down RGFW_OS_BASED_VALUE(0xff54, 0x28, 125) -#define RGFW_Left RGFW_OS_BASED_VALUE(0xff51, 0x25, 123) -#define RGFW_Right RGFW_OS_BASED_VALUE(0xff53, 0x27, 124) - -#define RGFW_Delete RGFW_OS_BASED_VALUE(0xffff, 0x2E, 118) -#define RGFW_Insert RGFW_OS_BASED_VALUE(0xff63, 0x2D, 115) -#define RGFW_End RGFW_OS_BASED_VALUE(0xff57, 0x23, 120) -#define RGFW_Home RGFW_OS_BASED_VALUE(0xff50, 0x24, 116) -#define RGFW_PageUp RGFW_OS_BASED_VALUE(0xff55, 336, 117) -#define RGFW_PageDown RGFW_OS_BASED_VALUE(0xff56, 325, 122) - -#define RGFW_Numlock RGFW_OS_BASED_VALUE(0xff7f, 0x90, 72) -#define RGFW_KP_Slash RGFW_OS_BASED_VALUE(0xffaf, 0x6F, 82) -#define RGFW_Multiply RGFW_OS_BASED_VALUE(0xffaa, 0x6A, 76) -#define RGFW_KP_Minus RGFW_OS_BASED_VALUE(0xffad, 0x6D, 67) -#define RGFW_KP_1 RGFW_OS_BASED_VALUE(0xffb1, 0x61, 84) -#define RGFW_KP_2 RGFW_OS_BASED_VALUE(0xffb2, 0x62, 85) -#define RGFW_KP_3 RGFW_OS_BASED_VALUE(0xffb3, 0x63, 86) -#define RGFW_KP_4 RGFW_OS_BASED_VALUE(0xffb4, 0x64, 87) -#define RGFW_KP_5 RGFW_OS_BASED_VALUE(0xffb5, 0x65, 88) -#define RGFW_KP_6 RGFW_OS_BASED_VALUE(0xffb6, 0x66, 89) -#define RGFW_KP_7 RGFW_OS_BASED_VALUE(0xffb7, 0x67, 90) -#define RGFW_KP_8 RGFW_OS_BASED_VALUE(0xffb8, 0x68, 92) -#define RGFW_KP_9 RGFW_OS_BASED_VALUE(0xffb9, 0x619, 93) -#define RGFW_KP_0 RGFW_OS_BASED_VALUE(0xffb0, 0x60, 83) -#define RGFW_KP_Period RGFW_OS_BASED_VALUE(0xffae, 0x6E, 65) -#define RGFW_KP_Return RGFW_OS_BASED_VALUE(0xff8d, 0x92, 77) - -#ifdef __APPLE__ - void* NSCursor_arrowStr(char* str); - void NSCursor_performSelector(void* cursor, void* selector); -#endif - - /* mouse icons */ -#define RGFW_MOUSE_ARROW RGFW_OS_BASED_VALUE(68, 32512, NSCursor_arrowStr("arrowCursor")) -#define RGFW_MOUSE_IBEAM RGFW_OS_BASED_VALUE(152, 32513, NSCursor_arrowStr("IBeamCursor")) -#define RGFW_MOUSE_CROSSHAIR RGFW_OS_BASED_VALUE(34, 32515, NSCursor_arrowStr("crosshairCursor")) -#define RGFW_MOUSE_POINTING_HAND RGFW_OS_BASED_VALUE(60, 32649, NSCursor_arrowStr("pointingHandCursor")) -#define RGFW_MOUSE_RESIZE_EW RGFW_OS_BASED_VALUE(108, 32644, NSCursor_arrowStr("resizeLeftRightCursor")) -#define RGFW_MOUSE_RESIZE_NS RGFW_OS_BASED_VALUE(116, 32645, NSCursor_arrowStr("resizeUpDownCursor")) -#define RGFW_MOUSE_RESIZE_ALL RGFW_OS_BASED_VALUE(52, 32646, NSCursor_arrowStr("closedHandCursor")) -#define RGFW_MOUSE_RESIZE_NWSE RGFW_OS_BASED_VALUE(12, 32642, NSCursor_performSelector(selector("_windowResizeNorthWestSouthEastCursor"))) -#define RGFW_MOUSE_RESIZE_NESW RGFW_OS_BASED_VALUE(14, 32643, NSCursor_performSelector(selector("_windowResizeNorthEastSouthWestCursor"))) -#define RGFW_MOUSE_NOT_ALLOWED RGFW_OS_BASED_VALUE(0, 32648, NSCursor_arrowStr("operationNotAllowedCursor")) - #ifdef __cplusplus } #endif diff --git a/src/platforms/rcore_desktop_rgfw.c b/src/platforms/rcore_desktop_rgfw.c index f4e3174971e5..e85f7a0ebd01 100644 --- a/src/platforms/rcore_desktop_rgfw.c +++ b/src/platforms/rcore_desktop_rgfw.c @@ -84,6 +84,8 @@ __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int CodePage, #include "../external/RGFW.h" + + #if defined(__WIN32) || defined(__WIN64) #undef DrawText #undef ShowCursor @@ -114,6 +116,110 @@ extern CoreData CORE; // Global CORE state context static PlatformData platform = { NULL }; // Platform specific +static const unsigned short RGFWKeyToRayKey[] = { + [RGFW_KEY_NULL] = KEY_NULL, + [RGFW_Quote] = KEY_APOSTROPHE, + [RGFW_Comma] = KEY_COMMA, + [RGFW_Minus] = KEY_MINUS, + [RGFW_Period] = KEY_PERIOD, + [RGFW_Slash] = KEY_SLASH, + [RGFW_Escape] = KEY_ESCAPE, + [RGFW_F1] = KEY_F1, + [RGFW_F2] = KEY_F2, + [RGFW_F3] = KEY_F3, + [RGFW_F4] = KEY_F4, + [RGFW_F5] = KEY_F5, + [RGFW_F6] = KEY_F6, + [RGFW_F7] = KEY_F7, + [RGFW_F8] = KEY_F8, + [RGFW_F9] = KEY_F9, + [RGFW_F10] = KEY_F10, + [RGFW_F11] = KEY_F11, + [RGFW_F12] = KEY_F12, + [RGFW_Backtick] = KEY_GRAVE, + [RGFW_0] = KEY_ZERO, + [RGFW_1] = KEY_ONE, + [RGFW_2] = KEY_TWO, + [RGFW_3] = KEY_THREE, + [RGFW_4] = KEY_FOUR, + [RGFW_5] = KEY_FIVE, + [RGFW_6] = KEY_SIX, + [RGFW_7] = KEY_SEVEN, + [RGFW_8] = KEY_EIGHT, + [RGFW_9] = KEY_NINE, + [RGFW_Equals] = KEY_EQUAL, + [RGFW_BackSpace] = KEY_BACKSPACE, + [RGFW_Tab] = KEY_TAB, + [RGFW_CapsLock] = KEY_CAPS_LOCK, + [RGFW_ShiftL] = KEY_LEFT_SHIFT, + [RGFW_ControlL] = KEY_LEFT_CONTROL, + [RGFW_AltL] = KEY_LEFT_ALT, + [RGFW_SuperL] = KEY_LEFT_SUPER, + #ifndef RGFW_MACOS + [RGFW_ShiftR] = KEY_RIGHT_SHIFT, + + [RGFW_AltR] = KEY_RIGHT_ALT, + #endif + [RGFW_Space] = KEY_SPACE, + + [RGFW_a] = KEY_A, + [RGFW_b] = KEY_B, + [RGFW_c] = KEY_C, + [RGFW_d] = KEY_D, + [RGFW_e] = KEY_E, + [RGFW_f] = KEY_F, + [RGFW_g] = KEY_G, + [RGFW_h] = KEY_H, + [RGFW_i] = KEY_I, + [RGFW_j] = KEY_J, + [RGFW_k] = KEY_K, + [RGFW_l] = KEY_L, + [RGFW_m] = KEY_M, + [RGFW_n] = KEY_N, + [RGFW_o] = KEY_O, + [RGFW_p] = KEY_P, + [RGFW_q] = KEY_Q, + [RGFW_r] = KEY_R, + [RGFW_s] = KEY_S, + [RGFW_t] = KEY_T, + [RGFW_u] = KEY_U, + [RGFW_v] = KEY_V, + [RGFW_w] = KEY_W, + [RGFW_x] KEY_X, + [RGFW_y] = KEY_Y, + [RGFW_z] = KEY_Z, + [RGFW_Bracket] = KEY_LEFT_BRACKET, + [RGFW_BackSlash] = KEY_BACKSLASH, + [RGFW_CloseBracket] = KEY_RIGHT_BRACKET, + [RGFW_Semicolon] = KEY_SEMICOLON, + [RGFW_Insert] = KEY_INSERT, + [RGFW_Home] = KEY_HOME, + [RGFW_PageUp] = KEY_PAGE_UP, + [RGFW_Delete] = KEY_DELETE, + [RGFW_End] = KEY_END, + [RGFW_PageDown] = KEY_PAGE_DOWN, + [RGFW_Right] = KEY_RIGHT, + [RGFW_Left] = KEY_LEFT, + [RGFW_Down] = KEY_DOWN, + [RGFW_Up] = KEY_UP, + [RGFW_Numlock] = KEY_NUM_LOCK, + [RGFW_KP_Slash] = KEY_KP_DIVIDE, + [RGFW_Multiply] = KEY_KP_MULTIPLY, + [RGFW_KP_Minus] = KEY_KP_SUBTRACT, + [RGFW_KP_Return] = KEY_KP_ENTER, + [RGFW_KP_1] = KEY_KP_1, + [RGFW_KP_2] = KEY_KP_2, + [RGFW_KP_3] = KEY_KP_3, + [RGFW_KP_4] = KEY_KP_4, + [RGFW_KP_5] = KEY_KP_5, + [RGFW_KP_6] = KEY_KP_6, + [RGFW_KP_7] = KEY_KP_7, + [RGFW_KP_8] = KEY_KP_8, + [RGFW_KP_9] = KEY_KP_9, + [RGFW_KP_0] = KEY_KP_0, + [RGFW_KP_Period] = KEY_KP_DECIMAL +}; + //---------------------------------------------------------------------------------- // Module Internal Functions Declaration //---------------------------------------------------------------------------------- @@ -442,7 +548,7 @@ void *GetWindowHandle(void) int GetMonitorCount(void) { RGFW_monitor* mons = RGFW_getMonitors(); - u32 i; + size_t i; for (i = 0; i < 6; i++) { if (!mons[i].rect.x && !mons[i].rect.y && !mons[i].rect.w && mons[i].rect.h) return i; @@ -457,7 +563,7 @@ int GetCurrentMonitor(void) RGFW_monitor* mons = RGFW_getMonitors(); RGFW_monitor mon = RGFW_window_getMonitor(platform.window); - u32 i; + size_t i; for (i = 0; i < 6; i++) { if (mons[i].rect.x == mon.rect.x && mons[i].rect.y == mon.rect.y) @@ -564,9 +670,12 @@ void HideCursor(void) CORE.Input.Mouse.cursorHidden = true; } +bool RGFW_disableCursor = false; + // Enables cursor (unlock cursor) void EnableCursor(void) { + RGFW_disableCursor = false; RGFW_window_mouseUnhold(platform.window); // Set cursor position in the middle @@ -578,7 +687,7 @@ void EnableCursor(void) // Disables cursor (lock cursor) void DisableCursor(void) { - RGFW_window_mouseHold(platform.window); + RGFW_disableCursor = true; // Set cursor position in the middle SetMousePosition(CORE.Window.screen.width/2, CORE.Window.screen.height/2); @@ -642,34 +751,7 @@ void SetMousePosition(int x, int y) // Set mouse cursor void SetMouseCursor(int cursor) { - switch (cursor) { - case MOUSE_CURSOR_DEFAULT: - return RGFW_window_setMouseDefault(platform.window); - case MOUSE_CURSOR_ARROW: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_ARROW); - case MOUSE_CURSOR_IBEAM: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_IBEAM); - case MOUSE_CURSOR_CROSSHAIR: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_CROSSHAIR); - case MOUSE_CURSOR_POINTING_HAND: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_POINTING_HAND); - case MOUSE_CURSOR_RESIZE_EW: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_RESIZE_EW); - case MOUSE_CURSOR_RESIZE_NS: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_RESIZE_NS); - #ifndef RGFW_MACOS - case MOUSE_CURSOR_RESIZE_NWSE: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_RESIZE_NWSE); - case MOUSE_CURSOR_RESIZE_NESW: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_RESIZE_NESW); - #endif - case MOUSE_CURSOR_RESIZE_ALL: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_RESIZE_ALL); - case MOUSE_CURSOR_NOT_ALLOWED: - return RGFW_window_setMouseStandard(platform.window, RGFW_MOUSE_NOT_ALLOWED); - default: - break; - } + RGFW_window_setMouseStandard(platform.window, cursor); } static KeyboardKey ConvertScancodeToKey(u32 keycode); @@ -795,17 +877,20 @@ void PollInputEvents(void) } break; // Window events are also polled (Minimized, maximized, close...) - case RGFW_windowAttribsChange: + case RGFW_windowResized: { SetupViewport(platform.window->r.w, platform.window->r.h); - CORE.Window.position.x = platform.window->r.x; - CORE.Window.position.y = platform.window->r.x; CORE.Window.screen.width = platform.window->r.w; CORE.Window.screen.height = platform.window->r.h; CORE.Window.currentFbo.width = platform.window->r.w;; CORE.Window.currentFbo.height = platform.window->r.h; CORE.Window.resizedLastFrame = true; } break; + case RGFW_windowMoved: + { + CORE.Window.position.x = platform.window->r.x; + CORE.Window.position.y = platform.window->r.x; + } break; // Keyboard events case RGFW_keyPressed: @@ -1051,6 +1136,10 @@ void PollInputEvents(void) } #endif } + + if (RGFW_disableCursor && platform.window->event.inFocus) + RGFW_window_mouseHold(platform.window, RGFW_AREA(0, 0)); + //----------------------------------------------------------------------------- } @@ -1197,336 +1286,9 @@ void ClosePlatform(void) static KeyboardKey ConvertScancodeToKey(u32 keycode) { - switch (keycode) { - case RGFW_Quote: - return KEY_APOSTROPHE; - case RGFW_Comma: - return KEY_COMMA; - case RGFW_Minus: - return KEY_MINUS; - case RGFW_Period: - return KEY_PERIOD; - case RGFW_Slash: - return KEY_SLASH; - case RGFW_Escape: - return KEY_ESCAPE; - case RGFW_F1: - return KEY_F1; - case RGFW_F2: - return KEY_F2; - case RGFW_F3: - return KEY_F3; - case RGFW_F4: - return KEY_F4; - case RGFW_F5: - return KEY_F5; - case RGFW_F6: - return KEY_F6; - case RGFW_F7: - return KEY_F7; - case RGFW_F8: - return KEY_F8; - case RGFW_F9: - return KEY_F9; - case RGFW_F10: - return KEY_F10; - case RGFW_F11: - return KEY_F11; - case RGFW_F12: - return KEY_F12; - case RGFW_Backtick: - return KEY_GRAVE; - case RGFW_0: - return KEY_ZERO; - case RGFW_1: - return KEY_ONE; - case RGFW_2: - return KEY_TWO; - case RGFW_3: - return KEY_THREE; - case RGFW_4: - return KEY_FOUR; - case RGFW_5: - return KEY_FIVE; - case RGFW_6: - return KEY_SIX; - case RGFW_7: - return KEY_SEVEN; - case RGFW_8: - return KEY_EIGHT; - case RGFW_9: - return KEY_NINE; - case RGFW_Equals: - return KEY_EQUAL; - case RGFW_BackSpace: - return KEY_BACKSPACE; - case RGFW_Tab: - return KEY_TAB; - case RGFW_CapsLock: - return KEY_CAPS_LOCK; - case RGFW_ShiftL: - return KEY_LEFT_SHIFT; - case RGFW_ControlL: - return KEY_LEFT_CONTROL; - case RGFW_AltL: - return KEY_LEFT_ALT; - case RGFW_SuperL: - return KEY_LEFT_SUPER; - #ifndef RGFW_MACOS - case RGFW_ShiftR: - return KEY_RIGHT_SHIFT; - - case RGFW_AltR: - return KEY_RIGHT_ALT; - #endif - case RGFW_Space: - return KEY_SPACE; - - #ifdef RGFW_X11 - case RGFW_a: - #endif - - case RGFW_A: - return KEY_A; - - #ifdef RGFW_X11 - case RGFW_b: - #endif - - case RGFW_B: - return KEY_B; - - #ifdef RGFW_X11 - case RGFW_c: - #endif - - case RGFW_C: - return KEY_C; + if (keycode > sizeof(RGFWKeyToRayKey) / sizeof(unsigned short)) + return 0; - #ifdef RGFW_X11 - case RGFW_d: - #endif - - case RGFW_D: - return KEY_D; - - #ifdef RGFW_X11 - case RGFW_e: - #endif - - case RGFW_E: - return KEY_E; - - #ifdef RGFW_X11 - case RGFW_f: - #endif - - case RGFW_F: - return KEY_F; - - #ifdef RGFW_X11 - case RGFW_g: - #endif - - case RGFW_G: - return KEY_G; - - #ifdef RGFW_X11 - case RGFW_h: - #endif - - case RGFW_H: - return KEY_H; - - #ifdef RGFW_X11 - case RGFW_i: - #endif - - case RGFW_I: - return KEY_I; - - #ifdef RGFW_X11 - case RGFW_j: - #endif - - case RGFW_J: - return KEY_J; - - #ifdef RGFW_X11 - case RGFW_k: - #endif - - case RGFW_K: - return KEY_K; - - #ifdef RGFW_X11 - case RGFW_l: - #endif - - case RGFW_L: - return KEY_L; - - #ifdef RGFW_X11 - case RGFW_m: - #endif - - case RGFW_M: - return KEY_M; - - #ifdef RGFW_X11 - case RGFW_n: - #endif - - case RGFW_N: - return KEY_N; - - #ifdef RGFW_X11 - case RGFW_o: - #endif - - case RGFW_O: - return KEY_O; - - #ifdef RGFW_X11 - case RGFW_p: - #endif - - case RGFW_P: - return KEY_P; - - #ifdef RGFW_X11 - case RGFW_q: - #endif - - case RGFW_Q: - return KEY_Q; - - #ifdef RGFW_X11 - case RGFW_r: - #endif - - case RGFW_R: - return KEY_R; - - #ifdef RGFW_X11 - case RGFW_s: - #endif - - case RGFW_S: - return KEY_S; - - #ifdef RGFW_X11 - case RGFW_t: - #endif - - case RGFW_T: - return KEY_T; - - #ifdef RGFW_X11 - case RGFW_u: - #endif - - case RGFW_U: - return KEY_U; - - #ifdef RGFW_X11 - case RGFW_v: - #endif - - case RGFW_V: - return KEY_V; - - #ifdef RGFW_X11 - case RGFW_w: - #endif - - case RGFW_W: - return KEY_W; - - #ifdef RGFW_X11 - case RGFW_x: - #endif - - case RGFW_X: - return KEY_X; - - #ifdef RGFW_X11 - case RGFW_y: - #endif - - case RGFW_Y: - return KEY_Y; - - #ifdef RGFW_X11 - case RGFW_z: - #endif - - case RGFW_Z: - return KEY_Z; - case RGFW_Bracket: - return KEY_LEFT_BRACKET; - case RGFW_BackSlash: - return KEY_BACKSLASH; - case RGFW_CloseBracket: - return KEY_RIGHT_BRACKET; - case RGFW_Semicolon: - return KEY_SEMICOLON; - case RGFW_Insert: - return KEY_INSERT; - case RGFW_Home: - return KEY_HOME; - case RGFW_PageUp: - return KEY_PAGE_UP; - case RGFW_Delete: - return KEY_DELETE; - case RGFW_End: - return KEY_END; - case RGFW_PageDown: - return KEY_PAGE_DOWN; - case RGFW_Right: - return KEY_RIGHT; - case RGFW_Left: - return KEY_LEFT; - case RGFW_Down: - return KEY_DOWN; - case RGFW_Up: - return KEY_UP; - case RGFW_Numlock: - return KEY_NUM_LOCK; - case RGFW_KP_Slash: - return KEY_KP_DIVIDE; - case RGFW_Multiply: - return KEY_KP_MULTIPLY; - case RGFW_KP_Minus: - return KEY_KP_SUBTRACT; - case RGFW_KP_Return: - return KEY_KP_ENTER; - case RGFW_KP_1: - return KEY_KP_1; - case RGFW_KP_2: - return KEY_KP_2; - case RGFW_KP_3: - return KEY_KP_3; - case RGFW_KP_4: - return KEY_KP_4; - case RGFW_KP_5: - return KEY_KP_5; - case RGFW_KP_6: - return KEY_KP_6; - case RGFW_KP_7: - return KEY_KP_7; - case RGFW_KP_8: - return KEY_KP_8; - case RGFW_KP_9: - return KEY_KP_9; - case RGFW_KP_0: - return KEY_KP_0; - case RGFW_KP_Period: - return KEY_KP_DECIMAL; - default: - return 0; - } - - return 0; + return RGFWKeyToRayKey[keycode]; } // EOF \ No newline at end of file