diff --git a/src/Makefile.am b/src/Makefile.am
index 5f432724f..c53a6c998 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -144,6 +144,8 @@ libmutter_wayland_la_SOURCES = \
core/monitor.c \
core/monitor-config.c \
core/monitor-private.h \
+ core/meta-monitor-manager-dummy.c \
+ core/meta-monitor-manager-dummy.h \
core/meta-monitor-manager-kms.c \
core/meta-monitor-manager-kms.h \
core/meta-monitor-manager-xrandr.c \
diff --git a/src/core/meta-monitor-manager-dummy.c b/src/core/meta-monitor-manager-dummy.c
new file mode 100644
index 000000000..cf74d9d7b
--- /dev/null
+++ b/src/core/meta-monitor-manager-dummy.c
@@ -0,0 +1,243 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2001, 2002 Havoc Pennington
+ * Copyright (C) 2002, 2003 Red Hat Inc.
+ * Some ICCCM manager selection code derived from fvwm2,
+ * Copyright (C) 2001 Dominik Vogt, Matthias Clasen, and fvwm2 team
+ * Copyright (C) 2003 Rob Adams
+ * Copyright (C) 2004-2006 Elijah Newren
+ * Copyright (C) 2013 Red Hat Inc.
+ *
+ * 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, see .
+ */
+
+#include "config.h"
+
+#include "meta-monitor-manager-dummy.h"
+
+#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
+
+struct _MetaMonitorManagerDummy
+{
+ MetaMonitorManager parent_instance;
+};
+
+struct _MetaMonitorManagerDummyClass
+{
+ MetaMonitorManagerClass parent_class;
+};
+
+G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER);
+
+static void
+meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
+{
+ manager->max_screen_width = 65535;
+ manager->max_screen_height = 65535;
+ manager->screen_width = 1024;
+ manager->screen_height = 768;
+
+ manager->modes = g_new0 (MetaMonitorMode, 1);
+ manager->n_modes = 1;
+
+ manager->modes[0].mode_id = 0;
+ manager->modes[0].width = 1024;
+ manager->modes[0].height = 768;
+ manager->modes[0].refresh_rate = 60.0;
+
+ manager->crtcs = g_new0 (MetaCRTC, 1);
+ manager->n_crtcs = 1;
+
+ manager->crtcs[0].crtc_id = 1;
+ manager->crtcs[0].rect.x = 0;
+ manager->crtcs[0].rect.y = 0;
+ manager->crtcs[0].rect.width = manager->modes[0].width;
+ manager->crtcs[0].rect.height = manager->modes[0].height;
+ manager->crtcs[0].current_mode = &manager->modes[0];
+ manager->crtcs[0].transform = WL_OUTPUT_TRANSFORM_NORMAL;
+ manager->crtcs[0].all_transforms = ALL_WL_TRANSFORMS;
+ manager->crtcs[0].is_dirty = FALSE;
+ manager->crtcs[0].logical_monitor = NULL;
+
+ manager->outputs = g_new0 (MetaOutput, 1);
+ manager->n_outputs = 1;
+
+ manager->outputs[0].crtc = &manager->crtcs[0];
+ manager->outputs[0].output_id = 1;
+ manager->outputs[0].name = g_strdup ("LVDS");
+ manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
+ manager->outputs[0].product = g_strdup ("unknown");
+ manager->outputs[0].serial = g_strdup ("0xC0FFEE");
+ manager->outputs[0].width_mm = 222;
+ manager->outputs[0].height_mm = 125;
+ manager->outputs[0].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
+ manager->outputs[0].preferred_mode = &manager->modes[0];
+ manager->outputs[0].n_modes = 1;
+ manager->outputs[0].modes = g_new0 (MetaMonitorMode *, 1);
+ manager->outputs[0].modes[0] = &manager->modes[0];
+ manager->outputs[0].n_possible_crtcs = 1;
+ manager->outputs[0].possible_crtcs = g_new0 (MetaCRTC *, 1);
+ manager->outputs[0].possible_crtcs[0] = &manager->crtcs[0];
+ manager->outputs[0].n_possible_clones = 0;
+ manager->outputs[0].possible_clones = g_new0 (MetaOutput *, 0);
+ manager->outputs[0].backlight = -1;
+ manager->outputs[0].backlight_min = 0;
+ manager->outputs[0].backlight_max = 0;
+}
+
+static void
+meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager,
+ MetaCRTCInfo **crtcs,
+ unsigned int n_crtcs,
+ MetaOutputInfo **outputs,
+ unsigned int n_outputs)
+{
+ unsigned i;
+ int screen_width = 0, screen_height = 0;
+
+ for (i = 0; i < n_crtcs; i++)
+ {
+ MetaCRTCInfo *crtc_info = crtcs[i];
+ MetaCRTC *crtc = crtc_info->crtc;
+ crtc->is_dirty = TRUE;
+
+ if (crtc_info->mode == NULL)
+ {
+ crtc->rect.x = 0;
+ crtc->rect.y = 0;
+ crtc->rect.width = 0;
+ crtc->rect.height = 0;
+ crtc->current_mode = NULL;
+ }
+ else
+ {
+ MetaMonitorMode *mode;
+ MetaOutput *output;
+ int i, n_outputs;
+ int width, height;
+
+ mode = crtc_info->mode;
+
+ if (meta_monitor_transform_is_rotated (crtc_info->transform))
+ {
+ width = mode->height;
+ height = mode->width;
+ }
+ else
+ {
+ width = mode->width;
+ height = mode->height;
+ }
+
+ crtc->rect.x = crtc_info->x;
+ crtc->rect.y = crtc_info->y;
+ crtc->rect.width = width;
+ crtc->rect.height = height;
+ crtc->current_mode = mode;
+ crtc->transform = crtc_info->transform;
+
+ screen_width = MAX (screen_width, crtc_info->x + width);
+ screen_height = MAX (screen_height, crtc_info->y + height);
+
+ n_outputs = crtc_info->outputs->len;
+ for (i = 0; i < n_outputs; i++)
+ {
+ output = ((MetaOutput**)crtc_info->outputs->pdata)[i];
+
+ output->is_dirty = TRUE;
+ output->crtc = crtc;
+ }
+ }
+ }
+
+ for (i = 0; i < n_outputs; i++)
+ {
+ MetaOutputInfo *output_info = outputs[i];
+ MetaOutput *output = output_info->output;
+
+ output->is_primary = output_info->is_primary;
+ output->is_presentation = output_info->is_presentation;
+ }
+
+ /* Disable CRTCs not mentioned in the list */
+ for (i = 0; i < manager->n_crtcs; i++)
+ {
+ MetaCRTC *crtc = &manager->crtcs[i];
+
+ crtc->logical_monitor = NULL;
+
+ if (crtc->is_dirty)
+ {
+ crtc->is_dirty = FALSE;
+ continue;
+ }
+
+ crtc->rect.x = 0;
+ crtc->rect.y = 0;
+ crtc->rect.width = 0;
+ crtc->rect.height = 0;
+ crtc->current_mode = NULL;
+ }
+
+ /* Disable outputs not mentioned in the list */
+ for (i = 0; i < manager->n_outputs; i++)
+ {
+ MetaOutput *output = &manager->outputs[i];
+
+ if (output->is_dirty)
+ {
+ output->is_dirty = FALSE;
+ continue;
+ }
+
+ output->crtc = NULL;
+ output->is_primary = FALSE;
+ }
+
+ manager->screen_width = screen_width;
+ manager->screen_height = screen_height;
+
+ meta_monitor_manager_rebuild_derived (manager);
+}
+
+static GBytes *
+meta_monitor_manager_dummy_read_edid (MetaMonitorManager *manager,
+ MetaOutput *output)
+{
+ return NULL;
+}
+
+static char *
+meta_monitor_manager_dummy_get_edid_file (MetaMonitorManager *manager,
+ MetaOutput *output)
+{
+ return NULL;
+}
+
+static void
+meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass)
+{
+ MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
+
+ manager_class->read_current = meta_monitor_manager_dummy_read_current;
+ manager_class->apply_configuration = meta_monitor_manager_dummy_apply_config;
+ manager_class->get_edid_file = meta_monitor_manager_dummy_get_edid_file;
+ manager_class->read_edid = meta_monitor_manager_dummy_read_edid;
+}
+
+static void
+meta_monitor_manager_dummy_init (MetaMonitorManagerDummy *manager)
+{
+}
diff --git a/src/core/meta-monitor-manager-dummy.h b/src/core/meta-monitor-manager-dummy.h
new file mode 100644
index 000000000..896838cbb
--- /dev/null
+++ b/src/core/meta-monitor-manager-dummy.h
@@ -0,0 +1,40 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2001 Havoc Pennington
+ * Copyright (C) 2003 Rob Adams
+ * Copyright (C) 2004-2006 Elijah Newren
+ * Copyright (C) 2013 Red Hat Inc.
+ *
+ * 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, see .
+ */
+
+#ifndef META_MONITOR_MANAGER_DUMMY_H
+#define META_MONITOR_MANAGER_DUMMY_H
+
+#include "monitor-private.h"
+
+#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
+#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
+#define META_MONITOR_MANAGER_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass))
+#define META_IS_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_MONITOR_MANAGER_DUMMY))
+#define META_IS_MONITOR_MANAGER_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_MONITOR_MANAGER_DUMMY))
+#define META_MONITOR_MANAGER_DUMMY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass))
+
+typedef struct _MetaMonitorManagerDummyClass MetaMonitorManagerDummyClass;
+typedef struct _MetaMonitorManagerDummy MetaMonitorManagerDummy;
+
+GType meta_monitor_manager_dummy_get_type (void);
+
+#endif /* META_MONITOR_MANAGER_DUMMY_H */
diff --git a/src/core/monitor.c b/src/core/monitor.c
index 51fb28004..d2d9f20d5 100644
--- a/src/core/monitor.c
+++ b/src/core/monitor.c
@@ -36,11 +36,10 @@
#include "monitor-private.h"
#include "meta-monitor-manager-kms.h"
#include "meta-monitor-manager-xrandr.h"
+#include "meta-monitor-manager-dummy.h"
#include "meta-dbus-xrandr.h"
-#define ALL_WL_TRANSFORMS ((1 << (WL_OUTPUT_TRANSFORM_FLIPPED_270 + 1)) - 1)
-
enum {
CONFIRM_DISPLAY_CHANGE,
SIGNALS_LAST
@@ -56,196 +55,11 @@ static int signals[SIGNALS_LAST];
static void meta_monitor_manager_display_config_init (MetaDBusDisplayConfigIface *iface);
-G_DEFINE_TYPE_WITH_CODE (MetaMonitorManager, meta_monitor_manager, META_DBUS_TYPE_DISPLAY_CONFIG_SKELETON,
- G_IMPLEMENT_INTERFACE (META_DBUS_TYPE_DISPLAY_CONFIG, meta_monitor_manager_display_config_init));
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaMonitorManager, meta_monitor_manager, META_DBUS_TYPE_DISPLAY_CONFIG_SKELETON,
+ G_IMPLEMENT_INTERFACE (META_DBUS_TYPE_DISPLAY_CONFIG, meta_monitor_manager_display_config_init));
static void initialize_dbus_interface (MetaMonitorManager *manager);
-static void
-read_current_dummy (MetaMonitorManager *manager)
-{
- manager->max_screen_width = 65535;
- manager->max_screen_height = 65535;
- manager->screen_width = 1024;
- manager->screen_height = 768;
-
- manager->modes = g_new0 (MetaMonitorMode, 1);
- manager->n_modes = 1;
-
- manager->modes[0].mode_id = 0;
- manager->modes[0].width = 1024;
- manager->modes[0].height = 768;
- manager->modes[0].refresh_rate = 60.0;
-
- manager->crtcs = g_new0 (MetaCRTC, 1);
- manager->n_crtcs = 1;
-
- manager->crtcs[0].crtc_id = 1;
- manager->crtcs[0].rect.x = 0;
- manager->crtcs[0].rect.y = 0;
- manager->crtcs[0].rect.width = manager->modes[0].width;
- manager->crtcs[0].rect.height = manager->modes[0].height;
- manager->crtcs[0].current_mode = &manager->modes[0];
- manager->crtcs[0].transform = WL_OUTPUT_TRANSFORM_NORMAL;
- manager->crtcs[0].all_transforms = ALL_WL_TRANSFORMS;
- manager->crtcs[0].is_dirty = FALSE;
- manager->crtcs[0].logical_monitor = NULL;
-
- manager->outputs = g_new0 (MetaOutput, 1);
- manager->n_outputs = 1;
-
- manager->outputs[0].crtc = &manager->crtcs[0];
- manager->outputs[0].output_id = 1;
- manager->outputs[0].name = g_strdup ("LVDS");
- manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
- manager->outputs[0].product = g_strdup ("unknown");
- manager->outputs[0].serial = g_strdup ("0xC0FFEE");
- manager->outputs[0].width_mm = 222;
- manager->outputs[0].height_mm = 125;
- manager->outputs[0].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
- manager->outputs[0].preferred_mode = &manager->modes[0];
- manager->outputs[0].n_modes = 1;
- manager->outputs[0].modes = g_new0 (MetaMonitorMode *, 1);
- manager->outputs[0].modes[0] = &manager->modes[0];
- manager->outputs[0].n_possible_crtcs = 1;
- manager->outputs[0].possible_crtcs = g_new0 (MetaCRTC *, 1);
- manager->outputs[0].possible_crtcs[0] = &manager->crtcs[0];
- manager->outputs[0].n_possible_clones = 0;
- manager->outputs[0].possible_clones = g_new0 (MetaOutput *, 0);
- manager->outputs[0].backlight = -1;
- manager->outputs[0].backlight_min = 0;
- manager->outputs[0].backlight_max = 0;
-}
-
-static void
-apply_config_dummy (MetaMonitorManager *manager,
- MetaCRTCInfo **crtcs,
- unsigned int n_crtcs,
- MetaOutputInfo **outputs,
- unsigned int n_outputs)
-{
- unsigned i;
- int screen_width = 0, screen_height = 0;
-
- for (i = 0; i < n_crtcs; i++)
- {
- MetaCRTCInfo *crtc_info = crtcs[i];
- MetaCRTC *crtc = crtc_info->crtc;
- crtc->is_dirty = TRUE;
-
- if (crtc_info->mode == NULL)
- {
- crtc->rect.x = 0;
- crtc->rect.y = 0;
- crtc->rect.width = 0;
- crtc->rect.height = 0;
- crtc->current_mode = NULL;
- }
- else
- {
- MetaMonitorMode *mode;
- MetaOutput *output;
- int i, n_outputs;
- int width, height;
-
- mode = crtc_info->mode;
-
- if (meta_monitor_transform_is_rotated (crtc_info->transform))
- {
- width = mode->height;
- height = mode->width;
- }
- else
- {
- width = mode->width;
- height = mode->height;
- }
-
- crtc->rect.x = crtc_info->x;
- crtc->rect.y = crtc_info->y;
- crtc->rect.width = width;
- crtc->rect.height = height;
- crtc->current_mode = mode;
- crtc->transform = crtc_info->transform;
-
- screen_width = MAX (screen_width, crtc_info->x + width);
- screen_height = MAX (screen_height, crtc_info->y + height);
-
- n_outputs = crtc_info->outputs->len;
- for (i = 0; i < n_outputs; i++)
- {
- output = ((MetaOutput**)crtc_info->outputs->pdata)[i];
-
- output->is_dirty = TRUE;
- output->crtc = crtc;
- }
- }
- }
-
- for (i = 0; i < n_outputs; i++)
- {
- MetaOutputInfo *output_info = outputs[i];
- MetaOutput *output = output_info->output;
-
- output->is_primary = output_info->is_primary;
- output->is_presentation = output_info->is_presentation;
- }
-
- /* Disable CRTCs not mentioned in the list */
- for (i = 0; i < manager->n_crtcs; i++)
- {
- MetaCRTC *crtc = &manager->crtcs[i];
-
- crtc->logical_monitor = NULL;
-
- if (crtc->is_dirty)
- {
- crtc->is_dirty = FALSE;
- continue;
- }
-
- crtc->rect.x = 0;
- crtc->rect.y = 0;
- crtc->rect.width = 0;
- crtc->rect.height = 0;
- crtc->current_mode = NULL;
- }
-
- /* Disable outputs not mentioned in the list */
- for (i = 0; i < manager->n_outputs; i++)
- {
- MetaOutput *output = &manager->outputs[i];
-
- if (output->is_dirty)
- {
- output->is_dirty = FALSE;
- continue;
- }
-
- output->crtc = NULL;
- output->is_primary = FALSE;
- }
-
- manager->screen_width = screen_width;
- manager->screen_height = screen_height;
-
- meta_monitor_manager_rebuild_derived (manager);
-}
-
-static GBytes *
-read_edid_dummy (MetaMonitorManager *manager,
- MetaOutput *output)
-{
- return NULL;
-}
-
-static char *
-get_edid_file_dummy (MetaMonitorManager *manager,
- MetaOutput *output)
-{
- return NULL;
-}
-
static void
meta_monitor_manager_init (MetaMonitorManager *manager)
{
@@ -369,7 +183,7 @@ get_default_backend (void)
* we're a nested configuration, so return the dummy
* monitor setup. */
if (meta_is_wayland_compositor ())
- return META_TYPE_MONITOR_MANAGER;
+ return META_TYPE_MONITOR_MANAGER_DUMMY;
else
return META_TYPE_MONITOR_MANAGER_XRANDR;
}
@@ -381,7 +195,7 @@ get_default_backend (void)
/* Use the dummy implementation on Wayland for now.
* In the future, we should support wl_fullscreen_output
* which will have CRTC management in the protocol. */
- return META_TYPE_MONITOR_MANAGER;
+ return META_TYPE_MONITOR_MANAGER_DUMMY;
}
#endif
@@ -586,11 +400,6 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
object_class->dispose = meta_monitor_manager_dispose;
object_class->finalize = meta_monitor_manager_finalize;
- klass->read_current = read_current_dummy;
- klass->apply_configuration = apply_config_dummy;
- klass->get_edid_file = get_edid_file_dummy;
- klass->read_edid = read_edid_dummy;
-
signals[CONFIRM_DISPLAY_CHANGE] =
g_signal_new ("confirm-display-change",
G_TYPE_FROM_CLASS (object_class),