summaryrefslogtreecommitdiff
path: root/src/screen
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen')
-rw-r--r--src/screen/screen.c20
-rw-r--r--src/screen/screen.h1
2 files changed, 14 insertions, 7 deletions
diff --git a/src/screen/screen.c b/src/screen/screen.c
index e76650f..e6f9970 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -30,11 +30,16 @@ static void should_close_callback(void *userdata)
static void resize_callback(void *userdata, s32 width, s32 height)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
+ bool fullscreen = scr->window->fullscreen;
if (scr->renderer) {
- scr->renderer->resize(scr->renderer, &width, &height);
+ // Checking if window->fullscreen changed here relies on the order of resize events.
+ // If it's possible for a different resize to be buffered before the resize
+ // of the fullscreen toggle, this may not work as expected.
+ scr->renderer->resize(scr->renderer, &width, &height, fullscreen != scr->last_fullscreen);
}
scr->width = width;
scr->height = height;
+ scr->last_fullscreen = fullscreen;
struct camu_screen_video *video;
al_array_foreach_ptr(scr->videos, i, video) {
camu_view_calculate(&video->view, scr->width, scr->height);
@@ -316,6 +321,7 @@ bool camu_screen_create_window(struct camu_screen *scr, const char *name)
}
scr->width = scr->window->width;
scr->height = scr->window->height;
+ scr->last_fullscreen = false;
#ifdef STELA_EVENT_BUFFER
nn_thread_create(&scr->thread, event_thread, scr);
#endif
@@ -357,7 +363,7 @@ static void add_buffer_internal(struct camu_screen *scr, struct camu_video_buffe
if (buf->view.mode != CAMU_VIEW_NONE) {
video.view = buf->view;
#if 0
- } else if (!al_array_is_empty(scr->videos)) {
+ } else if (scr->videos.count > 0) {
video.view = al_array_last(scr->videos).view;
video.view.width = fmt->width;
video.view.height = fmt->height;
@@ -400,15 +406,15 @@ static void run_queue_internal(struct camu_screen *scr)
al_array_foreach(scr->rem_queue, i, buf) {
remove_buffer_internal(scr, buf);
}
- scr->rem_queue.size = 0;
+ scr->rem_queue.count = 0;
// src->videos cannot be touched outside of the add/remove queue context.
// For example, reserving space inside of screen_add_buffer() instead
// of here would be very wrong.
- al_array_reserve(scr->videos, scr->videos.size + scr->add_queue.size);
+ al_array_reserve(scr->videos, scr->videos.count + scr->add_queue.count);
al_array_foreach(scr->add_queue, i, buf) {
add_buffer_internal(scr, buf);
}
- scr->add_queue.size = 0;
+ scr->add_queue.count = 0;
}
#endif
@@ -426,7 +432,7 @@ void camu_screen_add_buffer(struct camu_screen *scr, struct camu_video_buffer *b
al_array_foreach_rev(scr->rem_queue, i, rbuf) {
if (rbuf == buf) {
al_array_remove_at(scr->rem_queue, i);
- bool queue_empty = scr->add_queue.size + scr->rem_queue.size == 0;
+ bool queue_empty = scr->add_queue.count + scr->rem_queue.count == 0;
if (queue_empty) {
al_atomic_store(u8)(&scr->queued, 0, AL_ATOMIC_RELAXED);
}
@@ -457,7 +463,7 @@ void camu_screen_remove_buffer(struct camu_screen *scr, struct camu_video_buffer
al_array_foreach_rev(scr->add_queue, i, rbuf) {
if (rbuf == buf) {
al_array_remove_at(scr->add_queue, i);
- bool queue_empty = scr->add_queue.size + scr->rem_queue.size == 0;
+ bool queue_empty = scr->add_queue.count + scr->rem_queue.count == 0;
if (queue_empty) {
al_atomic_store(u8)(&scr->queued, 0, AL_ATOMIC_RELAXED);
}
diff --git a/src/screen/screen.h b/src/screen/screen.h
index d567521..c84cfc0 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -59,6 +59,7 @@ struct camu_screen {
bool force_render;
s32 width;
s32 height;
+ bool last_fullscreen;
u64 last_click_ts;
f64 last_mouse_y;
f64 last_mouse_x;