summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2025-09-08 17:28:28 -0400
committerAndrew Opalach <andrew@akon.city> 2025-09-08 17:28:28 -0400
commit38c371d1fa82101d59eb202d2f4aa1b2b99c0e42 (patch)
tree82251ac19fa8c2b71441d2f05bf2c722c196f198 /src
parent657972f60484ec2ff384bf3959e9c8c5b18bbe9c (diff)
downloadcamu-38c371d1fa82101d59eb202d2f4aa1b2b99c0e42.tar.gz
camu-38c371d1fa82101d59eb202d2f4aa1b2b99c0e42.tar.bz2
camu-38c371d1fa82101d59eb202d2f4aa1b2b99c0e42.zip
Improve consistency of screen behavior
- Fix some cursor change logic. - Use "borderless windowed" fullscreen on Win32. - Improve touch screen triple tap to reset. Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src')
-rw-r--r--src/screen/screen.c41
-rw-r--r--src/screen/screen.h7
2 files changed, 28 insertions, 20 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index f310970..7bd5d25 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -8,6 +8,7 @@
#define SCREEN_MOD1(scr) ((scr)->window->held_modifiers & (STELA_MOD_LCONTROL | STELA_MOD_RCONTROL))
#define SCREEN_MOD2(scr) ((scr)->window->held_modifiers & (STELA_MOD_LSHIFT | STELA_MOD_RSHIFT))
+#define SCREEN_MOUSE_MOD(scr) ((scr)->flags & CAMU_SCREEN_MOUSE_MOD)
#define SCREEN_IS_DRAGGING(scr) ((scr)->flags & CAMU_SCREEN_DRAGGING)
#define SCREEN_IS_ZOOMING(scr) ((scr)->flags & CAMU_SCREEN_ZOOMING)
#define SCREEN_ZOOM_MODE(scr, mode) ((scr)->flags & mode)
@@ -127,6 +128,7 @@ static bool touch_callback(void *userdata, s32 index, u8 phase, f64 x, f64 y)
scr->flags &= ~CAMU_SCREEN_DRAGGING;
scr->flags |= CAMU_SCREEN_ZOOMING;
} else if (index == 2) {
+ scr->flags &= ~CAMU_SCREEN_ZOOMING;
struct camu_view *view = get_view_from_mouse_pos(scr);
view->mode = CAMU_DEFAULT_VIEW;
camu_view_calculate(view, scr->width, scr->height);
@@ -154,8 +156,11 @@ static bool touch_callback(void *userdata, s32 index, u8 phase, f64 x, f64 y)
scr->callback(scr->userdata, CAMU_SCREEN_SKIP, &n);
}
} else if (index == 1) {
- scr->flags &= ~CAMU_SCREEN_ZOOMING;
- scr->flags |= CAMU_SCREEN_DRAGGING;
+ // We want to ignore this if there was a 3rd touch.
+ if (SCREEN_IS_ZOOMING(scr)) {
+ scr->flags &= ~CAMU_SCREEN_ZOOMING;
+ scr->flags |= CAMU_SCREEN_DRAGGING;
+ }
}
break;
}
@@ -172,17 +177,11 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
case STELA_BUTTON_PRESSED:
scr->flags |= CAMU_SCREEN_DRAGGING;
scr->window->set_cursor(scr->window, STELA_CURSOR_MOVE);
-#ifdef CAMU_SCREEN_DRAG_SEEK
- //scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
-#endif
scr->last_click_ts = nn_get_timestamp();
break;
case STELA_BUTTON_RELEASED:
scr->flags &= ~CAMU_SCREEN_DRAGGING;
- scr->window->set_cursor(scr->window, SCREEN_DEFAULT_CURSOR(scr));
-#ifdef CAMU_SCREEN_DRAG_SEEK
- //scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
-#endif
+ scr->window->set_cursor(scr->window, SCREEN_MOUSE_MOD(scr) ? STELA_CURSOR_CROSSHAIR : SCREEN_DEFAULT_CURSOR(scr));
if (SCREEN_LAST_CLICK_WITHIN(200000)) {
if (SCREEN_MOD1(scr)) {
seek_to_percent_at_pointer(scr, scr->last_pointer_x);
@@ -195,15 +194,19 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
}
break;
case STELA_MOUSE2: {
- if (scr->fullscreen && !SCREEN_IS_DRAGGING(scr)) {
- switch (state) {
- case STELA_BUTTON_PRESSED:
+ switch (state) {
+ case STELA_BUTTON_PRESSED:
+ scr->flags |= CAMU_SCREEN_MOUSE_MOD;
+ if (scr->fullscreen && !SCREEN_IS_DRAGGING(scr)) {
scr->window->set_cursor(scr->window, STELA_CURSOR_CROSSHAIR);
- break;
- case STELA_BUTTON_RELEASED:
+ }
+ break;
+ case STELA_BUTTON_RELEASED:
+ scr->flags &= ~CAMU_SCREEN_MOUSE_MOD;
+ if (!SCREEN_IS_DRAGGING(scr)) {
scr->window->set_cursor(scr->window, SCREEN_DEFAULT_CURSOR(scr));
- break;
}
+ break;
}
break;
}
@@ -443,8 +446,12 @@ static void key_immediate_callback(void *userdata, u8 state, u16 button)
switch (button) {
case STELA_KEY_F:
scr->fullscreen = !scr->fullscreen;
- scr->window->set_cursor(scr->window, scr->fullscreen ? STELA_CURSOR_HIDDEN : STELA_CURSOR_NORMAL);
-#ifdef STELA_API_DX11
+ // On X11 and Wayland, MOUSE2 will be forcefully released when entering fullscreen.
+ if (!SCREEN_MOUSE_MOD(scr)) {
+ scr->window->set_cursor(scr->window, scr->fullscreen ? STELA_CURSOR_HIDDEN : STELA_CURSOR_NORMAL);
+ }
+//#ifdef STELA_API_DX11
+#if 0 // Stela's window_win32 fullscreen mode (borderless) is probably more desirable here.
scr->renderer->set(scr->renderer, CAMU_RENDERER_FULLSCREEN, scr->fullscreen);
#else
scr->window->toggle_fullscreen(scr->window);
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 6b95fed..e12d0ae 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -24,9 +24,10 @@ enum {
CAMU_SCREEN_MOD_SHIFT = 1,
CAMU_SCREEN_MOD_CONTROL = 1 << 1,
CAMU_SCREEN_DRAGGING = 1 << 2,
- CAMU_SCREEN_ZOOMING = 1 << 3,
- CAMU_SCREEN_ZOOM_PAN_SIMPLE = 1 << 4,
- CAMU_SCREEN_ZOOM_FOV = 1 << 5
+ CAMU_SCREEN_MOUSE_MOD = 1 << 3,
+ CAMU_SCREEN_ZOOMING = 1 << 4,
+ CAMU_SCREEN_ZOOM_PAN_SIMPLE = 1 << 5,
+ CAMU_SCREEN_ZOOM_FOV = 1 << 6
};
enum {