From 96ec2b662c50f6938c5cae85e7fcf59e6f6e1f67 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 18 Jul 2024 18:33:46 +0800 Subject: [PATCH] Display (Linux): support HDR detection for KDE; fix build --- .../displayserver/linux/wayland/kde-output.c | 16 ++++++++++++---- .../displayserver/linux/wayland/wayland.h | 1 + src/detection/displayserver/linux/xcb.c | 4 ++-- src/detection/displayserver/linux/xlib.c | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/detection/displayserver/linux/wayland/kde-output.c b/src/detection/displayserver/linux/wayland/kde-output.c index c6f08f243..7732758ea 100644 --- a/src/detection/displayserver/linux/wayland/kde-output.c +++ b/src/detection/displayserver/linux/wayland/kde-output.c @@ -105,7 +105,7 @@ static void waylandKdeGeometryListener(void *data, display->transform = (enum wl_output_transform) transform; } -void waylandOutputNameListener(void* data, FF_MAYBE_UNUSED struct kde_output_device_v2* output, const char *name) +static void waylandKdeNameListener(void* data, FF_MAYBE_UNUSED struct kde_output_device_v2* kde_output_device_v2, const char *name) { WaylandDisplay* display = data; display->type = ffdsGetDisplayType(name); @@ -113,6 +113,12 @@ void waylandOutputNameListener(void* data, FF_MAYBE_UNUSED struct kde_output_dev ffStrbufAppendS(&display->name, name); } +static void waylandKdeHdrListener(void *data, FF_MAYBE_UNUSED struct kde_output_device_v2 *kde_output_device_v2, uint32_t hdr_enabled) +{ + WaylandDisplay* display = data; + display->hdrEnabled = !!hdr_enabled; +} + static struct kde_output_device_v2_listener outputListener = { .geometry = waylandKdeGeometryListener, .current_mode = waylandKdeCurrentModeListener, @@ -128,8 +134,8 @@ static struct kde_output_device_v2_listener outputListener = { .overscan = (void*) stubListener, .vrr_policy = (void*) stubListener, .rgb_range = (void*) stubListener, - .name = waylandOutputNameListener, - .high_dynamic_range = (void*) stubListener, + .name = waylandKdeNameListener, + .high_dynamic_range = waylandKdeHdrListener, .sdr_brightness = (void*) stubListener, .wide_color_gamut = (void*) stubListener, .auto_rotate_policy = (void*) stubListener, @@ -171,7 +177,7 @@ void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t rotation = ffWaylandHandleRotation(&display); - ffdsAppendDisplay(wldata->result, + FFDisplayResult* item = ffdsAppendDisplay(wldata->result, (uint32_t) display.width, (uint32_t) display.height, display.refreshRate / 1000.0, @@ -187,6 +193,8 @@ void ffWaylandHandleKdeOutput(WaylandData* wldata, struct wl_registry* registry, (uint32_t) display.physicalWidth, (uint32_t) display.physicalHeight ); + if (item) + item->hdrEnabled = display.hdrEnabled; ffStrbufDestroy(&display.description); ffStrbufDestroy(&display.name); diff --git a/src/detection/displayserver/linux/wayland/wayland.h b/src/detection/displayserver/linux/wayland/wayland.h index e78a3c6de..df7056a7b 100644 --- a/src/detection/displayserver/linux/wayland/wayland.h +++ b/src/detection/displayserver/linux/wayland/wayland.h @@ -46,6 +46,7 @@ typedef struct WaylandDisplay FFstrbuf description; FFstrbuf edidName; uint64_t id; + bool hdrEnabled; void* internal; } WaylandDisplay; diff --git a/src/detection/displayserver/linux/xcb.c b/src/detection/displayserver/linux/xcb.c index 6eb2bcdfb..a64e55bd8 100644 --- a/src/detection/displayserver/linux/xcb.c +++ b/src/detection/displayserver/linux/xcb.c @@ -241,7 +241,7 @@ static bool xcbRandrHandleCrtc(XcbRandrData* data, xcb_randr_crtc_t crtc, FFstrb break; } bool res = xcbRandrHandleMode(data, crtcInfoReply->mode, name, rotation, primary, output, displayType); - res = res ? true : ffdsAppendDisplay( + res = res ? true : !!ffdsAppendDisplay( data->result, (uint32_t) crtcInfoReply->width, (uint32_t) crtcInfoReply->height, @@ -317,7 +317,7 @@ static bool xcbRandrHandleMonitor(XcbRandrData* data, xcb_randr_monitor_info_t* data->ffxcb_randr_output_next(&outputIterator); }; - return foundOutput ? true : ffdsAppendDisplay( + return foundOutput ? true : !!ffdsAppendDisplay( data->result, (uint32_t) monitor->width, (uint32_t) monitor->height, diff --git a/src/detection/displayserver/linux/xlib.c b/src/detection/displayserver/linux/xlib.c index cebbbf358..69beb63af 100644 --- a/src/detection/displayserver/linux/xlib.c +++ b/src/detection/displayserver/linux/xlib.c @@ -242,7 +242,7 @@ static bool xrandrHandleMonitor(XrandrData* data, XRRMonitorInfo* monitorInfo) foundOutput = true; } - return foundOutput ? true : ffdsAppendDisplay( + return foundOutput ? true : !!ffdsAppendDisplay( data->result, (uint32_t) monitorInfo->width, (uint32_t) monitorInfo->height,