108 lines
3.6 KiB
C++
108 lines
3.6 KiB
C++
|
#include "media.h"
|
||
|
|
||
|
// Enable/Disable Raw Mouse Motion
|
||
|
bool raw_mouse_motion_enabled = true;
|
||
|
void media_set_raw_mouse_motion_enabled(const int enabled) {
|
||
|
raw_mouse_motion_enabled = enabled;
|
||
|
if (glfw_window) {
|
||
|
glfwSetInputMode(glfw_window, GLFW_RAW_MOUSE_MOTION, GLFW_FALSE);
|
||
|
}
|
||
|
if (!raw_mouse_motion_enabled) {
|
||
|
WARN("Raw mouse motion has been DISABLED, this IS NOT recommended, and should only ever be used on systems that don't support or have broken raw mouse motion.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Store Cursor State
|
||
|
static bool cursor_grabbed = false;
|
||
|
static bool cursor_visible = true;
|
||
|
|
||
|
// Ignore Relative Cursor Motion
|
||
|
bool ignore_relative_motion = false;
|
||
|
|
||
|
// Update GLFW Cursor State (Client Only)
|
||
|
void _media_update_cursor() {
|
||
|
if (glfw_window) {
|
||
|
// Get New State
|
||
|
const bool new_cursor_visible = is_interactable ? cursor_visible : true;
|
||
|
const bool new_cursor_grabbed = is_interactable ? cursor_grabbed : false;
|
||
|
|
||
|
// Store Old Mode
|
||
|
const int old_mode = glfwGetInputMode(glfw_window, GLFW_CURSOR);
|
||
|
|
||
|
// Handle Cursor Visibility
|
||
|
int new_mode;
|
||
|
if (!new_cursor_visible) {
|
||
|
if (new_cursor_grabbed) {
|
||
|
new_mode = GLFW_CURSOR_DISABLED;
|
||
|
} else {
|
||
|
new_mode = GLFW_CURSOR_HIDDEN;
|
||
|
}
|
||
|
} else {
|
||
|
new_mode = GLFW_CURSOR_NORMAL;
|
||
|
}
|
||
|
if (new_mode != old_mode) {
|
||
|
// Ignore Relative Cursor Motion When Locking
|
||
|
if (new_mode == GLFW_CURSOR_DISABLED && old_mode != GLFW_CURSOR_DISABLED) {
|
||
|
ignore_relative_motion = true;
|
||
|
}
|
||
|
|
||
|
// Set New Mode
|
||
|
glfwSetInputMode(glfw_window, GLFW_CURSOR, new_mode);
|
||
|
|
||
|
// Handle Cursor Lock/Unlock
|
||
|
if ((new_mode == GLFW_CURSOR_DISABLED && old_mode != GLFW_CURSOR_DISABLED) || (new_mode != GLFW_CURSOR_DISABLED && old_mode == GLFW_CURSOR_DISABLED)) {
|
||
|
// Use Raw Mouse Motion
|
||
|
if (raw_mouse_motion_enabled) {
|
||
|
glfwSetInputMode(glfw_window, GLFW_RAW_MOUSE_MOTION, new_mode == GLFW_CURSOR_DISABLED ? GLFW_TRUE : GLFW_FALSE);
|
||
|
}
|
||
|
|
||
|
// Request Focus
|
||
|
glfwRequestWindowAttention(glfw_window);
|
||
|
}
|
||
|
|
||
|
// Reset Mouse Position When Unlocking
|
||
|
if (new_mode != GLFW_CURSOR_DISABLED && old_mode == GLFW_CURSOR_DISABLED) {
|
||
|
double cursor_x;
|
||
|
double cursor_y;
|
||
|
glfwGetCursorPos(glfw_window, &cursor_x, &cursor_y);
|
||
|
_media_glfw_motion(glfw_window, cursor_x, cursor_y);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Fix SDL Cursor Visibility/Grabbing
|
||
|
SDL_GrabMode media_SDL_WM_GrabInput(const SDL_GrabMode mode) {
|
||
|
if (mode == SDL_GRAB_QUERY) {
|
||
|
// Query
|
||
|
return cursor_grabbed ? SDL_GRAB_ON : SDL_GRAB_OFF;
|
||
|
} else if (mode == SDL_GRAB_ON) {
|
||
|
// Store State
|
||
|
cursor_grabbed = true;
|
||
|
} else if (mode == SDL_GRAB_OFF) {
|
||
|
// Store State
|
||
|
cursor_grabbed = false;
|
||
|
}
|
||
|
// Update Cursor GLFW State (Client Only)
|
||
|
_media_update_cursor();
|
||
|
// Return
|
||
|
return mode;
|
||
|
}
|
||
|
|
||
|
// Stub SDL Cursor Visibility
|
||
|
int media_SDL_ShowCursor(const int toggle) {
|
||
|
if (toggle == SDL_QUERY) {
|
||
|
// Query
|
||
|
return cursor_visible ? SDL_ENABLE : SDL_DISABLE;
|
||
|
} else if (toggle == SDL_ENABLE) {
|
||
|
// Store State
|
||
|
cursor_visible = true;
|
||
|
} else if (toggle == SDL_DISABLE) {
|
||
|
// Store State
|
||
|
cursor_visible = false;
|
||
|
}
|
||
|
// Update Cursor GLFW State (Client Only)
|
||
|
_media_update_cursor();
|
||
|
// Return
|
||
|
return toggle;
|
||
|
}
|