monitor-manager: Let the MetaMonitor derive the whole layout

Instead of letting MetaMonitor derive the logical monitor size, then
using the main monitor for the position, just let MetaMonitor derive
the whole layout including the position. This means it can deal with
tiled monitors better, for example when the main output (the output
always active when the monitor is active) is not the origin output (the
output with tile position (0, 0)).

https://bugzilla.gnome.org/show_bug.cgi?id=781723
This commit is contained in:
Jonas Ådahl 2017-07-12 15:42:20 +08:00
parent e126b6ed16
commit 32fd1e8c08
3 changed files with 26 additions and 50 deletions

View File

@ -158,33 +158,6 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
primary_logical_monitor);
}
static void
derive_monitor_layout (MetaMonitor *monitor,
MetaRectangle *layout)
{
GList *outputs;
GList *l;
int x = INT_MAX;
int y = INT_MAX;
outputs = meta_monitor_get_outputs (monitor);
for (l = outputs; l; l = l->next)
{
MetaOutput *output = l->data;
if (!output->crtc)
continue;
x = MIN (x, output->crtc->rect.x);
y = MIN (y, output->crtc->rect.y);
}
layout->x = x;
layout->y = y;
meta_monitor_derive_dimensions (monitor, &layout->width, &layout->height);
}
static float
derive_configured_global_scale (MetaMonitorManager *manager)
{
@ -283,7 +256,7 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
if (!meta_monitor_is_active (monitor))
continue;
derive_monitor_layout (monitor, &layout);
meta_monitor_derive_layout (monitor, &layout);
logical_monitor = logical_monitor_from_layout (manager, logical_monitors,
&layout);
if (logical_monitor)

View File

@ -258,11 +258,10 @@ meta_monitor_get_current_resolution (MetaMonitor *monitor,
}
void
meta_monitor_derive_dimensions (MetaMonitor *monitor,
int *width,
int *height)
meta_monitor_derive_layout (MetaMonitor *monitor,
MetaRectangle *layout)
{
META_MONITOR_GET_CLASS (monitor)->derive_dimensions (monitor, width, height);
META_MONITOR_GET_CLASS (monitor)->derive_layout (monitor, layout);
}
void
@ -464,15 +463,18 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor)
}
static void
meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
int *width,
int *height)
meta_monitor_normal_derive_layout (MetaMonitor *monitor,
MetaRectangle *layout)
{
MetaOutput *output;
output = meta_monitor_get_main_output (monitor);
*width = output->crtc->rect.width;
*height = output->crtc->rect.height;
*layout = (MetaRectangle) {
.x = output->crtc->rect.x,
.y = output->crtc->rect.y,
.width = output->crtc->rect.width,
.height = output->crtc->rect.height
};
}
static gboolean
@ -515,7 +517,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass);
monitor_class->get_main_output = meta_monitor_normal_get_main_output;
monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
monitor_class->derive_layout = meta_monitor_normal_derive_layout;
monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position;
}
@ -1101,9 +1103,8 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
}
static void
meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
int *out_width,
int *out_height)
meta_monitor_derived_derive_layout (MetaMonitor *monitor,
MetaRectangle *layout)
{
MetaMonitorPrivate *monitor_priv =
meta_monitor_get_instance_private (monitor);
@ -1127,8 +1128,12 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
max_y = MAX (output->crtc->rect.y + output->crtc->rect.height, max_y);
}
*out_width = max_x - min_x;
*out_height = max_y - min_y;
*layout = (MetaRectangle) {
.x = min_x,
.y = min_y,
.width = max_x - min_x,
.height = max_y - min_y
};
}
static gboolean
@ -1186,7 +1191,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
object_class->finalize = meta_monitor_tiled_finalize;
monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
monitor_class->derive_layout = meta_monitor_derived_derive_layout;
monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position;
}

View File

@ -68,9 +68,8 @@ struct _MetaMonitorClass
GObjectClass parent_class;
MetaOutput * (* get_main_output) (MetaMonitor *monitor);
void (* derive_dimensions) (MetaMonitor *monitor,
int *width,
int *height);
void (* derive_layout) (MetaMonitor *monitor,
MetaRectangle *layout);
void (* calculate_crtc_pos) (MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
MetaOutput *output,
@ -118,9 +117,8 @@ void meta_monitor_get_current_resolution (MetaMonitor *monitor,
int *width,
int *height);
void meta_monitor_derive_dimensions (MetaMonitor *monitor,
int *width,
int *height);
void meta_monitor_derive_layout (MetaMonitor *monitor,
MetaRectangle *layout);
void meta_monitor_get_physical_dimensions (MetaMonitor *monitor,
int *width_mm,