diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2017-03-07 12:34:38 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2017-03-09 10:17:30 +0800 |
commit | 615587cd068abc16fac27be46c75ab7bd97f810a (patch) | |
tree | b85b898d33c263797eabbcdec516b0fc9f093d0e /src/backends/meta-logical-monitor.c | |
parent | df068a3649d346cabaa2b9232010791263a4382e (diff) | |
download | mutter-615587cd068abc16fac27be46c75ab7bd97f810a.tar.gz |
monitor-manager: Split logical monitor creation
Split up logical monitor cration into derived (when derived from
current underlying configuration) and non-derived (when creating from a
logical monitor configuration). This avoids that type of logic in the
logical monitor creation function.
https://bugzilla.gnome.org/show_bug.cgi?id=779745
Diffstat (limited to 'src/backends/meta-logical-monitor.c')
-rw-r--r-- | src/backends/meta-logical-monitor.c | 99 |
1 files changed, 71 insertions, 28 deletions
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c index 52de55b20..4385fe982 100644 --- a/src/backends/meta-logical-monitor.c +++ b/src/backends/meta-logical-monitor.c @@ -21,54 +21,97 @@ #include "config.h" +#include "backends/meta-backend-private.h" #include "backends/meta-logical-monitor.h" G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT) +static MetaMonitor * +get_first_monitor (MetaMonitorManager *monitor_manager, + GList *monitor_configs) +{ + MetaMonitorConfig *first_monitor_config; + MetaMonitorSpec *first_monitor_spec; + + first_monitor_config = g_list_first (monitor_configs)->data; + first_monitor_spec = first_monitor_config->monitor_spec; + + return meta_monitor_manager_get_monitor_from_spec (monitor_manager, + first_monitor_spec); +} + +typedef struct +{ + MetaMonitorManager *monitor_manager; + MetaLogicalMonitor *logical_monitor; +} AddMonitorFromConfigData; + +static void +add_monitor_from_config (MetaMonitorConfig *monitor_config, + AddMonitorFromConfigData *data) +{ + MetaMonitorSpec *monitor_spec; + MetaMonitor *monitor; + + monitor_spec = monitor_config->monitor_spec; + monitor = meta_monitor_manager_get_monitor_from_spec (data->monitor_manager, + monitor_spec); + + meta_logical_monitor_add_monitor (data->logical_monitor, monitor); +} + MetaLogicalMonitor * -meta_logical_monitor_new (MetaMonitor *monitor, - int x, - int y, - int number) +meta_logical_monitor_new (MetaMonitorManager *monitor_manager, + MetaLogicalMonitorConfig *logical_monitor_config, + int monitor_number) { MetaLogicalMonitor *logical_monitor; + GList *monitor_configs; + MetaMonitor *first_monitor; MetaOutput *main_output; - GList *outputs; - GList *l; - gboolean is_presentation; - - g_assert (meta_monitor_is_active (monitor)); logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL); - main_output = meta_monitor_get_main_output (monitor); - logical_monitor->number = number; + monitor_configs = logical_monitor_config->monitor_configs; + first_monitor = get_first_monitor (monitor_manager, monitor_configs); + main_output = meta_monitor_get_main_output (first_monitor); + + logical_monitor->number = monitor_number; logical_monitor->winsys_id = main_output->winsys_id; logical_monitor->scale = main_output->scale; logical_monitor->in_fullscreen = -1; + logical_monitor->rect = logical_monitor_config->layout; - logical_monitor->rect.x = x; - logical_monitor->rect.y = y; - meta_monitor_get_dimensions (monitor, - &logical_monitor->rect.width, - &logical_monitor->rect.height); + logical_monitor->is_presentation = TRUE; + g_list_foreach (monitor_configs, (GFunc) add_monitor_from_config, + &(AddMonitorFromConfigData) { + .monitor_manager = monitor_manager, + .logical_monitor = logical_monitor + }); - is_presentation = TRUE; - outputs = meta_monitor_get_outputs (monitor); - for (l = outputs; l; l = l->next) - { - MetaOutput *output = l->data; + return logical_monitor; +} - if (output->crtc) - output->crtc->logical_monitor = logical_monitor; +MetaLogicalMonitor * +meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager, + MetaMonitor *monitor, + MetaRectangle *layout, + int monitor_number) +{ + MetaLogicalMonitor *logical_monitor; + MetaOutput *main_output; - is_presentation = is_presentation && output->is_presentation; - } + logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL); - logical_monitor->is_presentation = is_presentation; + main_output = meta_monitor_get_main_output (monitor); + logical_monitor->number = monitor_number; + logical_monitor->winsys_id = main_output->winsys_id; + logical_monitor->scale = main_output->scale; + logical_monitor->in_fullscreen = -1; + logical_monitor->rect = *layout; - logical_monitor->monitors = g_list_append (logical_monitor->monitors, - monitor); + logical_monitor->is_presentation = TRUE; + meta_logical_monitor_add_monitor (logical_monitor, monitor); return logical_monitor; } |