server: Store a separate flag for windows that need to be erased in WM_PAINT.
This avoids the need to invalidate the window after WM_ERASEBKGND.
diff --git a/server/window.c b/server/window.c
index 8971dc6..14d6468 100644
--- a/server/window.c
+++ b/server/window.c
@@ -88,9 +88,10 @@
char extra_bytes[1]; /* extra bytes storage */
};
-#define PAINT_INTERNAL 0x01 /* internal WM_PAINT pending */
-#define PAINT_ERASE 0x02 /* needs WM_ERASEBKGND */
-#define PAINT_NONCLIENT 0x04 /* needs WM_NCPAINT */
+#define PAINT_INTERNAL 0x01 /* internal WM_PAINT pending */
+#define PAINT_ERASE 0x02 /* needs WM_ERASEBKGND */
+#define PAINT_NONCLIENT 0x04 /* needs WM_NCPAINT */
+#define PAINT_DELAYED_ERASE 0x08 /* still needs erase after WM_ERASEBKGND */
/* growable array of user handles */
struct user_handle_array
@@ -978,7 +979,7 @@
inc_window_paint_count( win, -1 );
free_region( win->update_region );
}
- win->paint_flags &= ~(PAINT_ERASE | PAINT_NONCLIENT);
+ win->paint_flags &= ~(PAINT_ERASE | PAINT_DELAYED_ERASE | PAINT_NONCLIENT);
win->update_region = NULL;
if (region) free_region( region );
}
@@ -1122,7 +1123,7 @@
set_update_region( win, tmp );
}
if (flags & RDW_NOFRAME) validate_non_client( win );
- if (flags & RDW_NOERASE) win->paint_flags &= ~PAINT_ERASE;
+ if (flags & RDW_NOERASE) win->paint_flags &= ~(PAINT_ERASE | PAINT_DELAYED_ERASE);
}
}
@@ -1178,11 +1179,19 @@
}
if (flags & UPDATE_PAINT)
{
- if (win->update_region) ret |= UPDATE_PAINT;
+ if (win->update_region)
+ {
+ if (win->paint_flags & PAINT_DELAYED_ERASE) ret |= UPDATE_DELAYED_ERASE;
+ ret |= UPDATE_PAINT;
+ }
}
if (flags & UPDATE_INTERNALPAINT)
{
- if (win->paint_flags & PAINT_INTERNAL) ret |= UPDATE_INTERNALPAINT;
+ if (win->paint_flags & PAINT_INTERNAL)
+ {
+ ret |= UPDATE_INTERNALPAINT;
+ if (win->paint_flags & PAINT_DELAYED_ERASE) ret |= UPDATE_DELAYED_ERASE;
+ }
}
return ret;
}
@@ -1943,6 +1952,12 @@
}
}
+ if (flags & UPDATE_DELAYED_ERASE) /* this means that the previous call didn't erase */
+ {
+ if (from_child) from_child->paint_flags |= PAINT_DELAYED_ERASE;
+ else win->paint_flags |= PAINT_DELAYED_ERASE;
+ }
+
reply->flags = get_window_update_flags( win, from_child, flags, &win );
reply->child = win->handle;
@@ -1975,7 +1990,7 @@
if (reply->flags & UPDATE_NONCLIENT) validate_non_client( win );
if (reply->flags & UPDATE_ERASE)
{
- win->paint_flags &= ~PAINT_ERASE;
+ win->paint_flags &= ~(PAINT_ERASE | PAINT_DELAYED_ERASE);
/* desktop window only gets erased, not repainted */
if (is_desktop_window(win)) validate_whole_window( win );
}