Wayland: Add support for wl_output::name

We now use wl_output::name as the GLFW monitor name, on compositors that
provide this event.

(cherry picked from commit 209f6cf093)
This commit is contained in:
Camilla Löwy 2022-06-14 18:20:56 +02:00
parent 2529e663d7
commit 50ea41cb04
2 changed files with 31 additions and 2 deletions

View File

@ -139,6 +139,7 @@ information on what to include when reporting a bug.
- [X11] Bugfix: A malformed response during selection transfer could cause a segfault - [X11] Bugfix: A malformed response during selection transfer could cause a segfault
- [X11] Bugfix: Some calls would reset Xlib to the default error handler (#2108) - [X11] Bugfix: Some calls would reset Xlib to the default error handler (#2108)
- [Wayland] Added support for file path drop events (#2040) - [Wayland] Added support for file path drop events (#2040)
- [Wayland] Added support for more human-readable monitor names where available
- [Wayland] Removed support for the deprecated wl\_shell protocol - [Wayland] Removed support for the deprecated wl\_shell protocol
- [Wayland] Bugfix: `glfwSetClipboardString` would fail if set to result of - [Wayland] Bugfix: `glfwSetClipboardString` would fail if set to result of
`glfwGetClipboardString` `glfwGetClipboardString`

View File

@ -53,7 +53,8 @@ static void outputHandleGeometry(void* userData,
monitor->widthMM = physicalWidth; monitor->widthMM = physicalWidth;
monitor->heightMM = physicalHeight; monitor->heightMM = physicalHeight;
snprintf(monitor->name, sizeof(monitor->name), "%s %s", make, model); if (strlen(monitor->name) == 0)
snprintf(monitor->name, sizeof(monitor->name), "%s %s", make, model);
} }
static void outputHandleMode(void* userData, static void outputHandleMode(void* userData,
@ -106,12 +107,33 @@ static void outputHandleScale(void* userData,
monitor->wl.scale = factor; monitor->wl.scale = factor;
} }
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
void outputHandleName(void* userData, struct wl_output* wl_output, const char* name)
{
struct _GLFWmonitor* monitor = userData;
strncpy(monitor->name, name, sizeof(monitor->name) - 1);
}
void outputHandleDescription(void* userData,
struct wl_output* wl_output,
const char* description)
{
}
#endif // WL_OUTPUT_NAME_SINCE_VERSION
static const struct wl_output_listener outputListener = static const struct wl_output_listener outputListener =
{ {
outputHandleGeometry, outputHandleGeometry,
outputHandleMode, outputHandleMode,
outputHandleDone, outputHandleDone,
outputHandleScale, outputHandleScale,
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
outputHandleName,
outputHandleDescription,
#endif
}; };
@ -128,10 +150,16 @@ void _glfwAddOutputWayland(uint32_t name, uint32_t version)
return; return;
} }
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
version = _glfw_min(version, WL_OUTPUT_NAME_SINCE_VERSION);
#else
version = 2;
#endif
struct wl_output* output = wl_registry_bind(_glfw.wl.registry, struct wl_output* output = wl_registry_bind(_glfw.wl.registry,
name, name,
&wl_output_interface, &wl_output_interface,
2); version);
if (!output) if (!output)
return; return;