summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c250
-rw-r--r--src/screen/screen.h22
-rw-r--r--src/screen/view.c3
-rw-r--r--src/screen/view.h1
4 files changed, 159 insertions, 117 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;
}
diff --git a/src/screen/screen.h b/src/screen/screen.h
index c3dcd7d..0be414f 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -17,7 +17,7 @@
// Interpret click and drag as seeking. Mainly a seek performance test.
//#define CAMU_SCREEN_DRAG_SEEK
-#define CAMU_SCREEN_WIDTH 700
+#define CAMU_SCREEN_WIDTH 840
#define CAMU_SCREEN_HEIGHT 700
enum {
@@ -45,6 +45,8 @@ enum {
CAMU_SCREEN_PERCENT_SEEK, // f64
CAMU_SCREEN_RELATIVE_SEEK, // f64
CAMU_SCREEN_RESEEK,
+ CAMU_SCREEN_AUDIO_TRACK, // s32
+ CAMU_SCREEN_SUBTITLE_TRACK, // s32
CAMU_SCREEN_SHUFFLE,
CAMU_SCREEN_STATUS,
CAMU_SCREEN_PRINT,
@@ -60,10 +62,16 @@ struct camu_screen_video {
};
enum {
- CAMU_OSD_PAUSE = 1,
- CAMU_OSD_SEEK = 1 << 1,
- CAMU_OSD_VOLUME = 1 << 2,
- CAMU_OSD_EMPTY = 1 << 3
+ CAMU_OSD_CONNECTING = 1,
+ CAMU_OSD_PAUSE = 1 << 1,
+ CAMU_OSD_EMPTY = 1 << 2,
+ CAMU_OSD_TOGGLED = 1 << 3,
+ CAMU_OSD_ALT_TOGGLED = 1 << 4,
+ CAMU_OSD_KEY_HELD = 1 << 5
+};
+
+enum {
+ CAMU_OSD_ALT_BINDS = 1
};
enum {
@@ -76,13 +84,13 @@ enum {
struct camu_osd {
u32 show;
+ u8 alt;
u8 shown_for;
- bool show_binds;
+ f64 flash;
u32 connecting;
u32 paused;
u32 bar_mode;
f64 bar;
- f64 flash;
f64 pts;
u64 duration;
};
diff --git a/src/screen/view.c b/src/screen/view.c
index fadc81c..07b2c71 100644
--- a/src/screen/view.c
+++ b/src/screen/view.c
@@ -22,7 +22,8 @@
void camu_view_init(struct camu_view *view, u32 width, u32 height, u8 rotation)
{
view->mode = CAMU_DEFAULT_VIEW;
- view->rotation = rotation;
+ view->default_rotation = rotation;
+ view->rotation = view->default_rotation;
view->width = width;
view->height = height;
view->zindex = 0;
diff --git a/src/screen/view.h b/src/screen/view.h
index ae6a357..c1a0ed7 100644
--- a/src/screen/view.h
+++ b/src/screen/view.h
@@ -29,6 +29,7 @@ enum {
struct camu_view {
u8 mode;
+ u8 default_rotation;
u8 rotation;
u32 width;
u32 height;