summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2009-07-02 21:23:54 +0000
committerVincent Sanders <vince@netsurf-browser.org>2009-07-02 21:23:54 +0000
commitc04b939c8cdc75a0d5faf5bae0805d96d6e74bde (patch)
tree5eb6bf564cdb426d9447e31fafc7c968f0151e84
parent1165edf662baa3286ff76df54f2db6819340d0a3 (diff)
downloadnetsurf-c04b939c8cdc75a0d5faf5bae0805d96d6e74bde.tar.gz
netsurf-c04b939c8cdc75a0d5faf5bae0805d96d6e74bde.tar.bz2
Fix by tlsa for content which is updated by the core like animated gifs and forms
svn path=/trunk/netsurf/; revision=8270
-rw-r--r--framebuffer/fbtk.c11
-rw-r--r--framebuffer/fbtk.h2
-rw-r--r--framebuffer/gui.c26
3 files changed, 32 insertions, 7 deletions
diff --git a/framebuffer/fbtk.c b/framebuffer/fbtk.c
index 3320dbee4..59c6e75f7 100644
--- a/framebuffer/fbtk.c
+++ b/framebuffer/fbtk.c
@@ -187,6 +187,17 @@ bool fbtk_clip_rect(const bbox_t * restrict clip, bbox_t * restrict box)
return true;
}
+/* clip a rectangle to a widgets area rectangle */
+bool fbtk_clip_to_widget(fbtk_widget_t *widget, bbox_t * restrict box)
+{
+ bbox_t wbox;
+ wbox.x0 = 0;
+ wbox.y0 = 0;
+ wbox.x1 = widget->width;
+ wbox.y1 = widget->height;
+ return fbtk_clip_rect(&wbox, box);
+}
+
/* creates a new widget of a given type */
static fbtk_widget_t *
diff --git a/framebuffer/fbtk.h b/framebuffer/fbtk.h
index 95bd8b9a3..530a82d34 100644
--- a/framebuffer/fbtk.h
+++ b/framebuffer/fbtk.h
@@ -207,6 +207,8 @@ bool fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout);
/* keycode to ucs4 */
int fbtk_keycode_to_ucs4(int code, uint8_t mods);
+/* clip a box to a widgets area */
+bool fbtk_clip_to_widget(fbtk_widget_t *widget, bbox_t * restrict box);
diff --git a/framebuffer/gui.c b/framebuffer/gui.c
index 9746a5c2a..e3b93c40c 100644
--- a/framebuffer/gui.c
+++ b/framebuffer/gui.c
@@ -105,9 +105,14 @@ fb_queue_redraw(struct fbtk_widget_s *widget, int x0, int y0, int x1, int y1)
bwidget->redraw_box.x1 = MAX(bwidget->redraw_box.x1, x1);
bwidget->redraw_box.y1 = MAX(bwidget->redraw_box.y1, y1);
- bwidget->redraw_required = true;
-
- fbtk_request_redraw(widget);
+ if (fbtk_clip_to_widget(widget, &bwidget->redraw_box)) {
+ bwidget->redraw_required = true;
+ fbtk_request_redraw(widget);
+ } else {
+ bwidget->redraw_box.y0 = bwidget->redraw_box.x0 = INT_MAX;
+ bwidget->redraw_box.y1 = bwidget->redraw_box.x1 = -(INT_MAX);
+ bwidget->redraw_required = false;
+ }
}
static void fb_pan(fbtk_widget_t *widget,
@@ -268,6 +273,8 @@ static void fb_redraw(fbtk_widget_t *widget,
if ((!c) || (c->locked))
return;
+ LOG(("redraw box %d,%d to %d,%d",bwidget->redraw_box.x0,bwidget->redraw_box.y0, bwidget->redraw_box.x1, bwidget->redraw_box.y1));
+
height = fbtk_get_height(widget);
width = fbtk_get_width(widget);
x = fbtk_get_x(widget);
@@ -279,6 +286,8 @@ static void fb_redraw(fbtk_widget_t *widget,
bwidget->redraw_box.x0 += x;
bwidget->redraw_box.x1 += x;
+
+
nsfb_claim(fbtk_get_nsfb(widget), &bwidget->redraw_box);
/* redraw bounding box is relative to window */
@@ -971,11 +980,14 @@ void gui_window_redraw_window(struct gui_window *g)
void gui_window_update_box(struct gui_window *g,
const union content_msg_data *data)
{
+ struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
fb_queue_redraw(g->browser,
- data->redraw.x,
- data->redraw.y,
- data->redraw.x + data->redraw.width,
- data->redraw.y + data->redraw.height);
+ data->redraw.x - bwidget->scrollx,
+ data->redraw.y - bwidget->scrolly,
+ data->redraw.x - bwidget->scrollx +
+ data->redraw.width,
+ data->redraw.y - bwidget->scrolly +
+ data->redraw.height);
}
bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)