monitor-manager: Pass config to derive from when updating state

When we update state, we might not have set the current config yet (for
example if the Xrandr assignment didn't change), so pass the monitors
config we should derive from instead of fetching it from the monitor
config manager.

https://bugzilla.gnome.org/show_bug.cgi?id=787477
This commit is contained in:
Jonas Ådahl 2017-09-11 14:10:26 +08:00
parent 8b022a5595
commit 22cdc8f414
5 changed files with 53 additions and 78 deletions

View File

@ -353,12 +353,7 @@ meta_monitor_manager_dummy_ensure_initial_config (MetaMonitorManager *manager)
if (meta_is_stage_views_enabled ()) if (meta_is_stage_views_enabled ())
meta_monitor_manager_update_logical_state (manager, config); meta_monitor_manager_update_logical_state (manager, config);
else else
{ meta_monitor_manager_update_logical_state_derived (manager, NULL);
MetaMonitorManagerDeriveFlag flags =
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
meta_monitor_manager_update_logical_state_derived (manager, flags);
}
} }
static void static void

View File

@ -93,12 +93,6 @@ typedef enum _MetaLogicalMonitorLayoutMode
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL = 2 META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL = 2
} MetaLogicalMonitorLayoutMode; } MetaLogicalMonitorLayoutMode;
typedef enum _MetaMonitorManagerDeriveFlag
{
META_MONITOR_MANAGER_DERIVE_FLAG_NONE = 0,
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE = (1 << 0)
} MetaMonitorManagerDeriveFlag;
typedef enum typedef enum
{ {
META_MONITOR_TRANSFORM_NORMAL, META_MONITOR_TRANSFORM_NORMAL,
@ -423,7 +417,7 @@ struct _MetaMonitorManagerClass
void meta_monitor_manager_rebuild (MetaMonitorManager *manager, void meta_monitor_manager_rebuild (MetaMonitorManager *manager,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager, void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
MetaMonitorManagerDeriveFlag flags); MetaMonitorsConfig *config);
int meta_monitor_manager_get_num_logical_monitors (MetaMonitorManager *manager); int meta_monitor_manager_get_num_logical_monitors (MetaMonitorManager *manager);
@ -501,7 +495,7 @@ MetaMonitorsConfig * meta_monitor_manager_ensure_configured (MetaMonitorManager
void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager, void meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
MetaMonitorsConfig *config); MetaMonitorsConfig *config);
void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager, void meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
MetaMonitorManagerDeriveFlag flags); MetaMonitorsConfig *config);
gboolean meta_monitor_manager_is_lid_closed (MetaMonitorManager *manager); gboolean meta_monitor_manager_is_lid_closed (MetaMonitorManager *manager);
@ -535,6 +529,9 @@ gboolean meta_monitor_manager_get_max_screen_size (MetaMonitorManager
MetaLogicalMonitorLayoutMode MetaLogicalMonitorLayoutMode
meta_monitor_manager_get_default_layout_mode (MetaMonitorManager *manager); meta_monitor_manager_get_default_layout_mode (MetaMonitorManager *manager);
MetaMonitorConfigManager *
meta_monitor_manager_get_config_manager (MetaMonitorManager *manager);
void meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager); void meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager);
void meta_monitor_manager_clear_output (MetaOutput *output); void meta_monitor_manager_clear_output (MetaOutput *output);

View File

@ -153,15 +153,11 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
} }
static float static float
derive_configured_global_scale (MetaMonitorManager *manager) derive_configured_global_scale (MetaMonitorManager *manager,
MetaMonitorsConfig *config)
{ {
MetaMonitorsConfig *config;
MetaLogicalMonitorConfig *logical_monitor_config; MetaLogicalMonitorConfig *logical_monitor_config;
config = meta_monitor_config_manager_get_current (manager->config_manager);
if (!config)
return 1.0;
logical_monitor_config = config->logical_monitor_configs->data; logical_monitor_config = config->logical_monitor_configs->data;
return logical_monitor_config->scale; return logical_monitor_config->scale;
@ -193,12 +189,11 @@ derive_calculated_global_scale (MetaMonitorManager *manager)
static float static float
derive_scale_from_config (MetaMonitorManager *manager, derive_scale_from_config (MetaMonitorManager *manager,
MetaMonitorsConfig *config,
MetaRectangle *layout) MetaRectangle *layout)
{ {
MetaMonitorsConfig *config;
GList *l; GList *l;
config = meta_monitor_config_manager_get_current (manager->config_manager);
for (l = config->logical_monitor_configs; l; l = l->next) for (l = config->logical_monitor_configs; l; l = l->next)
{ {
MetaLogicalMonitorConfig *logical_monitor_config = l->data; MetaLogicalMonitorConfig *logical_monitor_config = l->data;
@ -213,13 +208,12 @@ derive_scale_from_config (MetaMonitorManager *manager,
static void static void
meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manager, meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manager,
MetaMonitorManagerDeriveFlag flags) MetaMonitorsConfig *config)
{ {
GList *logical_monitors = NULL; GList *logical_monitors = NULL;
GList *l; GList *l;
int monitor_number; int monitor_number;
MetaLogicalMonitor *primary_logical_monitor = NULL; MetaLogicalMonitor *primary_logical_monitor = NULL;
gboolean use_configured_scale;
gboolean use_global_scale; gboolean use_global_scale;
float global_scale = 0.0; float global_scale = 0.0;
MetaMonitorManagerCapability capabilities; MetaMonitorManagerCapability capabilities;
@ -230,13 +224,10 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
use_global_scale = use_global_scale =
!!(capabilities & META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED); !!(capabilities & META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED);
use_configured_scale =
!!(flags & META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE);
if (use_global_scale) if (use_global_scale)
{ {
if (use_configured_scale) if (config)
global_scale = derive_configured_global_scale (manager); global_scale = derive_configured_global_scale (manager, config);
else else
global_scale = derive_calculated_global_scale (manager); global_scale = derive_calculated_global_scale (manager);
} }
@ -263,8 +254,8 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
if (use_global_scale) if (use_global_scale)
scale = global_scale; scale = global_scale;
else if (use_configured_scale) else if (config)
scale = derive_scale_from_config (manager, &layout); scale = derive_scale_from_config (manager, config, &layout);
else else
scale = calculate_monitor_scale (manager, monitor); scale = calculate_monitor_scale (manager, monitor);
@ -2677,16 +2668,16 @@ meta_monitor_manager_update_monitor_modes_derived (MetaMonitorManager *manager)
void void
meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager, meta_monitor_manager_update_logical_state_derived (MetaMonitorManager *manager,
MetaMonitorManagerDeriveFlag flags) MetaMonitorsConfig *config)
{ {
manager->layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL; manager->layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL;
meta_monitor_manager_rebuild_logical_monitors_derived (manager, flags); meta_monitor_manager_rebuild_logical_monitors_derived (manager, config);
} }
void void
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager, meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
MetaMonitorManagerDeriveFlag flags) MetaMonitorsConfig *config)
{ {
GList *old_logical_monitors; GList *old_logical_monitors;
@ -2697,7 +2688,7 @@ meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager,
old_logical_monitors = manager->logical_monitors; old_logical_monitors = manager->logical_monitors;
meta_monitor_manager_update_logical_state_derived (manager, flags); meta_monitor_manager_update_logical_state_derived (manager, config);
meta_monitor_manager_notify_monitors_changed (manager); meta_monitor_manager_notify_monitors_changed (manager);
@ -2966,3 +2957,9 @@ meta_monitor_manager_get_switch_config (MetaMonitorManager *manager)
{ {
return manager->current_switch_config; return manager->current_switch_config;
} }
MetaMonitorConfigManager *
meta_monitor_manager_get_config_manager (MetaMonitorManager *manager)
{
return manager->config_manager;
}

View File

@ -1464,7 +1464,9 @@ apply_crtc_assignments (MetaMonitorManager *manager,
static void static void
meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager) meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
{ {
MetaMonitorManagerDeriveFlag flags; MetaMonitorConfigManager *config_manager =
meta_monitor_manager_get_config_manager (manager);
MetaMonitorsConfig *config;
meta_monitor_manager_ensure_configured (manager); meta_monitor_manager_ensure_configured (manager);
@ -1475,8 +1477,8 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
*/ */
meta_monitor_manager_read_current_state (manager); meta_monitor_manager_read_current_state (manager);
flags = META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE; config = meta_monitor_config_manager_get_current (config_manager);
meta_monitor_manager_update_logical_state_derived (manager, flags); meta_monitor_manager_update_logical_state_derived (manager, config);
} }
static gboolean static gboolean
@ -1490,10 +1492,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
if (!config) if (!config)
{ {
MetaMonitorManagerDeriveFlag flags = meta_monitor_manager_rebuild_derived (manager, NULL);
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
meta_monitor_manager_rebuild_derived (manager, flags);
return TRUE; return TRUE;
} }
@ -1527,11 +1526,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
} }
else else
{ {
MetaMonitorManagerDeriveFlag flags; meta_monitor_manager_rebuild_derived (manager, config);
flags = (META_MONITOR_MANAGER_DERIVE_FLAG_NONE |
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE);
meta_monitor_manager_rebuild_derived (manager, flags);
} }
} }
@ -1940,13 +1935,21 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
} }
else else
{ {
MetaMonitorManagerDeriveFlag flags = MetaMonitorsConfig *config;
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
if (is_our_configuration) if (is_our_configuration)
flags |= META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE; {
MetaMonitorConfigManager *config_manager =
meta_monitor_manager_get_config_manager (manager);
meta_monitor_manager_rebuild_derived (manager, flags); config = meta_monitor_config_manager_get_current (config_manager);
}
else
{
config = NULL;
}
meta_monitor_manager_rebuild_derived (manager, config);
} }
return TRUE; return TRUE;

View File

@ -123,10 +123,7 @@ meta_monitor_manager_test_ensure_initial_config (MetaMonitorManager *manager)
} }
else else
{ {
MetaMonitorManagerDeriveFlag flags = meta_monitor_manager_update_logical_state_derived (manager, NULL);
META_MONITOR_MANAGER_DERIVE_FLAG_NONE;
meta_monitor_manager_update_logical_state_derived (manager, flags);
} }
} }
@ -280,16 +277,9 @@ meta_monitor_manager_test_apply_monitors_config (MetaMonitorManager *manage
manager->screen_height = META_MONITOR_MANAGER_MIN_SCREEN_HEIGHT; manager->screen_height = META_MONITOR_MANAGER_MIN_SCREEN_HEIGHT;
if (meta_is_stage_views_enabled ()) if (meta_is_stage_views_enabled ())
{
meta_monitor_manager_rebuild (manager, NULL); meta_monitor_manager_rebuild (manager, NULL);
}
else else
{ meta_monitor_manager_rebuild_derived (manager, config);
MetaMonitorManagerDeriveFlag flags =
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE;
meta_monitor_manager_rebuild_derived (manager, flags);
}
return TRUE; return TRUE;
} }
@ -319,16 +309,9 @@ meta_monitor_manager_test_apply_monitors_config (MetaMonitorManager *manage
update_screen_size (manager, config); update_screen_size (manager, config);
if (meta_is_stage_views_enabled ()) if (meta_is_stage_views_enabled ())
{
meta_monitor_manager_rebuild (manager, config); meta_monitor_manager_rebuild (manager, config);
}
else else
{ meta_monitor_manager_rebuild_derived (manager, config);
MetaMonitorManagerDeriveFlag flags =
META_MONITOR_MANAGER_DERIVE_FLAG_CONFIGURED_SCALE;
meta_monitor_manager_rebuild_derived (manager, flags);
}
return TRUE; return TRUE;
} }