diff options
| author | 2025-02-19 13:40:38 -0500 | |
|---|---|---|
| committer | 2025-02-19 13:40:38 -0500 | |
| commit | 2bee71a7e032c0972418e324bb1d7e6b02330b18 (patch) | |
| tree | fa5819e9d9efe75cbc6f50d462dd0eb6bd19b6a2 /src/screen | |
| parent | b36f022defd8d4ec5a8c29578bb583bea05dfbb6 (diff) | |
| download | camu-2bee71a7e032c0972418e324bb1d7e6b02330b18.tar.gz camu-2bee71a7e032c0972418e324bb1d7e6b02330b18.tar.bz2 camu-2bee71a7e032c0972418e324bb1d7e6b02330b18.zip | |
Server resource unload, many tweaks and fixes
- Initial liana client preferences.
- Hook up libplacebo dx11 backend.
- Make usage of FFmpeg hardware decoding api make some sense.
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/screen.c | 55 | ||||
| -rw-r--r-- | src/screen/screen.h | 6 |
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 |