|
|
@ -2446,279 +2446,279 @@ static void ScanDirectoryFilesRecursively(const char *basePath, FilePathList *fi |
|
|
|
else TRACELOG(LOG_WARNING, "FILEIO: Directory cannot be opened (%s)", basePath); |
|
|
|
} |
|
|
|
|
|
|
|
cp">#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
|
|
|
|
// GLFW3 WindowSize Callback, runs when window is resizedLastFrame |
|
|
|
// NOTE: Window resizing not allowed by default |
|
|
|
static void WindowSizeCallback(GLFWwindow *window, int width, int height) |
|
|
|
{ |
|
|
|
// Reset viewport and projection matrix for new size |
|
|
|
SetupViewport(width, height); |
|
|
|
|
|
|
|
CORE.Window.currentFbo.width = width; |
|
|
|
CORE.Window.currentFbo.height = height; |
|
|
|
CORE.Window.resizedLastFrame = true; |
|
|
|
|
|
|
|
if (IsWindowFullscreen()) return; |
|
|
|
|
|
|
|
// Set current screen size |
|
|
|
cp">#if defined(__APPLE__) |
|
|
|
CORE.Window.screen.width = width; |
|
|
|
CORE.Window.screen.height = height; |
|
|
|
cp">#else |
|
|
|
if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) |
|
|
|
{ |
|
|
|
Vector2 windowScaleDPI = GetWindowScaleDPI(); |
|
|
|
|
|
|
|
CORE.Window.screen.width = (unsigned int)(width/windowScaleDPI.x); |
|
|
|
CORE.Window.screen.height = (unsigned int)(height/windowScaleDPI.y); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
CORE.Window.screen.width = width; |
|
|
|
CORE.Window.screen.height = height; |
|
|
|
} |
|
|
|
cp">#endif |
|
|
|
|
|
|
|
// NOTE: Postprocessing texture is not scaled to new size |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 WindowIconify Callback, runs when window is minimized/restored |
|
|
|
static void WindowIconifyCallback(GLFWwindow *window, int iconified) |
|
|
|
{ |
|
|
|
if (iconified) CORE.Window.flags |= FLAG_WINDOW_MINIMIZED; // The window was iconified |
|
|
|
else CORE.Window.flags &= ~FLAG_WINDOW_MINIMIZED; // The window was restored |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 WindowFocus Callback, runs when window get/lose focus |
|
|
|
static void WindowFocusCallback(GLFWwindow *window, int focused) |
|
|
|
{ |
|
|
|
if (focused) CORE.Window.flags &= ~FLAG_WINDOW_UNFOCUSED; // The window was focused |
|
|
|
else CORE.Window.flags |= FLAG_WINDOW_UNFOCUSED; // The window lost focus |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Keyboard Callback, runs on key pressed |
|
|
|
static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) |
|
|
|
{ |
|
|
|
if (key < 0) return; // Security check, macOS fn key generates -1 |
|
|
|
|
|
|
|
// WARNING: GLFW could return GLFW_REPEAT, we need to consider it as 1 |
|
|
|
// to work properly with our implementation (IsKeyDown/IsKeyUp checks) |
|
|
|
if (action == GLFW_RELEASE) CORE.Input.Keyboard.currentKeyState[key] = 0; |
|
|
|
else if(action == GLFW_PRESS) CORE.Input.Keyboard.currentKeyState[key] = 1; |
|
|
|
else if(action == GLFW_REPEAT) CORE.Input.Keyboard.keyRepeatInFrame[key] = 1; |
|
|
|
|
|
|
|
cp">#if !defined(PLATFORM_WEB) |
|
|
|
// WARNING: Check if CAPS/NUM key modifiers are enabled and force down state for those keys |
|
|
|
if (((key == KEY_CAPS_LOCK) && ((mods & GLFW_MOD_CAPS_LOCK) > 0)) || |
|
|
|
((key == KEY_NUM_LOCK) && ((mods & GLFW_MOD_NUM_LOCK) > 0))) CORE.Input.Keyboard.currentKeyState[key] = 1; |
|
|
|
cp">#endif |
|
|
|
|
|
|
|
// Check if there is space available in the key queue |
|
|
|
if ((CORE.Input.Keyboard.keyPressedQueueCount < MAX_KEY_PRESSED_QUEUE) && (action == GLFW_PRESS)) |
|
|
|
{ |
|
|
|
// Add character to the queue |
|
|
|
CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = key; |
|
|
|
CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
} |
|
|
|
|
|
|
|
// Check the exit key to set close window |
|
|
|
if ((key == CORE.Input.Keyboard.exitKey) && (action == GLFW_PRESS)) glfwSetWindowShouldClose(CORE.Window.handle, GLFW_TRUE); |
|
|
|
|
|
|
|
cp">#if defined(SUPPORT_SCREEN_CAPTURE) |
|
|
|
if ((key == GLFW_KEY_F12) && (action == GLFW_PRESS)) |
|
|
|
{ |
|
|
|
cp">#if defined(SUPPORT_GIF_RECORDING) |
|
|
|
if (mods & GLFW_MOD_CONTROL) |
|
|
|
{ |
|
|
|
if (gifRecording) |
|
|
|
{ |
|
|
|
gifRecording = false; |
|
|
|
|
|
|
|
MsfGifResult result = msf_gif_end(&gifState); |
|
|
|
|
|
|
|
SaveFileData(TextFormat("%s/screenrec%03i.gif", CORE.Storage.basePath, screenshotCounter), result.data, (unsigned int)result.dataSize); |
|
|
|
msf_gif_free(result); |
|
|
|
|
|
|
|
#if defined(PLATFORM_WEB) |
|
|
|
// Download file from MEMFS (emscripten memory filesystem) |
|
|
|
// saveFileFromMEMFSToDisk() function is defined in raylib/templates/web_shel/shell.html |
|
|
|
emscripten_run_script(TextFormat("saveFileFromMEMFSToDisk('%s','%s')", TextFormat("screenrec%03i.gif", screenshotCounter - 1), TextFormat("screenrec%03i.gif", screenshotCounter - 1))); |
|
|
|
#endif |
|
|
|
|
|
|
|
TRACELOG(LOG_INFO, "SYSTEM: Finish animated GIF recording"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
gifRecording = true; |
|
|
|
gifFrameCounter = 0; |
|
|
|
|
|
|
|
Vector2 scale = GetWindowScaleDPI(); |
|
|
|
msf_gif_begin(&gifState, (int)((float)CORE.Window.render.width*scale.x), (int)((float)CORE.Window.render.height*scale.y)); |
|
|
|
screenshotCounter++; |
|
|
|
|
|
|
|
TRACELOG(LOG_INFO, "SYSTEM: Start animated GIF recording: %s", TextFormat("screenrec%03i.gif", screenshotCounter)); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
cp">#endif // SUPPORT_GIF_RECORDING |
|
|
|
{ |
|
|
|
TakeScreenshot(TextFormat("screenshot%03i.png", screenshotCounter)); |
|
|
|
screenshotCounter++; |
|
|
|
} |
|
|
|
} |
|
|
|
cp">#endif // SUPPORT_SCREEN_CAPTURE |
|
|
|
|
|
|
|
cp">#if defined(SUPPORT_EVENTS_AUTOMATION) |
|
|
|
if ((key == GLFW_KEY_F11) && (action == GLFW_PRESS)) |
|
|
|
{ |
|
|
|
eventsRecording = !eventsRecording; |
|
|
|
|
|
|
|
// On finish recording, we export events into a file |
|
|
|
if (!eventsRecording) ExportAutomationEvents("eventsrec.rep"); |
|
|
|
} |
|
|
|
else if ((key == GLFW_KEY_F9) && (action == GLFW_PRESS)) |
|
|
|
{ |
|
|
|
LoadAutomationEvents("eventsrec.rep"); |
|
|
|
eventsPlaying = true; |
|
|
|
|
|
|
|
TRACELOG(LOG_WARNING, "eventsPlaying enabled!"); |
|
|
|
} |
|
|
|
cp">#endif |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Char Key Callback, runs on key down (gets equivalent unicode char value) |
|
|
|
static void CharCallback(GLFWwindow *window, unsigned int key) |
|
|
|
{ |
|
|
|
//TRACELOG(LOG_DEBUG, "Char Callback: KEY:%i(%c)", key, key); |
|
|
|
|
|
|
|
// NOTE: Registers any key down considering OS keyboard layout but |
|
|
|
// does not detect action events, those should be managed by user... |
|
|
|
// Ref: https://github.com/glfw/glfw/issues/668#issuecomment-166794907 |
|
|
|
// Ref: https://www.glfw.org/docs/latest/input_guide.html#input_char |
|
|
|
|
|
|
|
// Check if there is space available in the queue |
|
|
|
if (CORE.Input.Keyboard.charPressedQueueCount < MAX_CHAR_PRESSED_QUEUE) |
|
|
|
{ |
|
|
|
// Add character to the queue |
|
|
|
CORE.Input.Keyboard.charPressedQueue[CORE.Input.Keyboard.charPressedQueueCount] = key; |
|
|
|
CORE.Input.Keyboard.charPressedQueueCount++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Mouse Button Callback, runs on mouse button pressed |
|
|
|
static void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods) |
|
|
|
{ |
|
|
|
// WARNING: GLFW could only return GLFW_PRESS (1) or GLFW_RELEASE (0) for now, |
|
|
|
// but future releases may add more actions (i.e. GLFW_REPEAT) |
|
|
|
CORE.Input.Mouse.currentButtonState[button] = action; |
|
|
|
|
|
|
|
cp">#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) // PLATFORM_DESKTOP |
|
|
|
// Process mouse events as touches to be able to use mouse-gestures |
|
|
|
GestureEvent gestureEvent = { 0 }; |
|
|
|
|
|
|
|
// Register touch actions |
|
|
|
if ((CORE.Input.Mouse.currentButtonState[button] == 1) && (CORE.Input.Mouse.previousButtonState[button] == 0)) gestureEvent.touchAction = TOUCH_ACTION_DOWN; |
|
|
|
else if ((CORE.Input.Mouse.currentButtonState[button] == 0) && (CORE.Input.Mouse.previousButtonState[button] == 1)) gestureEvent.touchAction = TOUCH_ACTION_UP; |
|
|
|
|
|
|
|
// NOTE: TOUCH_ACTION_MOVE event is registered in MouseCursorPosCallback() |
|
|
|
|
|
|
|
// Assign a pointer ID |
|
|
|
gestureEvent.pointId[0] = 0; |
|
|
|
|
|
|
|
// Register touch points count |
|
|
|
gestureEvent.pointCount = 1; |
|
|
|
|
|
|
|
// Register touch points position, only one point registered |
|
|
|
gestureEvent.position[0] = GetMousePosition(); |
|
|
|
|
|
|
|
// Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height |
|
|
|
gestureEvent.position[0].x /= (float)GetScreenWidth(); |
|
|
|
gestureEvent.position[0].y /= (float)GetScreenHeight(); |
|
|
|
|
|
|
|
// Gesture data is sent to gestures-system for processing |
|
|
|
cp">#if defined(PLATFORM_WEB) |
|
|
|
// Prevent calling ProcessGestureEvent() when Emscripten is present and there's a touch gesture, so EmscriptenTouchCallback() can handle it itself |
|
|
|
if (GetMouseX() != 0 || GetMouseY() != 0) ProcessGestureEvent(gestureEvent); |
|
|
|
cp">#else |
|
|
|
ProcessGestureEvent(gestureEvent); |
|
|
|
cp">#endif |
|
|
|
|
|
|
|
cp">#endif |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Cursor Position Callback, runs on mouse move |
|
|
|
static void MouseCursorPosCallback(GLFWwindow *window, double x, double y) |
|
|
|
{ |
|
|
|
CORE.Input.Mouse.currentPosition.x = (float)x; |
|
|
|
CORE.Input.Mouse.currentPosition.y = (float)y; |
|
|
|
CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; |
|
|
|
|
|
|
|
cp">#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) // PLATFORM_DESKTOP |
|
|
|
// Process mouse events as touches to be able to use mouse-gestures |
|
|
|
GestureEvent gestureEvent = { 0 }; |
|
|
|
|
|
|
|
gestureEvent.touchAction = TOUCH_ACTION_MOVE; |
|
|
|
|
|
|
|
// Assign a pointer ID |
|
|
|
gestureEvent.pointId[0] = 0; |
|
|
|
|
|
|
|
// Register touch points count |
|
|
|
gestureEvent.pointCount = 1; |
|
|
|
|
|
|
|
// Register touch points position, only one point registered |
|
|
|
gestureEvent.position[0] = CORE.Input.Touch.position[0]; |
|
|
|
|
|
|
|
// Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height |
|
|
|
gestureEvent.position[0].x /= (float)GetScreenWidth(); |
|
|
|
gestureEvent.position[0].y /= (float)GetScreenHeight(); |
|
|
|
|
|
|
|
// Gesture data is sent to gestures-system for processing |
|
|
|
ProcessGestureEvent(gestureEvent); |
|
|
|
cp">#endif |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Scrolling Callback, runs on mouse wheel |
|
|
|
static void MouseScrollCallback(GLFWwindow *window, double xoffset, double yoffset) |
|
|
|
{ |
|
|
|
CORE.Input.Mouse.currentWheelMove = (Vector2){ (float)xoffset, (float)yoffset }; |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 CursorEnter Callback, when cursor enters the window |
|
|
|
static void CursorEnterCallback(GLFWwindow *window, int enter) |
|
|
|
{ |
|
|
|
if (enter == true) CORE.Input.Mouse.cursorOnScreen = true; |
|
|
|
else CORE.Input.Mouse.cursorOnScreen = false; |
|
|
|
} |
|
|
|
|
|
|
|
// GLFW3 Window Drop Callback, runs when drop files into window |
|
|
|
static void WindowDropCallback(GLFWwindow *window, int count, const char **paths) |
|
|
|
{ |
|
|
|
if (count > 0) |
|
|
|
{ |
|
|
|
// In case previous dropped filepaths have not been freed, we free them |
|
|
|
if (CORE.Window.dropFileCount > 0) |
|
|
|
{ |
|
|
|
for (unsigned int i = 0; i < CORE.Window.dropFileCount; i++) RL_FREE(CORE.Window.dropFilepaths[i]); |
|
|
|
|
|
|
|
RL_FREE(CORE.Window.dropFilepaths); |
|
|
|
|
|
|
|
CORE.Window.dropFileCount = 0; |
|
|
|
CORE.Window.dropFilepaths = NULL; |
|
|
|
} |
|
|
|
|
|
|
|
// WARNING: Paths are freed by GLFW when the callback returns, we must keep an internal copy |
|
|
|
CORE.Window.dropFileCount = count; |
|
|
|
CORE.Window.dropFilepaths = (char **)RL_CALLOC(CORE.Window.dropFileCount, sizeof(char *)); |
|
|
|
|
|
|
|
for (unsigned int i = 0; i < CORE.Window.dropFileCount; i++) |
|
|
|
{ |
|
|
|
CORE.Window.dropFilepaths[i] = (char *)RL_CALLOC(MAX_FILEPATH_LENGTH, sizeof(char)); |
|
|
|
strcpy(CORE.Window.dropFilepaths[i], paths[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
cp">#endif |
|
|
|
o">//#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB) |
|
|
|
// |
|
|
|
//// GLFW3 WindowSize Callback, runs when window is resizedLastFrame |
|
|
|
//// NOTE: Window resizing not allowed by default |
|
|
|
//static void WindowSizeCallback(GLFWwindow *window, int width, int height) |
|
|
|
//{ |
|
|
|
// // Reset viewport and projection matrix for new size |
|
|
|
// SetupViewport(width, height); |
|
|
|
// |
|
|
|
// CORE.Window.currentFbo.width = width; |
|
|
|
// CORE.Window.currentFbo.height = height; |
|
|
|
// CORE.Window.resizedLastFrame = true; |
|
|
|
// |
|
|
|
// if (IsWindowFullscreen()) return; |
|
|
|
// |
|
|
|
// // Set current screen size |
|
|
|
o">//#if defined(__APPLE__) |
|
|
|
// CORE.Window.screen.width = width; |
|
|
|
// CORE.Window.screen.height = height; |
|
|
|
o">//#else |
|
|
|
// if ((CORE.Window.flags & FLAG_WINDOW_HIGHDPI) > 0) |
|
|
|
// { |
|
|
|
// Vector2 windowScaleDPI = GetWindowScaleDPI(); |
|
|
|
// |
|
|
|
// CORE.Window.screen.width = (unsigned int)(width/windowScaleDPI.x); |
|
|
|
// CORE.Window.screen.height = (unsigned int)(height/windowScaleDPI.y); |
|
|
|
// } |
|
|
|
// else |
|
|
|
// { |
|
|
|
// CORE.Window.screen.width = width; |
|
|
|
// CORE.Window.screen.height = height; |
|
|
|
// } |
|
|
|
o">//#endif |
|
|
|
// |
|
|
|
// // NOTE: Postprocessing texture is not scaled to new size |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 WindowIconify Callback, runs when window is minimized/restored |
|
|
|
//static void WindowIconifyCallback(GLFWwindow *window, int iconified) |
|
|
|
//{ |
|
|
|
// if (iconified) CORE.Window.flags |= FLAG_WINDOW_MINIMIZED; // The window was iconified |
|
|
|
// else CORE.Window.flags &= ~FLAG_WINDOW_MINIMIZED; // The window was restored |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 WindowFocus Callback, runs when window get/lose focus |
|
|
|
//static void WindowFocusCallback(GLFWwindow *window, int focused) |
|
|
|
//{ |
|
|
|
// if (focused) CORE.Window.flags &= ~FLAG_WINDOW_UNFOCUSED; // The window was focused |
|
|
|
// else CORE.Window.flags |= FLAG_WINDOW_UNFOCUSED; // The window lost focus |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Keyboard Callback, runs on key pressed |
|
|
|
//static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) |
|
|
|
//{ |
|
|
|
// if (key < 0) return; // Security check, macOS fn key generates -1 |
|
|
|
// |
|
|
|
// // WARNING: GLFW could return GLFW_REPEAT, we need to consider it as 1 |
|
|
|
// // to work properly with our implementation (IsKeyDown/IsKeyUp checks) |
|
|
|
// if (action == GLFW_RELEASE) CORE.Input.Keyboard.currentKeyState[key] = 0; |
|
|
|
// else if(action == GLFW_PRESS) CORE.Input.Keyboard.currentKeyState[key] = 1; |
|
|
|
// else if(action == GLFW_REPEAT) CORE.Input.Keyboard.keyRepeatInFrame[key] = 1; |
|
|
|
// |
|
|
|
o">//#if !defined(PLATFORM_WEB) |
|
|
|
// // WARNING: Check if CAPS/NUM key modifiers are enabled and force down state for those keys |
|
|
|
// if (((key == KEY_CAPS_LOCK) && ((mods & GLFW_MOD_CAPS_LOCK) > 0)) || |
|
|
|
// ((key == KEY_NUM_LOCK) && ((mods & GLFW_MOD_NUM_LOCK) > 0))) CORE.Input.Keyboard.currentKeyState[key] = 1; |
|
|
|
o">//#endif |
|
|
|
// |
|
|
|
// // Check if there is space available in the key queue |
|
|
|
// if ((CORE.Input.Keyboard.keyPressedQueueCount < MAX_KEY_PRESSED_QUEUE) && (action == GLFW_PRESS)) |
|
|
|
// { |
|
|
|
// // Add character to the queue |
|
|
|
// CORE.Input.Keyboard.keyPressedQueue[CORE.Input.Keyboard.keyPressedQueueCount] = key; |
|
|
|
// CORE.Input.Keyboard.keyPressedQueueCount++; |
|
|
|
// } |
|
|
|
// |
|
|
|
// // Check the exit key to set close window |
|
|
|
// if ((key == CORE.Input.Keyboard.exitKey) && (action == GLFW_PRESS)) glfwSetWindowShouldClose(CORE.Window.handle, GLFW_TRUE); |
|
|
|
// |
|
|
|
o">//#if defined(SUPPORT_SCREEN_CAPTURE) |
|
|
|
// if ((key == GLFW_KEY_F12) && (action == GLFW_PRESS)) |
|
|
|
// { |
|
|
|
o">//#if defined(SUPPORT_GIF_RECORDING) |
|
|
|
// if (mods & GLFW_MOD_CONTROL) |
|
|
|
// { |
|
|
|
// if (gifRecording) |
|
|
|
// { |
|
|
|
// gifRecording = false; |
|
|
|
// |
|
|
|
// MsfGifResult result = msf_gif_end(&gifState); |
|
|
|
// |
|
|
|
// SaveFileData(TextFormat("%s/screenrec%03i.gif", CORE.Storage.basePath, screenshotCounter), result.data, (unsigned int)result.dataSize); |
|
|
|
// msf_gif_free(result); |
|
|
|
// |
|
|
|
// #if defined(PLATFORM_WEB) |
|
|
|
// // Download file from MEMFS (emscripten memory filesystem) |
|
|
|
// // saveFileFromMEMFSToDisk() function is defined in raylib/templates/web_shel/shell.html |
|
|
|
// emscripten_run_script(TextFormat("saveFileFromMEMFSToDisk('%s','%s')", TextFormat("screenrec%03i.gif", screenshotCounter - 1), TextFormat("screenrec%03i.gif", screenshotCounter - 1))); |
|
|
|
// #endif |
|
|
|
// |
|
|
|
// TRACELOG(LOG_INFO, "SYSTEM: Finish animated GIF recording"); |
|
|
|
// } |
|
|
|
// else |
|
|
|
// { |
|
|
|
// gifRecording = true; |
|
|
|
// gifFrameCounter = 0; |
|
|
|
// |
|
|
|
// Vector2 scale = GetWindowScaleDPI(); |
|
|
|
// msf_gif_begin(&gifState, (int)((float)CORE.Window.render.width*scale.x), (int)((float)CORE.Window.render.height*scale.y)); |
|
|
|
// screenshotCounter++; |
|
|
|
// |
|
|
|
// TRACELOG(LOG_INFO, "SYSTEM: Start animated GIF recording: %s", TextFormat("screenrec%03i.gif", screenshotCounter)); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// else |
|
|
|
o">//#endif // SUPPORT_GIF_RECORDING |
|
|
|
// { |
|
|
|
// TakeScreenshot(TextFormat("screenshot%03i.png", screenshotCounter)); |
|
|
|
// screenshotCounter++; |
|
|
|
// } |
|
|
|
// } |
|
|
|
o">//#endif // SUPPORT_SCREEN_CAPTURE |
|
|
|
// |
|
|
|
o">//#if defined(SUPPORT_EVENTS_AUTOMATION) |
|
|
|
// if ((key == GLFW_KEY_F11) && (action == GLFW_PRESS)) |
|
|
|
// { |
|
|
|
// eventsRecording = !eventsRecording; |
|
|
|
// |
|
|
|
// // On finish recording, we export events into a file |
|
|
|
// if (!eventsRecording) ExportAutomationEvents("eventsrec.rep"); |
|
|
|
// } |
|
|
|
// else if ((key == GLFW_KEY_F9) && (action == GLFW_PRESS)) |
|
|
|
// { |
|
|
|
// LoadAutomationEvents("eventsrec.rep"); |
|
|
|
// eventsPlaying = true; |
|
|
|
// |
|
|
|
// TRACELOG(LOG_WARNING, "eventsPlaying enabled!"); |
|
|
|
// } |
|
|
|
o">//#endif |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Char Key Callback, runs on key down (gets equivalent unicode char value) |
|
|
|
//static void CharCallback(GLFWwindow *window, unsigned int key) |
|
|
|
//{ |
|
|
|
// //TRACELOG(LOG_DEBUG, "Char Callback: KEY:%i(%c)", key, key); |
|
|
|
// |
|
|
|
// // NOTE: Registers any key down considering OS keyboard layout but |
|
|
|
// // does not detect action events, those should be managed by user... |
|
|
|
// // Ref: https://github.com/glfw/glfw/issues/668#issuecomment-166794907 |
|
|
|
// // Ref: https://www.glfw.org/docs/latest/input_guide.html#input_char |
|
|
|
// |
|
|
|
// // Check if there is space available in the queue |
|
|
|
// if (CORE.Input.Keyboard.charPressedQueueCount < MAX_CHAR_PRESSED_QUEUE) |
|
|
|
// { |
|
|
|
// // Add character to the queue |
|
|
|
// CORE.Input.Keyboard.charPressedQueue[CORE.Input.Keyboard.charPressedQueueCount] = key; |
|
|
|
// CORE.Input.Keyboard.charPressedQueueCount++; |
|
|
|
// } |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Mouse Button Callback, runs on mouse button pressed |
|
|
|
//static void MouseButtonCallback(GLFWwindow *window, int button, int action, int mods) |
|
|
|
//{ |
|
|
|
// // WARNING: GLFW could only return GLFW_PRESS (1) or GLFW_RELEASE (0) for now, |
|
|
|
// // but future releases may add more actions (i.e. GLFW_REPEAT) |
|
|
|
// CORE.Input.Mouse.currentButtonState[button] = action; |
|
|
|
// |
|
|
|
o">//#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) // PLATFORM_DESKTOP |
|
|
|
// // Process mouse events as touches to be able to use mouse-gestures |
|
|
|
// GestureEvent gestureEvent = { 0 }; |
|
|
|
// |
|
|
|
// // Register touch actions |
|
|
|
// if ((CORE.Input.Mouse.currentButtonState[button] == 1) && (CORE.Input.Mouse.previousButtonState[button] == 0)) gestureEvent.touchAction = TOUCH_ACTION_DOWN; |
|
|
|
// else if ((CORE.Input.Mouse.currentButtonState[button] == 0) && (CORE.Input.Mouse.previousButtonState[button] == 1)) gestureEvent.touchAction = TOUCH_ACTION_UP; |
|
|
|
// |
|
|
|
// // NOTE: TOUCH_ACTION_MOVE event is registered in MouseCursorPosCallback() |
|
|
|
// |
|
|
|
// // Assign a pointer ID |
|
|
|
// gestureEvent.pointId[0] = 0; |
|
|
|
// |
|
|
|
// // Register touch points count |
|
|
|
// gestureEvent.pointCount = 1; |
|
|
|
// |
|
|
|
// // Register touch points position, only one point registered |
|
|
|
// gestureEvent.position[0] = GetMousePosition(); |
|
|
|
// |
|
|
|
// // Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height |
|
|
|
// gestureEvent.position[0].x /= (float)GetScreenWidth(); |
|
|
|
// gestureEvent.position[0].y /= (float)GetScreenHeight(); |
|
|
|
// |
|
|
|
// // Gesture data is sent to gestures-system for processing |
|
|
|
o">//#if defined(PLATFORM_WEB) |
|
|
|
// // Prevent calling ProcessGestureEvent() when Emscripten is present and there's a touch gesture, so EmscriptenTouchCallback() can handle it itself |
|
|
|
// if (GetMouseX() != 0 || GetMouseY() != 0) ProcessGestureEvent(gestureEvent); |
|
|
|
o">//#else |
|
|
|
// ProcessGestureEvent(gestureEvent); |
|
|
|
o">//#endif |
|
|
|
// |
|
|
|
o">//#endif |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Cursor Position Callback, runs on mouse move |
|
|
|
//static void MouseCursorPosCallback(GLFWwindow *window, double x, double y) |
|
|
|
//{ |
|
|
|
// CORE.Input.Mouse.currentPosition.x = (float)x; |
|
|
|
// CORE.Input.Mouse.currentPosition.y = (float)y; |
|
|
|
// CORE.Input.Touch.position[0] = CORE.Input.Mouse.currentPosition; |
|
|
|
// |
|
|
|
o">//#if defined(SUPPORT_GESTURES_SYSTEM) && defined(SUPPORT_MOUSE_GESTURES) // PLATFORM_DESKTOP |
|
|
|
// // Process mouse events as touches to be able to use mouse-gestures |
|
|
|
// GestureEvent gestureEvent = { 0 }; |
|
|
|
// |
|
|
|
// gestureEvent.touchAction = TOUCH_ACTION_MOVE; |
|
|
|
// |
|
|
|
// // Assign a pointer ID |
|
|
|
// gestureEvent.pointId[0] = 0; |
|
|
|
// |
|
|
|
// // Register touch points count |
|
|
|
// gestureEvent.pointCount = 1; |
|
|
|
// |
|
|
|
// // Register touch points position, only one point registered |
|
|
|
// gestureEvent.position[0] = CORE.Input.Touch.position[0]; |
|
|
|
// |
|
|
|
// // Normalize gestureEvent.position[0] for CORE.Window.screen.width and CORE.Window.screen.height |
|
|
|
// gestureEvent.position[0].x /= (float)GetScreenWidth(); |
|
|
|
// gestureEvent.position[0].y /= (float)GetScreenHeight(); |
|
|
|
// |
|
|
|
// // Gesture data is sent to gestures-system for processing |
|
|
|
// ProcessGestureEvent(gestureEvent); |
|
|
|
o">//#endif |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Scrolling Callback, runs on mouse wheel |
|
|
|
//static void MouseScrollCallback(GLFWwindow *window, double xoffset, double yoffset) |
|
|
|
//{ |
|
|
|
// CORE.Input.Mouse.currentWheelMove = (Vector2){ (float)xoffset, (float)yoffset }; |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 CursorEnter Callback, when cursor enters the window |
|
|
|
//static void CursorEnterCallback(GLFWwindow *window, int enter) |
|
|
|
//{ |
|
|
|
// if (enter == true) CORE.Input.Mouse.cursorOnScreen = true; |
|
|
|
// else CORE.Input.Mouse.cursorOnScreen = false; |
|
|
|
//} |
|
|
|
// |
|
|
|
//// GLFW3 Window Drop Callback, runs when drop files into window |
|
|
|
//static void WindowDropCallback(GLFWwindow *window, int count, const char **paths) |
|
|
|
//{ |
|
|
|
// if (count > 0) |
|
|
|
// { |
|
|
|
// // In case previous dropped filepaths have not been freed, we free them |
|
|
|
// if (CORE.Window.dropFileCount > 0) |
|
|
|
// { |
|
|
|
// for (unsigned int i = 0; i < CORE.Window.dropFileCount; i++) RL_FREE(CORE.Window.dropFilepaths[i]); |
|
|
|
// |
|
|
|
// RL_FREE(CORE.Window.dropFilepaths); |
|
|
|
// |
|
|
|
// CORE.Window.dropFileCount = 0; |
|
|
|
// CORE.Window.dropFilepaths = NULL; |
|
|
|
// } |
|
|
|
// |
|
|
|
// // WARNING: Paths are freed by GLFW when the callback returns, we must keep an internal copy |
|
|
|
// CORE.Window.dropFileCount = count; |
|
|
|
// CORE.Window.dropFilepaths = (char **)RL_CALLOC(CORE.Window.dropFileCount, sizeof(char *)); |
|
|
|
// |
|
|
|
// for (unsigned int i = 0; i < CORE.Window.dropFileCount; i++) |
|
|
|
// { |
|
|
|
// CORE.Window.dropFilepaths[i] = (char *)RL_CALLOC(MAX_FILEPATH_LENGTH, sizeof(char)); |
|
|
|
// strcpy(CORE.Window.dropFilepaths[i], paths[i]); |
|
|
|
// } |
|
|
|
// } |
|
|
|
//} |
|
|
|
o">//#endif |
|
|
|
|
|
|
|
#if defined(PLATFORM_DRM) |
|
|
|
// Initialize Keyboard system (using standard input) |
|
|
|