keep mouse in window instead of setting cursor pos to center

This commit is contained in:
jacob 2024-03-13 22:26:28 -05:00
parent bdd8db60c3
commit 181f8258fe
5 changed files with 47 additions and 11 deletions

View File

@ -7,7 +7,7 @@
#define PIXELS_PER_UNIT 256
#define GAME_FPS 50
#define GAME_FPS 30
#define USER_FRAME_LIMIT 300
@ -27,4 +27,4 @@
#define AUDIO_ENABLED 0
#define VSYNC_ENABLED 0
#define MOUSE_SENSITIVITY 1.5
#define MOUSE_SENSITIVITY 1

View File

@ -289,6 +289,8 @@ u64 sys_window_get_internal_handle(struct sys_window *sys_window);
void sys_window_cursor_set_pos(struct sys_window *sys_window, struct v2 pos);
void sys_window_cursor_show(struct sys_window *sys_window);
void sys_window_cursor_hide(struct sys_window *sys_window);
void sys_window_cursor_enable_keep_in_window(struct sys_window *sys_window);
void sys_window_cursor_disable_keep_in_window(struct sys_window *sys_window);
/* ========================== *
* Mutex

View File

@ -33,10 +33,12 @@ struct win32_condition_variable {
};
enum win32_window_cursor_set_flag {
WIN32_WINDOW_CURSOR_SET_FLAG_NONE = 0x0,
WIN32_WINDOW_CURSOR_SET_FLAG_POSITION = 0x1,
WIN32_WINDOW_CURSOR_SET_FLAG_HIDE = 0x2,
WIN32_WINDOW_CURSOR_SET_FLAG_SHOW = 0x4
WIN32_WINDOW_CURSOR_SET_FLAG_NONE = 0x0,
WIN32_WINDOW_CURSOR_SET_FLAG_POSITION = 0x1,
WIN32_WINDOW_CURSOR_SET_FLAG_HIDE = 0x2,
WIN32_WINDOW_CURSOR_SET_FLAG_SHOW = 0x4,
WIN32_WINDOW_CURSOR_SET_FLAG_ENABLE_KEEP_IN_WINDOW = 0X8,
WIN32_WINDOW_CURSOR_SET_FLAG_DISABLE_KEEP_IN_WINDOW = 0X10
};
struct win32_window {
@ -597,6 +599,22 @@ INTERNAL void window_thread_entry_point(void *arg)
SetCursorPos(p.x, p.y);
}
/* Stop keep in window */
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_DISABLE_KEEP_IN_WINDOW) {
ClipCursor(NULL);
}
/* Start keep in window */
if (cursor_flags & WIN32_WINDOW_CURSOR_SET_FLAG_ENABLE_KEEP_IN_WINDOW) {
RECT clip = {
.left = window->x,
.right = window->x + window->width,
.top = window->y,
.bottom = window->y + window->height
};
ClipCursor(&clip);
}
window->cursor_set_flags = 0;
}
}
@ -865,13 +883,13 @@ INTERNAL LRESULT CALLBACK win32_window_proc(HWND hwnd, UINT msg, WPARAM wparam,
case WM_RBUTTONUP:
case WM_XBUTTONUP: {
ReleaseCapture();
is_release = 1;
is_release = true;
} FALLTHROUGH;
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN: {
if(is_release == 0) {
if(!is_release) {
SetCapture(hwnd);
}
@ -1103,6 +1121,20 @@ void sys_window_cursor_hide(struct sys_window *sys_window)
win32_window_wake(window);
}
void sys_window_cursor_enable_keep_in_window(struct sys_window *sys_window)
{
struct win32_window *window = (struct win32_window *)sys_window->handle;
window->cursor_set_flags |= WIN32_WINDOW_CURSOR_SET_FLAG_ENABLE_KEEP_IN_WINDOW;
win32_window_wake(window);
}
void sys_window_cursor_disable_keep_in_window(struct sys_window *sys_window)
{
struct win32_window *window = (struct win32_window *)sys_window->handle;
window->cursor_set_flags |= WIN32_WINDOW_CURSOR_SET_FLAG_DISABLE_KEEP_IN_WINDOW;
win32_window_wake(window);
}
/* ========================== *
* Mutex
* ========================== */

View File

@ -80,7 +80,7 @@ struct ttf_decode_result ttf_decode(struct arena *arena, struct buffer encoded,
IDWriteFactory5 *factory = L.factory;
/* TOOD: handle errors */
/* TODO: handle errors */
HRESULT error = 0;
(UNUSED)error;

View File

@ -447,6 +447,7 @@ INTERNAL void user_update(void)
/* Update mouse pos */
if (event->kind == SYS_EVENT_KIND_MOUSE_MOVE) {
L.screen_mouse = event->mouse_position;
//L.screen_mouse_delta = v2_add(L.screen_mouse_delta, event->mouse_delta);
}
/* Update mouse delta */
@ -503,6 +504,7 @@ INTERNAL void user_update(void)
if (L.debug_camera) {
sys_window_cursor_show(L.window);
sys_window_cursor_disable_keep_in_window(L.window);
/* Pan view */
if (L.bind_states[USER_BIND_KIND_PAN].is_held) {
@ -546,9 +548,9 @@ INTERNAL void user_update(void)
L.world_view.center = v2_add(L.world_view.center, offset);
}
} else {
/* Keep cursor invisible at center of screen */
/* Keep cursor invisible and in screen */
sys_window_cursor_hide(L.window);
sys_window_cursor_set_pos(L.window, L.screen_center);
sys_window_cursor_enable_keep_in_window(L.window);
}
/* ========================== *