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:
parent
cca9663d87
commit
252fd31762
1 changed files with 25 additions and 8 deletions
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue