windowPreview: Adjust WindowPreview stack when stackAbove overlay shown
When there are 3 or more windows in WorkspaceLayout, showing or hiding window preview overlay in some certain orders could cause inconsistencies in windows' vertical arrangement.
Let's take window A, B, C as an example. Initially, A is above B and B is above C in workspace layout like this: A -> B -> C.
After opening activities, user could:
- Move cursor to B preview, which would move B above all in layout: B -> A -> C
- Move cursor from B to C preview. When C's showOverlay() is called before B's hideOverlay(), _restack() would move C above all and don't change B's arrangement: C -> B -> A
- Finally, move cursor away from C's preview: B -> A -> C
In this case, when user closes Activities, they would see window stacking wrong for a while.
Closes: #4638.
Screencast. Before:
After: