mirror of
https://github.com/brl/mutter.git
synced 2025-02-02 14:53:03 +00:00
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:
parent
e126b6ed16
commit
32fd1e8c08
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user