From a393a614a16f6dafbfab1d2eeb7f09bcb391a134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 20 Jan 2017 15:07:12 +0800 Subject: [PATCH] monitor-manager: Remove 'scale' from MetaOutput Replace the 'scale' of an output with a vfunc on the MetaMonitorManager class that takes a monitor and a monitor mode which calculates the scale. On X11 this always returns 1, on KMS, the old formula is used. On the dummy and test backends, the already configured values are returned. https://bugzilla.gnome.org/show_bug.cgi?id=777732 --- src/backends/meta-logical-monitor.c | 9 +- src/backends/meta-monitor-config-manager.c | 27 ++- src/backends/meta-monitor-manager-dummy.c | 49 ++++- src/backends/meta-monitor-manager-private.h | 11 +- src/backends/meta-monitor-manager.c | 13 ++ src/backends/meta-monitor.c | 19 +- src/backends/meta-monitor.h | 6 +- .../native/meta-monitor-manager-kms.c | 170 +++++++++--------- .../x11/meta-monitor-manager-xrandr.c | 10 ++ src/tests/meta-monitor-manager-test.c | 15 ++ src/tests/meta-monitor-manager-test.h | 5 + src/tests/monitor-unit-tests.c | 18 +- 12 files changed, 242 insertions(+), 110 deletions(-) diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c index 905671898..d69f5c4b3 100644 --- a/src/backends/meta-logical-monitor.c +++ b/src/backends/meta-logical-monitor.c @@ -100,13 +100,20 @@ meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager, { MetaLogicalMonitor *logical_monitor; MetaOutput *main_output; + MetaMonitorMode *monitor_mode; + int scale; logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL); + monitor_mode = meta_monitor_get_current_mode (monitor); + scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, + monitor, + monitor_mode); + main_output = meta_monitor_get_main_output (monitor); logical_monitor->number = monitor_number; logical_monitor->winsys_id = main_output->winsys_id; - logical_monitor->scale = main_output->scale; + logical_monitor->scale = scale; logical_monitor->in_fullscreen = -1; logical_monitor->rect = *layout; diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c index 824d3f680..132f714d8 100644 --- a/src/backends/meta-monitor-config-manager.c +++ b/src/backends/meta-monitor-config-manager.c @@ -461,9 +461,10 @@ create_monitor_config (MetaMonitor *monitor, } static MetaLogicalMonitorConfig * -create_preferred_logical_monitor_config (MetaMonitor *monitor, - int x, - int y) +create_preferred_logical_monitor_config (MetaMonitorManager *monitor_manager, + MetaMonitor *monitor, + int x, + int y) { MetaMonitorMode *mode; int width, height; @@ -473,7 +474,9 @@ create_preferred_logical_monitor_config (MetaMonitor *monitor, mode = meta_monitor_get_preferred_mode (monitor); meta_monitor_mode_get_resolution (mode, &width, &height); - scale = meta_monitor_get_calculated_scale (monitor); + scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, + monitor, + mode); monitor_config = create_monitor_config (monitor, mode); @@ -508,7 +511,9 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana return NULL; primary_logical_monitor_config = - create_preferred_logical_monitor_config (primary_monitor, 0, 0); + create_preferred_logical_monitor_config (monitor_manager, + primary_monitor, + 0, 0); primary_logical_monitor_config->is_primary = TRUE; logical_monitor_configs = g_list_append (NULL, primary_logical_monitor_config); @@ -528,7 +533,9 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana continue; logical_monitor_config = - create_preferred_logical_monitor_config (monitor, x, 0); + create_preferred_logical_monitor_config (monitor_manager, + monitor, + x, 0); logical_monitor_configs = g_list_append (logical_monitor_configs, logical_monitor_config); @@ -551,7 +558,9 @@ meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_ma return NULL; primary_logical_monitor_config = - create_preferred_logical_monitor_config (primary_monitor, 0, 0); + create_preferred_logical_monitor_config (monitor_manager, + primary_monitor, + 0, 0); primary_logical_monitor_config->is_primary = TRUE; logical_monitor_configs = g_list_append (NULL, primary_logical_monitor_config); @@ -587,7 +596,9 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m continue; logical_monitor_config = - create_preferred_logical_monitor_config (monitor, x, y); + create_preferred_logical_monitor_config (monitor_manager, + monitor, + x, y); logical_monitor_configs = g_list_append (logical_monitor_configs, logical_monitor_config); diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c index 38165c896..7db98e32b 100644 --- a/src/backends/meta-monitor-manager-dummy.c +++ b/src/backends/meta-monitor-manager-dummy.c @@ -51,8 +51,16 @@ struct _MetaMonitorManagerDummyClass MetaMonitorManagerClass parent_class; }; +typedef struct _MetaOutputDummy +{ + int scale; +} MetaOutputDummy; + G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER); +static void +meta_output_dummy_notify_destroy (MetaOutput *output); + #define array_last(a, t) \ g_array_index (a, t, a->len - 1) @@ -75,6 +83,7 @@ append_monitor (GArray *modes, } }; MetaCrtc crtc; + MetaOutputDummy *output_dummy; MetaOutput output; unsigned int i; @@ -88,6 +97,11 @@ append_monitor (GArray *modes, }; g_array_append_val (crtcs, crtc); + output_dummy = g_new0 (MetaOutputDummy, 1); + *output_dummy = (MetaOutputDummy) { + .scale = scale + }; + output = (MetaOutput) { .winsys_id = outputs->len + 1, .name = g_strdup_printf ("LVDS%d", outputs->len + 1), @@ -103,7 +117,9 @@ append_monitor (GArray *modes, .n_possible_clones = 0, .backlight = -1, .connector_type = META_CONNECTOR_TYPE_LVDS, - .scale = scale, + .driver_private = output_dummy, + .driver_notify = + (GDestroyNotify) meta_output_dummy_notify_destroy }; output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl)); @@ -159,9 +175,15 @@ append_tiled_monitor (GArray *modes, tile_group_id = outputs->len + 1; for (i = 0; i < G_N_ELEMENTS (crtcs_decl); i++) { + MetaOutputDummy *output_dummy; MetaCrtcMode *preferred_mode; unsigned int j; + output_dummy = g_new0 (MetaOutputDummy, 1); + *output_dummy = (MetaOutputDummy) { + .scale = scale + }; + preferred_mode = &array_last (modes, MetaCrtcMode), output = (MetaOutput) { .winsys_id = outputs->len + 1, @@ -187,7 +209,9 @@ append_tiled_monitor (GArray *modes, .tile_w = preferred_mode->width, .tile_h = preferred_mode->height }, - .scale = scale + .driver_private = output_dummy, + .driver_notify = + (GDestroyNotify) meta_output_dummy_notify_destroy }; output.modes = g_new0 (MetaCrtcMode *, G_N_ELEMENTS (modes_decl)); @@ -206,6 +230,12 @@ append_tiled_monitor (GArray *modes, } } +static void +meta_output_dummy_notify_destroy (MetaOutput *output) +{ + g_clear_pointer (&output->driver_private, g_free); +} + static void meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager) { @@ -533,6 +563,20 @@ meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager, return manager_dummy->is_transform_handled; } +static int +meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + MetaOutput *output; + MetaOutputDummy *output_dummy; + + output = meta_monitor_get_main_output (monitor); + output_dummy = output->driver_private; + + return output_dummy->scale; +} + static void meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass) { @@ -543,6 +587,7 @@ meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass) manager_class->apply_monitors_config = meta_monitor_manager_dummy_apply_monitors_config; manager_class->apply_configuration = meta_monitor_manager_dummy_apply_config; manager_class->is_transform_handled = meta_monitor_manager_dummy_is_transform_handled; + manager_class->calculate_monitor_mode_scale = meta_monitor_manager_dummy_calculate_monitor_mode_scale; } static void diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h index ba47f8847..83dccf430 100644 --- a/src/backends/meta-monitor-manager-private.h +++ b/src/backends/meta-monitor-manager-private.h @@ -59,6 +59,8 @@ typedef struct _MetaMonitorTiled MetaMonitorTiled; typedef struct _MetaMonitorSpec MetaMonitorSpec; typedef struct _MetaLogicalMonitor MetaLogicalMonitor; +typedef struct _MetaMonitorMode MetaMonitorMode; + typedef struct _MetaCrtc MetaCrtc; typedef struct _MetaOutput MetaOutput; typedef struct _MetaCrtcMode MetaCrtcMode; @@ -125,7 +127,6 @@ struct _MetaOutput int width_mm; int height_mm; CoglSubpixelOrder subpixel_order; - int scale; MetaConnectorType connector_type; @@ -348,6 +349,10 @@ struct _MetaMonitorManagerClass gboolean (*is_transform_handled) (MetaMonitorManager *, MetaCrtc *, MetaMonitorTransform); + + int (*calculate_monitor_mode_scale) (MetaMonitorManager *, + MetaMonitor *, + MetaMonitorMode *); }; void meta_monitor_manager_rebuild (MetaMonitorManager *manager, @@ -447,6 +452,10 @@ void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManage gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager); +int meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode); + void meta_monitor_manager_clear_output (MetaOutput *output); void meta_monitor_manager_clear_mode (MetaCrtcMode *mode); void meta_monitor_manager_clear_crtc (MetaCrtc *crtc); diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 539f6d6b2..bb9334c65 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -275,6 +275,19 @@ meta_monitor_manager_is_headless (MetaMonitorManager *manager) return !manager->monitors; } +int +meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + MetaMonitorManagerClass *manager_class = + META_MONITOR_MANAGER_GET_CLASS (manager); + + return manager_class->calculate_monitor_mode_scale (manager, + monitor, + monitor_mode); +} + static void meta_monitor_manager_ensure_initial_config (MetaMonitorManager *manager) { diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 8604ba123..35e16b908 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -196,16 +196,6 @@ meta_monitor_is_underscanning (MetaMonitor *monitor) return output->is_underscanning; } -int -meta_monitor_get_calculated_scale (MetaMonitor *monitor) -{ - MetaOutput *output; - - output = meta_monitor_get_main_output (monitor); - - return output->scale; -} - gboolean meta_monitor_is_laptop_panel (MetaMonitor *monitor) { @@ -291,6 +281,15 @@ meta_monitor_get_serial (MetaMonitor *monitor) return output->serial; } +MetaConnectorType +meta_monitor_get_connector_type (MetaMonitor *monitor) +{ + MetaOutput *output; + + output = meta_monitor_get_main_output (monitor); + return output->connector_type; +} + static void meta_monitor_finalize (GObject *object) { diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index 0ebdb55f7..3940a2faf 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -26,8 +26,6 @@ #include "backends/meta-monitor-manager-private.h" -typedef struct _MetaMonitorMode MetaMonitorMode; - typedef struct _MetaMonitorSpec { char *connector; @@ -97,8 +95,6 @@ gboolean meta_monitor_is_underscanning (MetaMonitor *monitor); gboolean meta_monitor_is_laptop_panel (MetaMonitor *monitor); -int meta_monitor_get_calculated_scale (MetaMonitor *monitor); - GList * meta_monitor_get_outputs (MetaMonitor *monitor); void meta_monitor_get_current_resolution (MetaMonitor *monitor, @@ -121,6 +117,8 @@ const char * meta_monitor_get_product (MetaMonitor *monitor); const char * meta_monitor_get_serial (MetaMonitor *monitor); +MetaConnectorType meta_monitor_get_connector_type (MetaMonitor *monitor); + uint32_t meta_monitor_tiled_get_tile_group_id (MetaMonitorTiled *monitor_tiled); gboolean meta_monitor_get_suggested_position (MetaMonitor *monitor, diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c index 16a04fb7d..a7a4daca6 100644 --- a/src/backends/native/meta-monitor-manager-kms.c +++ b/src/backends/native/meta-monitor-manager-kms.c @@ -483,85 +483,6 @@ find_output_by_id (MetaOutput *outputs, return NULL; } -/* The minimum resolution at which we turn on a window-scale of 2 */ -#define HIDPI_LIMIT 192 - -/* The minimum screen height at which we turn on a window-scale of 2; - * below this there just isn't enough vertical real estate for GNOME - * apps to work, and it's better to just be tiny */ -#define HIDPI_MIN_HEIGHT 1200 - -/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */ -#define SMALLEST_4K_WIDTH 3656 - -/* Based on code from gnome-settings-daemon */ -static int -compute_scale (MetaOutput *output) -{ - int scale = 1, width, height; - - if (!output->crtc) - goto out; - - width = output->crtc->rect.width; - height = output->crtc->rect.height; - - /* Swap values on rotated transforms, so pixel and mm sizes - * from the same axes is compared. - */ - if (meta_monitor_transform_is_rotated (output->crtc->transform)) - { - int tmp = width; - width = height; - height = tmp; - } - - /* Scaling makes no sense */ - if (height < HIDPI_MIN_HEIGHT) - goto out; - - /* 4K TV */ - if (output->name != NULL && strstr(output->name, "HDMI") != NULL && - width >= SMALLEST_4K_WIDTH) - goto out; - - /* Somebody encoded the aspect ratio (16/9 or 16/10) - * instead of the physical size */ - if ((output->width_mm == 160 && output->height_mm == 90) || - (output->width_mm == 160 && output->height_mm == 100) || - (output->width_mm == 16 && output->height_mm == 9) || - (output->width_mm == 16 && output->height_mm == 10)) - goto out; - - if (output->width_mm > 0 && output->height_mm > 0) - { - double dpi_x, dpi_y; - - dpi_x = (double)width / (output->width_mm / 25.4); - dpi_y = (double)height / (output->height_mm / 25.4); - /* We don't completely trust these values so both - must be high, and never pick higher ratio than - 2 automatically */ - if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT) - scale = 2; - } - -out: - return scale; -} - -static int -get_output_scale (MetaMonitorManager *manager, - MetaOutput *output) -{ - MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager); - int scale = g_settings_get_uint (manager_kms->desktop_settings, "scaling-factor"); - if (scale > 0) - return scale; - else - return compute_scale (output); -} - static int find_property_index (MetaMonitorManager *manager, drmModeObjectPropertiesPtr props, @@ -930,8 +851,6 @@ init_output (MetaOutput *output, /* MetaConnectorType matches DRM's connector types */ output->connector_type = (MetaConnectorType) connector->connector_type; - output->scale = get_output_scale (manager, output); - output_get_tile_info (manager_kms, output); /* FIXME: backlight is a very driver specific thing unfortunately, @@ -1399,7 +1318,6 @@ apply_crtc_assignments (MetaMonitorManager *manager, output->is_dirty = TRUE; output->crtc = crtc; - output->scale = get_output_scale (manager, output); } } @@ -1898,6 +1816,93 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager *manager, return FALSE; } +/* The minimum resolution at which we turn on a window-scale of 2 */ +#define HIDPI_LIMIT 192 + +/* The minimum screen height at which we turn on a window-scale of 2; + * below this there just isn't enough vertical real estate for GNOME + * apps to work, and it's better to just be tiny */ +#define HIDPI_MIN_HEIGHT 1200 + +/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */ +#define SMALLEST_4K_WIDTH 3656 + +static int +compute_scale (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + int resolution_width, resolution_height; + int width_mm, height_mm; + int scale; + + scale = 1; + + meta_monitor_mode_get_resolution (monitor_mode, + &resolution_width, + &resolution_height); + + if (resolution_height < HIDPI_MIN_HEIGHT) + goto out; + + /* 4K TV */ + switch (meta_monitor_get_connector_type (monitor)) + { + case META_CONNECTOR_TYPE_HDMIA: + case META_CONNECTOR_TYPE_HDMIB: + if (resolution_width >= SMALLEST_4K_WIDTH) + goto out; + break; + default: + break; + } + + meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm); + + /* + * Somebody encoded the aspect ratio (16/9 or 16/10) instead of the physical + * size. + */ + if ((width_mm == 160 && height_mm == 90) || + (width_mm == 160 && height_mm == 100) || + (width_mm == 16 && height_mm == 9) || + (width_mm == 16 && height_mm == 10)) + goto out; + + if (width_mm > 0 && height_mm > 0) + { + double dpi_x, dpi_y; + + dpi_x = (double) resolution_width / (width_mm / 25.4); + dpi_y = (double) resolution_height / (height_mm / 25.4); + + /* + * We don't completely trust these values so both must be high, and never + * pick higher ratio than 2 automatically. + */ + if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT) + scale = 2; + } + +out: + return scale; +} + +static int +meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager); + int global_scale; + + global_scale = g_settings_get_uint (manager_kms->desktop_settings, + "scaling-factor"); + if (global_scale > 0) + return global_scale; + else + return compute_scale (monitor, monitor_mode); +} + static void meta_monitor_manager_kms_dispose (GObject *object) { @@ -1938,4 +1943,5 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass) manager_class->get_crtc_gamma = meta_monitor_manager_kms_get_crtc_gamma; manager_class->set_crtc_gamma = meta_monitor_manager_kms_set_crtc_gamma; manager_class->is_transform_handled = meta_monitor_manager_kms_is_transform_handled; + manager_class->calculate_monitor_mode_scale = meta_monitor_manager_kms_calculate_monitor_mode_scale; } diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c index cc7a4440a..0fdc5bf1e 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c @@ -1568,6 +1568,15 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager, return TRUE; } +static int +meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + /* X11 does not support anything other than scale 1. */ + return 1; +} + static void meta_monitor_manager_xrandr_init (MetaMonitorManagerXrandr *manager_xrandr) { @@ -1644,6 +1653,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass) manager_class->tiled_monitor_removed = meta_monitor_manager_xrandr_tiled_monitor_removed; #endif manager_class->is_transform_handled = meta_monitor_manager_xrandr_is_transform_handled; + manager_class->calculate_monitor_mode_scale = meta_monitor_manager_xrandr_calculate_monitor_mode_scale; quark_meta_monitor_xrandr_data = g_quark_from_static_string ("-meta-monitor-xrandr-data"); diff --git a/src/tests/meta-monitor-manager-test.c b/src/tests/meta-monitor-manager-test.c index 2d862d5b1..feb9d857b 100644 --- a/src/tests/meta-monitor-manager-test.c +++ b/src/tests/meta-monitor-manager-test.c @@ -335,6 +335,20 @@ meta_monitor_manager_test_is_transform_handled (MetaMonitorManager *manager, return TRUE; } +static int +meta_monitor_manager_test_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + MetaOutput *output; + MetaOutputTest *output_test; + + output = meta_monitor_get_main_output (monitor); + output_test = output->driver_private; + + return output_test->scale; +} + static void meta_monitor_manager_test_dispose (GObject *object) { @@ -367,4 +381,5 @@ meta_monitor_manager_test_class_init (MetaMonitorManagerTestClass *klass) manager_class->tiled_monitor_added = meta_monitor_manager_test_tiled_monitor_added; manager_class->tiled_monitor_removed = meta_monitor_manager_test_tiled_monitor_removed; manager_class->is_transform_handled = meta_monitor_manager_test_is_transform_handled; + manager_class->calculate_monitor_mode_scale = meta_monitor_manager_test_calculate_monitor_mode_scale; } diff --git a/src/tests/meta-monitor-manager-test.h b/src/tests/meta-monitor-manager-test.h index 13aed2d90..fe2b85cef 100644 --- a/src/tests/meta-monitor-manager-test.h +++ b/src/tests/meta-monitor-manager-test.h @@ -32,6 +32,11 @@ typedef struct _MetaMonitorTestSetup int n_crtcs; } MetaMonitorTestSetup; +typedef struct _MetaOutputTest +{ + int scale; +} MetaOutputTest; + #define META_TYPE_MONITOR_MANAGER_TEST (meta_monitor_manager_test_get_type ()) G_DECLARE_FINAL_TYPE (MetaMonitorManagerTest, meta_monitor_manager_test, META, MONITOR_MANAGER_TEST, MetaMonitorManager) diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c index 7929a9c29..a4c48b99f 100644 --- a/src/tests/monitor-unit-tests.c +++ b/src/tests/monitor-unit-tests.c @@ -658,6 +658,12 @@ check_monitor_configuration (MonitorTestCase *test_case) } } +static void +meta_output_test_destroy_notify (MetaOutput *output) +{ + g_clear_pointer (&output->driver_private, g_free); +} + static MetaMonitorTestSetup * create_monitor_test_setup (MonitorTestCase *test_case, MonitorTestFlag flags) @@ -712,6 +718,7 @@ create_monitor_test_setup (MonitorTestCase *test_case, test_setup->outputs = g_new0 (MetaOutput, test_setup->n_outputs); for (i = 0; i < test_setup->n_outputs; i++) { + MetaOutputTest *output_test; int crtc_index; MetaCrtc *crtc; int preferred_mode_index; @@ -756,10 +763,16 @@ create_monitor_test_setup (MonitorTestCase *test_case, possible_crtcs[j] = &test_setup->crtcs[possible_crtc_index]; } + output_test = g_new0 (MetaOutputTest, 1); + scale = test_case->setup.outputs[i].scale; if (scale < 1) scale = 1; + *output_test = (MetaOutputTest) { + .scale = scale + }; + is_laptop_panel = test_case->setup.outputs[i].is_laptop_panel; test_setup->outputs[i] = (MetaOutput) { @@ -789,8 +802,9 @@ create_monitor_test_setup (MonitorTestCase *test_case, .connector_type = (is_laptop_panel ? META_CONNECTOR_TYPE_eDP : META_CONNECTOR_TYPE_DisplayPort), .tile_info = test_case->setup.outputs[i].tile_info, - .scale = scale, - .is_underscanning = test_case->setup.outputs[i].is_underscanning + .is_underscanning = test_case->setup.outputs[i].is_underscanning, + .driver_private = output_test, + .driver_notify = (GDestroyNotify) meta_output_test_destroy_notify }; }