DisplayConfig: Add logical monitor transforms
Add the transform as a logical monitor parameter, both when getting the current state and applying a new configuration. The transform is defined to be identical to MetaMonitorTransform. https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
parent
17c54c6e03
commit
0ac2eba4d3
2 changed files with 44 additions and 15 deletions
|
@ -1304,7 +1304,7 @@ meta_monitor_manager_legacy_handle_apply_configuration (MetaDBusDisplayConfig *
|
||||||
#define MONITORS_FORMAT "a" MONITOR_FORMAT
|
#define MONITORS_FORMAT "a" MONITOR_FORMAT
|
||||||
|
|
||||||
#define LOGICAL_MONITOR_MONITORS_FORMAT "a" MONITOR_SPEC_FORMAT
|
#define LOGICAL_MONITOR_MONITORS_FORMAT "a" MONITOR_SPEC_FORMAT
|
||||||
#define LOGICAL_MONITOR_FORMAT "(iidb" LOGICAL_MONITOR_MONITORS_FORMAT "a{sv})"
|
#define LOGICAL_MONITOR_FORMAT "(iidub" LOGICAL_MONITOR_MONITORS_FORMAT "a{sv})"
|
||||||
#define LOGICAL_MONITORS_FORMAT "a" LOGICAL_MONITOR_FORMAT
|
#define LOGICAL_MONITORS_FORMAT "a" LOGICAL_MONITOR_FORMAT
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1422,6 +1422,7 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
|
||||||
logical_monitor->rect.x,
|
logical_monitor->rect.x,
|
||||||
logical_monitor->rect.y,
|
logical_monitor->rect.y,
|
||||||
(double) logical_monitor->scale,
|
(double) logical_monitor->scale,
|
||||||
|
logical_monitor->transform,
|
||||||
logical_monitor->is_primary,
|
logical_monitor->is_primary,
|
||||||
&logical_monitor_monitors_builder,
|
&logical_monitor_monitors_builder,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -1583,7 +1584,7 @@ find_monitor_spec (MetaMonitorManager *manager,
|
||||||
#define MONITOR_CONFIG_FORMAT "(s" MONITOR_MODE_SPEC_FORMAT "a{sv})"
|
#define MONITOR_CONFIG_FORMAT "(s" MONITOR_MODE_SPEC_FORMAT "a{sv})"
|
||||||
#define MONITOR_CONFIGS_FORMAT "a" MONITOR_CONFIG_FORMAT
|
#define MONITOR_CONFIGS_FORMAT "a" MONITOR_CONFIG_FORMAT
|
||||||
|
|
||||||
#define LOGICAL_MONITOR_CONFIG_FORMAT "(iidb" MONITOR_CONFIGS_FORMAT ")"
|
#define LOGICAL_MONITOR_CONFIG_FORMAT "(iidub" MONITOR_CONFIGS_FORMAT ")"
|
||||||
|
|
||||||
static MetaMonitorConfig *
|
static MetaMonitorConfig *
|
||||||
create_monitor_config_from_variant (MetaMonitorManager *manager,
|
create_monitor_config_from_variant (MetaMonitorManager *manager,
|
||||||
|
@ -1647,13 +1648,15 @@ create_monitor_config_from_variant (MetaMonitorManager *manager,
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
derive_logical_monitor_size (GList *monitor_configs,
|
derive_logical_monitor_size (GList *monitor_configs,
|
||||||
int *width,
|
int *out_width,
|
||||||
int *height,
|
int *out_height,
|
||||||
double scale,
|
double scale,
|
||||||
|
MetaMonitorTransform transform,
|
||||||
MetaLogicalMonitorLayoutMode layout_mode,
|
MetaLogicalMonitorLayoutMode layout_mode,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
MetaMonitorConfig *monitor_config;
|
MetaMonitorConfig *monitor_config;
|
||||||
|
int width, height;
|
||||||
|
|
||||||
if (!monitor_configs)
|
if (!monitor_configs)
|
||||||
{
|
{
|
||||||
|
@ -1664,19 +1667,31 @@ derive_logical_monitor_size (GList *monitor_configs,
|
||||||
|
|
||||||
monitor_config = monitor_configs->data;
|
monitor_config = monitor_configs->data;
|
||||||
|
|
||||||
|
if (meta_monitor_transform_is_rotated (transform))
|
||||||
|
{
|
||||||
|
width = monitor_config->mode_spec->height;
|
||||||
|
height = monitor_config->mode_spec->width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = monitor_config->mode_spec->width;
|
||||||
|
height = monitor_config->mode_spec->height;
|
||||||
|
}
|
||||||
|
|
||||||
switch (layout_mode)
|
switch (layout_mode)
|
||||||
{
|
{
|
||||||
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
|
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
|
||||||
*width = monitor_config->mode_spec->width / scale;
|
width /= scale;
|
||||||
*height = monitor_config->mode_spec->height / scale;
|
height /= scale;
|
||||||
return TRUE;
|
break;
|
||||||
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
|
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
|
||||||
*width = monitor_config->mode_spec->width;
|
break;
|
||||||
*height = monitor_config->mode_spec->height;
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert_not_reached ();
|
*out_width = width;
|
||||||
|
*out_height = height;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaLogicalMonitorConfig *
|
static MetaLogicalMonitorConfig *
|
||||||
|
@ -1688,6 +1703,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
|
||||||
MetaLogicalMonitorConfig *logical_monitor_config;
|
MetaLogicalMonitorConfig *logical_monitor_config;
|
||||||
int x, y, width, height;
|
int x, y, width, height;
|
||||||
double scale;
|
double scale;
|
||||||
|
MetaMonitorTransform transform;
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
GVariantIter *monitor_configs_iter;
|
GVariantIter *monitor_configs_iter;
|
||||||
GList *monitor_configs = NULL;
|
GList *monitor_configs = NULL;
|
||||||
|
@ -1696,6 +1712,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
|
||||||
&x,
|
&x,
|
||||||
&y,
|
&y,
|
||||||
&scale,
|
&scale,
|
||||||
|
&transform,
|
||||||
&is_primary,
|
&is_primary,
|
||||||
&monitor_configs_iter);
|
&monitor_configs_iter);
|
||||||
|
|
||||||
|
@ -1725,7 +1742,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
|
||||||
g_variant_iter_free (monitor_configs_iter);
|
g_variant_iter_free (monitor_configs_iter);
|
||||||
|
|
||||||
if (!derive_logical_monitor_size (monitor_configs, &width, &height,
|
if (!derive_logical_monitor_size (monitor_configs, &width, &height,
|
||||||
scale, layout_mode, error))
|
scale, transform, layout_mode, error))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1);
|
logical_monitor_config = g_new0 (MetaLogicalMonitorConfig, 1);
|
||||||
|
@ -1736,7 +1753,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager *manager
|
||||||
.width = width,
|
.width = width,
|
||||||
.height = height
|
.height = height
|
||||||
},
|
},
|
||||||
.transform = META_MONITOR_TRANSFORM_NORMAL,
|
.transform = transform,
|
||||||
.scale = (int) scale,
|
.scale = (int) scale,
|
||||||
.is_primary = is_primary,
|
.is_primary = is_primary,
|
||||||
.monitor_configs = monitor_configs
|
.monitor_configs = monitor_configs
|
||||||
|
|
|
@ -342,6 +342,7 @@
|
||||||
* i x: x position
|
* i x: x position
|
||||||
* i y: y position
|
* i y: y position
|
||||||
* d scale: scale
|
* d scale: scale
|
||||||
|
* u transform: transform (see below)
|
||||||
* b primary: true if this is the primary logical monitor
|
* b primary: true if this is the primary logical monitor
|
||||||
* a(sss) monitors: monitors displaying this logical monitor
|
* a(sss) monitors: monitors displaying this logical monitor
|
||||||
* connector: name of the connector (e.g. DP-1, eDP-1 etc)
|
* connector: name of the connector (e.g. DP-1, eDP-1 etc)
|
||||||
|
@ -350,6 +351,16 @@
|
||||||
* serial: product serial
|
* serial: product serial
|
||||||
* a{sv} properties: possibly other properties
|
* a{sv} properties: possibly other properties
|
||||||
|
|
||||||
|
Posisble transform values:
|
||||||
|
0: normal
|
||||||
|
1: 90°
|
||||||
|
2: 180°
|
||||||
|
3: 270°
|
||||||
|
4: flipped
|
||||||
|
5: 90° flipped
|
||||||
|
6: 180° flipped
|
||||||
|
7: 270° flipped
|
||||||
|
|
||||||
|
|
||||||
@supported_scales is an ordered list of floating point numbers representing
|
@supported_scales is an ordered list of floating point numbers representing
|
||||||
scale factors of logical monitors supported by the display server.
|
scale factors of logical monitors supported by the display server.
|
||||||
|
@ -387,7 +398,7 @@
|
||||||
<method name="GetCurrentState">
|
<method name="GetCurrentState">
|
||||||
<arg name="serial" direction="out" type="u" />
|
<arg name="serial" direction="out" type="u" />
|
||||||
<arg name="monitors" direction="out" type="a((ssss)a(iiddu)a{sv})" />
|
<arg name="monitors" direction="out" type="a((ssss)a(iiddu)a{sv})" />
|
||||||
<arg name="logical_monitors" direction="out" type="a(iidba(ssss)a{sv})" />
|
<arg name="logical_monitors" direction="out" type="a(iiduba(ssss)a{sv})" />
|
||||||
<arg name="supported_scales" direction="out" type="ad" />
|
<arg name="supported_scales" direction="out" type="ad" />
|
||||||
<arg name="properties" direction="out" type="a{sv}" />
|
<arg name="properties" direction="out" type="a{sv}" />
|
||||||
</method>
|
</method>
|
||||||
|
@ -412,6 +423,7 @@
|
||||||
* i: layout x position
|
* i: layout x position
|
||||||
* i: layout y position
|
* i: layout y position
|
||||||
* d: scale
|
* d: scale
|
||||||
|
* u: transform (see GetCurrentState)
|
||||||
* b primary: true if this is the primary logical monitor
|
* b primary: true if this is the primary logical monitor
|
||||||
* a(siida{sv}): a list of monitors, each consisting of:
|
* a(siida{sv}): a list of monitors, each consisting of:
|
||||||
* s: connector
|
* s: connector
|
||||||
|
@ -432,7 +444,7 @@
|
||||||
<method name="ApplyMonitorsConfig">
|
<method name="ApplyMonitorsConfig">
|
||||||
<arg name="serial" direction="in" type="u" />
|
<arg name="serial" direction="in" type="u" />
|
||||||
<arg name="method" direction="in" type="u" />
|
<arg name="method" direction="in" type="u" />
|
||||||
<arg name="logical_monitors" direction="in" type="a(iidba(s(iid)a{sv}))" />
|
<arg name="logical_monitors" direction="in" type="a(iiduba(s(iid)a{sv}))" />
|
||||||
<arg name="properties" direction="in" type="a{sv}" />
|
<arg name="properties" direction="in" type="a{sv}" />
|
||||||
</method>
|
</method>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
Loading…
Reference in a new issue