I had a short time to try things.
Based on your status window code, set `wrap-mode` and `wrap-width` (which is pixels not characters).
Testing with status window on the right so the width can be changed with the pane separator sees wrapping happen fine at the set `wrap-width` or the window width if it is _greater_ than `wrap-width`. So `wrap-width` sets the _minimum_ wrap width in pixels, if less space is available it simply hides part of the column like normal.
But row heights are not recalculated, it is calculated when data is first added to the row and left at the height needed for `wrap-width` since this is big enough to contain the worst case. That is why various examples on the web show massive blank space when `wrap-width` was set small (like 50 in one example) and so the row height was calculated based on that value but he text wrapped based on the actual widget width.
Your attempt to use the callback to reset `wrap-width` seemed a good idea, but for me it is never called with signal `check-resize` (printf debugging :-). Maybe another signal could work better?
Alternatively given the uses it should be enough if we can calculate the right value for `wrap-width` based on the layout and just leave it since none of the message windows change their existing contents and new lines added (eg in status) get their height based on the `wrap-width`. This won't change the height if the window is resized after it has content, but that won't matter so much for compiler and messages which are reset regularly, so long as the new `wrap-width` is used when the new data is added. With this model status probably should be left unwrapped and of course its irrelevant to scribble and terminal.
I have run out of time now, over to you.