mirror of
https://github.com/Genymobile/scrcpy.git
synced 2025-08-03 06:39:39 +00:00
Extract out logical size update operation into screen.c
This commit is contained in:
parent
48e10b9daa
commit
8313e60ee2
3 changed files with 23 additions and 11 deletions
|
@ -83,18 +83,10 @@ static SDL_bool event_loop(void) {
|
||||||
switch (event.window.event) {
|
switch (event.window.event) {
|
||||||
case SDL_WINDOWEVENT_EXPOSED:
|
case SDL_WINDOWEVENT_EXPOSED:
|
||||||
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
case SDL_WINDOWEVENT_SIZE_CHANGED:
|
||||||
screen_render(&screen);
|
if (!screen_update_logical_size_if_needed(&screen)) {
|
||||||
int scale_x, scale_y;
|
return SDL_FALSE;
|
||||||
get_window_scale(SDL_GetWindowFromID(event.button.windowID), &scale_x, &scale_y);
|
|
||||||
if (scale_x != screen.scale_x || scale_y != screen.scale_y) {
|
|
||||||
int logical_width, logical_height;
|
|
||||||
SDL_RenderGetLogicalSize(screen.renderer, &logical_width, &logical_height);
|
|
||||||
logical_width *= (float)scale_x / screen.scale_x;
|
|
||||||
logical_height *= (float)scale_y / screen.scale_y;
|
|
||||||
screen.scale_x = scale_x;
|
|
||||||
screen.scale_y = scale_y;
|
|
||||||
SDL_RenderSetLogicalSize(screen.renderer, logical_width, logical_height);
|
|
||||||
}
|
}
|
||||||
|
screen_render(&screen);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -74,6 +74,24 @@ void get_window_scale(SDL_Window *window, int *scale_x, int *scale_y) {
|
||||||
*scale_y = output_h / win_h;
|
*scale_y = output_h / win_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_bool screen_update_logical_size_if_needed(struct screen *screen) {
|
||||||
|
int scale_x, scale_y;
|
||||||
|
get_window_scale(screen->window, &scale_x, &scale_y);
|
||||||
|
if (scale_x != screen->scale_x || scale_y != screen->scale_y) {
|
||||||
|
int logical_width, logical_height;
|
||||||
|
SDL_RenderGetLogicalSize(screen->renderer, &logical_width, &logical_height);
|
||||||
|
logical_width *= (float)scale_x / screen->scale_x;
|
||||||
|
logical_height *= (float)scale_y / screen->scale_y;
|
||||||
|
screen->scale_x = scale_x;
|
||||||
|
screen->scale_y = scale_y;
|
||||||
|
if (SDL_RenderSetLogicalSize(screen->renderer, logical_width, logical_height)) {
|
||||||
|
LOGE("Could not set renderer logical size: %s", SDL_GetError());
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return SDL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
// get the preferred display bounds (i.e. the screen bounds with some margins)
|
// get the preferred display bounds (i.e. the screen bounds with some margins)
|
||||||
static SDL_bool get_preferred_display_bounds(struct size *bounds) {
|
static SDL_bool get_preferred_display_bounds(struct size *bounds) {
|
||||||
SDL_Rect rect;
|
SDL_Rect rect;
|
||||||
|
|
|
@ -70,4 +70,6 @@ void screen_resize_to_pixel_perfect(struct screen *screen);
|
||||||
|
|
||||||
void get_window_scale(SDL_Window *window, int *scale_x, int *scale_y);
|
void get_window_scale(SDL_Window *window, int *scale_x, int *scale_y);
|
||||||
|
|
||||||
|
SDL_bool screen_update_logical_size_if_needed(struct screen *screen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue