mirror of
https://github.com/glfw/glfw.git
synced 2024-11-14 02:31:46 +00:00
Wayland: Fix reporting of monitor scale changes
Content scale events would be emitted when a window surface entered or
left an output, but not when one of a window's current outputs had its
scale changed.
(cherry picked from commit e37ba80b13
)
This commit is contained in:
parent
557da4cdc4
commit
48e0e0acf5
@ -172,6 +172,8 @@ information on what to include when reporting a bug.
|
|||||||
changed
|
changed
|
||||||
- [Wayland] Bugfix: `glfwTerminate` would segfault if any monitor had changed
|
- [Wayland] Bugfix: `glfwTerminate` would segfault if any monitor had changed
|
||||||
scale
|
scale
|
||||||
|
- [Wayland] Bugfix: Window content scale events were not emitted when monitor
|
||||||
|
scale changed
|
||||||
|
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
@ -111,6 +111,18 @@ static void outputHandleScale(void* userData,
|
|||||||
struct _GLFWmonitor* monitor = userData;
|
struct _GLFWmonitor* monitor = userData;
|
||||||
|
|
||||||
monitor->wl.scale = factor;
|
monitor->wl.scale = factor;
|
||||||
|
|
||||||
|
for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < window->wl.monitorsCount; i++)
|
||||||
|
{
|
||||||
|
if (window->wl.monitors[i] == monitor)
|
||||||
|
{
|
||||||
|
_glfwUpdateContentScaleWayland(window);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
|
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
|
||||||
|
@ -358,6 +358,7 @@ typedef struct _GLFWcursorWayland
|
|||||||
} _GLFWcursorWayland;
|
} _GLFWcursorWayland;
|
||||||
|
|
||||||
void _glfwAddOutputWayland(uint32_t name, uint32_t version);
|
void _glfwAddOutputWayland(uint32_t name, uint32_t version);
|
||||||
|
void _glfwUpdateContentScaleWayland(_GLFWwindow* window);
|
||||||
GLFWbool _glfwInputTextWayland(_GLFWwindow* window, uint32_t scancode);
|
GLFWbool _glfwInputTextWayland(_GLFWwindow* window, uint32_t scancode);
|
||||||
|
|
||||||
void _glfwAddSeatListenerWayland(struct wl_seat* seat);
|
void _glfwAddSeatListenerWayland(struct wl_seat* seat);
|
||||||
|
@ -376,7 +376,7 @@ static void resizeWindow(_GLFWwindow* window)
|
|||||||
wl_surface_commit(window->wl.decorations.bottom.surface);
|
wl_surface_commit(window->wl.decorations.bottom.surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkScaleChange(_GLFWwindow* window)
|
void _glfwUpdateContentScaleWayland(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
if (_glfw.wl.compositorVersion < WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION)
|
if (_glfw.wl.compositorVersion < WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION)
|
||||||
return;
|
return;
|
||||||
@ -414,7 +414,7 @@ static void surfaceHandleEnter(void* userData,
|
|||||||
|
|
||||||
window->wl.monitors[window->wl.monitorsCount++] = monitor;
|
window->wl.monitors[window->wl.monitorsCount++] = monitor;
|
||||||
|
|
||||||
checkScaleChange(window);
|
_glfwUpdateContentScaleWayland(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void surfaceHandleLeave(void* userData,
|
static void surfaceHandleLeave(void* userData,
|
||||||
@ -435,7 +435,7 @@ static void surfaceHandleLeave(void* userData,
|
|||||||
}
|
}
|
||||||
window->wl.monitors[--window->wl.monitorsCount] = NULL;
|
window->wl.monitors[--window->wl.monitorsCount] = NULL;
|
||||||
|
|
||||||
checkScaleChange(window);
|
_glfwUpdateContentScaleWayland(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_surface_listener surfaceListener =
|
static const struct wl_surface_listener surfaceListener =
|
||||||
|
Loading…
Reference in New Issue
Block a user