From bcb3942469b9e297588f5bc0165ce4cef9802c07 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 10 May 2020 18:52:22 +0200 Subject: [PATCH] Detect fullscreen changes The window state may be changed by the window manager without scrcpy being aware of it (for example the fullscreen mode on macOS). Check on every "size changed" event whether the fullscreen mode has changed. --- app/src/screen.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/screen.c b/app/src/screen.c index 869ae0e0..0c6a2ddf 100644 --- a/app/src/screen.c +++ b/app/src/screen.c @@ -517,6 +517,26 @@ screen_resize_to_pixel_perfect(struct screen *screen) { content_size.height); } +static inline bool +is_fullscreen(const struct screen *screen) { + uint32_t flags = SDL_GetWindowFlags(screen->window); + return !!(flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP)); +} + +static void +update_fullscreen_state(struct screen *screen) { + // There is no SDL event to detect fullscreen changes, so store the + // state in a field and compare on every "size changed" event + bool fullscreen = is_fullscreen(screen); + if (fullscreen != screen->fullscreen) { + // Fullscreen state have changed + screen->fullscreen = fullscreen; + if (!fullscreen && !screen->maximized) { + apply_pending_resize(screen); + } + } +} + void screen_handle_window_event(struct screen *screen, const SDL_WindowEvent *event) { @@ -525,6 +545,7 @@ screen_handle_window_event(struct screen *screen, screen_render(screen); break; case SDL_WINDOWEVENT_SIZE_CHANGED: + update_fullscreen_state(screen); screen_render(screen); break; case SDL_WINDOWEVENT_MAXIMIZED: