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),