summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c55
-rw-r--r--src/screen/screen.h6
2 files changed, 32 insertions, 29 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index cb49188..3312d77 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -42,7 +42,6 @@ static void resize_callback(void *userdata, u32 width, u32 height)
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
}
- al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
}
static void refresh_callback(void *userdata)
@@ -67,16 +66,7 @@ static bool pointer_pos_callback(void *userdata, f64 x, f64 y)
struct camu_view *view = get_view_from_mouse_pos(scr);
bool queue_refresh = false;
if (scr->flags & CAMU_SCREEN_DRAGGING) {
- if (scr->flags & CAMU_SCREEN_MOD_CONTROL) {
- u64 now = nn_get_timestamp();
- if (scr->last_seek_ts == SCREEN_INVALID_TS) {
- scr->last_seek_ts = now;
- }
- if (now - scr->last_seek_ts > 100000) {
- scr->last_seek_ts = now;
- seek_to_percent_at_pointer(scr);
- }
- } else if (view && scr->flags & CAMU_SCREEN_ZOOM_PAN_SIMPLE) {
+ if (view && scr->flags & CAMU_SCREEN_ZOOM_PAN_SIMPLE) {
f64 dx = x - scr->last_mouse_x;
f64 dy = y - scr->last_mouse_y;
if (camu_view_pan_simple(view, scr->width, scr->height, dx, dy)) {
@@ -102,13 +92,10 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
case STELA_BUTTON_PRESSED:
scr->flags |= CAMU_SCREEN_DRAGGING;
scr->last_click_ts = nn_get_timestamp();
- //scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
break;
case STELA_BUTTON_RELEASED:
scr->flags &= ~CAMU_SCREEN_DRAGGING;
- //scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
- if (scr->last_click_ts != SCREEN_INVALID_TS &&
- (nn_get_timestamp() - scr->last_click_ts <= 300000)) {
+ if (scr->last_click_ts != SCREEN_INVALID_TS && nn_get_timestamp() - scr->last_click_ts <= 300000) {
if (scr->flags & CAMU_SCREEN_MOD_CONTROL) {
seek_to_percent_at_pointer(scr);
} else {
@@ -148,9 +135,9 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
}
#ifdef STELA_WINDOW_WAYLAND
-#define SCROLL_MULTIPLIER 155.0
+#define SCROLL_MULTIPLIER 160.0
#else
-#define SCROLL_MULTIPLIER 13.0
+#define SCROLL_MULTIPLIER 20.0
#endif
static bool scroll_callback(void *userdata, f64 y)
@@ -168,7 +155,7 @@ static bool scroll_callback(void *userdata, f64 y)
}
}
} else {
- scr->callback(scr->userdata, CAMU_SCREEN_VOLUME, &y);
+ scr->callback(scr->userdata, CAMU_SCREEN_OFFSET_VOLUME, &y);
}
return false;
}
@@ -187,6 +174,7 @@ static bool key_callback(void *userdata, u8 state, u8 button)
scr->flags |= CAMU_SCREEN_MOD_CONTROL;
break;
case 0x10: // q
+ case 0x18: // q (spice?)
scr->callback(scr->userdata, CAMU_SCREEN_CLOSE, NULL);
break;
case 0x31: // n
@@ -202,6 +190,7 @@ static bool key_callback(void *userdata, u8 state, u8 button)
scr->callback(scr->userdata, CAMU_SCREEN_PREVIOUS, NULL);
break;
case 0x39: // spacebar
+ case 0x41: // spacebar (spice?)
scr->callback(scr->userdata, CAMU_SCREEN_TOGGLE_PAUSE, NULL);
break;
case 0x1f: // s
@@ -210,6 +199,15 @@ static bool key_callback(void *userdata, u8 state, u8 button)
case 0x12: // e
scr->callback(scr->userdata, CAMU_SCREEN_RESEEK, NULL);
break;
+ case 0x2f: { // v
+ f32 volume = 1.0;
+ scr->callback(scr->userdata, CAMU_SCREEN_SET_VOLUME, &volume);
+ break;
+ case 0xb: {
+ scr->callback(scr->userdata, CAMU_SCREEN_STATUS, NULL);
+ break;
+ }
+ }
#ifdef CAMU_SCREEN_DEBUG_KEY
case 0x19: // p
scr->callback(scr->userdata, CAMU_SCREEN_DEBUG, NULL);
@@ -299,14 +297,11 @@ static void key_immediate_callback(void *userdata, u8 state, u8 button)
switch (state) {
case STELA_BUTTON_PRESSED:
switch (button) {
- case 0x21: // f
+ case 0x21: { // f
scr->window->toggle_fullscreen(scr->window);
- // Least intrusive workaround I can think of for the egl resizing issue.
- // Will only work for fullscreening, things like toggling floating state
- // on sway are still broken.
- al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
break;
}
+ }
break;
default:
break;
@@ -327,7 +322,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;
- al_atomic_store(u32)(&scr->force_refresh, 0, AL_ATOMIC_RELAXED);
+ al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
scr->flags = CAMU_SCREEN_ZOOM_PAN_SIMPLE;
scr->last_click_ts = SCREEN_INVALID_TS;
scr->last_mouse_x = 0.0;
@@ -376,6 +371,8 @@ bool camu_screen_create_renderer(struct camu_screen *scr, struct camu_renderer *
scr->window->get_vk_proc_address,
scr->window->vk_create_surface,
scr->window->vk_get_extensions,
+#elif defined CAMU_RENDERER_DX11
+ scr->window->win32_window,
#elif defined CAMU_RENDERER_OPENGL
#ifdef STELA_USE_EGL
scr->window->egl_display,
@@ -420,7 +417,6 @@ static void add_buffer_internal(struct camu_screen *scr, struct camu_video_buffe
#ifdef CAMU_SCREEN_THREADED
al_atomic_store(u8)(&buf->ref, 1, AL_ATOMIC_RELAXED);
#endif
- //al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
al_array_push(scr->videos, video);
}
@@ -447,7 +443,7 @@ static void run_queue_internal(struct camu_screen *scr)
remove_buffer_internal(scr, buf);
}
scr->rem_queue.count = 0;
- // src->videos cannot be touched outside of the add/remove queue context.
+ // src->videos cannot be touched from outside of the render context.
// For example, reserving space inside of screen_add_buffer() instead
// of here would be very wrong.
al_array_reserve(scr->videos, scr->videos.count + scr->add_queue.count);
@@ -544,7 +540,12 @@ void camu_screen_clear(struct camu_screen *scr)
void camu_screen_set_state(struct camu_screen *scr, s32 state)
{
// @TODO: What to do if a buffer is queued for removal and we pause here.
- al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELAXED);
+ if (al_atomic_load(s32)(&scr->state, AL_ATOMIC_ACQUIRE) != CAMU_SCREEN_STOPPED) {
+ al_atomic_store(s32)(&scr->state, state, AL_ATOMIC_RELEASE);
+ if (state == CAMU_SCREEN_PAUSED) {
+ al_atomic_store(u32)(&scr->force_refresh, 1, AL_ATOMIC_RELAXED);
+ }
+ }
}
void camu_screen_force_refresh(struct camu_screen *scr)
diff --git a/src/screen/screen.h b/src/screen/screen.h
index 0b8ed33..2050d78 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -12,7 +12,7 @@
#include "view.h"
-#define CAMU_SCREEN_DEBUG_KEY
+//#define CAMU_SCREEN_DEBUG_KEY
#define CAMU_SCREEN_WIDTH 700
#define CAMU_SCREEN_HEIGHT 700
@@ -37,7 +37,9 @@ enum {
CAMU_SCREEN_TOGGLE_PAUSE,
CAMU_SCREEN_SEEK,
CAMU_SCREEN_RESEEK,
- CAMU_SCREEN_VOLUME,
+ CAMU_SCREEN_SET_VOLUME,
+ CAMU_SCREEN_OFFSET_VOLUME,
+ CAMU_SCREEN_STATUS,
#ifdef CAMU_SCREEN_DEBUG_KEY
CAMU_SCREEN_DEBUG,
#endif