diff --git a/patches/color_manager/README.md b/patches/color_manager/README.md new file mode 100644 index 0000000..3f47cdb --- /dev/null +++ b/patches/color_manager/README.md @@ -0,0 +1,10 @@ +### Description +Adds simple support for color management using `wp_color_manager_v1`. + +### Download +- [git branch](/caskd/dwl/src/branch/patches/color-management) +- [main 2025-06-18](/dwl/dwl-patches/raw/branch/main/patches/color_manager/color_manager.patch) +### Authors +- [caskd](https://codeberg.org/caskd) + caskd@redxen.eu + caskd at [Libera IRC dwl channel](https://web.libera.chat/?channels=#dwl) diff --git a/patches/color_manager/color_manager.patch b/patches/color_manager/color_manager.patch new file mode 100644 index 0000000..20f9dfd --- /dev/null +++ b/patches/color_manager/color_manager.patch @@ -0,0 +1,146 @@ +From 013ef0636c65ea6799254000507f2577efa658e2 Mon Sep 17 00:00:00 2001 +From: Alex Denes +Date: Thu, 10 Jul 2025 12:01:29 +0000 +Subject: [PATCH 1/2] Implement color manager + +--- + Makefile | 6 +++++- + dwl.c | 33 +++++++++++++++++++++++++++++++++ + 2 files changed, 38 insertions(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 578194f..570d5f5 100644 +--- a/Makefile ++++ b/Makefile +@@ -21,7 +21,8 @@ dwl: dwl.o util.o + $(CC) dwl.o util.o $(DWLCFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ + dwl.o: dwl.c client.h config.h config.mk cursor-shape-v1-protocol.h \ + pointer-constraints-unstable-v1-protocol.h wlr-layer-shell-unstable-v1-protocol.h \ +- wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h ++ wlr-output-power-management-unstable-v1-protocol.h xdg-shell-protocol.h \ ++ color-management-v1-protocol.h + util.o: util.c util.h + + # wayland-scanner is a tool which generates C headers and rigging for Wayland +@@ -39,6 +40,9 @@ pointer-constraints-unstable-v1-protocol.h: + wlr-layer-shell-unstable-v1-protocol.h: + $(WAYLAND_SCANNER) enum-header \ + protocols/wlr-layer-shell-unstable-v1.xml $@ ++color-management-v1-protocol.h: ++ $(WAYLAND_SCANNER) enum-header \ ++ $(WAYLAND_PROTOCOLS)/staging/color-management/color-management-v1.xml $@ + wlr-output-power-management-unstable-v1-protocol.h: + $(WAYLAND_SCANNER) server-header \ + protocols/wlr-output-power-management-unstable-v1.xml $@ +diff --git a/dwl.c b/dwl.c +index 12f441e..d8f7d53 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -382,6 +383,7 @@ static struct wlr_virtual_keyboard_manager_v1 *virtual_keyboard_mgr; + static struct wlr_virtual_pointer_manager_v1 *virtual_pointer_mgr; + static struct wlr_cursor_shape_manager_v1 *cursor_shape_mgr; + static struct wlr_output_power_manager_v1 *power_mgr; ++static struct wlr_color_manager_v1 *color_mgr; + + static struct wlr_pointer_constraints_v1 *pointer_constraints; + static struct wlr_relative_pointer_manager_v1 *relative_pointer_mgr; +@@ -2645,6 +2647,37 @@ setup(void) + wl_signal_add(&output_mgr->events.apply, &output_mgr_apply); + wl_signal_add(&output_mgr->events.test, &output_mgr_test); + ++ if (drw->features.input_color_transform) { ++ struct wlr_color_manager_v1_options *color_mgr_options; ++ color_mgr_options = ecalloc(1, sizeof(*color_mgr_options)); ++ ++ // Enable only supported wlroots features ++ color_mgr_options->features = (struct wlr_color_manager_v1_features){ ++ .parametric = true, ++ .set_mastering_display_primaries = true, ++ }; ++ ++ color_mgr_options->render_intents_len = 2; ++ enum wp_color_manager_v1_render_intent *render_intents = ecalloc(color_mgr_options->render_intents_len, sizeof(*render_intents)); ++ render_intents[0] = WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL; ++ render_intents[1] = WP_COLOR_MANAGER_V1_RENDER_INTENT_ABSOLUTE; ++ color_mgr_options->render_intents = render_intents; ++ ++ enum wp_color_manager_v1_primaries *primaries = ecalloc(color_mgr_options->primaries_len, sizeof(*primaries)); ++ primaries[0] = WP_COLOR_MANAGER_V1_PRIMARIES_SRGB; ++ primaries[1] = WP_COLOR_MANAGER_V1_PRIMARIES_BT2020; ++ color_mgr_options->primaries = primaries; ++ ++ color_mgr_options->transfer_functions_len = 3; ++ enum wp_color_manager_v1_transfer_function *transfer_functions = ecalloc(color_mgr_options->transfer_functions_len, sizeof(*transfer_functions)); ++ transfer_functions[0] = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB; ++ transfer_functions[1] = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ; ++ transfer_functions[2] = WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR; ++ color_mgr_options->transfer_functions = transfer_functions; ++ ++ color_mgr = wlr_color_manager_v1_create(dpy, 1, color_mgr_options); ++ } ++ + /* Make sure XWayland clients don't connect to the parent X server, + * e.g when running in the x11 backend or the wayland backend and the + * compositor has Xwayland support */ +-- +2.49.1 + + +From b40c5eb734e7c9aa0cd966531a2c03e842c9b0b9 Mon Sep 17 00:00:00 2001 +From: Alex Denes +Date: Mon, 28 Jul 2025 12:48:22 +0000 +Subject: [PATCH 2/2] Enable HDR on all displays that support it by default + +--- + config.mk | 4 ++-- + dwl.c | 11 +++++++++++ + 2 files changed, 13 insertions(+), 2 deletions(-) + +diff --git a/config.mk b/config.mk +index eb08a05..f641d04 100644 +--- a/config.mk ++++ b/config.mk +@@ -8,8 +8,8 @@ PREFIX = /usr/local + MANDIR = $(PREFIX)/share/man + DATADIR = $(PREFIX)/share + +-WLR_INCS = `$(PKG_CONFIG) --cflags wlroots-0.19` +-WLR_LIBS = `$(PKG_CONFIG) --libs wlroots-0.19` ++WLR_INCS = `$(PKG_CONFIG) --cflags wlroots-0.20` ++WLR_LIBS = `$(PKG_CONFIG) --libs wlroots-0.20` + + # Allow using an alternative wlroots installation + # This has to have all the includes required by wlroots, e.g: +diff --git a/dwl.c b/dwl.c +index d8f7d53..afd7d69 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -1086,6 +1086,17 @@ createmon(struct wl_listener *listener, void *data) + LISTEN(&wlr_output->events.destroy, &m->destroy, cleanupmon); + LISTEN(&wlr_output->events.request_state, &m->request_state, requestmonstate); + ++ /* Enable HDR if supported */ ++ if ((wlr_output->supported_primaries & WLR_COLOR_NAMED_PRIMARIES_BT2020) && ++ (wlr_output->supported_transfer_functions & WLR_COLOR_TRANSFER_FUNCTION_ST2084_PQ) && ++ (drw->features.output_color_transform)) { ++ const struct wlr_output_image_description image_desc = { ++ .primaries = WLR_COLOR_NAMED_PRIMARIES_BT2020, ++ .transfer_function = WLR_COLOR_TRANSFER_FUNCTION_ST2084_PQ, ++ }; ++ wlr_output_state_set_image_description(&state, &image_desc); ++ } ++ + wlr_output_state_set_enabled(&state, 1); + wlr_output_commit_state(wlr_output, &state); + wlr_output_state_finish(&state); +-- +2.49.1 +