]> git.eshelyaron.com Git - emacs.git/commitdiff
(win32_wnd_proc): Handle WM_ERASEBKGND and
authorKarl Heuer <kwzh@gnu.org>
Fri, 12 Jul 1996 00:25:27 +0000 (00:25 +0000)
committerKarl Heuer <kwzh@gnu.org>
Fri, 12 Jul 1996 00:25:27 +0000 (00:25 +0000)
WM_PALETTECHANGED messages inline (as they should be).

src/w32fns.c

index 29ce4c70cd57f6da6b7c1e9934e9282e0cd61327..741b6c4da67773ebbb43e27ab7a50e802c8d3738 100644 (file)
@@ -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: