summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2016-12-31 00:51:05 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2016-12-31 00:51:05 +0000
commit5e523b608a330c2c10f20a8913b7bad85388d475 (patch)
treeb9036e70260177bd9d56d2a8e4b43cef7b041eb9
parent9df30eb78fc024448c39182a5d9fb0053c6ef137 (diff)
downloadnetsurf-5e523b608a330c2c10f20a8913b7bad85388d475.tar.gz
netsurf-5e523b608a330c2c10f20a8913b7bad85388d475.tar.bz2
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.
-rw-r--r--frontends/amiga/gui.c84
1 files 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();