@@ -, +, @@ We must defer match evaluation until window initialization has finished for all plugins as match evaluation means wrapped function calls. --- plugins/obs.c | 32 +++++++++++++++++++++++++++----- 1 files changed, 27 insertions(+), 5 deletions(-) --- a/plugins/obs.c +++ a/plugins/obs.c @@ -88,6 +88,8 @@ typedef struct _ObsWindow { int customFactor[MODIFIER_COUNT]; int matchFactor[MODIFIER_COUNT]; + + CompTimeoutHandle updateHandle; } ObsWindow; #define GET_OBS_DISPLAY(d) \ @@ -323,6 +325,22 @@ obsMatchPropertyChanged (CompDisplay *d, WRAP (od, d, matchPropertyChanged, obsMatchPropertyChanged); } +static Bool +obsUpdateWindow (void *closure) +{ + CompWindow *w = (CompWindow *) closure; + int i; + + OBS_WINDOW (w); + + for (i = 0; i < MODIFIER_COUNT; i++) + updatePaintModifier (w, i); + + ow->updateHandle = 0; + + return FALSE; +} + static CompOption * obsGetDisplayOptions (CompPlugin *p, CompDisplay *display, @@ -628,8 +646,8 @@ static CompBool obsInitWindow (CompPlugin *p, CompWindow *w) { - ObsWindow *ow; - int i; + ObsWindow *ow; + int i; OBS_SCREEN (w->screen); @@ -643,10 +661,11 @@ obsInitWindow (CompPlugin *p, ow->matchFactor[i] = 100; } - w->base.privates[os->windowPrivateIndex].ptr = ow; + /* defer initializing the factors from window matches as match evalution + means wrapped function calls */ + ow->updateHandle = compAddTimeout (0, 0, obsUpdateWindow, w); - for (i = 0; i < MODIFIER_COUNT; i++) - updatePaintModifier (w, i); + w->base.privates[os->windowPrivateIndex].ptr = ow; return TRUE; } @@ -657,6 +676,9 @@ obsFiniWindow (CompPlugin *p, { OBS_WINDOW (w); + if (ow->updateHandle) + compRemoveTimeout (ow->updateHandle); + free (ow); } --