diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h index 29ac41e92..c62f234e7 100644 --- a/src/backends/meta-monitor-config-manager.h +++ b/src/backends/meta-monitor-config-manager.h @@ -33,6 +33,7 @@ typedef struct _MetaMonitorConfig gboolean enable_underscanning; gboolean has_max_bpc; unsigned int max_bpc; + MetaOutputRGBRange rgb_range; } MetaMonitorConfig; typedef struct _MetaLogicalMonitorConfig diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c index 48da80371..2f95c0bd8 100644 --- a/src/backends/meta-monitor-config-store.c +++ b/src/backends/meta-monitor-config-store.c @@ -166,6 +166,7 @@ typedef enum STATE_MONITOR_MODE_FLAG, STATE_MONITOR_UNDERSCANNING, STATE_MONITOR_MAXBPC, + STATE_MONITOR_RGB_RANGE, STATE_DISABLED, STATE_POLICY, STATE_STORES, @@ -216,6 +217,7 @@ meta_monitor_config_init (MetaMonitorConfig *config) config->enable_underscanning = FALSE; config->has_max_bpc = FALSE; config->max_bpc = 0; + config->rgb_range = META_OUTPUT_RGB_RANGE_AUTO; } static gboolean @@ -463,6 +465,10 @@ handle_start_element (GMarkupParseContext *context, { parser->state = STATE_MONITOR_MAXBPC; } + else if (g_str_equal (element_name, "rgbrange")) + { + parser->state = STATE_MONITOR_RGB_RANGE; + } else { g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, @@ -563,6 +569,13 @@ handle_start_element (GMarkupParseContext *context, return; } + case STATE_MONITOR_RGB_RANGE: + { + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, + "Invalid element '%s' under rgbrange", element_name); + return; + } + case STATE_DISABLED: { if (!g_str_equal (element_name, "monitorspec")) @@ -854,6 +867,14 @@ handle_end_element (GMarkupParseContext *context, return; } + case STATE_MONITOR_RGB_RANGE: + { + g_assert (g_str_equal (element_name, "rgbrange")); + + parser->state = STATE_MONITOR; + return; + } + case STATE_MONITOR: { MetaLogicalMonitorConfig *logical_monitor_config; @@ -1368,6 +1389,21 @@ handle_text (GMarkupParseContext *context, return; } + case STATE_MONITOR_RGB_RANGE: + { + if (text_equals (text, text_len, "auto")) + parser->current_monitor_config->rgb_range = META_OUTPUT_RGB_RANGE_AUTO; + else if (text_equals (text, text_len, "full")) + parser->current_monitor_config->rgb_range = META_OUTPUT_RGB_RANGE_FULL; + else if (text_equals (text, text_len, "limited")) + parser->current_monitor_config->rgb_range = META_OUTPUT_RGB_RANGE_LIMITED; + else + g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, + "Invalid RGB Range type %.*s", (int)text_len, text); + + return; + } + case STATE_STORE: { MetaConfigStore store; @@ -1515,6 +1551,30 @@ append_monitor_spec (GString *buffer, g_string_append_printf (buffer, "%s\n", indentation); } +static void +append_rgb_range (GString *buffer, + MetaOutputRGBRange rgb_range, + const char *indentation) +{ + const char *rgb_range_str; + + switch (rgb_range) + { + case META_OUTPUT_RGB_RANGE_FULL: + rgb_range_str = "full"; + break; + case META_OUTPUT_RGB_RANGE_LIMITED: + rgb_range_str = "limited"; + break; + default: + return; + } + + g_string_append_printf (buffer, "%s%s\n", + indentation, + rgb_range_str); +} + static void append_monitors (GString *buffer, GList *monitor_configs) @@ -1543,6 +1603,7 @@ append_monitors (GString *buffer, g_string_append (buffer, " \n"); if (monitor_config->enable_underscanning) g_string_append (buffer, " yes\n"); + append_rgb_range (buffer, monitor_config->rgb_range, " "); if (monitor_config->has_max_bpc) {