From 1828079518fbb4d4edf2daec47a7bc74027ff0c9 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Fri, 19 Feb 2016 18:41:04 +0000 Subject: Fix a critical bug in the Amiga frontend which causes NetSurf to never exit. Avoids looping trying to close a screen for which we are not the owner. Moves the screen close to the very end of the code so if our own screen doesn't close we can still re-launch NetSurf. --- amiga/gui.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'amiga/gui.c') diff --git a/amiga/gui.c b/amiga/gui.c index 3d1a87413..4e9e05ef3 100644 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -2966,23 +2966,28 @@ void ami_quit_netsurf_delayed(void) static void ami_gui_close_screen(struct Screen *scrn, BOOL locked_screen, BOOL donotwait) { if(scrn == NULL) return; + + if(locked_screen) { + UnlockPubScreen(NULL,scrn); + locked_screen = FALSE; + } + if(CloseScreen(scrn) == TRUE) { - if(locked_screen == FALSE) { + if(screen_signal != -1) { FreeSignal(screen_signal); screen_signal = -1; scrn = NULL; } return; } - if(locked_screen == TRUE) return; if(donotwait == TRUE) return; /* If this is our own screen, wait for visitor windows to close */ - if(screen_signal != -1) { - ULONG scrnsig = 1 << screen_signal; - LOG("Waiting for visitor windows to close... (signal)"); - Wait(scrnsig); - } + if(screen_signal == -1) return; + + ULONG scrnsig = 1 << screen_signal; + LOG("Waiting for visitor windows to close... (signal)"); + Wait(scrnsig); while (CloseScreen(scrn) == FALSE) { LOG("Waiting for visitor windows to close... (polling)"); @@ -3011,10 +3016,6 @@ void ami_try_quit(void) static void gui_quit(void) { - LOG("Closing screen"); - ami_gui_close_screen(scrn, locked_screen, FALSE); - if(nsscreentitle) FreeVec(nsscreentitle); - ami_theme_throbber_free(); urldb_save(nsoption_charp(url_file)); @@ -5704,6 +5705,11 @@ int main(int argc, char** argv) ami_object_fini(); ami_bitmap_fini(); + + LOG("Closing screen"); + ami_gui_close_screen(scrn, locked_screen, FALSE); + if(nsscreentitle) FreeVec(nsscreentitle); + ami_libs_close(); return RETURN_OK; -- cgit v1.2.3