From 5edd5a26178aecbf90394dddbb810de375cd155f 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 5c1c0a93..bb579e7b 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: