Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/ab53f74788ece5121667bf69375fd3394d984fc9
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/ab53f74788ece5121667bf69375fd3394d984fc9
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/ab53f74788ece5121667bf69375fd3394d984fc9

The branch, master has been updated
       via  ab53f74788ece5121667bf69375fd3394d984fc9 (commit)
       via  6e0f5bee5587db14f7c5755f50a7a17d665d0b99 (commit)
       via  becd3863c469ee44ccd8922e176a5394afaca682 (commit)
       via  6177e2930bb3c74908daa52a16a2b7c830108d0c (commit)
       via  b61c21c7d03b4af13e9650348679005bc54bd0f7 (commit)
       via  d930da38997bb5c7ec3c077568465d2595f02693 (commit)
       via  b1029506505320859c57d056011003b71053b600 (commit)
       via  6833f526f61ab1e9c5e2e50d9376b1bec83223ee (commit)
       via  febbdec345237eef8672e9094932dd31448a4036 (commit)
       via  14bff8d023891ad6cd02e5986dae4368dfdef80b (commit)
      from  ff20edbfbe35ce2be631456ffbe8ae6ca9fd05f5 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=ab53f74788ece5121667bf69375fd3394d984fc9
commit ab53f74788ece5121667bf69375fd3394d984fc9
Merge: ff20edb 6e0f5be
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    Merge branch 'vince/invalidate-api'



commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=6e0f5bee5587db14f7c5755f50a7a17d665d0b99
commit 6e0f5bee5587db14f7c5755f50a7a17d665d0b99
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    Update beos frontend to use invalidate window area API

diff --git a/frontends/beos/window.cpp b/frontends/beos/window.cpp
index fbf7b16..4db7b3c 100644
--- a/frontends/beos/window.cpp
+++ b/frontends/beos/window.cpp
@@ -1000,39 +1000,42 @@ void nsbeos_redraw_caret(struct gui_window *g)
        g->view->UnlockLooper();
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
+/**
+ * Invalidate an area of a beos browser window
+ *
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for entrire window area.
+ * \return NSERROR_OK or appropriate error code.
+ */
+static nserror
+beos_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
-       if (g->view == NULL)
-               return;
-       if (!g->view->LockLooper())
-               return;
-
-       nsbeos_current_gc_set(g->view);
-
-       g->view->Invalidate();
-
-       nsbeos_current_gc_set(NULL);
-       g->view->UnlockLooper();
-}
+       if (browser_window_has_content(g->bw) == false) {
+               return NSERROR_OK;
+       }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
-{
-       if (browser_window_has_content(g->bw) == false)
-               return;
+       if (g->view == NULL) {
+               return NSERROR_OK;
+       }
 
-       if (g->view == NULL)
-               return;
-       if (!g->view->LockLooper())
-               return;
+       if (!g->view->LockLooper()) {
+               return NSERROR_OK;
+       }
 
        nsbeos_current_gc_set(g->view);
 
-//XXX +1 ??
-       g->view->Invalidate(BRect(rect->x0, rect->y0,
-                                  rect->x1 - 1, rect->y1 - 1));
+       if (rect != NULL) {
+               //XXX +1 ??
+               g->view->Invalidate(BRect(rect->x0, rect->y0,
+                                         rect->x1 - 1, rect->y1 - 1));
+       } else {
+               g->view->Invalidate();
+       }
 
        nsbeos_current_gc_set(NULL);
        g->view->UnlockLooper();
+
+       return NSERROR_OK;
 }
 
 static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
@@ -1349,8 +1352,7 @@ static void gui_window_get_dimensions(struct gui_window 
*g, int *width, int *hei
 static struct gui_window_table window_table = {
        gui_window_create,
        gui_window_destroy,
-       gui_window_redraw_window,
-       gui_window_update_box,
+       beos_window_invalidate_area,
        gui_window_get_scroll,
        gui_window_set_scroll,
        gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=becd3863c469ee44ccd8922e176a5394afaca682
commit becd3863c469ee44ccd8922e176a5394afaca682
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    Update framebuffer frontend to use invalidate window area API

diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
index 4d4c733..3de228a 100644
--- a/frontends/framebuffer/gui.c
+++ b/frontends/framebuffer/gui.c
@@ -1803,21 +1803,33 @@ gui_window_destroy(struct gui_window *gw)
        free(gw);
 }
 
-static void
-gui_window_redraw_window(struct gui_window *g)
-{
-       fb_queue_redraw(g->browser, 0, 0, fbtk_get_width(g->browser), 
fbtk_get_height(g->browser) );
-}
 
-static void
-gui_window_update_box(struct gui_window *g, const struct rect *rect)
+/**
+ * Invalidates an area of a framebuffer browser window
+ *
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+fb_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
        struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
-       fb_queue_redraw(g->browser,
-                       rect->x0 - bwidget->scrollx,
-                       rect->y0 - bwidget->scrolly,
-                       rect->x1 - bwidget->scrollx,
-                       rect->y1 - bwidget->scrolly);
+
+       if (rect != NULL) {
+               fb_queue_redraw(g->browser,
+                               rect->x0 - bwidget->scrollx,
+                               rect->y0 - bwidget->scrolly,
+                               rect->x1 - bwidget->scrollx,
+                               rect->y1 - bwidget->scrolly);
+       } else {
+               fb_queue_redraw(g->browser,
+                               0,
+                               0,
+                               fbtk_get_width(g->browser),
+                               fbtk_get_height(g->browser));
+       }
+       return NSERROR_OK;
 }
 
 static bool
@@ -2051,8 +2063,7 @@ static void framebuffer_window_reformat(struct gui_window 
*gw)
 static struct gui_window_table framebuffer_window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = fb_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=6177e2930bb3c74908daa52a16a2b7c830108d0c
commit 6177e2930bb3c74908daa52a16a2b7c830108d0c
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    Update monkey frontend to use invalidate window area API

diff --git a/frontends/monkey/browser.c b/frontends/monkey/browser.c
index 3bf0dd0..7cd3d07 100644
--- a/frontends/monkey/browser.c
+++ b/frontends/monkey/browser.c
@@ -119,12 +119,6 @@ gui_window_set_title(struct gui_window *g, const char 
*title)
 }
 
 static void
-gui_window_redraw_window(struct gui_window *g)
-{
-  fprintf(stdout, "WINDOW REDRAW WIN %u\n", g->win_num);
-}
-
-static void
 gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
                           bool scaled)
 {
@@ -166,13 +160,28 @@ gui_window_set_scroll(struct gui_window *g, int sx, int 
sy)
   fprintf(stdout, "WINDOW SET_SCROLL WIN %u X %d Y %d\n", g->win_num, sx, sy);
 }
 
-static void
-gui_window_update_box(struct gui_window *g, const struct rect *rect)
+/**
+ * Invalidates an area of a monkey browser window
+ *
+ * \param gw gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+monkey_window_invalidate_area(struct gui_window *gw, const struct rect *rect)
 {
-  fprintf(stdout, "WINDOW UPDATE_BOX WIN %u X %d Y %d WIDTH %d HEIGHT %d\n",
-          g->win_num, rect->x0, rect->y0,
-          (rect->x1 - rect->x0), (rect->y1 - rect->y0));
-  
+       fprintf(stdout, "WINDOW INVALIDATE_AREA WIN %u", gw->win_num);
+
+       if (rect != NULL) {
+               fprintf(stdout,
+                       " X %d Y %d WIDTH %d HEIGHT %d\n",
+                       rect->x0, rect->y0,
+                       (rect->x1 - rect->x0), (rect->y1 - rect->y0));
+       } else {
+               fprintf(stdout," ALL\n");
+       }
+
+       return NSERROR_OK;
 }
 
 static void
@@ -501,8 +510,7 @@ monkey_window_handle_command(int argc, char **argv)
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = monkey_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=b61c21c7d03b4af13e9650348679005bc54bd0f7
commit b61c21c7d03b4af13e9650348679005bc54bd0f7
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    Update windows frontend to use invalidate window area API

diff --git a/frontends/windows/window.c b/frontends/windows/window.c
index c902202..c0af46f 100644
--- a/frontends/windows/window.c
+++ b/frontends/windows/window.c
@@ -883,17 +883,35 @@ static void nsws_window_update_forward_back(struct 
gui_window *w)
 
 
 /**
- * redraw the whole window
+ * Invalidate an area of a win32 browser window
  *
- * \param gw win32 frontends graphical window.
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for entrire window area.
+ * \return NSERROR_OK or appropriate error code.
  */
-static void win32_window_redraw_window(struct gui_window *gw)
+static nserror
+win32_window_invalidate_area(struct gui_window *gw, const struct rect *rect)
 {
-       /* LOG("gw:%p", gw); */
-       if (gw != NULL) {
-               RedrawWindow(gw->drawingarea, NULL, NULL,
-                            RDW_INVALIDATE | RDW_NOERASE);
+       RECT *redrawrectp = NULL;
+       RECT redrawrect;
+
+       assert(gw != NULL);
+
+       if (rect != NULL) {
+               redrawrectp = &redrawrect;
+
+               redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->scale);
+               redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->scale);
+               redrawrect.right =(long)rect->x1;
+               redrawrect.bottom = (long)rect->y1;
+
        }
+       RedrawWindow(gw->drawingarea,
+                    redrawrectp,
+                    NULL,
+                    RDW_INVALIDATE | RDW_NOERASE);
+
+       return NSERROR_OK;
 }
 
 
@@ -922,7 +940,7 @@ static void nsws_set_scale(struct gui_window *gw, float 
scale)
                browser_window_set_scale(gw->bw, scale, true);
        }
 
-       win32_window_redraw_window(gw);
+       win32_window_invalidate_area(gw, NULL);
        win32_window_set_scroll(gw, x, y);
 }
 
@@ -1523,32 +1541,6 @@ static void win32_window_destroy(struct gui_window *w)
 
 
 /**
- * Cause redraw of part of a win32 window.
- *
- * \param gw win32 gui window
- * \param rect area to redraw
- */
-static void
-win32_window_update(struct gui_window *gw, const struct rect *rect)
-{
-       if (gw == NULL)
-               return;
-
-       RECT redrawrect;
-
-       redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->scale);
-       redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->scale);
-       redrawrect.right =(long)rect->x1;
-       redrawrect.bottom = (long)rect->y1;
-
-       RedrawWindow(gw->drawingarea,
-                    &redrawrect,
-                    NULL,
-                    RDW_INVALIDATE | RDW_NOERASE);
-}
-
-
-/**
  * Find the current dimensions of a win32 browser window's content area.
  *
  * \param gw gui_window to measure
@@ -1776,8 +1768,7 @@ static void win32_window_stop_throbber(struct gui_window 
*w)
 static struct gui_window_table window_table = {
        .create = win32_window_create,
        .destroy = win32_window_destroy,
-       .redraw = win32_window_redraw_window,
-       .update = win32_window_update,
+       .invalidate = win32_window_invalidate_area,
        .get_scroll = win32_window_get_scroll,
        .set_scroll = win32_window_set_scroll,
        .get_dimensions = win32_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=d930da38997bb5c7ec3c077568465d2595f02693
commit d930da38997bb5c7ec3c077568465d2595f02693
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    update gtk frontend with invalidate window API change

diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 40e5580..25b975e 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -1014,27 +1014,38 @@ static void gui_window_remove_caret(struct gui_window 
*g)
 
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
-{
-       gtk_widget_queue_draw(GTK_WIDGET(g->layout));
-}
-
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
+/**
+ * Invalidates an area of a GTK browser window
+ *
+ * \param g gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+nsgtk_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
        int sx, sy;
        float scale;
 
-       if (!browser_window_has_content(g->bw))
-               return;
+       if (rect == NULL) {
+               gtk_widget_queue_draw(GTK_WIDGET(g->layout));
+               return NSERROR_OK;
+       }
+
+       if (!browser_window_has_content(g->bw)) {
+               return NSERROR_OK;
+       }
 
        gui_window_get_scroll(g, &sx, &sy);
        scale = browser_window_get_scale(g->bw);
 
        gtk_widget_queue_draw_area(GTK_WIDGET(g->layout),
-                       rect->x0 * scale - sx,
-                       rect->y0 * scale - sy,
-                       (rect->x1 - rect->x0) * scale,
-                       (rect->y1 - rect->y0) * scale);
+                                  rect->x0 * scale - sx,
+                                  rect->y0 * scale - sy,
+                                  (rect->x1 - rect->x0) * scale,
+                                  (rect->y1 - rect->y0) * scale);
+
+       return NSERROR_OK;
 }
 
 static void gui_window_set_status(struct gui_window *g, const char *text)
@@ -1295,7 +1306,7 @@ gui_window_file_gadget_open(struct gui_window *g,
                        GTK_FILE_CHOOSER(dialog));
                
                browser_window_set_gadget_filename(g->bw, gadget, filename);
-               
+
                g_free(filename);
        }
 
@@ -1305,8 +1316,7 @@ gui_window_file_gadget_open(struct gui_window *g,
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = nsgtk_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=b1029506505320859c57d056011003b71053b600
commit b1029506505320859c57d056011003b71053b600
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    update atari frontend for invalidate window API change

diff --git a/frontends/atari/gui.c b/frontends/atari/gui.c
index 1287b47..ad568b7 100644
--- a/frontends/atari/gui.c
+++ b/frontends/atari/gui.c
@@ -385,34 +385,41 @@ static void atari_window_reformat(struct gui_window *gw)
     }
 }
 
-static void gui_window_redraw_window(struct gui_window *gw)
-{
-       //CMP_BROWSER b;
-       GRECT rect;
-       if (gw == NULL)
-               return;
-       //b = gw->browser;
-       window_get_grect(gw->root, BROWSER_AREA_CONTENT, &rect);
-       window_schedule_redraw_grect(gw->root, &rect);
-}
 
-static void gui_window_update_box(struct gui_window *gw, const struct rect 
*rect)
+/**
+ * Invalidates an area of an atari browser window
+ *
+ * \param gw gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+atari_window_invalidate_area(struct gui_window *gw,
+                            const struct rect *rect)
 {
     GRECT area;
-    struct gemtk_wm_scroll_info_s *slid;
 
-    if (gw == NULL)
-       return;
-
-    slid = gemtk_wm_get_scroll_info(gw->root->win);
+    if (gw == NULL) {
+       return NSERROR_BAD_PARAMETER;
+    }
 
     window_get_grect(gw->root, BROWSER_AREA_CONTENT, &area);
-    area.g_x += rect->x0 - (slid->x_pos * slid->x_unit_px);
-    area.g_y += rect->y0 - (slid->y_pos * slid->y_unit_px);
-    area.g_w = rect->x1 - rect->x0;
-    area.g_h = rect->y1 - rect->y0;
+
+    if (rect != NULL) {
+           struct gemtk_wm_scroll_info_s *slid;
+
+           slid = gemtk_wm_get_scroll_info(gw->root->win);
+
+           area.g_x += rect->x0 - (slid->x_pos * slid->x_unit_px);
+           area.g_y += rect->y0 - (slid->y_pos * slid->y_unit_px);
+           area.g_w = rect->x1 - rect->x0;
+           area.g_h = rect->y1 - rect->y0;
+    }
+
     //dbg_grect("update box", &area);
     window_schedule_redraw_grect(gw->root, &area);
+
+    return NSERROR_OK;
 }
 
 bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
@@ -680,7 +687,7 @@ static void gui_window_new_content(struct gui_window *w)
     slid->x_pos = 0;
     slid->y_pos = 0;
     gemtk_wm_update_slider(w->root->win, GEMTK_WM_VH_SLIDER);
-    gui_window_redraw_window(w);
+    atari_window_invalidate_area(w, NULL);
 }
 
 
@@ -1051,8 +1058,7 @@ static void gui_init(int argc, char** argv)
 static struct gui_window_table atari_window_table = {
     .create = gui_window_create,
     .destroy = gui_window_destroy,
-    .redraw = gui_window_redraw_window,
-    .update = gui_window_update_box,
+    .invalidate = atari_window_invalidate_area,
     .get_scroll = gui_window_get_scroll,
     .set_scroll = gui_window_set_scroll,
     .get_dimensions = gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=6833f526f61ab1e9c5e2e50d9376b1bec83223ee
commit 6833f526f61ab1e9c5e2e50d9376b1bec83223ee
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    update amiga frontend invalidate window API change

diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c
index 6572274..3e66259 100644
--- a/frontends/amiga/gui.c
+++ b/frontends/amiga/gui.c
@@ -245,7 +245,7 @@ static bool gui_window_get_scroll(struct gui_window *g, int 
*restrict sx, int *r
 static void gui_window_set_scroll(struct gui_window *g, int sx, int sy);
 static void gui_window_remove_caret(struct gui_window *g);
 static void gui_window_place_caret(struct gui_window *g, int x, int y, int 
height, const struct rect *clip);
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*restrict rect);
+//static void amiga_window_invalidate_area(struct gui_window *g, const struct 
rect *restrict rect);
 
 
 /* accessors for default options - user option is updated if it is set as per 
default */
@@ -3667,6 +3667,44 @@ static void ami_do_redraw_limits(struct gui_window *g, 
struct browser_window *bw
        return;
 }
 
+
+/**
+ * Invalidates an area of an amiga browser window
+ *
+ * \param g gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror amiga_window_invalidate_area(struct gui_window *g,
+                                           const struct rect *restrict rect)
+{
+       struct nsObject *nsobj;
+       struct rect *restrict deferred_rect;
+
+       if(!g) return NSERROR_BAD_PARAMETER;
+
+       if (rect == NULL) {
+               if (g != g->shared->gw) {
+                       return NSERROR_OK;
+               }
+       } else {
+               if (ami_gui_window_update_box_deferred_check(g->deferred_rects, 
rect,
+                                                           
g->deferred_rects_pool)) {
+                       deferred_rect = 
ami_memory_itempool_alloc(g->deferred_rects_pool,
+                                                                 sizeof(struct 
rect));
+                       CopyMem(rect, deferred_rect, sizeof(struct rect));
+                       nsobj = AddObject(g->deferred_rects, AMINS_RECT);
+                       nsobj->objstruct = deferred_rect;
+               } else {
+                       LOG("Ignoring duplicate or subset of queued box 
redraw");
+               }
+       }
+       ami_schedule_redraw(g->shared, false);
+
+       return NSERROR_OK;
+}
+
+
 static void ami_refresh_window(struct gui_window_2 *gwin)
 {
        /* simplerefresh only */
@@ -3699,7 +3737,7 @@ static void ami_refresh_window(struct gui_window_2 *gwin)
 
        regrect = gwin->win->RPort->Layer->DamageList->RegionRectangle;
 
-       gui_window_update_box(gwin->gw, &r);
+       amiga_window_invalidate_area(gwin->gw, &r);
 
        while(regrect)
        {
@@ -3714,7 +3752,7 @@ static void ami_refresh_window(struct gui_window_2 *gwin)
 
                regrect = regrect->Next;
 
-               gui_window_update_box(gwin->gw, &r);
+               amiga_window_invalidate_area(gwin->gw, &r);
        }
 
        EndRefresh(gwin->win, TRUE);
@@ -4706,7 +4744,7 @@ static void ami_redraw_callback(void *p)
  *
  * \param  gwin         a struct gui_window_2
  * \param  full_redraw  set to true to schedule a full redraw,
-                        should only be set to false when called from 
gui_window_update_box()
+                        should only be set to false when called from 
amiga_window_invalidate_area()
  */
 void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw)
 {
@@ -4721,14 +4759,6 @@ static void ami_schedule_redraw_remove(struct 
gui_window_2 *gwin)
        ami_schedule(-1, ami_redraw_callback, gwin);
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
-{
-       if(!g) return;
-
-       if(g == g->shared->gw)
-               ami_schedule_redraw(g->shared, true);
-}
-
 static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
 {
        struct nsObject *node;
@@ -4796,23 +4826,6 @@ bool ami_gui_window_update_box_deferred_check(struct 
MinList *deferred_rects,
        return true;
 }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*restrict rect)
-{
-       struct nsObject *nsobj;
-       struct rect *restrict deferred_rect;
-       if(!g) return;
-       
-       if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect,
-                       g->deferred_rects_pool)) {
-               deferred_rect = 
ami_memory_itempool_alloc(g->deferred_rects_pool, sizeof(struct rect));
-               CopyMem(rect, deferred_rect, sizeof(struct rect));
-               nsobj = AddObject(g->deferred_rects, AMINS_RECT);
-               nsobj->objstruct = deferred_rect;
-       } else {
-               LOG("Ignoring duplicate or subset of queued box redraw");
-       }
-       ami_schedule_redraw(g->shared, false);
-}
 
 /**
  * callback from core to reformat a window.
@@ -4883,26 +4896,26 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
height - (vcurrent - oldv) - 1);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
                else if(vcurrent<oldv) /* Going up */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, oldv - vcurrent + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
 
                if(hcurrent>oldh) /* Going right */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 
width - (hcurrent - oldh), 0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
                else if(hcurrent<oldh) /* Going left */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
oldh - hcurrent + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
        }
        else
@@ -4932,6 +4945,7 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
        ami_gui_free_space_box(bbox);
 }
 
+
 void ami_get_hscroll_pos(struct gui_window_2 *gwin, ULONG *xs)
 {
        if(gwin->objects[GID_HSCROLL])
@@ -5556,8 +5570,7 @@ static char *ami_gui_get_user_dir(STRPTR current_user)
 static struct gui_window_table amiga_window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = amiga_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=febbdec345237eef8672e9094932dd31448a4036
commit febbdec345237eef8672e9094932dd31448a4036
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    update riscos frontend to invalidate window API

diff --git a/frontends/riscos/print.c b/frontends/riscos/print.c
index 1ccfc7f..b7ddd4e 100644
--- a/frontends/riscos/print.c
+++ b/frontends/riscos/print.c
@@ -41,6 +41,7 @@
 #include "content/content.h"
 
 #include "riscos/gui.h"
+#include "riscos/window.h"
 #include "riscos/dialog.h"
 #include "riscos/menus.h"
 #include "riscos/print.h"
@@ -95,7 +96,6 @@ static unsigned int print_fonts_count;
 /** Error in print_fonts_plot_text() or print_fonts_callback(). */
 static const char *print_fonts_error;
 
-void gui_window_redraw_window(struct gui_window *g);
 
 static bool ro_gui_print_click(wimp_pointer *pointer);
 static bool ro_gui_print_apply(wimp_w w);
@@ -729,7 +729,7 @@ bool print_document(struct gui_window *g, const char 
*filename)
        if (content_get_type(h) == CONTENT_HTML)
                content_reformat(h, false, saved_width, saved_height);
 
-       gui_window_redraw_window(g);
+       ro_gui_window_invalidate_area(g, NULL);
 
        return true;
 
diff --git a/frontends/riscos/window.c b/frontends/riscos/window.c
index b1ea58a..6b5089c 100644
--- a/frontends/riscos/window.c
+++ b/frontends/riscos/window.c
@@ -90,8 +90,6 @@
 #include "riscos/ucstables.h"
 #include "riscos/filetype.h"
 
-void gui_window_redraw_window(struct gui_window *g);
-
 static void gui_window_set_extent(struct gui_window *g, int width, int height);
 
 static void ro_gui_window_redraw(wimp_draw *redraw);
@@ -696,46 +694,39 @@ static void gui_window_set_title(struct gui_window *g, 
const char *title)
        ro_gui_set_window_title(g->window, g->title);
 }
 
-
-/**
- * Force a redraw of the entire contents of a browser window.
- *
- * \param  g   gui_window to redraw
- */
-void gui_window_redraw_window(struct gui_window *g)
+/* exported interface documented in riscos/window.h */
+nserror ro_gui_window_invalidate_area(struct gui_window *g,
+                                  const struct rect *rect)
 {
+       bool use_buffer;
+       int x0, y0, x1, y1;
+       struct update_box *cur;
        wimp_window_info info;
        os_error *error;
 
        assert(g);
-       info.w = g->window;
-       error = xwimp_get_window_info_header_only(&info);
-       if (error) {
-               LOG("xwimp_get_window_info_header_only: 0x%x: %s", 
error->errnum, error->errmess);
-               ro_warn_user("WimpError", error->errmess);
-               return;
-       }
-       error = xwimp_force_redraw(g->window, info.extent.x0, info.extent.y0,
-                       info.extent.x1, info.extent.y1);
-       if (error) {
-               LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, 
error->errmess);
-               ro_warn_user("WimpError", error->errmess);
-       }
-}
-
 
-/**
- * Redraw an area of a window.
- *
- * \param  g The window to update
- * \param  rect  The area of the window to update.
- */
+       if (rect == NULL) {
+               info.w = g->window;
+               error = xwimp_get_window_info_header_only(&info);
+               if (error) {
+                       LOG("xwimp_get_window_info_header_only: 0x%x: %s",
+                           error->errnum, error->errmess);
+                       ro_warn_user("WimpError", error->errmess);
+                       return NSERROR_INVALID;
+               }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
-{
-       bool use_buffer;
-       int x0, y0, x1, y1;
-       struct update_box *cur;
+               error = xwimp_force_redraw(g->window,
+                                          info.extent.x0, info.extent.y0,
+                                          info.extent.x1, info.extent.y1);
+               if (error) {
+                       LOG("xwimp_force_redraw: 0x%x: %s",
+                           error->errnum, error->errmess);
+                       ro_warn_user("WimpError", error->errmess);
+                       return NSERROR_INVALID;
+               }
+               return NSERROR_OK;
+       }
 
        x0 = floorf(rect->x0 * 2 * g->scale);
        y0 = -ceilf(rect->y1 * 2 * g->scale);
@@ -747,25 +738,27 @@ static void gui_window_update_box(struct gui_window *g, 
const struct rect *rect)
        /* try to optimise buffered redraws */
        if (use_buffer) {
                for (cur = pending_updates; cur != NULL; cur = cur->next) {
-                       if ((cur->g != g) || (!cur->use_buffer))
+                       if ((cur->g != g) || (!cur->use_buffer)) {
                                continue;
-                       if ((((cur->x0 - x1) < MARGIN) || ((cur->x1 - x0) < 
MARGIN)) &&
-                                       (((cur->y0 - y1) < MARGIN) || ((cur->y1 
- y0) < MARGIN))) {
+                       }
+                       if ((((cur->x0 - x1) < MARGIN) ||
+                            ((cur->x1 - x0) < MARGIN)) &&
+                           (((cur->y0 - y1) < MARGIN) ||
+                            ((cur->y1 - y0) < MARGIN))) {
                                cur->x0 = min(cur->x0, x0);
                                cur->y0 = min(cur->y0, y0);
                                cur->x1 = max(cur->x1, x1);
                                cur->y1 = max(cur->y1, y1);
-                               return;
+                               return NSERROR_OK;
                        }
-
                }
        }
        cur = malloc(sizeof(struct update_box));
        if (!cur) {
                LOG("No memory for malloc.");
-               ro_warn_user("NoMemory", 0);
-               return;
+               return NSERROR_NOMEM;
        }
+
        cur->x0 = x0;
        cur->y0 = y0;
        cur->x1 = x1;
@@ -774,6 +767,8 @@ static void gui_window_update_box(struct gui_window *g, 
const struct rect *rect)
        pending_updates = cur;
        cur->g = g;
        cur->use_buffer = use_buffer;
+
+       return NSERROR_OK;
 }
 
 
@@ -1983,7 +1978,7 @@ bool ro_gui_window_handle_local_keypress(struct 
gui_window *g, wimp_key *key,
                /* Toggle display of box outlines. */
                browser_window_debug(g->bw, CONTENT_DEBUG_REDRAW);
 
-               gui_window_redraw_window(g);
+               ro_gui_window_invalidate_area(g, NULL);
                return true;
 
        case wimp_KEY_RETURN:
@@ -4104,8 +4099,9 @@ void ro_gui_window_action_page_info(struct gui_window *g)
 void ro_gui_window_redraw_all(void)
 {
        struct gui_window *g;
-       for (g = window_list; g; g = g->next)
-               gui_window_redraw_window(g);
+       for (g = window_list; g; g = g->next) {
+               ro_gui_window_invalidate_area(g, NULL);
+       }
 }
 
 
@@ -4985,8 +4981,7 @@ bool ro_gui_alt_pressed(void)
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = ro_gui_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/riscos/window.h b/frontends/riscos/window.h
index 2e6f6e9..30b0965 100644
--- a/frontends/riscos/window.h
+++ b/frontends/riscos/window.h
@@ -42,5 +42,19 @@ bool ro_gui_window_check_menu(wimp_menu *menu);
  */
 nserror ro_gui_window_set_url(struct gui_window *g, struct nsurl *url);
 
+/**
+ * Cause an area of a window to be invalidated
+ *
+ * The specified area of the window should now be considered out of
+ *  date. If the entire window is invalidated this simply calls
+ *  wimp_force_redraw() otherwise the area is added to a queue of
+ *  pending updates which will be processed from a wimp poll allowing
+ *  multiple invalidation requests to be agregated.
+ *
+ * \param g The window to update
+ * \param rect The area of the window to update or NULL to redraw entire 
contents.
+ */
+nserror ro_gui_window_invalidate_area(struct gui_window *g, const struct rect 
*rect);
+
 #endif
 


commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=14bff8d023891ad6cd02e5986dae4368dfdef80b
commit 14bff8d023891ad6cd02e5986dae4368dfdef80b
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>

    replace redraw and update methods with invalidate in window table API

diff --git a/desktop/browser.c b/desktop/browser.c
index 0a4afc1..45f3006 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -2332,7 +2332,7 @@ void browser_window_update(struct browser_window *bw, 
bool scroll_to_top)
                        }
                }
 
-               guit->window->redraw(bw->window);
+               guit->window->invalidate(bw->window, NULL);
 
                break;
 
@@ -2398,7 +2398,7 @@ void browser_window_update_box(struct browser_window *bw, 
struct rect *rect)
 
        if (bw->window != NULL) {
                /* Front end window */
-               guit->window->update(bw->window, rect);
+               guit->window->invalidate(bw->window, rect);
        } else {
                /* Core managed browser window */
                browser_window_get_position(bw, true, &pos_x, &pos_y);
@@ -2410,7 +2410,7 @@ void browser_window_update_box(struct browser_window *bw, 
struct rect *rect)
                rect->x1 += pos_x / bw->scale;
                rect->y1 += pos_y / bw->scale;
 
-               guit->window->update(top->window, rect);
+               guit->window->invalidate(top->window, rect);
        }
 }
 
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
index 88bb9ba..e1de21e 100644
--- a/desktop/gui_factory.c
+++ b/desktop/gui_factory.c
@@ -161,10 +161,7 @@ static nserror verify_window_register(struct 
gui_window_table *gwt)
        if (gwt->destroy == NULL) {
                return NSERROR_BAD_PARAMETER;
        }
-       if (gwt->redraw == NULL) {
-               return NSERROR_BAD_PARAMETER;
-       }
-       if (gwt->update == NULL) {
+       if (gwt->invalidate == NULL) {
                return NSERROR_BAD_PARAMETER;
        }
        if (gwt->get_scroll == NULL) {
diff --git a/include/netsurf/window.h b/include/netsurf/window.h
index b887368..434a795 100644
--- a/include/netsurf/window.h
+++ b/include/netsurf/window.h
@@ -98,21 +98,23 @@ struct gui_window_table {
        void (*destroy)(struct gui_window *gw);
 
        /**
-        * Force a redraw of the entire contents of a window.
+        * Invalidate an area of a window.
         *
-        * @todo this API should be merged with update.
+        * The specified area of the window should now be considered
+        *  out of date. If the area is NULL the entire window must be
+        *  invalidated. It is expected that the windowing system will
+        *  then subsequently cause redraw/expose operations as
+        *  necessary.
         *
-        * \param g gui_window to redraw
-        */
-       void (*redraw)(struct gui_window *g);
-
-       /**
-        * Redraw an area of a window.
+        * \note the frontend should not attempt to actually start the
+        *  redraw operations as a result of this callback because the
+        *  core redraw functions may already be threaded.
         *
         * \param g gui_window
-        * \param rect area to redraw
+        * \param rect area to redraw or NULL for the entire window area
+        * \return NSERROR_OK on success or appropriate error code
         */
-       void (*update)(struct gui_window *g, const struct rect *rect);
+       nserror (*invalidate)(struct gui_window *g, const struct rect *rect);
 
        /**
         * Get the scroll position of a browser window.
@@ -289,7 +291,7 @@ struct gui_window_table {
        /**
         * Called when the gui_window has new content.
         *
-        * \param  g  the gui_window that has new content
+        * \param g the gui_window that has new content
         */
        void (*new_content)(struct gui_window *g);
 
@@ -303,13 +305,19 @@ struct gui_window_table {
         */
        void (*file_gadget_open)(struct gui_window *g, struct hlcache_handle 
*hl, struct form_control *gadget);
 
-       /** object dragged to window*/
+       /**
+        * object dragged to window
+        */
        void (*drag_save_object)(struct gui_window *g, struct hlcache_handle 
*c, gui_save_type type);
 
-       /** drag selection save */
+       /**
+        * drag selection save
+        */
        void (*drag_save_selection)(struct gui_window *g, const char 
*selection);
 
-       /** selection started */
+       /**
+        * selection started
+        */
        void (*start_selection)(struct gui_window *g);
 };
 


-----------------------------------------------------------------------

Summary of changes:
 desktop/browser.c           |    6 +--
 desktop/gui_factory.c       |    5 +--
 frontends/amiga/gui.c       |   83 +++++++++++++++++++++++-----------------
 frontends/atari/gui.c       |   52 ++++++++++++++-----------
 frontends/beos/window.cpp   |   54 +++++++++++++-------------
 frontends/framebuffer/gui.c |   39 ++++++++++++-------
 frontends/gtk/window.c      |   40 +++++++++++--------
 frontends/monkey/browser.c  |   36 ++++++++++-------
 frontends/riscos/print.c    |    4 +-
 frontends/riscos/window.c   |   89 ++++++++++++++++++++-----------------------
 frontends/riscos/window.h   |   14 +++++++
 frontends/windows/window.c  |   63 +++++++++++++-----------------
 include/netsurf/window.h    |   36 ++++++++++-------
 13 files changed, 288 insertions(+), 233 deletions(-)

diff --git a/desktop/browser.c b/desktop/browser.c
index 0a4afc1..45f3006 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -2332,7 +2332,7 @@ void browser_window_update(struct browser_window *bw, 
bool scroll_to_top)
                        }
                }
 
-               guit->window->redraw(bw->window);
+               guit->window->invalidate(bw->window, NULL);
 
                break;
 
@@ -2398,7 +2398,7 @@ void browser_window_update_box(struct browser_window *bw, 
struct rect *rect)
 
        if (bw->window != NULL) {
                /* Front end window */
-               guit->window->update(bw->window, rect);
+               guit->window->invalidate(bw->window, rect);
        } else {
                /* Core managed browser window */
                browser_window_get_position(bw, true, &pos_x, &pos_y);
@@ -2410,7 +2410,7 @@ void browser_window_update_box(struct browser_window *bw, 
struct rect *rect)
                rect->x1 += pos_x / bw->scale;
                rect->y1 += pos_y / bw->scale;
 
-               guit->window->update(top->window, rect);
+               guit->window->invalidate(top->window, rect);
        }
 }
 
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
index 88bb9ba..e1de21e 100644
--- a/desktop/gui_factory.c
+++ b/desktop/gui_factory.c
@@ -161,10 +161,7 @@ static nserror verify_window_register(struct 
gui_window_table *gwt)
        if (gwt->destroy == NULL) {
                return NSERROR_BAD_PARAMETER;
        }
-       if (gwt->redraw == NULL) {
-               return NSERROR_BAD_PARAMETER;
-       }
-       if (gwt->update == NULL) {
+       if (gwt->invalidate == NULL) {
                return NSERROR_BAD_PARAMETER;
        }
        if (gwt->get_scroll == NULL) {
diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c
index 6572274..3e66259 100644
--- a/frontends/amiga/gui.c
+++ b/frontends/amiga/gui.c
@@ -245,7 +245,7 @@ static bool gui_window_get_scroll(struct gui_window *g, int 
*restrict sx, int *r
 static void gui_window_set_scroll(struct gui_window *g, int sx, int sy);
 static void gui_window_remove_caret(struct gui_window *g);
 static void gui_window_place_caret(struct gui_window *g, int x, int y, int 
height, const struct rect *clip);
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*restrict rect);
+//static void amiga_window_invalidate_area(struct gui_window *g, const struct 
rect *restrict rect);
 
 
 /* accessors for default options - user option is updated if it is set as per 
default */
@@ -3667,6 +3667,44 @@ static void ami_do_redraw_limits(struct gui_window *g, 
struct browser_window *bw
        return;
 }
 
+
+/**
+ * Invalidates an area of an amiga browser window
+ *
+ * \param g gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror amiga_window_invalidate_area(struct gui_window *g,
+                                           const struct rect *restrict rect)
+{
+       struct nsObject *nsobj;
+       struct rect *restrict deferred_rect;
+
+       if(!g) return NSERROR_BAD_PARAMETER;
+
+       if (rect == NULL) {
+               if (g != g->shared->gw) {
+                       return NSERROR_OK;
+               }
+       } else {
+               if (ami_gui_window_update_box_deferred_check(g->deferred_rects, 
rect,
+                                                           
g->deferred_rects_pool)) {
+                       deferred_rect = 
ami_memory_itempool_alloc(g->deferred_rects_pool,
+                                                                 sizeof(struct 
rect));
+                       CopyMem(rect, deferred_rect, sizeof(struct rect));
+                       nsobj = AddObject(g->deferred_rects, AMINS_RECT);
+                       nsobj->objstruct = deferred_rect;
+               } else {
+                       LOG("Ignoring duplicate or subset of queued box 
redraw");
+               }
+       }
+       ami_schedule_redraw(g->shared, false);
+
+       return NSERROR_OK;
+}
+
+
 static void ami_refresh_window(struct gui_window_2 *gwin)
 {
        /* simplerefresh only */
@@ -3699,7 +3737,7 @@ static void ami_refresh_window(struct gui_window_2 *gwin)
 
        regrect = gwin->win->RPort->Layer->DamageList->RegionRectangle;
 
-       gui_window_update_box(gwin->gw, &r);
+       amiga_window_invalidate_area(gwin->gw, &r);
 
        while(regrect)
        {
@@ -3714,7 +3752,7 @@ static void ami_refresh_window(struct gui_window_2 *gwin)
 
                regrect = regrect->Next;
 
-               gui_window_update_box(gwin->gw, &r);
+               amiga_window_invalidate_area(gwin->gw, &r);
        }
 
        EndRefresh(gwin->win, TRUE);
@@ -4706,7 +4744,7 @@ static void ami_redraw_callback(void *p)
  *
  * \param  gwin         a struct gui_window_2
  * \param  full_redraw  set to true to schedule a full redraw,
-                        should only be set to false when called from 
gui_window_update_box()
+                        should only be set to false when called from 
amiga_window_invalidate_area()
  */
 void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw)
 {
@@ -4721,14 +4759,6 @@ static void ami_schedule_redraw_remove(struct 
gui_window_2 *gwin)
        ami_schedule(-1, ami_redraw_callback, gwin);
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
-{
-       if(!g) return;
-
-       if(g == g->shared->gw)
-               ami_schedule_redraw(g->shared, true);
-}
-
 static void ami_gui_window_update_box_deferred(struct gui_window *g, bool draw)
 {
        struct nsObject *node;
@@ -4796,23 +4826,6 @@ bool ami_gui_window_update_box_deferred_check(struct 
MinList *deferred_rects,
        return true;
 }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*restrict rect)
-{
-       struct nsObject *nsobj;
-       struct rect *restrict deferred_rect;
-       if(!g) return;
-       
-       if(ami_gui_window_update_box_deferred_check(g->deferred_rects, rect,
-                       g->deferred_rects_pool)) {
-               deferred_rect = 
ami_memory_itempool_alloc(g->deferred_rects_pool, sizeof(struct rect));
-               CopyMem(rect, deferred_rect, sizeof(struct rect));
-               nsobj = AddObject(g->deferred_rects, AMINS_RECT);
-               nsobj->objstruct = deferred_rect;
-       } else {
-               LOG("Ignoring duplicate or subset of queued box redraw");
-       }
-       ami_schedule_redraw(g->shared, false);
-}
 
 /**
  * callback from core to reformat a window.
@@ -4883,26 +4896,26 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
height - (vcurrent - oldv) - 1);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
                else if(vcurrent<oldv) /* Going up */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, oldv - vcurrent + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
 
                if(hcurrent>oldh) /* Going right */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 
width - (hcurrent - oldh), 0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
width + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
                else if(hcurrent<oldh) /* Going left */
                {
                        ami_spacebox_to_ns_coords(gwin, &rect.x0, &rect.y0, 0, 
0);
                        ami_spacebox_to_ns_coords(gwin, &rect.x1, &rect.y1, 
oldh - hcurrent + 1, height + 1);
-                       gui_window_update_box(gwin->gw, &rect);
+                       amiga_window_invalidate_area(gwin->gw, &rect);
                }
        }
        else
@@ -4932,6 +4945,7 @@ static void ami_do_redraw(struct gui_window_2 *gwin)
        ami_gui_free_space_box(bbox);
 }
 
+
 void ami_get_hscroll_pos(struct gui_window_2 *gwin, ULONG *xs)
 {
        if(gwin->objects[GID_HSCROLL])
@@ -5556,8 +5570,7 @@ static char *ami_gui_get_user_dir(STRPTR current_user)
 static struct gui_window_table amiga_window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = amiga_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/atari/gui.c b/frontends/atari/gui.c
index 1287b47..ad568b7 100644
--- a/frontends/atari/gui.c
+++ b/frontends/atari/gui.c
@@ -385,34 +385,41 @@ static void atari_window_reformat(struct gui_window *gw)
     }
 }
 
-static void gui_window_redraw_window(struct gui_window *gw)
-{
-       //CMP_BROWSER b;
-       GRECT rect;
-       if (gw == NULL)
-               return;
-       //b = gw->browser;
-       window_get_grect(gw->root, BROWSER_AREA_CONTENT, &rect);
-       window_schedule_redraw_grect(gw->root, &rect);
-}
 
-static void gui_window_update_box(struct gui_window *gw, const struct rect 
*rect)
+/**
+ * Invalidates an area of an atari browser window
+ *
+ * \param gw gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+atari_window_invalidate_area(struct gui_window *gw,
+                            const struct rect *rect)
 {
     GRECT area;
-    struct gemtk_wm_scroll_info_s *slid;
 
-    if (gw == NULL)
-       return;
-
-    slid = gemtk_wm_get_scroll_info(gw->root->win);
+    if (gw == NULL) {
+       return NSERROR_BAD_PARAMETER;
+    }
 
     window_get_grect(gw->root, BROWSER_AREA_CONTENT, &area);
-    area.g_x += rect->x0 - (slid->x_pos * slid->x_unit_px);
-    area.g_y += rect->y0 - (slid->y_pos * slid->y_unit_px);
-    area.g_w = rect->x1 - rect->x0;
-    area.g_h = rect->y1 - rect->y0;
+
+    if (rect != NULL) {
+           struct gemtk_wm_scroll_info_s *slid;
+
+           slid = gemtk_wm_get_scroll_info(gw->root->win);
+
+           area.g_x += rect->x0 - (slid->x_pos * slid->x_unit_px);
+           area.g_y += rect->y0 - (slid->y_pos * slid->y_unit_px);
+           area.g_w = rect->x1 - rect->x0;
+           area.g_h = rect->y1 - rect->y0;
+    }
+
     //dbg_grect("update box", &area);
     window_schedule_redraw_grect(gw->root, &area);
+
+    return NSERROR_OK;
 }
 
 bool gui_window_get_scroll(struct gui_window *w, int *sx, int *sy)
@@ -680,7 +687,7 @@ static void gui_window_new_content(struct gui_window *w)
     slid->x_pos = 0;
     slid->y_pos = 0;
     gemtk_wm_update_slider(w->root->win, GEMTK_WM_VH_SLIDER);
-    gui_window_redraw_window(w);
+    atari_window_invalidate_area(w, NULL);
 }
 
 
@@ -1051,8 +1058,7 @@ static void gui_init(int argc, char** argv)
 static struct gui_window_table atari_window_table = {
     .create = gui_window_create,
     .destroy = gui_window_destroy,
-    .redraw = gui_window_redraw_window,
-    .update = gui_window_update_box,
+    .invalidate = atari_window_invalidate_area,
     .get_scroll = gui_window_get_scroll,
     .set_scroll = gui_window_set_scroll,
     .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/beos/window.cpp b/frontends/beos/window.cpp
index fbf7b16..4db7b3c 100644
--- a/frontends/beos/window.cpp
+++ b/frontends/beos/window.cpp
@@ -1000,39 +1000,42 @@ void nsbeos_redraw_caret(struct gui_window *g)
        g->view->UnlockLooper();
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
+/**
+ * Invalidate an area of a beos browser window
+ *
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for entrire window area.
+ * \return NSERROR_OK or appropriate error code.
+ */
+static nserror
+beos_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
-       if (g->view == NULL)
-               return;
-       if (!g->view->LockLooper())
-               return;
-
-       nsbeos_current_gc_set(g->view);
-
-       g->view->Invalidate();
-
-       nsbeos_current_gc_set(NULL);
-       g->view->UnlockLooper();
-}
+       if (browser_window_has_content(g->bw) == false) {
+               return NSERROR_OK;
+       }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
-{
-       if (browser_window_has_content(g->bw) == false)
-               return;
+       if (g->view == NULL) {
+               return NSERROR_OK;
+       }
 
-       if (g->view == NULL)
-               return;
-       if (!g->view->LockLooper())
-               return;
+       if (!g->view->LockLooper()) {
+               return NSERROR_OK;
+       }
 
        nsbeos_current_gc_set(g->view);
 
-//XXX +1 ??
-       g->view->Invalidate(BRect(rect->x0, rect->y0,
-                                  rect->x1 - 1, rect->y1 - 1));
+       if (rect != NULL) {
+               //XXX +1 ??
+               g->view->Invalidate(BRect(rect->x0, rect->y0,
+                                         rect->x1 - 1, rect->y1 - 1));
+       } else {
+               g->view->Invalidate();
+       }
 
        nsbeos_current_gc_set(NULL);
        g->view->UnlockLooper();
+
+       return NSERROR_OK;
 }
 
 static bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
@@ -1349,8 +1352,7 @@ static void gui_window_get_dimensions(struct gui_window 
*g, int *width, int *hei
 static struct gui_window_table window_table = {
        gui_window_create,
        gui_window_destroy,
-       gui_window_redraw_window,
-       gui_window_update_box,
+       beos_window_invalidate_area,
        gui_window_get_scroll,
        gui_window_set_scroll,
        gui_window_get_dimensions,
diff --git a/frontends/framebuffer/gui.c b/frontends/framebuffer/gui.c
index 4d4c733..3de228a 100644
--- a/frontends/framebuffer/gui.c
+++ b/frontends/framebuffer/gui.c
@@ -1803,21 +1803,33 @@ gui_window_destroy(struct gui_window *gw)
        free(gw);
 }
 
-static void
-gui_window_redraw_window(struct gui_window *g)
-{
-       fb_queue_redraw(g->browser, 0, 0, fbtk_get_width(g->browser), 
fbtk_get_height(g->browser) );
-}
 
-static void
-gui_window_update_box(struct gui_window *g, const struct rect *rect)
+/**
+ * Invalidates an area of a framebuffer browser window
+ *
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+fb_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
        struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
-       fb_queue_redraw(g->browser,
-                       rect->x0 - bwidget->scrollx,
-                       rect->y0 - bwidget->scrolly,
-                       rect->x1 - bwidget->scrollx,
-                       rect->y1 - bwidget->scrolly);
+
+       if (rect != NULL) {
+               fb_queue_redraw(g->browser,
+                               rect->x0 - bwidget->scrollx,
+                               rect->y0 - bwidget->scrolly,
+                               rect->x1 - bwidget->scrollx,
+                               rect->y1 - bwidget->scrolly);
+       } else {
+               fb_queue_redraw(g->browser,
+                               0,
+                               0,
+                               fbtk_get_width(g->browser),
+                               fbtk_get_height(g->browser));
+       }
+       return NSERROR_OK;
 }
 
 static bool
@@ -2051,8 +2063,7 @@ static void framebuffer_window_reformat(struct gui_window 
*gw)
 static struct gui_window_table framebuffer_window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = fb_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c
index 40e5580..25b975e 100644
--- a/frontends/gtk/window.c
+++ b/frontends/gtk/window.c
@@ -1014,27 +1014,38 @@ static void gui_window_remove_caret(struct gui_window 
*g)
 
 }
 
-static void gui_window_redraw_window(struct gui_window *g)
-{
-       gtk_widget_queue_draw(GTK_WIDGET(g->layout));
-}
-
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
+/**
+ * Invalidates an area of a GTK browser window
+ *
+ * \param g gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+nsgtk_window_invalidate_area(struct gui_window *g, const struct rect *rect)
 {
        int sx, sy;
        float scale;
 
-       if (!browser_window_has_content(g->bw))
-               return;
+       if (rect == NULL) {
+               gtk_widget_queue_draw(GTK_WIDGET(g->layout));
+               return NSERROR_OK;
+       }
+
+       if (!browser_window_has_content(g->bw)) {
+               return NSERROR_OK;
+       }
 
        gui_window_get_scroll(g, &sx, &sy);
        scale = browser_window_get_scale(g->bw);
 
        gtk_widget_queue_draw_area(GTK_WIDGET(g->layout),
-                       rect->x0 * scale - sx,
-                       rect->y0 * scale - sy,
-                       (rect->x1 - rect->x0) * scale,
-                       (rect->y1 - rect->y0) * scale);
+                                  rect->x0 * scale - sx,
+                                  rect->y0 * scale - sy,
+                                  (rect->x1 - rect->x0) * scale,
+                                  (rect->y1 - rect->y0) * scale);
+
+       return NSERROR_OK;
 }
 
 static void gui_window_set_status(struct gui_window *g, const char *text)
@@ -1295,7 +1306,7 @@ gui_window_file_gadget_open(struct gui_window *g,
                        GTK_FILE_CHOOSER(dialog));
                
                browser_window_set_gadget_filename(g->bw, gadget, filename);
-               
+
                g_free(filename);
        }
 
@@ -1305,8 +1316,7 @@ gui_window_file_gadget_open(struct gui_window *g,
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = nsgtk_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/monkey/browser.c b/frontends/monkey/browser.c
index 3bf0dd0..7cd3d07 100644
--- a/frontends/monkey/browser.c
+++ b/frontends/monkey/browser.c
@@ -119,12 +119,6 @@ gui_window_set_title(struct gui_window *g, const char 
*title)
 }
 
 static void
-gui_window_redraw_window(struct gui_window *g)
-{
-  fprintf(stdout, "WINDOW REDRAW WIN %u\n", g->win_num);
-}
-
-static void
 gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
                           bool scaled)
 {
@@ -166,13 +160,28 @@ gui_window_set_scroll(struct gui_window *g, int sx, int 
sy)
   fprintf(stdout, "WINDOW SET_SCROLL WIN %u X %d Y %d\n", g->win_num, sx, sy);
 }
 
-static void
-gui_window_update_box(struct gui_window *g, const struct rect *rect)
+/**
+ * Invalidates an area of a monkey browser window
+ *
+ * \param gw gui_window
+ * \param rect area to redraw or NULL for the entire window area
+ * \return NSERROR_OK on success or appropriate error code
+ */
+static nserror
+monkey_window_invalidate_area(struct gui_window *gw, const struct rect *rect)
 {
-  fprintf(stdout, "WINDOW UPDATE_BOX WIN %u X %d Y %d WIDTH %d HEIGHT %d\n",
-          g->win_num, rect->x0, rect->y0,
-          (rect->x1 - rect->x0), (rect->y1 - rect->y0));
-  
+       fprintf(stdout, "WINDOW INVALIDATE_AREA WIN %u", gw->win_num);
+
+       if (rect != NULL) {
+               fprintf(stdout,
+                       " X %d Y %d WIDTH %d HEIGHT %d\n",
+                       rect->x0, rect->y0,
+                       (rect->x1 - rect->x0), (rect->y1 - rect->y0));
+       } else {
+               fprintf(stdout," ALL\n");
+       }
+
+       return NSERROR_OK;
 }
 
 static void
@@ -501,8 +510,7 @@ monkey_window_handle_command(int argc, char **argv)
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = monkey_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/riscos/print.c b/frontends/riscos/print.c
index 1ccfc7f..b7ddd4e 100644
--- a/frontends/riscos/print.c
+++ b/frontends/riscos/print.c
@@ -41,6 +41,7 @@
 #include "content/content.h"
 
 #include "riscos/gui.h"
+#include "riscos/window.h"
 #include "riscos/dialog.h"
 #include "riscos/menus.h"
 #include "riscos/print.h"
@@ -95,7 +96,6 @@ static unsigned int print_fonts_count;
 /** Error in print_fonts_plot_text() or print_fonts_callback(). */
 static const char *print_fonts_error;
 
-void gui_window_redraw_window(struct gui_window *g);
 
 static bool ro_gui_print_click(wimp_pointer *pointer);
 static bool ro_gui_print_apply(wimp_w w);
@@ -729,7 +729,7 @@ bool print_document(struct gui_window *g, const char 
*filename)
        if (content_get_type(h) == CONTENT_HTML)
                content_reformat(h, false, saved_width, saved_height);
 
-       gui_window_redraw_window(g);
+       ro_gui_window_invalidate_area(g, NULL);
 
        return true;
 
diff --git a/frontends/riscos/window.c b/frontends/riscos/window.c
index b1ea58a..6b5089c 100644
--- a/frontends/riscos/window.c
+++ b/frontends/riscos/window.c
@@ -90,8 +90,6 @@
 #include "riscos/ucstables.h"
 #include "riscos/filetype.h"
 
-void gui_window_redraw_window(struct gui_window *g);
-
 static void gui_window_set_extent(struct gui_window *g, int width, int height);
 
 static void ro_gui_window_redraw(wimp_draw *redraw);
@@ -696,46 +694,39 @@ static void gui_window_set_title(struct gui_window *g, 
const char *title)
        ro_gui_set_window_title(g->window, g->title);
 }
 
-
-/**
- * Force a redraw of the entire contents of a browser window.
- *
- * \param  g   gui_window to redraw
- */
-void gui_window_redraw_window(struct gui_window *g)
+/* exported interface documented in riscos/window.h */
+nserror ro_gui_window_invalidate_area(struct gui_window *g,
+                                  const struct rect *rect)
 {
+       bool use_buffer;
+       int x0, y0, x1, y1;
+       struct update_box *cur;
        wimp_window_info info;
        os_error *error;
 
        assert(g);
-       info.w = g->window;
-       error = xwimp_get_window_info_header_only(&info);
-       if (error) {
-               LOG("xwimp_get_window_info_header_only: 0x%x: %s", 
error->errnum, error->errmess);
-               ro_warn_user("WimpError", error->errmess);
-               return;
-       }
-       error = xwimp_force_redraw(g->window, info.extent.x0, info.extent.y0,
-                       info.extent.x1, info.extent.y1);
-       if (error) {
-               LOG("xwimp_force_redraw: 0x%x: %s", error->errnum, 
error->errmess);
-               ro_warn_user("WimpError", error->errmess);
-       }
-}
-
 
-/**
- * Redraw an area of a window.
- *
- * \param  g The window to update
- * \param  rect  The area of the window to update.
- */
+       if (rect == NULL) {
+               info.w = g->window;
+               error = xwimp_get_window_info_header_only(&info);
+               if (error) {
+                       LOG("xwimp_get_window_info_header_only: 0x%x: %s",
+                           error->errnum, error->errmess);
+                       ro_warn_user("WimpError", error->errmess);
+                       return NSERROR_INVALID;
+               }
 
-static void gui_window_update_box(struct gui_window *g, const struct rect 
*rect)
-{
-       bool use_buffer;
-       int x0, y0, x1, y1;
-       struct update_box *cur;
+               error = xwimp_force_redraw(g->window,
+                                          info.extent.x0, info.extent.y0,
+                                          info.extent.x1, info.extent.y1);
+               if (error) {
+                       LOG("xwimp_force_redraw: 0x%x: %s",
+                           error->errnum, error->errmess);
+                       ro_warn_user("WimpError", error->errmess);
+                       return NSERROR_INVALID;
+               }
+               return NSERROR_OK;
+       }
 
        x0 = floorf(rect->x0 * 2 * g->scale);
        y0 = -ceilf(rect->y1 * 2 * g->scale);
@@ -747,25 +738,27 @@ static void gui_window_update_box(struct gui_window *g, 
const struct rect *rect)
        /* try to optimise buffered redraws */
        if (use_buffer) {
                for (cur = pending_updates; cur != NULL; cur = cur->next) {
-                       if ((cur->g != g) || (!cur->use_buffer))
+                       if ((cur->g != g) || (!cur->use_buffer)) {
                                continue;
-                       if ((((cur->x0 - x1) < MARGIN) || ((cur->x1 - x0) < 
MARGIN)) &&
-                                       (((cur->y0 - y1) < MARGIN) || ((cur->y1 
- y0) < MARGIN))) {
+                       }
+                       if ((((cur->x0 - x1) < MARGIN) ||
+                            ((cur->x1 - x0) < MARGIN)) &&
+                           (((cur->y0 - y1) < MARGIN) ||
+                            ((cur->y1 - y0) < MARGIN))) {
                                cur->x0 = min(cur->x0, x0);
                                cur->y0 = min(cur->y0, y0);
                                cur->x1 = max(cur->x1, x1);
                                cur->y1 = max(cur->y1, y1);
-                               return;
+                               return NSERROR_OK;
                        }
-
                }
        }
        cur = malloc(sizeof(struct update_box));
        if (!cur) {
                LOG("No memory for malloc.");
-               ro_warn_user("NoMemory", 0);
-               return;
+               return NSERROR_NOMEM;
        }
+
        cur->x0 = x0;
        cur->y0 = y0;
        cur->x1 = x1;
@@ -774,6 +767,8 @@ static void gui_window_update_box(struct gui_window *g, 
const struct rect *rect)
        pending_updates = cur;
        cur->g = g;
        cur->use_buffer = use_buffer;
+
+       return NSERROR_OK;
 }
 
 
@@ -1983,7 +1978,7 @@ bool ro_gui_window_handle_local_keypress(struct 
gui_window *g, wimp_key *key,
                /* Toggle display of box outlines. */
                browser_window_debug(g->bw, CONTENT_DEBUG_REDRAW);
 
-               gui_window_redraw_window(g);
+               ro_gui_window_invalidate_area(g, NULL);
                return true;
 
        case wimp_KEY_RETURN:
@@ -4104,8 +4099,9 @@ void ro_gui_window_action_page_info(struct gui_window *g)
 void ro_gui_window_redraw_all(void)
 {
        struct gui_window *g;
-       for (g = window_list; g; g = g->next)
-               gui_window_redraw_window(g);
+       for (g = window_list; g; g = g->next) {
+               ro_gui_window_invalidate_area(g, NULL);
+       }
 }
 
 
@@ -4985,8 +4981,7 @@ bool ro_gui_alt_pressed(void)
 static struct gui_window_table window_table = {
        .create = gui_window_create,
        .destroy = gui_window_destroy,
-       .redraw = gui_window_redraw_window,
-       .update = gui_window_update_box,
+       .invalidate = ro_gui_window_invalidate_area,
        .get_scroll = gui_window_get_scroll,
        .set_scroll = gui_window_set_scroll,
        .get_dimensions = gui_window_get_dimensions,
diff --git a/frontends/riscos/window.h b/frontends/riscos/window.h
index 2e6f6e9..30b0965 100644
--- a/frontends/riscos/window.h
+++ b/frontends/riscos/window.h
@@ -42,5 +42,19 @@ bool ro_gui_window_check_menu(wimp_menu *menu);
  */
 nserror ro_gui_window_set_url(struct gui_window *g, struct nsurl *url);
 
+/**
+ * Cause an area of a window to be invalidated
+ *
+ * The specified area of the window should now be considered out of
+ *  date. If the entire window is invalidated this simply calls
+ *  wimp_force_redraw() otherwise the area is added to a queue of
+ *  pending updates which will be processed from a wimp poll allowing
+ *  multiple invalidation requests to be agregated.
+ *
+ * \param g The window to update
+ * \param rect The area of the window to update or NULL to redraw entire 
contents.
+ */
+nserror ro_gui_window_invalidate_area(struct gui_window *g, const struct rect 
*rect);
+
 #endif
 
diff --git a/frontends/windows/window.c b/frontends/windows/window.c
index c902202..c0af46f 100644
--- a/frontends/windows/window.c
+++ b/frontends/windows/window.c
@@ -883,17 +883,35 @@ static void nsws_window_update_forward_back(struct 
gui_window *w)
 
 
 /**
- * redraw the whole window
+ * Invalidate an area of a win32 browser window
  *
- * \param gw win32 frontends graphical window.
+ * \param gw The netsurf window being invalidated.
+ * \param rect area to redraw or NULL for entrire window area.
+ * \return NSERROR_OK or appropriate error code.
  */
-static void win32_window_redraw_window(struct gui_window *gw)
+static nserror
+win32_window_invalidate_area(struct gui_window *gw, const struct rect *rect)
 {
-       /* LOG("gw:%p", gw); */
-       if (gw != NULL) {
-               RedrawWindow(gw->drawingarea, NULL, NULL,
-                            RDW_INVALIDATE | RDW_NOERASE);
+       RECT *redrawrectp = NULL;
+       RECT redrawrect;
+
+       assert(gw != NULL);
+
+       if (rect != NULL) {
+               redrawrectp = &redrawrect;
+
+               redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->scale);
+               redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->scale);
+               redrawrect.right =(long)rect->x1;
+               redrawrect.bottom = (long)rect->y1;
+
        }
+       RedrawWindow(gw->drawingarea,
+                    redrawrectp,
+                    NULL,
+                    RDW_INVALIDATE | RDW_NOERASE);
+
+       return NSERROR_OK;
 }
 
 
@@ -922,7 +940,7 @@ static void nsws_set_scale(struct gui_window *gw, float 
scale)
                browser_window_set_scale(gw->bw, scale, true);
        }
 
-       win32_window_redraw_window(gw);
+       win32_window_invalidate_area(gw, NULL);
        win32_window_set_scroll(gw, x, y);
 }
 
@@ -1523,32 +1541,6 @@ static void win32_window_destroy(struct gui_window *w)
 
 
 /**
- * Cause redraw of part of a win32 window.
- *
- * \param gw win32 gui window
- * \param rect area to redraw
- */
-static void
-win32_window_update(struct gui_window *gw, const struct rect *rect)
-{
-       if (gw == NULL)
-               return;
-
-       RECT redrawrect;
-
-       redrawrect.left = (long)rect->x0 - (gw->scrollx / gw->scale);
-       redrawrect.top = (long)rect->y0 - (gw->scrolly / gw->scale);
-       redrawrect.right =(long)rect->x1;
-       redrawrect.bottom = (long)rect->y1;
-
-       RedrawWindow(gw->drawingarea,
-                    &redrawrect,
-                    NULL,
-                    RDW_INVALIDATE | RDW_NOERASE);
-}
-
-
-/**
  * Find the current dimensions of a win32 browser window's content area.
  *
  * \param gw gui_window to measure
@@ -1776,8 +1768,7 @@ static void win32_window_stop_throbber(struct gui_window 
*w)
 static struct gui_window_table window_table = {
        .create = win32_window_create,
        .destroy = win32_window_destroy,
-       .redraw = win32_window_redraw_window,
-       .update = win32_window_update,
+       .invalidate = win32_window_invalidate_area,
        .get_scroll = win32_window_get_scroll,
        .set_scroll = win32_window_set_scroll,
        .get_dimensions = win32_window_get_dimensions,
diff --git a/include/netsurf/window.h b/include/netsurf/window.h
index b887368..434a795 100644
--- a/include/netsurf/window.h
+++ b/include/netsurf/window.h
@@ -98,21 +98,23 @@ struct gui_window_table {
        void (*destroy)(struct gui_window *gw);
 
        /**
-        * Force a redraw of the entire contents of a window.
+        * Invalidate an area of a window.
         *
-        * @todo this API should be merged with update.
+        * The specified area of the window should now be considered
+        *  out of date. If the area is NULL the entire window must be
+        *  invalidated. It is expected that the windowing system will
+        *  then subsequently cause redraw/expose operations as
+        *  necessary.
         *
-        * \param g gui_window to redraw
-        */
-       void (*redraw)(struct gui_window *g);
-
-       /**
-        * Redraw an area of a window.
+        * \note the frontend should not attempt to actually start the
+        *  redraw operations as a result of this callback because the
+        *  core redraw functions may already be threaded.
         *
         * \param g gui_window
-        * \param rect area to redraw
+        * \param rect area to redraw or NULL for the entire window area
+        * \return NSERROR_OK on success or appropriate error code
         */
-       void (*update)(struct gui_window *g, const struct rect *rect);
+       nserror (*invalidate)(struct gui_window *g, const struct rect *rect);
 
        /**
         * Get the scroll position of a browser window.
@@ -289,7 +291,7 @@ struct gui_window_table {
        /**
         * Called when the gui_window has new content.
         *
-        * \param  g  the gui_window that has new content
+        * \param g the gui_window that has new content
         */
        void (*new_content)(struct gui_window *g);
 
@@ -303,13 +305,19 @@ struct gui_window_table {
         */
        void (*file_gadget_open)(struct gui_window *g, struct hlcache_handle 
*hl, struct form_control *gadget);
 
-       /** object dragged to window*/
+       /**
+        * object dragged to window
+        */
        void (*drag_save_object)(struct gui_window *g, struct hlcache_handle 
*c, gui_save_type type);
 
-       /** drag selection save */
+       /**
+        * drag selection save
+        */
        void (*drag_save_selection)(struct gui_window *g, const char 
*selection);
 
-       /** selection started */
+       /**
+        * selection started
+        */
        void (*start_selection)(struct gui_window *g);
 };
 


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to