This takes inspiration from FVWM and implements double parenting of decorated windows, although perhaps for different reasons.
When decorated, we'll now have
graph TD;
Root_window-->Frame_window;
Frame_window-->Wrapper_window;
Wrapper_window-->Client_window;
when a window is floating, but
graph TD;
Root_window-->Wrapper_window;
Wrapper_window-->Client_window;
when a decorated window is fullscreen.
The point of the wrapper window sitting between the frame and the client window is to avoid bugs like #2678 (closed) when we try to avoid extra blits in the X server for fullscreen windows.
This is a less fragile attempt to do what !2910 (closed) also tries, which is to avoid triggering the mentioned "unfixable" client bugs.