Make MetaOutput a GObject
Turn MetaOutput into a GObject and move it to a separate file. This changes the storage format, resulting in changing the API for accessing MetaOutputs from using an array, to using a GList. https://bugzilla.gnome.org/show_bug.cgi?id=785381
This commit is contained in:
parent
8185373bd4
commit
9817a6aa47
@ -131,6 +131,8 @@ libmutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
|
|||||||
backends/meta-monitor-manager-dummy.h \
|
backends/meta-monitor-manager-dummy.h \
|
||||||
backends/meta-orientation-manager.c \
|
backends/meta-orientation-manager.c \
|
||||||
backends/meta-orientation-manager.h \
|
backends/meta-orientation-manager.h \
|
||||||
|
backends/meta-output.c \
|
||||||
|
backends/meta-output.h \
|
||||||
backends/meta-pointer-constraint.c \
|
backends/meta-pointer-constraint.c \
|
||||||
backends/meta-pointer-constraint.h \
|
backends/meta-pointer-constraint.h \
|
||||||
backends/meta-settings.c \
|
backends/meta-settings.c \
|
||||||
|
@ -21,9 +21,11 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
|
||||||
|
#include "backends/meta-backend-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT)
|
||||||
|
|
||||||
static MetaMonitor *
|
static MetaMonitor *
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "backends/meta-monitor-config-migration.h"
|
#include "backends/meta-monitor-config-migration.h"
|
||||||
#include "backends/meta-monitor-config-store.h"
|
#include "backends/meta-monitor-config-store.h"
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "core/boxes-private.h"
|
#include "core/boxes-private.h"
|
||||||
|
|
||||||
#define CONFIG_HISTORY_MAX_SIZE 3
|
#define CONFIG_HISTORY_MAX_SIZE 3
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
#include "backends/meta-monitor-config-manager.h"
|
#include "backends/meta-monitor-config-manager.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
@ -69,7 +70,7 @@ meta_output_dummy_notify_destroy (MetaOutput *output);
|
|||||||
static void
|
static void
|
||||||
append_monitor (GArray *modes,
|
append_monitor (GArray *modes,
|
||||||
GArray *crtcs,
|
GArray *crtcs,
|
||||||
GArray *outputs,
|
GList **outputs,
|
||||||
float scale)
|
float scale)
|
||||||
{
|
{
|
||||||
MetaCrtcMode modes_decl[] = {
|
MetaCrtcMode modes_decl[] = {
|
||||||
@ -86,8 +87,9 @@ append_monitor (GArray *modes,
|
|||||||
};
|
};
|
||||||
MetaCrtc crtc;
|
MetaCrtc crtc;
|
||||||
MetaOutputDummy *output_dummy;
|
MetaOutputDummy *output_dummy;
|
||||||
MetaOutput output;
|
MetaOutput *output;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
unsigned int number;
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
||||||
modes_decl[i].mode_id = modes->len + i;
|
modes_decl[i].mode_id = modes->len + i;
|
||||||
@ -99,47 +101,49 @@ append_monitor (GArray *modes,
|
|||||||
};
|
};
|
||||||
g_array_append_val (crtcs, crtc);
|
g_array_append_val (crtcs, crtc);
|
||||||
|
|
||||||
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
|
|
||||||
output_dummy = g_new0 (MetaOutputDummy, 1);
|
output_dummy = g_new0 (MetaOutputDummy, 1);
|
||||||
*output_dummy = (MetaOutputDummy) {
|
*output_dummy = (MetaOutputDummy) {
|
||||||
.scale = scale
|
.scale = scale
|
||||||
};
|
};
|
||||||
|
|
||||||
output = (MetaOutput) {
|
number = g_list_length (*outputs) + 1;
|
||||||
.winsys_id = outputs->len + 1,
|
|
||||||
.name = g_strdup_printf ("LVDS%d", outputs->len + 1),
|
|
||||||
.vendor = g_strdup ("MetaProducts Inc."),
|
|
||||||
.product = g_strdup ("MetaMonitor"),
|
|
||||||
.serial = g_strdup_printf ("0xC0FFEE-%d", outputs->len + 1),
|
|
||||||
.suggested_x = -1,
|
|
||||||
.suggested_y = -1,
|
|
||||||
.width_mm = 222,
|
|
||||||
.height_mm = 125,
|
|
||||||
.subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN,
|
|
||||||
.preferred_mode = &array_last (modes, MetaCrtcMode),
|
|
||||||
.n_possible_clones = 0,
|
|
||||||
.backlight = -1,
|
|
||||||
.connector_type = META_CONNECTOR_TYPE_LVDS,
|
|
||||||
.driver_private = output_dummy,
|
|
||||||
.driver_notify =
|
|
||||||
(GDestroyNotify) meta_output_dummy_notify_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
output->winsys_id = number;
|
||||||
|
output->name = g_strdup_printf ("LVDS%d", number);
|
||||||
|
output->vendor = g_strdup ("MetaProducts Inc.");
|
||||||
|
output->product = g_strdup ("MetaMonitor");
|
||||||
|
output->serial = g_strdup_printf ("0xC0FFEE-%d", number);
|
||||||
|
output->suggested_x = -1;
|
||||||
|
output->suggested_y = -1;
|
||||||
|
output->width_mm = 222;
|
||||||
|
output->height_mm = 125;
|
||||||
|
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
|
output->preferred_mode = &array_last (modes, MetaCrtcMode);
|
||||||
|
output->n_possible_clones = 0;
|
||||||
|
output->backlight = -1;
|
||||||
|
output->connector_type = META_CONNECTOR_TYPE_LVDS;
|
||||||
|
output->driver_private = output_dummy;
|
||||||
|
output->driver_notify =
|
||||||
|
(GDestroyNotify) meta_output_dummy_notify_destroy;
|
||||||
|
|
||||||
|
output->modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
||||||
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
for (i = 0; i < G_N_ELEMENTS (modes_decl); i++)
|
||||||
output.modes[i] = &g_array_index (modes, MetaCrtcMode,
|
output->modes[i] = &g_array_index (modes, MetaCrtcMode,
|
||||||
modes->len - (i + 1));
|
modes->len - (i + 1));
|
||||||
output.n_modes = G_N_ELEMENTS (modes_decl);
|
output->n_modes = G_N_ELEMENTS (modes_decl);
|
||||||
output.possible_crtcs = g_new0 (MetaCrtc *, 1);
|
output->possible_crtcs = g_new0 (MetaCrtc *, 1);
|
||||||
output.possible_crtcs[0] = &array_last (crtcs, MetaCrtc);
|
output->possible_crtcs[0] = &array_last (crtcs, MetaCrtc);
|
||||||
output.n_possible_crtcs = 1;
|
output->n_possible_crtcs = 1;
|
||||||
|
|
||||||
g_array_append_val (outputs, output);
|
*outputs = g_list_append (*outputs, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
append_tiled_monitor (GArray *modes,
|
append_tiled_monitor (GArray *modes,
|
||||||
GArray *crtcs,
|
GArray *crtcs,
|
||||||
GArray *outputs,
|
GList **outputs,
|
||||||
int scale)
|
int scale)
|
||||||
{
|
{
|
||||||
MetaCrtcMode modes_decl[] = {
|
MetaCrtcMode modes_decl[] = {
|
||||||
@ -162,7 +166,7 @@ append_tiled_monitor (GArray *modes,
|
|||||||
.all_transforms = ALL_TRANSFORMS,
|
.all_transforms = ALL_TRANSFORMS,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
MetaOutput output;
|
MetaOutput *output;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint32_t tile_group_id;
|
uint32_t tile_group_id;
|
||||||
|
|
||||||
@ -174,61 +178,66 @@ append_tiled_monitor (GArray *modes,
|
|||||||
crtcs_decl[i].crtc_id = crtcs->len + i + 1;
|
crtcs_decl[i].crtc_id = crtcs->len + i + 1;
|
||||||
g_array_append_vals (crtcs, crtcs_decl, G_N_ELEMENTS (crtcs_decl));
|
g_array_append_vals (crtcs, crtcs_decl, G_N_ELEMENTS (crtcs_decl));
|
||||||
|
|
||||||
tile_group_id = outputs->len + 1;
|
tile_group_id = g_list_length (*outputs) + 1;
|
||||||
for (i = 0; i < G_N_ELEMENTS (crtcs_decl); i++)
|
for (i = 0; i < G_N_ELEMENTS (crtcs_decl); i++)
|
||||||
{
|
{
|
||||||
MetaOutputDummy *output_dummy;
|
MetaOutputDummy *output_dummy;
|
||||||
MetaCrtcMode *preferred_mode;
|
MetaCrtcMode *preferred_mode;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
unsigned int number;
|
||||||
|
|
||||||
output_dummy = g_new0 (MetaOutputDummy, 1);
|
output_dummy = g_new0 (MetaOutputDummy, 1);
|
||||||
*output_dummy = (MetaOutputDummy) {
|
*output_dummy = (MetaOutputDummy) {
|
||||||
.scale = scale
|
.scale = scale
|
||||||
};
|
};
|
||||||
|
|
||||||
preferred_mode = &array_last (modes, MetaCrtcMode),
|
/* Arbitrary ID unique for this output */
|
||||||
output = (MetaOutput) {
|
number = g_list_length (*outputs) + 1;
|
||||||
.winsys_id = outputs->len + 1,
|
|
||||||
.name = g_strdup_printf ("LVDS%d", outputs->len + 1),
|
|
||||||
.vendor = g_strdup ("MetaProducts Inc."),
|
|
||||||
.product = g_strdup ("MetaMonitor"),
|
|
||||||
.serial = g_strdup_printf ("0xC0FFEE-%d", outputs->len + 1),
|
|
||||||
.suggested_x = -1,
|
|
||||||
.suggested_y = -1,
|
|
||||||
.width_mm = 222,
|
|
||||||
.height_mm = 125,
|
|
||||||
.subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN,
|
|
||||||
.preferred_mode = preferred_mode,
|
|
||||||
.n_possible_clones = 0,
|
|
||||||
.backlight = -1,
|
|
||||||
.connector_type = META_CONNECTOR_TYPE_LVDS,
|
|
||||||
.tile_info = (MetaTileInfo) {
|
|
||||||
.group_id = tile_group_id,
|
|
||||||
.max_h_tiles = G_N_ELEMENTS (crtcs_decl),
|
|
||||||
.max_v_tiles = 1,
|
|
||||||
.loc_h_tile = i,
|
|
||||||
.loc_v_tile = 0,
|
|
||||||
.tile_w = preferred_mode->width,
|
|
||||||
.tile_h = preferred_mode->height
|
|
||||||
},
|
|
||||||
.driver_private = output_dummy,
|
|
||||||
.driver_notify =
|
|
||||||
(GDestroyNotify) meta_output_dummy_notify_destroy
|
|
||||||
};
|
|
||||||
|
|
||||||
output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
preferred_mode = &array_last (modes, MetaCrtcMode);
|
||||||
|
|
||||||
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
|
|
||||||
|
output->winsys_id = number;
|
||||||
|
output->name = g_strdup_printf ("LVDS%d", number);
|
||||||
|
output->vendor = g_strdup ("MetaProducts Inc.");
|
||||||
|
output->product = g_strdup ("MetaMonitor");
|
||||||
|
output->serial = g_strdup_printf ("0xC0FFEE-%d", number);
|
||||||
|
output->suggested_x = -1;
|
||||||
|
output->suggested_y = -1;
|
||||||
|
output->width_mm = 222;
|
||||||
|
output->height_mm = 125;
|
||||||
|
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
|
output->preferred_mode = preferred_mode;
|
||||||
|
output->n_possible_clones = 0;
|
||||||
|
output->backlight = -1;
|
||||||
|
output->connector_type = META_CONNECTOR_TYPE_LVDS;
|
||||||
|
output->tile_info = (MetaTileInfo) {
|
||||||
|
.group_id = tile_group_id,
|
||||||
|
.max_h_tiles = G_N_ELEMENTS (crtcs_decl),
|
||||||
|
.max_v_tiles = 1,
|
||||||
|
.loc_h_tile = i,
|
||||||
|
.loc_v_tile = 0,
|
||||||
|
.tile_w = preferred_mode->width,
|
||||||
|
.tile_h = preferred_mode->height
|
||||||
|
},
|
||||||
|
output->driver_private = output_dummy;
|
||||||
|
output->driver_notify =
|
||||||
|
(GDestroyNotify) meta_output_dummy_notify_destroy;
|
||||||
|
|
||||||
|
output->modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl));
|
||||||
for (j = 0; j < G_N_ELEMENTS (modes_decl); j++)
|
for (j = 0; j < G_N_ELEMENTS (modes_decl); j++)
|
||||||
output.modes[j] = &g_array_index (modes, MetaCrtcMode,
|
output->modes[j] = &g_array_index (modes, MetaCrtcMode,
|
||||||
modes->len - (j + 1));
|
modes->len - (j + 1));
|
||||||
output.n_modes = G_N_ELEMENTS (modes_decl);
|
output->n_modes = G_N_ELEMENTS (modes_decl);
|
||||||
|
|
||||||
output.possible_crtcs = g_new0 (MetaCrtc *, G_N_ELEMENTS (crtcs_decl));
|
output->possible_crtcs = g_new0 (MetaCrtc *, G_N_ELEMENTS (crtcs_decl));
|
||||||
for (j = 0; j < G_N_ELEMENTS (crtcs_decl); j++)
|
for (j = 0; j < G_N_ELEMENTS (crtcs_decl); j++)
|
||||||
output.possible_crtcs[j] = &g_array_index (crtcs, MetaCrtc,
|
output->possible_crtcs[j] = &g_array_index (crtcs, MetaCrtc,
|
||||||
crtcs->len - (j + 1));
|
crtcs->len - (j + 1));
|
||||||
output.n_possible_crtcs = G_N_ELEMENTS (crtcs_decl);
|
output->n_possible_crtcs = G_N_ELEMENTS (crtcs_decl);
|
||||||
|
|
||||||
g_array_append_val (outputs, output);
|
*outputs = g_list_append (*outputs, output);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +257,7 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
const char *tiled_monitors_str;
|
const char *tiled_monitors_str;
|
||||||
gboolean tiled_monitors;
|
gboolean tiled_monitors;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
GArray *outputs;
|
GList *outputs;
|
||||||
GArray *crtcs;
|
GArray *crtcs;
|
||||||
GArray *modes;
|
GArray *modes;
|
||||||
|
|
||||||
@ -321,26 +330,24 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
modes = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtcMode), MAX_MODES);
|
modes = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtcMode), MAX_MODES);
|
||||||
crtcs = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtc), MAX_CRTCS);
|
crtcs = g_array_sized_new (FALSE, TRUE, sizeof (MetaCrtc), MAX_CRTCS);
|
||||||
outputs = g_array_sized_new (FALSE, TRUE, sizeof (MetaOutput), MAX_OUTPUTS);
|
outputs = NULL;
|
||||||
|
|
||||||
for (i = 0; i < num_monitors; i++)
|
for (i = 0; i < num_monitors; i++)
|
||||||
{
|
{
|
||||||
if (tiled_monitors)
|
if (tiled_monitors)
|
||||||
append_tiled_monitor (modes, crtcs, outputs, monitor_scales[i]);
|
append_tiled_monitor (modes, crtcs, &outputs, monitor_scales[i]);
|
||||||
else
|
else
|
||||||
append_monitor (modes, crtcs, outputs, monitor_scales[i]);
|
append_monitor (modes, crtcs, &outputs, monitor_scales[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
manager->modes = (MetaCrtcMode *) modes->data;
|
manager->modes = (MetaCrtcMode *) modes->data;
|
||||||
manager->n_modes = modes->len;
|
manager->n_modes = modes->len;
|
||||||
manager->crtcs = (MetaCrtc *) crtcs->data;
|
manager->crtcs = (MetaCrtc *) crtcs->data;
|
||||||
manager->n_crtcs = crtcs->len;
|
manager->n_crtcs = crtcs->len;
|
||||||
manager->outputs = (MetaOutput *) outputs->data;
|
manager->outputs = outputs;
|
||||||
manager->n_outputs = outputs->len;
|
|
||||||
|
|
||||||
g_array_free (modes, FALSE);
|
g_array_free (modes, FALSE);
|
||||||
g_array_free (crtcs, FALSE);
|
g_array_free (crtcs, FALSE);
|
||||||
g_array_free (outputs, FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -363,6 +370,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
MetaOutputInfo **outputs,
|
MetaOutputInfo **outputs,
|
||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
|
GList *l;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
@ -446,9 +454,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->is_dirty)
|
if (output->is_dirty)
|
||||||
{
|
{
|
||||||
|
@ -105,28 +105,6 @@ typedef enum
|
|||||||
META_MONITOR_TRANSFORM_FLIPPED_270,
|
META_MONITOR_TRANSFORM_FLIPPED_270,
|
||||||
} MetaMonitorTransform;
|
} MetaMonitorTransform;
|
||||||
|
|
||||||
/* This matches the values in drm_mode.h */
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
META_CONNECTOR_TYPE_Unknown = 0,
|
|
||||||
META_CONNECTOR_TYPE_VGA = 1,
|
|
||||||
META_CONNECTOR_TYPE_DVII = 2,
|
|
||||||
META_CONNECTOR_TYPE_DVID = 3,
|
|
||||||
META_CONNECTOR_TYPE_DVIA = 4,
|
|
||||||
META_CONNECTOR_TYPE_Composite = 5,
|
|
||||||
META_CONNECTOR_TYPE_SVIDEO = 6,
|
|
||||||
META_CONNECTOR_TYPE_LVDS = 7,
|
|
||||||
META_CONNECTOR_TYPE_Component = 8,
|
|
||||||
META_CONNECTOR_TYPE_9PinDIN = 9,
|
|
||||||
META_CONNECTOR_TYPE_DisplayPort = 10,
|
|
||||||
META_CONNECTOR_TYPE_HDMIA = 11,
|
|
||||||
META_CONNECTOR_TYPE_HDMIB = 12,
|
|
||||||
META_CONNECTOR_TYPE_TV = 13,
|
|
||||||
META_CONNECTOR_TYPE_eDP = 14,
|
|
||||||
META_CONNECTOR_TYPE_VIRTUAL = 15,
|
|
||||||
META_CONNECTOR_TYPE_DSI = 16,
|
|
||||||
} MetaConnectorType;
|
|
||||||
|
|
||||||
/* Same as KMS mode flags and X11 randr flags */
|
/* Same as KMS mode flags and X11 randr flags */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@ -149,74 +127,6 @@ typedef enum
|
|||||||
META_CRTC_MODE_FLAG_MASK = 0x3fff
|
META_CRTC_MODE_FLAG_MASK = 0x3fff
|
||||||
} MetaCrtcModeFlag;
|
} MetaCrtcModeFlag;
|
||||||
|
|
||||||
struct _MetaTileInfo
|
|
||||||
{
|
|
||||||
guint32 group_id;
|
|
||||||
guint32 flags;
|
|
||||||
guint32 max_h_tiles;
|
|
||||||
guint32 max_v_tiles;
|
|
||||||
guint32 loc_h_tile;
|
|
||||||
guint32 loc_v_tile;
|
|
||||||
guint32 tile_w;
|
|
||||||
guint32 tile_h;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaOutput
|
|
||||||
{
|
|
||||||
/* The CRTC driving this output, NULL if the output is not enabled */
|
|
||||||
MetaCrtc *crtc;
|
|
||||||
/* The low-level ID of this output, used to apply back configuration */
|
|
||||||
glong winsys_id;
|
|
||||||
char *name;
|
|
||||||
char *vendor;
|
|
||||||
char *product;
|
|
||||||
char *serial;
|
|
||||||
int width_mm;
|
|
||||||
int height_mm;
|
|
||||||
CoglSubpixelOrder subpixel_order;
|
|
||||||
|
|
||||||
MetaConnectorType connector_type;
|
|
||||||
|
|
||||||
MetaCrtcMode *preferred_mode;
|
|
||||||
MetaCrtcMode **modes;
|
|
||||||
unsigned int n_modes;
|
|
||||||
|
|
||||||
MetaCrtc **possible_crtcs;
|
|
||||||
unsigned int n_possible_crtcs;
|
|
||||||
|
|
||||||
MetaOutput **possible_clones;
|
|
||||||
unsigned int n_possible_clones;
|
|
||||||
|
|
||||||
int backlight;
|
|
||||||
int backlight_min;
|
|
||||||
int backlight_max;
|
|
||||||
|
|
||||||
/* Used when changing configuration */
|
|
||||||
gboolean is_dirty;
|
|
||||||
|
|
||||||
/* The low-level bits used to build the high-level info
|
|
||||||
in MetaLogicalMonitor
|
|
||||||
|
|
||||||
XXX: flags maybe?
|
|
||||||
There is a lot of code that uses MonitorInfo->is_primary,
|
|
||||||
but nobody uses MetaOutput yet
|
|
||||||
*/
|
|
||||||
gboolean is_primary;
|
|
||||||
gboolean is_presentation;
|
|
||||||
gboolean is_underscanning;
|
|
||||||
gboolean supports_underscanning;
|
|
||||||
|
|
||||||
gpointer driver_private;
|
|
||||||
GDestroyNotify driver_notify;
|
|
||||||
|
|
||||||
/* get a new preferred mode on hotplug events, to handle dynamic guest resizing */
|
|
||||||
gboolean hotplug_mode_update;
|
|
||||||
gint suggested_x;
|
|
||||||
gint suggested_y;
|
|
||||||
|
|
||||||
MetaTileInfo tile_info;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaCrtc
|
struct _MetaCrtc
|
||||||
{
|
{
|
||||||
glong crtc_id;
|
glong crtc_id;
|
||||||
@ -317,8 +227,7 @@ struct _MetaMonitorManager
|
|||||||
(like encoders, but less tied to the HW),
|
(like encoders, but less tied to the HW),
|
||||||
while logical_monitors refer to logical ones.
|
while logical_monitors refer to logical ones.
|
||||||
*/
|
*/
|
||||||
MetaOutput *outputs;
|
GList *outputs;
|
||||||
unsigned int n_outputs;
|
|
||||||
|
|
||||||
MetaCrtcMode *modes;
|
MetaCrtcMode *modes;
|
||||||
unsigned int n_modes;
|
unsigned int n_modes;
|
||||||
@ -451,8 +360,7 @@ MetaMonitor * meta_monitor_manager_get_monitor_from_connector (MetaMonitor
|
|||||||
|
|
||||||
GList * meta_monitor_manager_get_monitors (MetaMonitorManager *manager);
|
GList * meta_monitor_manager_get_monitors (MetaMonitorManager *manager);
|
||||||
|
|
||||||
MetaOutput *meta_monitor_manager_get_outputs (MetaMonitorManager *manager,
|
GList * meta_monitor_manager_get_outputs (MetaMonitorManager *manager);
|
||||||
unsigned int *n_outputs);
|
|
||||||
|
|
||||||
void meta_monitor_manager_get_resources (MetaMonitorManager *manager,
|
void meta_monitor_manager_get_resources (MetaMonitorManager *manager,
|
||||||
MetaCrtcMode **modes,
|
MetaCrtcMode **modes,
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
#include "backends/meta-monitor-config-manager.h"
|
#include "backends/meta-monitor-config-manager.h"
|
||||||
#include "backends/meta-orientation-manager.h"
|
#include "backends/meta-orientation-manager.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
@ -446,11 +447,11 @@ meta_monitor_manager_apply_monitors_config (MetaMonitorManager *manager,
|
|||||||
gboolean
|
gboolean
|
||||||
meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager)
|
meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->hotplug_mode_update)
|
if (output->hotplug_mode_update)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -718,35 +719,6 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
manager->in_init = FALSE;
|
manager->in_init = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_monitor_manager_clear_output (MetaOutput *output)
|
|
||||||
{
|
|
||||||
g_free (output->name);
|
|
||||||
g_free (output->vendor);
|
|
||||||
g_free (output->product);
|
|
||||||
g_free (output->serial);
|
|
||||||
g_free (output->modes);
|
|
||||||
g_free (output->possible_crtcs);
|
|
||||||
g_free (output->possible_clones);
|
|
||||||
|
|
||||||
if (output->driver_notify)
|
|
||||||
output->driver_notify (output);
|
|
||||||
|
|
||||||
memset (output, 0, sizeof (*output));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
|
||||||
int n_old_outputs)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n_old_outputs; i++)
|
|
||||||
meta_monitor_manager_clear_output (&old_outputs[i]);
|
|
||||||
|
|
||||||
g_free (old_outputs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_manager_clear_mode (MetaCrtcMode *mode)
|
meta_monitor_manager_clear_mode (MetaCrtcMode *mode)
|
||||||
{
|
{
|
||||||
@ -796,7 +768,7 @@ meta_monitor_manager_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||||
|
|
||||||
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
g_list_free_full (manager->outputs, g_object_unref);
|
||||||
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
||||||
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
||||||
g_list_free_full (manager->logical_monitors, g_object_unref);
|
g_list_free_full (manager->logical_monitors, g_object_unref);
|
||||||
@ -965,6 +937,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (skeleton);
|
||||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (skeleton);
|
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (skeleton);
|
||||||
GVariantBuilder crtc_builder, output_builder, mode_builder;
|
GVariantBuilder crtc_builder, output_builder, mode_builder;
|
||||||
|
GList *l;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
int max_screen_width;
|
int max_screen_width;
|
||||||
int max_screen_height;
|
int max_screen_height;
|
||||||
@ -996,9 +969,9 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
NULL /* properties */);
|
NULL /* properties */);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
GVariantBuilder crtcs, modes, clones, properties;
|
GVariantBuilder crtcs, modes, clones, properties;
|
||||||
GBytes *edid;
|
GBytes *edid;
|
||||||
char *edid_file;
|
char *edid_file;
|
||||||
@ -1015,8 +988,13 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
|
|
||||||
g_variant_builder_init (&clones, G_VARIANT_TYPE ("au"));
|
g_variant_builder_init (&clones, G_VARIANT_TYPE ("au"));
|
||||||
for (j = 0; j < output->n_possible_clones; j++)
|
for (j = 0; j < output->n_possible_clones; j++)
|
||||||
g_variant_builder_add (&clones, "u",
|
{
|
||||||
(unsigned)(output->possible_clones[j] - manager->outputs));
|
unsigned int possible_clone_index;
|
||||||
|
|
||||||
|
possible_clone_index = g_list_index (manager->outputs,
|
||||||
|
output->possible_clones[j]);
|
||||||
|
g_variant_builder_add (&clones, "u", possible_clone_index);
|
||||||
|
}
|
||||||
|
|
||||||
g_variant_builder_init (&properties, G_VARIANT_TYPE ("a{sv}"));
|
g_variant_builder_init (&properties, G_VARIANT_TYPE ("a{sv}"));
|
||||||
g_variant_builder_add (&properties, "{sv}", "vendor",
|
g_variant_builder_add (&properties, "{sv}", "vendor",
|
||||||
@ -2030,14 +2008,14 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output_index >= manager->n_outputs)
|
if (output_index >= g_list_length (manager->outputs))
|
||||||
{
|
{
|
||||||
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
|
||||||
G_DBUS_ERROR_INVALID_ARGS,
|
G_DBUS_ERROR_INVALID_ARGS,
|
||||||
"Invalid output id");
|
"Invalid output id");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
output = &manager->outputs[output_index];
|
output = g_list_nth_data (manager->outputs, output_index);
|
||||||
|
|
||||||
if (value < 0 || value > 100)
|
if (value < 0 || value > 100)
|
||||||
{
|
{
|
||||||
@ -2425,11 +2403,9 @@ meta_monitor_manager_get_monitors (MetaMonitorManager *manager)
|
|||||||
return manager->monitors;
|
return manager->monitors;
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaOutput *
|
GList *
|
||||||
meta_monitor_manager_get_outputs (MetaMonitorManager *manager,
|
meta_monitor_manager_get_outputs (MetaMonitorManager *manager)
|
||||||
unsigned int *n_outputs)
|
|
||||||
{
|
{
|
||||||
*n_outputs = manager->n_outputs;
|
|
||||||
return manager->outputs;
|
return manager->outputs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2471,7 +2447,7 @@ meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
|||||||
static void
|
static void
|
||||||
rebuild_monitors (MetaMonitorManager *manager)
|
rebuild_monitors (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
GList *l;
|
||||||
|
|
||||||
if (manager->monitors)
|
if (manager->monitors)
|
||||||
{
|
{
|
||||||
@ -2479,9 +2455,9 @@ rebuild_monitors (MetaMonitorManager *manager)
|
|||||||
manager->monitors = NULL;
|
manager->monitors = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->tile_info.group_id)
|
if (output->tile_info.group_id)
|
||||||
{
|
{
|
||||||
@ -2541,16 +2517,15 @@ meta_monitor_manager_is_transform_handled (MetaMonitorManager *manager,
|
|||||||
void
|
void
|
||||||
meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
MetaOutput *old_outputs;
|
GList *old_outputs;
|
||||||
MetaCrtc *old_crtcs;
|
MetaCrtc *old_crtcs;
|
||||||
MetaCrtcMode *old_modes;
|
MetaCrtcMode *old_modes;
|
||||||
unsigned int n_old_outputs, n_old_crtcs, n_old_modes;
|
unsigned int n_old_crtcs, n_old_modes;
|
||||||
|
|
||||||
/* Some implementations of read_current use the existing information
|
/* Some implementations of read_current use the existing information
|
||||||
* we have available, so don't free the old configuration until after
|
* we have available, so don't free the old configuration until after
|
||||||
* read_current finishes. */
|
* read_current finishes. */
|
||||||
old_outputs = manager->outputs;
|
old_outputs = manager->outputs;
|
||||||
n_old_outputs = manager->n_outputs;
|
|
||||||
old_crtcs = manager->crtcs;
|
old_crtcs = manager->crtcs;
|
||||||
n_old_crtcs = manager->n_crtcs;
|
n_old_crtcs = manager->n_crtcs;
|
||||||
old_modes = manager->modes;
|
old_modes = manager->modes;
|
||||||
@ -2561,7 +2536,7 @@ meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
rebuild_monitors (manager);
|
rebuild_monitors (manager);
|
||||||
|
|
||||||
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
g_list_free_full (old_outputs, g_object_unref);
|
||||||
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
||||||
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
||||||
}
|
}
|
||||||
@ -2832,9 +2807,9 @@ meta_monitor_manager_get_monitor_for_output (MetaMonitorManager *manager,
|
|||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_MONITOR_MANAGER (manager), -1);
|
g_return_val_if_fail (META_IS_MONITOR_MANAGER (manager), -1);
|
||||||
g_return_val_if_fail (id < manager->n_outputs, -1);
|
g_return_val_if_fail (id < g_list_length (manager->outputs), -1);
|
||||||
|
|
||||||
output = &manager->outputs[id];
|
output = g_list_nth_data (manager->outputs, id);
|
||||||
if (!output || !output->crtc)
|
if (!output || !output->crtc)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
#include "backends/meta-settings-private.h"
|
#include "backends/meta-settings-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
#define SCALE_FACTORS_PER_INTEGER 4
|
#define SCALE_FACTORS_PER_INTEGER 4
|
||||||
#define MINIMUM_SCALE_FACTOR 1.0f
|
#define MINIMUM_SCALE_FACTOR 1.0f
|
||||||
@ -560,11 +561,13 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorPrivate *monitor_priv =
|
MetaMonitorPrivate *monitor_priv =
|
||||||
meta_monitor_get_instance_private (META_MONITOR (monitor_tiled));
|
meta_monitor_get_instance_private (META_MONITOR (monitor_tiled));
|
||||||
unsigned int i;
|
GList *outputs;
|
||||||
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < monitor_manager->n_outputs; i++)
|
outputs = monitor_manager->outputs;
|
||||||
|
for (l = outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &monitor_manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->tile_info.group_id != monitor_tiled->tile_group_id)
|
if (output->tile_info.group_id != monitor_tiled->tile_group_id)
|
||||||
continue;
|
continue;
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
|
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
typedef struct _MetaMonitorSpec
|
typedef struct _MetaMonitorSpec
|
||||||
{
|
{
|
||||||
|
56
src/backends/meta-output.c
Normal file
56
src/backends/meta-output.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
|
G_DEFINE_TYPE (MetaOutput, meta_output, G_TYPE_OBJECT)
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_output_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
MetaOutput *output = META_OUTPUT (object);
|
||||||
|
|
||||||
|
g_free (output->name);
|
||||||
|
g_free (output->vendor);
|
||||||
|
g_free (output->product);
|
||||||
|
g_free (output->serial);
|
||||||
|
g_free (output->modes);
|
||||||
|
g_free (output->possible_crtcs);
|
||||||
|
g_free (output->possible_clones);
|
||||||
|
|
||||||
|
if (output->driver_notify)
|
||||||
|
output->driver_notify (output);
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_output_parent_class)->finalize (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_output_init (MetaOutput *output)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_output_class_init (MetaOutputClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
|
object_class->finalize = meta_output_finalize;
|
||||||
|
}
|
120
src/backends/meta-output.h
Normal file
120
src/backends/meta-output.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Red Hat
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_OUTPUT_H
|
||||||
|
#define META_OUTPUT_H
|
||||||
|
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
|
||||||
|
struct _MetaTileInfo
|
||||||
|
{
|
||||||
|
guint32 group_id;
|
||||||
|
guint32 flags;
|
||||||
|
guint32 max_h_tiles;
|
||||||
|
guint32 max_v_tiles;
|
||||||
|
guint32 loc_h_tile;
|
||||||
|
guint32 loc_v_tile;
|
||||||
|
guint32 tile_w;
|
||||||
|
guint32 tile_h;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* This matches the values in drm_mode.h */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
META_CONNECTOR_TYPE_Unknown = 0,
|
||||||
|
META_CONNECTOR_TYPE_VGA = 1,
|
||||||
|
META_CONNECTOR_TYPE_DVII = 2,
|
||||||
|
META_CONNECTOR_TYPE_DVID = 3,
|
||||||
|
META_CONNECTOR_TYPE_DVIA = 4,
|
||||||
|
META_CONNECTOR_TYPE_Composite = 5,
|
||||||
|
META_CONNECTOR_TYPE_SVIDEO = 6,
|
||||||
|
META_CONNECTOR_TYPE_LVDS = 7,
|
||||||
|
META_CONNECTOR_TYPE_Component = 8,
|
||||||
|
META_CONNECTOR_TYPE_9PinDIN = 9,
|
||||||
|
META_CONNECTOR_TYPE_DisplayPort = 10,
|
||||||
|
META_CONNECTOR_TYPE_HDMIA = 11,
|
||||||
|
META_CONNECTOR_TYPE_HDMIB = 12,
|
||||||
|
META_CONNECTOR_TYPE_TV = 13,
|
||||||
|
META_CONNECTOR_TYPE_eDP = 14,
|
||||||
|
META_CONNECTOR_TYPE_VIRTUAL = 15,
|
||||||
|
META_CONNECTOR_TYPE_DSI = 16,
|
||||||
|
} MetaConnectorType;
|
||||||
|
|
||||||
|
struct _MetaOutput
|
||||||
|
{
|
||||||
|
GObject parent;
|
||||||
|
|
||||||
|
/* The CRTC driving this output, NULL if the output is not enabled */
|
||||||
|
MetaCrtc *crtc;
|
||||||
|
|
||||||
|
/* The low-level ID of this output, used to apply back configuration */
|
||||||
|
glong winsys_id;
|
||||||
|
char *name;
|
||||||
|
char *vendor;
|
||||||
|
char *product;
|
||||||
|
char *serial;
|
||||||
|
int width_mm;
|
||||||
|
int height_mm;
|
||||||
|
CoglSubpixelOrder subpixel_order;
|
||||||
|
|
||||||
|
MetaConnectorType connector_type;
|
||||||
|
|
||||||
|
MetaCrtcMode *preferred_mode;
|
||||||
|
MetaCrtcMode **modes;
|
||||||
|
unsigned int n_modes;
|
||||||
|
|
||||||
|
MetaCrtc **possible_crtcs;
|
||||||
|
unsigned int n_possible_crtcs;
|
||||||
|
|
||||||
|
MetaOutput **possible_clones;
|
||||||
|
unsigned int n_possible_clones;
|
||||||
|
|
||||||
|
int backlight;
|
||||||
|
int backlight_min;
|
||||||
|
int backlight_max;
|
||||||
|
|
||||||
|
/* Used when changing configuration */
|
||||||
|
gboolean is_dirty;
|
||||||
|
|
||||||
|
gboolean is_primary;
|
||||||
|
gboolean is_presentation;
|
||||||
|
|
||||||
|
gboolean is_underscanning;
|
||||||
|
gboolean supports_underscanning;
|
||||||
|
|
||||||
|
gpointer driver_private;
|
||||||
|
GDestroyNotify driver_notify;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a new preferred mode on hotplug events, to handle dynamic guest
|
||||||
|
* resizing.
|
||||||
|
*/
|
||||||
|
gboolean hotplug_mode_update;
|
||||||
|
gint suggested_x;
|
||||||
|
gint suggested_y;
|
||||||
|
|
||||||
|
MetaTileInfo tile_info;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define META_TYPE_OUTPUT (meta_output_get_type ())
|
||||||
|
G_DECLARE_FINAL_TYPE (MetaOutput, meta_output, META, OUTPUT, GObject)
|
||||||
|
|
||||||
|
#endif /* META_OUTPUT_H */
|
@ -38,6 +38,7 @@
|
|||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "backends/native/meta-renderer-native.h"
|
#include "backends/native/meta-renderer-native.h"
|
||||||
#include "core/boxes-private.h"
|
#include "core/boxes-private.h"
|
||||||
#include "meta/boxes.h"
|
#include "meta/boxes.h"
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#include "meta-monitor-manager-kms.h"
|
#include "meta-monitor-manager-kms.h"
|
||||||
#include "meta-monitor-config-manager.h"
|
#include "meta-monitor-config-manager.h"
|
||||||
|
#include "meta-output.h"
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
#include "meta-renderer-native.h"
|
#include "meta-renderer-native.h"
|
||||||
|
|
||||||
@ -134,8 +135,8 @@ free_resources (MetaMonitorManagerKms *manager_kms)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compare_outputs (const void *one,
|
compare_outputs (gconstpointer one,
|
||||||
const void *two)
|
gconstpointer two)
|
||||||
{
|
{
|
||||||
const MetaOutput *o_one = one, *o_two = two;
|
const MetaOutput *o_one = one, *o_two = two;
|
||||||
|
|
||||||
@ -470,15 +471,18 @@ compare_modes (const void *one,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static MetaOutput *
|
static MetaOutput *
|
||||||
find_output_by_id (MetaOutput *outputs,
|
find_output_by_id (GList *outputs,
|
||||||
unsigned n_outputs,
|
glong id)
|
||||||
glong id)
|
|
||||||
{
|
{
|
||||||
unsigned i;
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (l = outputs; l; l = l->next)
|
||||||
if (outputs[i].winsys_id == id)
|
{
|
||||||
return &outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
|
if (output->winsys_id == id)
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -692,19 +696,21 @@ init_crtc (MetaCrtc *crtc,
|
|||||||
crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static MetaOutput *
|
||||||
init_output (MetaOutput *output,
|
create_output (MetaMonitorManager *manager,
|
||||||
MetaMonitorManager *manager,
|
drmModeConnector *connector,
|
||||||
drmModeConnector *connector,
|
MetaOutput *old_output)
|
||||||
MetaOutput *old_output)
|
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
|
MetaOutput *output;
|
||||||
MetaOutputKms *output_kms;
|
MetaOutputKms *output_kms;
|
||||||
GArray *crtcs;
|
GArray *crtcs;
|
||||||
GBytes *edid;
|
GBytes *edid;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int crtc_mask;
|
unsigned int crtc_mask;
|
||||||
|
|
||||||
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
|
|
||||||
output_kms = g_slice_new0 (MetaOutputKms);
|
output_kms = g_slice_new0 (MetaOutputKms);
|
||||||
output->driver_private = output_kms;
|
output->driver_private = output_kms;
|
||||||
output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
||||||
@ -865,6 +871,8 @@ init_output (MetaOutput *output,
|
|||||||
output->backlight_min = 0;
|
output->backlight_min = 0;
|
||||||
output->backlight_max = 0;
|
output->backlight_max = 0;
|
||||||
output->backlight = -1;
|
output->backlight = -1;
|
||||||
|
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -874,6 +882,7 @@ detect_and_setup_output_clones (MetaMonitorManager *manager,
|
|||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
drmModeEncoder **encoders;
|
drmModeEncoder **encoders;
|
||||||
unsigned int i, n_encoders;
|
unsigned int i, n_encoders;
|
||||||
|
GList *l;
|
||||||
|
|
||||||
n_encoders = (unsigned int) resources->count_encoders;
|
n_encoders = (unsigned int) resources->count_encoders;
|
||||||
encoders = g_new (drmModeEncoder *, n_encoders);
|
encoders = g_new (drmModeEncoder *, n_encoders);
|
||||||
@ -883,15 +892,12 @@ detect_and_setup_output_clones (MetaMonitorManager *manager,
|
|||||||
/*
|
/*
|
||||||
* Setup encoder position mask and encoder clone mask.
|
* Setup encoder position mask and encoder clone mask.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output = l->data;
|
||||||
MetaOutputKms *output_kms;
|
MetaOutputKms *output_kms = output->driver_private;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
output = &manager->outputs[i];
|
|
||||||
output_kms = output->driver_private;
|
|
||||||
|
|
||||||
output_kms->enc_clone_mask = 0xff;
|
output_kms->enc_clone_mask = 0xff;
|
||||||
output_kms->encoder_mask = 0;
|
output_kms->encoder_mask = 0;
|
||||||
|
|
||||||
@ -920,27 +926,21 @@ detect_and_setup_output_clones (MetaMonitorManager *manager,
|
|||||||
/*
|
/*
|
||||||
* Setup MetaOutput <-> MetaOutput clone associations.
|
* Setup MetaOutput <-> MetaOutput clone associations.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output = l->data;
|
||||||
MetaOutputKms *output_kms;
|
MetaOutputKms *output_kms = output->driver_private;
|
||||||
unsigned int j;
|
GList *k;
|
||||||
|
|
||||||
output = &manager->outputs[i];
|
|
||||||
output_kms = output->driver_private;
|
|
||||||
|
|
||||||
if (output_kms->enc_clone_mask == 0)
|
if (output_kms->enc_clone_mask == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (j = 0; j < manager->n_outputs; j++)
|
for (k = manager->outputs; k; k = k->next)
|
||||||
{
|
{
|
||||||
MetaOutput *meta_clone;
|
MetaOutput *clone = k->data;
|
||||||
MetaOutputKms *clone_kms;
|
MetaOutputKms *clone_kms = clone->driver_private;
|
||||||
|
|
||||||
meta_clone = &manager->outputs[i];
|
if (clone == output)
|
||||||
clone_kms = meta_clone->driver_private;
|
|
||||||
|
|
||||||
if (meta_clone == output)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (clone_kms->encoder_mask == 0)
|
if (clone_kms->encoder_mask == 0)
|
||||||
@ -952,7 +952,7 @@ detect_and_setup_output_clones (MetaMonitorManager *manager,
|
|||||||
output->possible_clones = g_renew (MetaOutput *,
|
output->possible_clones = g_renew (MetaOutput *,
|
||||||
output->possible_clones,
|
output->possible_clones,
|
||||||
output->n_possible_clones);
|
output->n_possible_clones);
|
||||||
output->possible_clones[output->n_possible_clones - 1] = meta_clone;
|
output->possible_clones[output->n_possible_clones - 1] = clone;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1066,42 +1066,33 @@ init_outputs (MetaMonitorManager *manager,
|
|||||||
drmModeRes *resources)
|
drmModeRes *resources)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
MetaOutput *old_outputs;
|
GList *old_outputs;
|
||||||
unsigned int n_old_outputs;
|
|
||||||
unsigned int n_actual_outputs;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
old_outputs = manager->outputs;
|
old_outputs = manager->outputs;
|
||||||
n_old_outputs = manager->n_outputs;
|
|
||||||
|
|
||||||
manager->outputs = g_new0 (MetaOutput, manager_kms->n_connectors);
|
manager->outputs = NULL;
|
||||||
n_actual_outputs = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < manager_kms->n_connectors; i++)
|
for (i = 0; i < manager_kms->n_connectors; i++)
|
||||||
{
|
{
|
||||||
drmModeConnector *connector;
|
drmModeConnector *connector;
|
||||||
MetaOutput *output;
|
|
||||||
|
|
||||||
connector = manager_kms->connectors[i];
|
connector = manager_kms->connectors[i];
|
||||||
output = &manager->outputs[n_actual_outputs];
|
|
||||||
|
|
||||||
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
||||||
{
|
{
|
||||||
|
MetaOutput *output;
|
||||||
MetaOutput *old_output;
|
MetaOutput *old_output;
|
||||||
|
|
||||||
old_output = find_output_by_id (old_outputs, n_old_outputs,
|
old_output = find_output_by_id (old_outputs, connector->connector_id);
|
||||||
connector->connector_id);
|
output = create_output (manager, connector, old_output);
|
||||||
init_output (output, manager, connector, old_output);
|
manager->outputs = g_list_prepend (manager->outputs, output);
|
||||||
n_actual_outputs++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
manager->n_outputs = n_actual_outputs;
|
|
||||||
manager->outputs = g_renew (MetaOutput, manager->outputs, manager->n_outputs);
|
|
||||||
|
|
||||||
/* Sort the outputs for easier handling in MetaMonitorConfig */
|
/* Sort the outputs for easier handling in MetaMonitorConfig */
|
||||||
qsort (manager->outputs, manager->n_outputs, sizeof (MetaOutput),
|
manager->outputs = g_list_sort (manager->outputs, compare_outputs);
|
||||||
compare_outputs);
|
|
||||||
|
|
||||||
detect_and_setup_output_clones (manager, resources);
|
detect_and_setup_output_clones (manager, resources);
|
||||||
}
|
}
|
||||||
@ -1163,7 +1154,7 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
unsigned i;
|
GList *l;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case META_POWER_SAVE_ON:
|
case META_POWER_SAVE_ON:
|
||||||
@ -1182,13 +1173,10 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output = l->data;
|
||||||
MetaOutputKms *output_kms;
|
MetaOutputKms *output_kms = output->driver_private;
|
||||||
|
|
||||||
output = &manager->outputs[i];
|
|
||||||
output_kms = output->driver_private;
|
|
||||||
|
|
||||||
if (output_kms->dpms_prop_id != 0)
|
if (output_kms->dpms_prop_id != 0)
|
||||||
{
|
{
|
||||||
@ -1264,6 +1252,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
{
|
{
|
||||||
@ -1370,9 +1359,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->is_dirty)
|
if (output->is_dirty)
|
||||||
{
|
{
|
||||||
@ -1605,12 +1594,12 @@ get_crtc_connectors (MetaMonitorManager *manager,
|
|||||||
uint32_t **connectors,
|
uint32_t **connectors,
|
||||||
unsigned int *n_connectors)
|
unsigned int *n_connectors)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
|
||||||
GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
|
GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
|
||||||
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->crtc == crtc)
|
if (output->crtc == crtc)
|
||||||
g_array_append_val (connectors_array, output->winsys_id);
|
g_array_append_val (connectors_array, output->winsys_id);
|
||||||
@ -1671,16 +1660,16 @@ meta_monitor_manager_kms_is_crtc_active (MetaMonitorManagerKms *manager_kms,
|
|||||||
MetaCrtc *crtc)
|
MetaCrtc *crtc)
|
||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
||||||
unsigned int i;
|
GList *l;
|
||||||
gboolean connected_crtc_found;
|
gboolean connected_crtc_found;
|
||||||
|
|
||||||
if (manager->power_save_mode != META_POWER_SAVE_ON)
|
if (manager->power_save_mode != META_POWER_SAVE_ON)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
connected_crtc_found = FALSE;
|
connected_crtc_found = FALSE;
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->crtc == crtc)
|
if (output->crtc == crtc)
|
||||||
{
|
{
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
#include "backends/meta-egl.h"
|
#include "backends/meta-egl.h"
|
||||||
#include "backends/meta-egl-ext.h"
|
#include "backends/meta-egl-ext.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "backends/meta-renderer-view.h"
|
#include "backends/meta-renderer-view.h"
|
||||||
#include "backends/native/meta-monitor-manager-kms.h"
|
#include "backends/native/meta-monitor-manager-kms.h"
|
||||||
#include "backends/native/meta-renderer-native.h"
|
#include "backends/native/meta-renderer-native.h"
|
||||||
|
@ -45,6 +45,7 @@
|
|||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "backends/meta-monitor-config-manager.h"
|
#include "backends/meta-monitor-config-manager.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
@ -731,8 +732,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
XRRScreenResources *resources;
|
XRRScreenResources *resources;
|
||||||
RROutput primary_output;
|
RROutput primary_output;
|
||||||
unsigned int i, j, k;
|
unsigned int i, j;
|
||||||
unsigned int n_actual_outputs;
|
GList *l;
|
||||||
int min_width, min_height;
|
int min_width, min_height;
|
||||||
Screen *screen;
|
Screen *screen;
|
||||||
BOOL dpms_capable, dpms_enabled;
|
BOOL dpms_capable, dpms_enabled;
|
||||||
@ -790,10 +791,9 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
manager_xrandr->resources = resources;
|
manager_xrandr->resources = resources;
|
||||||
manager->n_outputs = resources->noutput;
|
|
||||||
manager->n_crtcs = resources->ncrtc;
|
manager->n_crtcs = resources->ncrtc;
|
||||||
manager->n_modes = resources->nmode;
|
manager->n_modes = resources->nmode;
|
||||||
manager->outputs = g_new0 (MetaOutput, manager->n_outputs);
|
manager->outputs = NULL;
|
||||||
manager->modes = g_new0 (MetaCrtcMode, manager->n_modes);
|
manager->modes = g_new0 (MetaCrtcMode, manager->n_modes);
|
||||||
manager->crtcs = g_new0 (MetaCrtc, manager->n_crtcs);
|
manager->crtcs = g_new0 (MetaCrtc, manager->n_crtcs);
|
||||||
|
|
||||||
@ -846,7 +846,6 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay,
|
primary_output = XRRGetOutputPrimary (manager_xrandr->xdisplay,
|
||||||
DefaultRootWindow (manager_xrandr->xdisplay));
|
DefaultRootWindow (manager_xrandr->xdisplay));
|
||||||
|
|
||||||
n_actual_outputs = 0;
|
|
||||||
for (i = 0; i < (unsigned)resources->noutput; i++)
|
for (i = 0; i < (unsigned)resources->noutput; i++)
|
||||||
{
|
{
|
||||||
XRROutputInfo *xrandr_output;
|
XRROutputInfo *xrandr_output;
|
||||||
@ -857,7 +856,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
if (!xrandr_output)
|
if (!xrandr_output)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
output = &manager->outputs[n_actual_outputs];
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
|
|
||||||
if (xrandr_output->connection != RR_Disconnected)
|
if (xrandr_output->connection != RR_Disconnected)
|
||||||
{
|
{
|
||||||
@ -910,35 +909,34 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
output->backlight = -1;
|
output->backlight = -1;
|
||||||
|
|
||||||
if (output->n_modes == 0 || output->n_possible_crtcs == 0)
|
if (output->n_modes == 0 || output->n_possible_crtcs == 0)
|
||||||
meta_monitor_manager_clear_output (output);
|
g_object_unref (output);
|
||||||
else
|
else
|
||||||
n_actual_outputs++;
|
manager->outputs = g_list_prepend (manager->outputs, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
XRRFreeOutputInfo (xrandr_output);
|
XRRFreeOutputInfo (xrandr_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
manager->n_outputs = n_actual_outputs;
|
|
||||||
|
|
||||||
/* Sort the outputs for easier handling in MetaMonitorConfig */
|
/* Sort the outputs for easier handling in MetaMonitorConfig */
|
||||||
qsort (manager->outputs, manager->n_outputs, sizeof (MetaOutput), compare_outputs);
|
manager->outputs = g_list_sort (manager->outputs, compare_outputs);
|
||||||
|
|
||||||
/* Now fix the clones */
|
/* Now fix the clones */
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output;
|
MetaOutput *output = l->data;
|
||||||
|
GList *k;
|
||||||
output = &manager->outputs[i];
|
|
||||||
|
|
||||||
for (j = 0; j < output->n_possible_clones; j++)
|
for (j = 0; j < output->n_possible_clones; j++)
|
||||||
{
|
{
|
||||||
RROutput clone = GPOINTER_TO_INT (output->possible_clones[j]);
|
RROutput clone = GPOINTER_TO_INT (output->possible_clones[j]);
|
||||||
|
|
||||||
for (k = 0; k < manager->n_outputs; k++)
|
for (k = manager->outputs; k; k = k->next)
|
||||||
{
|
{
|
||||||
if (clone == (XID)manager->outputs[k].winsys_id)
|
MetaOutput *possible_clone = k->data;
|
||||||
|
|
||||||
|
if (clone == (XID) possible_clone->winsys_id)
|
||||||
{
|
{
|
||||||
output->possible_clones[j] = &manager->outputs[k];
|
output->possible_clones[j] = possible_clone;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1219,6 +1217,7 @@ is_assignments_changed (MetaMonitorManager *manager,
|
|||||||
unsigned int n_output_infos)
|
unsigned int n_output_infos)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < manager->n_crtcs; i++)
|
for (i = 0; i < manager->n_crtcs; i++)
|
||||||
{
|
{
|
||||||
@ -1228,9 +1227,9 @@ is_assignments_changed (MetaMonitorManager *manager,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (is_output_assignment_changed (output,
|
if (is_output_assignment_changed (output,
|
||||||
crtc_infos,
|
crtc_infos,
|
||||||
@ -1253,6 +1252,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
{
|
{
|
||||||
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (manager);
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
GList *l;
|
||||||
int width, height, width_mm, height_mm;
|
int width, height, width_mm, height_mm;
|
||||||
|
|
||||||
XGrabServer (manager_xrandr->xdisplay);
|
XGrabServer (manager_xrandr->xdisplay);
|
||||||
@ -1443,9 +1443,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->is_dirty)
|
if (output->is_dirty)
|
||||||
{
|
{
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "backends/meta-renderer.h"
|
#include "backends/meta-renderer.h"
|
||||||
#include "backends/x11/nested/meta-renderer-x11-nested.h"
|
#include "backends/x11/nested/meta-renderer-x11-nested.h"
|
||||||
#include "clutter/clutter-mutter.h"
|
#include "clutter/clutter-mutter.h"
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "clutter/x11/clutter-x11.h"
|
#include "clutter/x11/clutter-x11.h"
|
||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "backends/meta-renderer.h"
|
#include "backends/meta-renderer.h"
|
||||||
#include "backends/meta-renderer-view.h"
|
#include "backends/meta-renderer-view.h"
|
||||||
#include "core/boxes-private.h"
|
#include "core/boxes-private.h"
|
||||||
|
@ -952,18 +952,19 @@ queue_send_frame_messages_timeout (MetaWindowActor *self)
|
|||||||
gint64 current_time = meta_compositor_monotonic_time_to_server_time (display, g_get_monotonic_time ());
|
gint64 current_time = meta_compositor_monotonic_time_to_server_time (display, g_get_monotonic_time ());
|
||||||
MetaMonitorManager *monitor_manager = meta_monitor_manager_get ();
|
MetaMonitorManager *monitor_manager = meta_monitor_manager_get ();
|
||||||
MetaWindow *window = priv->window;
|
MetaWindow *window = priv->window;
|
||||||
|
GList *outputs;
|
||||||
MetaOutput *outputs;
|
GList *l;
|
||||||
guint n_outputs, i;
|
|
||||||
float refresh_rate = 60.0f;
|
float refresh_rate = 60.0f;
|
||||||
gint interval, offset;
|
gint interval, offset;
|
||||||
|
|
||||||
outputs = meta_monitor_manager_get_outputs (monitor_manager, &n_outputs);
|
outputs = meta_monitor_manager_get_outputs (monitor_manager);
|
||||||
for (i = 0; i < n_outputs; i++)
|
for (l = outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
if (outputs[i].winsys_id == window->monitor->winsys_id && outputs[i].crtc)
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
|
if (output->winsys_id == window->monitor->winsys_id && output->crtc)
|
||||||
{
|
{
|
||||||
refresh_rate = outputs[i].crtc->current_mode->refresh_rate;
|
refresh_rate = output->crtc->current_mode->refresh_rate;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "backends/meta-monitor-manager-private.h"
|
#include "backends/meta-monitor-manager-private.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "compositor/meta-plugin-manager.h"
|
#include "compositor/meta-plugin-manager.h"
|
||||||
#include "core/main-private.h"
|
#include "core/main-private.h"
|
||||||
#include "meta/main.h"
|
#include "meta/main.h"
|
||||||
@ -59,12 +60,8 @@ meta_test_headless_start (void)
|
|||||||
g_assert_cmpint ((int) monitor_manager->n_modes,
|
g_assert_cmpint ((int) monitor_manager->n_modes,
|
||||||
==,
|
==,
|
||||||
0);
|
0);
|
||||||
g_assert_cmpint ((int) monitor_manager->n_outputs,
|
g_assert_null (monitor_manager->outputs);
|
||||||
==,
|
g_assert_null (monitor_manager->crtcs);
|
||||||
0);
|
|
||||||
g_assert_cmpint ((int) monitor_manager->n_crtcs,
|
|
||||||
==,
|
|
||||||
0);
|
|
||||||
g_assert_null (monitor_manager->monitors);
|
g_assert_null (monitor_manager->monitors);
|
||||||
g_assert_null (monitor_manager->logical_monitors);
|
g_assert_null (monitor_manager->logical_monitors);
|
||||||
|
|
||||||
@ -102,6 +99,7 @@ meta_test_headless_monitor_connect (void)
|
|||||||
MetaMonitorTestSetup *test_setup;
|
MetaMonitorTestSetup *test_setup;
|
||||||
MetaCrtcMode **modes;
|
MetaCrtcMode **modes;
|
||||||
MetaCrtc **possible_crtcs;
|
MetaCrtc **possible_crtcs;
|
||||||
|
MetaOutput *output;
|
||||||
GList *logical_monitors;
|
GList *logical_monitors;
|
||||||
ClutterActor *stage;
|
ClutterActor *stage;
|
||||||
|
|
||||||
@ -128,22 +126,19 @@ meta_test_headless_monitor_connect (void)
|
|||||||
possible_crtcs = g_new0 (MetaCrtc *, 1);
|
possible_crtcs = g_new0 (MetaCrtc *, 1);
|
||||||
possible_crtcs[0] = &test_setup->crtcs[0];
|
possible_crtcs[0] = &test_setup->crtcs[0];
|
||||||
|
|
||||||
test_setup->n_outputs = 1;
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
test_setup->outputs = g_new0 (MetaOutput, test_setup->n_outputs);
|
output->winsys_id = 1;
|
||||||
test_setup->outputs[0] = (MetaOutput) {
|
output->name = g_strdup ("DP-1");
|
||||||
.winsys_id = 1,
|
output->vendor = g_strdup ("MetaProduct's Inc.");
|
||||||
.name = g_strdup ("DP-1"),
|
output->product = g_strdup ("MetaMonitor");
|
||||||
.vendor = g_strdup ("MetaProduct's Inc."),
|
output->serial = g_strdup ("0x987654");
|
||||||
.product = g_strdup ("MetaMonitor"),
|
output->preferred_mode = modes[0];
|
||||||
.serial = g_strdup ("0x987654"),
|
output->n_modes = 1;
|
||||||
.preferred_mode = modes[0],
|
output->modes = modes;
|
||||||
.n_modes = 1,
|
output->n_possible_crtcs = 1;
|
||||||
.modes = modes,
|
output->possible_crtcs = possible_crtcs;
|
||||||
.n_possible_crtcs = 1,
|
output->connector_type = META_CONNECTOR_TYPE_DisplayPort;
|
||||||
.possible_crtcs = possible_crtcs,
|
test_setup->outputs = g_list_append (NULL, output);
|
||||||
.backlight = -1,
|
|
||||||
.connector_type = META_CONNECTOR_TYPE_DisplayPort
|
|
||||||
};
|
|
||||||
|
|
||||||
meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
|
meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "backends/meta-monitor-config-manager.h"
|
#include "backends/meta-monitor-config-manager.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
|
|
||||||
struct _MetaMonitorManagerTest
|
struct _MetaMonitorManagerTest
|
||||||
{
|
{
|
||||||
@ -99,7 +100,6 @@ meta_monitor_manager_test_read_current (MetaMonitorManager *manager)
|
|||||||
manager->n_crtcs = manager_test->test_setup->n_crtcs;
|
manager->n_crtcs = manager_test->test_setup->n_crtcs;
|
||||||
|
|
||||||
manager->outputs = manager_test->test_setup->outputs;
|
manager->outputs = manager_test->test_setup->outputs;
|
||||||
manager->n_outputs = manager_test->test_setup->n_outputs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -134,6 +134,7 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
MetaOutputInfo **outputs,
|
MetaOutputInfo **outputs,
|
||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
|
GList *l;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
for (i = 0; i < n_crtcs; i++)
|
for (i = 0; i < n_crtcs; i++)
|
||||||
@ -218,9 +219,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
for (l = manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->is_dirty)
|
if (output->is_dirty)
|
||||||
{
|
{
|
||||||
|
@ -26,8 +26,7 @@ typedef struct _MetaMonitorTestSetup
|
|||||||
{
|
{
|
||||||
MetaCrtcMode *modes;
|
MetaCrtcMode *modes;
|
||||||
int n_modes;
|
int n_modes;
|
||||||
MetaOutput *outputs;
|
GList *outputs;
|
||||||
int n_outputs;
|
|
||||||
MetaCrtc *crtcs;
|
MetaCrtc *crtcs;
|
||||||
int n_crtcs;
|
int n_crtcs;
|
||||||
} MetaMonitorTestSetup;
|
} MetaMonitorTestSetup;
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "backends/meta-monitor.h"
|
#include "backends/meta-monitor.h"
|
||||||
#include "backends/meta-monitor-config-migration.h"
|
#include "backends/meta-monitor-config-migration.h"
|
||||||
#include "backends/meta-monitor-config-store.h"
|
#include "backends/meta-monitor-config-store.h"
|
||||||
|
#include "backends/meta-output.h"
|
||||||
#include "tests/meta-monitor-manager-test.h"
|
#include "tests/meta-monitor-manager-test.h"
|
||||||
#include "tests/monitor-test-utils.h"
|
#include "tests/monitor-test-utils.h"
|
||||||
#include "tests/test-utils.h"
|
#include "tests/test-utils.h"
|
||||||
@ -366,11 +367,11 @@ static MetaOutput *
|
|||||||
output_from_winsys_id (MetaMonitorManager *monitor_manager,
|
output_from_winsys_id (MetaMonitorManager *monitor_manager,
|
||||||
long winsys_id)
|
long winsys_id)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
GList *l;
|
||||||
|
|
||||||
for (i = 0; i < monitor_manager->n_outputs; i++)
|
for (l = monitor_manager->outputs; l; l = l->next)
|
||||||
{
|
{
|
||||||
MetaOutput *output = &monitor_manager->outputs[i];
|
MetaOutput *output = l->data;
|
||||||
|
|
||||||
if (output->winsys_id == winsys_id)
|
if (output->winsys_id == winsys_id)
|
||||||
return output;
|
return output;
|
||||||
@ -616,7 +617,7 @@ check_monitor_configuration (MonitorTestCase *test_case)
|
|||||||
g_assert_cmpint (monitor_manager->screen_height,
|
g_assert_cmpint (monitor_manager->screen_height,
|
||||||
==,
|
==,
|
||||||
test_case->expect.screen_height);
|
test_case->expect.screen_height);
|
||||||
g_assert_cmpint ((int) monitor_manager->n_outputs,
|
g_assert_cmpint ((int) g_list_length (monitor_manager->outputs),
|
||||||
==,
|
==,
|
||||||
test_case->expect.n_outputs);
|
test_case->expect.n_outputs);
|
||||||
g_assert_cmpint ((int) monitor_manager->n_crtcs,
|
g_assert_cmpint ((int) monitor_manager->n_crtcs,
|
||||||
@ -892,10 +893,10 @@ create_monitor_test_setup (MonitorTestCase *test_case,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
test_setup->n_outputs = test_case->setup.n_outputs;
|
test_setup->outputs = NULL;
|
||||||
test_setup->outputs = g_new0 (MetaOutput, test_setup->n_outputs);
|
for (i = 0; i < test_case->setup.n_outputs; i++)
|
||||||
for (i = 0; i < test_setup->n_outputs; i++)
|
|
||||||
{
|
{
|
||||||
|
MetaOutput *output;
|
||||||
MetaOutputTest *output_test;
|
MetaOutputTest *output_test;
|
||||||
int crtc_index;
|
int crtc_index;
|
||||||
MetaCrtc *crtc;
|
MetaCrtc *crtc;
|
||||||
@ -958,37 +959,39 @@ create_monitor_test_setup (MonitorTestCase *test_case,
|
|||||||
if (!serial)
|
if (!serial)
|
||||||
serial = "0x123456";
|
serial = "0x123456";
|
||||||
|
|
||||||
test_setup->outputs[i] = (MetaOutput) {
|
output = g_object_new (META_TYPE_OUTPUT, NULL);
|
||||||
.crtc = crtc,
|
|
||||||
.winsys_id = i,
|
output->crtc = crtc;
|
||||||
.name = (is_laptop_panel ? g_strdup_printf ("eDP-%d",
|
output->winsys_id = i;
|
||||||
++n_laptop_panels)
|
output->name = (is_laptop_panel ? g_strdup_printf ("eDP-%d",
|
||||||
: g_strdup_printf ("DP-%d",
|
++n_laptop_panels)
|
||||||
++n_normal_panels)),
|
: g_strdup_printf ("DP-%d",
|
||||||
.vendor = g_strdup ("MetaProduct's Inc."),
|
++n_normal_panels));
|
||||||
.product = g_strdup ("MetaMonitor"),
|
output->vendor = g_strdup ("MetaProduct's Inc.");
|
||||||
.serial = g_strdup (serial),
|
output->product = g_strdup ("MetaMonitor");
|
||||||
.suggested_x = -1,
|
output->serial = g_strdup (serial);
|
||||||
.suggested_y = -1,
|
output->suggested_x = -1;
|
||||||
.hotplug_mode_update = hotplug_mode_update,
|
output->suggested_y = -1;
|
||||||
.width_mm = test_case->setup.outputs[i].width_mm,
|
output->hotplug_mode_update = hotplug_mode_update;
|
||||||
.height_mm = test_case->setup.outputs[i].height_mm,
|
output->width_mm = test_case->setup.outputs[i].width_mm;
|
||||||
.subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN,
|
output->height_mm = test_case->setup.outputs[i].height_mm;
|
||||||
.preferred_mode = preferred_mode,
|
output->subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
.n_modes = n_modes,
|
output->preferred_mode = preferred_mode;
|
||||||
.modes = modes,
|
output->n_modes = n_modes;
|
||||||
.n_possible_crtcs = n_possible_crtcs,
|
output->modes = modes;
|
||||||
.possible_crtcs = possible_crtcs,
|
output->n_possible_crtcs = n_possible_crtcs;
|
||||||
.n_possible_clones = 0,
|
output->possible_crtcs = possible_crtcs;
|
||||||
.possible_clones = NULL,
|
output->n_possible_clones = 0;
|
||||||
.backlight = -1,
|
output->possible_clones = NULL;
|
||||||
.connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP
|
output->backlight = -1;
|
||||||
: META_CONNECTOR_TYPE_DisplayPort),
|
output->connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP
|
||||||
.tile_info = test_case->setup.outputs[i].tile_info,
|
: META_CONNECTOR_TYPE_DisplayPort);
|
||||||
.is_underscanning = test_case->setup.outputs[i].is_underscanning,
|
output->tile_info = test_case->setup.outputs[i].tile_info;
|
||||||
.driver_private = output_test,
|
output->is_underscanning = test_case->setup.outputs[i].is_underscanning;
|
||||||
.driver_notify = (GDestroyNotify) meta_output_test_destroy_notify
|
output->driver_private = output_test;
|
||||||
};
|
output->driver_notify = (GDestroyNotify) meta_output_test_destroy_notify;
|
||||||
|
|
||||||
|
test_setup->outputs = g_list_append (test_setup->outputs, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
return test_setup;
|
return test_setup;
|
||||||
@ -1909,6 +1912,15 @@ meta_test_monitor_hidpi_linear_config (void)
|
|||||||
check_monitor_configuration (&test_case);
|
check_monitor_configuration (&test_case);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_suggested_output_position (MetaOutput *output,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
output->suggested_x = x;
|
||||||
|
output->suggested_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_test_monitor_suggested_config (void)
|
meta_test_monitor_suggested_config (void)
|
||||||
{
|
{
|
||||||
@ -2047,10 +2059,10 @@ meta_test_monitor_suggested_config (void)
|
|||||||
test_setup = create_monitor_test_setup (&test_case,
|
test_setup = create_monitor_test_setup (&test_case,
|
||||||
MONITOR_TEST_FLAG_NO_STORED);
|
MONITOR_TEST_FLAG_NO_STORED);
|
||||||
|
|
||||||
test_setup->outputs[0].suggested_x = 1024;
|
set_suggested_output_position (g_list_nth_data (test_setup->outputs, 0),
|
||||||
test_setup->outputs[0].suggested_y = 758;
|
1024, 758);
|
||||||
test_setup->outputs[1].suggested_x = 0;
|
set_suggested_output_position (g_list_nth_data (test_setup->outputs, 1),
|
||||||
test_setup->outputs[1].suggested_y = 0;
|
0, 0);
|
||||||
|
|
||||||
emulate_hotplug (test_setup);
|
emulate_hotplug (test_setup);
|
||||||
check_monitor_configuration (&test_case);
|
check_monitor_configuration (&test_case);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user