Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wayland-utils for openSUSE:Factory checked in at 2025-12-17 17:30:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wayland-utils (Old) and /work/SRC/openSUSE:Factory/.wayland-utils.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wayland-utils" Wed Dec 17 17:30:54 2025 rev:4 rq:1323003 version:1.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/wayland-utils/wayland-utils.changes 2023-06-09 20:38:14.378833645 +0200 +++ /work/SRC/openSUSE:Factory/.wayland-utils.new.1939/wayland-utils.changes 2025-12-17 17:34:17.662420517 +0100 @@ -1,0 +2,9 @@ +Mon Dec 15 15:51:30 UTC 2025 - llyyr <[email protected]> + +- Update to 1.3.0 + * add color-management-v1 support + * switch to the stable tablet protocol + * support tablet bustype and relative dials + * add color-representation-v1 support + +------------------------------------------------------------------- Old: ---- wayland-utils-1.2.0.tar.xz wayland-utils-1.2.0.tar.xz.sig New: ---- wayland-utils-1.3.0.tar.xz wayland-utils-1.3.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wayland-utils.spec ++++++ --- /var/tmp/diff_new_pack.Dhbz6Q/_old 2025-12-17 17:34:19.138482506 +0100 +++ /var/tmp/diff_new_pack.Dhbz6Q/_new 2025-12-17 17:34:19.146482842 +0100 @@ -1,7 +1,7 @@ # # spec file for package wayland-utils # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: wayland-utils -Version: 1.2.0 +Version: 1.3.0 Release: 0 Summary: Wayland diagnostic utilities License: MIT ++++++ wayland-utils-1.2.0.tar.xz -> wayland-utils-1.3.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wayland-utils-1.2.0/.gitlab-ci.yml new/wayland-utils-1.3.0/.gitlab-ci.yml --- old/wayland-utils-1.2.0/.gitlab-ci.yml 2023-06-08 10:38:01.000000000 +0200 +++ new/wayland-utils-1.3.0/.gitlab-ci.yml 2025-11-24 13:53:04.000000000 +0100 @@ -8,9 +8,16 @@ ref: *templates_sha file: '/templates/alpine.yml' +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS + when: never + - if: $CI_COMMIT_BRANCH + variables: FDO_UPSTREAM_REPO: 'wayland/wayland-utils' - FDO_DISTRIBUTION_TAG: '2022-05-26.0' + FDO_DISTRIBUTION_TAG: '2025-08-03.0' #FDO_FORCE_REBUILD: 1 stages: @@ -44,7 +51,7 @@ git clone https://gitlab.freedesktop.org/wayland/wayland-protocols cd wayland-protocols - git checkout -q 1.24 + git checkout -q 1.44 meson build/ -Dtests=false ninja -C build/ install cd .. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wayland-utils-1.2.0/meson.build new/wayland-utils-1.3.0/meson.build --- old/wayland-utils-1.2.0/meson.build 2023-06-08 10:38:01.000000000 +0200 +++ new/wayland-utils-1.3.0/meson.build 2025-11-24 13:53:04.000000000 +0100 @@ -1,12 +1,12 @@ project('wayland-utils', 'c', - version: '1.2.0', + version: '1.3.0', default_options: [ 'warning_level=3', 'c_std=c99', 'b_lundef=true', ], - meson_version: '>= 0.47', + meson_version: '>= 0.56', license: 'MIT/Expat', ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wayland-utils-1.2.0/wayland-info/meson.build new/wayland-utils-1.3.0/wayland-info/meson.build --- old/wayland-utils-1.2.0/wayland-info/meson.build 2023-06-08 10:38:01.000000000 +0200 +++ new/wayland-utils-1.3.0/wayland-info/meson.build 2025-11-24 13:53:04.000000000 +0100 @@ -1,19 +1,21 @@ dep_scanner = dependency('wayland-scanner', native: true) -prog_scanner = find_program(dep_scanner.get_pkgconfig_variable('wayland_scanner')) +prog_scanner = find_program(dep_scanner.get_variable(pkgconfig: 'wayland_scanner')) -dep_wp = dependency('wayland-protocols', version: '>= 1.24') -dir_wp_base = dep_wp.get_pkgconfig_variable('pkgdatadir') +dep_wp = dependency('wayland-protocols', version: '>= 1.44') +dir_wp_base = dep_wp.get_variable(pkgconfig: 'pkgdatadir') generated_protocols = { # stable 'presentation-time': dir_wp_base / 'stable/presentation-time/presentation-time.xml', # staging + 'color-management-v1': dir_wp_base / 'staging/color-management/color-management-v1.xml', + 'color-representation-v1': dir_wp_base / 'staging/color-representation/color-representation-v1.xml', 'drm-lease-v1': dir_wp_base / 'staging/drm-lease/drm-lease-v1.xml', # unstable 'linux-dmabuf-unstable-v1': dir_wp_base / 'unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml', - 'tablet-unstable-v2': dir_wp_base / 'unstable/tablet/tablet-unstable-v2.xml', + 'tablet-v2': dir_wp_base / 'stable/tablet/tablet-v2.xml', 'xdg-output-unstable-v1': dir_wp_base / 'unstable/xdg-output/xdg-output-unstable-v1.xml', } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wayland-utils-1.2.0/wayland-info/wayland-info.c new/wayland-utils-1.3.0/wayland-info/wayland-info.c --- old/wayland-utils-1.2.0/wayland-info/wayland-info.c 2023-06-08 10:38:01.000000000 +0200 +++ new/wayland-utils-1.3.0/wayland-info/wayland-info.c 2025-11-24 13:53:04.000000000 +0100 @@ -42,10 +42,12 @@ #include <drm_fourcc.h> #endif +#include "color-management-v1-client-protocol.h" +#include "color-representation-v1-client-protocol.h" #include "presentation-time-client-protocol.h" #include "drm-lease-v1-client-protocol.h" #include "linux-dmabuf-unstable-v1-client-protocol.h" -#include "tablet-unstable-v2-client-protocol.h" +#include "tablet-v2-client-protocol.h" #include "xdg-output-unstable-v1-client-protocol.h" #ifndef ARRAY_LENGTH @@ -59,6 +61,7 @@ #define xmalloc(s) (fail_on_null(malloc(s), (s), __FILE__, __LINE__)) #define xzalloc(s) (fail_on_null(zalloc(s), (s), __FILE__, __LINE__)) #define xstrdup(s) (fail_on_null(strdup(s), 0, __FILE__, __LINE__)) +#define xwl_array_add(a, s) (fail_on_null(wl_array_add(a, s), 0, __FILE__, __LINE__)) typedef void (*print_info_t)(void *info); typedef void (*destroy_info_t)(void *info); @@ -193,6 +196,7 @@ int *buttons; size_t strips; size_t rings; + size_t dials; }; struct tablet_pad_info { @@ -210,6 +214,7 @@ char *name; uint32_t vid, pid; + enum zwp_tablet_v2_bustype bustype; struct wl_list paths; }; @@ -281,6 +286,82 @@ struct wl_list connectors; }; +struct wp_color_management_primaries { + int32_t red_x; + int32_t red_y; + int32_t green_x; + int32_t green_y; + int32_t blue_x; + int32_t blue_y; + int32_t white_x; + int32_t white_y; +}; + +struct wp_color_management_v1_info; +struct wp_color_management_output_v1_info { + struct wl_list link; + + struct wp_color_management_v1_info* color; + struct output_info *output; + struct wp_color_management_output_v1 *color_output; + struct wp_image_description_v1 *description; + struct wp_image_description_info_v1 *info; + + bool description_failed; + uint32_t description_identity; + + bool has_icc; + int icc_fd; + uint32_t icc_size; + + struct wp_color_management_primaries primaries; + + bool has_named_primaries; + uint32_t named_primaries; + + bool has_tf_power; + uint32_t tf_power; + bool has_tf_named; + uint32_t tf_named; + + uint32_t luminance_min; + uint32_t luminance_max; + uint32_t luminance_reference; + + struct wp_color_management_primaries target_primaries; + uint32_t target_luminance_min; + uint32_t target_luminance_max; + + bool has_target_max_cll; + uint32_t target_max_cll; + + bool has_target_max_fall; + uint32_t target_max_fall; +}; + +struct wp_color_management_v1_info { + struct global_info global; + struct wp_color_manager_v1 *manager; + struct wayland_info *wayland; + + struct wl_array supported_intents; + struct wl_array supported_features; + struct wl_array supported_named_tfs; + struct wl_array supported_named_primaries; + + struct wl_list outputs; +}; + +struct wp_color_representation_v1_info { + struct global_info global; + struct wp_color_representation_manager_v1 *manager; + struct wayland_info *wayland; + + struct wl_array supported_alpha_modes; + struct wl_array supported_coefficients; + struct wl_array supported_ranges; +}; + struct wayland_info { struct wl_display *display; struct wl_registry *registry; @@ -289,15 +370,22 @@ struct wl_list infos; bool roundtrip_needed; - /* required for tablet-unstable-v2 */ + /* required for tablet-v2 */ struct wl_list seats; struct tablet_v2_info *tablet_info; - /* required for xdg-output-unstable-v1 */ + /* required for xdg-output-unstable-v1 or color-management-v1 */ struct wl_list outputs; struct xdg_output_manager_v1_info *xdg_output_manager_v1_info; + struct wp_color_management_v1_info *wp_color_management_v1_info; + struct wp_color_representation_v1_info *wp_color_representation_v1_info; }; + +static void +add_color_management_output_v1_info(struct wp_color_management_v1_info *color, + struct output_info *wl_output); + static void * fail_on_null(void *p, size_t size, char *file, int32_t line) { @@ -850,6 +938,7 @@ printf("\t\t\t\tmodes: %u\n", info->modes); printf("\t\t\t\tstrips: %zu\n", info->strips); printf("\t\t\t\trings: %zu\n", info->rings); + printf("\t\t\t\tdials: %zu\n", info->dials); printf("\t\t\t\tbuttons:"); for (i = 0; i < info->button_count; ++i) { @@ -921,6 +1010,27 @@ printf("\t\ttablet: %s\n", info->name); printf("\t\t\tvendor: %u\n", info->vid); printf("\t\t\tproduct: %u\n", info->pid); + if (info->bustype) { + const char *bustype = "unknown"; + switch (info->bustype) { + case ZWP_TABLET_V2_BUSTYPE_USB: + bustype = "usb"; + break; + case ZWP_TABLET_V2_BUSTYPE_BLUETOOTH: + bustype = "bluetooth"; + break; + case ZWP_TABLET_V2_BUSTYPE_VIRTUAL: + bustype = "virtual"; + break; + case ZWP_TABLET_V2_BUSTYPE_SERIAL: + bustype = "serial"; + break; + case ZWP_TABLET_V2_BUSTYPE_I2C: + bustype = "i2c"; + break; + } + printf("\t\t\tbustype: %s (%u)\n", bustype, info->bustype); + } wl_list_for_each(path, &info->paths, link) { printf("\t\t\tpath: %s\n", path->path); @@ -1312,6 +1422,17 @@ zwp_tablet_pad_strip_v2_destroy(strip); } +static void +handle_tablet_v2_tablet_pad_group_dial(void *data, + struct zwp_tablet_pad_group_v2 *group, + struct zwp_tablet_pad_dial_v2 *dial) +{ + struct tablet_pad_group_info *info = data; + ++info->dials; + + zwp_tablet_pad_dial_v2_destroy(dial); +} + static const struct zwp_tablet_pad_group_v2_listener tablet_pad_group_listener = { .buttons = handle_tablet_v2_tablet_pad_group_buttons, .modes = handle_tablet_v2_tablet_pad_group_modes, @@ -1319,6 +1440,7 @@ .strip = handle_tablet_v2_tablet_pad_group_strip, .done = handle_tablet_v2_tablet_pad_group_done, .mode_switch = handle_tablet_v2_tablet_pad_group_mode_switch, + .dial = handle_tablet_v2_tablet_pad_group_dial, }; static void @@ -1463,12 +1585,22 @@ * allowed to be issued either way. */ } +static void +handle_tablet_v2_tablet_bustype(void *data, struct zwp_tablet_v2 *zwp_tablet_v2, + uint32_t bustype) +{ + struct tablet_info *tablet_info = data; + + tablet_info->bustype = bustype; +} + static const struct zwp_tablet_v2_listener tablet_listener = { .name = handle_tablet_v2_tablet_name, .id = handle_tablet_v2_tablet_id, .path = handle_tablet_v2_tablet_path, .done = handle_tablet_v2_tablet_done, - .removed = handle_tablet_v2_tablet_removed + .removed = handle_tablet_v2_tablet_removed, + .bustype = handle_tablet_v2_tablet_bustype, }; static void @@ -2030,6 +2162,11 @@ if (info->xdg_output_manager_v1_info) add_xdg_output_v1_info(info->xdg_output_manager_v1_info, output); + + if (info->wp_color_management_v1_info) { + add_color_management_output_v1_info(info->wp_color_management_v1_info, + output); + } } static void @@ -2262,6 +2399,707 @@ info->roundtrip_needed = true; } +static const char * +color_management_named_tf_to_str(uint32_t tf) +{ + switch (tf) { + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_BT1886: + return "bt1886"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_GAMMA22: + return "gamma22"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_GAMMA28: + return "gamma28"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST240: + return "st240"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR: + return "ext_linear"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_LOG_100: + return "log100"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_LOG_316: + return "log316"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_XVYCC: + return "xvycc"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_SRGB: + return "srgb"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_SRGB: + return "ext_srgb"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ: + return "st2084_pq"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST428: + return "st428"; + case WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_HLG: + return "hlg"; + default: + fprintf(stderr, "unknown color management transfer function %u\n", tf); + return "unexpected value"; + } +} +static const char * +color_management_named_primaries_to_str(uint32_t primaries) +{ + switch (primaries) { + case WP_COLOR_MANAGER_V1_PRIMARIES_SRGB: + return "srgb"; + case WP_COLOR_MANAGER_V1_PRIMARIES_PAL_M: + return "pal_m"; + case WP_COLOR_MANAGER_V1_PRIMARIES_PAL: + return "pal"; + case WP_COLOR_MANAGER_V1_PRIMARIES_NTSC: + return "ntsc"; + case WP_COLOR_MANAGER_V1_PRIMARIES_GENERIC_FILM: + return "generic_film"; + case WP_COLOR_MANAGER_V1_PRIMARIES_BT2020: + return "bt2020"; + case WP_COLOR_MANAGER_V1_PRIMARIES_CIE1931_XYZ: + return "cie1931_xyz"; + case WP_COLOR_MANAGER_V1_PRIMARIES_DCI_P3: + return "dci_p3"; + case WP_COLOR_MANAGER_V1_PRIMARIES_DISPLAY_P3: + return "display_p3"; + case WP_COLOR_MANAGER_V1_PRIMARIES_ADOBE_RGB: + return "adobe_rgb"; + default: + fprintf(stderr, "unknown color management primaries %u\n", primaries); + return "unexpected value"; + } +} + +static void +image_description_info_v1_done(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1) { + struct wp_color_management_output_v1_info *output = data; + wp_image_description_info_v1_destroy(output->info); + output->info = NULL; +} + +static void +image_description_info_v1_icc_file(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + int32_t icc, uint32_t icc_size) { + struct wp_color_management_output_v1_info *output = data; + output->has_icc = true; + if (output->icc_fd != -1) + close(output->icc_fd); + output->icc_fd = icc; + output->icc_size = icc_size; +} + +static void +image_description_info_v1_primaries(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, + int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) +{ + struct wp_color_management_output_v1_info *output = data; + output->primaries = (struct wp_color_management_primaries) { + .red_x = r_x, + .red_y = r_y, + .blue_x = b_x, + .blue_y = b_y, + .green_x = g_x, + .green_y = g_y, + .white_x = w_x, + .white_y = w_y, + }; +} + +static void +image_description_info_v1_primaries_named(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t primaries) +{ + struct wp_color_management_output_v1_info *output = data; + output->has_named_primaries = true; + output->named_primaries = primaries; +} + +static void +image_description_info_v1_tf_power(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t eexp) +{ + struct wp_color_management_output_v1_info *output = data; + output->has_tf_power = true; + output->tf_power = eexp; +} + +static void +image_description_info_v1_tf_named(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t tf) +{ + struct wp_color_management_output_v1_info *output = data; + output->has_tf_named = true; + output->tf_named = tf; +} + +static void +image_description_info_v1_luminances(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t min_lum, uint32_t max_lum, uint32_t reference_lum) +{ + struct wp_color_management_output_v1_info *output = data; + output->luminance_min = min_lum; + output->luminance_max = max_lum; + output->luminance_reference = reference_lum; +} + +static void +image_description_info_v1_target_primaries(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + int32_t r_x, int32_t r_y, int32_t g_x, int32_t g_y, + int32_t b_x, int32_t b_y, int32_t w_x, int32_t w_y) +{ + struct wp_color_management_output_v1_info *output = data; + output->target_primaries = (struct wp_color_management_primaries) { + .red_x = r_x, + .red_y = r_y, + .blue_x = b_x, + .blue_y = b_y, + .green_x = g_x, + .green_y = g_y, + .white_x = w_x, + .white_y = w_y, + }; +} + +static void +image_description_info_v1_target_luminance(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t min_lum, uint32_t max_lum) +{ + struct wp_color_management_output_v1_info *output = data; + output->target_luminance_min = min_lum; + output->target_luminance_max = max_lum; +} + +static void +image_description_info_v1_target_max_cll(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t max_cll) +{ + struct wp_color_management_output_v1_info *output = data; + output->has_target_max_cll = true; + output->target_max_cll = max_cll; +} + +static void +image_description_info_v1_target_max_fall(void *data, + struct wp_image_description_info_v1 *wp_image_description_info_v1, + uint32_t max_fall) +{ + struct wp_color_management_output_v1_info *output = data; + output->has_target_max_fall = true; + output->target_max_fall = max_fall; +} + +static const struct wp_image_description_info_v1_listener image_description_info_v1_listener = { + .done = image_description_info_v1_done, + .icc_file = image_description_info_v1_icc_file, + .primaries = image_description_info_v1_primaries, + .primaries_named = image_description_info_v1_primaries_named, + .tf_power = image_description_info_v1_tf_power, + .tf_named = image_description_info_v1_tf_named, + .luminances = image_description_info_v1_luminances, + .target_primaries = image_description_info_v1_target_primaries, + .target_luminance = image_description_info_v1_target_luminance, + .target_max_cll = image_description_info_v1_target_max_cll, + .target_max_fall = image_description_info_v1_target_max_fall, +}; + +static void +image_description_v1_failed(void *data, + struct wp_image_description_v1 *wp_image_description_v1, + uint32_t cause, const char *msg) +{ + struct wp_color_management_output_v1_info *output = data; + output->description_failed = true; +} + +static void +image_description_v1_ready(void *data, + struct wp_image_description_v1 *wp_image_description_v1, + uint32_t identity) +{ + struct wp_color_management_output_v1_info *output = data; + output->description_identity = identity; + output->info = wp_image_description_v1_get_information(output->description); + wp_image_description_info_v1_add_listener(output->info, + &image_description_info_v1_listener, output); + output->color->wayland->roundtrip_needed = true; +} + +static const struct wp_image_description_v1_listener image_description_v1_listener = { + .failed = image_description_v1_failed, + .ready = image_description_v1_ready, +}; + +static void +print_color_management_output_v1_info(struct wp_color_management_output_v1_info *output) +{ + printf("\toutput: %u\n", output->output->global.id); + if (output->description_failed) { + printf("\t\tdescription failed\n"); + return; + } + printf("\t\timage description id: %u\n", output->description_identity); + if (output->has_icc) { + printf("\t\ticc file: size %u\n", output->icc_size); + } else { + uint32_t m = 1000000; + printf("\t\tprimaries (xy):\n"); + printf("\t\t\t red: %u.%06u %u.%06u green: %u.%06u %u.%06u\n", + output->primaries.red_x / m, + output->primaries.red_x % m, + output->primaries.red_y / m, + output->primaries.red_y % m, + output->primaries.green_x / m, + output->primaries.green_x % m, + output->primaries.green_y / m, + output->primaries.green_y % m + ); + printf("\t\t\tblue: %u.%06u %u.%06u white: %u.%06u %u.%06u\n", + output->primaries.blue_x / m, + output->primaries.blue_x % m, + output->primaries.blue_y / m, + output->primaries.blue_y % m, + output->primaries.white_x / m, + output->primaries.white_x % m, + output->primaries.white_y / m, + output->primaries.white_y % m + ); + if (output->has_named_primaries) { + printf("\t\tprimaries_named: %s\n", color_management_named_primaries_to_str(output->named_primaries)); + } + if (output->has_tf_power) { + printf("\t\ttf_power: %u.%04u\n", output->tf_power / 10000, output->tf_power % 10000); + } + if (output->has_tf_named) { + printf("\t\ttf_named: %s\n", color_management_named_tf_to_str(output->tf_named)); + } + printf("\t\tluminances (cd/m²): min %u.%04u max %u reference %u\n", + output->luminance_min / 10000, + output->luminance_min % 10000, + output->luminance_max, + output->luminance_reference + ); + printf("\t\ttarget primaries (xy):\n"); + printf("\t\t\t red: %u.%06u %u.%06u green: %u.%06u %u.%06u\n", + output->target_primaries.red_x / m, + output->target_primaries.red_x % m, + output->target_primaries.red_y / m, + output->target_primaries.red_y % m, + output->target_primaries.green_x / m, + output->target_primaries.green_x % m, + output->target_primaries.green_y / m, + output->target_primaries.green_y % m + ); + printf("\t\t\tblue: %u.%06u %u.%06u white: %u.%06u %u.%06u\n", + output->target_primaries.blue_x / m, + output->target_primaries.blue_x % m, + output->target_primaries.blue_y / m, + output->target_primaries.blue_y % m, + output->target_primaries.white_x / m, + output->target_primaries.white_x % m, + output->target_primaries.white_y / m, + output->target_primaries.white_y % m + ); + printf("\t\ttarget_luminances (cd/m²): min %u.%04u max %u\n", + output->target_luminance_min / 10000, + output->target_luminance_min % 10000, + output->target_luminance_max + ); + if (output->has_target_max_cll) { + printf("\t\tmax_cll (cd/m²): %u\n", output->target_max_cll); + } + if (output->has_target_max_fall) { + printf("\t\tmax_fall (cd/m²): %u\n", output->target_max_fall); + } + } +} + +static void +destroy_color_management_output_v1_info(struct wp_color_management_output_v1_info *output) +{ + wl_list_remove(&output->link); + if (output->info) + wp_image_description_info_v1_destroy(output->info); + wp_image_description_v1_destroy(output->description); + wp_color_management_output_v1_destroy(output->color_output); + if (output->icc_fd != -1) + close(output->icc_fd); + free(output); +} + +static void +add_color_management_output_v1_info(struct wp_color_management_v1_info *color, + struct output_info *wl_output) +{ + struct wp_color_management_output_v1_info *output = + xzalloc(sizeof(struct wp_color_management_output_v1_info)); + + wl_list_insert(&color->outputs, &output->link); + output->color = color; + output->output = wl_output; + output->color_output = wp_color_manager_v1_get_output(color->manager, + wl_output->output); + + output->icc_fd = -1; + + output->description = + wp_color_management_output_v1_get_image_description(output->color_output); + wp_image_description_v1_add_listener(output->description, + &image_description_v1_listener, output); +} + +static void +color_manager_v1_supported_intent(void *data, + struct wp_color_manager_v1 *wp_color_manager_v1, uint32_t render_intent) +{ + struct wp_color_management_v1_info *color = data; + uint32_t *e = xwl_array_add(&color->supported_intents, sizeof(uint32_t)); + *e = render_intent; +} + +static void +color_manager_v1_supported_feature(void *data, + struct wp_color_manager_v1 *wp_color_manager_v1, uint32_t feature) +{ + struct wp_color_management_v1_info *color = data; + uint32_t *e = xwl_array_add(&color->supported_features, sizeof(uint32_t)); + *e = feature; +} + +static void +color_manager_v1_supported_tf_named(void *data, + struct wp_color_manager_v1 *wp_color_manager_v1, uint32_t tf) +{ + struct wp_color_management_v1_info *color = data; + uint32_t *e = xwl_array_add(&color->supported_named_tfs, sizeof(uint32_t)); + *e = tf; +} + +static void +color_manager_v1_supported_primaries_named(void *data, + struct wp_color_manager_v1 *wp_color_manager_v1, uint32_t primaries) +{ + struct wp_color_management_v1_info *color = data; + uint32_t *e = xwl_array_add(&color->supported_named_primaries, sizeof(uint32_t)); + *e = primaries; +} + +static void +color_manager_v1_done(void *data, + struct wp_color_manager_v1 *wp_color_manager_v1) +{ + /* no-op */ +} + +static const struct wp_color_manager_v1_listener color_manager_v1_listener = { + .supported_intent = color_manager_v1_supported_intent, + .supported_feature = color_manager_v1_supported_feature, + .supported_tf_named = color_manager_v1_supported_tf_named, + .supported_primaries_named = color_manager_v1_supported_primaries_named, + .done = color_manager_v1_done, +}; + +static void +print_color_management_v1_info(void *info) +{ + struct wp_color_management_v1_info *color = info; + print_global_info(info); + + uint32_t *e; + + printf("\tsupported rendering intents:\n"); + wl_array_for_each(e, &color->supported_intents) { + const char *intent; + switch (*e) { + case WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL: + intent = "perceptual"; + break; + case WP_COLOR_MANAGER_V1_RENDER_INTENT_RELATIVE: + intent = "relative"; + break; + case WP_COLOR_MANAGER_V1_RENDER_INTENT_SATURATION: + intent = "saturation"; + break; + case WP_COLOR_MANAGER_V1_RENDER_INTENT_ABSOLUTE: + intent = "absolute"; + break; + case WP_COLOR_MANAGER_V1_RENDER_INTENT_RELATIVE_BPC: + intent = "relative_bpc"; + break; + default: + fprintf(stderr, "unknown color management render intent %u\n", *e); + intent = "unexpected value"; + } + + printf("\t\t%s\n", intent); + } + + printf("\tsupported features:\n"); + wl_array_for_each(e, &color->supported_features) { + const char *feature; + switch (*e) { + case WP_COLOR_MANAGER_V1_FEATURE_ICC_V2_V4: + feature = "icc_v2_v4"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_PARAMETRIC: + feature = "parametric"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_SET_PRIMARIES: + feature = "set_primaries"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_SET_TF_POWER: + feature = "set_tf_power"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_SET_LUMINANCES: + feature = "set_luminances"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_SET_MASTERING_DISPLAY_PRIMARIES: + feature = "set_mastering_display_primaries"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_EXTENDED_TARGET_VOLUME: + feature = "extended_target_volume"; + break; + case WP_COLOR_MANAGER_V1_FEATURE_WINDOWS_SCRGB: + feature = "windows_scrgb"; + break; + default: + fprintf(stderr, "unknown color management feature %u\n", *e); + feature = "unexpected value"; + } + + printf("\t\t%s\n", feature); + } + + printf("\tsupported named transfer functions:\n"); + wl_array_for_each(e, &color->supported_named_tfs) { + printf("\t\t%s\n", color_management_named_tf_to_str(*e)); + } + + printf("\tsupported named primaries:\n"); + wl_array_for_each(e, &color->supported_named_primaries) { + printf("\t\t%s\n", color_management_named_primaries_to_str(*e)); + } + + struct wp_color_management_output_v1_info *output; + wl_list_for_each(output, &color->outputs, link) + print_color_management_output_v1_info(output); + +} + +static void +destroy_color_management_v1_info(void *info) +{ + struct wp_color_management_v1_info *color = info; + struct wp_color_management_output_v1_info *output, *tmp; + wl_list_for_each_safe(output, tmp, &color->outputs, link) + destroy_color_management_output_v1_info(output); + + wl_array_release(&color->supported_intents); + wl_array_release(&color->supported_features); + wl_array_release(&color->supported_named_tfs); + wl_array_release(&color->supported_named_primaries); + + wp_color_manager_v1_destroy(color->manager); +} + +static void +add_color_management_v1_info(struct wayland_info *info, uint32_t id, + uint32_t version) +{ + struct wp_color_management_v1_info *color = xzalloc(sizeof *color); + + init_global_info(info, &color->global, id, + wp_color_manager_v1_interface.name, version); + + color->wayland = info; + color->manager = wl_registry_bind(info->registry, id, + &wp_color_manager_v1_interface, 1); + color->global.print = print_color_management_v1_info; + color->global.destroy = destroy_color_management_v1_info; + + wl_array_init(&color->supported_intents); + wl_array_init(&color->supported_features); + wl_array_init(&color->supported_named_tfs); + wl_array_init(&color->supported_named_primaries); + + wp_color_manager_v1_add_listener(color->manager, + &color_manager_v1_listener, color); + + wl_list_init(&color->outputs); + struct output_info *output; + wl_list_for_each(output, &info->outputs, global_link) + add_color_management_output_v1_info(color, output); + + info->roundtrip_needed = true; + info->wp_color_management_v1_info = color; +} + +static void +color_representation_v1_supported_alpha_mode (void *data, + struct wp_color_representation_manager_v1 *wp_color_representation_manager_v1, + uint32_t alpha_mode) +{ + struct wp_color_representation_v1_info *color_repr = data; + uint32_t *e = xwl_array_add(&color_repr->supported_alpha_modes, sizeof(uint32_t)); + *e = alpha_mode; +} + + +static void +color_representation_v1_supported_coefficients_and_ranges (void *data, + struct wp_color_representation_manager_v1 *wp_color_representation_manager_v1, + uint32_t coefficients, uint32_t range) +{ + struct wp_color_representation_v1_info *color_repr = data; + uint32_t *e; + + e = xwl_array_add(&color_repr->supported_coefficients, sizeof(uint32_t)); + *e = coefficients; + e = xwl_array_add(&color_repr->supported_ranges, sizeof(uint32_t)); + *e = range; +} + +static void +color_representation_v1_done(void *data, + struct wp_color_representation_manager_v1 *wp_color_representation_manager_v1) +{ + /* no-op */ +} + +static const struct wp_color_representation_manager_v1_listener + color_representation_manager_v1_listener = { + .supported_alpha_mode = color_representation_v1_supported_alpha_mode, + .supported_coefficients_and_ranges = + color_representation_v1_supported_coefficients_and_ranges, + .done = color_representation_v1_done, +}; + +static void +print_color_representation_v1_info(void *info) +{ + struct wp_color_representation_v1_info *color_repr = info; + print_global_info(info); + + uint32_t *e; + + printf("\tsupported alpha modes:\n"); + wl_array_for_each(e, &color_repr->supported_alpha_modes) { + const char *alpha_mode; + switch (*e) { + case WP_COLOR_REPRESENTATION_SURFACE_V1_ALPHA_MODE_PREMULTIPLIED_ELECTRICAL: + alpha_mode = "premultiplied alpha in electrical values"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_ALPHA_MODE_PREMULTIPLIED_OPTICAL: + alpha_mode = "premultiplied alpha in optical values"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_ALPHA_MODE_STRAIGHT: + alpha_mode = "straight alpha"; + break; + default: + fprintf(stderr, "unknown color representation alpha mode %u\n", *e); + alpha_mode = "unexpected value"; + } + + printf("\t\t%s\n", alpha_mode); + } + + printf("\tsupported matrix coefficients and ranges:\n"); + uint32_t *coefficients = color_repr->supported_coefficients.data; + uint32_t *ranges = color_repr->supported_ranges.data; + size_t len = color_repr->supported_coefficients.size / sizeof(*coefficients); + for (size_t i = 0; i < len; i++) { + const char *coefficient; + const char *range; + switch (coefficients[i]) { + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_IDENTITY: + coefficient = "identity"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_BT709: + coefficient = "bt709"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_FCC: + coefficient = "fcc"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_BT601: + coefficient = "bt601"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_SMPTE240: + coefficient = "smpte240"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_BT2020: + coefficient = "bt2020"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_BT2020_CL: + coefficient = "bt2020_cl"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_COEFFICIENTS_ICTCP: + coefficient = "ictcp"; + break; + default: + fprintf(stderr, "unknown color representation coefficient %u\n", + coefficients[i]); + coefficient = "unexpected value"; + } + switch (ranges[i]) { + case WP_COLOR_REPRESENTATION_SURFACE_V1_RANGE_FULL: + range = "full"; + break; + case WP_COLOR_REPRESENTATION_SURFACE_V1_RANGE_LIMITED: + range = "limited"; + break; + default: + fprintf(stderr, "unknown color representation range %u\n", + ranges[i]); + range = "unexpected value"; + } + + printf("\t\t%s, %s range\n", coefficient, range); + } +} + +static void +destroy_color_representation_v1_info(void *info) +{ + struct wp_color_representation_v1_info *color_repr = info; + + wl_array_release(&color_repr->supported_alpha_modes); + wl_array_release(&color_repr->supported_coefficients); + wl_array_release(&color_repr->supported_ranges); + + wp_color_representation_manager_v1_destroy(color_repr->manager); +} + +static void +add_color_representation_management_v1_info(struct wayland_info *info, + uint32_t id, uint32_t version) +{ + struct wp_color_representation_v1_info *color_repr = + xzalloc(sizeof *color_repr); + + init_global_info(info, &color_repr->global, id, + wp_color_representation_manager_v1_interface.name, version); + + color_repr->wayland = info; + color_repr->manager = wl_registry_bind(info->registry, id, + &wp_color_representation_manager_v1_interface, 1); + color_repr->global.print = print_color_representation_v1_info; + color_repr->global.destroy = destroy_color_representation_v1_info; + + wl_array_init(&color_repr->supported_alpha_modes); + wl_array_init(&color_repr->supported_coefficients); + wl_array_init(&color_repr->supported_ranges); + + wp_color_representation_manager_v1_add_listener(color_repr->manager, + &color_representation_manager_v1_listener, color_repr); + + info->roundtrip_needed = true; + info->wp_color_representation_v1_info = color_repr; +} + static void destroy_global_info(void *info) { @@ -2300,6 +3138,10 @@ add_xdg_output_manager_v1_info(info, id, version); else if (!strcmp(interface, wp_drm_lease_device_v1_interface.name)) add_drm_lease_device_v1_info(info, id, version); + else if (!strcmp(interface, wp_color_manager_v1_interface.name)) + add_color_management_v1_info(info, id, version); + else if (!strcmp(interface, wp_color_representation_manager_v1_interface.name)) + add_color_representation_management_v1_info(info, id, version); else add_global_info(info, id, interface, version); } @@ -2402,6 +3244,8 @@ info.tablet_info = NULL; info.xdg_output_manager_v1_info = NULL; + info.wp_color_management_v1_info = NULL; + info.wp_color_representation_v1_info = NULL; wl_list_init(&info.infos); wl_list_init(&info.seats); wl_list_init(&info.outputs); ++++++ wayland-utils.keyring ++++++ --- /var/tmp/diff_new_pack.Dhbz6Q/_old 2025-12-17 17:34:19.670504850 +0100 +++ /var/tmp/diff_new_pack.Dhbz6Q/_new 2025-12-17 17:34:19.702506194 +0100 @@ -1,44 +1,66 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: SKS 1.1.6 -Comment: Hostname: sks.pod02.fleetstreetops.com -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 -=yfu8 +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 +TQinj120O7IqOWGb5uD4 +=I8pC -----END PGP PUBLIC KEY BLOCK-----
