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
This commit is contained in:
parent
df068a3649
commit
615587cd06
@ -21,54 +21,97 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT)
|
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 *
|
MetaLogicalMonitor *
|
||||||
meta_logical_monitor_new (MetaMonitor *monitor,
|
meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
|
||||||
int x,
|
MetaLogicalMonitorConfig *logical_monitor_config,
|
||||||
int y,
|
int monitor_number)
|
||||||
int number)
|
{
|
||||||
|
MetaLogicalMonitor *logical_monitor;
|
||||||
|
GList *monitor_configs;
|
||||||
|
MetaMonitor *first_monitor;
|
||||||
|
MetaOutput *main_output;
|
||||||
|
|
||||||
|
logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL);
|
||||||
|
|
||||||
|
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->is_presentation = TRUE;
|
||||||
|
g_list_foreach (monitor_configs, (GFunc) add_monitor_from_config,
|
||||||
|
&(AddMonitorFromConfigData) {
|
||||||
|
.monitor_manager = monitor_manager,
|
||||||
|
.logical_monitor = logical_monitor
|
||||||
|
});
|
||||||
|
|
||||||
|
return logical_monitor;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetaLogicalMonitor *
|
||||||
|
meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
|
||||||
|
MetaMonitor *monitor,
|
||||||
|
MetaRectangle *layout,
|
||||||
|
int monitor_number)
|
||||||
{
|
{
|
||||||
MetaLogicalMonitor *logical_monitor;
|
MetaLogicalMonitor *logical_monitor;
|
||||||
MetaOutput *main_output;
|
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);
|
logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL);
|
||||||
|
|
||||||
main_output = meta_monitor_get_main_output (monitor);
|
main_output = meta_monitor_get_main_output (monitor);
|
||||||
logical_monitor->number = number;
|
logical_monitor->number = monitor_number;
|
||||||
logical_monitor->winsys_id = main_output->winsys_id;
|
logical_monitor->winsys_id = main_output->winsys_id;
|
||||||
logical_monitor->scale = main_output->scale;
|
logical_monitor->scale = main_output->scale;
|
||||||
logical_monitor->in_fullscreen = -1;
|
logical_monitor->in_fullscreen = -1;
|
||||||
|
logical_monitor->rect = *layout;
|
||||||
|
|
||||||
logical_monitor->rect.x = x;
|
logical_monitor->is_presentation = TRUE;
|
||||||
logical_monitor->rect.y = y;
|
meta_logical_monitor_add_monitor (logical_monitor, monitor);
|
||||||
meta_monitor_get_dimensions (monitor,
|
|
||||||
&logical_monitor->rect.width,
|
|
||||||
&logical_monitor->rect.height);
|
|
||||||
|
|
||||||
is_presentation = TRUE;
|
|
||||||
outputs = meta_monitor_get_outputs (monitor);
|
|
||||||
for (l = outputs; l; l = l->next)
|
|
||||||
{
|
|
||||||
MetaOutput *output = l->data;
|
|
||||||
|
|
||||||
if (output->crtc)
|
|
||||||
output->crtc->logical_monitor = logical_monitor;
|
|
||||||
|
|
||||||
is_presentation = is_presentation && output->is_presentation;
|
|
||||||
}
|
|
||||||
|
|
||||||
logical_monitor->is_presentation = is_presentation;
|
|
||||||
|
|
||||||
logical_monitor->monitors = g_list_append (logical_monitor->monitors,
|
|
||||||
monitor);
|
|
||||||
|
|
||||||
return logical_monitor;
|
return logical_monitor;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
|
#include "backends/meta-monitor-config-manager.h"
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
#include "meta/boxes.h"
|
#include "meta/boxes.h"
|
||||||
|
|
||||||
@ -59,10 +60,14 @@ G_DECLARE_FINAL_TYPE (MetaLogicalMonitor, meta_logical_monitor,
|
|||||||
META, LOGICAL_MONITOR,
|
META, LOGICAL_MONITOR,
|
||||||
GObject)
|
GObject)
|
||||||
|
|
||||||
MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitor *monitor,
|
MetaLogicalMonitor * meta_logical_monitor_new (MetaMonitorManager *monitor_manager,
|
||||||
int x,
|
MetaLogicalMonitorConfig *logical_monitor_config,
|
||||||
int y,
|
int monitor_number);
|
||||||
int 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,
|
void meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
|
||||||
MetaMonitor *monitor);
|
MetaMonitor *monitor);
|
||||||
|
@ -108,47 +108,6 @@ logical_monitor_from_layout (MetaMonitorManager *manager,
|
|||||||
return NULL;
|
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
|
static void
|
||||||
meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
|
meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
|
||||||
MetaMonitorsConfig *config)
|
MetaMonitorsConfig *config)
|
||||||
@ -165,10 +124,9 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
|
|||||||
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
|
||||||
MetaLogicalMonitor *logical_monitor;
|
MetaLogicalMonitor *logical_monitor;
|
||||||
|
|
||||||
logical_monitor =
|
logical_monitor = meta_logical_monitor_new (manager,
|
||||||
create_logical_monitor_from_config (manager,
|
logical_monitor_config,
|
||||||
logical_monitor_config,
|
monitor_number);
|
||||||
monitor_number);
|
|
||||||
monitor_number++;
|
monitor_number++;
|
||||||
|
|
||||||
if (logical_monitor_config->is_primary)
|
if (logical_monitor_config->is_primary)
|
||||||
@ -190,16 +148,16 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
derive_monitor_position (MetaMonitor *monitor,
|
derive_monitor_layout (MetaMonitor *monitor,
|
||||||
int *x,
|
MetaRectangle *layout)
|
||||||
int *y)
|
|
||||||
{
|
{
|
||||||
MetaOutput *main_output;
|
MetaOutput *main_output;
|
||||||
|
|
||||||
main_output = meta_monitor_get_main_output (monitor);
|
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;
|
meta_monitor_derive_dimensions (monitor, &layout->width, &layout->height);
|
||||||
*y = main_output->crtc->rect.y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -221,8 +179,7 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manag
|
|||||||
if (!meta_monitor_is_active (monitor))
|
if (!meta_monitor_is_active (monitor))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
derive_monitor_position (monitor, &layout.x, &layout.y);
|
derive_monitor_layout (monitor, &layout);
|
||||||
meta_monitor_get_dimensions (monitor, &layout.width, &layout.height);
|
|
||||||
logical_monitor = logical_monitor_from_layout (manager, logical_monitors,
|
logical_monitor = logical_monitor_from_layout (manager, logical_monitors,
|
||||||
&layout);
|
&layout);
|
||||||
if (logical_monitor)
|
if (logical_monitor)
|
||||||
@ -231,12 +188,10 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manag
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int x, y;
|
logical_monitor = meta_logical_monitor_new_derived (manager,
|
||||||
|
monitor,
|
||||||
derive_monitor_position (monitor, &x, &y);
|
&layout,
|
||||||
logical_monitor = meta_logical_monitor_new (monitor,
|
monitor_number);
|
||||||
x, y,
|
|
||||||
monitor_number);
|
|
||||||
logical_monitors = g_list_append (logical_monitors, logical_monitor);
|
logical_monitors = g_list_append (logical_monitors, logical_monitor);
|
||||||
monitor_number++;
|
monitor_number++;
|
||||||
}
|
}
|
||||||
|
@ -215,11 +215,22 @@ meta_monitor_is_laptop_panel (MetaMonitor *monitor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_get_dimensions (MetaMonitor *monitor,
|
meta_monitor_get_current_resolution (MetaMonitor *monitor,
|
||||||
int *width,
|
int *width,
|
||||||
int *height)
|
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
|
void
|
||||||
@ -362,9 +373,9 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_normal_get_dimensions (MetaMonitor *monitor,
|
meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
|
||||||
int *width,
|
int *width,
|
||||||
int *height)
|
int *height)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
|
|
||||||
@ -384,7 +395,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
|
|||||||
MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass);
|
MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass);
|
||||||
|
|
||||||
monitor_class->get_main_output = meta_monitor_normal_get_main_output;
|
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
|
uint32_t
|
||||||
@ -684,11 +695,34 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_tiled_get_dimensions (MetaMonitor *monitor,
|
meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
|
||||||
int *width,
|
int *out_width,
|
||||||
int *height)
|
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
|
static void
|
||||||
@ -717,7 +751,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
|
|||||||
object_class->finalize = meta_monitor_tiled_finalize;
|
object_class->finalize = meta_monitor_tiled_finalize;
|
||||||
|
|
||||||
monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
|
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
|
static void
|
||||||
|
@ -65,9 +65,9 @@ struct _MetaMonitorClass
|
|||||||
GObjectClass parent_class;
|
GObjectClass parent_class;
|
||||||
|
|
||||||
MetaOutput * (* get_main_output) (MetaMonitor *monitor);
|
MetaOutput * (* get_main_output) (MetaMonitor *monitor);
|
||||||
void (* get_dimensions) (MetaMonitor *monitor,
|
void (* derive_dimensions) (MetaMonitor *monitor,
|
||||||
int *width,
|
int *width,
|
||||||
int *height);
|
int *height);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
|
#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);
|
GList * meta_monitor_get_outputs (MetaMonitor *monitor);
|
||||||
|
|
||||||
void meta_monitor_get_dimensions (MetaMonitor *monitor,
|
void meta_monitor_get_current_resolution (MetaMonitor *monitor,
|
||||||
int *width,
|
int *width,
|
||||||
int *height);
|
int *height);
|
||||||
|
|
||||||
|
void meta_monitor_derive_dimensions (MetaMonitor *monitor,
|
||||||
|
int *width,
|
||||||
|
int *height);
|
||||||
|
|
||||||
void meta_monitor_get_physical_dimensions (MetaMonitor *monitor,
|
void meta_monitor_get_physical_dimensions (MetaMonitor *monitor,
|
||||||
int *width_mm,
|
int *width_mm,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user