summaryrefslogtreecommitdiff
path: root/src/w32fns.c
diff options
context:
space:
mode:
authorKarl Heuer <kwzh@gnu.org>1996-07-12 00:25:27 +0000
committerKarl Heuer <kwzh@gnu.org>1996-07-12 00:25:27 +0000
commita60856373a7a651fa860462891c3282fec80ad76 (patch)
tree9883ce30ad42f590b40559322d00ef700bb70f5b /src/w32fns.c
parent210df3bf250c25836a55d8835bafd6d94ef1c553 (diff)
downloademacs-a60856373a7a651fa860462891c3282fec80ad76.tar.gz
(win32_wnd_proc): Handle WM_ERASEBKGND and
WM_PALETTECHANGED messages inline (as they should be).
Diffstat (limited to 'src/w32fns.c')
-rw-r--r--src/w32fns.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/w32fns.c b/src/w32fns.c
index 29ce4c70cd5..741b6c4da67 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -2932,25 +2932,41 @@ win32_wnd_proc (hwnd, msg, wParam, lParam)
Win32Msg wmsg;
int windows_translate;
+ /* Note that it is okay to call x_window_to_frame, even though we are
+ not running in the main lisp thread, because frame deletion
+ requires the lisp thread to synchronize with this thread. Thus, if
+ a frame struct is returned, it can be used without concern that the
+ lisp thread might make it disappear while we are using it.
+
+ NB. Walking the frame list in this thread is safe (as long as
+ writes of Lisp_Object slots are atomic, which they are on Windows).
+ Although delete-frame can destructively modify the frame list while
+ we are walking it, a garbage collection cannot occur until after
+ delete-frame has synchronized with this thread.
+
+ It is also safe to use functions that make GDI calls, such as
+ win32_clear_rect, because these functions must obtain a DC handle
+ from the frame struct using get_frame_dc which is thread-aware. */
+
switch (msg)
{
case WM_ERASEBKGND:
- /* This is (always?) generated by BeginPaint, so there is no gain
- in forwarding this message to the main thread - it can simply
- erase the background before repainting. */
-#if 0
- enter_crit ();
- GetUpdateRect (hwnd, &wmsg.rect, FALSE);
- leave_crit ();
- my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
-#endif
+ f = x_window_to_frame (dpyinfo, hwnd);
+ if (f)
+ {
+ GetUpdateRect (hwnd, &wmsg.rect, FALSE);
+ win32_clear_rect (f, NULL, &wmsg.rect);
+ }
return 1;
case WM_PALETTECHANGED:
/* ignore our own changes */
if ((HWND)wParam != hwnd)
{
- /* simply notify main thread it may need to update frames */
- my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+ f = x_window_to_frame (dpyinfo, hwnd);
+ if (f)
+ /* get_frame_dc will realize our palette and force all
+ frames to be redrawn if needed. */
+ release_frame_dc (f, get_frame_dc (f));
}
return 0;
case WM_PAINT: