diff options
author | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2013-02-05 19:44:21 +0000 |
---|---|---|
committer | Chris Young <chris@unsatisfactorysoftware.co.uk> | 2013-02-05 19:44:21 +0000 |
commit | 7c671378aa0484ea51bd54a671ea01adac08c434 (patch) | |
tree | 3d06e15a5f0361ec9fbfbb0ada04b14d585c6795 | |
parent | 9c7031143f377e066259b999260b7ecb076048bb (diff) | |
download | netsurf-7c671378aa0484ea51bd54a671ea01adac08c434.tar.gz netsurf-7c671378aa0484ea51bd54a671ea01adac08c434.tar.bz2 |
Don't add the same box redraw to the queue more than once
-rwxr-xr-x | amiga/gui.c | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/amiga/gui.c b/amiga/gui.c index c5f0aab01..0c021a677 100755 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -3782,21 +3782,55 @@ static void gui_window_update_box_deferred(struct gui_window *g) if(!g) return; if(IsMinListEmpty(g->deferred_rects)) return; + if(g->deferred == true) { + ami_set_pointer(g->shared, GUI_POINTER_WAIT, false); + } else { + LOG(("Ignoring deferred box redraw queue")); + } + node = (struct nsObject *)GetHead((struct List *)g->deferred_rects); do { if(g->deferred == true) { rect = (struct rect *)node->objstruct; - - ami_do_redraw_limits(g, g->shared->bw, true, + ami_do_redraw_limits(g, g->shared->bw, false, rect->x0, rect->y0, rect->x1, rect->y1); - } - + } nnode=(struct nsObject *)GetSucc((struct Node *)node); DelObject(node); } while(node = nnode); - g->deferred = false; + if(g->deferred == true) { + ami_reset_pointer(g->shared); + g->deferred = false; + } +} + +static bool gui_window_update_box_deferred_check(struct MinList *deferred_rects, + const struct rect *new_rect) +{ + struct nsObject *node; + struct nsObject *nnode; + struct rect *rect; + + if(IsMinListEmpty(deferred_rects)) return true; + + node = (struct nsObject *)GetHead((struct List *)deferred_rects); + + do { + rect = (struct rect *)node->objstruct; + + if((rect->x0 == new_rect->x0) && + (rect->y0 == new_rect->y0) && + (rect->x1 == new_rect->x1) && + (rect->y1 == new_rect->y1)) { + return false; + } + + nnode=(struct nsObject *)GetSucc((struct Node *)node); + } while(node = nnode); + + return true; } void gui_window_update_box(struct gui_window *g, const struct rect *rect) @@ -3805,12 +3839,16 @@ void gui_window_update_box(struct gui_window *g, const struct rect *rect) struct rect *deferred_rect; if(!g) return; - g->deferred = true; - deferred_rect = AllocVec(sizeof(struct rect), MEMF_PRIVATE); - CopyMem(rect, deferred_rect, sizeof(struct rect)); + if(gui_window_update_box_deferred_check(g->deferred_rects, rect)) { + g->deferred = true; + deferred_rect = AllocVec(sizeof(struct rect), MEMF_PRIVATE); + CopyMem(rect, deferred_rect, sizeof(struct rect)); - nsobj = AddObject(g->deferred_rects, AMINS_RECT); - nsobj->objstruct = deferred_rect; + nsobj = AddObject(g->deferred_rects, AMINS_RECT); + nsobj->objstruct = deferred_rect; + } else { + LOG(("Ignoring duplicate box redraw already queued")); + } } void ami_do_redraw(struct gui_window_2 *gwin) |