Compare commits

...

5 Commits

Author SHA1 Message Date
22ec47142c more logs 2020-05-13 11:47:59 +02:00
fe76bf3ebb fix 2020-05-13 11:45:58 +02:00
5024b67b9c tests 2020-05-13 11:37:50 +02:00
2b8239c047 log window flags on size change 2020-05-12 22:33:57 +02:00
bcb3942469 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.
2020-05-12 22:33:57 +02:00

View File

@ -488,6 +488,9 @@ screen_resize_to_fit(struct screen *screen) {
return;
}
int flags = SDL_GetWindowFlags(screen->window);
LOGI("resize to fit (%d 0x%x)", screen->maximized, flags);
if (screen->maximized) {
SDL_RestoreWindow(screen->window);
screen->maximized = false;
@ -496,7 +499,7 @@ screen_resize_to_fit(struct screen *screen) {
struct size optimal_size =
get_optimal_window_size(screen, screen->content_size);
SDL_SetWindowSize(screen->window, optimal_size.width, optimal_size.height);
LOGD("Resized to optimal size: %ux%u", optimal_size.width,
LOGI("Resized to optimal size: %ux%u", optimal_size.width,
optimal_size.height);
}
@ -517,20 +520,46 @@ 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);
LOGI("flags = 0x%x", flags);
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) {
switch (event->event) {
case SDL_WINDOWEVENT_EXPOSED:
LOGI("EXPOSED");
screen_render(screen);
break;
case SDL_WINDOWEVENT_SIZE_CHANGED:
LOGI("SIZE_CHANGED %dx%d", event->data1, event->data2);
//update_fullscreen_state(screen);
screen_render(screen);
break;
case SDL_WINDOWEVENT_MAXIMIZED:
LOGI("MAXIMIZED");
screen->maximized = true;
break;
case SDL_WINDOWEVENT_RESTORED:
LOGI("RESTORED");
if (screen->fullscreen) {
// On Windows, in maximized+fullscreen, disabling fullscreen
// mode unexpectedly triggers the "restored" then "maximized"