summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c52
-rw-r--r--src/screen/screen.h4
2 files changed, 36 insertions, 20 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 8e3ecbd..b4f65c2 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -2,8 +2,6 @@
#include <nnwt/thread.h>
#include <math.h>
-#include "../liana/list.h"
-
#include "view.h"
#include "screen.h"
@@ -46,7 +44,7 @@ static void resize_callback(void *userdata, s32 width, s32 height)
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
}
- scr->force_render = true;
+ scr->force_refresh = true;
}
static void refresh_callback(void *userdata)
@@ -58,6 +56,13 @@ static void refresh_callback(void *userdata)
}
}
+static void seek_to_percent_at_pointer(struct camu_screen *scr)
+{
+ f64 percent = scr->last_mouse_x / scr->width;
+ percent = CLAMP(percent, 0.0, 100.0);
+ scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent);
+}
+
static bool pointer_pos_callback(void *userdata, f64 x, f64 y)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
@@ -74,6 +79,15 @@ static bool pointer_pos_callback(void *userdata, f64 x, f64 y)
queue_refresh = true;
}
if (fabs(dx) + fabs(dy) > 3.0) scr->last_click_ts = 0;
+ } else {
+ u64 now = nn_get_timestamp();
+ if (!scr->last_click_ts) {
+ scr->last_click_ts = now;
+ }
+ if (now - scr->last_seek_ts > 100000) {
+ scr->last_seek_ts = now;
+ seek_to_percent_at_pointer(scr);
+ }
}
}
}
@@ -96,9 +110,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
scr->flags &= ~CAMU_SCREEN_DRAGGING;
if (scr->last_click_ts && nn_get_timestamp() - scr->last_click_ts <= 300000) {
if (scr->flags & CAMU_SCREEN_MODIFIER) {
- f64 percent = scr->last_mouse_x / scr->width;
- percent = CLAMP(percent, 0.0, 100.0);
- scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent);
+ seek_to_percent_at_pointer(scr);
} else {
if (scr->last_mouse_x >= scr->width / 2.f) {
scr->callback(scr->userdata, CAMU_SCREEN_NEXT, NULL);
@@ -123,9 +135,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
case STELA_MOUSE3: {
switch (state) {
case STELA_BUTTON_RELEASED: {
- f64 percent = scr->last_mouse_x / scr->width;
- percent = CLAMP(percent, 0.0, 100.0);
- scr->callback(scr->userdata, CAMU_SCREEN_SEEK, &percent);
+ seek_to_percent_at_pointer(scr);
break;
}
}
@@ -291,7 +301,7 @@ bool camu_screen_init(struct camu_screen *scr, void *context)
scr->window->should_close_callback = should_close_callback;
scr->window->userdata = scr;
scr->renderer = NULL;
- scr->force_render = false;
+ scr->force_refresh = false;
scr->flags = CAMU_SCREEN_ZOOM_PAN_SIMPLE;
scr->last_mouse_x = 0.0;
scr->last_mouse_y = 0.0;
@@ -418,6 +428,7 @@ static void run_queue_internal(struct camu_screen *scr)
add_buffer_internal(scr, buf);
}
scr->add_queue.count = 0;
+ //scr->force_refresh = scr->videos.count == 0;
}
#endif
@@ -509,13 +520,19 @@ void camu_screen_set_state(struct camu_screen *scr, s32 state)
al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELAXED);
}
+void camu_screen_force_refresh(struct camu_screen *scr)
+{
+ scr->force_refresh = true;
+ camu_screen_wake(scr);
+}
+
#define CAMU_SCREEN_POLL_HZ 576
bool camu_screen_poll(struct camu_screen *scr, bool block)
{
#ifdef STELA_EVENT_BUFFER
if (block) {
- nn_thread_sleep(NNWT_TS_FROM_USEC(1000000/CAMU_SCREEN_POLL_HZ));
+ nn_thread_sleep(NNWT_TS_FROM_USEC(1000000 / CAMU_SCREEN_POLL_HZ));
}
stl_window_read_events(scr->window);
#else
@@ -534,11 +551,11 @@ bool camu_screen_tick(struct camu_screen *scr, bool *force)
s32 state = al_atomic_load(s32)(&scr->state, AL_ATOMIC_RELAXED);
al_assert(state != CAMU_SCREEN_STOPPED);
bool paused = state == CAMU_SCREEN_PAUSED;
- bool render = camu_screen_poll(scr, paused) || !paused;
- render |= scr->force_render;
- *force = scr->force_render;
- scr->force_render = false;
- return render;
+ bool do_render = camu_screen_poll(scr, paused) || !paused;
+ do_render |= scr->force_refresh;
+ *force = scr->force_refresh;
+ scr->force_refresh = false;
+ return do_render;
}
void camu_screen_wake(struct camu_screen *scr)
@@ -548,9 +565,6 @@ void camu_screen_wake(struct camu_screen *scr)
#else
(void)scr;
#endif
-#ifndef LIANA_LIST_SCUFFED_LOOP
- scr->force_render = true;
-#endif
}
void camu_screen_close(struct camu_screen *scr)
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 7203018..e0d1fc3 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -55,7 +55,7 @@ struct camu_screen {
struct nn_thread thread;
#endif
struct camu_renderer *renderer;
- bool force_render;
+ bool force_refresh;
u32 flags;
s32 width;
s32 height;
@@ -63,6 +63,7 @@ struct camu_screen {
u64 last_click_ts;
f64 last_mouse_y;
f64 last_mouse_x;
+ u64 last_seek_ts;
array(struct camu_screen_video) videos;
#ifdef CAMU_SCREEN_THREADED
array(struct camu_video_buffer *) add_queue;
@@ -84,6 +85,7 @@ void camu_screen_run_queue(struct camu_screen *scr);
void camu_screen_clear(struct camu_screen *scr);
#endif
void camu_screen_set_state(struct camu_screen *scr, s32 state);
+void camu_screen_force_refresh(struct camu_screen *scr);
bool camu_screen_poll(struct camu_screen *scr, bool block);
bool camu_screen_tick(struct camu_screen *scr, bool *force);
void camu_screen_wake(struct camu_screen *scr);