display: Update to the new D-Bus API mode format

The mode format communicated via the new D-Bus API changed to
specifying modes using a per monitor unique mode ID string. The uint
'flags' was also changed to more flexible a{sv} 'properties' structure.
This commit is contained in:
Jonas Ådahl 2017-06-14 18:43:46 +08:00 committed by Rui Matos
parent cca9663d87
commit 252fd31762

View file

@ -21,7 +21,8 @@
#include "cc-display-config-dbus.h" #include "cc-display-config-dbus.h"
#define MODE_FORMAT "(iiddadu)" #define MODE_BASE_FORMAT "siiddad"
#define MODE_FORMAT "(" MODE_BASE_FORMAT "a{sv})"
#define MODES_FORMAT "a" MODE_FORMAT #define MODES_FORMAT "a" MODE_FORMAT
#define MONITOR_SPEC_FORMAT "(ssss)" #define MONITOR_SPEC_FORMAT "(ssss)"
#define MONITOR_FORMAT "(" MONITOR_SPEC_FORMAT MODES_FORMAT "a{sv})" #define MONITOR_FORMAT "(" MONITOR_SPEC_FORMAT MODES_FORMAT "a{sv})"
@ -43,6 +44,7 @@ struct _CcDisplayModeDBus
{ {
CcDisplayMode parent_instance; CcDisplayMode parent_instance;
char *id;
int width; int width;
int height; int height;
double refresh_rate; double refresh_rate;
@ -145,6 +147,7 @@ cc_display_mode_dbus_finalize (GObject *object)
{ {
CcDisplayModeDBus *self = CC_DISPLAY_MODE_DBUS (object); CcDisplayModeDBus *self = CC_DISPLAY_MODE_DBUS (object);
g_free (self->id);
g_array_free (self->supported_scales, TRUE); g_array_free (self->supported_scales, TRUE);
G_OBJECT_CLASS (cc_display_mode_dbus_parent_class)->finalize (object); G_OBJECT_CLASS (cc_display_mode_dbus_parent_class)->finalize (object);
@ -171,20 +174,35 @@ cc_display_mode_dbus_new (GVariant *variant)
{ {
double d; double d;
GVariantIter *scales_iter; GVariantIter *scales_iter;
GVariant *properties_variant;
gboolean is_current;
gboolean is_preferred;
CcDisplayModeDBus *self = g_object_new (CC_TYPE_DISPLAY_MODE_DBUS, NULL); CcDisplayModeDBus *self = g_object_new (CC_TYPE_DISPLAY_MODE_DBUS, NULL);
g_variant_get (variant, MODE_FORMAT, g_variant_get (variant, "(" MODE_BASE_FORMAT "@a{sv})",
&self->id,
&self->width, &self->width,
&self->height, &self->height,
&self->refresh_rate, &self->refresh_rate,
&self->preferred_scale, &self->preferred_scale,
&scales_iter, &scales_iter,
&self->flags); &properties_variant);
while (g_variant_iter_next (scales_iter, "d", &d)) while (g_variant_iter_next (scales_iter, "d", &d))
g_array_append_val (self->supported_scales, d); g_array_append_val (self->supported_scales, d);
if (!g_variant_lookup (properties_variant, "is-current", "b", &is_current))
is_current = FALSE;
if (!g_variant_lookup (properties_variant, "is-preferred", "b", &is_preferred))
is_preferred = FALSE;
if (is_current)
self->flags |= MODE_CURRENT;
if (is_preferred)
self->flags |= MODE_PREFERRED;
g_variant_iter_free (scales_iter); g_variant_iter_free (scales_iter);
g_variant_unref (properties_variant);
return self; return self;
} }
@ -900,8 +918,8 @@ build_monitors_variant (GHashTable *monitors)
while (g_hash_table_iter_next (&iter, (void **) &monitor, NULL)) while (g_hash_table_iter_next (&iter, (void **) &monitor, NULL))
{ {
int w, h;
GVariantBuilder props_builder; GVariantBuilder props_builder;
CcDisplayModeDBus *mode_dbus;
if (!monitor->current_mode) if (!monitor->current_mode)
continue; continue;
@ -911,11 +929,10 @@ build_monitors_variant (GHashTable *monitors)
"underscanning", "underscanning",
g_variant_new_boolean (monitor->underscanning == UNDERSCANNING_ENABLED)); g_variant_new_boolean (monitor->underscanning == UNDERSCANNING_ENABLED));
cc_display_mode_get_resolution (monitor->current_mode, &w, &h); mode_dbus = CC_DISPLAY_MODE_DBUS (monitor->current_mode);
g_variant_builder_add (&builder, "(s(iid)@*)", g_variant_builder_add (&builder, "(ss@*)",
monitor->connector_name, monitor->connector_name,
w, h, mode_dbus->id,
cc_display_mode_get_freq_f (monitor->current_mode),
g_variant_builder_end (&props_builder)); g_variant_builder_end (&props_builder));
} }