Right now the shading state is not really aligned because everything that's not ShadeNone will lead to ShadeNormal - including ShadeHover.
Also an early return can omit the alignment in setShade() (because if (was_shade == isShade()) does not mean the actual same shadeMode())
Finally the tabgroup is not respected when unhovering the shade (this is important because it's called through a timer and the main client may have been unshaded and reshading it here would align all shadestates, including the dominant one)
|