monitor-config-store: Store and parse rgbrange monitor property

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3535>
This commit is contained in:
Sebastian Wick 2024-01-19 19:26:44 +01:00 committed by Marge Bot
parent 5ca2e06b2c
commit 3f866d22c9
2 changed files with 62 additions and 0 deletions

View File

@ -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

View File

@ -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</monitorspec>\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<rgbrange>%s</rgbrange>\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, " </mode>\n");
if (monitor_config->enable_underscanning)
g_string_append (buffer, " <underscanning>yes</underscanning>\n");
append_rgb_range (buffer, monitor_config->rgb_range, " ");
if (monitor_config->has_max_bpc)
{