From 5e523b608a330c2c10f20a8913b7bad85388d475 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 31 Dec 2016 00:51:05 +0000 Subject: Simply the event loop for the shared message port This now simply calls the event callback for each window, which returns TRUE is the window was closed during event processing. The window loop now restarts if any windows were closed, which fixes a potential rare issue with delayed event processing. --- frontends/amiga/gui.c | 84 +++++++++------------------------------------------ 1 file changed, 15 insertions(+), 69 deletions(-) diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c index a453e0810..e835e2bd6 100644 --- a/frontends/amiga/gui.c +++ b/frontends/amiga/gui.c @@ -1903,18 +1903,17 @@ static void ami_set_border_gadget_size(struct gui_window_2 *gwin) #endif } -static void ami_handle_msg(void) +static BOOL ami_handle_msg(void) { struct ami_generic_window *w = NULL; struct nsObject *node; struct nsObject *nnode; - struct gui_window_2 *gwin = NULL; + BOOL win_closed = FALSE; - if(IsMinListEmpty(window_list)) - { + if(IsMinListEmpty(window_list)) { /* no windows in list, so NetSurf should not be running */ ami_try_quit(); - return; + return FALSE; } node = (struct nsObject *)GetHead((struct List *)window_list); @@ -1923,75 +1922,20 @@ static void ami_handle_msg(void) nnode=(struct nsObject *)GetSucc((struct Node *)node); w = node->objstruct; + if(w == NULL) continue; - if(node->Type == AMINS_TVWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_FINDWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_HISTORYWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_PRINTWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_GUIOPTSWINDOW) { - if(w->tbl->event(w)) { - /* last window possibly closed, so exit with conditions ;) */ - if(scrn) ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_DLWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; - } else { - node = nnode; - continue; - } - } else if(node->Type == AMINS_LOGINWINDOW) { - if(w->tbl->event(w)) { - ami_try_quit(); - break; + if(w->tbl->event != NULL) { + if((win_closed = w->tbl->event(w))) { + if((node->Type != AMINS_GUIOPTSWINDOW) || + ((node->Type == AMINS_GUIOPTSWINDOW) && (scrn != NULL))) { + ami_try_quit(); + break; + } } else { node = nnode; continue; } } - - /* assume this is a normal gui window for now */ - gwin = (struct gui_window_2 *)w; - if((gwin == NULL) || (gwin->objects[OID_MAIN] == NULL)) continue; - if(w->tbl->event(w)) { - break; - } else { - node = nnode; - continue; - } } while((node = nnode)); if(ami_menu_quit_selected() == true) { @@ -2001,6 +1945,8 @@ static void ami_handle_msg(void) if(ami_menu_get_check_toggled() == true) { ami_gui_menu_update_all(); } + + return win_closed; } static BOOL ami_gui_event(void *w) @@ -2846,7 +2792,7 @@ void ami_get_msg(void) } if(signal & winsignal) - ami_handle_msg(); + while(ami_handle_msg()); if(signal & appsig) ami_handle_appmsg(); -- cgit v1.2.3