mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-05-17 02:08:27 +00:00
Added SDL_EVENT_DISPLAY_SCALE_CHANGED
This commit is contained in:
parent
16f4e37bb5
commit
6b87d1938f
6 changed files with 30 additions and 6 deletions
|
@ -93,8 +93,9 @@ typedef enum
|
||||||
SDL_EVENT_DISPLAY_CONNECTED, /**< Display has been added to the system */
|
SDL_EVENT_DISPLAY_CONNECTED, /**< Display has been added to the system */
|
||||||
SDL_EVENT_DISPLAY_DISCONNECTED, /**< Display has been removed from the system */
|
SDL_EVENT_DISPLAY_DISCONNECTED, /**< Display has been removed from the system */
|
||||||
SDL_EVENT_DISPLAY_MOVED, /**< Display has changed position */
|
SDL_EVENT_DISPLAY_MOVED, /**< Display has changed position */
|
||||||
|
SDL_EVENT_DISPLAY_SCALE_CHANGED, /**< Display has changed desktop display scale */
|
||||||
SDL_EVENT_DISPLAY_FIRST = SDL_EVENT_DISPLAY_ORIENTATION,
|
SDL_EVENT_DISPLAY_FIRST = SDL_EVENT_DISPLAY_ORIENTATION,
|
||||||
SDL_EVENT_DISPLAY_LAST = SDL_EVENT_DISPLAY_DISCONNECTED,
|
SDL_EVENT_DISPLAY_LAST = SDL_EVENT_DISPLAY_SCALE_CHANGED,
|
||||||
|
|
||||||
/* Window events */
|
/* Window events */
|
||||||
/* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */
|
/* 0x200 was SDL_WINDOWEVENT, reserve the number for sdl2-compat */
|
||||||
|
|
|
@ -28,7 +28,7 @@ int SDL_SendDisplayEvent(SDL_VideoDisplay *display, SDL_EventType displayevent,
|
||||||
{
|
{
|
||||||
int posted;
|
int posted;
|
||||||
|
|
||||||
if (display == NULL) {
|
if (display == NULL || display->id == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
switch (displayevent) {
|
switch (displayevent) {
|
||||||
|
|
|
@ -223,6 +223,7 @@ static void SDL_LogEvent(const SDL_Event *event)
|
||||||
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_CONNECTED);
|
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_CONNECTED);
|
||||||
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_DISCONNECTED);
|
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_DISCONNECTED);
|
||||||
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_MOVED);
|
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_MOVED);
|
||||||
|
SDL_DISPLAYEVENT_CASE(SDL_EVENT_DISPLAY_SCALE_CHANGED);
|
||||||
#undef SDL_DISPLAYEVENT_CASE
|
#undef SDL_DISPLAYEVENT_CASE
|
||||||
|
|
||||||
#define SDL_WINDOWEVENT_CASE(x) \
|
#define SDL_WINDOWEVENT_CASE(x) \
|
||||||
|
|
|
@ -1511,6 +1511,17 @@ static void SDLTest_PrintEvent(SDL_Event *event)
|
||||||
SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " connected",
|
SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " connected",
|
||||||
event->display.displayID);
|
event->display.displayID);
|
||||||
break;
|
break;
|
||||||
|
case SDL_EVENT_DISPLAY_SCALE_CHANGED:
|
||||||
|
{
|
||||||
|
float display_scale = 1.0f;
|
||||||
|
const SDL_DisplayMode *mode = SDL_GetDesktopDisplayMode(event->display.displayID);
|
||||||
|
if (mode) {
|
||||||
|
display_scale = mode->display_scale;
|
||||||
|
}
|
||||||
|
SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " changed scale to %d%%",
|
||||||
|
event->display.displayID, (int)(display_scale * 100.0f));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SDL_EVENT_DISPLAY_MOVED:
|
case SDL_EVENT_DISPLAY_MOVED:
|
||||||
SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " changed position",
|
SDL_Log("SDL EVENT: Display %" SDL_PRIu32 " changed position",
|
||||||
event->display.displayID);
|
event->display.displayID);
|
||||||
|
|
|
@ -1077,9 +1077,15 @@ const SDL_DisplayMode *SDL_GetClosestFullscreenDisplayMode(SDL_DisplayID display
|
||||||
|
|
||||||
void SDL_SetDesktopDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
|
void SDL_SetDesktopDisplayMode(SDL_VideoDisplay *display, const SDL_DisplayMode *mode)
|
||||||
{
|
{
|
||||||
|
float display_scale = display->desktop_mode.display_scale;
|
||||||
|
|
||||||
SDL_memcpy(&display->desktop_mode, mode, sizeof(*mode));
|
SDL_memcpy(&display->desktop_mode, mode, sizeof(*mode));
|
||||||
display->desktop_mode.displayID = display->id;
|
display->desktop_mode.displayID = display->id;
|
||||||
SDL_FinalizeDisplayMode(&display->desktop_mode);
|
SDL_FinalizeDisplayMode(&display->desktop_mode);
|
||||||
|
|
||||||
|
if (display_scale != display->desktop_mode.display_scale) {
|
||||||
|
SDL_SendDisplayEvent(display, SDL_EVENT_DISPLAY_SCALE_CHANGED, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const SDL_DisplayMode *SDL_GetDesktopDisplayMode(SDL_DisplayID displayID)
|
const SDL_DisplayMode *SDL_GetDesktopDisplayMode(SDL_DisplayID displayID)
|
||||||
|
|
|
@ -324,6 +324,7 @@ static void WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info,
|
||||||
SDL_DisplayData *driverdata = _this->displays[i].driverdata;
|
SDL_DisplayData *driverdata = _this->displays[i].driverdata;
|
||||||
if (SDL_wcscmp(driverdata->DeviceName, info->szDevice) == 0) {
|
if (SDL_wcscmp(driverdata->DeviceName, info->szDevice) == 0) {
|
||||||
SDL_bool moved = (index != i);
|
SDL_bool moved = (index != i);
|
||||||
|
SDL_bool changed_bounds = SDL_FALSE;
|
||||||
|
|
||||||
if (moved) {
|
if (moved) {
|
||||||
SDL_VideoDisplay tmp;
|
SDL_VideoDisplay tmp;
|
||||||
|
@ -343,10 +344,14 @@ static void WIN_AddDisplay(_THIS, HMONITOR hMonitor, const MONITORINFOEXW *info,
|
||||||
SDL_Rect bounds;
|
SDL_Rect bounds;
|
||||||
|
|
||||||
SDL_ResetFullscreenDisplayModes(existing_display);
|
SDL_ResetFullscreenDisplayModes(existing_display);
|
||||||
if (WIN_GetDisplayBounds(_this, existing_display, &bounds) == 0) {
|
SDL_SetDesktopDisplayMode(existing_display, &mode);
|
||||||
if (SDL_memcmp(&driverdata->bounds, &bounds, sizeof(bounds)) != 0 || moved) {
|
if (WIN_GetDisplayBounds(_this, existing_display, &bounds) == 0 &&
|
||||||
SDL_SendDisplayEvent(existing_display, SDL_EVENT_DISPLAY_MOVED, 0);
|
SDL_memcmp(&driverdata->bounds, &bounds, sizeof(bounds)) != 0) {
|
||||||
}
|
changed_bounds = SDL_TRUE;
|
||||||
|
SDL_copyp(&driverdata->bounds, &bounds);
|
||||||
|
}
|
||||||
|
if (moved || changed_bounds) {
|
||||||
|
SDL_SendDisplayEvent(existing_display, SDL_EVENT_DISPLAY_MOVED, 0);
|
||||||
}
|
}
|
||||||
SDL_SendDisplayEvent(existing_display, SDL_EVENT_DISPLAY_ORIENTATION, orientation);
|
SDL_SendDisplayEvent(existing_display, SDL_EVENT_DISPLAY_ORIENTATION, orientation);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue