From 9184303b0546f0d9363538a2e307d299d2ab3a53 Mon Sep 17 00:00:00 2001 From: and3md Date: Wed, 26 Apr 2017 21:26:19 +0200 Subject: [PATCH 1/2] SDL platform windows close code changed from variable to SDL event. Fixes multiple windows closing. --- src/dlangui/platforms/sdl/sdlapp.d | 31 +++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index c88e5878..b00d9918 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -74,6 +74,7 @@ private derelict.util.exception.ShouldThrow missingSymFunc( string symName ) { private __gshared uint USER_EVENT_ID; private __gshared uint TIMER_EVENT_ID; +private __gshared uint WINDOW_CLOSE_EVENT_ID; class SDLWindow : Window { SDLPlatform _platform; @@ -1001,12 +1002,14 @@ class SDLPlatform : Platform { return null; } - SDLWindow _windowToClose; - /// close window override void closeWindow(Window w) { SDLWindow window = cast(SDLWindow)w; - _windowToClose = window; + SDL_Event sdlevent; + sdlevent.user.type = WINDOW_CLOSE_EVENT_ID; + sdlevent.user.code = 0; + sdlevent.user.windowID = window.windowId; + SDL_PushEvent(&sdlevent); } /// calls request layout for all windows @@ -1225,20 +1228,21 @@ class SDLPlatform : Platform { SDLWindow w = getWindow(event.user.windowID); if (w) { w.handleTimer(cast(uint)event.user.code); + } + } else if (event.type == WINDOW_CLOSE_EVENT_ID) { + SDLWindow windowToClose = getWindow(event.user.windowID); + if(windowToClose) { + if (windowToClose.windowId in _windowMap) { + Log.i("Platform.closeWindow()"); + _windowMap.remove(windowToClose.windowId); + SDL_DestroyWindow(windowToClose._win); + Log.i("windowMap.length=", _windowMap.length); + destroy(windowToClose); + } } } break; } - if (_windowToClose) { - if (_windowToClose.windowId in _windowMap) { - Log.i("Platform.closeWindow()"); - _windowMap.remove(_windowToClose.windowId); - SDL_DestroyWindow(_windowToClose._win); - Log.i("windowMap.length=", _windowMap.length); - destroy(_windowToClose); - } - _windowToClose = null; - } if (_windowMap.length == 0) { SDL_Quit(); quit = true; @@ -1833,6 +1837,7 @@ int sdlmain(string[] args) { USER_EVENT_ID = SDL_RegisterEvents(1); TIMER_EVENT_ID = SDL_RegisterEvents(1); + WINDOW_CLOSE_EVENT_ID = SDL_RegisterEvents(1); int request = SDL_GetDesktopDisplayMode(0, &displayMode); From a8db8a6e5aaf588bfdaad311f9bd01ef6d0e594b Mon Sep 17 00:00:00 2001 From: and3md Date: Fri, 28 Apr 2017 20:19:19 +0200 Subject: [PATCH 2/2] SDL_DestroyWindow() was called twice. First in close window code, second on window destructor. --- src/dlangui/platforms/sdl/sdlapp.d | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dlangui/platforms/sdl/sdlapp.d b/src/dlangui/platforms/sdl/sdlapp.d index b00d9918..f3aefa57 100644 --- a/src/dlangui/platforms/sdl/sdlapp.d +++ b/src/dlangui/platforms/sdl/sdlapp.d @@ -1235,7 +1235,6 @@ class SDLPlatform : Platform { if (windowToClose.windowId in _windowMap) { Log.i("Platform.closeWindow()"); _windowMap.remove(windowToClose.windowId); - SDL_DestroyWindow(windowToClose._win); Log.i("windowMap.length=", _windowMap.length); destroy(windowToClose); }