Quick hack to try to optimise inactive opacity handling a little. Not-signed-off-by: Darren Salt Index: src/client.c =================================================================== --- src/client.c (revision 22244) +++ src/client.c (working copy) @@ -2868,6 +2868,7 @@ DisplayInfo *display_info; Client *c; int i; + Window window, transient_for; display_info = screen_info->display_info; if (!compositorIsUsable (display_info)) @@ -2875,26 +2876,28 @@ return; } - for (c = screen_info->clients, i = 0; i < screen_info->client_count; c = c->next, ++i) + window = focus ? focus->window : None; + transient_for = focus ? focus->transient_for : None; + + for (c = screen_info->clients, i = screen_info->client_count; i; c = c->next, --i) { gboolean o = FLAG_TEST(c->type, WINDOW_TYPE_DONT_PLACE | WINDOW_TYPE_DONT_FOCUS) || (focus == c) - || (focus && ((focus->transient_for == c->window) || (focus->window == c->transient_for))) + || (focus && ((transient_for == c->window) || (window == c->transient_for))) || (focus && (clientIsModalFor (c, focus) || clientIsModalFor (focus, c))); - clientSetOpacity (c, c->opacity, OPACITY_INACTIVE, o ? 0 : OPACITY_INACTIVE); + if (G_UNLIKELY ((c->opacity_flags & OPACITY_INACTIVE) != (o ? 0 : OPACITY_INACTIVE))) + clientSetOpacity (c, c->opacity, OPACITY_INACTIVE, o ? 0 : OPACITY_INACTIVE); } } void clientSetOpacity (Client *c, guint opacity, guint clear, guint xor) { - ScreenInfo *screen_info; DisplayInfo *display_info; guint applied; - screen_info = c->screen_info; - display_info = screen_info->display_info; + display_info = c->screen_info->display_info; if (!compositorIsUsable (display_info)) { @@ -2909,23 +2912,24 @@ } else { - long long multiplier = 1, divisor = 1; + const XfwmParams *const params = c->screen_info->params; + double multiplier = 1, divisor = 1; c->opacity = applied = opacity; if (FLAG_TEST (c->opacity_flags, OPACITY_MOVE)) { - multiplier *= c->screen_info->params->move_opacity; + multiplier *= params->move_opacity; divisor *= 100; } if (FLAG_TEST (c->opacity_flags, OPACITY_RESIZE)) { - multiplier *= c->screen_info->params->resize_opacity; + multiplier *= params->resize_opacity; divisor *= 100; } if (FLAG_TEST (c->opacity_flags, OPACITY_INACTIVE)) { - multiplier *= c->screen_info->params->inactive_opacity; + multiplier *= params->inactive_opacity; divisor *= 100; }