summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2017-06-14 18:43:46 +0800
committerRui Matos <tiagomatos@gmail.com>2017-07-14 18:32:55 +0200
commit252fd317627b1efffd7dd752973ba0b16400f92c (patch)
tree3811e57fa1218f557be2fdd7771e94a11885dd80
parentcca9663d876b8dbfb4e5bcd4da412233a239233a (diff)
downloadgnome-control-center-252fd317627b1efffd7dd752973ba0b16400f92c.tar.gz
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.
-rw-r--r--panels/display/cc-display-config-dbus.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
index dee168794..cd72ab2b3 100644
--- a/panels/display/cc-display-config-dbus.c
+++ b/panels/display/cc-display-config-dbus.c
@@ -21,7 +21,8 @@
#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 MONITOR_SPEC_FORMAT "(ssss)"
#define MONITOR_FORMAT "(" MONITOR_SPEC_FORMAT MODES_FORMAT "a{sv})"
@@ -43,6 +44,7 @@ struct _CcDisplayModeDBus
{
CcDisplayMode parent_instance;
+ char *id;
int width;
int height;
double refresh_rate;
@@ -145,6 +147,7 @@ cc_display_mode_dbus_finalize (GObject *object)
{
CcDisplayModeDBus *self = CC_DISPLAY_MODE_DBUS (object);
+ g_free (self->id);
g_array_free (self->supported_scales, TRUE);
G_OBJECT_CLASS (cc_display_mode_dbus_parent_class)->finalize (object);
@@ -171,20 +174,35 @@ cc_display_mode_dbus_new (GVariant *variant)
{
double d;
GVariantIter *scales_iter;
+ GVariant *properties_variant;
+ gboolean is_current;
+ gboolean is_preferred;
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->height,
&self->refresh_rate,
&self->preferred_scale,
&scales_iter,
- &self->flags);
+ &properties_variant);
while (g_variant_iter_next (scales_iter, "d", &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_unref (properties_variant);
return self;
}
@@ -900,8 +918,8 @@ build_monitors_variant (GHashTable *monitors)
while (g_hash_table_iter_next (&iter, (void **) &monitor, NULL))
{
- int w, h;
GVariantBuilder props_builder;
+ CcDisplayModeDBus *mode_dbus;
if (!monitor->current_mode)
continue;
@@ -911,11 +929,10 @@ build_monitors_variant (GHashTable *monitors)
"underscanning",
g_variant_new_boolean (monitor->underscanning == UNDERSCANNING_ENABLED));
- cc_display_mode_get_resolution (monitor->current_mode, &w, &h);
- g_variant_builder_add (&builder, "(s(iid)@*)",
+ mode_dbus = CC_DISPLAY_MODE_DBUS (monitor->current_mode);
+ g_variant_builder_add (&builder, "(ss@*)",
monitor->connector_name,
- w, h,
- cc_display_mode_get_freq_f (monitor->current_mode),
+ mode_dbus->id,
g_variant_builder_end (&props_builder));
}