summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2017-03-07 12:34:38 +0800
committerJonas Ådahl <jadahl@gmail.com>2017-03-09 10:17:30 +0800
commit615587cd068abc16fac27be46c75ab7bd97f810a (patch)
treeb85b898d33c263797eabbcdec516b0fc9f093d0e
parentdf068a3649d346cabaa2b9232010791263a4382e (diff)
downloadmutter-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
-rw-r--r--src/backends/meta-logical-monitor.c99
-rw-r--r--src/backends/meta-logical-monitor.h13
-rw-r--r--src/backends/meta-monitor-manager.c71
-rw-r--r--src/backends/meta-monitor.c60
-rw-r--r--src/backends/meta-monitor.h16
5 files changed, 150 insertions, 109 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;
}
diff --git a/src/backends/meta-logical-monitor.h b/src/backends/meta-logical-monitor.h
index 4d963d6c0..a7e3a9d70 100644
--- a/src/backends/meta-logical-monitor.h
+++ b/src/backends/meta-logical-monitor.h
@@ -25,6 +25,7 @@
#include <glib-object.h>
#include "backends/meta-monitor.h"
+#include "backends/meta-monitor-config-manager.h"
#include "backends/meta-monitor-manager-private.h"
#include "meta/boxes.h"
@@ -59,10 +60,14 @@ G_DECLARE_FINAL_TYPE (MetaLogicalMonitor, meta_logical_monitor,
META, LOGICAL_MONITOR,
GObject)
-MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitor *monitor,
- int x,
- int y,
- int number);
+MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
+ MetaLogicalMonitorConfig *logical_monitor_config,
+ int monitor_number);
+
+MetaLogicalMonitor * meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
+ MetaMonitor *monitor,
+ MetaRectangle *layout,
+ int monitor_number);
void meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
MetaMonitor *monitor);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 5d73c208f..04e5cb6e8 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -108,47 +108,6 @@ logical_monitor_from_layout (MetaMonitorManager *manager,
return NULL;
}
-static MetaLogicalMonitor *
-create_logical_monitor_from_config (MetaMonitorManager *manager,
- MetaLogicalMonitorConfig *logical_monitor_config,
- int monitor_number)
-{
- MetaLogicalMonitor *logical_monitor;
- GList *monitor_configs;
- MetaMonitorConfig *first_monitor_config;
- MetaMonitorSpec *first_monitor_spec;
- MetaMonitor *first_monitor;
- GList *l;
-
- monitor_configs = logical_monitor_config->monitor_configs;
- first_monitor_config = g_list_first (monitor_configs)->data;
- first_monitor_spec = first_monitor_config->monitor_spec;
- first_monitor =
- meta_monitor_manager_get_monitor_from_spec (manager, first_monitor_spec);
-
- /* Create logical monitor from the first monitor. */
- logical_monitor = meta_logical_monitor_new (first_monitor,
- logical_monitor_config->layout.x,
- logical_monitor_config->layout.y,
- monitor_number);
-
- /* Add the other monitors. */
- for (l = monitor_configs->next; l; l = l->next)
- {
- MetaMonitorConfig *monitor_config = l->data;
- MetaMonitorSpec *monitor_spec;
- MetaMonitor *monitor;
-
- monitor_spec = monitor_config->monitor_spec;
- monitor = meta_monitor_manager_get_monitor_from_spec (manager,
- monitor_spec);
-
- meta_logical_monitor_add_monitor (logical_monitor, monitor);
- }
-
- return logical_monitor;
-}
-
static void
meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
MetaMonitorsConfig *config)
@@ -165,10 +124,9 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
MetaLogicalMonitor *logical_monitor;
- logical_monitor =
- create_logical_monitor_from_config (manager,
- logical_monitor_config,
- monitor_number);
+ logical_monitor = meta_logical_monitor_new (manager,
+ logical_monitor_config,
+ monitor_number);
monitor_number++;
if (logical_monitor_config->is_primary)
@@ -190,16 +148,16 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
}
static void
-derive_monitor_position (MetaMonitor *monitor,
- int *x,
- int *y)
+derive_monitor_layout (MetaMonitor *monitor,
+ MetaRectangle *layout)
{
MetaOutput *main_output;
main_output = meta_monitor_get_main_output (monitor);
+ layout->x = main_output->crtc->rect.x;
+ layout->y = main_output->crtc->rect.y;
- *x = main_output->crtc->rect.x;
- *y = main_output->crtc->rect.y;
+ meta_monitor_derive_dimensions (monitor, &layout->width, &layout->height);
}
static void
@@ -221,8 +179,7 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manag
if (!meta_monitor_is_active (monitor))
continue;
- derive_monitor_position (monitor, &layout.x, &layout.y);
- meta_monitor_get_dimensions (monitor, &layout.width, &layout.height);
+ derive_monitor_layout (monitor, &layout);
logical_monitor = logical_monitor_from_layout (manager, logical_monitors,
&layout);
if (logical_monitor)
@@ -231,12 +188,10 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manag
}
else
{
- int x, y;
-
- derive_monitor_position (monitor, &x, &y);
- logical_monitor = meta_logical_monitor_new (monitor,
- x, y,
- monitor_number);
+ logical_monitor = meta_logical_monitor_new_derived (manager,
+ monitor,
+ &layout,
+ monitor_number);
logical_monitors = g_list_append (logical_monitors, logical_monitor);
monitor_number++;
}
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index ada102a1a..57eea8446 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -215,11 +215,22 @@ meta_monitor_is_laptop_panel (MetaMonitor *monitor)
}
void
-meta_monitor_get_dimensions (MetaMonitor *monitor,
- int *width,
- int *height)
+meta_monitor_get_current_resolution (MetaMonitor *monitor,
+ int *width,
+ int *height)
{
- META_MONITOR_GET_CLASS (monitor)->get_dimensions (monitor, width, height);
+ MetaMonitorMode *mode = meta_monitor_get_current_mode (monitor);
+
+ *width = mode->spec.width;
+ *height = mode->spec.height;
+}
+
+void
+meta_monitor_derive_dimensions (MetaMonitor *monitor,
+ int *width,
+ int *height)
+{
+ META_MONITOR_GET_CLASS (monitor)->derive_dimensions (monitor, width, height);
}
void
@@ -362,9 +373,9 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor)
}
static void
-meta_monitor_normal_get_dimensions (MetaMonitor *monitor,
- int *width,
- int *height)
+meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
+ int *width,
+ int *height)
{
MetaOutput *output;
@@ -384,7 +395,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->get_dimensions = meta_monitor_normal_get_dimensions;
+ monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
}
uint32_t
@@ -684,11 +695,34 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
}
static void
-meta_monitor_tiled_get_dimensions (MetaMonitor *monitor,
- int *width,
- int *height)
+meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
+ int *out_width,
+ int *out_height)
{
- meta_monitor_tiled_calculate_tiled_size (monitor, width, height);
+ MetaMonitorPrivate *monitor_priv =
+ meta_monitor_get_instance_private (monitor);
+ GList *l;
+ int width;
+ int height;
+
+ width = 0;
+ height = 0;
+ for (l = monitor_priv->outputs; l; l = l->next)
+ {
+ MetaOutput *output = l->data;
+
+ if (!output->crtc)
+ continue;
+
+ if (output->tile_info.loc_v_tile == 0)
+ width += output->crtc->rect.width;
+
+ if (output->tile_info.loc_h_tile == 0)
+ height += output->crtc->rect.height;
+ }
+
+ *out_width = width;
+ *out_height = height;
}
static void
@@ -717,7 +751,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->get_dimensions = meta_monitor_tiled_get_dimensions;
+ monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
}
static void
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 9494be890..46abe78c7 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -65,9 +65,9 @@ struct _MetaMonitorClass
GObjectClass parent_class;
MetaOutput * (* get_main_output) (MetaMonitor *monitor);
- void (* get_dimensions) (MetaMonitor *monitor,
- int *width,
- int *height);
+ void (* derive_dimensions) (MetaMonitor *monitor,
+ int *width,
+ int *height);
};
#define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
@@ -99,9 +99,13 @@ gboolean meta_monitor_is_laptop_panel (MetaMonitor *monitor);
GList * meta_monitor_get_outputs (MetaMonitor *monitor);
-void meta_monitor_get_dimensions (MetaMonitor *monitor,
- int *width,
- int *height);
+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_get_physical_dimensions (MetaMonitor *monitor,
int *width_mm,