diff options
| author | 2026-09-07 15:06:14 -0400 | |
|---|---|---|
| committer | 2026-09-07 15:06:14 -0400 | |
| commit | c66c7c64ebd16287b892f8a780cffcabafba3799 (patch) | |
| tree | b2195902ef055147878b591cf1171be7e6133c97 /src/screen/screen.c | |
| parent | 1758ae9e860bd3b65b661e3c804288c3599f4fd4 (diff) | |
| download | camu-c66c7c64ebd16287b892f8a780cffcabafba3799.tar.gz camu-c66c7c64ebd16287b892f8a780cffcabafba3799.tar.bz2 camu-c66c7c64ebd16287b892f8a780cffcabafba3799.zip | |
Better OSD behavior, lots of build stuff
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/screen/screen.c')
| -rw-r--r-- | src/screen/screen.c | 250 |
1 files changed, 141 insertions, 109 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c index 29868d3..841fe0a 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -37,8 +37,10 @@ static void render_callback(void *userdata) { struct camu_screen *scr = (struct camu_screen *)userdata; bool force; - if (scr->renderer && camu_screen_tick(scr, &force)) { - scr->renderer->render(scr->renderer, scr, force); + if (camu_screen_tick(scr, &force)) { + if (scr->renderer) { + scr->renderer->render(scr->renderer, scr, force); + } } } @@ -276,7 +278,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button) bool want_crosshair = MOUSE_MOD(scr) && scr->fullscreen; scr->window->set_cursor(scr->window, want_crosshair ? STELA_CURSOR_CROSSHAIR : DEFAULT_CURSOR(scr)); if (LAST_CLICK_WITHIN(200000)) { - if (MOD1(scr)) { + if (MOD1(scr) || (scr->osd.show && scr->last_pointer_y >= scr->height - OSD_BAR_HEIGHT)) { seek_to_percent_at_pointer(scr, scr->last_pointer_x); } else { s32 n = (scr->last_pointer_x >= scr->width / 2.0) ? 1 : -1; @@ -351,10 +353,7 @@ static bool key_callback(void *userdata, u8 state, u16 button) case STELA_KEY_Q: scr->window->close(scr->window); scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL); - break; - case STELA_KEY_SLASH: - scr->osd.show_binds = !scr->osd.show_binds; - break; + return true; case STELA_KEY_RIGHT: if (MOD1(scr)) { if (MOD2(scr)) { @@ -389,33 +388,58 @@ static bool key_callback(void *userdata, u8 state, u16 button) scr->callback(scr->userdata, CAMU_SCREEN_SKIP, &n); break; } - case STELA_KEY_LEFT_CONTROL: - case STELA_KEY_RIGHT_CONTROL: - if (scr->osd.shown_for & CAMU_OSD_VOLUME) { - scr->osd.shown_for &= ~CAMU_OSD_VOLUME; - scr->osd.shown_for |= CAMU_OSD_SEEK; - } else if (!scr->osd.show) { + case STELA_KEY_SPACE: + scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL); + break; + case STELA_KEY_M: { + f32 volume = MOD2(scr) ? 1.f : -1.f; + scr->callback(scr->userdata, CAMU_SCREEN_SET_VOLUME, &volume); + scr->osd.bar_mode = CAMU_OSD_BAR_VOLUME; + scr->osd.bar = volume; + if (!scr->osd.show) { + scr->osd.flash = CAMU_OSD_FLASH_FOR(0.75); scr->osd.show = true; - scr->osd.shown_for |= CAMU_OSD_SEEK; - } - if (scr->osd.duration > 0 && scr->last_pointer_y >= scr->height - OSD_BAR_HEIGHT) { - scr->osd.bar_mode = CAMU_OSD_BAR_SEEK; } break; - case STELA_KEY_TAB: - if (!(scr->osd.shown_for & CAMU_OSD_SEEK)) { - if (scr->osd.flash >= 0.0) { - scr->osd.flash = 0.0; + } + case STELA_KEY_SLASH: + if (scr->osd.show) { + if (scr->osd.alt == CAMU_OSD_ALT_BINDS) { + if (scr->osd.shown_for & CAMU_OSD_TOGGLED) { + scr->osd.shown_for &= ~CAMU_OSD_ALT_TOGGLED; + } else { + scr->osd.show = false; + scr->osd.shown_for = 0; + atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED); + } + scr->osd.alt = 0; } else { - scr->osd.show = !scr->osd.show; - scr->osd.shown_for = 0; - atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED); + scr->osd.alt = CAMU_OSD_ALT_BINDS; } - return true; + } else { + scr->osd.show = true; + scr->osd.shown_for |= CAMU_OSD_ALT_TOGGLED; + scr->osd.alt = CAMU_OSD_ALT_BINDS; + } + return true; + case STELA_KEY_TAB: + if (scr->osd.show) { + scr->osd.show = false; + scr->osd.shown_for = 0; + scr->osd.alt = 0; + atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED); + } else { + scr->osd.show = true; + scr->osd.shown_for |= CAMU_OSD_TOGGLED; + } + return true; + case STELA_KEY_LEFT_CONTROL: + case STELA_KEY_RIGHT_CONTROL: + scr->osd.show = true; + scr->osd.shown_for |= CAMU_OSD_KEY_HELD; + if (scr->osd.duration > 0 && scr->last_pointer_y >= scr->height - OSD_BAR_HEIGHT) { + scr->osd.bar_mode = CAMU_OSD_BAR_SEEK; } - break; - case STELA_KEY_SPACE: - scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL); break; case STELA_KEY_S: if (MOD1(scr)) { @@ -428,81 +452,27 @@ static bool key_callback(void *userdata, u8 state, u16 button) #endif } break; - case STELA_KEY_E: - scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); - break; - case STELA_KEY_M: { - f32 volume = MOD2(scr) ? 1.f : -1.f; - scr->callback(scr->userdata, CAMU_SCREEN_SET_VOLUME, &volume); - scr->osd.bar_mode = CAMU_OSD_BAR_VOLUME; - scr->osd.bar = volume; - scr->osd.flash = CAMU_OSD_FLASH_FOR(0.75); - if (!scr->osd.show) { - scr->osd.show = true; - scr->osd.shown_for |= CAMU_OSD_VOLUME; + case STELA_KEY_UP: { + s32 n = -1; + if (MOD1(scr)) { + scr->callback(scr->userdata, CAMU_SCREEN_AUDIO_TRACK, &n); + } else if (MOD2(scr)) { + scr->callback(scr->userdata, CAMU_SCREEN_SUBTITLE_TRACK, &n); } break; } - case STELA_KEY_0: - scr->callback(scr->userdata, CAMU_SCREEN_PRINT, NULL); - break; -#ifdef CAMU_SCREEN_DEBUG_KEY - case STELA_KEY_P: - scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL); - break; -#endif - case STELA_KEY_R: { - struct camu_view *view = get_view_from_mouse_pos(scr); - if (view) { - if (MOD2(scr)) { - switch (view->rotation) { - case CAMU_VIEW_ROTATION_0: - case CAMU_VIEW_ROTATION_360: - view->rotation = CAMU_VIEW_ROTATION_90; - break; - case CAMU_VIEW_ROTATION_270: - view->rotation = CAMU_VIEW_ROTATION_0; - break; - case CAMU_VIEW_ROTATION_180: - view->rotation = CAMU_VIEW_ROTATION_270; - break; - case CAMU_VIEW_ROTATION_90: - view->rotation = CAMU_VIEW_ROTATION_180; - break; - } - } else if (MOD1(scr)) { - switch (view->rotation) { - case CAMU_VIEW_ROTATION_0: - case CAMU_VIEW_ROTATION_360: - view->rotation = CAMU_VIEW_ROTATION_270; - break; - case CAMU_VIEW_ROTATION_270: - view->rotation = CAMU_VIEW_ROTATION_180; - break; - case CAMU_VIEW_ROTATION_180: - view->rotation = CAMU_VIEW_ROTATION_90; - break; - case CAMU_VIEW_ROTATION_90: - view->rotation = CAMU_VIEW_ROTATION_0; - break; - } - } else if (scr->vr_emulation) { - view->fov = AL_TO_RADIANS(CAMU_DEFAULT_FOV); - } else { - view->mode = CAMU_DEFAULT_VIEW; - } - camu_view_calculate(view, scr->width, scr->height); - return true; + case STELA_KEY_DOWN: { + s32 n = 1; + if (MOD1(scr)) { + scr->callback(scr->userdata, CAMU_SCREEN_AUDIO_TRACK, &n); + } else if (MOD2(scr)) { + scr->callback(scr->userdata, CAMU_SCREEN_SUBTITLE_TRACK, &n); } break; } - case STELA_KEY_T: { - struct camu_view *view = get_view_from_mouse_pos(scr); - if (view) { - scr->window->resize(scr->window, ceil(view->width * view->zoom), ceil(view->height * view->zoom)); - } + case STELA_KEY_E: + scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL); break; - } case STELA_KEY_EQUAL: { struct camu_view *view = get_view_from_mouse_pos(scr); if (view) { @@ -578,6 +548,69 @@ static bool key_callback(void *userdata, u8 state, u16 button) } break; } + case STELA_KEY_R: { + struct camu_view *view = get_view_from_mouse_pos(scr); + if (view) { + if (MOD2(scr)) { + switch (view->rotation) { + case CAMU_VIEW_ROTATION_0: + case CAMU_VIEW_ROTATION_360: + view->rotation = CAMU_VIEW_ROTATION_90; + break; + case CAMU_VIEW_ROTATION_270: + view->rotation = CAMU_VIEW_ROTATION_0; + break; + case CAMU_VIEW_ROTATION_180: + view->rotation = CAMU_VIEW_ROTATION_270; + break; + case CAMU_VIEW_ROTATION_90: + view->rotation = CAMU_VIEW_ROTATION_180; + break; + } + } else if (MOD1(scr)) { + switch (view->rotation) { + case CAMU_VIEW_ROTATION_0: + case CAMU_VIEW_ROTATION_360: + view->rotation = CAMU_VIEW_ROTATION_270; + break; + case CAMU_VIEW_ROTATION_270: + view->rotation = CAMU_VIEW_ROTATION_180; + break; + case CAMU_VIEW_ROTATION_180: + view->rotation = CAMU_VIEW_ROTATION_90; + break; + case CAMU_VIEW_ROTATION_90: + view->rotation = CAMU_VIEW_ROTATION_0; + break; + } + } else { + if (scr->vr_emulation) { + view->fov = AL_TO_RADIANS(CAMU_DEFAULT_FOV); + } else { + view->mode = CAMU_DEFAULT_VIEW; + } + view->rotation = view->default_rotation; + } + camu_view_calculate(view, scr->width, scr->height); + return true; + } + break; + } + case STELA_KEY_T: { + struct camu_view *view = get_view_from_mouse_pos(scr); + if (view) { + scr->window->resize(scr->window, ceil(view->width * view->zoom), ceil(view->height * view->zoom)); + } + break; + } + case STELA_KEY_0: + scr->callback(scr->userdata, CAMU_SCREEN_PRINT, NULL); + break; +#ifdef CAMU_SCREEN_DEBUG_KEY + case STELA_KEY_P: + scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL); + break; +#endif default: break; } @@ -586,8 +619,8 @@ static bool key_callback(void *userdata, u8 state, u16 button) switch (button) { case STELA_KEY_LEFT_CONTROL: case STELA_KEY_RIGHT_CONTROL: - if (scr->osd.shown_for & CAMU_OSD_SEEK) { - scr->osd.shown_for &= ~CAMU_OSD_SEEK; + scr->osd.shown_for &= ~CAMU_OSD_KEY_HELD; + if (scr->osd.shown_for == 0) { scr->osd.show = false; atomic_add(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED); } @@ -681,9 +714,9 @@ bool camu_screen_init(struct camu_screen *scr) scr->last_seek_ts = 0; #endif scr->touch_mode = false; - scr->osd.show_binds = false; - scr->osd.bar = -1.0; + scr->osd.show = false; scr->osd.flash = -1.0; + scr->osd.bar = -1.0; scr->vr_emulation = CAMU_VR_DISABLED; scr->vr_left_eye = false; scr->vr_calibrate_x = 0.5; @@ -954,17 +987,14 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force) } bool was_paused = scr->osd.paused; scr->callback(scr->userdata, CAMU_SCREEN_STATUS, &scr->osd); - if (!MOD1(scr)) { - if (scr->osd.flash >= 0.0) { - if (nn_get_tick() >= scr->osd.flash) { - scr->osd.flash = -1.0; - scr->osd.shown_for = 0; + if (scr->osd.flash >= 0.0) { + if (nn_get_tick() >= scr->osd.flash) { + scr->osd.flash = -1.0; + if (scr->osd.shown_for == 0) { scr->osd.show = false; - scr->osd.bar_mode = CAMU_OSD_BAR_PROGRESS; *force = true; - } else { - scr->osd.show = true; } + scr->osd.bar_mode = CAMU_OSD_BAR_PROGRESS; } } if (scr->osd.bar_mode == CAMU_OSD_BAR_SEEK) { @@ -977,7 +1007,9 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force) scr->osd.shown_for |= CAMU_OSD_PAUSE; } else if (scr->osd.shown_for & CAMU_OSD_PAUSE) { scr->osd.shown_for &= ~CAMU_OSD_PAUSE; - scr->osd.show = false; + if (scr->osd.shown_for == 0) { + scr->osd.show = false; + } } *force = true; } |