diff --git a/minigui.d b/minigui.d index c89ed5c..3d427b5 100644 --- a/minigui.d +++ b/minigui.d @@ -1131,6 +1131,13 @@ class Widget { foreach(child; children) child.discardXConnectionState(); } + + void recreateXConnectionState() { + + foreach(child; children) + child.discardXConnectionState(); + redraw(); + } } /// @@ -2482,6 +2489,12 @@ class Window : Widget { /// this(SimpleWindow win) { + + static if(UsingSimpledisplayX11) { + win.discardAdditionalConnectionState = &discardXConnectionState; + win.recreateAdditionalConnectionState = &recreateXConnectionState; + } + tabStop = false; super(null); this.win = win; diff --git a/simpledisplay.d b/simpledisplay.d index 0536afc..2037d06 100644 --- a/simpledisplay.d +++ b/simpledisplay.d @@ -1073,15 +1073,29 @@ class SimpleWindow : CapableOfHandlingNativeEvent { if(_parent !is null && _parent.stateDiscarded) _parent.recreateAfterDisconnect(); + bool wasHidden = hidden; + + activeScreenPainter = null; // should already be done but just to confirm + impl.createWindow(_width, _height, _title, openglMode, _parent); + + if(recreateAdditionalConnectionState) + recreateAdditionalConnectionState(); + + hidden = wasHidden; } bool stateDiscarded; void discardConnectionState() { if(XDisplayConnection.display) impl.dispose(); // if display is already null, it is hopeless to try to destroy stuff on it anyway + if(discardAdditionalConnectionState) + discardAdditionalConnectionState(); stateDiscarded = true; } + + void delegate() discardAdditionalConnectionState; + void delegate() recreateAdditionalConnectionState; }