From b4de2458ab19b0f74269d374f36e1c06f43c5e9c Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Tue, 6 May 2014 19:51:13 +0200 Subject: [PATCH] MetaMonitorConfig: don't keep a previous config with the wrong outputs We can only apply a configuration if its outputs match the connected ones, so discard the current configuration if the set of output changes (for example for hotplug), otherwise we will crash trying to apply the bogus previous configuration. https://bugzilla.gnome.org/show_bug.cgi?id=725637 --- src/core/monitor-config.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/core/monitor-config.c b/src/core/monitor-config.c index a7e4ed546..0cf0866e8 100644 --- a/src/core/monitor-config.c +++ b/src/core/monitor-config.c @@ -876,7 +876,8 @@ apply_configuration (MetaMonitorConfig *self, /* Stored (persistent) configurations override the previous one always. Also, we clear the previous configuration if the current one (which is - about to become previous) is stored. + about to become previous) is stored, or if the current one has + different outputs. */ if (stored || (self->current && self->current_is_stored)) @@ -887,7 +888,19 @@ apply_configuration (MetaMonitorConfig *self, } else { - self->previous = self->current; + /* Despite the name, config_equal() only checks the set of outputs, + not their modes + */ + if (self->current && config_equal (self->current, config)) + { + self->previous = self->current; + } + else + { + if (self->current) + config_free (self->current); + self->previous = NULL; + } } self->current = config;