diff options
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen.c | 41 | ||||
| -rw-r--r-- | src/screen/screen.h | 7 |
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 { |