compositor: Avoid thaw on inconsistent effect_completed calls

If the meta_window_actor_effect_completed() triggers inconsistent
accounting, there's also high chances that the thaw call will be
unexpected at this time too, which will lead to a g_error().

This makes mutter more lenient to effect_completed() calls of the
right type (i.e. those triggering freeze/thaw) being performed more
times than necessary in the upper parts. A warning will be issued,
but the process won't abort.

https://bugzilla.gnome.org/show_bug.cgi?id=777691
This commit is contained in:
Carlos Garnacho 2017-01-24 11:03:41 +01:00
parent 1597b357a1
commit 2cd78bffd9

View File

@ -1130,6 +1130,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
MetaPluginEffect event) MetaPluginEffect event)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
gboolean inconsistent = FALSE;
/* NB: Keep in mind that when effects get completed it possible /* NB: Keep in mind that when effects get completed it possible
* that the corresponding MetaWindow may have be been destroyed. * that the corresponding MetaWindow may have be been destroyed.
@ -1146,6 +1147,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
{ {
g_warning ("Error in minimize accounting."); g_warning ("Error in minimize accounting.");
priv->minimize_in_progress = 0; priv->minimize_in_progress = 0;
inconsistent = TRUE;
} }
} }
break; break;
@ -1156,6 +1158,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
{ {
g_warning ("Error in unminimize accounting."); g_warning ("Error in unminimize accounting.");
priv->unminimize_in_progress = 0; priv->unminimize_in_progress = 0;
inconsistent = TRUE;
} }
} }
break; break;
@ -1170,6 +1173,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
{ {
g_warning ("Error in map accounting."); g_warning ("Error in map accounting.");
priv->map_in_progress = 0; priv->map_in_progress = 0;
inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_DESTROY: case META_PLUGIN_DESTROY:
@ -1179,6 +1183,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
{ {
g_warning ("Error in destroy accounting."); g_warning ("Error in destroy accounting.");
priv->destroy_in_progress = 0; priv->destroy_in_progress = 0;
inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_SIZE_CHANGE: case META_PLUGIN_SIZE_CHANGE:
@ -1187,6 +1192,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
{ {
g_warning ("Error in size change accounting."); g_warning ("Error in size change accounting.");
priv->size_change_in_progress = 0; priv->size_change_in_progress = 0;
inconsistent = TRUE;
} }
break; break;
case META_PLUGIN_SWITCH_WORKSPACE: case META_PLUGIN_SWITCH_WORKSPACE:
@ -1194,7 +1200,7 @@ meta_window_actor_effect_completed (MetaWindowActor *self,
break; break;
} }
if (is_freeze_thaw_effect (event)) if (is_freeze_thaw_effect (event) && !inconsistent)
meta_window_actor_thaw (self); meta_window_actor_thaw (self);
if (!meta_window_actor_effect_in_progress (self)) if (!meta_window_actor_effect_in_progress (self))