all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Stipples support in MS-Windows port
@ 2024-05-03  2:53 Elijah G
  2024-05-03  6:09 ` Eli Zaretskii
  2024-05-03  7:30 ` Po Lu
  0 siblings, 2 replies; 36+ messages in thread
From: Elijah G @ 2024-05-03  2:53 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1064 bytes --]

Hi, i'm starting this thread to discuss the
support for stipples in windows port.
My ideas in how this can be done is using
the w32term.c functions for drawing rects,
i tested using w32_fill_rect but it doesn't
work, i don't know how it works.

The elisp snippet that i'm using for test this is this:
```
(let* ((w (window-font-width))
       (stipple `(,w 1 ,(apply #'unibyte-string
                   (append (make-list (1- (/ (+ w 7) 8)) ?\0)
                       '(1))))))
  (insert "\n" (propertize "      " 'face `(:background "red"
:foreground "blue" :stipple ,stipple))))
```
The closest thing i got was using w32_draw_rectangle
inside w32_draw_glyph_string_background
but for some reason it freezes and crashes after evaling
the snippet, I'm not sure if it is related to the way I did it or is
anything related to GC.

Below this mail can you get the patch for test it
(Also i'm sorry if the patch is too long i accidentally
formatted it with clang-format)

Also can i ask what is the purpose of this line?
```
# include "bitmaps/gray.xbm"
```

Thanks.

[-- Attachment #2: 0001-Test-stipples-in-W32.patch --]
[-- Type: application/octet-stream, Size: 223633 bytes --]

From 1e1eb90dbca40ae570c121e41874fc8ce4c34c5d Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Thu, 2 May 2024 20:38:48 -0600
Subject: [PATCH] Test stipples in W32

---
 src/w32term.c | 3091 +++++++++++++++++++++++++------------------------
 1 file changed, 1606 insertions(+), 1485 deletions(-)

diff --git a/src/w32term.c b/src/w32term.c
index 7afd1303b4d..d4d158d957a 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -15,42 +15,39 @@ Copyright (C) 1989, 1993-2024 Free Software Foundation, Inc.
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
+along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>. */
 
 #include <config.h>
+#include "w32term.h"
 #include <signal.h>
 #include <stdio.h>
 #include "lisp.h"
 #include "blockinput.h"
-#include "w32term.h"
-#include "w32common.h"	/* for OS version info */
+#include "w32common.h" /* for OS version info */
 
 #include <ctype.h>
 #include <errno.h>
 #include <sys/stat.h>
 #ifdef CYGWIN
-#include <fcntl.h>	/* for O_RDWR */
+# include <fcntl.h> /* for O_RDWR */
 #endif
 #include <imm.h>
 #include <math.h>
 
+#include "buffer.h"
 #include "coding.h"
-#include "frame.h"
 #include "fontset.h"
+#include "frame.h"
+#include "keyboard.h"
+#include "menu.h" /* for w32_menu_show */
+#include "termchar.h"
 #include "termhooks.h"
 #include "termopts.h"
-#include "termchar.h"
-#include "buffer.h"
 #include "window.h"
-#include "keyboard.h"
-#include "menu.h"	/* for w32_menu_show */
 
 #ifdef WINDOWSNT
-#include "w32.h"	/* for filename_from_utf16, filename_from_ansi */
-#endif
-
-#ifndef WINDOWSNT
-#include <io.h> /* for get_osfhandle */
+# include <io.h>  /* for get_osfhandle */
+# include "w32.h" /* for filename_from_utf16, filename_from_ansi */
 #endif
 
 #include <shellapi.h>
@@ -58,10 +55,10 @@ Copyright (C) 1989, 1993-2024 Free Software Foundation, Inc.
 #include "font.h"
 #include "w32font.h"
 
-#if 0	/* TODO: stipple */
-#include "bitmaps/gray.xbm"
+#if 1 /* TODO: stipple */
+# include "bitmaps/gray.xbm"
 #endif
-\f
+
 /* Fringe bitmaps.  */
 
 static int max_fringe_bmp = 0;
@@ -74,7 +71,7 @@ Copyright (C) 1989, 1993-2024 Free Software Foundation, Inc.
 
 /* Define GET_WHEEL_DELTA_WPARAM macro if system headers don't.  */
 #ifndef GET_WHEEL_DELTA_WPARAM
-#define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam))
+# define GET_WHEEL_DELTA_WPARAM(wparam) ((short) HIWORD (wparam))
 #endif
 
 /* Non-zero means that a HELP_EVENT has been generated since Emacs
@@ -87,7 +84,6 @@ #define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam))
 extern int w32_codepage_for_font (char *fontname);
 extern HCURSOR w32_load_cursor (LPCTSTR name);
 
-\f
 /* This is display since w32 does not support multiple ones.  */
 struct w32_display_info one_w32_display_info;
 struct w32_display_info *x_display_list;
@@ -115,28 +111,29 @@ #define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam))
 #endif /* compiling for pre-Win2k */
 
 /* Dynamic linking to SetLayeredWindowAttribute (only since 2000).  */
-BOOL (WINAPI *pfnSetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
+BOOL (WINAPI *pfnSetLayeredWindowAttributes)
+(HWND, COLORREF, BYTE, DWORD);
 
 /* PlgBlt is available since Windows 2000.  */
-BOOL (WINAPI *pfnPlgBlt) (HDC, const POINT *, HDC, int, int, int, int, HBITMAP, int, int);
-
+BOOL (WINAPI *pfnPlgBlt)
+(HDC, const POINT *, HDC, int, int, int, int, HBITMAP, int, int);
 
 #ifndef LWA_ALPHA
-#define LWA_ALPHA 0x02
+# define LWA_ALPHA 0x02
 #endif
-/* WS_EX_LAYERED is defined unconditionally by MingW, but only for W2K and
-   later targets by MSVC headers.  */
+/* WS_EX_LAYERED is defined unconditionally by MingW, but only for W2K
+   and later targets by MSVC headers.  */
 #ifndef WS_EX_LAYERED
-#define WS_EX_LAYERED 0x80000
+# define WS_EX_LAYERED 0x80000
 #endif
 
 /* SM_CXVIRTUALSCREEN and SM_CYVIRTUALSCREEN are not defined on 95 and
    NT4.  */
 #ifndef SM_CXVIRTUALSCREEN
-#define SM_CXVIRTUALSCREEN 78
+# define SM_CXVIRTUALSCREEN 78
 #endif
 #ifndef SM_CYVIRTUALSCREEN
-#define SM_CYVIRTUALSCREEN 79
+# define SM_CYVIRTUALSCREEN 79
 #endif
 
 /* The handle of the frame that currently owns the system caret.  */
@@ -175,7 +172,7 @@ #define SM_CYVIRTUALSCREEN 79
 static Lisp_Object w32_handle_tab_bar_click (struct frame *,
 					     struct input_event *);
 static void w32_handle_tool_bar_click (struct frame *,
-                                       struct input_event *);
+				       struct input_event *);
 static void w32_define_cursor (Window, Emacs_Cursor);
 
 static void w32_scroll_bar_clear (struct frame *);
@@ -188,16 +185,17 @@ #define SM_CYVIRTUALSCREEN 79
 static void w32_frame_highlight (struct frame *);
 static void w32_frame_unhighlight (struct frame *);
 static void w32_new_focus_frame (struct w32_display_info *,
-                                 struct frame *);
+				 struct frame *);
 static void w32_focus_changed (int, int, struct w32_display_info *,
-                             struct frame *, struct input_event *);
+			       struct frame *, struct input_event *);
 static void w32_detect_focus_change (struct w32_display_info *,
-                                     W32Msg *, struct input_event *);
+				     W32Msg *, struct input_event *);
 static void w32_frame_rehighlight (struct frame *);
 static void w32_frame_rehighlight_1 (struct w32_display_info *);
-static void w32_draw_hollow_cursor (struct window *, struct glyph_row *);
-static void w32_draw_bar_cursor (struct window *, struct glyph_row *, int,
-                               enum text_cursor_kinds);
+static void w32_draw_hollow_cursor (struct window *,
+				    struct glyph_row *);
+static void w32_draw_bar_cursor (struct window *, struct glyph_row *,
+				 int, enum text_cursor_kinds);
 static void w32_clip_to_row (struct window *, struct glyph_row *,
 			     enum glyph_row_area, HDC);
 static BOOL my_show_window (struct frame *, HWND, int);
@@ -213,7 +211,6 @@ #define SM_CYVIRTUALSCREEN 79
 static void w32_check_font (struct frame *, struct font *);
 #endif
 
-\f
 /***********************************************************************
 			      Debugging
  ***********************************************************************/
@@ -244,7 +241,6 @@ record_event (char *locus, int type)
 }
 
 #endif /* 0 */
-\f
 
 static void
 XChangeGC (void *ignore, Emacs_GC *gc, unsigned long mask,
@@ -257,7 +253,8 @@ XChangeGC (void *ignore, Emacs_GC *gc, unsigned long mask,
 }
 
 Emacs_GC *
-XCreateGC (void *ignore, HWND wignore, unsigned long mask, Emacs_GC *egc)
+XCreateGC (void *ignore, HWND wignore, unsigned long mask,
+	   Emacs_GC *egc)
 {
   Emacs_GC *gc = xzalloc (sizeof (*gc));
 
@@ -266,7 +263,7 @@ XCreateGC (void *ignore, HWND wignore, unsigned long mask, Emacs_GC *egc)
   return gc;
 }
 
-#if 0	/* unused for now, see w32_draw_image_glyph_string below */
+#if 0 /* unused for now, see w32_draw_image_glyph_string below */
 static void
 XGetGCValues (void *ignore, XGCValues *gc,
 	      unsigned long mask, XGCValues *xgcv)
@@ -296,8 +293,8 @@ w32_show_back_buffer (struct frame *f)
 	emacs_abort ();
 
       BitBlt (raw_dc, 0, 0, FRAME_PIXEL_WIDTH (f),
-	      FRAME_PIXEL_HEIGHT (f),
-	      output->paint_dc, 0, 0, SRCCOPY);
+	      FRAME_PIXEL_HEIGHT (f), output->paint_dc, 0, 0,
+	      SRCCOPY);
       ReleaseDC (output->window_desc, raw_dc);
 
       output->paint_buffer_dirty = 0;
@@ -315,7 +312,8 @@ w32_release_paint_buffer (struct frame *f)
   enter_crit ();
   if (FRAME_OUTPUT_DATA (f)->paint_buffer)
     {
-      deselect_palette (f, FRAME_OUTPUT_DATA (f)->paint_buffer_handle);
+      deselect_palette (f,
+			FRAME_OUTPUT_DATA (f)->paint_buffer_handle);
 
       SelectObject (FRAME_OUTPUT_DATA (f)->paint_dc,
 		    FRAME_OUTPUT_DATA (f)->paint_dc_object);
@@ -371,14 +369,15 @@ w32_restore_glyph_string_clip (struct glyph_string *s)
       HRGN clip1 = CreateRectRgnIndirect (r);
       HRGN clip2 = CreateRectRgnIndirect (r + 1);
       if (CombineRgn (clip1, clip1, clip2, RGN_OR) != ERROR)
-        SelectClipRgn (s->hdc, clip1);
+	SelectClipRgn (s->hdc, clip1);
       DeleteObject (clip1);
       DeleteObject (clip2);
     }
 }
 
 static void
-w32_get_scale_factor(struct w32_display_info *dpyinfo, int *scale_x, int *scale_y)
+w32_get_scale_factor (struct w32_display_info *dpyinfo, int *scale_x,
+		      int *scale_y)
 {
   const int base_res = 96;
 
@@ -394,12 +393,13 @@ w32_get_scale_factor(struct w32_display_info *dpyinfo, int *scale_x, int *scale_
 }
 
 /*
-   Draw a wavy line under S. The wave fills wave_height pixels from y0.
+   Draw a wavy line under S. The wave fills wave_height pixels from
+   y0.
 
-                    x0         wave_length = 2
-                                 --
-                y0   *   *   *   *   *
-                     |* * * * * * * * *
+		    x0         wave_length = 2
+				 --
+		y0   *   *   *   *   *
+		     |* * * * * * * * *
     wave_height = 3  | *   *   *   *
 
 */
@@ -412,7 +412,8 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
   int scale_x, scale_y;
   w32_get_scale_factor (dpyinfo, &scale_x, &scale_y);
 
-  int wave_height = 3 * scale_y, wave_length = 2 * scale_x, thickness = scale_y;
+  int wave_height = 3 * scale_y, wave_length = 2 * scale_x,
+      thickness = scale_y;
   int dx, dy, x0, y0, width, x1, y1, x2, y2, odd, xmax;
   Emacs_Rectangle wave_clip, string_clip, final_clip;
   RECT w32_final_clip, w32_string_clip;
@@ -435,7 +436,8 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
   get_glyph_string_clip_rect (s, &w32_string_clip);
   CONVERT_TO_EMACS_RECT (string_clip, w32_string_clip);
 
-  if (!gui_intersect_rectangles (&wave_clip, &string_clip, &final_clip))
+  if (!gui_intersect_rectangles (&wave_clip, &string_clip,
+				 &final_clip))
     return;
 
   hp = CreatePen (PS_SOLID, thickness, color);
@@ -447,7 +449,7 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
 
   x1 = x0 - (x0 % dx);
   x2 = x1 + dx;
-  odd = (x1/dx) % 2;
+  odd = (x1 / dx) % 2;
   y1 = y2 = y0;
 
   if (odd)
@@ -460,8 +462,8 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
   while (x1 <= xmax)
     {
       LineTo (s->hdc, x2, y2);
-      x1  = x2, y1 = y2;
-      x2 += dx, y2 = y0 + odd*dy;
+      x1 = x2, y1 = y2;
+      x2 += dx, y2 = y0 + odd * dy;
       odd = !odd;
     }
 
@@ -473,8 +475,8 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color)
 
 /* Draw a hollow rectangle at the specified position.  */
 static void
-w32_draw_rectangle (HDC hdc, Emacs_GC *gc, int x, int y,
-                    int width, int height)
+w32_draw_rectangle (HDC hdc, Emacs_GC *gc, int x, int y, int width,
+		    int height)
 {
   HBRUSH hb, oldhb;
   HPEN hp, oldhp;
@@ -599,7 +601,6 @@ w32_display_pixel_width (struct w32_display_info *dpyinfo)
   return pixels;
 }
 
-\f
 /***********************************************************************
 		    Starting and ending an update
  ***********************************************************************/
@@ -614,19 +615,18 @@ w32_update_begin (struct frame *f)
 {
   struct w32_display_info *display_info = FRAME_DISPLAY_INFO (f);
 
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   /* Regenerate display palette before drawing if list of requested
      colors has changed. */
   if (display_info->regen_palette)
-  {
-    w32_regenerate_palette (f);
-    display_info->regen_palette = FALSE;
-  }
+    {
+      w32_regenerate_palette (f);
+      display_info->regen_palette = FALSE;
+    }
 }
 
-
 /* Start update of window W.  */
 
 static void
@@ -636,15 +636,16 @@ w32_update_window_begin (struct window *w)
   if (w32_use_visible_system_caret && w32_system_caret_hwnd
       && w == w32_system_caret_window)
     {
-      SendMessageTimeout (w32_system_caret_hwnd, WM_EMACS_HIDE_CARET, 0, 0,
-			  0, 6000, NULL);
+      SendMessageTimeout (w32_system_caret_hwnd, WM_EMACS_HIDE_CARET,
+			  0, 0, 0, 6000, NULL);
     }
 }
 
 /* Draw a vertical window border from (x,y0) to (x,y1)  */
 
 static void
-w32_draw_vertical_window_border (struct window *w, int x, int y0, int y1)
+w32_draw_vertical_window_border (struct window *w, int x, int y0,
+				 int y1)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   RECT r;
@@ -666,26 +667,27 @@ w32_draw_vertical_window_border (struct window *w, int x, int y0, int y1)
   release_frame_dc (f, hdc);
 }
 
-
 /* Draw a window divider from (x0, y0) to (x1, y1)  */
 
 static void
-w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
+w32_draw_window_divider (struct window *w, int x0, int x1, int y0,
+			 int y1)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   HDC hdc = get_frame_dc (f);
-  struct face *face = FACE_FROM_ID_OR_NULL (f, WINDOW_DIVIDER_FACE_ID);
+  struct face *face
+    = FACE_FROM_ID_OR_NULL (f, WINDOW_DIVIDER_FACE_ID);
   struct face *face_first
     = FACE_FROM_ID_OR_NULL (f, WINDOW_DIVIDER_FIRST_PIXEL_FACE_ID);
   struct face *face_last
     = FACE_FROM_ID_OR_NULL (f, WINDOW_DIVIDER_LAST_PIXEL_FACE_ID);
-  unsigned long color = face ? face->foreground : FRAME_FOREGROUND_PIXEL (f);
-  unsigned long color_first = (face_first
-			       ? face_first->foreground
-			       : FRAME_FOREGROUND_PIXEL (f));
-  unsigned long color_last = (face_last
-			      ? face_last->foreground
-			      : FRAME_FOREGROUND_PIXEL (f));
+  unsigned long color
+    = face ? face->foreground : FRAME_FOREGROUND_PIXEL (f);
+  unsigned long color_first
+    = (face_first ? face_first->foreground
+		  : FRAME_FOREGROUND_PIXEL (f));
+  unsigned long color_last = (face_last ? face_last->foreground
+					: FRAME_FOREGROUND_PIXEL (f));
 
   if ((y1 - y0 > x1 - x0) && (x1 - x0 >= 3))
     /* A vertical divider, at least three pixels wide: Draw first and
@@ -696,8 +698,8 @@ w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
       w32_fill_area_abs (f, hdc, color_last, x1 - 1, y0, x1, y1);
     }
   else if ((x1 - x0 > y1 - y0) && (y1 - y0 >= 3))
-    /* A horizontal divider, at least three pixels high: Draw first and
-       last pixels differently.  */
+    /* A horizontal divider, at least three pixels high: Draw first
+       and last pixels differently.  */
     {
       w32_fill_area_abs (f, hdc, color_first, x0, y0, x1, y0 + 1);
       w32_fill_area_abs (f, hdc, color, x0, y0 + 1, x1, y1 - 1);
@@ -726,7 +728,7 @@ w32_draw_window_divider (struct window *w, int x0, int x1, int y0, int y1)
 
 static void
 w32_update_window_end (struct window *w, bool cursor_on_p,
-                       bool mouse_face_overwritten_p)
+		       bool mouse_face_overwritten_p)
 {
   /* Unhide the caret.  This won't actually show the cursor, unless it
      was visible before the corresponding call to HideCaret in
@@ -734,26 +736,24 @@ w32_update_window_end (struct window *w, bool cursor_on_p,
   if (w32_use_visible_system_caret && w32_system_caret_hwnd
       && w == w32_system_caret_window)
     {
-      SendMessageTimeout (w32_system_caret_hwnd, WM_EMACS_SHOW_CARET, 0, 0,
-			  0, 6000, NULL);
+      SendMessageTimeout (w32_system_caret_hwnd, WM_EMACS_SHOW_CARET,
+			  0, 0, 0, 6000, NULL);
     }
 }
 
-
 /* End update of frame F.  This function is installed as a hook in
    update_end.  */
 
 static void
 w32_update_end (struct frame *f)
 {
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   /* Mouse highlight may be displayed again.  */
   MOUSE_HL_INFO (f)->mouse_face_defer = false;
 }
 
-
 /* This function is called from various places in xdisp.c
    whenever a complete update has been performed.  */
 
@@ -781,10 +781,10 @@ w32_buffer_flipping_unblocked_hook (struct frame *f)
 void
 w32_flip_buffers_if_dirty (struct frame *f)
 {
-  if (FRAME_W32_P (f)	/* do nothing in TTY frames */
+  if (FRAME_W32_P (f) /* do nothing in TTY frames */
       && FRAME_OUTPUT_DATA (f)->paint_buffer
-      && FRAME_OUTPUT_DATA (f)->paint_buffer_dirty
-      && !f->garbaged && !buffer_flipping_blocked_p ())
+      && FRAME_OUTPUT_DATA (f)->paint_buffer_dirty && !f->garbaged
+      && !buffer_flipping_blocked_p ())
     w32_show_back_buffer (f);
 }
 
@@ -792,10 +792,11 @@ w32_flip_buffers_if_dirty (struct frame *f)
    arrow bitmaps, or clear the fringes if no bitmaps are required
    before DESIRED_ROW is made current.  This function is called from
    update_window_line only if it is known that there are differences
-   between bitmaps to be drawn between current row and DESIRED_ROW.  */
+   between bitmaps to be drawn between current row and DESIRED_ROW. */
 
 static void
-w32_after_update_window_line (struct window *w, struct glyph_row *desired_row)
+w32_after_update_window_line (struct window *w,
+			      struct glyph_row *desired_row)
 {
   struct frame *f;
   int width, height;
@@ -811,19 +812,16 @@ w32_after_update_window_line (struct window *w, struct glyph_row *desired_row)
      but I guess it's not worth doing since vertically split windows
      are almost never used, internal border is rarely set, and the
      overhead is very small.  */
-  if (windows_or_buffers_changed
-      && desired_row->full_width_p
+  if (windows_or_buffers_changed && desired_row->full_width_p
       && (f = XFRAME (w->frame),
-	  width = FRAME_INTERNAL_BORDER_WIDTH (f),
-	  width != 0)
-      && (height = desired_row->visible_height,
-	  height > 0))
+	  width = FRAME_INTERNAL_BORDER_WIDTH (f), width != 0)
+      && (height = desired_row->visible_height, height > 0))
     {
       int y = WINDOW_TO_FRAME_PIXEL_Y (w, max (0, desired_row->y));
-      int face_id =
-	!NILP (Vface_remapping_alist)
-	? lookup_basic_face (NULL, f, INTERNAL_BORDER_FACE_ID)
-	: INTERNAL_BORDER_FACE_ID;
+      int face_id
+	= !NILP (Vface_remapping_alist)
+	    ? lookup_basic_face (NULL, f, INTERNAL_BORDER_FACE_ID)
+	    : INTERNAL_BORDER_FACE_ID;
       struct face *face = FACE_FROM_ID_OR_NULL (f, face_id);
 
       block_input ();
@@ -841,8 +839,8 @@ w32_after_update_window_line (struct window *w, struct glyph_row *desired_row)
       else
 	{
 	  w32_clear_area (f, hdc, 0, y, width, height);
-	  w32_clear_area (f, hdc, FRAME_PIXEL_WIDTH (f) - width,
-			  y, width, height);
+	  w32_clear_area (f, hdc, FRAME_PIXEL_WIDTH (f) - width, y,
+			  width, height);
 	}
       release_frame_dc (f, hdc);
 
@@ -850,7 +848,6 @@ w32_after_update_window_line (struct window *w, struct glyph_row *desired_row)
     }
 }
 
-
 /* Draw the bitmap WHICH in one of the left or right fringes of
    window W.  ROW is the glyph row for which to display the bitmap; it
    determines the vertical position at which the bitmap has to be
@@ -870,11 +867,10 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
   w32_clip_to_row (w, row, ANY_AREA, hdc);
 
   if (p->bx >= 0 && !p->overlay_p)
-    w32_fill_area (f, hdc, face->background,
-		   p->bx, p->by, p->nx, p->ny);
+    w32_fill_area (f, hdc, face->background, p->bx, p->by, p->nx,
+		   p->ny);
 
-  if (p->which
-      && p->which < max_fringe_bmp
+  if (p->which && p->which < max_fringe_bmp
       && p->which < max_used_fringe_bitmap)
     {
       HBITMAP pixmap = fringe_bmp[p->which];
@@ -908,14 +904,11 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
 	  h_brush = CreateSolidBrush (face->foreground);
 	  h_orig_brush = SelectObject (hdc, h_brush);
 
-	  BitBlt (hdc, p->x, p->y, p->wd, p->h,
-		  compat_hdc, 0, p->dh,
+	  BitBlt (hdc, p->x, p->y, p->wd, p->h, compat_hdc, 0, p->dh,
 		  DSTINVERT);
-	  BitBlt (hdc, p->x, p->y, p->wd, p->h,
-		  compat_hdc, 0, p->dh,
+	  BitBlt (hdc, p->x, p->y, p->wd, p->h, compat_hdc, 0, p->dh,
 		  0x2E064A);
-	  BitBlt (hdc, p->x, p->y, p->wd, p->h,
-		  compat_hdc, 0, p->dh,
+	  BitBlt (hdc, p->x, p->y, p->wd, p->h, compat_hdc, 0, p->dh,
 		  DSTINVERT);
 
 	  SelectObject (hdc, h_orig_brush);
@@ -924,12 +917,11 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
       else
 	{
 	  SetTextColor (hdc, face->background);
-	  SetBkColor (hdc, (p->cursor_p
-			    ? f->output_data.w32->cursor_pixel
-			    : face->foreground));
+	  SetBkColor (hdc,
+		      (p->cursor_p ? f->output_data.w32->cursor_pixel
+				   : face->foreground));
 
-	  BitBlt (hdc, p->x, p->y, p->wd, p->h,
-		  compat_hdc, 0, p->dh,
+	  BitBlt (hdc, p->x, p->y, p->wd, p->h, compat_hdc, 0, p->dh,
 		  SRCCOPY);
 	}
 
@@ -944,13 +936,15 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
 }
 
 static void
-w32_define_fringe_bitmap (int which, unsigned short *bits, int h, int wd)
+w32_define_fringe_bitmap (int which, unsigned short *bits, int h,
+			  int wd)
 {
   if (which >= max_fringe_bmp)
     {
       int i = max_fringe_bmp;
       max_fringe_bmp = which + 20;
-      fringe_bmp = xrealloc (fringe_bmp, max_fringe_bmp * sizeof (HBITMAP));
+      fringe_bmp
+	= xrealloc (fringe_bmp, max_fringe_bmp * sizeof (HBITMAP));
       while (i < max_fringe_bmp)
 	fringe_bmp[i++] = 0;
     }
@@ -978,30 +972,32 @@ w32_destroy_fringe_bitmap (int which)
 static void w32_set_glyph_string_clipping (struct glyph_string *);
 static void w32_set_glyph_string_gc (struct glyph_string *);
 static void w32_draw_glyph_string_background (struct glyph_string *,
-                                              bool);
+					      bool);
 static void w32_draw_glyph_string_foreground (struct glyph_string *);
-static void w32_draw_composite_glyph_string_foreground (struct glyph_string *);
+static void
+w32_draw_composite_glyph_string_foreground (struct glyph_string *);
 static void w32_draw_glyph_string_box (struct glyph_string *);
-static void w32_draw_glyph_string  (struct glyph_string *);
+static void w32_draw_glyph_string (struct glyph_string *);
 static void w32_set_cursor_gc (struct glyph_string *);
 static void w32_set_mode_line_face_gc (struct glyph_string *);
 static void w32_set_mouse_face_gc (struct glyph_string *);
-static int w32_alloc_lighter_color (struct frame *, COLORREF *, double, int);
+static int w32_alloc_lighter_color (struct frame *, COLORREF *,
+				    double, int);
 static void w32_setup_relief_color (struct frame *, struct relief *,
-                                    double, int, COLORREF);
+				    double, int, COLORREF);
 static void w32_setup_relief_colors (struct glyph_string *);
 static void w32_draw_image_glyph_string (struct glyph_string *);
 static void w32_draw_image_relief (struct glyph_string *);
 static void w32_draw_image_foreground (struct glyph_string *);
-static void w32_draw_image_foreground_1 (struct glyph_string *, HBITMAP);
+static void w32_draw_image_foreground_1 (struct glyph_string *,
+					 HBITMAP);
 static void w32_clear_glyph_string_rect (struct glyph_string *, int,
-                                         int, int, int);
+					 int, int, int);
 static void w32_draw_relief_rect (struct frame *, int, int, int, int,
-                                  int, int, int, int, int, int, int,
-                                  RECT *);
-static void w32_draw_box_rect (struct glyph_string *, int, int, int, int,
-                               int, int, bool, bool, RECT *);
-
+				  int, int, int, int, int, int, int,
+				  RECT *);
+static void w32_draw_box_rect (struct glyph_string *, int, int, int,
+			       int, int, int, bool, bool, RECT *);
 
 /* Set S->gc to a suitable GC for drawing glyph string S in cursor
    face.  */
@@ -1015,7 +1011,8 @@ w32_set_cursor_gc (struct glyph_string *s)
       /* Sometimes we are not called for each change in the default
 	 face's background color (e.g., bug#26851), so the additional
 	 test in the next line gives us a chance to resync.  */
-      && s->f->output_data.w32->cursor_gc->foreground == s->face->background
+      && s->f->output_data.w32->cursor_gc->foreground
+	   == s->face->background
       && !s->cmp)
     s->gc = s->f->output_data.w32->cursor_gc;
   else
@@ -1027,11 +1024,13 @@ w32_set_cursor_gc (struct glyph_string *s)
       egc.background = s->f->output_data.w32->cursor_pixel;
       egc.foreground = s->face->background;
 
-      /* If the glyph would be invisible, try a different foreground.  */
+      /* If the glyph would be invisible, try a different foreground.
+       */
       if (egc.foreground == egc.background)
 	egc.foreground = s->face->foreground;
       if (egc.foreground == egc.background)
-	egc.foreground = s->f->output_data.w32->cursor_foreground_pixel;
+	egc.foreground
+	  = s->f->output_data.w32->cursor_foreground_pixel;
       if (egc.foreground == egc.background)
 	egc.foreground = s->face->foreground;
 
@@ -1057,7 +1056,6 @@ w32_set_cursor_gc (struct glyph_string *s)
     }
 }
 
-
 /* Set up S->gc of glyph string S for drawing text in mouse face.  */
 
 static void
@@ -1091,10 +1089,9 @@ w32_set_mouse_face_gc (struct glyph_string *s)
   eassert (s->gc != 0);
 }
 
-
-/* Set S->gc of glyph string S to a GC suitable for drawing a mode line.
-   Faces to use in the mode line have already been computed when the
-   matrix was built, so there isn't much to do, here.  */
+/* Set S->gc of glyph string S to a GC suitable for drawing a mode
+   line. Faces to use in the mode line have already been computed when
+   the matrix was built, so there isn't much to do, here.  */
 
 static inline void
 w32_set_mode_line_face_gc (struct glyph_string *s)
@@ -1102,7 +1099,6 @@ w32_set_mode_line_face_gc (struct glyph_string *s)
   s->gc = s->face->gc;
 }
 
-
 /* Set S->gc of glyph string S for drawing that glyph string.  Set
    S->stippled_p to a non-zero value if the face of S has a stipple
    pattern.  */
@@ -1132,8 +1128,7 @@ w32_set_glyph_string_gc (struct glyph_string *s)
       w32_set_mouse_face_gc (s);
       s->stippled_p = s->face->stipple != 0;
     }
-  else if (s->hl == DRAW_IMAGE_RAISED
-	   || s->hl == DRAW_IMAGE_SUNKEN)
+  else if (s->hl == DRAW_IMAGE_RAISED || s->hl == DRAW_IMAGE_SUNKEN)
     {
       s->gc = s->face->gc;
       s->stippled_p = s->face->stipple != 0;
@@ -1145,7 +1140,6 @@ w32_set_glyph_string_gc (struct glyph_string *s)
   eassert (s->gc != 0);
 }
 
-
 /* Set clipping for output of glyph string S.  S may be part of a mode
    line or menu if we don't have X toolkit support.  */
 
@@ -1162,11 +1156,11 @@ w32_set_glyph_string_clipping (struct glyph_string *s)
       HRGN clip1 = CreateRectRgnIndirect (r);
       HRGN clip2 = CreateRectRgnIndirect (r + 1);
       if (CombineRgn (clip1, clip1, clip2, RGN_OR) != ERROR)
-        SelectClipRgn (s->hdc, clip1);
+	SelectClipRgn (s->hdc, clip1);
       DeleteObject (clip1);
       DeleteObject (clip2);
     }
-    s->num_clips = n;
+  s->num_clips = n;
 }
 
 /* Set SRC's clipping for output of glyph string DST.  This is called
@@ -1175,7 +1169,7 @@ w32_set_glyph_string_clipping (struct glyph_string *s)
 
 static void
 w32_set_glyph_string_clipping_exactly (struct glyph_string *src,
-                                       struct glyph_string *dst)
+				       struct glyph_string *dst)
 {
   RECT r;
 
@@ -1200,19 +1194,26 @@ w32_compute_glyph_string_overhangs (struct glyph_string *s)
       if (s->first_glyph->type == CHAR_GLYPH && !s->font_not_found_p)
 	{
 	  struct font *font = s->font;
-	  font->driver->text_extents (font, s->char2b, s->nchars, &metrics);
+	  font->driver->text_extents (font, s->char2b, s->nchars,
+				      &metrics);
 	  s->right_overhang = (metrics.rbearing > metrics.width
-			       ? metrics.rbearing - metrics.width : 0);
-	  s->left_overhang = metrics.lbearing < 0 ? -metrics.lbearing : 0;
+				 ? metrics.rbearing - metrics.width
+				 : 0);
+	  s->left_overhang
+	    = metrics.lbearing < 0 ? -metrics.lbearing : 0;
 	}
       else if (s->first_glyph->type == COMPOSITE_GLYPH)
 	{
-	  Lisp_Object gstring = composition_gstring_from_id (s->cmp_id);
+	  Lisp_Object gstring
+	    = composition_gstring_from_id (s->cmp_id);
 
-	  composition_gstring_width (gstring, s->cmp_from, s->cmp_to, &metrics);
+	  composition_gstring_width (gstring, s->cmp_from, s->cmp_to,
+				     &metrics);
 	  s->right_overhang = (metrics.rbearing > metrics.width
-			       ? metrics.rbearing - metrics.width : 0);
-	  s->left_overhang = metrics.lbearing < 0 ? -metrics.lbearing : 0;
+				 ? metrics.rbearing - metrics.width
+				 : 0);
+	  s->left_overhang
+	    = metrics.lbearing < 0 ? -metrics.lbearing : 0;
 	}
     }
   else
@@ -1222,11 +1223,12 @@ w32_compute_glyph_string_overhangs (struct glyph_string *s)
     }
 }
 
-/* Fill rectangle X, Y, W, H with background color of glyph string S.  */
+/* Fill rectangle X, Y, W, H with background color of glyph string S.
+ */
 
 static inline void
-w32_clear_glyph_string_rect (struct glyph_string *s,
-			   int x, int y, int w, int h)
+w32_clear_glyph_string_rect (struct glyph_string *s, int x, int y,
+			     int w, int h)
 {
   int real_x = x;
   int real_y = y;
@@ -1245,10 +1247,9 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
     }
 #endif
   w32_fill_area (s->f, s->hdc, s->gc->background, real_x, real_y,
-                 real_w, real_h);
+		 real_w, real_h);
 }
 
-
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
    background even if it wouldn't be drawn normally.  This is used
@@ -1256,47 +1257,53 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
    contains the first component of a composition.  */
 
 static void
-w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
+w32_draw_glyph_string_background (struct glyph_string *s,
+				  bool force_p)
 {
   /* Nothing to do if background has already been drawn or if it
      shouldn't be drawn in the first place.  */
   if (!s->background_filled_p)
     {
-      int box_line_width = max (s->face->box_horizontal_line_width, 0);
+      int box_line_width
+	= max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
+#if 1 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
-			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  /* XSetFillStyle (s->display, s->gc, FillOpaqueStippled); */
+
+	  w32_draw_rectangle (get_frame_dc (s->f), s->gc, s->x, s->y,
+			      s->background_width, s->height);
+	  /* w32_fill_rect (s->f, get_frame_dc (s->f), */
+	  /* 		 s->face->foreground, &r); */
+	  /* XFillRectangle (s->display, FRAME_W32_WINDOW (s->f),
+	   * s->gc, */
+	  /* 		  s->x, s->y + box_line_width, */
+	  /* 		  s->background_width, */
+	  /* 		  s->height - 2 * box_line_width); */
+	  /* XSetFillStyle (s->display, s->gc, FillSolid); */
 	  s->background_filled_p = true;
 	}
       else
 #endif
-           if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
-	       /* When xdisp.c ignores FONT_HEIGHT, we cannot trust
-		  font dimensions, since the actual glyphs might be
-		  much smaller.  So in that case we always clear the
-		  rectangle with background color.  */
-	       || FONT_TOO_HIGH (s->font)
-	       || s->font_not_found_p
-	       || s->extends_to_end_of_line_p
-	       || force_p)
+	if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
+	    /* When xdisp.c ignores FONT_HEIGHT, we cannot trust
+	       font dimensions, since the actual glyphs might be
+	       much smaller.  So in that case we always clear the
+	       rectangle with background color.  */
+	    || FONT_TOO_HIGH (s->font) || s->font_not_found_p
+	    || s->extends_to_end_of_line_p || force_p)
 	{
 	  w32_clear_glyph_string_rect (s, s->x, s->y + box_line_width,
-				     s->background_width,
-				     s->height - 2 * box_line_width);
+				       s->background_width,
+				       s->height
+					 - 2 * box_line_width);
 	  s->background_filled_p = true;
 	}
     }
 }
 
-
 /* Draw the foreground of glyph string S.  */
 
 static void
@@ -1306,8 +1313,7 @@ w32_draw_glyph_string_foreground (struct glyph_string *s)
 
   /* If first glyph of S has a left box line, start drawing the text
      of S to the right of that box line.  */
-  if (s->face->box != FACE_NO_BOX
-      && s->first_glyph->left_box_line_p)
+  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p)
     x = s->x + max (s->face->box_vertical_line_width, 0);
   else
     x = s->x;
@@ -1321,13 +1327,13 @@ w32_draw_glyph_string_foreground (struct glyph_string *s)
   if (s->font_not_found_p)
     {
       for (i = 0; i < s->nchars; ++i)
-        {
-          struct glyph *g = s->first_glyph + i;
+	{
+	  struct glyph *g = s->first_glyph + i;
 
-          w32_draw_rectangle (s->hdc, s->gc, x, s->y, g->pixel_width - 1,
-                              s->height - 1);
-          x += g->pixel_width;
-        }
+	  w32_draw_rectangle (s->hdc, s->gc, x, s->y,
+			      g->pixel_width - 1, s->height - 1);
+	  x += g->pixel_width;
+	}
     }
   else
     {
@@ -1384,10 +1390,10 @@ w32_draw_composite_glyph_string_foreground (struct glyph_string *s)
   if (s->font_not_found_p)
     {
       if (s->cmp_from == 0)
-        w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1,
-                            s->height - 1);
+	w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1,
+			    s->height - 1);
     }
-  else if (! s->first_glyph->u.cmp.automatic)
+  else if (!s->first_glyph->u.cmp.automatic)
     {
       int y = s->ybase;
       HFONT old_font;
@@ -1435,7 +1441,8 @@ w32_draw_composite_glyph_string_foreground (struct glyph_string *s)
 	      xoff = LGLYPH_XOFF (glyph);
 	      yoff = LGLYPH_YOFF (glyph);
 	      wadjust = LGLYPH_WADJUST (glyph);
-	      font->driver->draw (s, i, i + 1, x + xoff, y + yoff, false);
+	      font->driver->draw (s, i, i + 1, x + xoff, y + yoff,
+				  false);
 	      x += wadjust;
 	      j = i + 1;
 	      width = 0;
@@ -1448,7 +1455,6 @@ w32_draw_composite_glyph_string_foreground (struct glyph_string *s)
     }
 }
 
-
 /* Draw the foreground of glyph string S for glyphless characters.  */
 
 static void
@@ -1461,8 +1467,7 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
 
   /* If first glyph of S has a left box line, start drawing the text
      of S to the right of that box line.  */
-  if (s->face->box != FACE_NO_BOX
-      && s->first_glyph->left_box_line_p)
+  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p)
     x = s->x + max (s->face->box_vertical_line_width, 0);
   else
     x = s->x;
@@ -1472,8 +1477,10 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
   SetTextAlign (s->hdc, TA_BASELINE | TA_LEFT);
 
   s->char2b = char2b;
-  with_background = ((s->for_overlaps
-		      || (s->background_filled_p && s->hl != DRAW_CURSOR))) == 0;
+  with_background
+    = ((s->for_overlaps
+	|| (s->background_filled_p && s->hl != DRAW_CURSOR)))
+      == 0;
   for (i = 0; i < s->nchars; i++, glyph++)
     {
       char buf[7], *str = NULL;
@@ -1481,23 +1488,25 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
 
       if (glyph->u.glyphless.method == GLYPHLESS_DISPLAY_ACRONYM)
 	{
-	  if (len > 0
-	      && CHAR_TABLE_P (Vglyphless_char_display)
-	      && (CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (Vglyphless_char_display))
+	  if (len > 0 && CHAR_TABLE_P (Vglyphless_char_display)
+	      && (CHAR_TABLE_EXTRA_SLOTS (
+		    XCHAR_TABLE (Vglyphless_char_display))
 		  >= 1))
 	    {
 	      Lisp_Object acronym
-		= (! glyph->u.glyphless.for_no_font
-		   ? CHAR_TABLE_REF (Vglyphless_char_display,
-				     glyph->u.glyphless.ch)
-		   : XCHAR_TABLE (Vglyphless_char_display)->extras[0]);
+		= (!glyph->u.glyphless.for_no_font
+		     ? CHAR_TABLE_REF (Vglyphless_char_display,
+				       glyph->u.glyphless.ch)
+		     : XCHAR_TABLE (Vglyphless_char_display)
+			 ->extras[0]);
 	      if (CONSP (acronym))
 		acronym = XCAR (acronym);
 	      if (STRINGP (acronym))
 		str = SSDATA (acronym);
 	    }
 	}
-      else if (glyph->u.glyphless.method == GLYPHLESS_DISPLAY_HEX_CODE)
+      else if (glyph->u.glyphless.method
+	       == GLYPHLESS_DISPLAY_HEX_CODE)
 	{
 	  sprintf ((char *) buf, "%0*X",
 		   glyph->u.glyphless.ch < 0x10000 ? 4 : 6,
@@ -1506,8 +1515,8 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
 	}
 
       if (glyph->u.glyphless.method != GLYPHLESS_DISPLAY_THIN_SPACE)
-	w32_draw_rectangle (s->hdc, s->gc,
-			    x, s->ybase - glyph->ascent,
+	w32_draw_rectangle (s->hdc, s->gc, x,
+			    s->ybase - glyph->ascent,
 			    glyph->pixel_width - 1,
 			    glyph->ascent + glyph->descent - 1);
       if (str)
@@ -1517,24 +1526,27 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
 	  HFONT old_font;
 
 	  old_font = SelectObject (s->hdc, FONT_HANDLE (font));
-	  /* It is certain that all LEN characters in STR are ASCII.  */
+	  /* It is certain that all LEN characters in STR are ASCII.
+	   */
 	  for (j = 0; j < len; j++)
-            char2b[j] = font->driver->encode_char (font, str[j]) & 0xFFFF;
+	    char2b[j]
+	      = font->driver->encode_char (font, str[j]) & 0xFFFF;
 	  font->driver->draw (s, 0, upper_len,
 			      x + glyph->slice.glyphless.upper_xoff,
-			      s->ybase + glyph->slice.glyphless.upper_yoff,
+			      s->ybase
+				+ glyph->slice.glyphless.upper_yoff,
 			      with_background);
 	  font->driver->draw (s, upper_len, len,
 			      x + glyph->slice.glyphless.lower_xoff,
-			      s->ybase + glyph->slice.glyphless.lower_yoff,
+			      s->ybase
+				+ glyph->slice.glyphless.lower_yoff,
 			      with_background);
 	  SelectObject (s->hdc, old_font);
 	}
       x += glyph->pixel_width;
-   }
+    }
 }
 
-
 /* Brightness beyond which a color won't have its highlight brightness
    boosted.
 
@@ -1548,7 +1560,6 @@ w32_draw_glyphless_glyph_string_foreground (struct glyph_string *s)
    (grey75) will not have its highlights changed at all.  */
 #define HIGHLIGHT_COLOR_DARK_BOOST_LIMIT 187
 
-
 /* Allocate a color which is lighter or darker than *COLOR by FACTOR
    or DELTA.  Try a color with RGB values multiplied by FACTOR first.
    If this produces the same color as COLOR, try a color where all RGB
@@ -1569,12 +1580,13 @@ w32_alloc_lighter_color (struct frame *f, COLORREF *color,
   /* Change RGB values by specified FACTOR.  Avoid overflow!  */
   eassert (factor >= 0);
   new = PALETTERGB (min (0xff, factor * GetRValue (*color)),
-                    min (0xff, factor * GetGValue (*color)),
-                    min (0xff, factor * GetBValue (*color)));
+		    min (0xff, factor * GetGValue (*color)),
+		    min (0xff, factor * GetBValue (*color)));
 
   /* Calculate brightness of COLOR.  */
   bright = (2 * GetRValue (*color) + 3 * GetGValue (*color)
-            + GetBValue (*color)) / 6;
+	    + GetBValue (*color))
+	   / 6;
 
   /* We only boost colors that are darker than
      HIGHLIGHT_COLOR_DARK_BOOST_LIMIT.  */
@@ -1582,25 +1594,36 @@ w32_alloc_lighter_color (struct frame *f, COLORREF *color,
     /* Make an additive adjustment to NEW, because it's dark enough so
        that scaling by FACTOR alone isn't enough.  */
     {
-      /* How far below the limit this color is (0 - 1, 1 being darker).  */
-      double dimness = 1 - (double)bright / HIGHLIGHT_COLOR_DARK_BOOST_LIMIT;
+      /* How far below the limit this color is (0 - 1, 1 being
+       * darker).  */
+      double dimness
+	= 1 - (double) bright / HIGHLIGHT_COLOR_DARK_BOOST_LIMIT;
       /* The additive adjustment.  */
       int min_delta = delta * dimness * factor / 2;
 
       if (factor < 1)
-        new = PALETTERGB (max (0, min (0xff, min_delta - GetRValue (*color))),
-                          max (0, min (0xff, min_delta - GetGValue (*color))),
-                          max (0, min (0xff, min_delta - GetBValue (*color))));
+	new
+	  = PALETTERGB (max (0, min (0xff,
+				     min_delta - GetRValue (*color))),
+			max (0, min (0xff,
+				     min_delta - GetGValue (*color))),
+			max (0, min (0xff, min_delta
+					     - GetBValue (*color))));
       else
-        new = PALETTERGB (max (0, min (0xff, min_delta + GetRValue (*color))),
-                          max (0, min (0xff, min_delta + GetGValue (*color))),
-                          max (0, min (0xff, min_delta + GetBValue (*color))));
+	new
+	  = PALETTERGB (max (0, min (0xff,
+				     min_delta + GetRValue (*color))),
+			max (0, min (0xff,
+				     min_delta + GetGValue (*color))),
+			max (0, min (0xff, min_delta
+					     + GetBValue (*color))));
     }
 
   if (new == *color)
-    new = PALETTERGB (max (0, min (0xff, delta + GetRValue (*color))),
-                      max (0, min (0xff, delta + GetGValue (*color))),
-                      max (0, min (0xff, delta + GetBValue (*color))));
+    new
+      = PALETTERGB (max (0, min (0xff, delta + GetRValue (*color))),
+		    max (0, min (0xff, delta + GetGValue (*color))),
+		    max (0, min (0xff, delta + GetBValue (*color))));
 
   /* TODO: Map to palette and retry with delta if same? */
   /* TODO: Free colors (if using palette)? */
@@ -1634,7 +1657,8 @@ w32_query_colors (struct frame *f, Emacs_Color *colors, int ncolors)
 /* Store F's background color into *BGCOLOR.  */
 
 void
-w32_query_frame_background_color (struct frame *f, Emacs_Color *bgcolor)
+w32_query_frame_background_color (struct frame *f,
+				  Emacs_Color *bgcolor)
 {
   bgcolor->pixel = FRAME_BACKGROUND_PIXEL (f);
   w32_query_colors (f, bgcolor, 1);
@@ -1648,8 +1672,9 @@ w32_query_frame_background_color (struct frame *f, Emacs_Color *bgcolor)
    be allocated, use DEFAULT_PIXEL, instead.  */
 
 static void
-w32_setup_relief_color (struct frame *f, struct relief *relief, double factor,
-			int delta, COLORREF default_pixel)
+w32_setup_relief_color (struct frame *f, struct relief *relief,
+			double factor, int delta,
+			COLORREF default_pixel)
 {
   Emacs_GC egc;
   struct w32_output *di = f->output_data.w32;
@@ -1680,7 +1705,6 @@ w32_setup_relief_color (struct frame *f, struct relief *relief, double factor,
     XChangeGC (NULL, relief->gc, mask, &egc);
 }
 
-
 /* Set up colors for the relief lines around glyph string S.  */
 
 static void
@@ -1691,25 +1715,22 @@ w32_setup_relief_colors (struct glyph_string *s)
 
   if (s->face->use_box_color_for_shadows_p)
     color = s->face->box_color;
-  else if (s->first_glyph->type == IMAGE_GLYPH
-	   && s->img->pixmap
+  else if (s->first_glyph->type == IMAGE_GLYPH && s->img->pixmap
 	   && !IMAGE_BACKGROUND_TRANSPARENT (s->img, s->f, 0))
-    color = IMAGE_BACKGROUND  (s->img, s->f, 0);
+    color = IMAGE_BACKGROUND (s->img, s->f, 0);
   else
     color = s->gc->background;
 
-  if (di->white_relief.gc == 0
-      || color != di->relief_background)
+  if (di->white_relief.gc == 0 || color != di->relief_background)
     {
       di->relief_background = color;
       w32_setup_relief_color (s->f, &di->white_relief, 1.2, 0x8000,
-                              WHITE_PIX_DEFAULT (s->f));
+			      WHITE_PIX_DEFAULT (s->f));
       w32_setup_relief_color (s->f, &di->black_relief, 0.6, 0x4000,
-                              BLACK_PIX_DEFAULT (s->f));
+			      BLACK_PIX_DEFAULT (s->f));
     }
 }
 
-
 /* Draw a relief on frame F inside the rectangle given by LEFT_X,
    TOP_Y, RIGHT_X, and BOTTOM_Y.  WIDTH is the thickness of the relief
    to draw, it must be >= 0.  RAISED_P non-zero means draw a raised
@@ -1719,11 +1740,10 @@ w32_setup_relief_colors (struct glyph_string *s)
    when drawing.  */
 
 static void
-w32_draw_relief_rect (struct frame *f,
-		      int left_x, int top_y, int right_x, int bottom_y,
-		      int hwidth, int vwidth, int raised_p,
-		      int top_p, int bot_p, int left_p, int right_p,
-		      RECT *clip_rect)
+w32_draw_relief_rect (struct frame *f, int left_x, int top_y,
+		      int right_x, int bottom_y, int hwidth,
+		      int vwidth, int raised_p, int top_p, int bot_p,
+		      int left_p, int right_p, RECT *clip_rect)
 {
   int i;
   Emacs_GC gc;
@@ -1739,16 +1759,18 @@ w32_draw_relief_rect (struct frame *f,
   /* Top.  */
   if (top_p)
     for (i = 0; i < hwidth; ++i)
-      w32_fill_area (f, hdc, gc.foreground,
-		     left_x + i * left_p, top_y + i,
-		     right_x - left_x - i * (left_p + right_p ) + 1, 1);
+      w32_fill_area (f, hdc, gc.foreground, left_x + i * left_p,
+		     top_y + i,
+		     right_x - left_x - i * (left_p + right_p) + 1,
+		     1);
 
   /* Left.  */
   if (left_p)
     for (i = 0; i < vwidth; ++i)
-      w32_fill_area (f, hdc, gc.foreground,
-		     left_x + i, top_y + (i + 1) * top_p, 1,
-		     bottom_y - top_y - (i + 1) * (bot_p + top_p) + 1);
+      w32_fill_area (f, hdc, gc.foreground, left_x + i,
+		     top_y + (i + 1) * top_p, 1,
+		     bottom_y - top_y - (i + 1) * (bot_p + top_p)
+		       + 1);
 
   if (raised_p)
     gc.foreground = f->output_data.w32->black_relief.gc->foreground;
@@ -1758,23 +1780,24 @@ w32_draw_relief_rect (struct frame *f,
   /* Bottom.  */
   if (bot_p)
     for (i = 0; i < hwidth; ++i)
-      w32_fill_area (f, hdc, gc.foreground,
-		     left_x + i * left_p, bottom_y - i,
-		     right_x - left_x - i * (left_p + right_p) + 1, 1);
+      w32_fill_area (f, hdc, gc.foreground, left_x + i * left_p,
+		     bottom_y - i,
+		     right_x - left_x - i * (left_p + right_p) + 1,
+		     1);
 
   /* Right.  */
   if (right_p)
     for (i = 0; i < vwidth; ++i)
-      w32_fill_area (f, hdc, gc.foreground,
-		     right_x - i, top_y + (i + 1) * top_p, 1,
-		     bottom_y - top_y - (i + 1) * (bot_p + top_p) + 1);
+      w32_fill_area (f, hdc, gc.foreground, right_x - i,
+		     top_y + (i + 1) * top_p, 1,
+		     bottom_y - top_y - (i + 1) * (bot_p + top_p)
+		       + 1);
 
   w32_set_clip_rectangle (hdc, NULL);
 
   release_frame_dc (f, hdc);
 }
 
-
 /* Draw a box on frame F inside the rectangle given by LEFT_X, TOP_Y,
    RIGHT_X, and BOTTOM_Y.  WIDTH is the thickness of the lines to
    draw, it must be >= 0.  LEFT_P non-zero means draw a line on the
@@ -1783,38 +1806,38 @@ w32_draw_relief_rect (struct frame *f,
    rectangle to use when drawing.  */
 
 static void
-w32_draw_box_rect (struct glyph_string *s,
-		   int left_x, int top_y, int right_x, int bottom_y, int hwidth,
-		   int vwidth, bool left_p, bool right_p, RECT *clip_rect)
+w32_draw_box_rect (struct glyph_string *s, int left_x, int top_y,
+		   int right_x, int bottom_y, int hwidth, int vwidth,
+		   bool left_p, bool right_p, RECT *clip_rect)
 {
   w32_set_clip_rectangle (s->hdc, clip_rect);
 
   /* Top.  */
-  w32_fill_area (s->f, s->hdc, s->face->box_color,
-		  left_x, top_y, right_x - left_x + 1, hwidth);
+  w32_fill_area (s->f, s->hdc, s->face->box_color, left_x, top_y,
+		 right_x - left_x + 1, hwidth);
 
   /* Left.  */
   if (left_p)
     {
-      w32_fill_area (s->f, s->hdc, s->face->box_color,
-                     left_x, top_y, vwidth, bottom_y - top_y + 1);
+      w32_fill_area (s->f, s->hdc, s->face->box_color, left_x, top_y,
+		     vwidth, bottom_y - top_y + 1);
     }
 
   /* Bottom.  */
-  w32_fill_area (s->f, s->hdc, s->face->box_color,
-                 left_x, bottom_y - hwidth + 1, right_x - left_x + 1, hwidth);
+  w32_fill_area (s->f, s->hdc, s->face->box_color, left_x,
+		 bottom_y - hwidth + 1, right_x - left_x + 1, hwidth);
 
   /* Right.  */
   if (right_p)
     {
       w32_fill_area (s->f, s->hdc, s->face->box_color,
-                     right_x - vwidth + 1, top_y, vwidth, bottom_y - top_y + 1);
+		     right_x - vwidth + 1, top_y, vwidth,
+		     bottom_y - top_y + 1);
     }
 
   w32_set_clip_rectangle (s->hdc, NULL);
 }
 
-
 /* Draw a box around glyph string S.  */
 
 static void
@@ -1826,8 +1849,8 @@ w32_draw_glyph_string_box (struct glyph_string *s)
   RECT clip_rect;
 
   last_x = ((s->row->full_width_p && !s->w->pseudo_window_p)
-	    ? WINDOW_RIGHT_EDGE_X (s->w)
-	    : window_box_right (s->w, s->area));
+	      ? WINDOW_RIGHT_EDGE_X (s->w)
+	      : window_box_right (s->w, s->area));
 
   /* The glyph that may have a right box line.  For static
      compositions and images, the right-box flag is on the first glyph
@@ -1839,13 +1862,14 @@ w32_draw_glyph_string_box (struct glyph_string *s)
     {
       /* For automatic compositions, we need to look up the last glyph
 	 in the composition.  */
-        struct glyph *end = s->row->glyphs[s->area] + s->row->used[s->area];
-	struct glyph *g = s->first_glyph;
-	for (last_glyph = g++;
-	     g < end && g->u.cmp.automatic && g->u.cmp.id == s->cmp_id
-	       && g->slice.cmp.to < s->cmp_to;
-	     last_glyph = g++)
-	  ;
+      struct glyph *end
+	= s->row->glyphs[s->area] + s->row->used[s->area];
+      struct glyph *g = s->first_glyph;
+      for (last_glyph = g++;
+	   g < end && g->u.cmp.automatic && g->u.cmp.id == s->cmp_id
+	   && g->slice.cmp.to < s->cmp_to;
+	   last_glyph = g++)
+	;
     }
   else
     last_glyph = s->first_glyph + s->nchars - 1;
@@ -1855,30 +1879,29 @@ w32_draw_glyph_string_box (struct glyph_string *s)
   raised_p = s->face->box == FACE_RAISED_BOX;
   left_x = s->x;
   right_x = ((s->row->full_width_p && s->extends_to_end_of_line_p
-	      ? last_x - 1
-	      : min (last_x, s->x + s->background_width) - 1));
+		? last_x - 1
+		: min (last_x, s->x + s->background_width) - 1));
   top_y = s->y;
   bottom_y = top_y + s->height - 1;
 
   left_p = (s->first_glyph->left_box_line_p
 	    || (s->hl == DRAW_MOUSE_FACE
-		&& (s->prev == NULL
-		    || s->prev->hl != s->hl)));
+		&& (s->prev == NULL || s->prev->hl != s->hl)));
   right_p = (last_glyph->right_box_line_p
 	     || (s->hl == DRAW_MOUSE_FACE
-		 && (s->next == NULL
-		     || s->next->hl != s->hl)));
+		 && (s->next == NULL || s->next->hl != s->hl)));
 
   get_glyph_string_clip_rect (s, &clip_rect);
 
   if (s->face->box == FACE_SIMPLE_BOX)
     w32_draw_box_rect (s, left_x, top_y, right_x, bottom_y, hwidth,
-                       vwidth, left_p, right_p, &clip_rect);
+		       vwidth, left_p, right_p, &clip_rect);
   else
     {
       w32_setup_relief_colors (s);
-      w32_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y, hwidth,
-                            vwidth, raised_p, 1, 1, left_p, right_p, &clip_rect);
+      w32_draw_relief_rect (s->f, left_x, top_y, right_x, bottom_y,
+			    hwidth, vwidth, raised_p, 1, 1, left_p,
+			    right_p, &clip_rect);
     }
 }
 
@@ -1893,16 +1916,17 @@ transform (int x0, int y0, int x, int y, XFORM *xform)
 {
   POINT pt;
 
-  /* See https://docs.microsoft.com/en-us/windows/desktop/api/Wingdi/nf-wingdi-setworldtransform */
-  pt.x =
-    x0 + (x - x0) * xform->eM11 + (y - y0) * xform->eM21 + xform->eDx + 0.5f;
-  pt.y =
-    y0 + (x - x0) * xform->eM12 + (y - y0) * xform->eM22 + xform->eDy + 0.5f;
+  /* See
+   * https://docs.microsoft.com/en-us/windows/desktop/api/Wingdi/nf-wingdi-setworldtransform
+   */
+  pt.x = x0 + (x - x0) * xform->eM11 + (y - y0) * xform->eM21
+	 + xform->eDx + 0.5f;
+  pt.y = y0 + (x - x0) * xform->eM12 + (y - y0) * xform->eM22
+	 + xform->eDy + 0.5f;
 
   return pt;
 }
 
-
 /* Draw foreground of image glyph string S.  */
 
 static void
@@ -1913,8 +1937,7 @@ w32_draw_image_foreground (struct glyph_string *s)
 
   /* If first glyph of S has a left box line, start drawing it to the
      right of that line.  */
-  if (s->face->box != FACE_NO_BOX
-      && s->first_glyph->left_box_line_p
+  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p
       && s->slice.x == 0)
     x += max (s->face->box_vertical_line_width, 0);
 
@@ -1947,14 +1970,15 @@ w32_draw_image_foreground (struct glyph_string *s)
 	}
       else
 	{
-	  DebPrint (("w32_draw_image_foreground: GetObject(pixmap) failed!\n"));
+	  DebPrint (("w32_draw_image_foreground: GetObject(pixmap) "
+		     "failed!\n"));
 	  orig_width = s->slice.width;
 	  orig_height = s->slice.height;
 	}
 
       double w_factor = 1.0, h_factor = 1.0;
       bool scaled = false, need_xform = false;
-      int orig_slice_width  = s->slice.width,
+      int orig_slice_width = s->slice.width,
 	  orig_slice_height = s->slice.height;
       int orig_slice_x = s->slice.x, orig_slice_y = s->slice.y;
       POINT corner[3];
@@ -1965,15 +1989,19 @@ w32_draw_image_foreground (struct glyph_string *s)
 	{
 	  need_xform = true;
 	  corner[0] = transform (x, y, x, y, &s->img->xform);
-	  corner[1] = transform (x, y, x + orig_width, y, &s->img->xform);
-	  corner[2] = transform (x, y, x, y + orig_height, &s->img->xform);
+	  corner[1]
+	    = transform (x, y, x + orig_width, y, &s->img->xform);
+	  corner[2]
+	    = transform (x, y, x, y + orig_height, &s->img->xform);
 	}
-      else if (s->img->width != orig_width || s->img->height != orig_height)
+      else if (s->img->width != orig_width
+	       || s->img->height != orig_height)
 	{
 	  /* For scaled images we need to restore the original slice's
-	     dimensions and origin coordinates, from before the scaling.  */
+	     dimensions and origin coordinates, from before the
+	     scaling.  */
 	  scaled = true;
-	  w_factor = (double) orig_width  / (double) s->img->width;
+	  w_factor = (double) orig_width / (double) s->img->width;
 	  h_factor = (double) orig_height / (double) s->img->height;
 	  orig_slice_width = s->slice.width * w_factor + 0.5;
 	  orig_slice_height = s->slice.height * h_factor + 0.5;
@@ -1984,15 +2012,15 @@ w32_draw_image_foreground (struct glyph_string *s)
       if (s->img->mask)
 	{
 	  HDC mask_dc = CreateCompatibleDC (s->hdc);
-	  HGDIOBJ mask_orig_obj = SelectObject (mask_dc, s->img->mask);
+	  HGDIOBJ mask_orig_obj
+	    = SelectObject (mask_dc, s->img->mask);
 
 	  SetTextColor (s->hdc, RGB (255, 255, 255));
 	  SetBkColor (s->hdc, RGB (0, 0, 0));
 	  if (need_xform)
 	    {
-	      if (!pfnPlgBlt (s->hdc, corner, compat_hdc,
-			      s->slice.x, s->slice.y,
-			      orig_width, orig_height,
+	      if (!pfnPlgBlt (s->hdc, corner, compat_hdc, s->slice.x,
+			      s->slice.y, orig_width, orig_height,
 			      s->img->mask, s->slice.x, s->slice.y))
 		DebPrint (("PlgBlt failed!"));
 	    }
@@ -2012,17 +2040,21 @@ w32_draw_image_foreground (struct glyph_string *s)
 		 scaling to a larger size, but Windows 9X doesn't
 		 support HALFTONE.  */
 	      if (os_subtype == OS_SUBTYPE_NT
-		  && (pmode = SetStretchBltMode (s->hdc, HALFTONE)) != 0)
+		  && (pmode = SetStretchBltMode (s->hdc, HALFTONE))
+		       != 0)
 		SetBrushOrgEx (s->hdc, 0, 0, NULL);
-	      StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
-			  compat_hdc, orig_slice_x, orig_slice_y,
-			  orig_slice_width, orig_slice_height, SRCINVERT);
-	      StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
-			  mask_dc, orig_slice_x, orig_slice_y,
-			  orig_slice_width, orig_slice_height, SRCAND);
-	      StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
-			  compat_hdc, orig_slice_x, orig_slice_y,
-			  orig_slice_width, orig_slice_height, SRCINVERT);
+	      StretchBlt (s->hdc, x, y, s->slice.width,
+			  s->slice.height, compat_hdc, orig_slice_x,
+			  orig_slice_y, orig_slice_width,
+			  orig_slice_height, SRCINVERT);
+	      StretchBlt (s->hdc, x, y, s->slice.width,
+			  s->slice.height, mask_dc, orig_slice_x,
+			  orig_slice_y, orig_slice_width,
+			  orig_slice_height, SRCAND);
+	      StretchBlt (s->hdc, x, y, s->slice.width,
+			  s->slice.height, compat_hdc, orig_slice_x,
+			  orig_slice_y, orig_slice_width,
+			  orig_slice_height, SRCINVERT);
 	      if (pmode)
 		SetStretchBltMode (s->hdc, pmode);
 	    }
@@ -2035,9 +2067,9 @@ w32_draw_image_foreground (struct glyph_string *s)
 	  SetBkColor (s->hdc, s->gc->background);
 	  if (need_xform)
 	    {
-	      if (!pfnPlgBlt (s->hdc, corner, compat_hdc,
-			      s->slice.x, s->slice.y,
-			      orig_width, orig_height, NULL, 0, 0))
+	      if (!pfnPlgBlt (s->hdc, corner, compat_hdc, s->slice.x,
+			      s->slice.y, orig_width, orig_height,
+			      NULL, 0, 0))
 		DebPrint (("PlgBlt failed!"));
 	    }
 	  else if (!scaled)
@@ -2048,11 +2080,13 @@ w32_draw_image_foreground (struct glyph_string *s)
 	      int pmode = 0;
 	      /* Windows 9X doesn't support HALFTONE.  */
 	      if (os_subtype == OS_SUBTYPE_NT
-		  && (pmode = SetStretchBltMode (s->hdc, HALFTONE)) != 0)
+		  && (pmode = SetStretchBltMode (s->hdc, HALFTONE))
+		       != 0)
 		SetBrushOrgEx (s->hdc, 0, 0, NULL);
-	      StretchBlt (s->hdc, x, y, s->slice.width, s->slice.height,
-			  compat_hdc, orig_slice_x, orig_slice_y,
-			  orig_slice_width, orig_slice_height, SRCCOPY);
+	      StretchBlt (s->hdc, x, y, s->slice.width,
+			  s->slice.height, compat_hdc, orig_slice_x,
+			  orig_slice_y, orig_slice_width,
+			  orig_slice_height, SRCCOPY);
 	      if (pmode)
 		SetStretchBltMode (s->hdc, pmode);
 	    }
@@ -2066,10 +2100,11 @@ w32_draw_image_foreground (struct glyph_string *s)
 	  if (s->hl == DRAW_CURSOR)
 	    {
 	      int r = s->img->relief;
-	      if (r < 0) r = -r;
-	      w32_draw_rectangle (s->hdc, s->gc, x - r, y - r ,
-				  s->slice.width + r*2 - 1,
-				  s->slice.height + r*2 - 1);
+	      if (r < 0)
+		r = -r;
+	      w32_draw_rectangle (s->hdc, s->gc, x - r, y - r,
+				  s->slice.width + r * 2 - 1,
+				  s->slice.height + r * 2 - 1);
 	    }
 	}
 
@@ -2080,10 +2115,10 @@ w32_draw_image_foreground (struct glyph_string *s)
       DeleteDC (compat_hdc);
     }
   else
-    w32_draw_rectangle (s->hdc, s->gc, x, y,
-			s->slice.width - 1, s->slice.height - 1);
+    w32_draw_rectangle (s->hdc, s->gc, x, y, s->slice.width - 1,
+			s->slice.height - 1);
 
-  RestoreDC (s->hdc ,-1);
+  RestoreDC (s->hdc, -1);
 }
 
 size_t
@@ -2097,7 +2132,6 @@ w32_image_size (Emacs_Pixmap pixmap)
   return rv;
 }
 
-
 /* Draw a relief around the image glyph string S.  */
 
 static void
@@ -2111,8 +2145,7 @@ w32_draw_image_relief (struct glyph_string *s)
 
   /* If first glyph of S has a left box line, start drawing it to the
      right of that line.  */
-  if (s->face->box != FACE_NO_BOX
-      && s->first_glyph->left_box_line_p
+  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p
       && s->slice.x == 0)
     x += max (s->face->box_vertical_line_width, 0);
 
@@ -2123,17 +2156,16 @@ w32_draw_image_relief (struct glyph_string *s)
   if (s->slice.y == 0)
     y += s->img->vmargin;
 
-  if (s->hl == DRAW_IMAGE_SUNKEN
-      || s->hl == DRAW_IMAGE_RAISED)
+  if (s->hl == DRAW_IMAGE_SUNKEN || s->hl == DRAW_IMAGE_RAISED)
     {
       if (s->face->id == TAB_BAR_FACE_ID)
 	thick = (tab_bar_button_relief < 0
-		 ? DEFAULT_TAB_BAR_BUTTON_RELIEF
-		 : min (tab_bar_button_relief, 1000000));
+		   ? DEFAULT_TAB_BAR_BUTTON_RELIEF
+		   : min (tab_bar_button_relief, 1000000));
       else
 	thick = (tool_bar_button_relief < 0
-		 ? DEFAULT_TOOL_BAR_BUTTON_RELIEF
-		 : min (tool_bar_button_relief, 1000000));
+		   ? DEFAULT_TOOL_BAR_BUTTON_RELIEF
+		   : min (tool_bar_button_relief, 1000000));
       raised_p = s->hl == DRAW_IMAGE_RAISED;
     }
   else
@@ -2189,7 +2221,6 @@ w32_draw_image_relief (struct glyph_string *s)
 			top_p, bot_p, left_p, right_p, &r);
 }
 
-
 /* Draw the foreground of image glyph string S to PIXMAP.  */
 
 static void
@@ -2202,8 +2233,7 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
 
   /* If first glyph of S has a left box line, start drawing it to the
      right of that line.  */
-  if (s->face->box != FACE_NO_BOX
-      && s->first_glyph->left_box_line_p
+  if (s->face->box != FACE_NO_BOX && s->first_glyph->left_box_line_p
       && s->slice.x == 0)
     x += max (s->face->box_vertical_line_width, 0);
 
@@ -2228,14 +2258,15 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
       if (s->img->mask)
 	{
 	  HDC mask_dc = CreateCompatibleDC (hdc);
-	  HGDIOBJ mask_orig_obj = SelectObject (mask_dc, s->img->mask);
+	  HGDIOBJ mask_orig_obj
+	    = SelectObject (mask_dc, s->img->mask);
 
 	  SetTextColor (hdc, RGB (0, 0, 0));
 	  SetBkColor (hdc, RGB (255, 255, 255));
 	  BitBlt (hdc, x, y, s->slice.width, s->slice.height,
 		  compat_hdc, s->slice.x, s->slice.y, SRCINVERT);
-	  BitBlt (hdc, x, y, s->slice.width, s->slice.height,
-		  mask_dc, s->slice.x, s->slice.y, SRCAND);
+	  BitBlt (hdc, x, y, s->slice.width, s->slice.height, mask_dc,
+		  s->slice.x, s->slice.y, SRCAND);
 	  BitBlt (hdc, x, y, s->slice.width, s->slice.height,
 		  compat_hdc, s->slice.x, s->slice.y, SRCINVERT);
 
@@ -2247,8 +2278,8 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
 	  SetTextColor (hdc, s->gc->foreground);
 	  SetBkColor (hdc, s->gc->background);
 
-          BitBlt (hdc, x, y, s->slice.width, s->slice.height,
-                  compat_hdc, s->slice.x, s->slice.y, SRCCOPY);
+	  BitBlt (hdc, x, y, s->slice.width, s->slice.height,
+		  compat_hdc, s->slice.x, s->slice.y, SRCCOPY);
 
 	  /* When the image has a mask, we can expect that at
 	     least part of a mouse highlight or a block cursor will
@@ -2259,10 +2290,11 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
 	  if (s->hl == DRAW_CURSOR)
 	    {
 	      int r = s->img->relief;
-	      if (r < 0) r = -r;
+	      if (r < 0)
+		r = -r;
 	      w32_draw_rectangle (hdc, s->gc, x - r, y - r,
-				  s->slice.width + r*2 - 1,
-				  s->slice.height + r*2 - 1);
+				  s->slice.width + r * 2 - 1,
+				  s->slice.height + r * 2 - 1);
 	    }
 	}
 
@@ -2272,19 +2304,19 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
       DeleteDC (compat_hdc);
     }
   else
-    w32_draw_rectangle (hdc, s->gc, x, y,
-			s->slice.width - 1, s->slice.height - 1);
+    w32_draw_rectangle (hdc, s->gc, x, y, s->slice.width - 1,
+			s->slice.height - 1);
 
   SelectObject (hdc, orig_hdc_obj);
   DeleteDC (hdc);
 }
 
-
 /* Draw part of the background of glyph string S.  X, Y, W, and H
    give the rectangle to draw.  */
 
 static void
-w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y, int w, int h)
+w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y,
+			       int w, int h)
 {
 #if 0 /* TODO: stipple */
   if (s->stippled_p)
@@ -2296,13 +2328,12 @@ w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y, int w, int
     }
   else
 #endif
-    w32_clear_glyph_string_rect (s, x, y, w, h);
+  w32_clear_glyph_string_rect (s, x, y, w, h);
 }
 
-
 /* Draw image glyph string S.
 
-            s->y
+	    s->y
    s->x      +-------------------------
 	     |   s->face->box
 	     |
@@ -2333,17 +2364,13 @@ w32_draw_image_glyph_string (struct glyph_string *s)
      taller than image or if image has a clip mask to reduce
      flickering.  */
   s->stippled_p = s->face->stipple != 0;
-  if (height > s->slice.height
-      || s->img->hmargin
-      || s->img->vmargin
-      || s->img->mask
-      || s->img->pixmap == 0
+  if (height > s->slice.height || s->img->hmargin || s->img->vmargin
+      || s->img->mask || s->img->pixmap == 0
       || s->width != s->background_width)
     {
       width = s->background_width;
       x = s->x;
-      if (s->first_glyph->left_box_line_p
-	  && s->slice.x == 0)
+      if (s->first_glyph->left_box_line_p && s->slice.x == 0)
 	{
 	  x += box_line_hwidth;
 	  width -= box_line_hwidth;
@@ -2393,7 +2420,7 @@ w32_draw_image_glyph_string (struct glyph_string *s)
 	}
       else
 #endif
-	w32_draw_glyph_string_bg_rect (s, x, y, width, height);
+      w32_draw_glyph_string_bg_rect (s, x, y, width, height);
 
       s->background_filled_p = true;
     }
@@ -2404,20 +2431,20 @@ w32_draw_image_glyph_string (struct glyph_string *s)
       w32_draw_image_foreground_1 (s, pixmap);
       w32_set_glyph_string_clipping (s);
       {
-        HDC compat_hdc = CreateCompatibleDC (s->hdc);
-        HBRUSH fg_brush = CreateSolidBrush (s->gc->foreground);
-        HBRUSH orig_brush = SelectObject (s->hdc, fg_brush);
-        HGDIOBJ orig_obj = SelectObject (compat_hdc, pixmap);
-
-        SetTextColor (s->hdc, s->gc->foreground);
-        SetBkColor (s->hdc, s->gc->background);
-        BitBlt (s->hdc, s->x, s->y, s->background_width, s->height,
-                compat_hdc, 0, 0, SRCCOPY);
-
-        SelectObject (s->hdc, orig_brush);
-        DeleteObject (fg_brush);
-        SelectObject (compat_hdc, orig_obj);
-        DeleteDC (compat_hdc);
+	HDC compat_hdc = CreateCompatibleDC (s->hdc);
+	HBRUSH fg_brush = CreateSolidBrush (s->gc->foreground);
+	HBRUSH orig_brush = SelectObject (s->hdc, fg_brush);
+	HGDIOBJ orig_obj = SelectObject (compat_hdc, pixmap);
+
+	SetTextColor (s->hdc, s->gc->foreground);
+	SetBkColor (s->hdc, s->gc->background);
+	BitBlt (s->hdc, s->x, s->y, s->background_width, s->height,
+		compat_hdc, 0, 0, SRCCOPY);
+
+	SelectObject (s->hdc, orig_brush);
+	DeleteObject (fg_brush);
+	SelectObject (compat_hdc, orig_obj);
+	DeleteDC (compat_hdc);
       }
       DeleteObject (pixmap);
       pixmap = 0;
@@ -2426,13 +2453,11 @@ w32_draw_image_glyph_string (struct glyph_string *s)
     w32_draw_image_foreground (s);
 
   /* If we must draw a relief around the image, do it.  */
-  if (s->img->relief
-      || s->hl == DRAW_IMAGE_RAISED
+  if (s->img->relief || s->hl == DRAW_IMAGE_RAISED
       || s->hl == DRAW_IMAGE_SUNKEN)
     w32_draw_image_relief (s);
 }
 
-
 /* Draw stretch glyph string S.  */
 
 static void
@@ -2440,8 +2465,7 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
 {
   eassert (s->first_glyph->type == STRETCH_GLYPH);
 
-  if (s->hl == DRAW_CURSOR
-      && !x_stretch_cursor_p)
+  if (s->hl == DRAW_CURSOR && !x_stretch_cursor_p)
     {
       /* If `x-stretch-cursor' is nil, don't draw a block cursor as
 	 wide as the stretch glyph.  */
@@ -2482,14 +2506,13 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
 	  int y = s->y;
 	  int w = background_width - width, h = s->height;
 	  RECT r;
-          HDC hdc = s->hdc;
+	  HDC hdc = s->hdc;
 
 	  if (!s->row->reversed_p)
 	    x += width;
 	  else
 	    x = s->x;
-	  if (s->row->mouse_face_p
-	      && cursor_in_mouse_face_p (s->w))
+	  if (s->row->mouse_face_p && cursor_in_mouse_face_p (s->w))
 	    {
 	      w32_set_mouse_face_gc (s);
 	      gc = s->gc;
@@ -2510,10 +2533,10 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
 	    }
 	  else
 #endif
-            {
-              w32_fill_area (s->f, s->hdc, gc->background, x, y, w, h);
-            }
-        }
+	  {
+	    w32_fill_area (s->f, s->hdc, gc->background, x, y, w, h);
+	  }
+	}
     }
   else if (!s->background_filled_p)
     {
@@ -2521,21 +2544,21 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
       int x = s->x, text_left_x = window_box_left (s->w, TEXT_AREA);
 
       /* Don't draw into left fringe or scrollbar area except for
-         header line and mode line.  */
-      if (s->area == TEXT_AREA
-	  && x < text_left_x && !s->row->mode_line_p)
+	 header line and mode line.  */
+      if (s->area == TEXT_AREA && x < text_left_x
+	  && !s->row->mode_line_p)
 	{
 	  background_width -= text_left_x - x;
 	  x = text_left_x;
 	}
       if (background_width > 0)
-	w32_draw_glyph_string_bg_rect (s, x, s->y, background_width, s->height);
+	w32_draw_glyph_string_bg_rect (s, x, s->y, background_width,
+				       s->height);
     }
 
   s->background_filled_p = true;
 }
 
-
 /* Draw glyph string S.  */
 
 static void
@@ -2545,24 +2568,25 @@ w32_draw_glyph_string (struct glyph_string *s)
 
   /* If S draws into the background of its successor, draw the
      background of the successor first so that S can draw into it.
-     This makes S->next use XDrawString instead of XDrawImageString.  */
+     This makes S->next use XDrawString instead of XDrawImageString.
+   */
   if (s->next && s->right_overhang && !s->for_overlaps)
     {
       int width;
       struct glyph_string *next;
       for (width = 0, next = s->next;
 	   next && width < s->right_overhang;
-           width += next->width, next = next->next)
-        if (next->first_glyph->type != IMAGE_GLYPH)
-          {
-            w32_set_glyph_string_gc (next);
-            w32_set_glyph_string_clipping (next);
+	   width += next->width, next = next->next)
+	if (next->first_glyph->type != IMAGE_GLYPH)
+	  {
+	    w32_set_glyph_string_gc (next);
+	    w32_set_glyph_string_clipping (next);
 	    if (next->first_glyph->type == STRETCH_GLYPH)
 	      w32_draw_stretch_glyph_string (next);
 	    else
 	      w32_draw_glyph_string_background (next, true);
-            next->num_clips = 0;
-          }
+	    next->num_clips = 0;
+	  }
     }
 
   /* Set up S->gc, set clipping and draw S.  */
@@ -2570,8 +2594,7 @@ w32_draw_glyph_string (struct glyph_string *s)
 
   /* Draw relief (if any) in advance for char/composition so that the
      glyph string can be drawn over it.  */
-  if (!s->for_overlaps
-      && s->face->box != FACE_NO_BOX
+  if (!s->for_overlaps && s->face->box != FACE_NO_BOX
       && (s->first_glyph->type == CHAR_GLYPH
 	  || s->first_glyph->type == COMPOSITE_GLYPH))
 
@@ -2582,10 +2605,11 @@ w32_draw_glyph_string (struct glyph_string *s)
       w32_set_glyph_string_clipping (s);
       relief_drawn_p = 1;
     }
-  else if (!s->clip_head /* draw_glyphs didn't specify a clip mask.  */
-           && !s->clip_tail
-           && ((s->prev && s->prev->hl != s->hl && s->left_overhang)
-               || (s->next && s->next->hl != s->hl && s->right_overhang)))
+  else if (!s->clip_head /* draw_glyphs didn't specify a clip mask. */
+	   && !s->clip_tail
+	   && ((s->prev && s->prev->hl != s->hl && s->left_overhang)
+	       || (s->next && s->next->hl != s->hl
+		   && s->right_overhang)))
     /* We must clip just this glyph.  left_overhang part has already
        drawn when s->prev was drawn, and right_overhang part will be
        drawn later when s->next is drawn. */
@@ -2607,13 +2631,13 @@ w32_draw_glyph_string (struct glyph_string *s)
       if (s->for_overlaps)
 	s->background_filled_p = true;
       else
-        w32_draw_glyph_string_background (s, false);
+	w32_draw_glyph_string_background (s, false);
       w32_draw_glyph_string_foreground (s);
       break;
 
     case COMPOSITE_GLYPH:
-      if (s->for_overlaps || (s->cmp_from > 0
-			      && ! s->first_glyph->u.cmp.automatic))
+      if (s->for_overlaps
+	  || (s->cmp_from > 0 && !s->first_glyph->u.cmp.automatic))
 	s->background_filled_p = true;
       else
 	w32_draw_glyph_string_background (s, true);
@@ -2636,173 +2660,185 @@ w32_draw_glyph_string (struct glyph_string *s)
     {
       /* Draw relief if not yet drawn.  */
       if (!relief_drawn_p && s->face->box != FACE_NO_BOX)
-        w32_draw_glyph_string_box (s);
+	w32_draw_glyph_string_box (s);
 
       /* Draw underline.  */
       if (s->face->underline)
-        {
-          if (s->face->underline == FACE_UNDER_WAVE)
-            {
-              COLORREF color;
-
-              if (s->face->underline_defaulted_p)
-                color = s->gc->foreground;
-              else
-                color = s->face->underline_color;
-
-              w32_draw_underwave (s, color);
-            }
-          else if (s->face->underline == FACE_UNDER_LINE)
-            {
-              unsigned long thickness, position;
-              int y;
-
-              if (s->prev
+	{
+	  if (s->face->underline == FACE_UNDER_WAVE)
+	    {
+	      COLORREF color;
+
+	      if (s->face->underline_defaulted_p)
+		color = s->gc->foreground;
+	      else
+		color = s->face->underline_color;
+
+	      w32_draw_underwave (s, color);
+	    }
+	  else if (s->face->underline == FACE_UNDER_LINE)
+	    {
+	      unsigned long thickness, position;
+	      int y;
+
+	      if (s->prev
 		  && s->prev->face->underline == FACE_UNDER_LINE
 		  && (s->prev->face->underline_at_descent_line_p
 		      == s->face->underline_at_descent_line_p)
-		  && (s->prev->face->underline_pixels_above_descent_line
-		      == s->face->underline_pixels_above_descent_line))
-                {
-                  /* We use the same underline style as the previous one.  */
-                  thickness = s->prev->underline_thickness;
-                  position = s->prev->underline_position;
-                }
-              else
-                {
+		  && (s->prev->face
+			->underline_pixels_above_descent_line
+		      == s->face
+			   ->underline_pixels_above_descent_line))
+		{
+		  /* We use the same underline style as the previous
+		   * one.  */
+		  thickness = s->prev->underline_thickness;
+		  position = s->prev->underline_position;
+		}
+	      else
+		{
 		  struct font *font = font_for_underline_metrics (s);
 		  unsigned long minimum_offset;
 		  BOOL underline_at_descent_line;
 		  BOOL use_underline_position_properties;
-		  Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
-				     (Qunderline_minimum_offset, s->w));
+		  Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE (
+		    Qunderline_minimum_offset, s->w));
 
 		  if (FIXNUMP (val))
 		    minimum_offset = max (0, XFIXNUM (val));
 		  else
 		    minimum_offset = 1;
 
-		  val = (WINDOW_BUFFER_LOCAL_VALUE
-			 (Qx_underline_at_descent_line, s->w));
+		  val = (WINDOW_BUFFER_LOCAL_VALUE (
+		    Qx_underline_at_descent_line, s->w));
 		  underline_at_descent_line
 		    = (!(NILP (val) || BASE_EQ (val, Qunbound))
 		       || s->face->underline_at_descent_line_p);
 
-		  val = (WINDOW_BUFFER_LOCAL_VALUE
-			 (Qx_use_underline_position_properties, s->w));
+		  val = (WINDOW_BUFFER_LOCAL_VALUE (
+		    Qx_use_underline_position_properties, s->w));
 		  use_underline_position_properties
 		    = !(NILP (val) || BASE_EQ (val, Qunbound));
 
-                  /* Get the underline thickness.  Default is 1 pixel.  */
-                  if (font && font->underline_thickness > 0)
-                    thickness = font->underline_thickness;
-                  else
-                    thickness = 1;
-                  if (underline_at_descent_line
-                      || !font)
-		    position = ((s->height - thickness)
-				- (s->ybase - s->y)
-				- s->face->underline_pixels_above_descent_line);
-                  else
-                    {
-                      /* Get the underline position.  This is the
-                         recommended vertical offset in pixels from
-                         the baseline to the top of the underline.
-                         This is a signed value according to the
-                         specs, and its default is
-
-                         ROUND ((maximum_descent) / 2), with
-                         ROUND (x) = floor (x + 0.5)  */
-
-                      if (use_underline_position_properties
-                          && font->underline_position >= 0)
-                        position = font->underline_position;
-                      else
-                        position = (font->descent + 1) / 2;
-                    }
+		  /* Get the underline thickness.  Default is 1 pixel.
+		   */
+		  if (font && font->underline_thickness > 0)
+		    thickness = font->underline_thickness;
+		  else
+		    thickness = 1;
+		  if (underline_at_descent_line || !font)
+		    position
+		      = ((s->height - thickness) - (s->ybase - s->y)
+			 - s->face
+			     ->underline_pixels_above_descent_line);
+		  else
+		    {
+		      /* Get the underline position.  This is the
+			 recommended vertical offset in pixels from
+			 the baseline to the top of the underline.
+			 This is a signed value according to the
+			 specs, and its default is
+
+			 ROUND ((maximum_descent) / 2), with
+			 ROUND (x) = floor (x + 0.5)  */
+
+		      if (use_underline_position_properties
+			  && font->underline_position >= 0)
+			position = font->underline_position;
+		      else
+			position = (font->descent + 1) / 2;
+		    }
 
 		  if (!(s->face->underline_at_descent_line_p
-			/* Ignore minimum_offset if the amount of pixels
-			   was explicitly specified.  */
-			&& s->face->underline_pixels_above_descent_line))
+			/* Ignore minimum_offset if the amount of
+			   pixels was explicitly specified.  */
+			&& s->face
+			     ->underline_pixels_above_descent_line))
 		    position = max (position, minimum_offset);
-                }
-              /* Check the sanity of thickness and position.  We should
-                 avoid drawing underline out of the current line area.  */
-              if (s->y + s->height <= s->ybase + position)
-                position = (s->height - 1) - (s->ybase - s->y);
-              if (s->y + s->height < s->ybase + position + thickness)
-                thickness = (s->y + s->height) - (s->ybase + position);
-              s->underline_thickness = thickness;
-              s->underline_position =  position;
-              y = s->ybase + position;
-              if (s->face->underline_defaulted_p)
-                {
-                  w32_fill_area (s->f, s->hdc, s->gc->foreground, s->x,
-                                 y, s->width, 1);
-                }
-              else
-                {
-                  w32_fill_area (s->f, s->hdc, s->face->underline_color, s->x,
-                                 y, s->width, 1);
-                }
-            }
-        }
+		}
+	      /* Check the sanity of thickness and position.  We
+		 should avoid drawing underline out of the current
+		 line area.  */
+	      if (s->y + s->height <= s->ybase + position)
+		position = (s->height - 1) - (s->ybase - s->y);
+	      if (s->y + s->height < s->ybase + position + thickness)
+		thickness
+		  = (s->y + s->height) - (s->ybase + position);
+	      s->underline_thickness = thickness;
+	      s->underline_position = position;
+	      y = s->ybase + position;
+	      if (s->face->underline_defaulted_p)
+		{
+		  w32_fill_area (s->f, s->hdc, s->gc->foreground,
+				 s->x, y, s->width, 1);
+		}
+	      else
+		{
+		  w32_fill_area (s->f, s->hdc,
+				 s->face->underline_color, s->x, y,
+				 s->width, 1);
+		}
+	    }
+	}
       /* Draw overline.  */
       if (s->face->overline_p)
-        {
-          unsigned long dy = 0, h = 1;
-
-          if (s->face->overline_color_defaulted_p)
-            {
-              w32_fill_area (s->f, s->hdc, s->gc->foreground, s->x,
-                             s->y + dy, s->width, h);
-            }
-          else
-            {
-              w32_fill_area (s->f, s->hdc, s->face->overline_color, s->x,
-                             s->y + dy, s->width, h);
-            }
-        }
+	{
+	  unsigned long dy = 0, h = 1;
+
+	  if (s->face->overline_color_defaulted_p)
+	    {
+	      w32_fill_area (s->f, s->hdc, s->gc->foreground, s->x,
+			     s->y + dy, s->width, h);
+	    }
+	  else
+	    {
+	      w32_fill_area (s->f, s->hdc, s->face->overline_color,
+			     s->x, s->y + dy, s->width, h);
+	    }
+	}
 
       /* Draw strike-through.  */
       if (s->face->strike_through_p
-          && !FONT_TEXTMETRIC (s->font).tmStruckOut)
-        {
+	  && !FONT_TEXTMETRIC (s->font).tmStruckOut)
+	{
 	  /* Y-coordinate and height of the glyph string's first
 	     glyph.  We cannot use s->y and s->height because those
 	     could be larger if there are taller display elements
 	     (e.g., characters displayed with a larger font) in the
 	     same glyph row.  */
 	  int glyph_y = s->ybase - s->first_glyph->ascent;
-	  int glyph_height = s->first_glyph->ascent + s->first_glyph->descent;
+	  int glyph_height
+	    = s->first_glyph->ascent + s->first_glyph->descent;
 	  /* Strike-through width and offset from the glyph string's
 	     top edge.  */
-          unsigned long h = 1;
-          unsigned long dy = (glyph_height - h) / 2;
+	  unsigned long h = 1;
+	  unsigned long dy = (glyph_height - h) / 2;
 
-          if (s->face->strike_through_color_defaulted_p)
-            {
-              w32_fill_area (s->f, s->hdc, s->gc->foreground, s->x,
+	  if (s->face->strike_through_color_defaulted_p)
+	    {
+	      w32_fill_area (s->f, s->hdc, s->gc->foreground, s->x,
+			     glyph_y + dy, s->width, h);
+	    }
+	  else
+	    {
+	      w32_fill_area (s->f, s->hdc,
+			     s->face->strike_through_color, s->x,
 			     glyph_y + dy, s->width, h);
-            }
-          else
-            {
-              w32_fill_area (s->f, s->hdc, s->face->strike_through_color, s->x,
-                             glyph_y + dy, s->width, h);
-            }
-        }
+	    }
+	}
 
       if (s->prev)
-        {
-          struct glyph_string *prev;
-
-          for (prev = s->prev; prev; prev = prev->prev)
-            if (prev->hl != s->hl
-                && prev->x + prev->width + prev->right_overhang > s->x)
-              {
-                /* As prev was drawn while clipped to its own area, we
-                   must draw the right_overhang part using s->hl now.  */
+	{
+	  struct glyph_string *prev;
+
+	  for (prev = s->prev; prev; prev = prev->prev)
+	    if (prev->hl != s->hl
+		&& prev->x + prev->width + prev->right_overhang
+		     > s->x)
+	      {
+		/* As prev was drawn while clipped to its own area, we
+		   must draw the right_overhang part using s->hl now.
+		 */
 		enum draw_glyphs_face save = prev->hl;
 
 		prev->hl = s->hl;
@@ -2812,7 +2848,7 @@ w32_draw_glyph_string (struct glyph_string *s)
 		  w32_draw_glyph_string_foreground (prev);
 		else
 		  w32_draw_composite_glyph_string_foreground (prev);
-                w32_set_clip_rectangle (prev->hdc, NULL);
+		w32_set_clip_rectangle (prev->hdc, NULL);
 		prev->hl = save;
 		prev->num_clips = 0;
 	      }
@@ -2826,8 +2862,9 @@ w32_draw_glyph_string (struct glyph_string *s)
 	    if (next->hl != s->hl
 		&& next->x - next->left_overhang < s->x + s->width)
 	      {
-		/* As next will be drawn while clipped to its own area,
-		   we must draw the left_overhang part using s->hl now.  */
+		/* As next will be drawn while clipped to its own
+		   area, we must draw the left_overhang part using
+		   s->hl now.  */
 		enum draw_glyphs_face save = next->hl;
 
 		next->hl = s->hl;
@@ -2837,7 +2874,7 @@ w32_draw_glyph_string (struct glyph_string *s)
 		  w32_draw_glyph_string_foreground (next);
 		else
 		  w32_draw_composite_glyph_string_foreground (next);
-                w32_set_clip_rectangle (next->hdc, NULL);
+		w32_set_clip_rectangle (next->hdc, NULL);
 		next->hl = save;
 		next->num_clips = 0;
 		next->clip_head = s->next;
@@ -2850,42 +2887,38 @@ w32_draw_glyph_string (struct glyph_string *s)
   s->num_clips = 0;
 }
 
-
 /* Shift display to make room for inserted glyphs.   */
 
 static void
-w32_shift_glyphs_for_insert (struct frame *f, int x, int y,
-			     int width, int height, int shift_by)
+w32_shift_glyphs_for_insert (struct frame *f, int x, int y, int width,
+			     int height, int shift_by)
 {
   HDC hdc;
 
   hdc = get_frame_dc (f);
-  BitBlt (hdc, x + shift_by, y, width, height,
-          hdc, x, y, SRCCOPY);
+  BitBlt (hdc, x + shift_by, y, width, height, hdc, x, y, SRCCOPY);
 
   release_frame_dc (f, hdc);
 }
 
-
 /* Delete N glyphs at the nominal cursor position.  Not implemented
    for X frames.  */
 
 static void
 w32_delete_glyphs (struct frame *f, register int n)
 {
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   emacs_abort ();
 }
 
-
 /* Clear entire frame.  */
 
 static void
 w32_clear_frame (struct frame *f)
 {
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   /* Clearing the frame will erase any cursor, so mark them all as no
@@ -2903,7 +2936,6 @@ w32_clear_frame (struct frame *f)
   unblock_input ();
 }
 
-\f
 /* Make audible bell.  */
 
 static void
@@ -2924,7 +2956,7 @@ w32_ring_bell (struct frame *f)
       FlashWindow (hwnd, FALSE);
     }
   else
-      w32_sys_ring_bell (f);
+    w32_sys_ring_bell (f);
 
   unblock_input ();
 }
@@ -2939,13 +2971,12 @@ w32_ring_bell (struct frame *f)
 static void
 w32_ins_del_lines (struct frame *f, int vpos, int n)
 {
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   emacs_abort ();
 }
 
-
 /* Scroll part of the display as described by RUN.  */
 
 static void
@@ -2976,7 +3007,8 @@ w32_scroll_run (struct window *w, struct run *run)
 	height = run->height;
 
       if (w32_disable_double_buffering)
-	expect_dirty = CreateRectRgn (x, y + height, x + width, bottom_y);
+	expect_dirty
+	  = CreateRectRgn (x, y + height, x + width, bottom_y);
     }
   else
     {
@@ -2993,7 +3025,8 @@ w32_scroll_run (struct window *w, struct run *run)
 
   block_input ();
 
-  /* Cursor off.  Will be switched on again in gui_update_window_end.  */
+  /* Cursor off.  Will be switched on again in gui_update_window_end.
+   */
   gui_clear_cursor (w);
   if (!w32_disable_double_buffering)
     {
@@ -3015,14 +3048,16 @@ w32_scroll_run (struct window *w, struct run *run)
       to.top = y;
       to.bottom = bottom_y;
 
-      ScrollWindowEx (hwnd, 0, to_y - from_y, &from, &to, dirty,
-		      NULL, SW_INVALIDATE);
+      ScrollWindowEx (hwnd, 0, to_y - from_y, &from, &to, dirty, NULL,
+		      SW_INVALIDATE);
 
       /* Combine this with what we expect to be dirty. This covers the
-	 case where not all of the region we expect is actually dirty.  */
+	 case where not all of the region we expect is actually dirty.
+       */
       CombineRgn (combined, dirty, expect_dirty, RGN_OR);
 
-      /* If the dirty region is not what we expected, redraw the entire frame.  */
+      /* If the dirty region is not what we expected, redraw the
+       * entire frame.  */
       if (!EqualRgn (combined, expect_dirty))
 	SET_FRAME_GARBAGED (f);
 
@@ -3032,13 +3067,10 @@ w32_scroll_run (struct window *w, struct run *run)
 
   unblock_input ();
 
-  if (w32_disable_double_buffering
-      && expect_dirty)
+  if (w32_disable_double_buffering && expect_dirty)
     DeleteObject (expect_dirty);
 }
 
-
-\f
 /***********************************************************************
 			   Exposure Events
  ***********************************************************************/
@@ -3059,12 +3091,14 @@ w32_frame_unhighlight (struct frame *f)
 
 /* The focus has changed.  Update the frames as necessary to reflect
    the new situation.  Note that we can't change the selected frame
-   here, because the Lisp code we are interrupting might become confused.
-   Each event gets marked with the frame in which it occurred, so the
-   Lisp code can tell when the switch took place by examining the events.  */
+   here, because the Lisp code we are interrupting might become
+   confused. Each event gets marked with the frame in which it
+   occurred, so the Lisp code can tell when the switch took place by
+   examining the events.  */
 
 static void
-w32_new_focus_frame (struct w32_display_info *dpyinfo, struct frame *frame)
+w32_new_focus_frame (struct w32_display_info *dpyinfo,
+		     struct frame *frame)
 {
   struct frame *old_focus = dpyinfo->w32_focus_frame;
 
@@ -3077,8 +3111,10 @@ w32_new_focus_frame (struct w32_display_info *dpyinfo, struct frame *frame)
       if (old_focus && old_focus->auto_lower)
 	w32_lower_frame (old_focus);
 
-      if (dpyinfo->w32_focus_frame && dpyinfo->w32_focus_frame->auto_raise)
-	dpyinfo->w32_pending_autoraise_frame = dpyinfo->w32_focus_frame;
+      if (dpyinfo->w32_focus_frame
+	  && dpyinfo->w32_focus_frame->auto_raise)
+	dpyinfo->w32_pending_autoraise_frame
+	  = dpyinfo->w32_focus_frame;
       else
 	dpyinfo->w32_pending_autoraise_frame = NULL;
     }
@@ -3086,24 +3122,24 @@ w32_new_focus_frame (struct w32_display_info *dpyinfo, struct frame *frame)
   w32_frame_rehighlight_1 (dpyinfo);
 }
 
-
 /* Handle FocusIn and FocusOut state changes for FRAME.
    If FRAME has focus and there exists more than one frame, puts
    a FOCUS_IN_EVENT into *BUFP.  */
 
 static void
-w32_focus_changed (int type, int state, struct w32_display_info *dpyinfo,
-		 struct frame *frame, struct input_event *bufp)
+w32_focus_changed (int type, int state,
+		   struct w32_display_info *dpyinfo,
+		   struct frame *frame, struct input_event *bufp)
 {
   if (type == WM_SETFOCUS)
     {
       if (dpyinfo->w32_focus_event_frame != frame)
-        {
-          w32_new_focus_frame (dpyinfo, frame);
-          dpyinfo->w32_focus_event_frame = frame;
-          bufp->kind = FOCUS_IN_EVENT;
-          XSETFRAME (bufp->frame_or_window, frame);
-        }
+	{
+	  w32_new_focus_frame (dpyinfo, frame);
+	  dpyinfo->w32_focus_event_frame = frame;
+	  bufp->kind = FOCUS_IN_EVENT;
+	  XSETFRAME (bufp->frame_or_window, frame);
+	}
 
       frame->output_data.x->focus_state |= state;
 
@@ -3114,43 +3150,43 @@ w32_focus_changed (int type, int state, struct w32_display_info *dpyinfo,
       frame->output_data.x->focus_state &= ~state;
 
       if (dpyinfo->w32_focus_event_frame == frame)
-        {
-          dpyinfo->w32_focus_event_frame = 0;
-          w32_new_focus_frame (dpyinfo, 0);
+	{
+	  dpyinfo->w32_focus_event_frame = 0;
+	  w32_new_focus_frame (dpyinfo, 0);
 
-          bufp->kind = FOCUS_OUT_EVENT;
-          XSETFRAME (bufp->frame_or_window, frame);
-      }
+	  bufp->kind = FOCUS_OUT_EVENT;
+	  XSETFRAME (bufp->frame_or_window, frame);
+	}
 
       /* TODO: IME focus?  */
     }
 }
 
-
-/* The focus may have changed.  Figure out if it is a real focus change,
-   by checking both FocusIn/Out and Enter/LeaveNotify events.
+/* The focus may have changed.  Figure out if it is a real focus
+   change, by checking both FocusIn/Out and Enter/LeaveNotify events.
 
    Returns FOCUS_IN_EVENT event in *BUFP. */
 
 static void
-w32_detect_focus_change (struct w32_display_info *dpyinfo, W32Msg *event,
-			 struct input_event *bufp)
+w32_detect_focus_change (struct w32_display_info *dpyinfo,
+			 W32Msg *event, struct input_event *bufp)
 {
   struct frame *frame;
 
   frame = w32_window_to_frame (dpyinfo, event->msg.hwnd);
-  if (! frame)
+  if (!frame)
     return;
 
-  /* On w32, this is only called from focus events, so no switch needed.  */
+  /* On w32, this is only called from focus events, so no switch
+   * needed.  */
   w32_focus_changed (event->msg.message,
-                     (event->msg.message == WM_KILLFOCUS ?
-                      FOCUS_IMPLICIT : FOCUS_EXPLICIT),
-                     dpyinfo, frame, bufp);
+		     (event->msg.message == WM_KILLFOCUS
+			? FOCUS_IMPLICIT
+			: FOCUS_EXPLICIT),
+		     dpyinfo, frame, bufp);
 }
 
-
-#if 0	/* unused */
+#if 0 /* unused */
 /* Handle an event saying the mouse has moved out of an Emacs frame.  */
 
 static void
@@ -3164,14 +3200,14 @@ w32_mouse_leave (struct w32_display_info *dpyinfo)
    another frame (this happens when a frame uses a surrogate
    mini-buffer frame).  Shift the highlight as appropriate.
 
-   The FRAME argument doesn't necessarily have anything to do with which
-   frame is being highlighted or un-highlighted; we only use it to find
-   the appropriate X display info.  */
+   The FRAME argument doesn't necessarily have anything to do with
+   which frame is being highlighted or un-highlighted; we only use it
+   to find the appropriate X display info.  */
 
 static void
 w32_frame_rehighlight (struct frame *frame)
 {
-  if (! FRAME_W32_P (frame))
+  if (!FRAME_W32_P (frame))
     return;
   w32_frame_rehighlight_1 (FRAME_DISPLAY_INFO (frame));
 }
@@ -3185,9 +3221,9 @@ w32_frame_rehighlight_1 (struct w32_display_info *dpyinfo)
     {
       dpyinfo->highlight_frame
 	= ((FRAMEP (FRAME_FOCUS_FRAME (dpyinfo->w32_focus_frame)))
-	   ? XFRAME (FRAME_FOCUS_FRAME (dpyinfo->w32_focus_frame))
-	   : dpyinfo->w32_focus_frame);
-      if (! FRAME_LIVE_P (dpyinfo->highlight_frame))
+	     ? XFRAME (FRAME_FOCUS_FRAME (dpyinfo->w32_focus_frame))
+	     : dpyinfo->w32_focus_frame);
+      if (!FRAME_LIVE_P (dpyinfo->highlight_frame))
 	{
 	  fset_focus_frame (dpyinfo->w32_focus_frame, Qnil);
 	  dpyinfo->highlight_frame = dpyinfo->w32_focus_frame;
@@ -3204,7 +3240,7 @@ w32_frame_rehighlight_1 (struct w32_display_info *dpyinfo)
 	w32_frame_highlight (dpyinfo->highlight_frame);
     }
 }
-\f
+
 /* Keyboard processing - modifier keys, etc. */
 
 /* Convert a keysym to its name.  */
@@ -3233,14 +3269,14 @@ codepage_for_locale (LCID locale)
     return CP_ACP;
 }
 
-\f
 /* Mouse clicks and mouse movement.  Rah.  */
 
-/* Parse a button MESSAGE. The button index is returned in PBUTTON, and
-   the state in PUP. XBUTTON provides extra information for extended mouse
-   button messages. Returns FALSE if unable to parse the message.  */
+/* Parse a button MESSAGE. The button index is returned in PBUTTON,
+   and the state in PUP. XBUTTON provides extra information for
+   extended mouse button messages. Returns FALSE if unable to parse
+   the message.  */
 BOOL
-parse_button (int message, int xbutton, int * pbutton, int * pup)
+parse_button (int message, int xbutton, int *pbutton, int *pup)
 {
   int button = 0;
   int up = 0;
@@ -3295,13 +3331,14 @@ parse_button (int message, int xbutton, int * pbutton, int * pup)
       return (FALSE);
     }
 
-  if (pup) *pup = up;
-  if (pbutton) *pbutton = button;
+  if (pup)
+    *pup = up;
+  if (pbutton)
+    *pbutton = button;
 
   return (TRUE);
 }
 
-
 /* Prepare a mouse-event in *RESULT for placement in the input queue.
 
    If the event is a button press, then note that we have grabbed
@@ -3309,23 +3346,21 @@ parse_button (int message, int xbutton, int * pbutton, int * pup)
 
 static Lisp_Object
 w32_construct_mouse_click (struct input_event *result, W32Msg *msg,
-                           struct frame *f)
+			   struct frame *f)
 {
   int button = 0;
   int up = 0;
 
-  parse_button (msg->msg.message, HIWORD (msg->msg.wParam),
-		&button, &up);
+  parse_button (msg->msg.message, HIWORD (msg->msg.wParam), &button,
+		&up);
 
   /* Make the event type NO_EVENT; we'll change that when we decide
      otherwise.  */
   result->kind = MOUSE_CLICK_EVENT;
   result->code = button;
   result->timestamp = msg->msg.time;
-  result->modifiers = (msg->dwModifiers
-		       | (up
-			  ? up_modifier
-			  : down_modifier));
+  result->modifiers
+    = (msg->dwModifiers | (up ? up_modifier : down_modifier));
 
   XSETINT (result->x, LOWORD (msg->msg.lParam));
   XSETINT (result->y, HIWORD (msg->msg.lParam));
@@ -3336,14 +3371,15 @@ w32_construct_mouse_click (struct input_event *result, W32Msg *msg,
 
 static Lisp_Object
 w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
-                           struct frame *f)
+			   struct frame *f)
 {
   POINT p;
   int delta;
   static int sum_delta_y = 0;
 
-  result->kind = msg->msg.message == WM_MOUSEHWHEEL ? HORIZ_WHEEL_EVENT
-                                                    : WHEEL_EVENT;
+  result->kind = msg->msg.message == WM_MOUSEHWHEEL
+		   ? HORIZ_WHEEL_EVENT
+		   : WHEEL_EVENT;
   result->code = 0;
   result->timestamp = msg->msg.time;
   result->arg = Qnil;
@@ -3376,20 +3412,22 @@ w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
 	 the height of the window under the mouse pointer.  */
       if (w32_wheel_scroll_lines == UINT_MAX)
 	{
-	  Lisp_Object window = window_from_coordinates (f, p.x, p.y, NULL,
-							false, false, false);
+	  Lisp_Object window
+	    = window_from_coordinates (f, p.x, p.y, NULL, false,
+				       false, false);
 	  if (!WINDOWP (window))
 	    {
 	      result->kind = NO_EVENT;
 	      return Qnil;
 	    }
 	  scroll_unit = XWINDOW (window)->pixel_height;
-	  if (scroll_unit < 1)	/* paranoia */
+	  if (scroll_unit < 1) /* paranoia */
 	    scroll_unit = 1;
 	}
 
-      /* If mwheel-coalesce-scroll-events is non-nil, report a wheel event
-	 only when we have accumulated enough delta's for WHEEL_DELTA.  */
+      /* If mwheel-coalesce-scroll-events is non-nil, report a wheel
+	 event only when we have accumulated enough delta's for
+	 WHEEL_DELTA.  */
       if (mwheel_coalesce_scroll_events)
 	{
 	  /* If the user changed the direction, reset the accumulated
@@ -3397,31 +3435,32 @@ w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
 	  if ((delta > 0) != (sum_delta_y > 0))
 	    sum_delta_y = 0;
 	  sum_delta_y += delta;
-	  /* https://docs.microsoft.com/en-us/previous-versions/ms997498(v=msdn.10) */
+	  /* https://docs.microsoft.com/en-us/previous-versions/ms997498(v=msdn.10)
+	   */
 	  if (eabs (sum_delta_y) < WHEEL_DELTA)
 	    {
 	      result->kind = NO_EVENT;
 	      return Qnil;
 	    }
-	  value_to_report =
-	    ((double)FRAME_LINE_HEIGHT (f) * scroll_unit)
-	    / ((double)WHEEL_DELTA / sum_delta_y);
+	  value_to_report
+	    = ((double) FRAME_LINE_HEIGHT (f) * scroll_unit)
+	      / ((double) WHEEL_DELTA / sum_delta_y);
 	  sum_delta_y = 0;
 	}
       else
-	value_to_report =
-	    ((double)FRAME_LINE_HEIGHT (f) * scroll_unit)
-	    / ((double)WHEEL_DELTA / delta);
+	value_to_report
+	  = ((double) FRAME_LINE_HEIGHT (f) * scroll_unit)
+	    / ((double) WHEEL_DELTA / delta);
       nlines = value_to_report / FRAME_LINE_HEIGHT (f) + 0.5;
-      result->arg = list3 (make_fixnum (eabs (nlines)),
-			   make_float (0.0),
-			   make_float (value_to_report));
+      result->arg
+	= list3 (make_fixnum (eabs (nlines)), make_float (0.0),
+		 make_float (value_to_report));
     }
 
   /* The up and down modifiers indicate if the wheel was rotated up or
      down based on WHEEL_DELTA value.  */
   result->modifiers = (msg->dwModifiers
-                       | ((delta < 0 ) ? down_modifier : up_modifier));
+		       | ((delta < 0) ? down_modifier : up_modifier));
 
   /* For the case that F's w32 window is not msg->msg.hwnd.  */
   ScreenToClient (FRAME_W32_WINDOW (f), &p);
@@ -3433,7 +3472,7 @@ w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
 
 static Lisp_Object
 w32_construct_drag_n_drop (struct input_event *result, W32Msg *msg,
-                           struct frame *f)
+			   struct frame *f)
 {
   Lisp_Object files;
   Lisp_Object frame;
@@ -3483,7 +3522,8 @@ w32_construct_drag_n_drop (struct input_event *result, W32Msg *msg,
 	  files = Fcons (from_unicode_buffer (name_w), files);
 #else
 	  filename_from_utf16 (name_w, file);
-	  files = Fcons (DECODE_FILE (build_unibyte_string (file)), files);
+	  files = Fcons (DECODE_FILE (build_unibyte_string (file)),
+			 files);
 #endif /* NTGUI_UNICODE */
 	}
 #ifndef NTGUI_UNICODE
@@ -3493,7 +3533,8 @@ w32_construct_drag_n_drop (struct input_event *result, W32Msg *msg,
 	  if (DragQueryFileA (hdrop, i, name_a, MAX_PATH) == 0)
 	    continue;
 	  filename_from_ansi (name_a, file);
-	  files = Fcons (DECODE_FILE (build_unibyte_string (file)), files);
+	  files = Fcons (DECODE_FILE (build_unibyte_string (file)),
+			 files);
 	}
 #endif
     }
@@ -3506,7 +3547,6 @@ w32_construct_drag_n_drop (struct input_event *result, W32Msg *msg,
   return Qnil;
 }
 
-\f
 #if HAVE_W32NOTIFY
 
 /* File event notifications (see w32notify.c).  */
@@ -3536,7 +3576,7 @@ w32_lispy_file_action (DWORD action)
       break;
     default:
       {
-	char buf[sizeof(unknown_fmt) - 1 + INT_STRLEN_BOUND (DWORD)];
+	char buf[sizeof (unknown_fmt) - 1 + INT_STRLEN_BOUND (DWORD)];
 
 	sprintf (buf, unknown_fmt, action);
 	retval = intern (buf);
@@ -3547,13 +3587,13 @@ w32_lispy_file_action (DWORD action)
   return retval;
 }
 
-#ifdef WINDOWSNT
+# ifdef WINDOWSNT
 /* Put file notifications into the Emacs input event queue.  This
    function runs when the WM_EMACS_FILENOTIFY message arrives from a
    watcher thread.  */
 static void
 w32_queue_notifications (struct input_event *event, W32Msg *msg,
-                         struct frame *f, int *evcount)
+			 struct frame *f, int *evcount)
 {
   struct notifications_set *ns = NULL;
   Lisp_Object frame;
@@ -3582,37 +3622,38 @@ w32_queue_notifications (struct input_event *event, W32Msg *msg,
 	}
       else
 	done = 1;
-      leave_crit();
+      leave_crit ();
 
       if (ns)
 	{
 	  BYTE *p = ns->notifications;
-	  FILE_NOTIFY_INFORMATION *fni = (PFILE_NOTIFY_INFORMATION)p;
+	  FILE_NOTIFY_INFORMATION *fni = (PFILE_NOTIFY_INFORMATION) p;
 	  const DWORD min_size
-	    = offsetof (FILE_NOTIFY_INFORMATION, FileName) + sizeof(wchar_t);
+	    = offsetof (FILE_NOTIFY_INFORMATION, FileName)
+	      + sizeof (wchar_t);
 	  DWORD info_size = ns->size;
 	  Lisp_Object cs = Qutf_16le;
 	  Lisp_Object obj = w32_get_watch_object (ns->desc);
 
 	  /* notifications size could be zero when the buffer of
 	     notifications overflowed on the OS level, or when the
-	     directory being watched was itself deleted.  Do nothing in
-	     that case.  */
-	  if (info_size
-	      && !NILP (obj) && CONSP (obj))
+	     directory being watched was itself deleted.  Do nothing
+	     in that case.  */
+	  if (info_size && !NILP (obj) && CONSP (obj))
 	    {
 	      Lisp_Object callback = XCDR (obj);
 
 	      while (info_size >= min_size)
 		{
 		  Lisp_Object utf_16_fn
-		    = make_unibyte_string ((char *)fni->FileName,
+		    = make_unibyte_string ((char *) fni->FileName,
 					   fni->FileNameLength);
 		  /* Note: mule-conf is preloaded, so utf-16le must
 		     already be defined at this point.  */
 		  Lisp_Object fname
 		    = code_convert_string_norecord (utf_16_fn, cs, 0);
-		  Lisp_Object action = w32_lispy_file_action (fni->Action);
+		  Lisp_Object action
+		    = w32_lispy_file_action (fni->Action);
 
 		  event->kind = FILE_NOTIFY_EVENT;
 		  event->timestamp = msg->msg.time;
@@ -3625,7 +3666,7 @@ w32_queue_notifications (struct input_event *event, W32Msg *msg,
 		  if (!fni->NextEntryOffset)
 		    break;
 		  p += fni->NextEntryOffset;
-		  fni = (PFILE_NOTIFY_INFORMATION)p;
+		  fni = (PFILE_NOTIFY_INFORMATION) p;
 		  info_size -= fni->NextEntryOffset;
 		}
 	    }
@@ -3634,20 +3675,21 @@ w32_queue_notifications (struct input_event *event, W32Msg *msg,
 	  xfree (ns);
 	}
     }
-  /* We've stuffed all the events ourselves, so w32_read_socket shouldn't.  */
+  /* We've stuffed all the events ourselves, so w32_read_socket
+   * shouldn't.  */
   event->kind = NO_EVENT;
 }
-#endif	/* WINDOWSNT */
+# endif /* WINDOWSNT */
 #endif	/* HAVE_W32NOTIFY */
 
-\f
 /* Function to report a mouse movement to the mainstream Emacs code.
    The input handler calls this.
 
    We have received a mouse movement event, which is given in *event.
    If the mouse is over a different glyph than it was last time, tell
    the mainstream emacs code by setting mouse_moved.  If not, ask for
-   another motion event, so we can check again the next time it moves.  */
+   another motion event, so we can check again the next time it moves.
+ */
 
 static int
 w32_note_mouse_movement (struct frame *frame, MSG *msg)
@@ -3675,11 +3717,12 @@ w32_note_mouse_movement (struct frame *frame, MSG *msg)
       return 1;
     }
 
-  /* Has the mouse moved off the glyph it was on at the last sighting?  */
+  /* Has the mouse moved off the glyph it was on at the last sighting?
+   */
   r = &dpyinfo->last_mouse_glyph;
-  if (frame != dpyinfo->last_mouse_glyph_frame
-      || mouse_x < r->left || mouse_x >= r->right
-      || mouse_y < r->top  || mouse_y >= r->bottom)
+  if (frame != dpyinfo->last_mouse_glyph_frame || mouse_x < r->left
+      || mouse_x >= r->right || mouse_y < r->top
+      || mouse_y >= r->bottom)
     {
       frame->mouse_moved = true;
       dpyinfo->last_mouse_scroll_bar = NULL;
@@ -3696,20 +3739,19 @@ w32_note_mouse_movement (struct frame *frame, MSG *msg)
   return 0;
 }
 
-\f
 /************************************************************************
 			      Mouse Face
  ************************************************************************/
 
 static struct scroll_bar *w32_window_to_scroll_bar (Window, int);
-static void w32_scroll_bar_report_motion (struct frame **, Lisp_Object *,
-                                          enum scroll_bar_part *,
-                                          Lisp_Object *, Lisp_Object *,
-                                          Time *);
-static void w32_horizontal_scroll_bar_report_motion (struct frame **, Lisp_Object *,
-                                                     enum scroll_bar_part *,
-                                                     Lisp_Object *, Lisp_Object *,
-                                                     Time *);
+static void w32_scroll_bar_report_motion (struct frame **,
+					  Lisp_Object *,
+					  enum scroll_bar_part *,
+					  Lisp_Object *,
+					  Lisp_Object *, Time *);
+static void w32_horizontal_scroll_bar_report_motion (
+  struct frame **, Lisp_Object *, enum scroll_bar_part *,
+  Lisp_Object *, Lisp_Object *, Time *);
 static void
 w32_define_cursor (Window window, Emacs_Cursor cursor)
 {
@@ -3719,27 +3761,29 @@ w32_define_cursor (Window window, Emacs_Cursor cursor)
 /* Return the current position of the mouse.
    *fp should be a frame which indicates which display to ask about.
 
-   If the mouse movement started in a scroll bar, set *fp, *bar_window,
-   and *part to the frame, window, and scroll bar part that the mouse
-   is over.  Set *x and *y to the portion and whole of the mouse's
-   position on the scroll bar.
+   If the mouse movement started in a scroll bar, set *fp,
+   *bar_window, and *part to the frame, window, and scroll bar part
+   that the mouse is over.  Set *x and *y to the portion and whole of
+   the mouse's position on the scroll bar.
 
    If the mouse movement started elsewhere, set *fp to the frame the
-   mouse is on, *bar_window to nil, and *x and *y to the character cell
-   the mouse is over.
+   mouse is on, *bar_window to nil, and *x and *y to the character
+   cell the mouse is over.
 
    Set *time to the server time-stamp for the time at which the mouse
    was at this position.
 
-   Don't store anything if we don't have a valid set of values to report.
+   Don't store anything if we don't have a valid set of values to
+   report.
 
    This clears the mouse_moved flag, so we can wait for the next mouse
    movement.  */
 
 static void
-w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
-		    enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y,
-		    Time *time)
+w32_mouse_position (struct frame **fp, int insist,
+		    Lisp_Object *bar_window,
+		    enum scroll_bar_part *part, Lisp_Object *x,
+		    Lisp_Object *y, Time *time)
 {
   struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp);
 
@@ -3750,9 +3794,11 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
       struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar;
 
       if (bar->horizontal)
-	w32_horizontal_scroll_bar_report_motion (fp, bar_window, part, x, y, time);
+	w32_horizontal_scroll_bar_report_motion (fp, bar_window, part,
+						 x, y, time);
       else
-	w32_scroll_bar_report_motion (fp, bar_window, part, x, y, time);
+	w32_scroll_bar_report_motion (fp, bar_window, part, x, y,
+				      time);
     }
   else
     {
@@ -3760,9 +3806,10 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
       Lisp_Object frame, tail;
       struct frame *f1 = NULL;
 
-      /* Clear the mouse-moved flag for every frame on this display.  */
+      /* Clear the mouse-moved flag for every frame on this display.
+       */
       FOR_EACH_FRAME (tail, frame)
-	XFRAME (frame)->mouse_moved = false;
+      XFRAME (frame)->mouse_moved = false;
 
       dpyinfo->last_mouse_scroll_bar = NULL;
 
@@ -3790,10 +3837,12 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
 
 		  if (cwfp)
 		    {
-		      struct frame *f2 = w32_window_to_frame (dpyinfo, cwfp);
+		      struct frame *f2
+			= w32_window_to_frame (dpyinfo, cwfp);
 
-		      /* If a child window was found, make sure that its
-			 frame is a child frame (Bug#26615, maybe).  */
+		      /* If a child window was found, make sure that
+			 its frame is a child frame (Bug#26615,
+			 maybe).  */
 		      if (f2 && FRAME_PARENT_FRAME (f2))
 			f1 = f2;
 		    }
@@ -3803,9 +3852,10 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
 
       if (!f1 || FRAME_TOOLTIP_P (f1))
 	/* Don't use a tooltip frame.  */
-	f1 = ((EQ (track_mouse, Qdropping) && gui_mouse_grabbed (dpyinfo))
-	      ? dpyinfo->last_mouse_frame
-	      : NULL);
+	f1 = ((EQ (track_mouse, Qdropping)
+	       && gui_mouse_grabbed (dpyinfo))
+		? dpyinfo->last_mouse_frame
+		: NULL);
 
       /* If not, is it one of our scroll bars?  */
       if (!f1)
@@ -3832,7 +3882,8 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
 
 	  dpyinfo = FRAME_DISPLAY_INFO (f1);
 	  ScreenToClient (FRAME_W32_WINDOW (f1), &pt);
-	  remember_mouse_glyph (f1, pt.x, pt.y, &dpyinfo->last_mouse_glyph);
+	  remember_mouse_glyph (f1, pt.x, pt.y,
+				&dpyinfo->last_mouse_glyph);
 	  dpyinfo->last_mouse_glyph_frame = f1;
 
 	  *bar_window = Qnil;
@@ -3847,7 +3898,6 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
   unblock_input ();
 }
 
-\f
 /***********************************************************************
 			       Tab-bars
  ***********************************************************************/
@@ -3857,7 +3907,8 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
    or ButtonRelease.  */
 
 static Lisp_Object
-w32_handle_tab_bar_click (struct frame *f, struct input_event *button_event)
+w32_handle_tab_bar_click (struct frame *f,
+			  struct input_event *button_event)
 {
   int x = XFIXNAT (button_event->x);
   int y = XFIXNAT (button_event->y);
@@ -3866,11 +3917,10 @@ w32_handle_tab_bar_click (struct frame *f, struct input_event *button_event)
     return handle_tab_bar_click (f, x, y, 1, 0);
   else
     return handle_tab_bar_click (f, x, y, 0,
-				 button_event->modifiers & ~up_modifier);
+				 button_event->modifiers
+				   & ~up_modifier);
 }
 
-
-\f
 /***********************************************************************
 			       Tool-bars
  ***********************************************************************/
@@ -3880,7 +3930,8 @@ w32_handle_tab_bar_click (struct frame *f, struct input_event *button_event)
    or ButtonRelease.  */
 
 static void
-w32_handle_tool_bar_click (struct frame *f, struct input_event *button_event)
+w32_handle_tool_bar_click (struct frame *f,
+			   struct input_event *button_event)
 {
   int x = XFIXNAT (button_event->x);
   int y = XFIXNAT (button_event->y);
@@ -3892,8 +3943,6 @@ w32_handle_tool_bar_click (struct frame *f, struct input_event *button_event)
 			   button_event->modifiers & ~up_modifier);
 }
 
-
-\f
 /***********************************************************************
 			       Scroll bars
  ***********************************************************************/
@@ -3910,44 +3959,42 @@ w32_window_to_scroll_bar (Window window_id, int type)
   Lisp_Object tail, frame;
 
   FOR_EACH_FRAME (tail, frame)
-    {
-      Lisp_Object bar, condemned;
-
-      /* Scan this frame's scroll bar list for a scroll bar with the
-	 right window ID.  */
-      condemned = FRAME_CONDEMNED_SCROLL_BARS (XFRAME (frame));
-      for (bar = FRAME_SCROLL_BARS (XFRAME (frame));
-	   /* This trick allows us to search both the ordinary and
-	      condemned scroll bar lists with one loop.  */
-	   ! NILP (bar) || (bar = condemned,
-			       condemned = Qnil,
-			       ! NILP (bar));
-	   bar = XSCROLL_BAR (bar)->next)
-	if (SCROLL_BAR_W32_WINDOW (XSCROLL_BAR (bar)) == window_id
-	    && (type == 2
-		|| (type == 1 && XSCROLL_BAR (bar)->horizontal)
-		|| (type == 0 && !XSCROLL_BAR (bar)->horizontal)))
-	  return XSCROLL_BAR (bar);
-    }
+  {
+    Lisp_Object bar, condemned;
+
+    /* Scan this frame's scroll bar list for a scroll bar with the
+       right window ID.  */
+    condemned = FRAME_CONDEMNED_SCROLL_BARS (XFRAME (frame));
+    for (bar = FRAME_SCROLL_BARS (XFRAME (frame));
+	 /* This trick allows us to search both the ordinary and
+	    condemned scroll bar lists with one loop.  */
+	 !NILP (bar)
+	 || (bar = condemned, condemned = Qnil, !NILP (bar));
+	 bar = XSCROLL_BAR (bar)->next)
+      if (SCROLL_BAR_W32_WINDOW (XSCROLL_BAR (bar)) == window_id
+	  && (type == 2
+	      || (type == 1 && XSCROLL_BAR (bar)->horizontal)
+	      || (type == 0 && !XSCROLL_BAR (bar)->horizontal)))
+	return XSCROLL_BAR (bar);
+  }
 
   return 0;
 }
 
-
-\f
-/* Set the thumb size and position of vertical scroll bar BAR.  We are currently
-   displaying PORTION out of a whole WHOLE, and our position POSITION.  */
+/* Set the thumb size and position of vertical scroll bar BAR.  We are
+   currently displaying PORTION out of a whole WHOLE, and our position
+   POSITION.  */
 
 static void
-w32_set_scroll_bar_thumb (struct scroll_bar *bar,
-			  int portion, int position, int whole)
+w32_set_scroll_bar_thumb (struct scroll_bar *bar, int portion,
+			  int position, int whole)
 {
   Window w = SCROLL_BAR_W32_WINDOW (bar);
   /* We use the whole scroll-bar height in the calculations below, to
      avoid strange effects like scrolling backwards when just clicking
      on the handle (without moving it).  */
   double range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height)
-                 + VERTICAL_SCROLL_BAR_MIN_HANDLE;
+		 + VERTICAL_SCROLL_BAR_MIN_HANDLE;
   int sb_page, sb_pos;
   BOOL draggingp = bar->dragging ? TRUE : FALSE;
   SCROLLINFO si;
@@ -3976,8 +4023,8 @@ w32_set_scroll_bar_thumb (struct scroll_bar *bar,
   if (whole)
     {
       /* Position scroll bar at rock bottom if the bottom of the
-         buffer is visible. This avoids shrinking the thumb away
-         to nothing if it is held at the bottom of the buffer.  */
+	 buffer is visible. This avoids shrinking the thumb away
+	 to nothing if it is held at the bottom of the buffer.  */
       if (position + portion >= whole && !draggingp)
 	{
 	  sb_page = range * (whole - position) / whole;
@@ -3986,7 +4033,8 @@ w32_set_scroll_bar_thumb (struct scroll_bar *bar,
       else
 	{
 	  sb_pos = position * range / whole;
-	  sb_page = (min (portion, (whole - position)) * range) / whole;
+	  sb_page
+	    = (min (portion, (whole - position)) * range) / whole;
 	}
     }
   else
@@ -4009,12 +4057,14 @@ w32_set_scroll_bar_thumb (struct scroll_bar *bar,
   unblock_input ();
 }
 
-/* Set the thumb size and position of horizontal scroll bar BAR.  We are currently
-   displaying PORTION out of a whole WHOLE, and our position POSITION.  */
+/* Set the thumb size and position of horizontal scroll bar BAR.  We
+   are currently displaying PORTION out of a whole WHOLE, and our
+   position POSITION.  */
 
 static void
 w32_set_horizontal_scroll_bar_thumb (struct scroll_bar *bar,
-				     int portion, int position, int whole)
+				     int portion, int position,
+				     int whole)
 {
   Window w = SCROLL_BAR_W32_WINDOW (bar);
   SCROLLINFO si;
@@ -4025,8 +4075,8 @@ w32_set_horizontal_scroll_bar_thumb (struct scroll_bar *bar,
   si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
   si.nMin = 0;
   si.nMax = whole;
-  /* Allow nPage to be one larger than nPos so we don't allow the scrolling
-     of an already fully visible buffer.  */
+  /* Allow nPage to be one larger than nPos so we don't allow the
+     scrolling of an already fully visible buffer.  */
   si.nPage = min (portion, si.nMax) + 1;
   si.nPos = min (position, si.nMax);
   SetScrollInfo (w, SB_CTL, &si, TRUE);
@@ -4034,13 +4084,12 @@ w32_set_horizontal_scroll_bar_thumb (struct scroll_bar *bar,
   unblock_input ();
 }
 
-\f
 /************************************************************************
 			 Scroll bars, general
  ************************************************************************/
 
 static HWND
-my_create_vscrollbar (struct frame * f, struct scroll_bar * bar)
+my_create_vscrollbar (struct frame *f, struct scroll_bar *bar)
 {
   return (HWND) SendMessage (FRAME_W32_WINDOW (f),
 			     WM_EMACS_CREATEVSCROLLBAR, (WPARAM) f,
@@ -4048,7 +4097,7 @@ my_create_vscrollbar (struct frame * f, struct scroll_bar * bar)
 }
 
 static HWND
-my_create_hscrollbar (struct frame * f, struct scroll_bar * bar)
+my_create_hscrollbar (struct frame *f, struct scroll_bar *bar)
 {
   return (HWND) SendMessage (FRAME_W32_WINDOW (f),
 			     WM_EMACS_CREATEHSCROLLBAR, (WPARAM) f,
@@ -4061,16 +4110,17 @@ my_create_hscrollbar (struct frame * f, struct scroll_bar * bar)
 my_show_window (struct frame *f, HWND hwnd, int how)
 {
 #ifndef ATTACH_THREADS
-  return SendMessageTimeout (FRAME_W32_WINDOW (f), WM_EMACS_SHOWWINDOW,
-			     (WPARAM) hwnd, (LPARAM) how, 0, 6000, NULL);
+  return SendMessageTimeout (FRAME_W32_WINDOW (f),
+			     WM_EMACS_SHOWWINDOW, (WPARAM) hwnd,
+			     (LPARAM) how, 0, 6000, NULL);
 #else
   return ShowWindow (hwnd, how);
 #endif
 }
 
 static void
-my_set_window_pos (HWND hwnd, HWND hwndAfter,
-		   int x, int y, int cx, int cy, UINT flags)
+my_set_window_pos (HWND hwnd, HWND hwndAfter, int x, int y, int cx,
+		   int cy, UINT flags)
 {
 #ifndef ATTACH_THREADS
   WINDOWPOS pos;
@@ -4103,9 +4153,8 @@ my_set_foreground_window (HWND hwnd)
 		      0, 6000, NULL);
 }
 
-
 static void
-my_destroy_window (struct frame * f, HWND hwnd)
+my_destroy_window (struct frame *f, HWND hwnd)
 {
   SendMessageTimeout (FRAME_W32_WINDOW (f), WM_EMACS_DESTROYWINDOW,
 		      (WPARAM) hwnd, 0, 0, 6000, NULL);
@@ -4114,8 +4163,8 @@ my_destroy_window (struct frame * f, HWND hwnd)
 static void
 my_bring_window_to_top (HWND hwnd)
 {
-  SendMessageTimeout (hwnd, WM_EMACS_BRINGTOTOP, (WPARAM) hwnd, 0,
-		      0, 6000, NULL);
+  SendMessageTimeout (hwnd, WM_EMACS_BRINGTOTOP, (WPARAM) hwnd, 0, 0,
+		      6000, NULL);
 }
 
 /* Create a scroll bar and return the scroll bar vector for it.  W is
@@ -4124,14 +4173,15 @@ my_bring_window_to_top (HWND hwnd)
    scroll bar. */
 
 static struct scroll_bar *
-w32_scroll_bar_create (struct window *w, int left, int top,
-                       int width, int height, bool horizontal)
+w32_scroll_bar_create (struct window *w, int left, int top, int width,
+		       int height, bool horizontal)
 {
   struct frame *f = XFRAME (WINDOW_FRAME (w));
   HWND hwnd;
   SCROLLINFO si;
   struct scroll_bar *bar
-    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, w32_widget_high, PVEC_OTHER);
+    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, w32_widget_high,
+			     PVEC_OTHER);
   Lisp_Object barobj;
 
   block_input ();
@@ -4146,7 +4196,8 @@ w32_scroll_bar_create (struct window *w, int left, int top,
   bar->dragging = 0;
   bar->horizontal = horizontal;
 
-  /* Requires geometry to be set before call to create the real window */
+  /* Requires geometry to be set before call to create the real window
+   */
 
   if (horizontal)
     hwnd = my_create_hscrollbar (f, bar);
@@ -4158,10 +4209,10 @@ w32_scroll_bar_create (struct window *w, int left, int top,
   si.nMin = 0;
   if (horizontal)
     si.nMax = HORIZONTAL_SCROLL_BAR_LEFT_RANGE (f, width)
-      + HORIZONTAL_SCROLL_BAR_MIN_HANDLE;
+	      + HORIZONTAL_SCROLL_BAR_MIN_HANDLE;
   else
     si.nMax = VERTICAL_SCROLL_BAR_TOP_RANGE (f, height)
-      + VERTICAL_SCROLL_BAR_MIN_HANDLE;
+	      + VERTICAL_SCROLL_BAR_MIN_HANDLE;
   si.nPage = si.nMax;
   si.nPos = 0;
 
@@ -4174,7 +4225,7 @@ w32_scroll_bar_create (struct window *w, int left, int top,
   bar->prev = Qnil;
   XSETVECTOR (barobj, bar);
   fset_scroll_bars (f, barobj);
-  if (! NILP (bar->next))
+  if (!NILP (bar->next))
     XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar);
 
   unblock_input ();
@@ -4182,7 +4233,6 @@ w32_scroll_bar_create (struct window *w, int left, int top,
   return bar;
 }
 
-
 /* Destroy scroll bar BAR, and set its Emacs window's scroll bar to
    nil. */
 
@@ -4205,13 +4255,13 @@ w32_scroll_bar_remove (struct scroll_bar *bar)
   unblock_input ();
 }
 
-/* Set the handle of the vertical scroll bar for WINDOW to indicate that
-   we are displaying PORTION characters out of a total of WHOLE
+/* Set the handle of the vertical scroll bar for WINDOW to indicate
+   that we are displaying PORTION characters out of a total of WHOLE
    characters, starting at POSITION.  If WINDOW has no vertical scroll
    bar, create one.  */
 static void
-w32_set_vertical_scroll_bar (struct window *w,
-			     int portion, int whole, int position)
+w32_set_vertical_scroll_bar (struct window *w, int portion, int whole,
+			     int position)
 {
   struct frame *f = XFRAME (w->frame);
   Lisp_Object barobj;
@@ -4221,7 +4271,7 @@ w32_set_vertical_scroll_bar (struct window *w,
 
   /* Get window dimensions.  */
   window_box (w, ANY_AREA, 0, &window_y, 0, &window_height);
-  top  = window_y;
+  top = window_y;
   height = window_height;
 
   /* Compute the left edge and the width of the scroll bar area.  */
@@ -4241,7 +4291,8 @@ w32_set_vertical_scroll_bar (struct window *w,
 	}
       unblock_input ();
 
-      bar = w32_scroll_bar_create (w, left, top, width, height, false);
+      bar
+	= w32_scroll_bar_create (w, left, top, width, height, false);
     }
   else
     {
@@ -4252,57 +4303,58 @@ w32_set_vertical_scroll_bar (struct window *w,
       hwnd = SCROLL_BAR_W32_WINDOW (bar);
 
       /* If already correctly positioned, do nothing.  */
-      if (bar->left == left
-	  && bar->top == top
-	  && bar->width == width
+      if (bar->left == left && bar->top == top && bar->width == width
 	  && bar->height == height)
-        {
-          /* Redraw after clear_frame. */
-          if (!my_show_window (f, hwnd, SW_NORMAL))
-            InvalidateRect (hwnd, NULL, FALSE);
-        }
+	{
+	  /* Redraw after clear_frame. */
+	  if (!my_show_window (f, hwnd, SW_NORMAL))
+	    InvalidateRect (hwnd, NULL, FALSE);
+	}
       else
-        {
-          HDC hdc;
+	{
+	  HDC hdc;
 	  SCROLLINFO si;
 
-          block_input ();
+	  block_input ();
 	  if (width && height)
 	    {
 	      hdc = get_frame_dc (f);
-	      /* Since Windows scroll bars are smaller than the space reserved
-		 for them on the frame, we have to clear "under" them.  */
+	      /* Since Windows scroll bars are smaller than the space
+		 reserved for them on the frame, we have to clear
+		 "under" them.  */
 	      w32_clear_area (f, hdc, left, top, width, height);
 	      release_frame_dc (f, hdc);
 	      w32_clear_under_internal_border (f);
 	    }
-          /* Make sure scroll bar is "visible" before moving, to ensure the
-             area of the parent window now exposed will be refreshed.  */
-          my_show_window (f, hwnd, SW_HIDE);
-/**           MoveWindow (hwnd, left, top, width, max (height, 1), TRUE); **/
+	  /* Make sure scroll bar is "visible" before moving, to
+	     ensure the area of the parent window now exposed will be
+	     refreshed.  */
+	  my_show_window (f, hwnd, SW_HIDE);
+	  /**           MoveWindow (hwnd, left, top, width, max
+	   * (height, 1), TRUE); **/
 	  /* Try to not draw over child frames.  */
-	  SetWindowPos (hwnd, HWND_BOTTOM, left, top, width, max (height, 1),
-                        SWP_FRAMECHANGED);
+	  SetWindowPos (hwnd, HWND_BOTTOM, left, top, width,
+			max (height, 1), SWP_FRAMECHANGED);
 
 	  si.cbSize = sizeof (si);
 	  si.fMask = SIF_RANGE;
 	  si.nMin = 0;
 	  si.nMax = VERTICAL_SCROLL_BAR_TOP_RANGE (f, height)
-	    + VERTICAL_SCROLL_BAR_MIN_HANDLE;
+		    + VERTICAL_SCROLL_BAR_MIN_HANDLE;
 
 	  SetScrollInfo (hwnd, SB_CTL, &si, FALSE);
 
-          my_show_window (f, hwnd, SW_NORMAL);
-          /* InvalidateRect (w, NULL, FALSE);  */
+	  my_show_window (f, hwnd, SW_NORMAL);
+	  /* InvalidateRect (w, NULL, FALSE);  */
 
-          /* Remember new settings.  */
-          bar->left = left;
-          bar->top = top;
-          bar->width = width;
-          bar->height = height;
+	  /* Remember new settings.  */
+	  bar->left = left;
+	  bar->top = top;
+	  bar->width = width;
+	  bar->height = height;
 
-          unblock_input ();
-        }
+	  unblock_input ();
+	}
     }
   w32_set_scroll_bar_thumb (bar, portion, position, whole);
   XSETVECTOR (barobj, bar);
@@ -4311,11 +4363,11 @@ w32_set_vertical_scroll_bar (struct window *w,
 
 /* Set the handle of the horizontal scroll bar for WINDOW to indicate
    that we are displaying PORTION characters out of a total of WHOLE
-   characters, starting at POSITION.  If WINDOW has no horizontal scroll
-   bar, create one.  */
+   characters, starting at POSITION.  If WINDOW has no horizontal
+   scroll bar, create one.  */
 static void
-w32_set_horizontal_scroll_bar (struct window *w,
-			       int portion, int whole, int position)
+w32_set_horizontal_scroll_bar (struct window *w, int portion,
+			       int whole, int position)
 {
   struct frame *f = XFRAME (w->frame);
   Lisp_Object barobj;
@@ -4323,11 +4375,12 @@ w32_set_horizontal_scroll_bar (struct window *w,
   int top, height, left, width;
   int window_x, window_width;
   int clear_left = WINDOW_LEFT_EDGE_X (w);
-  int clear_width = WINDOW_PIXEL_WIDTH (w) - WINDOW_RIGHT_DIVIDER_WIDTH (w);
+  int clear_width
+    = WINDOW_PIXEL_WIDTH (w) - WINDOW_RIGHT_DIVIDER_WIDTH (w);
 
   /* Get window dimensions.  */
   window_box (w, ANY_AREA, &window_x, 0, &window_width, 0);
-  left  = window_x;
+  left = window_x;
   height = WINDOW_SCROLL_BAR_AREA_HEIGHT (w);
   width = window_width;
   top = WINDOW_SCROLL_BAR_AREA_Y (w);
@@ -4340,7 +4393,8 @@ w32_set_horizontal_scroll_bar (struct window *w,
       if (width > 0 && height > 0)
 	{
 	  hdc = get_frame_dc (f);
-	  w32_clear_area (f, hdc, clear_left, top, clear_width, height);
+	  w32_clear_area (f, hdc, clear_left, top, clear_width,
+			  height);
 	  release_frame_dc (f, hdc);
 	}
       unblock_input ();
@@ -4356,35 +4410,39 @@ w32_set_horizontal_scroll_bar (struct window *w,
       hwnd = SCROLL_BAR_W32_WINDOW (bar);
 
       /* If already correctly positioned, do nothing.  */
-      if (bar->left == left && bar->top == top
-	  && bar->width == width && bar->height == height)
-        {
-          /* Redraw after clear_frame. */
-          if (!my_show_window (f, hwnd, SW_NORMAL))
-            InvalidateRect (hwnd, NULL, FALSE);
-        }
+      if (bar->left == left && bar->top == top && bar->width == width
+	  && bar->height == height)
+	{
+	  /* Redraw after clear_frame. */
+	  if (!my_show_window (f, hwnd, SW_NORMAL))
+	    InvalidateRect (hwnd, NULL, FALSE);
+	}
       else
-        {
-          HDC hdc;
+	{
+	  HDC hdc;
 	  SCROLLINFO si;
 
-          block_input ();
+	  block_input ();
 	  if (width && height)
 	    {
 	      hdc = get_frame_dc (f);
-	      /* Since Windows scroll bars are smaller than the space reserved
-		 for them on the frame, we have to clear "under" them.  */
-	      w32_clear_area (f, hdc, clear_left, top, clear_width, height);
+	      /* Since Windows scroll bars are smaller than the space
+		 reserved for them on the frame, we have to clear
+		 "under" them.  */
+	      w32_clear_area (f, hdc, clear_left, top, clear_width,
+			      height);
 	      release_frame_dc (f, hdc);
 	      w32_clear_under_internal_border (f);
 	    }
-          /* Make sure scroll bar is "visible" before moving, to ensure the
-             area of the parent window now exposed will be refreshed.  */
-          my_show_window (f, hwnd, SW_HIDE);
-/**           MoveWindow (hwnd, left, top, width, max (height, 1), TRUE); **/
+	  /* Make sure scroll bar is "visible" before moving, to
+	     ensure the area of the parent window now exposed will be
+	     refreshed.  */
+	  my_show_window (f, hwnd, SW_HIDE);
+	  /**           MoveWindow (hwnd, left, top, width, max
+	   * (height, 1), TRUE); **/
 	  /* Try to not draw over child frames.  */
-	  SetWindowPos (hwnd, HWND_BOTTOM, left, top, max (width, 1), height,
-                        SWP_FRAMECHANGED);
+	  SetWindowPos (hwnd, HWND_BOTTOM, left, top, max (width, 1),
+			height, SWP_FRAMECHANGED);
 
 	  /* +++ SetScrollInfo +++ */
 	  si.cbSize = sizeof (si);
@@ -4395,17 +4453,17 @@ w32_set_horizontal_scroll_bar (struct window *w,
 	  si.nPos = min (position, si.nMax);
 	  SetScrollInfo (hwnd, SB_CTL, &si, FALSE);
 
-          my_show_window (f, hwnd, SW_NORMAL);
-          /* InvalidateRect (w, NULL, FALSE);  */
+	  my_show_window (f, hwnd, SW_NORMAL);
+	  /* InvalidateRect (w, NULL, FALSE);  */
 
-          /* Remember new settings.  */
-          bar->left = left;
-          bar->top = top;
-          bar->width = width;
-          bar->height = height;
+	  /* Remember new settings.  */
+	  bar->left = left;
+	  bar->top = top;
+	  bar->width = width;
+	  bar->height = height;
 
-          unblock_input ();
-        }
+	  unblock_input ();
+	}
     }
 
   w32_set_horizontal_scroll_bar_thumb (bar, portion, position, whole);
@@ -4413,18 +4471,18 @@ w32_set_horizontal_scroll_bar (struct window *w,
   wset_horizontal_scroll_bar (w, barobj);
 }
 
-
 /* The following three hooks are used when we're doing a thorough
    redisplay of the frame.  We don't explicitly know which scroll bars
    are going to be deleted, because keeping track of when windows go
    away is a real pain - "Can you say set-window-configuration, boys
    and girls?"  Instead, we just assert at the beginning of redisplay
-   that *all* scroll bars are to be removed, and then save a scroll bar
-   from the fiery pit when we actually redisplay its window.  */
+   that *all* scroll bars are to be removed, and then save a scroll
+   bar from the fiery pit when we actually redisplay its window.  */
 
 /* Arrange for all scroll bars on FRAME to be removed at the next call
    to `*judge_scroll_bars_hook'.  A scroll bar may be spared if
-   `*redeem_scroll_bar_hook' is applied to its window before the judgment.  */
+   `*redeem_scroll_bar_hook' is applied to its window before the
+   judgment.  */
 
 static void
 w32_condemn_scroll_bars (struct frame *frame)
@@ -4439,8 +4497,10 @@ w32_condemn_scroll_bars (struct frame *frame)
 	  while (!NILP (XSCROLL_BAR (last)->next))
 	    last = XSCROLL_BAR (last)->next;
 
-	  XSCROLL_BAR (last)->next = FRAME_CONDEMNED_SCROLL_BARS (frame);
-	  XSCROLL_BAR (FRAME_CONDEMNED_SCROLL_BARS (frame))->prev = last;
+	  XSCROLL_BAR (last)->next
+	    = FRAME_CONDEMNED_SCROLL_BARS (frame);
+	  XSCROLL_BAR (FRAME_CONDEMNED_SCROLL_BARS (frame))->prev
+	    = last;
 	}
 
       fset_condemned_scroll_bars (frame, FRAME_SCROLL_BARS (frame));
@@ -4448,7 +4508,6 @@ w32_condemn_scroll_bars (struct frame *frame)
     }
 }
 
-
 /* Un-mark WINDOW's scroll bar for deletion in this judgment cycle.
    Note that WINDOW isn't necessarily condemned at all.  */
 
@@ -4459,19 +4518,22 @@ w32_redeem_scroll_bar (struct window *w)
   Lisp_Object barobj;
   struct frame *f;
 
-  /* We can't redeem this window's scroll bar if it doesn't have one.  */
-  if (NILP (w->vertical_scroll_bar) && NILP (w->horizontal_scroll_bar))
+  /* We can't redeem this window's scroll bar if it doesn't have one.
+   */
+  if (NILP (w->vertical_scroll_bar)
+      && NILP (w->horizontal_scroll_bar))
     emacs_abort ();
 
-  if (!NILP (w->vertical_scroll_bar) && WINDOW_HAS_VERTICAL_SCROLL_BAR (w))
+  if (!NILP (w->vertical_scroll_bar)
+      && WINDOW_HAS_VERTICAL_SCROLL_BAR (w))
     {
       bar = XSCROLL_BAR (w->vertical_scroll_bar);
       /* Unlink it from the condemned list.  */
       f = XFRAME (WINDOW_FRAME (w));
       if (NILP (bar->prev))
 	{
-	  /* If the prev pointer is nil, it must be the first in one of
-	     the lists.  */
+	  /* If the prev pointer is nil, it must be the first in one
+	     of the lists.  */
 	  if (EQ (FRAME_SCROLL_BARS (f), w->vertical_scroll_bar))
 	    /* It's not condemned.  Everything's fine.  */
 	    goto horizontal;
@@ -4486,27 +4548,28 @@ w32_redeem_scroll_bar (struct window *w)
       else
 	XSCROLL_BAR (bar->prev)->next = bar->next;
 
-      if (! NILP (bar->next))
+      if (!NILP (bar->next))
 	XSCROLL_BAR (bar->next)->prev = bar->prev;
 
       bar->next = FRAME_SCROLL_BARS (f);
       bar->prev = Qnil;
       XSETVECTOR (barobj, bar);
       fset_scroll_bars (f, barobj);
-      if (! NILP (bar->next))
+      if (!NILP (bar->next))
 	XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar);
     }
 
- horizontal:
-  if (!NILP (w->horizontal_scroll_bar) && WINDOW_HAS_HORIZONTAL_SCROLL_BAR (w))
+horizontal:
+  if (!NILP (w->horizontal_scroll_bar)
+      && WINDOW_HAS_HORIZONTAL_SCROLL_BAR (w))
     {
       bar = XSCROLL_BAR (w->horizontal_scroll_bar);
       /* Unlink it from the condemned list.  */
       f = XFRAME (WINDOW_FRAME (w));
       if (NILP (bar->prev))
 	{
-	  /* If the prev pointer is nil, it must be the first in one of
-	     the lists.  */
+	  /* If the prev pointer is nil, it must be the first in one
+	     of the lists.  */
 	  if (EQ (FRAME_SCROLL_BARS (f), w->horizontal_scroll_bar))
 	    /* It's not condemned.  Everything's fine.  */
 	    return;
@@ -4521,14 +4584,14 @@ w32_redeem_scroll_bar (struct window *w)
       else
 	XSCROLL_BAR (bar->prev)->next = bar->next;
 
-      if (! NILP (bar->next))
+      if (!NILP (bar->next))
 	XSCROLL_BAR (bar->next)->prev = bar->prev;
 
       bar->next = FRAME_SCROLL_BARS (f);
       bar->prev = Qnil;
       XSETVECTOR (barobj, bar);
       fset_scroll_bars (f, barobj);
-      if (! NILP (bar->next))
+      if (!NILP (bar->next))
 	XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar);
     }
 }
@@ -4547,7 +4610,7 @@ w32_judge_scroll_bars (struct frame *f)
      more events on the hapless scroll bars.  */
   fset_condemned_scroll_bars (f, Qnil);
 
-  for (; ! NILP (bar); bar = next)
+  for (; !NILP (bar); bar = next)
     {
       struct scroll_bar *b = XSCROLL_BAR (bar);
 
@@ -4572,7 +4635,7 @@ w32_judge_scroll_bars (struct frame *f)
 w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
 			     struct input_event *emacs_event)
 {
-  if (! WINDOWP (bar->window))
+  if (!WINDOWP (bar->window))
     emacs_abort ();
 
   emacs_event->kind = SCROLL_BAR_CLICK_EVENT;
@@ -4603,8 +4666,9 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
       y = si.nPos;
 
     bar->dragging = 0;
-    struct frame *f;		/* Value is not used.  */
-    FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos = msg->msg.wParam;
+    struct frame *f; /* Value is not used.  */
+    FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos
+      = msg->msg.wParam;
 
     switch (sb_event)
       {
@@ -4640,17 +4704,18 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
 	  si.cbSize = sizeof (si);
 	  si.fMask = SIF_POS;
 	  si.nPos = y;
-	  /* Remember apparent position (we actually lag behind the real
-	     position, so don't set that directly).  */
+	  /* Remember apparent position (we actually lag behind the
+	     real position, so don't set that directly).  */
 	  last_scroll_bar_drag_pos = y;
 
-	  SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si, FALSE);
+	  SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si,
+			 FALSE);
 	}
 	break;
       case SB_ENDSCROLL:
-	/* If this is the end of a drag sequence, then reset the scroll
-	   handle size to normal and do a final redraw.  Otherwise do
-	   nothing.  */
+	/* If this is the end of a drag sequence, then reset the
+	   scroll handle size to normal and do a final redraw.
+	   Otherwise do nothing.  */
 	if (dragging)
 	  {
 	    SCROLLINFO si;
@@ -4661,7 +4726,8 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
 	    si.fMask = SIF_PAGE | SIF_POS;
 	    si.nPage = end - start + VERTICAL_SCROLL_BAR_MIN_HANDLE;
 	    si.nPos = last_scroll_bar_drag_pos;
-	    SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si, TRUE);
+	    SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si,
+			   TRUE);
 	  }
 	/* fall through */
 	FALLTHROUGH;
@@ -4685,10 +4751,11 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
    mark bits.  */
 
 static int
-w32_horizontal_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
-					struct input_event *emacs_event)
+w32_horizontal_scroll_bar_handle_click (
+  struct scroll_bar *bar, W32Msg *msg,
+  struct input_event *emacs_event)
 {
-  if (! WINDOWP (bar->window))
+  if (!WINDOWP (bar->window))
     emacs_abort ();
 
   emacs_event->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT;
@@ -4720,8 +4787,9 @@ w32_horizontal_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
     y = si.nMax - si.nPage;
 
     bar->dragging = 0;
-    struct frame *f;		/* Value is not used.  */
-    FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos = msg->msg.wParam;
+    struct frame *f; /* Value is not used.  */
+    FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos
+      = msg->msg.wParam;
 
     switch (sb_event)
       {
@@ -4757,17 +4825,18 @@ w32_horizontal_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
 	  si.cbSize = sizeof (si);
 	  si.fMask = SIF_POS;
 	  si.nPos = min (x, XWINDOW (bar->window)->hscroll_whole - 1);
-	  /* Remember apparent position (we actually lag behind the real
-	     position, so don't set that directly).  */
+	  /* Remember apparent position (we actually lag behind the
+	     real position, so don't set that directly).  */
 	  last_scroll_bar_drag_pos = x;
 
-	  SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si, FALSE);
+	  SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si,
+			 FALSE);
 	}
 	break;
       case SB_ENDSCROLL:
-	/* If this is the end of a drag sequence, then reset the scroll
-	   handle size to normal and do a final redraw.  Otherwise do
-	   nothing.  */
+	/* If this is the end of a drag sequence, then reset the
+	   scroll handle size to normal and do a final redraw.
+	   Otherwise do nothing.  */
 	if (dragging)
 	  {
 	    SCROLLINFO si;
@@ -4776,7 +4845,8 @@ w32_horizontal_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
 	    si.fMask = SIF_POS;
 	    si.nPos = min (last_scroll_bar_drag_pos,
 			   XWINDOW (bar->window)->hscroll_whole - 1);
-	    SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si, TRUE);
+	    SetScrollInfo (SCROLL_BAR_W32_WINDOW (bar), SB_CTL, &si,
+			   TRUE);
 	  }
 	/* fall through */
 	FALLTHROUGH;
@@ -4792,13 +4862,14 @@ w32_horizontal_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
   }
 }
 
-/* Return information to the user about the current position of the mouse
-   on the vertical scroll bar.  */
+/* Return information to the user about the current position of the
+   mouse on the vertical scroll bar.  */
 static void
-w32_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
-			    enum scroll_bar_part *part,
-			    Lisp_Object *x, Lisp_Object *y,
-			    Time *time)
+w32_scroll_bar_report_motion (struct frame **fp,
+			      Lisp_Object *bar_window,
+			      enum scroll_bar_part *part,
+			      Lisp_Object *x, Lisp_Object *y,
+			      Time *time)
 {
   struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp);
   struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar;
@@ -4842,13 +4913,14 @@ w32_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
   unblock_input ();
 }
 
-/* Return information to the user about the current position of the mouse
-   on the horizontal scroll bar.  */
+/* Return information to the user about the current position of the
+   mouse on the horizontal scroll bar.  */
 static void
-w32_horizontal_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
-                                         enum scroll_bar_part *part,
-                                         Lisp_Object *x, Lisp_Object *y,
-                                         Time *time)
+w32_horizontal_scroll_bar_report_motion (struct frame **fp,
+					 Lisp_Object *bar_window,
+					 enum scroll_bar_part *part,
+					 Lisp_Object *x,
+					 Lisp_Object *y, Time *time)
 {
   struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp);
   struct scroll_bar *bar = dpyinfo->last_mouse_scroll_bar;
@@ -4881,7 +4953,6 @@ w32_horizontal_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_win
   if (sb_event == SB_LINERIGHT)
     pos++;
 
-
   XSETINT (*y, pos);
   XSETINT (*x, left_range);
 
@@ -4893,7 +4964,6 @@ w32_horizontal_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_win
   unblock_input ();
 }
 
-
 /* The screen has been cleared so we may have changed foreground or
    background colors, and the scroll bars may need to be redrawn.
    Clear out the scroll bars, and ask for expose events, so we can
@@ -4918,23 +4988,23 @@ w32_scroll_bar_clear (struct frame *f)
   if (FRAME_HAS_VERTICAL_SCROLL_BARS (f)
       || FRAME_HAS_HORIZONTAL_SCROLL_BARS (f))
     for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
-         bar = XSCROLL_BAR (bar)->next)
+	 bar = XSCROLL_BAR (bar)->next)
       {
-        HWND window = SCROLL_BAR_W32_WINDOW (XSCROLL_BAR (bar));
-        HDC hdc = GetDC (window);
-        RECT rect;
+	HWND window = SCROLL_BAR_W32_WINDOW (XSCROLL_BAR (bar));
+	HDC hdc = GetDC (window);
+	RECT rect;
 
-        /* Hide scroll bar until ready to repaint.  x_scroll_bar_move
-           arranges to refresh the scroll bar if hidden.  */
-        my_show_window (f, window, SW_HIDE);
+	/* Hide scroll bar until ready to repaint.  x_scroll_bar_move
+	   arranges to refresh the scroll bar if hidden.  */
+	my_show_window (f, window, SW_HIDE);
 
-        GetClientRect (window, &rect);
-        select_palette (f, hdc);
-        w32_clear_rect (f, hdc, &rect);
+	GetClientRect (window, &rect);
+	select_palette (f, hdc);
+	w32_clear_rect (f, hdc, &rect);
 	w32_clear_under_internal_border (f);
-        deselect_palette (f, hdc);
+	deselect_palette (f, hdc);
 
-        ReleaseDC (window, hdc);
+	ReleaseDC (window, hdc);
       }
 }
 
@@ -4949,7 +5019,8 @@ w32_scroll_bar_clear (struct frame *f)
 /* Temporarily store lead byte of DBCS input sequences.  */
 static char dbcs_lead = 0;
 
-/* Temporarily store pending UTF-16 high surrogate unit and the modifiers.  */
+/* Temporarily store pending UTF-16 high surrogate unit and the
+ * modifiers.  */
 static unsigned short utf16_high;
 static DWORD utf16_high_modifiers;
 
@@ -4964,9 +5035,9 @@ w32_scroll_bar_clear (struct frame *f)
 static struct frame *
 mouse_or_wdesc_frame (struct w32_display_info *dpyinfo, HWND wdesc)
 {
-  struct frame *lm_f = (gui_mouse_grabbed (dpyinfo)
-			? dpyinfo->last_mouse_frame
-			: NULL);
+  struct frame *lm_f
+    = (gui_mouse_grabbed (dpyinfo) ? dpyinfo->last_mouse_frame
+				   : NULL);
 
   if (lm_f && !EQ (track_mouse, Qdropping))
     return lm_f;
@@ -4994,13 +5065,14 @@ mouse_or_wdesc_frame (struct w32_display_info *dpyinfo, HWND wdesc)
    We return the number of characters stored into the buffer,
    thus pretending to be `read'.
 
-   Some of these messages are reposted back to the message queue since the
-   system calls the windows proc directly in a context where we cannot return
-   the data nor can we guarantee the state we are in.  So if we dispatch them
-   we will get into an infinite loop.  To prevent this from ever happening we
-   will set a variable to indicate we are in the read_socket call and indicate
-   which message we are processing since the windows proc gets called
-   recursively with different messages by the system.
+   Some of these messages are reposted back to the message queue since
+   the system calls the windows proc directly in a context where we
+   cannot return the data nor can we guarantee the state we are in. So
+   if we dispatch them we will get into an infinite loop.  To prevent
+   this from ever happening we will set a variable to indicate we are
+   in the read_socket call and indicate which message we are
+   processing since the windows proc gets called recursively with
+   different messages by the system.
 */
 
 extern void menubar_selection_callback (struct frame *, void *);
@@ -5049,13 +5121,14 @@ w32_read_socket (struct terminal *terminal,
 
 	  if (f)
 	    {
-	      if (msg.rect.right == msg.rect.left ||
-		  msg.rect.bottom == msg.rect.top)
+	      if (msg.rect.right == msg.rect.left
+		  || msg.rect.bottom == msg.rect.top)
 		{
 		  /* We may get paint messages even though the client
 		     area is clipped - these are not expose events. */
-		  DebPrint (("clipped frame %p (%s) got WM_PAINT - ignored\n", f,
-			     SDATA (f->name)));
+		  DebPrint (
+		    ("clipped frame %p (%s) got WM_PAINT - ignored\n",
+		     f, SDATA (f->name)));
 		}
 	      else if (FRAME_VISIBLE_P (f) != 1)
 		{
@@ -5066,8 +5139,9 @@ w32_read_socket (struct terminal *terminal,
 		  SET_FRAME_ICONIFIED (f, false);
 		  SET_FRAME_GARBAGED (f);
 		  if (!f->output_data.w32->asked_for_visible)
-		    DebPrint (("frame %p (%s) reexposed by WM_PAINT\n", f,
-			       SDATA (f->name)));
+		    DebPrint (
+		      ("frame %p (%s) reexposed by WM_PAINT\n", f,
+		       SDATA (f->name)));
 
 		  /* WM_PAINT serves as MapNotify as well, so report
 		     visibility changes properly.  */
@@ -5082,13 +5156,15 @@ w32_read_socket (struct terminal *terminal,
 		  if (w32_disable_double_buffering
 		      || !FRAME_OUTPUT_DATA (f)->paint_buffer)
 		    {
-		      /* Erase background again for safety.  But don't do
-			 that if the frame's 'garbaged' flag is set, since
-			 in that case expose_frame will do nothing, and if
-			 the various redisplay flags happen to be unset,
-			 we are left with a blank frame.  */
-
-		      if (!FRAME_GARBAGED_P (f) || FRAME_PARENT_FRAME (f))
+		      /* Erase background again for safety.  But don't
+			 do that if the frame's 'garbaged' flag is
+			 set, since in that case expose_frame will do
+			 nothing, and if the various redisplay flags
+			 happen to be unset, we are left with a blank
+			 frame.  */
+
+		      if (!FRAME_GARBAGED_P (f)
+			  || FRAME_PARENT_FRAME (f))
 			{
 			  HDC hdc = get_frame_dc (f);
 
@@ -5096,9 +5172,7 @@ w32_read_socket (struct terminal *terminal,
 			  release_frame_dc (f, hdc);
 			}
 
-		      expose_frame (f,
-				    msg.rect.left,
-				    msg.rect.top,
+		      expose_frame (f, msg.rect.left, msg.rect.top,
 				    msg.rect.right - msg.rect.left,
 				    msg.rect.bottom - msg.rect.top);
 		      w32_clear_under_internal_border (f);
@@ -5115,8 +5189,8 @@ w32_read_socket (struct terminal *terminal,
 
 	  /* lParam contains the input language ID in its low 16 bits.
 	     Use it to update our record of the keyboard codepage.  */
-	  w32_keyboard_codepage = codepage_for_locale ((LCID)(msg.msg.lParam
-							      & 0xffff));
+	  w32_keyboard_codepage
+	    = codepage_for_locale ((LCID) (msg.msg.lParam & 0xffff));
 
 	  if (f)
 	    {
@@ -5141,9 +5215,12 @@ w32_read_socket (struct terminal *terminal,
 
 	  if (f && !FRAME_ICONIFIED_P (f))
 	    {
-	      if (!hlinfo->mouse_face_hidden && FIXNUMP (Vmouse_highlight)
-		  && !EQ (f->tab_bar_window, hlinfo->mouse_face_window)
-		  && !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
+	      if (!hlinfo->mouse_face_hidden
+		  && FIXNUMP (Vmouse_highlight)
+		  && !EQ (f->tab_bar_window,
+			  hlinfo->mouse_face_window)
+		  && !EQ (f->tool_bar_window,
+			  hlinfo->mouse_face_window))
 		{
 		  clear_mouse_face (hlinfo);
 		  hlinfo->mouse_face_hidden = true;
@@ -5160,16 +5237,19 @@ w32_read_socket (struct terminal *terminal,
 	    }
 	  break;
 
-        case WM_UNICHAR:
+	case WM_UNICHAR:
 	case WM_SYSCHAR:
 	case WM_CHAR:
 	  f = w32_window_to_frame (dpyinfo, msg.msg.hwnd);
 
 	  if (f && !FRAME_ICONIFIED_P (f))
 	    {
-	      if (!hlinfo->mouse_face_hidden && FIXNUMP (Vmouse_highlight)
-		  && !EQ (f->tab_bar_window, hlinfo->mouse_face_window)
-		  && !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
+	      if (!hlinfo->mouse_face_hidden
+		  && FIXNUMP (Vmouse_highlight)
+		  && !EQ (f->tab_bar_window,
+			  hlinfo->mouse_face_window)
+		  && !EQ (f->tool_bar_window,
+			  hlinfo->mouse_face_window))
 		{
 		  clear_mouse_face (hlinfo);
 		  hlinfo->mouse_face_hidden = true;
@@ -5200,8 +5280,8 @@ w32_read_socket (struct terminal *terminal,
 		  utf16_high_modifiers = 0;
 		}
 
-              if (msg.msg.message == WM_UNICHAR)
-                {
+	      if (msg.msg.message == WM_UNICHAR)
+		{
 		  /* Handle UTF-16 encoded codepoint above the BMP.
 		     This is needed to support Emoji input from input
 		     panel popped up by "Win+." shortcut.  */
@@ -5215,76 +5295,84 @@ w32_read_socket (struct terminal *terminal,
 		  else if (UTF_16_LOW_SURROGATE_P (msg.msg.wParam)
 			   && utf16_high)
 		    {
-		      inev.code = surrogates_to_codepoint (msg.msg.wParam,
-							   utf16_high);
+		      inev.code
+			= surrogates_to_codepoint (msg.msg.wParam,
+						   utf16_high);
 		      utf16_high = 0;
 		      utf16_high_modifiers = 0;
 		    }
 		  else
 		    inev.code = msg.msg.wParam;
-                }
-              else if (msg.msg.wParam < 256)
-                {
-                  wchar_t code;
-                  char dbcs[2];
-                  dbcs[0] = 0;
-                  dbcs[1] = (char) msg.msg.wParam;
-
-                  if (dbcs_lead)
-                    {
-                      dbcs[0] = dbcs_lead;
-                      dbcs_lead = 0;
-                      if (!MultiByteToWideChar (w32_keyboard_codepage, 0,
-						dbcs, 2, &code, 1))
-                        {
-                          /* Garbage */
-                          DebPrint (("Invalid DBCS sequence: %d %d\n",
-                                     dbcs[0], dbcs[1]));
-                          inev.kind = NO_EVENT;
-                          break;
-                        }
-                    }
-                  else if (IsDBCSLeadByteEx (w32_keyboard_codepage,
+		}
+	      else if (msg.msg.wParam < 256)
+		{
+		  wchar_t code;
+		  char dbcs[2];
+		  dbcs[0] = 0;
+		  dbcs[1] = (char) msg.msg.wParam;
+
+		  if (dbcs_lead)
+		    {
+		      dbcs[0] = dbcs_lead;
+		      dbcs_lead = 0;
+		      if (!MultiByteToWideChar (w32_keyboard_codepage,
+						0, dbcs, 2, &code, 1))
+			{
+			  /* Garbage */
+			  DebPrint (("Invalid DBCS sequence: %d %d\n",
+				     dbcs[0], dbcs[1]));
+			  inev.kind = NO_EVENT;
+			  break;
+			}
+		    }
+		  else if (IsDBCSLeadByteEx (w32_keyboard_codepage,
 					     (BYTE) msg.msg.wParam))
-                    {
-                      dbcs_lead = (char) msg.msg.wParam;
-                      inev.kind = NO_EVENT;
-                      break;
-                    }
-                  else
-                    {
-                      if (!MultiByteToWideChar (w32_keyboard_codepage, 0,
-						&dbcs[1], 1, &code, 1))
-                        {
-                          /* What to do with garbage? */
-                          DebPrint (("Invalid character: %d\n", dbcs[1]));
-                          inev.kind = NO_EVENT;
-                          break;
-                        }
-                    }
-                  inev.code = code;
-                }
-              else
-                {
-                  /* Windows shouldn't generate WM_CHAR events above 0xFF
-                     in non-Unicode message handlers.  */
-                  DebPrint (("Non-byte WM_CHAR: %d\n", msg.msg.wParam));
-                  inev.kind = NO_EVENT;
-                  break;
-                }
-              inev.kind = inev.code < 128 ? ASCII_KEYSTROKE_EVENT
-                                          : MULTIBYTE_CHAR_KEYSTROKE_EVENT;
+		    {
+		      dbcs_lead = (char) msg.msg.wParam;
+		      inev.kind = NO_EVENT;
+		      break;
+		    }
+		  else
+		    {
+		      if (!MultiByteToWideChar (w32_keyboard_codepage,
+						0, &dbcs[1], 1, &code,
+						1))
+			{
+			  /* What to do with garbage? */
+			  DebPrint (
+			    ("Invalid character: %d\n", dbcs[1]));
+			  inev.kind = NO_EVENT;
+			  break;
+			}
+		    }
+		  inev.code = code;
+		}
+	      else
+		{
+		  /* Windows shouldn't generate WM_CHAR events above
+		     0xFF in non-Unicode message handlers.  */
+		  DebPrint (
+		    ("Non-byte WM_CHAR: %d\n", msg.msg.wParam));
+		  inev.kind = NO_EVENT;
+		  break;
+		}
+	      inev.kind = inev.code < 128
+			    ? ASCII_KEYSTROKE_EVENT
+			    : MULTIBYTE_CHAR_KEYSTROKE_EVENT;
 	    }
 	  break;
 
-        case WM_APPCOMMAND:
+	case WM_APPCOMMAND:
 	  f = w32_window_to_frame (dpyinfo, msg.msg.hwnd);
 
 	  if (f && !FRAME_ICONIFIED_P (f))
 	    {
-	      if (!hlinfo->mouse_face_hidden && FIXNUMP (Vmouse_highlight)
-		  && !EQ (f->tab_bar_window, hlinfo->mouse_face_window)
-		  && !EQ (f->tool_bar_window, hlinfo->mouse_face_window))
+	      if (!hlinfo->mouse_face_hidden
+		  && FIXNUMP (Vmouse_highlight)
+		  && !EQ (f->tab_bar_window,
+			  hlinfo->mouse_face_window)
+		  && !EQ (f->tool_bar_window,
+			  hlinfo->mouse_face_window))
 		{
 		  clear_mouse_face (hlinfo);
 		  hlinfo->mouse_face_hidden = true;
@@ -5312,7 +5400,7 @@ w32_read_socket (struct terminal *terminal,
 	    last_mousemove_y = y;
 	  }
 
-          previous_help_echo_string = help_echo_string;
+	  previous_help_echo_string = help_echo_string;
 	  help_echo_string = Qnil;
 
 	  if (hlinfo->mouse_face_hidden)
@@ -5335,8 +5423,13 @@ w32_read_socket (struct terminal *terminal,
 			  && !FRAME_NO_ACCEPT_FOCUS (f))))
 		{
 		  static Lisp_Object last_mouse_window;
-		  Lisp_Object window = window_from_coordinates
-		    (f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0, 0, 0);
+		  Lisp_Object window
+		    = window_from_coordinates (f,
+					       LOWORD (
+						 msg.msg.lParam),
+					       HIWORD (
+						 msg.msg.lParam),
+					       0, 0, 0, 0);
 
 		  /* Window will be selected only when it is not
 		     selected now and last mouse movement event was
@@ -5350,7 +5443,8 @@ w32_read_socket (struct terminal *terminal,
 		      inev.frame_or_window = window;
 		    }
 
-		  /* Remember the last window where we saw the mouse.  */
+		  /* Remember the last window where we saw the mouse.
+		   */
 		  last_mouse_window = window;
 		}
 
@@ -5358,25 +5452,26 @@ w32_read_socket (struct terminal *terminal,
 		help_echo_string = previous_help_echo_string;
 	    }
 	  else
-            {
-              /* If we move outside the frame, then we're
-                 certainly no longer on any text in the frame.  */
-              clear_mouse_face (hlinfo);
-            }
-
-          /* If the contents of the global variable help_echo_string
-             has changed, generate a HELP_EVENT.  */
-#if 0 /* The below is an invalid comparison when CHECK_LISP_OBJECT_TYPE.
-	 But it was originally changed to this to fix a bug, so I have
-	 not removed it completely in case the bug is still there.  */
+	    {
+	      /* If we move outside the frame, then we're
+		 certainly no longer on any text in the frame.  */
+	      clear_mouse_face (hlinfo);
+	    }
+
+	    /* If the contents of the global variable help_echo_string
+	       has changed, generate a HELP_EVENT.  */
+#if 0 /* The below is an invalid comparison when                   \
+	 CHECK_LISP_OBJECT_TYPE. But it was originally changed to  \
+	 this to fix a bug, so I have not removed it completely in \
+	 case the bug is still there.  */
           if (help_echo_string != previous_help_echo_string ||
 	      (!NILP (help_echo_string) && !STRINGP (help_echo_string) && f->mouse_moved))
 #else /* This is what xterm.c does.  */
-	    if (!NILP (help_echo_string)
-		|| !NILP (previous_help_echo_string))
+	  if (!NILP (help_echo_string)
+	      || !NILP (previous_help_echo_string))
 	    do_help = 1;
 #endif
-          break;
+	  break;
 
 	case WM_LBUTTONDOWN:
 	case WM_LBUTTONUP:
@@ -5387,8 +5482,8 @@ w32_read_socket (struct terminal *terminal,
 	case WM_XBUTTONDOWN:
 	case WM_XBUTTONUP:
 	  {
-            /* If we decide we want to generate an event to be seen
-               by the rest of Emacs, we put it here.  */
+	    /* If we decide we want to generate an event to be seen
+	       by the rest of Emacs, we put it here.  */
 	    Lisp_Object tab_bar_arg = Qnil;
 	    bool tab_bar_p = 0;
 	    bool tool_bar_p = 0;
@@ -5398,47 +5493,54 @@ w32_read_socket (struct terminal *terminal,
 	    f = mouse_or_wdesc_frame (dpyinfo, msg.msg.hwnd);
 	    if (f)
 	      {
-                w32_construct_mouse_click (&inev, &msg, f);
+		w32_construct_mouse_click (&inev, &msg, f);
 
-                /* Is this in the tab-bar?  */
-                if (WINDOWP (f->tab_bar_window)
-                    && WINDOW_TOTAL_LINES (XWINDOW (f->tab_bar_window)))
-                  {
-                    Lisp_Object window;
+		/* Is this in the tab-bar?  */
+		if (WINDOWP (f->tab_bar_window)
+		    && WINDOW_TOTAL_LINES (
+		      XWINDOW (f->tab_bar_window)))
+		  {
+		    Lisp_Object window;
 		    int x = XFIXNAT (inev.x);
 		    int y = XFIXNAT (inev.y);
 
-                    window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
+		    window
+		      = window_from_coordinates (f, x, y, 0, 1, 1, 1);
 
-                    if (EQ (window, f->tab_bar_window))
-                      {
-                        tab_bar_arg = w32_handle_tab_bar_click (f, &inev);
-                        tab_bar_p = 1;
-                      }
-                  }
+		    if (EQ (window, f->tab_bar_window))
+		      {
+			tab_bar_arg
+			  = w32_handle_tab_bar_click (f, &inev);
+			tab_bar_p = 1;
+		      }
+		  }
 
-                if ((tab_bar_p && NILP (tab_bar_arg))
+		if ((tab_bar_p && NILP (tab_bar_arg))
 		    || (dpyinfo->w32_focus_frame
 			&& f != dpyinfo->w32_focus_frame
-			/* This does not help when the click happens in
-			   a grand-parent frame.  */
-			&& !frame_ancestor_p (f, dpyinfo->w32_focus_frame)))
+			/* This does not help when the click happens
+			   in a grand-parent frame.  */
+			&& !frame_ancestor_p (f,
+					      dpyinfo
+						->w32_focus_frame)))
 		  inev.kind = NO_EVENT;
 
 		if (!NILP (tab_bar_arg))
 		  inev.arg = tab_bar_arg;
 
-                /* Is this in the tool-bar?  */
-                if (WINDOWP (f->tool_bar_window)
-                    && WINDOW_TOTAL_LINES (XWINDOW (f->tool_bar_window)))
-                  {
-                    Lisp_Object window;
+		/* Is this in the tool-bar?  */
+		if (WINDOWP (f->tool_bar_window)
+		    && WINDOW_TOTAL_LINES (
+		      XWINDOW (f->tool_bar_window)))
+		  {
+		    Lisp_Object window;
 		    int x = XFIXNAT (inev.x);
 		    int y = XFIXNAT (inev.y);
 
-                    window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
+		    window
+		      = window_from_coordinates (f, x, y, 0, 1, 1, 1);
 
-                    if (EQ (window, f->tool_bar_window)
+		    if (EQ (window, f->tool_bar_window)
 			/* Make sure the tool bar was previously
 			   pressed, otherwise an event that started
 			   outside of the tool bar will not be handled
@@ -5450,18 +5552,20 @@ w32_read_socket (struct terminal *terminal,
 			   event as a tool-bar click.  */
 			&& (inev.modifiers & down_modifier
 			    || f->last_tool_bar_item != -1))
-                      {
-                        w32_handle_tool_bar_click (f, &inev);
-                        tool_bar_p = 1;
-                      }
-                  }
+		      {
+			w32_handle_tool_bar_click (f, &inev);
+			tool_bar_p = 1;
+		      }
+		  }
 
-                if (tool_bar_p
+		if (tool_bar_p
 		    || (dpyinfo->w32_focus_frame
 			&& f != dpyinfo->w32_focus_frame
-			/* This does not help when the click happens in
-			   a grand-parent frame.  */
-			&& !frame_ancestor_p (f, dpyinfo->w32_focus_frame)))
+			/* This does not help when the click happens
+			   in a grand-parent frame.  */
+			&& !frame_ancestor_p (f,
+					      dpyinfo
+						->w32_focus_frame)))
 		  inev.kind = NO_EVENT;
 	      }
 
@@ -5470,17 +5574,17 @@ w32_read_socket (struct terminal *terminal,
 
 	    if (up)
 	      {
-		dpyinfo->grabbed &= ~ (1 << button);
+		dpyinfo->grabbed &= ~(1 << button);
 	      }
 	    else
 	      {
 		dpyinfo->grabbed |= (1 << button);
 		dpyinfo->last_mouse_frame = f;
-                /* Ignore any mouse motion that happened
-                   before this event; any subsequent mouse-movement
-                   Emacs events should reflect only motion after
-                   the ButtonPress.  */
-                if (f != 0)
+		/* Ignore any mouse motion that happened
+		   before this event; any subsequent mouse-movement
+		   Emacs events should reflect only motion after
+		   the ButtonPress.  */
+		if (f != 0)
 		  {
 		    f->mouse_moved = false;
 		    if (!tab_bar_p)
@@ -5493,7 +5597,7 @@ w32_read_socket (struct terminal *terminal,
 	  }
 
 	case WM_MOUSEWHEEL:
-        case WM_MOUSEHWHEEL:
+	case WM_MOUSEHWHEEL:
 	  {
 	    f = mouse_or_wdesc_frame (dpyinfo, msg.msg.hwnd);
 	    if (f)
@@ -5504,9 +5608,10 @@ w32_read_socket (struct terminal *terminal,
 		  {
 		    w32_construct_mouse_wheel (&inev, &msg, f);
 
-		    /* Ignore any mouse motion that happened before this
-		       event; any subsequent mouse-movement Emacs events
-		       should reflect only motion after the ButtonPress.  */
+		    /* Ignore any mouse motion that happened before
+		       this event; any subsequent mouse-movement Emacs
+		       events should reflect only motion after the
+		       ButtonPress.  */
 		    f->mouse_moved = false;
 		    f->last_tab_bar_item = -1;
 		    f->last_tool_bar_item = -1;
@@ -5515,8 +5620,10 @@ w32_read_socket (struct terminal *terminal,
 		else if (FRAME_NO_ACCEPT_FOCUS (f)
 			 && !gui_mouse_grabbed (dpyinfo))
 		  {
-		    Lisp_Object frame1 = get_frame_param (f, Qmouse_wheel_frame);
-		    struct frame *f1 = FRAMEP (frame1) ? XFRAME (frame1) : NULL;
+		    Lisp_Object frame1
+		      = get_frame_param (f, Qmouse_wheel_frame);
+		    struct frame *f1
+		      = FRAMEP (frame1) ? XFRAME (frame1) : NULL;
 
 		    if (f1 && FRAME_LIVE_P (f1) && FRAME_W32_P (f1))
 		      {
@@ -5546,18 +5653,19 @@ w32_read_socket (struct terminal *terminal,
 
 	case WM_HSCROLL:
 	  {
-	    struct scroll_bar *bar =
-	      w32_window_to_scroll_bar ((HWND)msg.msg.lParam, 1);
+	    struct scroll_bar *bar
+	      = w32_window_to_scroll_bar ((HWND) msg.msg.lParam, 1);
 
 	    if (bar)
-	      w32_horizontal_scroll_bar_handle_click (bar, &msg, &inev);
+	      w32_horizontal_scroll_bar_handle_click (bar, &msg,
+						      &inev);
 	    break;
 	  }
 
 	case WM_VSCROLL:
 	  {
-	    struct scroll_bar *bar =
-	      w32_window_to_scroll_bar ((HWND)msg.msg.lParam, 0);
+	    struct scroll_bar *bar
+	      = w32_window_to_scroll_bar ((HWND) msg.msg.lParam, 0);
 
 	    if (bar)
 	      w32_scroll_bar_handle_click (bar, &msg, &inev);
@@ -5577,18 +5685,16 @@ w32_read_socket (struct terminal *terminal,
 		  /* GetClientRect evidently returns (0, 0, 0, 0) if
 		     called on a minimized frame.  Such "dimensions"
 		     aren't useful anyway.  */
-		  && !(rect.bottom == 0
-		       && rect.top == 0
-		       && rect.left == 0
-		       && rect.right == 0))
+		  && !(rect.bottom == 0 && rect.top == 0
+		       && rect.left == 0 && rect.right == 0))
 		{
 		  height = rect.bottom - rect.top;
 		  width = rect.right - rect.left;
 		  if (width != FRAME_PIXEL_WIDTH (f)
 		      || height != FRAME_PIXEL_HEIGHT (f))
 		    {
-		      change_frame_size
-			(f, width, height, false, true, false);
+		      change_frame_size (f, width, height, false,
+					 true, false);
 		      SET_FRAME_GARBAGED (f);
 		      cancel_mouse_face (f);
 		      f->win_gravity = NorthWestGravity;
@@ -5611,7 +5717,8 @@ w32_read_socket (struct terminal *terminal,
 		 the frame might not yet be visible, if that call is a
 		 result of make-frame, and in that case the hook just
 		 sets the WAIT flag.  */
-	      if ((msg.msg.message == WM_WINDOWPOSCHANGED || msg.msg.wParam)
+	      if ((msg.msg.message == WM_WINDOWPOSCHANGED
+		   || msg.msg.wParam)
 		  && (f->want_fullscreen & FULLSCREEN_WAIT))
 		{
 		  /* Must set visibility right here since otherwise
@@ -5627,7 +5734,7 @@ w32_read_socket (struct terminal *terminal,
 	case WM_MOVE:
 	  f = w32_window_to_frame (dpyinfo, msg.msg.hwnd);
 
-	  if (f && FRAME_VISIBLE_P (f) && !FRAME_ICONIFIED_P(f)
+	  if (f && FRAME_VISIBLE_P (f) && !FRAME_ICONIFIED_P (f)
 	      && !FRAME_TOOLTIP_P (f))
 	    {
 	      w32_real_positions (f, &f->left_pos, &f->top_pos);
@@ -5639,8 +5746,8 @@ w32_read_socket (struct terminal *terminal,
 	  break;
 
 	case WM_SHOWWINDOW:
-	  /* wParam non-zero means Window is about to be shown, 0 means
-	     about to be hidden.  */
+	  /* wParam non-zero means Window is about to be shown, 0
+	     means about to be hidden.  */
 	  /* Redo the mouse-highlight after the tooltip has gone.  */
 	  if (!msg.msg.wParam && msg.msg.hwnd == tip_window)
 	    {
@@ -5648,10 +5755,10 @@ w32_read_socket (struct terminal *terminal,
 	      gui_redo_mouse_highlight (dpyinfo);
 	    }
 
-	  /* If window has been obscured or exposed by another window
-	     being maximized or minimized/restored, then recheck
-	     visibility of all frames.  Direct changes to our own
-	     windows get handled by WM_SIZE.  */
+	    /* If window has been obscured or exposed by another
+	       window being maximized or minimized/restored, then
+	       recheck visibility of all frames.  Direct changes to
+	       our own windows get handled by WM_SIZE.  */
 #if 0
 	  if (msg.msg.lParam != 0)
 	    check_visibility = 1;
@@ -5688,7 +5795,8 @@ w32_read_socket (struct terminal *terminal,
 		case SIZE_MAXIMIZED:
 		  {
 		    bool iconified = FRAME_ICONIFIED_P (f);
-		    Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
+		    Lisp_Object fullscreen
+		      = get_frame_param (f, Qfullscreen);
 
 		    SET_FRAME_VISIBLE (f, 1);
 		    SET_FRAME_ICONIFIED (f, false);
@@ -5704,8 +5812,8 @@ w32_read_socket (struct terminal *terminal,
 			/* Reset top and left positions of the Window
 			   here since Windows sends a WM_MOVE message
 			   BEFORE telling us the Window is minimized
-			   when the Window is iconified, with 3000,3000
-			   as the co-ords. */
+			   when the Window is iconified, with
+			   3000,3000 as the co-ords. */
 			w32_real_positions (f, &x, &y);
 			f->left_pos = x;
 			f->top_pos = y;
@@ -5714,19 +5822,22 @@ w32_read_socket (struct terminal *terminal,
 			XSETFRAME (inev.frame_or_window, f);
 		      }
 
-		  /* Windows can send us a SIZE_MAXIMIZED message even
-		     when fullscreen is fullboth.  The following is a
-		     simple hack to check that based on the fact that
-		     only a maximized fullscreen frame should have top
-		     or left outside the screen.  */
-		  if (EQ (fullscreen, Qfullwidth) || EQ (fullscreen, Qfullheight)
-		      || NILP (fullscreen))
+		    /* Windows can send us a SIZE_MAXIMIZED message
+		       even when fullscreen is fullboth.  The
+		       following is a simple hack to check that based
+		       on the fact that only a maximized fullscreen
+		       frame should have top or left outside the
+		       screen.  */
+		    if (EQ (fullscreen, Qfullwidth)
+			|| EQ (fullscreen, Qfullheight)
+			|| NILP (fullscreen))
 		      {
 			int x, y;
 
 			w32_real_positions (f, &x, &y);
 			if (x < 0 || y < 0)
-			  store_frame_param (f, Qfullscreen, Qmaximized);
+			  store_frame_param (f, Qfullscreen,
+					     Qmaximized);
 		      }
 		  }
 
@@ -5738,8 +5849,9 @@ w32_read_socket (struct terminal *terminal,
 
 		    /* The following was made unconditional in a
 		       pathetic attempt to fix bug#16967 in revision
-		       116716 but, considered counterproductive was made
-		       conditional again in revision 116727.  martin */
+		       116716 but, considered counterproductive was
+		       made conditional again in revision 116727.
+		       martin */
 		    if (iconified)
 		      SET_FRAME_VISIBLE (f, 1);
 		    SET_FRAME_ICONIFIED (f, false);
@@ -5753,23 +5865,26 @@ w32_read_socket (struct terminal *terminal,
 			/* Reset top and left positions of the Window
 			   here since Windows sends a WM_MOVE message
 			   BEFORE telling us the Window is minimized
-			   when the Window is iconified, with 3000,3000
-			   as the co-ords.  */
-			w32_real_positions (f, &f->left_pos, &f->top_pos);
+			   when the Window is iconified, with
+			   3000,3000 as the co-ords.  */
+			w32_real_positions (f, &f->left_pos,
+					    &f->top_pos);
 
 			inev.kind = DEICONIFY_EVENT;
 			XSETFRAME (inev.frame_or_window, f);
 		      }
 		  }
 
-		  if (EQ (get_frame_param (f, Qfullscreen), Qmaximized))
+		  if (EQ (get_frame_param (f, Qfullscreen),
+			  Qmaximized))
 		    store_frame_param (f, Qfullscreen, Qnil);
 
 		  break;
 		}
 	    }
 
-	  if (f && !FRAME_ICONIFIED_P (f) && msg.msg.wParam != SIZE_MINIMIZED)
+	  if (f && !FRAME_ICONIFIED_P (f)
+	      && msg.msg.wParam != SIZE_MINIMIZED)
 	    {
 	      RECT rect;
 	      int /* rows, columns, */ width, height;
@@ -5778,10 +5893,8 @@ w32_read_socket (struct terminal *terminal,
 		  /* GetClientRect evidently returns (0, 0, 0, 0) if
 		     called on a minimized frame.  Such "dimensions"
 		     aren't useful anyway.  */
-		  && !(rect.bottom == 0
-		       && rect.top == 0
-		       && rect.left == 0
-		       && rect.right == 0))
+		  && !(rect.bottom == 0 && rect.top == 0
+		       && rect.left == 0 && rect.right == 0))
 		{
 		  height = rect.bottom - rect.top;
 		  width = rect.right - rect.left;
@@ -5791,8 +5904,8 @@ w32_read_socket (struct terminal *terminal,
 		    {
 		      w32_release_paint_buffer (f);
 
-		      change_frame_size
-			(f, width, height, false, true, false);
+		      change_frame_size (f, width, height, false,
+					 true, false);
 		      SET_FRAME_GARBAGED (f);
 		      cancel_mouse_face (f);
 		      f->win_gravity = NorthWestGravity;
@@ -5836,23 +5949,23 @@ w32_read_socket (struct terminal *terminal,
 	  w32_detect_focus_change (dpyinfo, &msg, &inev);
 	  f = w32_window_to_frame (dpyinfo, msg.msg.hwnd);
 
-          if (f)
-            {
-              if (f == hlinfo->mouse_face_mouse_frame)
-                {
-                  /* If we move outside the frame, then we're
-                     certainly no longer on any text in the frame.  */
-                  clear_mouse_face (hlinfo);
-                  hlinfo->mouse_face_mouse_frame = 0;
-                }
-
-              /* Generate a nil HELP_EVENT to cancel a help-echo.
-                 Do it only if there's something to cancel.
-                 Otherwise, the startup message is cleared when
-                 the mouse leaves the frame.  */
-              if (any_help_event_p)
+	  if (f)
+	    {
+	      if (f == hlinfo->mouse_face_mouse_frame)
+		{
+		  /* If we move outside the frame, then we're
+		     certainly no longer on any text in the frame.  */
+		  clear_mouse_face (hlinfo);
+		  hlinfo->mouse_face_mouse_frame = 0;
+		}
+
+	      /* Generate a nil HELP_EVENT to cancel a help-echo.
+		 Do it only if there's something to cancel.
+		 Otherwise, the startup message is cleared when
+		 the mouse leaves the frame.  */
+	      if (any_help_event_p)
 		do_help = -1;
-            }
+	    }
 
 	  dpyinfo->grabbed = 0;
 	  check_visibility = 1;
@@ -5887,7 +6000,7 @@ w32_read_socket (struct terminal *terminal,
 
 	  if (f)
 	    {
-	      menubar_selection_callback (f, (void *)msg.msg.wParam);
+	      menubar_selection_callback (f, (void *) msg.msg.wParam);
 	    }
 
 	  check_visibility = 1;
@@ -5898,7 +6011,8 @@ w32_read_socket (struct terminal *terminal,
 
 	  if (f)
 	    {
-	      Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
+	      Lisp_Object fullscreen
+		= get_frame_param (f, Qfullscreen);
 
 	      dpyinfo->n_cbits = msg.msg.wParam;
 	      /* The new display could have a different resolution, in
@@ -5924,8 +6038,8 @@ w32_read_socket (struct terminal *terminal,
 	    union buffered_input_event *ev;
 
 	    ev = (kbd_store_ptr == kbd_buffer
-		  ? kbd_buffer + KBD_BUFFER_SIZE - 1
-		  : kbd_store_ptr - 1);
+		    ? kbd_buffer + KBD_BUFFER_SIZE - 1
+		    : kbd_store_ptr - 1);
 
 	    if (kbd_store_ptr != kbd_fetch_ptr
 		&& ev->ie.kind == MONITORS_CHANGED_EVENT
@@ -5966,8 +6080,7 @@ w32_read_socket (struct terminal *terminal,
 	  count++;
 	}
 
-      if (do_help
-	  && !(hold_quit && hold_quit->kind != NO_EVENT))
+      if (do_help && !(hold_quit && hold_quit->kind != NO_EVENT))
 	{
 	  Lisp_Object frame;
 
@@ -5985,8 +6098,9 @@ w32_read_socket (struct terminal *terminal,
 		}
 
 	      any_help_event_p = 1;
-	      gen_help_event (help_echo_string, frame, help_echo_window,
-			      help_echo_object, help_echo_pos);
+	      gen_help_event (help_echo_string, frame,
+			      help_echo_window, help_echo_object,
+			      help_echo_pos);
 	    }
 	  else
 	    {
@@ -5997,12 +6111,12 @@ w32_read_socket (struct terminal *terminal,
 	}
 
       /* Event processing might have drawn to F outside redisplay.  If
-         that is the case, flush any changes that have been made to
-         the front buffer.  */
+	 that is the case, flush any changes that have been made to
+	 the front buffer.  */
 
       if (f && !w32_disable_double_buffering
-	  && FRAME_OUTPUT_DATA (f)->paint_buffer_dirty
-	  && !f->garbaged && !ignore_dirty_back_buffer)
+	  && FRAME_OUTPUT_DATA (f)->paint_buffer_dirty && !f->garbaged
+	  && !ignore_dirty_back_buffer)
 	w32_show_back_buffer (f);
     }
 
@@ -6014,11 +6128,11 @@ w32_read_socket (struct terminal *terminal,
       dpyinfo->w32_pending_autoraise_frame = NULL;
     }
 
-  /* Check which frames are still visible, if we have enqueued any user
-     events or been notified of events that may affect visibility.  We
-     do this here because there doesn't seem to be any direct
-     notification from Windows that the visibility of a window has
-     changed (at least, not in all cases).  */
+  /* Check which frames are still visible, if we have enqueued any
+     user events or been notified of events that may affect
+     visibility.  We do this here because there doesn't seem to be any
+     direct notification from Windows that the visibility of a window
+     has changed (at least, not in all cases).  */
   if (count > 0 || check_visibility)
     {
       Lisp_Object tail, frame;
@@ -6037,7 +6151,7 @@ w32_read_socket (struct terminal *terminal,
 	if (FRAME_W32_P (f) && FRAME_VISIBLE_P (f))
 	  {
 	    RECT clipbox;
-	    HDC  hdc;
+	    HDC hdc;
 	    bool obscured;
 
 	    enter_crit ();
@@ -6054,15 +6168,18 @@ w32_read_socket (struct terminal *terminal,
 
 	    obscured = FRAME_OBSCURED_P (f);
 
-	    if (clipbox.right == clipbox.left || clipbox.bottom == clipbox.top)
+	    if (clipbox.right == clipbox.left
+		|| clipbox.bottom == clipbox.top)
 	      {
-		/* Frame has become completely obscured so mark as such (we
-		   do this by setting visible to 2 so that FRAME_VISIBLE_P
-		   is still true, but redisplay will skip it).  */
+		/* Frame has become completely obscured so mark as
+		   such (we do this by setting visible to 2 so that
+		   FRAME_VISIBLE_P is still true, but redisplay will
+		   skip it).  */
 		SET_FRAME_VISIBLE (f, 2);
 
 		if (!obscured)
-		  DebPrint (("frame %p (%s) obscured\n", f, SDATA (f->name)));
+		  DebPrint (
+		    ("frame %p (%s) obscured\n", f, SDATA (f->name)));
 	      }
 	    else
 	      {
@@ -6072,8 +6189,9 @@ w32_read_socket (struct terminal *terminal,
 		if (obscured)
 		  {
 		    SET_FRAME_GARBAGED (f);
-		    DebPrint (("obscured frame %p (%s) found to be visible\n",
-			       f, SDATA (f->name)));
+		    DebPrint (
+		      ("obscured frame %p (%s) found to be visible\n",
+		       f, SDATA (f->name)));
 		  }
 	      }
 	  }
@@ -6084,8 +6202,6 @@ w32_read_socket (struct terminal *terminal,
   return count;
 }
 
-
-\f
 /***********************************************************************
 			     Text Cursor
  ***********************************************************************/
@@ -6115,7 +6231,6 @@ w32_clip_to_row (struct window *w, struct glyph_row *row,
   w32_set_clip_rectangle (hdc, &clip_rect);
 }
 
-
 /* Draw a hollow box cursor on window W in glyph row ROW.  */
 
 static void
@@ -6159,7 +6274,6 @@ w32_draw_hollow_cursor (struct window *w, struct glyph_row *row)
   release_frame_dc (f, hdc);
 }
 
-
 /* Draw a bar cursor on window W in glyph row ROW.
 
    Implementation note: One would like to draw a bar cursor with an
@@ -6169,7 +6283,7 @@ w32_draw_hollow_cursor (struct window *w, struct glyph_row *row)
 
 static void
 w32_draw_bar_cursor (struct window *w, struct glyph_row *row,
-		   int width, enum text_cursor_kinds kind)
+		     int width, enum text_cursor_kinds kind)
 {
   struct frame *f = XFRAME (w->frame);
   struct glyph *cursor_glyph;
@@ -6224,10 +6338,11 @@ w32_draw_bar_cursor (struct window *w, struct glyph_row *row,
 	    x += cursor_glyph->pixel_width - width;
 
 	  w32_fill_area (f, hdc, cursor_color, x,
-			 WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y),
+			 WINDOW_TO_FRAME_PIXEL_Y (w,
+						  w->phys_cursor.y),
 			 width, row->height);
 	}
-      else	/* HBAR_CURSOR */
+      else /* HBAR_CURSOR */
 	{
 	  int dummy_x, dummy_y, dummy_h;
 
@@ -6242,8 +6357,9 @@ w32_draw_bar_cursor (struct window *w, struct glyph_row *row,
 	      && cursor_glyph->pixel_width > w->phys_cursor_width)
 	    x += cursor_glyph->pixel_width - w->phys_cursor_width;
 	  w32_fill_area (f, hdc, cursor_color, x,
-			 WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y +
-						  row->height - width),
+			 WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y
+						       + row->height
+						       - width),
 			 w->phys_cursor_width, width);
 	}
 
@@ -6252,7 +6368,6 @@ w32_draw_bar_cursor (struct window *w, struct glyph_row *row,
     }
 }
 
-
 /* RIF: Define cursor CURSOR on frame F.  */
 
 static void
@@ -6261,11 +6376,11 @@ w32_define_frame_cursor (struct frame *f, Emacs_Cursor cursor)
   w32_define_cursor (FRAME_W32_WINDOW (f), cursor);
 }
 
-
 /* RIF: Clear area on frame F.  */
 
 static void
-w32_clear_frame_area (struct frame *f, int x, int y, int width, int height)
+w32_clear_frame_area (struct frame *f, int x, int y, int width,
+		      int height)
 {
   HDC hdc;
 
@@ -6278,7 +6393,8 @@ w32_clear_frame_area (struct frame *f, int x, int y, int width, int height)
 
 static void
 w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
-			int x, int y, enum text_cursor_kinds cursor_type,
+			int x, int y,
+			enum text_cursor_kinds cursor_type,
 			int cursor_width, bool on_p, bool active_p)
 {
   if (on_p)
@@ -6317,8 +6433,9 @@ w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
 	    = (WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y)
 	       + glyph_row->ascent - w->phys_cursor_ascent);
 	  w32_system_caret_window = w;
-	  w32_system_caret_hdr_height = WINDOW_TAB_LINE_HEIGHT (w)
-	    + WINDOW_HEADER_LINE_HEIGHT (w);
+	  w32_system_caret_hdr_height
+	    = WINDOW_TAB_LINE_HEIGHT (w)
+	      + WINDOW_HEADER_LINE_HEIGHT (w);
 	  w32_system_caret_mode_height = WINDOW_MODE_LINE_HEIGHT (w);
 
 	  PostMessage (hwnd, WM_IME_STARTCOMPOSITION, 0, 0);
@@ -6337,8 +6454,9 @@ w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
 
       if (glyph_row->exact_window_width_line_p
 	  && (glyph_row->reversed_p
-	      ? (w->phys_cursor.hpos < 0)
-	      : (w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])))
+		? (w->phys_cursor.hpos < 0)
+		: (w->phys_cursor.hpos
+		   >= glyph_row->used[TEXT_AREA])))
 	{
 	  glyph_row->cursor_in_fringe_p = true;
 	  draw_fringe_bitmap (w, glyph_row, glyph_row->reversed_p);
@@ -6356,11 +6474,13 @@ w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
 	  break;
 
 	case BAR_CURSOR:
-	  w32_draw_bar_cursor (w, glyph_row, cursor_width, BAR_CURSOR);
+	  w32_draw_bar_cursor (w, glyph_row, cursor_width,
+			       BAR_CURSOR);
 	  break;
 
 	case HBAR_CURSOR:
-	  w32_draw_bar_cursor (w, glyph_row, cursor_width, HBAR_CURSOR);
+	  w32_draw_bar_cursor (w, glyph_row, cursor_width,
+			       HBAR_CURSOR);
 	  break;
 
 	case NO_CURSOR:
@@ -6373,8 +6493,6 @@ w32_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
     }
 }
 
-
-\f
 /* Icons.  */
 
 static bool
@@ -6391,13 +6509,13 @@ w32_bitmap_icon (struct frame *f, Lisp_Object icon)
   else if (STRINGP (icon))
     {
       /* Load the main icon from the named file.  */
-      main_icon = LoadImage (NULL, (LPCTSTR) SDATA (icon), IMAGE_ICON, 0, 0,
-			     LR_DEFAULTSIZE | LR_LOADFROMFILE);
+      main_icon = LoadImage (NULL, (LPCTSTR) SDATA (icon), IMAGE_ICON,
+			     0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
       /* Try to load a small icon to go with it.  */
-      small_icon = LoadImage (NULL, (LPCSTR) SDATA (icon), IMAGE_ICON,
-			      GetSystemMetrics (SM_CXSMICON),
-			      GetSystemMetrics (SM_CYSMICON),
-			      LR_LOADFROMFILE);
+      small_icon
+	= LoadImage (NULL, (LPCSTR) SDATA (icon), IMAGE_ICON,
+		     GetSystemMetrics (SM_CXSMICON),
+		     GetSystemMetrics (SM_CYSMICON), LR_LOADFROMFILE);
     }
   else if (SYMBOLP (icon))
     {
@@ -6427,17 +6545,16 @@ w32_bitmap_icon (struct frame *f, Lisp_Object icon)
     return 1;
 
   PostMessage (FRAME_W32_WINDOW (f), WM_SETICON, (WPARAM) ICON_BIG,
-               (LPARAM) main_icon);
+	       (LPARAM) main_icon);
 
   /* If there is a small icon that goes with it, set that too.  */
   if (small_icon)
-    PostMessage (FRAME_W32_WINDOW (f), WM_SETICON, (WPARAM) ICON_SMALL,
-		 (LPARAM) small_icon);
+    PostMessage (FRAME_W32_WINDOW (f), WM_SETICON,
+		 (WPARAM) ICON_SMALL, (LPARAM) small_icon);
 
   return 0;
 }
 
-\f
 /************************************************************************
 			  Handling X errors
  ************************************************************************/
@@ -6462,7 +6579,6 @@ x_io_error_quitter (display)
 
  */
 
-\f
 /* Changing the font of the frame.  */
 
 static Lisp_Object
@@ -6493,26 +6609,26 @@ w32_new_font (struct frame *f, Lisp_Object font_object, int fontset)
   else
     {
       FRAME_CONFIG_SCROLL_BAR_COLS (f) = (14 + unit - 1) / unit;
-      FRAME_CONFIG_SCROLL_BAR_WIDTH (f) =
-	FRAME_CONFIG_SCROLL_BAR_COLS (f) * unit;
+      FRAME_CONFIG_SCROLL_BAR_WIDTH (f)
+	= FRAME_CONFIG_SCROLL_BAR_COLS (f) * unit;
     }
 
-  FRAME_TAB_BAR_HEIGHT (f) = FRAME_TAB_BAR_LINES (f) * FRAME_LINE_HEIGHT (f);
+  FRAME_TAB_BAR_HEIGHT (f)
+    = FRAME_TAB_BAR_LINES (f) * FRAME_LINE_HEIGHT (f);
 
-/* Don't change the size of a tip frame; there's no point in
-   doing it because it's done in Fx_show_tip, and it leads to
-   problems because the tip frame has no widget.  */
+  /* Don't change the size of a tip frame; there's no point in
+     doing it because it's done in Fx_show_tip, and it leads to
+     problems because the tip frame has no widget.  */
   if (FRAME_NATIVE_WINDOW (f) != 0 && !FRAME_TOOLTIP_P (f))
-    adjust_frame_size
-      (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
-       FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3, false, Qfont);
+    adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
+		       FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 3,
+		       false, Qfont);
 
   /* X version sets font of input methods here also.  */
 
   return font_object;
 }
 
-\f
 /***********************************************************************
 	TODO: W32 Input Methods
  ***********************************************************************/
@@ -6527,7 +6643,6 @@ xim_close_dpy (dpyinfo)
 
  */
 
-\f
 /* Calculate the absolute position in frame F
    from its current recorded position values and gravity.  */
 
@@ -6551,13 +6666,13 @@ w32_calc_absolute_position (struct frame *f)
   if (GetWindowPlacement (FRAME_W32_WINDOW (f), &wp)
       && GetClientRect (FRAME_W32_WINDOW (f), &client_rect))
     {
-      left_right_borders_width =
-	(wp.rcNormalPosition.right - wp.rcNormalPosition.left) -
-	(client_rect.right - client_rect.left);
+      left_right_borders_width
+	= (wp.rcNormalPosition.right - wp.rcNormalPosition.left)
+	  - (client_rect.right - client_rect.left);
 
-      top_bottom_borders_height =
-	(wp.rcNormalPosition.bottom - wp.rcNormalPosition.top) -
-	(client_rect.bottom - client_rect.top);
+      top_bottom_borders_height
+	= (wp.rcNormalPosition.bottom - wp.rcNormalPosition.top)
+	  - (client_rect.bottom - client_rect.top);
     }
   else
     {
@@ -6580,23 +6695,24 @@ w32_calc_absolute_position (struct frame *f)
 
       list = Fw32_display_monitor_attributes_list (Qnil);
       while (CONSP (list))
-        {
-          Lisp_Object attributes = CAR(list);
-          Lisp_Object geometry;
-          Lisp_Object monitor_left, monitor_top;
-
-          list = CDR(list);
-
-          geometry = Fassoc (Qgeometry, attributes, Qnil);
-          if (!NILP (geometry))
-            {
-              monitor_left = Fnth (make_fixnum (1), geometry);
-              monitor_top  = Fnth (make_fixnum (2), geometry);
-
-              display_left = min (display_left, XFIXNUM (monitor_left));
-              display_top  = min (display_top,  XFIXNUM (monitor_top));
-            }
-        }
+	{
+	  Lisp_Object attributes = CAR (list);
+	  Lisp_Object geometry;
+	  Lisp_Object monitor_left, monitor_top;
+
+	  list = CDR (list);
+
+	  geometry = Fassoc (Qgeometry, attributes, Qnil);
+	  if (!NILP (geometry))
+	    {
+	      monitor_left = Fnth (make_fixnum (1), geometry);
+	      monitor_top = Fnth (make_fixnum (2), geometry);
+
+	      display_left
+		= min (display_left, XFIXNUM (monitor_left));
+	      display_top = min (display_top, XFIXNUM (monitor_top));
+	    }
+	}
     }
 
   /* Treat negative positions as relative to the rightmost bottommost
@@ -6605,52 +6721,47 @@ w32_calc_absolute_position (struct frame *f)
      I see no need for subtracting 1 from the border widths - is there
      any on the remaining platforms?  Here these subtractions did put
      the last pixel line/column of a frame off-display when, for
-     example, a (set-frame-parameter nil 'left '(- 0)) specification was
-     used - martin 20017-05-05. */
+     example, a (set-frame-parameter nil 'left '(- 0)) specification
+     was used - martin 20017-05-05. */
   if (flags & XNegative)
     {
       if (p)
-	f->left_pos = (FRAME_PIXEL_WIDTH (p)
-		       - FRAME_PIXEL_WIDTH (f)
-		       + f->left_pos
-		       - left_right_borders_width);
+	f->left_pos = (FRAME_PIXEL_WIDTH (p) - FRAME_PIXEL_WIDTH (f)
+		       + f->left_pos - left_right_borders_width);
       else
-	f->left_pos = (w32_display_pixel_width (FRAME_DISPLAY_INFO (f))
-		       + display_left
-		       - FRAME_PIXEL_WIDTH (f)
-		       + f->left_pos
-		       - left_right_borders_width);
+	f->left_pos
+	  = (w32_display_pixel_width (FRAME_DISPLAY_INFO (f))
+	     + display_left - FRAME_PIXEL_WIDTH (f) + f->left_pos
+	     - left_right_borders_width);
     }
 
   if (flags & YNegative)
     {
       if (p)
-	f->top_pos = (FRAME_PIXEL_HEIGHT (p)
-		      - FRAME_PIXEL_HEIGHT (f)
-		      + f->top_pos
-		      - top_bottom_borders_height);
+	f->top_pos = (FRAME_PIXEL_HEIGHT (p) - FRAME_PIXEL_HEIGHT (f)
+		      + f->top_pos - top_bottom_borders_height);
       else
-	f->top_pos = (w32_display_pixel_height (FRAME_DISPLAY_INFO (f))
-		      + display_top
-		      - FRAME_PIXEL_HEIGHT (f)
-		      + f->top_pos
-		      - top_bottom_borders_height);
+	f->top_pos
+	  = (w32_display_pixel_height (FRAME_DISPLAY_INFO (f))
+	     + display_top - FRAME_PIXEL_HEIGHT (f) + f->top_pos
+	     - top_bottom_borders_height);
     }
 
   /* The left_pos and top_pos are now relative to the top and left
      screen edges, so the flags should correspond.  */
-  f->size_hint_flags &= ~ (XNegative | YNegative);
+  f->size_hint_flags &= ~(XNegative | YNegative);
 }
 
 /* CHANGE_GRAVITY is 1 when calling from Fset_frame_position,
    to really change the position, and 0 when calling from
    w32_make_frame_visible (in that case, XOFF and YOFF are the current
-   position values).  It is -1 when calling from gui_set_frame_parameters,
-   which means, do adjust for borders but don't change the gravity.  */
+   position values).  It is -1 when calling from
+   gui_set_frame_parameters, which means, do adjust for borders but
+   don't change the gravity.  */
 
 static void
 w32_set_offset (struct frame *f, register int xoff, register int yoff,
-                int change_gravity)
+		int change_gravity)
 {
   int modified_top, modified_left;
 
@@ -6658,7 +6769,7 @@ w32_set_offset (struct frame *f, register int xoff, register int yoff,
     {
       f->top_pos = yoff;
       f->left_pos = xoff;
-      f->size_hint_flags &= ~ (XNegative | YNegative);
+      f->size_hint_flags &= ~(XNegative | YNegative);
       if (xoff < 0)
 	f->size_hint_flags |= XNegative;
       if (yoff < 0)
@@ -6674,14 +6785,12 @@ w32_set_offset (struct frame *f, register int xoff, register int yoff,
   modified_top = f->top_pos;
 
   if (!FRAME_PARENT_FRAME (f))
-    my_set_window_pos (FRAME_W32_WINDOW (f), NULL,
-		       modified_left, modified_top,
-		       0, 0,
+    my_set_window_pos (FRAME_W32_WINDOW (f), NULL, modified_left,
+		       modified_top, 0, 0,
 		       SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
   else
-    my_set_window_pos (FRAME_W32_WINDOW (f), HWND_TOP,
-		       modified_left, modified_top,
-		       0, 0,
+    my_set_window_pos (FRAME_W32_WINDOW (f), HWND_TOP, modified_left,
+		       modified_top, 0, 0,
 		       SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
   unblock_input ();
 }
@@ -6691,21 +6800,22 @@ w32fullscreen_hook (struct frame *f)
 {
   if (FRAME_VISIBLE_P (f))
     {
-      HWND hwnd = FRAME_W32_WINDOW(f);
+      HWND hwnd = FRAME_W32_WINDOW (f);
       DWORD dwStyle = GetWindowLong (hwnd, GWL_STYLE);
       RECT rect;
       enum fullscreen_type prev_fsmode = FRAME_PREV_FSMODE (f);
 
-      block_input();
+      block_input ();
       f->want_fullscreen &= ~FULLSCREEN_WAIT;
 
       if (FRAME_PREV_FSMODE (f) == FULLSCREEN_NONE)
-        GetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f));
+	GetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f));
 
       if (FRAME_PREV_FSMODE (f) == FULLSCREEN_BOTH)
-        {
+	{
 	  if (!FRAME_UNDECORATED (f))
-	    SetWindowLong (hwnd, GWL_STYLE, dwStyle | WS_OVERLAPPEDWINDOW);
+	    SetWindowLong (hwnd, GWL_STYLE,
+			   dwStyle | WS_OVERLAPPEDWINDOW);
 	  SetWindowPlacement (hwnd, &FRAME_NORMAL_PLACEMENT (f));
 	}
       else if (FRAME_PREV_FSMODE (f) == FULLSCREEN_HEIGHT
@@ -6727,31 +6837,36 @@ w32fullscreen_hook (struct frame *f)
 	  ShowWindow (hwnd, SW_MAXIMIZE);
 	}
       else if (f->want_fullscreen == FULLSCREEN_BOTH)
-        {
-	  w32_fullscreen_rect
-	    (hwnd, f->want_fullscreen,
-	     FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect);
+	{
+	  w32_fullscreen_rect (hwnd, f->want_fullscreen,
+			       FRAME_NORMAL_PLACEMENT (f)
+				 .rcNormalPosition,
+			       &rect);
 	  if (!FRAME_UNDECORATED (f))
-	    SetWindowLong (hwnd, GWL_STYLE, dwStyle & ~WS_OVERLAPPEDWINDOW);
-          SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
-                        rect.right - rect.left, rect.bottom - rect.top,
-                        SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
-	  change_frame_size
-	    (f, rect.right - rect.left, rect.bottom - rect.top,
-	     false, true, false);
-        }
+	    SetWindowLong (hwnd, GWL_STYLE,
+			   dwStyle & ~WS_OVERLAPPEDWINDOW);
+	  SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
+			rect.right - rect.left,
+			rect.bottom - rect.top,
+			SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
+	  change_frame_size (f, rect.right - rect.left,
+			     rect.bottom - rect.top, false, true,
+			     false);
+	}
       else
-        {
+	{
 	  ShowWindow (hwnd, SW_SHOWNORMAL);
-	  w32_fullscreen_rect
-	    (hwnd, f->want_fullscreen,
-	     FRAME_NORMAL_PLACEMENT (f).rcNormalPosition, &rect);
-          SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
-                        rect.right - rect.left, rect.bottom - rect.top, 0);
-
-	  change_frame_size
-	    (f, rect.right - rect.left, rect.bottom - rect.top,
-	     false, true, false);
+	  w32_fullscreen_rect (hwnd, f->want_fullscreen,
+			       FRAME_NORMAL_PLACEMENT (f)
+				 .rcNormalPosition,
+			       &rect);
+	  SetWindowPos (hwnd, HWND_TOP, rect.left, rect.top,
+			rect.right - rect.left,
+			rect.bottom - rect.top, 0);
+
+	  change_frame_size (f, rect.right - rect.left,
+			     rect.bottom - rect.top, false, true,
+			     false);
 	}
 
       f->want_fullscreen = FULLSCREEN_NONE;
@@ -6761,19 +6876,18 @@ w32fullscreen_hook (struct frame *f)
 	  || f->want_fullscreen == FULLSCREEN_WIDTH
 	  || f->want_fullscreen == FULLSCREEN_HEIGHT)
 	do_pending_window_change (0);
-
     }
   else
     f->want_fullscreen |= FULLSCREEN_WAIT;
 }
 
 /* Change the size of frame F's Windows window to WIDTH and HEIGHT
-   pixels.  If CHANGE_GRAVITY, change to top-left-corner window gravity
-   for this size change and subsequent size changes.  Otherwise leave
-   the window gravity unchanged.  */
+   pixels.  If CHANGE_GRAVITY, change to top-left-corner window
+   gravity for this size change and subsequent size changes. Otherwise
+   leave the window gravity unchanged.  */
 static void
-w32_set_window_size (struct frame *f, bool change_gravity,
-		     int width, int height)
+w32_set_window_size (struct frame *f, bool change_gravity, int width,
+		     int height)
 {
   Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
   RECT rect;
@@ -6815,7 +6929,8 @@ w32_set_window_size (struct frame *f, bool change_gravity,
   rect.right = width;
   rect.bottom = height;
 
-  AdjustWindowRect (&rect, f->output_data.w32->dwStyle, menu_bar_height > 0);
+  AdjustWindowRect (&rect, f->output_data.w32->dwStyle,
+		    menu_bar_height > 0);
 
   if (!(f->after_make_frame)
       && !(f->want_fullscreen & FULLSCREEN_WAIT)
@@ -6825,16 +6940,14 @@ w32_set_window_size (struct frame *f, bool change_gravity,
 
       GetWindowRect (FRAME_W32_WINDOW (f), &window_rect);
 
-      if (EQ (fullscreen, Qmaximized)
-	  || EQ (fullscreen, Qfullboth)
+      if (EQ (fullscreen, Qmaximized) || EQ (fullscreen, Qfullboth)
 	  || EQ (fullscreen, Qfullwidth))
 	{
 	  rect.left = window_rect.left;
 	  rect.right = window_rect.right;
 	  width = -1;
 	}
-      if (EQ (fullscreen, Qmaximized)
-	  || EQ (fullscreen, Qfullboth)
+      if (EQ (fullscreen, Qmaximized) || EQ (fullscreen, Qfullboth)
 	  || EQ (fullscreen, Qfullheight))
 	{
 	  rect.top = window_rect.top;
@@ -6846,14 +6959,13 @@ w32_set_window_size (struct frame *f, bool change_gravity,
   if (width > 0 || height > 0)
     {
       if (!FRAME_PARENT_FRAME (f))
-	my_set_window_pos (FRAME_W32_WINDOW (f), NULL,
-			   0, 0,
+	my_set_window_pos (FRAME_W32_WINDOW (f), NULL, 0, 0,
 			   rect.right - rect.left,
 			   rect.bottom - rect.top,
-			   SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
+			   SWP_NOZORDER | SWP_NOMOVE
+			     | SWP_NOACTIVATE);
       else
-	my_set_window_pos (FRAME_W32_WINDOW (f), HWND_TOP,
-			   0, 0,
+	my_set_window_pos (FRAME_W32_WINDOW (f), HWND_TOP, 0, 0,
 			   rect.right - rect.left,
 			   rect.bottom - rect.top,
 			   SWP_NOMOVE | SWP_NOACTIVATE);
@@ -6864,11 +6976,11 @@ w32_set_window_size (struct frame *f, bool change_gravity,
       /* If cursor was outside the new size, mark it as off.  */
       mark_window_cursors_off (XWINDOW (f->root_window));
 
-      /* Clear out any recollection of where the mouse highlighting was,
-	 since it might be in a place that's outside the new frame size.
-	 Actually checking whether it is outside is a pain in the neck,
-	 so don't try--just let the highlighting be done afresh with new
-	 size.  */
+      /* Clear out any recollection of where the mouse highlighting
+	 was, since it might be in a place that's outside the new
+	 frame size. Actually checking whether it is outside is a pain
+	 in the neck, so don't try--just let the highlighting be done
+	 afresh with new size.  */
       cancel_mouse_face (f);
     }
 
@@ -6876,7 +6988,7 @@ w32_set_window_size (struct frame *f, bool change_gravity,
 
   do_pending_window_change (false);
 }
-\f
+
 /* Mouse warping.  */
 
 void
@@ -6921,7 +7033,6 @@ w32_get_focus_frame (struct frame *f)
   return lisp_focus;
 }
 
-\f
 /* Focus shifting, raising and lowering.  */
 
 /* The NOACTIVATE argument has no effect on Windows.  According to the
@@ -6943,7 +7054,7 @@ w32_focus_frame (struct frame *f, bool noactivate)
     my_set_focus (f, FRAME_W32_WINDOW (f));
   else
 #endif
-    my_set_foreground_window (FRAME_W32_WINDOW (f));
+  my_set_foreground_window (FRAME_W32_WINDOW (f));
   unblock_input ();
 }
 
@@ -6954,19 +7065,19 @@ w32_raise_frame (struct frame *f)
   block_input ();
 
   /* Strictly speaking, raise-frame should only change the frame's Z
-     order, leaving input focus unchanged.  This is reasonable behavior
-     on X where the usual policy is point-to-focus.  However, this
-     behavior would be very odd on Windows where the usual policy is
-     click-to-focus.
+     order, leaving input focus unchanged.  This is reasonable
+     behavior on X where the usual policy is point-to-focus.  However,
+     this behavior would be very odd on Windows where the usual policy
+     is click-to-focus.
 
      On X, if the mouse happens to be over the raised frame, it gets
      input focus anyway (so the window with focus will never be
      completely obscured) - if not, then just moving the mouse over it
-     is sufficient to give it focus.  On Windows, the user must actually
-     click on the frame (preferably the title bar so as not to move
-     point), which is more awkward.  Also, no other Windows program
-     raises a window to the top but leaves another window (possibly now
-     completely obscured) with input focus.
+     is sufficient to give it focus.  On Windows, the user must
+     actually click on the frame (preferably the title bar so as not
+     to move point), which is more awkward.  Also, no other Windows
+     program raises a window to the top but leaves another window
+     (possibly now completely obscured) with input focus.
 
      Because there is a system setting on Windows that allows the user
      to choose the point to focus policy, we make the strict semantics
@@ -6974,28 +7085,26 @@ w32_raise_frame (struct frame *f)
 
   if (NILP (Vw32_grab_focus_on_raise))
     {
-      /* The obvious call to my_set_window_pos doesn't work if Emacs is
-	 not already the foreground application: the frame is raised
-	 above all other frames belonging to us, but not above the
-	 current top window.  To achieve that, we have to resort to this
-	 more cumbersome method.  */
+      /* The obvious call to my_set_window_pos doesn't work if Emacs
+	 is not already the foreground application: the frame is
+	 raised above all other frames belonging to us, but not above
+	 the current top window.  To achieve that, we have to resort
+	 to this more cumbersome method.  */
 
       HDWP handle = BeginDeferWindowPos (2);
       if (handle)
 	{
-	  handle = DeferWindowPos (handle,
-				   FRAME_W32_WINDOW (f),
-				   HWND_TOP,
-				   0, 0, 0, 0,
-				   SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
+	  handle = DeferWindowPos (handle, FRAME_W32_WINDOW (f),
+				   HWND_TOP, 0, 0, 0, 0,
+				   SWP_NOSIZE | SWP_NOMOVE
+				     | SWP_NOACTIVATE);
 	  if (handle)
 	    {
-	      handle = DeferWindowPos (handle,
-				       GetForegroundWindow (),
-				       FRAME_W32_WINDOW (f),
-				       0, 0, 0, 0,
-				       SWP_NOSIZE | SWP_NOMOVE |
-				       SWP_NOACTIVATE);
+	      handle
+		= DeferWindowPos (handle, GetForegroundWindow (),
+				  FRAME_W32_WINDOW (f), 0, 0, 0, 0,
+				  SWP_NOSIZE | SWP_NOMOVE
+				    | SWP_NOACTIVATE);
 	      if (handle)
 		EndDeferWindowPos (handle);
 	    }
@@ -7014,9 +7123,7 @@ w32_raise_frame (struct frame *f)
 w32_lower_frame (struct frame *f)
 {
   block_input ();
-  my_set_window_pos (FRAME_W32_WINDOW (f),
-		     HWND_BOTTOM,
-		     0, 0, 0, 0,
+  my_set_window_pos (FRAME_W32_WINDOW (f), HWND_BOTTOM, 0, 0, 0, 0,
 		     SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
   unblock_input ();
 }
@@ -7024,7 +7131,7 @@ w32_lower_frame (struct frame *f)
 static void
 w32_frame_raise_lower (struct frame *f, bool raise_flag)
 {
-  if (! FRAME_W32_P (f))
+  if (!FRAME_W32_P (f))
     return;
 
   if (raise_flag)
@@ -7032,7 +7139,7 @@ w32_frame_raise_lower (struct frame *f, bool raise_flag)
   else
     w32_lower_frame (f);
 }
-\f
+
 /* Change of visibility.  */
 
 /* This tries to wait until the frame is really visible, depending on
@@ -7050,28 +7157,30 @@ w32_make_frame_visible (struct frame *f)
 
   gui_set_bitmap_icon (f);
 
-  if (! FRAME_VISIBLE_P (f))
+  if (!FRAME_VISIBLE_P (f))
     {
       /* We test FRAME_GARBAGED_P here to make sure we don't
 	 call w32_set_offset a second time
 	 if we get to w32_make_frame_visible a second time
 	 before the window gets really visible.  */
-      if (! FRAME_ICONIFIED_P (f)
-	  && ! f->output_data.w32->asked_for_visible)
+      if (!FRAME_ICONIFIED_P (f)
+	  && !f->output_data.w32->asked_for_visible)
 	{
 	  if (!FRAME_PARENT_FRAME (f))
 	    {
 	      RECT workarea_rect;
 	      RECT window_rect;
 
-	      /* Adjust vertical window position in order to avoid being
-		 covered by a taskbar placed at the bottom of the desktop. */
-	      SystemParametersInfo (SPI_GETWORKAREA, 0, &workarea_rect, 0);
+	      /* Adjust vertical window position in order to avoid
+		 being covered by a taskbar placed at the bottom of
+		 the desktop. */
+	      SystemParametersInfo (SPI_GETWORKAREA, 0,
+				    &workarea_rect, 0);
 	      GetWindowRect (FRAME_W32_WINDOW (f), &window_rect);
 	      if (window_rect.bottom > workarea_rect.bottom
 		  && window_rect.top > workarea_rect.top)
-		f->top_pos = max (window_rect.top
-				  - window_rect.bottom + workarea_rect.bottom,
+		f->top_pos = max (window_rect.top - window_rect.bottom
+				    + workarea_rect.bottom,
 				  workarea_rect.top);
 	    }
 
@@ -7080,19 +7189,18 @@ w32_make_frame_visible (struct frame *f)
 
       f->output_data.w32->asked_for_visible = 1;
 
-      /* According to a report in emacs-devel 2008-06-03, SW_SHOWNORMAL
-	 causes unexpected behavior when unminimizing frames that were
-	 previously maximized.  But only SW_SHOWNORMAL works properly for
-	 frames that were truly hidden (using make-frame-invisible), so
-	 we need it to avoid Bug#5482.  It seems that iconified is only
-	 set for minimized windows that are still visible, so use that to
-	 determine the appropriate flag to pass ShowWindow.  */
+      /* According to a report in emacs-devel 2008-06-03,
+	 SW_SHOWNORMAL causes unexpected behavior when unminimizing
+	 frames that were previously maximized.  But only
+	 SW_SHOWNORMAL works properly for frames that were truly
+	 hidden (using make-frame-invisible), so we need it to avoid
+	 Bug#5482.  It seems that iconified is only set for minimized
+	 windows that are still visible, so use that to determine the
+	 appropriate flag to pass ShowWindow.  */
       my_show_window (f, FRAME_W32_WINDOW (f),
-                      FRAME_ICONIFIED_P (f)
-		      ? SW_RESTORE
-		      : FRAME_NO_FOCUS_ON_MAP (f)
-		      ? SW_SHOWNOACTIVATE
-		      : SW_SHOWNORMAL);
+		      FRAME_ICONIFIED_P (f)	  ? SW_RESTORE
+		      : FRAME_NO_FOCUS_ON_MAP (f) ? SW_SHOWNOACTIVATE
+						  : SW_SHOWNORMAL);
     }
 
   if (!FLOATP (Vx_wait_for_event_timeout))
@@ -7102,8 +7210,8 @@ w32_make_frame_visible (struct frame *f)
     }
 
   /* Synchronize to ensure Emacs knows the frame is visible
-     before we do anything else.  We do this loop with input not blocked
-     so that incoming events are handled.  */
+     before we do anything else.  We do this loop with input not
+     blocked so that incoming events are handled.  */
   {
     Lisp_Object frame;
     double timeout = XFLOAT_DATA (Vx_wait_for_event_timeout);
@@ -7117,21 +7225,23 @@ w32_make_frame_visible (struct frame *f)
     /* Wait until the frame is visible.  Process X events until a
        MapNotify event has been seen, or until we think we won't get a
        MapNotify at all..  */
-    while (timeout > (XFLOAT_DATA (Ffloat_time (Qnil)) - start_time) &&
-           !FRAME_VISIBLE_P (f))
+    while (timeout > (XFLOAT_DATA (Ffloat_time (Qnil)) - start_time)
+	   && !FRAME_VISIBLE_P (f))
       {
 	/* Force processing of queued events.  */
-        /* TODO: x_sync equivalent?  */
-
-	/* Machines that do polling rather than SIGIO have been observed
-	   to go into a busy-wait here.  So we'll fake an alarm signal
-	   to let the handler know that there's something to be read.
-	   We used to raise a real alarm, but it seems that the handler
-	   isn't always enabled here.  This is probably a bug.  */
+	/* TODO: x_sync equivalent?  */
+
+	/* Machines that do polling rather than SIGIO have been
+	   observed to go into a busy-wait here.  So we'll fake an
+	   alarm signal to let the handler know that there's something
+	   to be read. We used to raise a real alarm, but it seems
+	   that the handler isn't always enabled here.  This is
+	   probably a bug.  */
 	if (input_polling_used ())
 	  {
-	    /* It could be confusing if a real alarm arrives while processing
-	       the fake one.  Turn it off and let the handler reset it.  */
+	    /* It could be confusing if a real alarm arrives while
+	       processing the fake one.  Turn it off and let the
+	       handler reset it.  */
 	    int old_poll_suppress_count = poll_suppress_count;
 	    poll_suppress_count = 1;
 	    poll_for_input_1 ();
@@ -7193,8 +7303,8 @@ w32_iconify_frame (struct frame *f)
   gui_set_bitmap_icon (f);
 
   /* Simulate the user minimizing the frame.  */
-  SendMessageTimeout (FRAME_W32_WINDOW (f), WM_SYSCOMMAND, SC_MINIMIZE, 0,
-		      0, 6000, NULL);
+  SendMessageTimeout (FRAME_W32_WINDOW (f), WM_SYSCOMMAND,
+		      SC_MINIMIZE, 0, 0, 6000, NULL);
 
   SET_FRAME_VISIBLE (f, 0);
   SET_FRAME_ICONIFIED (f, true);
@@ -7202,7 +7312,6 @@ w32_iconify_frame (struct frame *f)
   unblock_input ();
 }
 
-\f
 /* Free resources of frame F.  */
 
 void
@@ -7241,7 +7350,6 @@ w32_free_frame_resources (struct frame *f)
   unblock_input ();
 }
 
-
 /* Destroy the window of frame F.  */
 static void
 w32_destroy_window (struct frame *f)
@@ -7252,7 +7360,6 @@ w32_destroy_window (struct frame *f)
   dpyinfo->reference_count--;
 }
 
-\f
 /* Setting window manager hints.  */
 
 /* Set the normal size hints for the window manager, for frame F.
@@ -7269,27 +7376,29 @@ w32_wm_set_size_hint (struct frame *f, long flags, bool user_position)
 
   SetWindowLong (window, WND_FONTWIDTH_INDEX, FRAME_COLUMN_WIDTH (f));
   SetWindowLong (window, WND_LINEHEIGHT_INDEX, FRAME_LINE_HEIGHT (f));
-  SetWindowLong (window, WND_BORDER_INDEX, FRAME_INTERNAL_BORDER_WIDTH (f));
-  SetWindowLong (window, WND_VSCROLLBAR_INDEX, FRAME_SCROLL_BAR_AREA_WIDTH (f));
-  SetWindowLong (window, WND_HSCROLLBAR_INDEX, FRAME_SCROLL_BAR_AREA_HEIGHT (f));
+  SetWindowLong (window, WND_BORDER_INDEX,
+		 FRAME_INTERNAL_BORDER_WIDTH (f));
+  SetWindowLong (window, WND_VSCROLLBAR_INDEX,
+		 FRAME_SCROLL_BAR_AREA_WIDTH (f));
+  SetWindowLong (window, WND_HSCROLLBAR_INDEX,
+		 FRAME_SCROLL_BAR_AREA_HEIGHT (f));
 
   leave_crit ();
 }
 
-\f
 /***********************************************************************
 				Fonts
  ***********************************************************************/
 
 #ifdef GLYPH_DEBUG
 
-/* Check that FONT is valid on frame F.  It is if it can be found in F's
-   font table.  */
+/* Check that FONT is valid on frame F.  It is if it can be found in
+   F's font table.  */
 
 static void
 w32_check_font (struct frame *f, struct font *font)
 {
-  eassert (font != NULL && ! NILP (font->props[FONT_TYPE_INDEX]));
+  eassert (font != NULL && !NILP (font->props[FONT_TYPE_INDEX]));
   if (font->driver->check)
     eassert (font->driver->check (f, font) == 0);
 }
@@ -7348,7 +7457,6 @@ w32_toggle_invisible_pointer (struct frame *f, bool invisible)
   unblock_input ();
 }
 
-\f
 /***********************************************************************
 			     Image Hooks
  ***********************************************************************/
@@ -7359,7 +7467,6 @@ w32_free_pixmap (struct frame *_f, Emacs_Pixmap pixmap)
   DeleteObject (pixmap);
 }
 
-\f
 /***********************************************************************
 			    Initialization
  ***********************************************************************/
@@ -7382,7 +7489,8 @@ w32_initialize_display_info (Lisp_Object display_name)
       if (ckd_add (&nbytes, nbytes, SCHARS (Vsystem_name)))
 	memory_full (SIZE_MAX);
       dpyinfo->w32_id_name = xmalloc (nbytes);
-      sprintf (dpyinfo->w32_id_name, "%s%s%s", title, at, SDATA (Vsystem_name));
+      sprintf (dpyinfo->w32_id_name, "%s%s%s", title, at,
+	       SDATA (Vsystem_name));
     }
   else
     {
@@ -7406,9 +7514,10 @@ w32_initialize_display_info (Lisp_Object display_name)
   reset_mouse_highlight (&dpyinfo->mouse_highlight);
 }
 
-/* Create an xrdb-style database of resources to supersede registry settings.
-   The database is just a concatenation of C strings, finished by an additional
-   \0.  The strings are submitted to some basic normalization, so
+/* Create an xrdb-style database of resources to supersede registry
+   settings. The database is just a concatenation of C strings,
+   finished by an additional \0.  The strings are submitted to some
+   basic normalization, so
 
      [ *]option[ *]:[ *]value...
 
@@ -7427,33 +7536,35 @@ w32_make_rdb (char *xrm_option)
   int in_option = 1;
   int before_value = 0;
 
-  do {
-    ch = *xrm_option++;
+  do
+    {
+      ch = *xrm_option++;
 
-    if (ch == '\n')
-      {
-        *current++ = '\0';
-        in_option = 1;
-        before_value = 0;
-      }
-    else if (ch != ' ')
-      {
-        *current++ = ch;
-        if (in_option && (ch == ':'))
-          {
-            in_option = 0;
-            before_value = 1;
-          }
-        else if (before_value)
-          {
-            before_value = 0;
-          }
-      }
-    else if (!(in_option || before_value))
-      {
-        *current++ = ch;
-      }
-  } while (ch);
+      if (ch == '\n')
+	{
+	  *current++ = '\0';
+	  in_option = 1;
+	  before_value = 0;
+	}
+      else if (ch != ' ')
+	{
+	  *current++ = ch;
+	  if (in_option && (ch == ':'))
+	    {
+	      in_option = 0;
+	      before_value = 1;
+	    }
+	  else if (before_value)
+	    {
+	      before_value = 0;
+	    }
+	}
+      else if (!(in_option || before_value))
+	{
+	  *current++ = ch;
+	}
+    }
+  while (ch);
 
   *current = '\0';
 
@@ -7462,37 +7573,35 @@ w32_make_rdb (char *xrm_option)
 
 extern frame_parm_handler w32_frame_parm_handlers[];
 
-static struct redisplay_interface w32_redisplay_interface =
-{
-  w32_frame_parm_handlers,
-  gui_produce_glyphs,
-  gui_write_glyphs,
-  gui_insert_glyphs,
-  gui_clear_end_of_line,
-  w32_scroll_run,
-  w32_after_update_window_line,
-  w32_update_window_begin,
-  w32_update_window_end,
-  0, /* flush_display */
-  gui_clear_window_mouse_face,
-  gui_get_glyph_overhangs,
-  gui_fix_overlapping_area,
-  w32_draw_fringe_bitmap,
-  w32_define_fringe_bitmap,
-  w32_destroy_fringe_bitmap,
-  w32_compute_glyph_string_overhangs,
-  w32_draw_glyph_string,
-  w32_define_frame_cursor,
-  w32_clear_frame_area,
-  w32_clear_under_internal_border,
-  w32_draw_window_cursor,
-  w32_draw_vertical_window_border,
-  w32_draw_window_divider,
-  w32_shift_glyphs_for_insert,
-  w32_show_hourglass,
-  w32_hide_hourglass,
-  w32_default_font_parameter
-};
+static struct redisplay_interface w32_redisplay_interface
+  = { w32_frame_parm_handlers,
+      gui_produce_glyphs,
+      gui_write_glyphs,
+      gui_insert_glyphs,
+      gui_clear_end_of_line,
+      w32_scroll_run,
+      w32_after_update_window_line,
+      w32_update_window_begin,
+      w32_update_window_end,
+      0, /* flush_display */
+      gui_clear_window_mouse_face,
+      gui_get_glyph_overhangs,
+      gui_fix_overlapping_area,
+      w32_draw_fringe_bitmap,
+      w32_define_fringe_bitmap,
+      w32_destroy_fringe_bitmap,
+      w32_compute_glyph_string_overhangs,
+      w32_draw_glyph_string,
+      w32_define_frame_cursor,
+      w32_clear_frame_area,
+      w32_clear_under_internal_border,
+      w32_draw_window_cursor,
+      w32_draw_vertical_window_border,
+      w32_draw_window_divider,
+      w32_shift_glyphs_for_insert,
+      w32_show_hourglass,
+      w32_hide_hourglass,
+      w32_default_font_parameter };
 
 static void w32_delete_terminal (struct terminal *term);
 
@@ -7512,21 +7621,25 @@ w32_create_terminal (struct w32_display_info *dpyinfo)
   terminal->ins_del_lines_hook = w32_ins_del_lines;
   terminal->delete_glyphs_hook = w32_delete_glyphs;
   terminal->ring_bell_hook = w32_ring_bell;
-  terminal->toggle_invisible_pointer_hook = w32_toggle_invisible_pointer;
+  terminal->toggle_invisible_pointer_hook
+    = w32_toggle_invisible_pointer;
   terminal->update_begin_hook = w32_update_begin;
   terminal->update_end_hook = w32_update_end;
   terminal->read_socket_hook = w32_read_socket;
   terminal->frame_up_to_date_hook = w32_frame_up_to_date;
-  terminal->buffer_flipping_unblocked_hook = w32_buffer_flipping_unblocked_hook;
+  terminal->buffer_flipping_unblocked_hook
+    = w32_buffer_flipping_unblocked_hook;
   terminal->defined_color_hook = w32_defined_color;
-  terminal->query_frame_background_color = w32_query_frame_background_color;
+  terminal->query_frame_background_color
+    = w32_query_frame_background_color;
   terminal->query_colors = w32_query_colors;
   terminal->mouse_position_hook = w32_mouse_position;
   terminal->get_focus_frame = w32_get_focus_frame;
   terminal->focus_frame_hook = w32_focus_frame;
   terminal->frame_rehighlight_hook = w32_frame_rehighlight;
   terminal->frame_raise_lower_hook = w32_frame_raise_lower;
-  terminal->frame_visible_invisible_hook = w32_make_frame_visible_invisible;
+  terminal->frame_visible_invisible_hook
+    = w32_make_frame_visible_invisible;
   terminal->fullscreen_hook = w32fullscreen_hook;
   terminal->iconify_frame_hook = w32_iconify_frame;
   terminal->set_window_size_hook = w32_set_window_size;
@@ -7540,10 +7653,14 @@ w32_create_terminal (struct w32_display_info *dpyinfo)
   terminal->popup_dialog_hook = w32_popup_dialog;
   terminal->change_tab_bar_height_hook = w32_change_tab_bar_height;
   terminal->change_tool_bar_height_hook = w32_change_tool_bar_height;
-  terminal->set_vertical_scroll_bar_hook = w32_set_vertical_scroll_bar;
-  terminal->set_horizontal_scroll_bar_hook = w32_set_horizontal_scroll_bar;
-  terminal->set_scroll_bar_default_width_hook = w32_set_scroll_bar_default_width;
-  terminal->set_scroll_bar_default_height_hook = w32_set_scroll_bar_default_height;
+  terminal->set_vertical_scroll_bar_hook
+    = w32_set_vertical_scroll_bar;
+  terminal->set_horizontal_scroll_bar_hook
+    = w32_set_horizontal_scroll_bar;
+  terminal->set_scroll_bar_default_width_hook
+    = w32_set_scroll_bar_default_width;
+  terminal->set_scroll_bar_default_height_hook
+    = w32_set_scroll_bar_default_height;
   terminal->condemn_scroll_bars_hook = w32_condemn_scroll_bars;
   terminal->redeem_scroll_bar_hook = w32_redeem_scroll_bar;
   terminal->judge_scroll_bars_hook = w32_judge_scroll_bars;
@@ -7553,13 +7670,13 @@ w32_create_terminal (struct w32_display_info *dpyinfo)
   terminal->delete_terminal_hook = w32_delete_terminal;
   /* Other hooks are NULL by default.  */
 
-  /* We don't yet support separate terminals on W32, so don't try to share
-     keyboards between virtual terminals that are on the same physical
-     terminal like X does.  */
+  /* We don't yet support separate terminals on W32, so don't try to
+     share keyboards between virtual terminals that are on the same
+     physical terminal like X does.  */
   terminal->kboard = allocate_kboard (Qw32);
-  /* Don't let the initial kboard remain current longer than necessary.
-     That would cause problems if a file loaded on startup tries to
-     prompt in the mini-buffer.  */
+  /* Don't let the initial kboard remain current longer than
+     necessary. That would cause problems if a file loaded on startup
+     tries to prompt in the mini-buffer.  */
   if (current_kboard == initial_kboard)
     current_kboard = terminal->kboard;
   terminal->kboard->reference_count++;
@@ -7584,7 +7701,8 @@ w32_delete_terminal (struct terminal *terminal)
 }
 
 struct w32_display_info *
-w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
+w32_term_init (Lisp_Object display_name, char *xrm_option,
+	       char *resource_name)
 {
   struct w32_display_info *dpyinfo;
   struct terminal *terminal;
@@ -7635,7 +7753,8 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
      explicit FD here.  */
   add_keyboard_wait_descriptor (0);
 #elif CYGWIN
-  /* /dev/windows wakes us up when we have a thread message pending.  */
+  /* /dev/windows wakes us up when we have a thread message pending.
+   */
   add_keyboard_wait_descriptor (w32_message_fd);
 #endif
 
@@ -7652,23 +7771,24 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
 
   return dpyinfo;
 }
-\f
-/* Get rid of display DPYINFO, assuming all frames are already gone.  */
+
+/* Get rid of display DPYINFO, assuming all frames are already gone.
+ */
 void
 w32_delete_display (struct w32_display_info *dpyinfo)
 {
   /* FIXME: the only display info apparently can't be deleted.  */
   /* free palette table */
   {
-    struct w32_palette_entry * plist;
+    struct w32_palette_entry *plist;
 
     plist = dpyinfo->color_list;
     while (plist)
-    {
-      struct w32_palette_entry * pentry = plist;
-      plist = plist->next;
-      xfree (pentry);
-    }
+      {
+	struct w32_palette_entry *pentry = plist;
+	plist = plist->next;
+	xfree (pentry);
+      }
     dpyinfo->color_list = NULL;
     if (dpyinfo->palette)
       DeleteObject (dpyinfo->palette);
@@ -7677,7 +7797,6 @@ w32_delete_display (struct w32_display_info *dpyinfo)
   w32_reset_fringes ();
 }
 
-\f
 /* Set up use of W32.  */
 
 void
@@ -7687,18 +7806,16 @@ w32_init_main_thread (void)
   DuplicateHandle (GetCurrentProcess (), GetCurrentThread (),
 		   GetCurrentProcess (), &hMainThread, 0, TRUE,
 		   DUPLICATE_SAME_ACCESS);
-
-
 }
 
-DWORD WINAPI w32_msg_worker (void * arg);
+DWORD WINAPI w32_msg_worker (void *arg);
 
 static void
 w32_initialize (void)
 {
   HANDLE shell;
   BOOL caret;
-  HRESULT (WINAPI * set_user_model) (const wchar_t * id);
+  HRESULT (WINAPI * set_user_model) (const wchar_t *id);
 
   baud_rate = 19200;
 
@@ -7713,9 +7830,9 @@ w32_initialize (void)
   shell = GetModuleHandle ("shell32.dll");
   if (shell)
     {
-      set_user_model
-	= (void *) GetProcAddress (shell,
-				   "SetCurrentProcessExplicitAppUserModelID");
+      set_user_model = (void *)
+	GetProcAddress (shell,
+			"SetCurrentProcessExplicitAppUserModelID");
 
       /* If the function is defined, then we are running on Windows 7
 	 or newer, and the UI uses this to group related windows
@@ -7741,8 +7858,8 @@ w32_initialize (void)
 
   any_help_event_p = 0;
 
-  /* Initialize input mode: interrupt_input off, no flow control, allow
-     8 bit character input, standard quit char.  */
+  /* Initialize input mode: interrupt_input off, no flow control,
+     allow 8 bit character input, standard quit char.  */
   Fset_input_mode (Qnil, Qnil, make_fixnum (2), Qnil);
 
   {
@@ -7760,21 +7877,20 @@ w32_initialize (void)
 
     PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE);
 
-    hWindowsThread = CreateThread (NULL, 0,
-                                   w32_msg_worker,
-                                   0, 0, &dwWindowsThreadId);
+    hWindowsThread = CreateThread (NULL, 0, w32_msg_worker, 0, 0,
+				   &dwWindowsThreadId);
 
     GetMessage (&msg, NULL, WM_EMACS_DONE, WM_EMACS_DONE);
   }
 
   /* It is desirable that mainThread should have the same notion of
-     focus window and active window as windowsThread.  Unfortunately, the
-     following call to AttachThreadInput, which should do precisely what
-     we need, causes major problems when Emacs is linked as a console
-     program.  Unfortunately, we have good reasons for doing that, so
-     instead we need to send messages to windowsThread to make some API
-     calls for us (ones that affect, or depend on, the active/focus
-     window state.)  */
+     focus window and active window as windowsThread.  Unfortunately,
+     the following call to AttachThreadInput, which should do
+     precisely what we need, causes major problems when Emacs is
+     linked as a console program.  Unfortunately, we have good reasons
+     for doing that, so instead we need to send messages to
+     windowsThread to make some API calls for us (ones that affect, or
+     depend on, the active/focus window state.)  */
 #ifdef ATTACH_THREADS
   AttachThreadInput (dwMainThreadId, dwWindowsThreadId, TRUE);
 #endif
@@ -7783,7 +7899,8 @@ w32_initialize (void)
   {
     HMODULE user_lib = GetModuleHandle ("user32.dll");
 
-#define LOAD_PROC(lib, fn) pfn##fn = (void *) GetProcAddress (lib, #fn)
+#define LOAD_PROC(lib, fn) \
+  pfn##fn = (void *) GetProcAddress (lib, #fn)
 
     LOAD_PROC (user_lib, SetLayeredWindowAttributes);
 
@@ -7798,11 +7915,13 @@ #define LOAD_PROC(lib, fn) pfn##fn = (void *) GetProcAddress (lib, #fn)
     vertical_scroll_bar_min_handle = 5;
     horizontal_scroll_bar_min_handle = 5;
 
-    /* For either kind of scroll bar, take account of the arrows; these
-       effectively form the border of the main scroll bar range.  */
+    /* For either kind of scroll bar, take account of the arrows;
+       these effectively form the border of the main scroll bar range.
+     */
     vertical_scroll_bar_top_border = vertical_scroll_bar_bottom_border
       = GetSystemMetrics (SM_CYVSCROLL);
-    horizontal_scroll_bar_left_border = horizontal_scroll_bar_right_border
+    horizontal_scroll_bar_left_border
+      = horizontal_scroll_bar_right_border
       = GetSystemMetrics (SM_CYHSCROLL);
   }
 
@@ -7821,12 +7940,12 @@ syms_of_w32term (void)
   DEFSYM (Qrenamed_to, "renamed-to");
 
   DEFVAR_LISP ("x-wait-for-event-timeout", Vx_wait_for_event_timeout,
-    doc: /* SKIP: real doc in xterm.c.  */);
+	       doc
+	       : /* SKIP: real doc in xterm.c.  */);
   Vx_wait_for_event_timeout = make_float (0.1);
 
-  DEFVAR_INT ("w32-num-mouse-buttons",
-	      w32_num_mouse_buttons,
-	      doc: /* Number of physical mouse buttons.  */);
+  DEFVAR_INT ("w32-num-mouse-buttons", w32_num_mouse_buttons, doc
+	      : /* Number of physical mouse buttons.  */);
   w32_num_mouse_buttons = 2;
 
   DEFVAR_LISP ("w32-swap-mouse-buttons",
@@ -7844,9 +7963,10 @@ syms_of_w32term (void)
   Vw32_grab_focus_on_raise = Qt;
 
   DEFVAR_LISP ("w32-capslock-is-shiftlock",
-	       Vw32_capslock_is_shiftlock,
-	       doc: /* Apply CapsLock state to non character input keys.
-When nil, CapsLock only affects normal character input keys.  */);
+	       Vw32_capslock_is_shiftlock, doc
+	       : /* Apply CapsLock state to non character input
+keys. When nil, CapsLock only affects normal character input keys.
+*/);
   Vw32_capslock_is_shiftlock = Qnil;
 
   DEFVAR_LISP ("w32-recognize-altgr",
@@ -7874,20 +7994,21 @@ syms_of_w32term (void)
   /* We don't yet support this, but defining this here avoids whining
      from cus-start.el and other places, like "M-x set-variable".  */
   DEFVAR_BOOL ("x-use-underline-position-properties",
-	       x_use_underline_position_properties,
-     doc: /* SKIP: real doc in xterm.c.  */);
+	       x_use_underline_position_properties, doc
+	       : /* SKIP: real doc in xterm.c.  */);
   x_use_underline_position_properties = 0;
   DEFSYM (Qx_use_underline_position_properties,
 	  "x-use-underline-position-properties");
 
   DEFVAR_BOOL ("x-underline-at-descent-line",
-	       x_underline_at_descent_line,
-     doc: /* SKIP: real doc in xterm.c.  */);
+	       x_underline_at_descent_line, doc
+	       : /* SKIP: real doc in xterm.c.  */);
   x_underline_at_descent_line = 0;
-  DEFSYM (Qx_underline_at_descent_line, "x-underline-at-descent-line");
+  DEFSYM (Qx_underline_at_descent_line,
+	  "x-underline-at-descent-line");
 
-  DEFVAR_LISP ("x-toolkit-scroll-bars", Vx_toolkit_scroll_bars,
-	       doc: /* SKIP: real doc in xterm.c.  */);
+  DEFVAR_LISP ("x-toolkit-scroll-bars", Vx_toolkit_scroll_bars, doc
+	       : /* SKIP: real doc in xterm.c.  */);
   Vx_toolkit_scroll_bars = Qt;
 
   DEFVAR_BOOL ("w32-unicode-filenames",
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-03  2:53 Stipples support in MS-Windows port Elijah G
@ 2024-05-03  6:09 ` Eli Zaretskii
  2024-05-03  7:30 ` Po Lu
  1 sibling, 0 replies; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-03  6:09 UTC (permalink / raw)
  To: Elijah G; +Cc: emacs-devel

> From: Elijah G <eg642616@gmail.com>
> Date: Thu, 2 May 2024 20:53:17 -0600
> 
> Hi, i'm starting this thread to discuss the
> support for stipples in windows port.

Thank you for working on this.

> My ideas in how this can be done is using
> the w32term.c functions for drawing rects,
> i tested using w32_fill_rect but it doesn't
> work, i don't know how it works.
> 
> The elisp snippet that i'm using for test this is this:
> ```
> (let* ((w (window-font-width))
>        (stipple `(,w 1 ,(apply #'unibyte-string
>                    (append (make-list (1- (/ (+ w 7) 8)) ?\0)
>                        '(1))))))
>   (insert "\n" (propertize "      " 'face `(:background "red"
> :foreground "blue" :stipple ,stipple))))
> ```
> The closest thing i got was using w32_draw_rectangle
> inside w32_draw_glyph_string_background
> but for some reason it freezes and crashes after evaling
> the snippet, I'm not sure if it is related to the way I did it or is
> anything related to GC.
> 
> Below this mail can you get the patch for test it
> (Also i'm sorry if the patch is too long i accidentally
> formatted it with clang-format)

Please undo the reformatting, it resulted in an ocean of unrelated
changes that completely drown your real changes, and make it very
hard, almost impossible, to review the patch.  Especially since you
are asking why the code crashes, the answer to which is likely to be
in some subtle aspect of the code.

> Also can i ask what is the purpose of this line?
> ```
> # include "bitmaps/gray.xbm"
> ```

It comes from xterm.c, and defines gray_bits, gray_width, and
gray_height, which xterm.c uses for implementing the stipple.  See in
xterm.c for the details.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-03  2:53 Stipples support in MS-Windows port Elijah G
  2024-05-03  6:09 ` Eli Zaretskii
@ 2024-05-03  7:30 ` Po Lu
  2024-05-05  3:43   ` Elijah G
  1 sibling, 1 reply; 36+ messages in thread
From: Po Lu @ 2024-05-03  7:30 UTC (permalink / raw)
  To: Elijah G; +Cc: emacs-devel

[Resending as the first copy wasn't addressed to the list.]

Elijah G <eg642616@gmail.com> writes:

> Hi, i'm starting this thread to discuss the
> support for stipples in windows port.
> My ideas in how this can be done is using
> the w32term.c functions for drawing rects,
> i tested using w32_fill_rect but it doesn't
> work, i don't know how it works.
>
> The elisp snippet that i'm using for test this is this:
>
> ```
> (let* ((w (window-font-width))
>        (stipple `(,w 1 ,(apply #'unibyte-string
>                    (append (make-list (1- (/ (+ w 7) 8)) ?\0)
>                        '(1))))))
>   (insert "\n" (propertize "      " 'face `(:background "red"
> :foreground "blue" :stipple ,stipple))))
> ```
>
> The closest thing i got was using w32_draw_rectangle
> inside w32_draw_glyph_string_background
> but for some reason it freezes and crashes after evaling
> the snippet, I'm not sure if it is related to the way I did it or is
> anything related to GC.

You appear to fundamentally misunderstand the nature of stipples and
which component bears the burden of its implementation.  A stipple
pattern is a repeating bitmap pattern that replaces the solid background
color of a face, in which pattern "on" pixels are tinted the foreground
color of the face, and off pixels the background, and whose repetition
is such that its tiles (instances of its bitmap) extend from a
conceptual "origin" defined by the position of the drawable.  In X,
stipples are natively supported by graphics primitives, being simply
properties of the GC (graphics context), to wit, the fill style, the
stipple bitmap, and the tile/stipple origin offset, which three
properties are direct determinants of the imagery produced by
polygon-filling or stroking operations, and are configured some time
before x_draw_glyph_string_background is invoked, relieving the latter
of all responsibility, with respect to stipples, but enabling the
prepared stipple pattern when appropriate.  This is the reason that the
disabled code in the related W32 function is no more than a few calls to
XDrawRectangle, but as the supporting infrastructure, both in Emacs and
the display server, is not present on MS Windows, enabling just this
code, even if it does not crash, serves little purpose.

Your task is not to uncomment this handful of lines, but to establish
how best to express these X concepts in terms of primitives available on
MS Windows, and implement them in a manner appropriate for _Windows_,
without regard to the specifics of the X implementation.

> Below this mail can you get the patch for test it
> (Also i'm sorry if the patch is too long i accidentally
> formatted it with clang-format)

I suggest reverting the portions of the patch that are the work of
clang-format, as we cannot accept such drastic whitespace changes, and
the substantive changes simply vanish in their midst.

> Also can i ask what is the purpose of this line?
> ```
> # include "bitmaps/gray.xbm"
> ```

It includes the bitmap image, bitmap/gray.xbm, which is a C header
defining an array and several parameters.  This is not relevant on
Windows.

HTH.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-03  7:30 ` Po Lu
@ 2024-05-05  3:43   ` Elijah G
  2024-05-05  4:04     ` Po Lu
  0 siblings, 1 reply; 36+ messages in thread
From: Elijah G @ 2024-05-05  3:43 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 3450 bytes --]

On Fri, May 3, 2024 at 1:30 AM Po Lu <luangruo@yahoo.com> wrote:
> > The closest thing i got was using w32_draw_rectangle
> > inside w32_draw_glyph_string_background
> > but for some reason it freezes and crashes after evaling
> > the snippet, I'm not sure if it is related to the way I did it or is
> > anything related to GC.
>
> You appear to fundamentally misunderstand the nature of stipples and
> which component bears the burden of its implementation.  A stipple
> pattern is a repeating bitmap pattern that replaces the solid background
> color of a face, in which pattern "on" pixels are tinted the foreground
> color of the face, and off pixels the background, and whose repetition
> is such that its tiles (instances of its bitmap) extend from a
> conceptual "origin" defined by the position of the drawable.  In X,
> stipples are natively supported by graphics primitives, being simply
> properties of the GC (graphics context), to wit, the fill style, the
> stipple bitmap, and the tile/stipple origin offset, which three
> properties are direct determinants of the imagery produced by
> polygon-filling or stroking operations, and are configured some time
> before x_draw_glyph_string_background is invoked, relieving the latter
> of all responsibility, with respect to stipples, but enabling the
> prepared stipple pattern when appropriate.  This is the reason that the
> disabled code in the related W32 function is no more than a few calls to
> XDrawRectangle, but as the supporting infrastructure, both in Emacs and
> the display server, is not present on MS Windows, enabling just this
> code, even if it does not crash, serves little purpose.

Thank you for explain me, I was a little confused in how stipples works.

> Your task is not to uncomment this handful of lines, but to establish
> how best to express these X concepts in terms of primitives available on
> MS Windows, and implement them in a manner appropriate for _Windows_,
> without regard to the specifics of the X implementation.

Thanks, as far as i understood then should not i touch or even edit those
lines?
I was thinking in define them (since them are only available in X) inside
the same file, similar in how pgtkterm.c or androidterm.c does, i think i
should check again `image_create_bitmap_from_data' and
`prepare_face_for_display' definitions.

> > Below this mail can you get the patch for test it
> > (Also i'm sorry if the patch is too long i accidentally
> > formatted it with clang-format)
>
> I suggest reverting the portions of the patch that are the work of
> clang-format, as we cannot accept such drastic whitespace changes, and
> the substantive changes simply vanish in their midst.

Thank you, i've reverted the changes done by clang-format, reviewing the
test that i made i got notice it works a bit similar to `box' property and
not to a stipple, but anyways i'm sending it here if it can be useful.

> > Also can i ask what is the purpose of this line?
> > ```
> > # include "bitmaps/gray.xbm"
> > ```
>
> It includes the bitmap image, bitmap/gray.xbm, which is a C header
> defining an array and several parameters.  This is not relevant on
> Windows.

Thank you for the help, I wasn't familiar with X.org stuffs (since I'm in
Windows and most of them are not available) and with C (specially in a big
project such as emacs).
But I have faith that I can help in this.

[-- Attachment #1.2: Type: text/html, Size: 4181 bytes --]

[-- Attachment #2: 0001-Test-stipples-in-W32.patch --]
[-- Type: application/x-patch, Size: 1480 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-05  3:43   ` Elijah G
@ 2024-05-05  4:04     ` Po Lu
  2024-05-05  4:30       ` Po Lu
  0 siblings, 1 reply; 36+ messages in thread
From: Po Lu @ 2024-05-05  4:04 UTC (permalink / raw)
  To: Elijah G; +Cc: emacs-devel

Elijah G <eg642616@gmail.com> writes:

> Thanks, as far as i understood then should not i touch or even edit
> those lines?  I was thinking in define them (since them are only
> available in X) inside the same file, similar in how pgtkterm.c or
> androidterm.c does, i think i should check again
> `image_create_bitmap_from_data' and `prepare_face_for_display'
> definitions.

It helps not to dwell on the X implementation too long.  You should
select whatever interfaces appear the most suitable on Windows, so long
as the logic around when to display stipples is preserved faithfully.

On Android, for instance, the relevant code exists in two functions
defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
nothing akin to the X implementation it emulates.  The same is true of
haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
haiku_draw_support.cc.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-05  4:04     ` Po Lu
@ 2024-05-05  4:30       ` Po Lu
  2024-05-06  5:17         ` Elijah G
  2024-05-11  5:10         ` Elijah G
  0 siblings, 2 replies; 36+ messages in thread
From: Po Lu @ 2024-05-05  4:30 UTC (permalink / raw)
  To: Elijah G; +Cc: emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> On Android, for instance, the relevant code exists in two functions
> defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
> nothing akin to the X implementation it emulates.  The same is true of
> haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
> haiku_draw_support.cc.

Perhaps "pattern brushes" are the tool for the job?

  https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush

but please be careful not to use APIs introduced after the earliest
versions of MS-Windows we support, which I believe is Windows NT 4.0.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-05  4:30       ` Po Lu
@ 2024-05-06  5:17         ` Elijah G
  2024-05-11  5:10         ` Elijah G
  1 sibling, 0 replies; 36+ messages in thread
From: Elijah G @ 2024-05-06  5:17 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 879 bytes --]

El sáb., 4 de mayo de 2024 10:30 p. m., Po Lu <luangruo@yahoo.com> escribió:

> Po Lu <luangruo@yahoo.com> writes:
>
> > On Android, for instance, the relevant code exists in two functions
> > defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
> > nothing akin to the X implementation it emulates.  The same is true of
> > haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
> > haiku_draw_support.cc.
>
> Perhaps "pattern brushes" are the tool for the job?
>
>
> https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush
>
> but please be careful not to use APIs introduced after the earliest
> versions of MS-Windows we support, which I believe is Windows NT 4.0.
>

Thank you, i've read the documentation and i think it can also be useful, i
will do some test for see the result.

[-- Attachment #2: Type: text/html, Size: 1894 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-05  4:30       ` Po Lu
  2024-05-06  5:17         ` Elijah G
@ 2024-05-11  5:10         ` Elijah G
  2024-05-11  5:27           ` Po Lu
  1 sibling, 1 reply; 36+ messages in thread
From: Elijah G @ 2024-05-11  5:10 UTC (permalink / raw)
  To: Po Lu; +Cc: Ergus via Emacs development discussions.

[-- Attachment #1: Type: text/plain, Size: 1482 bytes --]

El sáb., 4 de mayo de 2024 10:30 p. m., Po Lu <luangruo@yahoo.com> escribió:

> Po Lu <luangruo@yahoo.com> writes:
>
> > On Android, for instance, the relevant code exists in two functions
> > defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
> > nothing akin to the X implementation it emulates.  The same is true of
> > haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
> > haiku_draw_support.cc.
>
> Perhaps "pattern brushes" are the tool for the job?
>
>
> https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush


After some tests, i could execute the snippet sent in this thread without
crashes with something similar to a stipple (sadly i cannot send the patch,
i'm not in my computer),  i tried using CreatePatternBrush, however it
needs the bitmap as a HBITMAP variable type, i've found some examples in
the same file (w32term.c) such as fringe bitmap that uses a HBITMAP var.
I would like to know any idea for make stipple bitmap as a HBITMAP (I'm not
sure if i should make it using CreateBitmap).
Also i would like to know if its a good idea remove XSetFillStyle from
w32_draw_glyph_string_background (
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1271),
AFAIK it is only for set the fill-style which i dont think it's necessary
since i'm implementing the stipple fill-style inside a XFillRectangle
implementation which i'm working.

Thanks

[-- Attachment #2: Type: text/html, Size: 2242 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-11  5:10         ` Elijah G
@ 2024-05-11  5:27           ` Po Lu
  2024-05-11  8:24             ` Eli Zaretskii
  0 siblings, 1 reply; 36+ messages in thread
From: Po Lu @ 2024-05-11  5:27 UTC (permalink / raw)
  To: Elijah G; +Cc: Ergus via Emacs development discussions.

Elijah G <eg642616@gmail.com> writes:

> El sáb., 4 de mayo de 2024 10:30 p. m., Po Lu <luangruo@yahoo.com> escribió:
>
>  Po Lu <luangruo@yahoo.com> writes:
>
>  > On Android, for instance, the relevant code exists in two functions
>  > defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
>  > nothing akin to the X implementation it emulates.  The same is true of
>  > haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
>  > haiku_draw_support.cc.
>
>  Perhaps "pattern brushes" are the tool for the job?
>
>    https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush
>
> After some tests, i could execute the snippet sent in this thread without crashes with something similar to a stipple (sadly i cannot send the patch,
> i'm not in my computer),  i tried using CreatePatternBrush, however it needs the bitmap as a HBITMAP variable type, i've found some examples in
> the same file (w32term.c) such as fringe bitmap that uses a HBITMAP var.
> I would like to know any idea for make stipple bitmap as a HBITMAP (I'm not sure if i should make it using CreateBitmap).
> Also i would like to know if its a good idea remove XSetFillStyle from w32_draw_glyph_string_background
> (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1271), AFAIK it is only for set the fill-style which i dont think it's necessary since
> i'm implementing the stipple fill-style inside a XFillRectangle implementation which i'm working.
>
> Thanks

I think Eli is better qualified to answer this.
Thanks.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-11  5:27           ` Po Lu
@ 2024-05-11  8:24             ` Eli Zaretskii
  2024-05-12 23:06               ` Elijah G.
  0 siblings, 1 reply; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-11  8:24 UTC (permalink / raw)
  To: Po Lu; +Cc: eg642616, emacs-devel

> From: Po Lu <luangruo@yahoo.com>
> Cc: "Ergus via Emacs development discussions." <emacs-devel@gnu.org>
> Date: Sat, 11 May 2024 13:27:29 +0800
> 
> Elijah G <eg642616@gmail.com> writes:
> 
> > El sáb., 4 de mayo de 2024 10:30 p. m., Po Lu <luangruo@yahoo.com> escribió:
> >
> >  Po Lu <luangruo@yahoo.com> writes:
> >
> >  > On Android, for instance, the relevant code exists in two functions
> >  > defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
> >  > nothing akin to the X implementation it emulates.  The same is true of
> >  > haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
> >  > haiku_draw_support.cc.
> >
> >  Perhaps "pattern brushes" are the tool for the job?
> >
> >    https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush
> >
> > After some tests, i could execute the snippet sent in this thread without crashes with something similar to a stipple (sadly i cannot send the patch,
> > i'm not in my computer),  i tried using CreatePatternBrush, however it needs the bitmap as a HBITMAP variable type, i've found some examples in
> > the same file (w32term.c) such as fringe bitmap that uses a HBITMAP var.
> > I would like to know any idea for make stipple bitmap as a HBITMAP (I'm not sure if i should make it using CreateBitmap).
> > Also i would like to know if its a good idea remove XSetFillStyle from w32_draw_glyph_string_background
> > (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1271), AFAIK it is only for set the fill-style which i dont think it's necessary since
> > i'm implementing the stipple fill-style inside a XFillRectangle implementation which i'm working.
> >
> > Thanks
> 
> I think Eli is better qualified to answer this.

That fragment is there only to show what xterm.c does for this, so
that the w32 code would follow the same paradigm.  If you are
implementing the w32 code for doing that, the X-related code can be
removed.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-11  8:24             ` Eli Zaretskii
@ 2024-05-12 23:06               ` Elijah G.
  2024-05-14  4:07                 ` Elijah G.
  0 siblings, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-12 23:06 UTC (permalink / raw)
  To: Eli Zaretskii, Po Lu; +Cc: Po Lu, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2746 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Po Lu <luangruo@yahoo.com>
>> Cc: "Ergus via Emacs development discussions." <emacs-devel@gnu.org>
>> Date: Sat, 11 May 2024 13:27:29 +0800
>> 
>> Elijah G <eg642616@gmail.com> writes:
>> 
>> > El sáb., 4 de mayo de 2024 10:30 p. m., Po Lu <luangruo@yahoo.com> escribió:
>> >
>> >  Po Lu <luangruo@yahoo.com> writes:
>> >
>> >  > On Android, for instance, the relevant code exists in two functions
>> >  > defined in EmacsGC.java, prepareStipple and blitOpaqueStipple, which are
>> >  > nothing akin to the X implementation it emulates.  The same is true of
>> >  > haikuterm.c, haiku_draw_stipple_background, and BView_DrawBitmapTiled in
>> >  > haiku_draw_support.cc.
>> >
>> >  Perhaps "pattern brushes" are the tool for the job?
>> >
>> >    https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush
>> >
>> > After some tests, i could execute the snippet sent in this thread without crashes with something similar to a stipple (sadly i cannot send the patch,
>> > i'm not in my computer),  i tried using CreatePatternBrush, however it needs the bitmap as a HBITMAP variable type, i've found some examples in
>> > the same file (w32term.c) such as fringe bitmap that uses a HBITMAP var.
>> > I would like to know any idea for make stipple bitmap as a HBITMAP (I'm not sure if i should make it using CreateBitmap).
>> > Also i would like to know if its a good idea remove XSetFillStyle from w32_draw_glyph_string_background
>> > (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1271), AFAIK it is only for set the fill-style which i dont think it's necessary since
>> > i'm implementing the stipple fill-style inside a XFillRectangle implementation which i'm working.
>> >
>> > Thanks
>> 
>> I think Eli is better qualified to answer this.
>
> That fragment is there only to show what xterm.c does for this, so
> that the w32 code would follow the same paradigm.  If you are
> implementing the w32 code for doing that, the X-related code can be
> removed.

Alright thanks, i've done some test, and now i could draw a bitmap inside
the propertized area, and now it fill/tile to all the area
(see below this email the attached patch for the work done).

However for this patch i'm using a defined bitmap and not from the
stipple one, i'll need to figure how to get the stipple width and height,
about the stipple data i still trying to figure how to use it since it's
doesn't work with `CreateBitmap' (i'm not sure what contains i've tried
to use `printf' for get `s->face->stipple' value in my console/terminal
but printf is not defined, is there a way for print values to the
console/terminal?).


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP-Stipple-implementation-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 2262 bytes --]

From 3616af8c05a89d31e506d5343ec07e08c0c5282a Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] [WIP] Stipple implementation for MS Windows

---
 src/w32term.c | 41 +++++++++++++++++++++++++++++++++++------
 1 file changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/w32term.c b/src/w32term.c
index a9aff304771..dc810cf294b 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,36 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+static void
+XFillRectangle (struct glyph_string *s, Emacs_GC *gc,
+		int x, int y, unsigned int width, unsigned int height)
+{
+  HDC hdc;
+  HBITMAP hbm;
+  HBRUSH hb;
+
+  COLORREF bg = gc->background; /*  Only for tests */
+  COLORREF fg = gc->foreground;
+  COLORREF bits[] = {
+    bg, bg, fg, fg, fg, fg, fg, fg, fg,
+    bg, bg, fg, fg, fg, fg, fg, fg, fg
+  };
+
+  hdc = s->hdc;
+  hbm = CreateBitmap(9, 2, 1, sizeof(COLORREF) * 8, bits); /* TODO: s->face->stipple */
+  hb = CreatePatternBrush (hbm);
+
+  RECT r;
+  r.left = x;
+  r.top = y;
+  r.right = x + width + 1;
+  r.bottom = y + height + 1;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject(hb);
+  DeleteObject(hbm);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,16 +1294,15 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
+#if 1 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
+	  /* XSetFillStyle (s->display, s->gc, FillOpaqueStippled); */
+	  XFillRectangle (s, s->gc, s->x,
+			  s->y + box_line_width, s->background_width,
 			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  /* XSetFillStyle (s->display, s->gc, FillSolid); */
 	  s->background_filled_p = true;
 	}
       else
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-12 23:06               ` Elijah G.
@ 2024-05-14  4:07                 ` Elijah G.
  2024-05-14  5:28                   ` Po Lu
  0 siblings, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-14  4:07 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 885 bytes --]

I'm a bit stuck here, i could make to use the stipple bitmap, however it
doesn't uses background and foreground color from propertized string,
(and looks very weird).

The drawing works fine, but the problem is trying to get stipple bitmap,
and makes it work well.

One way that i thought for fix this is redefining bitmap stipple for
using same string fg and bg colors and bitmap width and height, but for
this i need the bitmap bits.

I found that image_create_bitmap_from_data also makes stipple bitmap
(https://git.savannah.gnu.org/cgit/emacs.git/tree/src/image.c#n601);
i tried to found bitmap bits by using stipple bitmap id but some
functions/macros are only for X11 (e.g x_bitmap_height and
x_bitmap_width).

I would be happy to read any advice or feedback.

I've attached to this email a patch for the work that i've done and some
screenshots for the final results.

Thanks.


[-- Attachment #2: stip2.png --]
[-- Type: image/png, Size: 2446 bytes --]

[-- Attachment #3: stip1.png --]
[-- Type: image/png, Size: 1045 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0001-WIP-Stipple-implementation-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 2395 bytes --]

From 7e42e34fa75ef30467423b7a43c18b0ab0c93bd6 Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] [WIP] Stipple implementation for MS Windows

---
 src/w32term.c | 38 ++++++++++++++++++++++++++++++++------
 1 file changed, 32 insertions(+), 6 deletions(-)

diff --git a/src/w32term.c b/src/w32term.c
index a9aff304771..8e9ffcb8c43 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,33 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+/* Fill background with bitmap S glyph, with GC, X, Y, WIDTH, HEIGHT, HDC. */
+static void
+XFillRectangle (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
+		int x, int y, unsigned int width, unsigned int height)
+{
+  Emacs_Pixmap bm;
+  HBRUSH hb;
+
+  /*  Only for tests */
+  /* COLORREF bg = gc->background; */
+  /* COLORREF fg = gc->foreground; */
+  /* COLORREF bits[] = { fg, bg, bg, bg, bg, bg, bg, bg, bg, bg }; */
+  /* bm = CreateBitmap(bw, bh, FRAME_DISPLAY_INFO(s->f)->n_planes, FRAME_DISPLAY_INFO(s->f)->n_cbits, pix); */
+  /* FIXME: ? */
+  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].pixmap;
+  hb = CreatePatternBrush (bm);
+
+  RECT r;
+  r.left = x;
+  r.top = y;
+  r.right = x + width + 1;
+  r.bottom = y + height + 1;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject(hb);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,16 +1291,15 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
+#if 1 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
+	  /* XSetFillStyle (s->display, s->gc, FillOpaqueStippled); */
+	  XFillRectangle (s->hdc, s, s->gc, s->x,
+			  s->y + box_line_width, s->background_width,
 			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  /* XSetFillStyle (s->display, s->gc, FillSolid); */
 	  s->background_filled_p = true;
 	}
       else
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-14  4:07                 ` Elijah G.
@ 2024-05-14  5:28                   ` Po Lu
  2024-05-15  1:43                     ` Elijah G.
  2024-05-19 22:37                     ` Elijah G.
  0 siblings, 2 replies; 36+ messages in thread
From: Po Lu @ 2024-05-14  5:28 UTC (permalink / raw)
  To: Elijah G.; +Cc: emacs-devel, Eli Zaretskii

"Elijah G." <eg642616@gmail.com> writes:

> I'm a bit stuck here, i could make to use the stipple bitmap, however it
> doesn't uses background and foreground color from propertized string,
> (and looks very weird).
>
> The drawing works fine, but the problem is trying to get stipple bitmap,
> and makes it work well.
>
> One way that i thought for fix this is redefining bitmap stipple for
> using same string fg and bg colors and bitmap width and height, but for
> this i need the bitmap bits.
>
> I found that image_create_bitmap_from_data also makes stipple bitmap
> (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/image.c#n601);
> i tried to found bitmap bits by using stipple bitmap id but some
> functions/macros are only for X11 (e.g x_bitmap_height and
> x_bitmap_width).
>
> I would be happy to read any advice or feedback.
>
> I've attached to this email a patch for the work that i've done and some
> screenshots for the final results.
>
> Thanks.

I don't follow your question, but on the assumption that you've run into
difficulties with replacing the background and foreground of the pattern
with those of your choosing, perhaps you must set the "text" and
"background" colors of the DC as suggested by the documentation:

  A brush created by using a monochrome (1 bit per pixel) bitmap has the
  text and background colors of the device context to which it is drawn.
  Pixels represented by a 0 bit are drawn with the current text color;
  pixels represented by a 1 bit are drawn with the current background
  color.

?  Manipulating the stipple bitmap directly should not be necessary, not
with these facilities.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-14  5:28                   ` Po Lu
@ 2024-05-15  1:43                     ` Elijah G.
  2024-05-19 22:37                     ` Elijah G.
  1 sibling, 0 replies; 36+ messages in thread
From: Elijah G. @ 2024-05-15  1:43 UTC (permalink / raw)
  To: Po Lu; +Cc: emacs-devel, Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 2233 bytes --]

Po Lu <luangruo@yahoo.com> writes:

> "Elijah G." <eg642616@gmail.com> writes:
>
>> I'm a bit stuck here, i could make to use the stipple bitmap, however it
>> doesn't uses background and foreground color from propertized string,
>> (and looks very weird).
>>
>> The drawing works fine, but the problem is trying to get stipple bitmap,
>> and makes it work well.
>>
>> One way that i thought for fix this is redefining bitmap stipple for
>> using same string fg and bg colors and bitmap width and height, but for
>> this i need the bitmap bits.
>>
>> I found that image_create_bitmap_from_data also makes stipple bitmap
>> (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/image.c#n601);
>> i tried to found bitmap bits by using stipple bitmap id but some
>> functions/macros are only for X11 (e.g x_bitmap_height and
>> x_bitmap_width).
>>
>> I would be happy to read any advice or feedback.
>>
>> I've attached to this email a patch for the work that i've done and some
>> screenshots for the final results.
>>
>> Thanks.
>
> I don't follow your question, but on the assumption that you've run into
> difficulties with replacing the background and foreground of the pattern
> with those of your choosing, perhaps you must set the "text" and
> "background" colors of the DC as suggested by the documentation:
>
>   A brush created by using a monochrome (1 bit per pixel) bitmap has the
>   text and background colors of the device context to which it is drawn.
>   Pixels represented by a 0 bit are drawn with the current text color;
>   pixels represented by a 1 bit are drawn with the current background
>   color.
>
> ?  Manipulating the stipple bitmap directly should not be necessary, not
> with these facilities.

Thank you, the stipple implementation now is almost done, now the only
problem is that stipple bitmap is not monochromatic, i could test
using other monochromatic bitmap and it now works as it should work.
I found that it's a problem with this var
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/image.c#n604.
I'm not sure why and how, i'm trying to figure how to "modify" it
(note: i've printed the BITS bitmap with printf and pasted it, and works
well, i'm not sure if it can be a posible solution).


[-- Attachment #2: 0001-WIP-Stipple-implementation-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 3652 bytes --]

From ddc9f401931204bf099885a1fddf399a77fbb2b1 Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] [WIP] Stipple implementation for MS Windows

---
 src/image.c   |  8 +++++++-
 src/w32term.c | 37 +++++++++++++++++++++++++++++++------
 src/w32term.h |  1 +
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/src/image.c b/src/image.c
index e93fc3183af..e79371ee292 100644
--- a/src/image.c
+++ b/src/image.c
@@ -602,7 +602,12 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits,
 			 bits);
-  if (! bitmap)
+  /*  FIXME: bitmap generated here is not monochromatic, i think it's a
+   * problem with BITS*/
+  Emacs_Pixmap stipple;
+  stipple = CreateBitmap (width, height, 1, 1, bits);
+
+ if (! bitmap)
     return -1;
 #endif /* HAVE_NTGUI */
 
@@ -681,6 +686,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 
 #ifdef HAVE_NTGUI
   dpyinfo->bitmaps[id - 1].pixmap = bitmap;
+  dpyinfo->bitmaps[id - 1].stipple = stipple;
   dpyinfo->bitmaps[id - 1].hinst = NULL;
   dpyinfo->bitmaps[id - 1].depth = 1;
 #endif /* HAVE_NTGUI */
diff --git a/src/w32term.c b/src/w32term.c
index a9aff304771..770d6d6c30e 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,32 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+/* Fill background with bitmap S glyph, with GC, X, Y, WIDTH, HEIGHT, HDC. */
+static void
+XFillRectangle (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
+		int x, int y, unsigned int width, unsigned int height)
+{
+  SetTextColor (hdc, gc->foreground);
+  SetBkColor (hdc, gc->background);
+
+  Emacs_Pixmap bm;
+  HBRUSH hb;
+
+  /* Monochrome Bitmap Test (string BIT was extracted using printf):
+     CreateBitmap (5, 1, 1, 1, "☺"); */
+  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;
+  hb = CreatePatternBrush (bm);
+
+  RECT r;
+  r.left = x;
+  r.top = y;
+  r.right = x + width + 1;
+  r.bottom = y + height + 1;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject (hb);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,16 +1290,15 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
+#if 1 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
+	  /* XSetFillStyle (s->display, s->gc, FillOpaqueStippled); */
+	  XFillRectangle (s->hdc, s, s->gc, s->x,
+			  s->y + box_line_width, s->background_width,
 			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  /* XSetFillStyle (s->display, s->gc, FillSolid); */
 	  s->background_filled_p = true;
 	}
       else
diff --git a/src/w32term.h b/src/w32term.h
index 3120c8bd71f..1eb6a660248 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -58,6 +58,7 @@ #define CP_DEFAULT 1004
 {
   Emacs_Pixmap pixmap;
   char *file;
+  Emacs_Pixmap stipple;
   HINSTANCE hinst; /* Used to load the file */
   int refcount;
   /* Record some info about this pixmap.  */
-- 
2.44.0.windows.1


[-- Attachment #3: Test screenshot --]
[-- Type: image/png, Size: 8548 bytes --]

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-14  5:28                   ` Po Lu
  2024-05-15  1:43                     ` Elijah G.
@ 2024-05-19 22:37                     ` Elijah G.
  2024-05-20 11:15                       ` Eli Zaretskii
  1 sibling, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-19 22:37 UTC (permalink / raw)
  To: Po Lu, Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1086 bytes --]

Good news, the stipple implementation is now done, now works using
indent-bars package and other stipples, however there are some
issues that i want to remark

1. Currently it only works for stipple data and not for X Bitmap files,
   I don't know where is stored the code for using X Bitmap in stipples.

2. I had to use `w32_create_pixmap_from_bitmap_data` for make it usable,
   but it is defined before `image_create_bitmap_from_data`, i had to
   copy its code for use it, Is there a problem move that function
   before `image_create_bitmap_from_data` ?

3. The bitmap created using the copied code have colors inverted,
   I fixed it setting text color to background color and bg to fg color,
   I'm not sure how w32_create_pixmap_from_bitmap_data works, as far as
   i could see it does some operations to the memory, something that i
   don't think i can help so much.

After fixing 1 (and maybe 2), I will only need to format the code (and
maybe rename XFillRectangle function) for send the final patch here.

I'm attaching the work done if you all want to test it.

Thanks.


[-- Attachment #2: Test using indent-bars package --]
[-- Type: image/png, Size: 11055 bytes --]

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-WIP-Stipple-implementation-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 4425 bytes --]

From f5dd217c5d7ae9d2aae9c18247d5d954fa170bf6 Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] [WIP] Stipple implementation for MS Windows

---
 src/image.c   | 32 +++++++++++++++++++++++++++++++-
 src/w32term.c | 38 ++++++++++++++++++++++++++++++++------
 src/w32term.h |  1 +
 3 files changed, 64 insertions(+), 7 deletions(-)

diff --git a/src/image.c b/src/image.c
index e93fc3183af..95da8353787 100644
--- a/src/image.c
+++ b/src/image.c
@@ -602,7 +602,36 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits,
 			 bits);
-  if (! bitmap)
+  Emacs_Pixmap stipple;
+
+  /* code extracted from `w32_create_pixmap_from_bitmap_data` */
+
+  static unsigned char swap_nibble[16]
+    = { 0x0, 0x8, 0x4, 0xc,    /* 0000 1000 0100 1100 */
+        0x2, 0xa, 0x6, 0xe,    /* 0010 1010 0110 1110 */
+        0x1, 0x9, 0x5, 0xd,    /* 0001 1001 0101 1101 */
+        0x3, 0xb, 0x7, 0xf };  /* 0011 1011 0111 1111 */
+  int i, j, w1, w2;
+  unsigned char *data, *p;
+
+  w1 = (width + 7) / 8;         /* nb of 8bits elt in X bitmap */
+  w2 = ((width + 15) / 16) * 2; /* nb of 16bits elt in W32 bitmap */
+  data = alloca (height * w2);
+  memset (data, 0, height * w2);
+  for (i = 0; i < height; i++)
+    {
+      p = data + i*w2;
+      for (j = 0; j < w1; j++)
+	{
+	  /* Bitswap XBM bytes to match how Windows does things.  */
+	  unsigned char c = *bits++;
+	  *p++ = (unsigned char)((swap_nibble[c & 0xf] << 4)
+				 | (swap_nibble[(c>>4) & 0xf]));
+	}
+    }
+  stipple = CreateBitmap (width, height, 1, 1, (char *) data);
+
+  if (!bitmap || !stipple)
     return -1;
 #endif /* HAVE_NTGUI */
 
@@ -681,6 +710,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 
 #ifdef HAVE_NTGUI
   dpyinfo->bitmaps[id - 1].pixmap = bitmap;
+  dpyinfo->bitmaps[id - 1].stipple = stipple;
   dpyinfo->bitmaps[id - 1].hinst = NULL;
   dpyinfo->bitmaps[id - 1].depth = 1;
 #endif /* HAVE_NTGUI */
diff --git a/src/w32term.c b/src/w32term.c
index a9aff304771..c72870e0b67 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,33 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+/* Fill background with bitmap S glyph, with GC, X, Y, WIDTH, HEIGHT, HDC. */
+static void
+XFillRectangle (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
+		int x, int y, unsigned int width, unsigned int height)
+{
+  /* NOTE: stipple bitmap has the inverted colors, inverting those 2
+   * functions color must fix this. */
+  SetTextColor (hdc, gc->background);
+  SetBkColor (hdc, gc->foreground);
+
+  Emacs_Pixmap bm;
+  HBRUSH hb;
+
+  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;
+  hb = CreatePatternBrush (bm);
+
+  /* Is this part below written correctly? */
+  RECT r;
+  r.left = x;
+  r.top = y;
+  r.right = x + width + 1;
+  r.bottom = y + height + 1;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject (hb);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,16 +1291,15 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
+#if 1 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
+	  /* XSetFillStyle (s->display, s->gc, FillOpaqueStippled); */
+	  XFillRectangle (s->hdc, s, s->gc, s->x,
+			  s->y + box_line_width, s->background_width,
 			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  /* XSetFillStyle (s->display, s->gc, FillSolid); */
 	  s->background_filled_p = true;
 	}
       else
diff --git a/src/w32term.h b/src/w32term.h
index 3120c8bd71f..1eb6a660248 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -58,6 +58,7 @@ #define CP_DEFAULT 1004
 {
   Emacs_Pixmap pixmap;
   char *file;
+  Emacs_Pixmap stipple;
   HINSTANCE hinst; /* Used to load the file */
   int refcount;
   /* Record some info about this pixmap.  */
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-19 22:37                     ` Elijah G.
@ 2024-05-20 11:15                       ` Eli Zaretskii
  2024-05-20 11:19                         ` Po Lu
  2024-05-20 19:44                         ` Elijah G.
  0 siblings, 2 replies; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-20 11:15 UTC (permalink / raw)
  To: Elijah G.; +Cc: luangruo, emacs-devel

> From: "Elijah G." <eg642616@gmail.com>
> Cc: emacs-devel@gnu.org
> Date: Sun, 19 May 2024 16:37:07 -0600
> 
> Good news, the stipple implementation is now done, now works using
> indent-bars package and other stipples, however there are some
> issues that i want to remark
> 
> 1. Currently it only works for stipple data and not for X Bitmap files,
>    I don't know where is stored the code for using X Bitmap in stipples.

Please elaborate: what doesn't work yet with this implementation?

> 2. I had to use `w32_create_pixmap_from_bitmap_data` for make it usable,
>    but it is defined before `image_create_bitmap_from_data`, i had to
>    copy its code for use it, Is there a problem move that function
>    before `image_create_bitmap_from_data` ?

I don't understand the problem: in C there's no requirement to have a
function defined before it is used.  All you need is its prototype to
be defined before the first use.

> 3. The bitmap created using the copied code have colors inverted,
>    I fixed it setting text color to background color and bg to fg color,
>    I'm not sure how w32_create_pixmap_from_bitmap_data works, as far as
>    i could see it does some operations to the memory, something that i
>    don't think i can help so much.
> 
> After fixing 1 (and maybe 2), I will only need to format the code (and
> maybe rename XFillRectangle function) for send the final patch here.
> 
> I'm attaching the work done if you all want to test it.

Maybe I'm missing something, but where is the stipple in the attached
image?

Thanks.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-20 11:15                       ` Eli Zaretskii
@ 2024-05-20 11:19                         ` Po Lu
  2024-05-20 12:32                           ` Eli Zaretskii
  2024-05-20 19:44                         ` Elijah G.
  1 sibling, 1 reply; 36+ messages in thread
From: Po Lu @ 2024-05-20 11:19 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Elijah G., emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> Maybe I'm missing something, but where is the stipple in the attached
> image?

The stipples are the dashes displayed in the leading whitespace of each
line.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-20 11:19                         ` Po Lu
@ 2024-05-20 12:32                           ` Eli Zaretskii
  2024-05-20 13:12                             ` Po Lu
  0 siblings, 1 reply; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-20 12:32 UTC (permalink / raw)
  To: Po Lu; +Cc: eg642616, emacs-devel

> From: Po Lu <luangruo@yahoo.com>
> Cc: "Elijah G." <eg642616@gmail.com>,  emacs-devel@gnu.org
> Date: Mon, 20 May 2024 19:19:07 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > Maybe I'm missing something, but where is the stipple in the attached
> > image?
> 
> The stipples are the dashes displayed in the leading whitespace of each
> line.

Is that how stipple is supposed to look?



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-20 12:32                           ` Eli Zaretskii
@ 2024-05-20 13:12                             ` Po Lu
  0 siblings, 0 replies; 36+ messages in thread
From: Po Lu @ 2024-05-20 13:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: eg642616, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Po Lu <luangruo@yahoo.com>
>> Cc: "Elijah G." <eg642616@gmail.com>,  emacs-devel@gnu.org
>> Date: Mon, 20 May 2024 19:19:07 +0800
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> > Maybe I'm missing something, but where is the stipple in the attached
>> > image?
>> 
>> The stipples are the dashes displayed in the leading whitespace of each
>> line.
>
> Is that how stipple is supposed to look?

How this package's stipples are supposed to look, yes.  See:
https://github.com/jdtsmith/indent-bars



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-20 11:15                       ` Eli Zaretskii
  2024-05-20 11:19                         ` Po Lu
@ 2024-05-20 19:44                         ` Elijah G.
  2024-05-21  2:00                           ` Elijah G.
  1 sibling, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-20 19:44 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 990 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: "Elijah G." <eg642616@gmail.com>
>> Cc: emacs-devel@gnu.org
>> Date: Sun, 19 May 2024 16:37:07 -0600
>> 
>> Good news, the stipple implementation is now done, now works using
>> indent-bars package and other stipples, however there are some
>> issues that i want to remark
>> 
>> 1. Currently it only works for stipple data and not for X Bitmap files,
>>    I don't know where is stored the code for using X Bitmap in stipples.
>
> Please elaborate: what doesn't work yet with this implementation?

It's kind of hard for me to explain, but I think that doesn't mean it's
hard to solve.

In the documentation
(https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html)
specifies that stipples can be a filepath to an X Bitmap file:

  The value can be a string; that should be the name of a file containing
  external-format X bitmap data. The file is found in the directories
  listed in the variable x-bitmap-file-path.


[-- Attachment #2: stipple2.png --]
[-- Type: image/png, Size: 2868 bytes --]

[-- Attachment #3: Type: text/plain, Size: 1827 bytes --]


That is not done yet, currently setting the bitmap as shown below from
the documentation is done and works well:

  Alternatively, the value can specify the bitmap directly, with a list of
  the form (width height data). Here, width and height specify the size in
  pixels, and data is a string containing the raw bits of the bitmap, row
  by row. Each row occupies (width + 7) / 8 consecutive bytes in the
  string (which should be a unibyte string for best results). This means
  that each row always occupies at least one whole byte.


>> 2. I had to use `w32_create_pixmap_from_bitmap_data` for make it usable,
>>    but it is defined before `image_create_bitmap_from_data`, i had to
>>    copy its code for use it, Is there a problem move that function
>>    before `image_create_bitmap_from_data` ?
>
> I don't understand the problem: in C there's no requirement to have a
> function defined before it is used.  All you need is its prototype to
> be defined before the first use.

It's now solved, thank you, i forgot that it is possible in C.

>> 3. The bitmap created using the copied code have colors inverted,
>>    I fixed it setting text color to background color and bg to fg color,
>>    I'm not sure how w32_create_pixmap_from_bitmap_data works, as far as
>>    i could see it does some operations to the memory, something that i
>>    don't think i can help so much.
>> 
>> After fixing 1 (and maybe 2), I will only need to format the code (and
>> maybe rename XFillRectangle function) for send the final patch here.
>> 
>> I'm attaching the work done if you all want to test it.
>
> Maybe I'm missing something, but where is the stipple in the attached
> image?

The stipples are the color lines.

In case there are any doubt, here is another image showing another 2
stipples with whitespace-mode turned-on:


[-- Attachment #4: stipple.png --]
[-- Type: image/png, Size: 9368 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-20 19:44                         ` Elijah G.
@ 2024-05-21  2:00                           ` Elijah G.
  2024-05-21 11:49                             ` Eli Zaretskii
  0 siblings, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-21  2:00 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, emacs-devel

"Elijah G." <eg642616@gmail.com> writes:

>>> From: "Elijah G." <eg642616@gmail.com>
>>> Cc: emacs-devel@gnu.org
>>> Date: Sun, 19 May 2024 16:37:07 -0600
>>> 
>>> Good news, the stipple implementation is now done, now works using
>>> indent-bars package and other stipples, however there are some
>>> issues that i want to remark
>>> 
>>> 1. Currently it only works for stipple data and not for X Bitmap files,
>>>    I don't know where is stored the code for using X Bitmap in stipples.
>>
>> Please elaborate: what doesn't work yet with this implementation?
>
> It's kind of hard for me to explain, but I think that doesn't mean it's
> hard to solve.
>
> In the documentation
> (https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html)
> specifies that stipples can be a filepath to an X Bitmap file:
>
>   The value can be a string; that should be the name of a file containing
>   external-format X bitmap data. The file is found in the directories
>   listed in the variable x-bitmap-file-path.
>
> That is not done yet ...

About this last one, i've forgot that `image_create_bitmap_from_file`
can fix this, in case i can solve it, the only issue will be the bitmap
having the colors inverted.

A more detailed example about that issue:

    1111001111    0000110000
    1111001111    0000110000
    1111001111    0000110000
    1111001111    0000110000
    1111111111    0000000000
    1111001111    0000110000

     Expected       Result

  in Windows, bitmaps uses 1 for bg color and 0 for fg.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-21  2:00                           ` Elijah G.
@ 2024-05-21 11:49                             ` Eli Zaretskii
  2024-05-22  2:06                               ` Elijah G.
  0 siblings, 1 reply; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-21 11:49 UTC (permalink / raw)
  To: Elijah G.; +Cc: luangruo, emacs-devel

> From: "Elijah G." <eg642616@gmail.com>
> Cc: luangruo@yahoo.com,  emacs-devel@gnu.org
> Date: Mon, 20 May 2024 20:00:51 -0600
> 
> "Elijah G." <eg642616@gmail.com> writes:
> 
> >>> From: "Elijah G." <eg642616@gmail.com>
> >>> Cc: emacs-devel@gnu.org
> >>> Date: Sun, 19 May 2024 16:37:07 -0600
> >>> 
> >>> Good news, the stipple implementation is now done, now works using
> >>> indent-bars package and other stipples, however there are some
> >>> issues that i want to remark
> >>> 
> >>> 1. Currently it only works for stipple data and not for X Bitmap files,
> >>>    I don't know where is stored the code for using X Bitmap in stipples.
> >>
> >> Please elaborate: what doesn't work yet with this implementation?
> >
> > It's kind of hard for me to explain, but I think that doesn't mean it's
> > hard to solve.
> >
> > In the documentation
> > (https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html)
> > specifies that stipples can be a filepath to an X Bitmap file:
> >
> >   The value can be a string; that should be the name of a file containing
> >   external-format X bitmap data. The file is found in the directories
> >   listed in the variable x-bitmap-file-path.
> >
> > That is not done yet ...
> 
> About this last one, i've forgot that `image_create_bitmap_from_file`
> can fix this, in case i can solve it, the only issue will be the bitmap
> having the colors inverted.
> 
> A more detailed example about that issue:
> 
>     1111001111    0000110000
>     1111001111    0000110000
>     1111001111    0000110000
>     1111001111    0000110000
>     1111111111    0000000000
>     1111001111    0000110000
> 
>      Expected       Result
> 
>   in Windows, bitmaps uses 1 for bg color and 0 for fg.

Why is it a problem to invert the bits programmatically?  We already
do that in w32_create_pixmap_from_bitmap_data (maybe you could reuse
it?).



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-21 11:49                             ` Eli Zaretskii
@ 2024-05-22  2:06                               ` Elijah G.
  2024-05-24  1:55                                 ` Elijah G.
  2024-05-25  7:24                                 ` Eli Zaretskii
  0 siblings, 2 replies; 36+ messages in thread
From: Elijah G. @ 2024-05-22  2:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2633 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: "Elijah G." <eg642616@gmail.com>
>> Cc: luangruo@yahoo.com,  emacs-devel@gnu.org
>> Date: Mon, 20 May 2024 20:00:51 -0600
>> 
>> "Elijah G." <eg642616@gmail.com> writes:
>> 
>> >>> From: "Elijah G." <eg642616@gmail.com>
>> >>> Cc: emacs-devel@gnu.org
>> >>> Date: Sun, 19 May 2024 16:37:07 -0600
>> >>> 
>> >>> Good news, the stipple implementation is now done, now works using
>> >>> indent-bars package and other stipples, however there are some
>> >>> issues that i want to remark
>> >>> 
>> >>> 1. Currently it only works for stipple data and not for X Bitmap files,
>> >>>    I don't know where is stored the code for using X Bitmap in stipples.
>> >>
>> >> Please elaborate: what doesn't work yet with this implementation?
>> >
>> > It's kind of hard for me to explain, but I think that doesn't mean it's
>> > hard to solve.
>> >
>> > In the documentation
>> > (https://www.gnu.org/software/emacs/manual/html_node/elisp/Face-Attributes.html)
>> > specifies that stipples can be a filepath to an X Bitmap file:
>> >
>> >   The value can be a string; that should be the name of a file containing
>> >   external-format X bitmap data. The file is found in the directories
>> >   listed in the variable x-bitmap-file-path.
>> >
>> > That is not done yet ...
>> 
>> About this last one, i've forgot that `image_create_bitmap_from_file`
>> can fix this, in case i can solve it, the only issue will be the bitmap
>> having the colors inverted.
>> 
>> A more detailed example about that issue:
>> 
>>     1111001111    0000110000
>>     1111001111    0000110000
>>     1111001111    0000110000
>>     1111001111    0000110000
>>     1111111111    0000000000
>>     1111001111    0000110000
>> 
>>      Expected       Result
>> 
>>   in Windows, bitmaps uses 1 for bg color and 0 for fg.
>
> Why is it a problem to invert the bits programmatically?  We already
> do that in w32_create_pixmap_from_bitmap_data (maybe you could reuse
> it?).

I'd to use `w32_create_pixmap_from_bitmap_data` for convert the stipple
bitmap to a Windows bitmap but i've noticed it inverts stipple bits.

It's just something that could be confusing in the future specifically
these 2 lines since it's using bc color for the text color and
vice-versa:

+  SetTextColor (hdc, gc->background);
+  SetBkColor (hdc, gc->foreground);

I tried reuse w32_create_pixmap_from_bitmap_data to obtained bitmap but
it doesn't seem to work, I just hope it's not a problem.

For now the stipple implementation is now complete (as far as i could test),
Now uses xbm files and stipple data.

Here an example using gnus.xbm file:

[-- Attachment #2: gnus_stipple.png --]
[-- Type: image/png, Size: 67226 bytes --]

[-- Attachment #3: Type: text/plain, Size: 85 bytes --]


I would like if someone else can test it for see if there are any
issues.

Thanks.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0001-Stipple-support-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 7654 bytes --]

From ef7d9b6fb9411cce26666d5804ee46f20ea1a3ec Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] Stipple support for MS Windows

* src/w32term.h (w32_bitmap_record): Add stipple value.

* src/w32term.c:
(w32_fill_stipple_pattern): New function.
(w32_draw_glyph_string_background, w32_draw_glyph_string_bg_rect)
(w32_draw_stretch_glyph_string): Use new stipple function.

* src/image.c:
(image_create_bitmap_from_data): Create stipple bitmap.
(image_create_bitmap_from_file): Add suuport for pixmap and create
stipple bitmap.
---
 src/image.c   | 57 +++++++++++++++++++++++++++++++++++++++++++++-----
 src/w32term.c | 58 +++++++++++++++++++++++++++++++++------------------
 src/w32term.h |  1 +
 3 files changed, 91 insertions(+), 25 deletions(-)

diff --git a/src/image.c b/src/image.c
index e93fc3183af..f6c20985fbe 100644
--- a/src/image.c
+++ b/src/image.c
@@ -214,6 +214,13 @@ #define n_planes n_image_planes
 static unsigned long *colors_in_color_table (int *n);
 #endif
 
+#ifdef HAVE_NTGUI
+static HBITMAP w32_create_pixmap_from_bitmap_data (int width,
+						   int height,
+						   char *data);
+
+#endif
+
 #if defined (HAVE_WEBP) || defined (HAVE_GIF)
 static void anim_prune_animation_cache (Lisp_Object);
 #endif
@@ -602,7 +609,12 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits,
 			 bits);
-  if (! bitmap)
+  Emacs_Pixmap stipple;
+
+  /* Convert X bitmap to W32 bitmap */
+  stipple = w32_create_pixmap_from_bitmap_data (width, height, bits);
+
+  if (!bitmap || !stipple)
     return -1;
 #endif /* HAVE_NTGUI */
 
@@ -681,6 +693,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 
 #ifdef HAVE_NTGUI
   dpyinfo->bitmaps[id - 1].pixmap = bitmap;
+  dpyinfo->bitmaps[id - 1].stipple = stipple;
   dpyinfo->bitmaps[id - 1].hinst = NULL;
   dpyinfo->bitmaps[id - 1].depth = 1;
 #endif /* HAVE_NTGUI */
@@ -699,7 +712,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 #endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */
 
 #if defined HAVE_HAIKU || defined HAVE_NS || defined HAVE_PGTK	\
-  || defined HAVE_ANDROID
+  || defined HAVE_ANDROID || defined HAVE_NTGUI
 static char *slurp_file (image_fd, ptrdiff_t *);
 static Lisp_Object image_find_image_fd (Lisp_Object, image_fd *);
 static bool xbm_read_bitmap_data (struct frame *, char *, char *,
@@ -711,10 +724,44 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 ptrdiff_t
 image_create_bitmap_from_file (struct frame *f, Lisp_Object file)
 {
-#if defined (HAVE_NTGUI)
-  return -1;  /* W32_TODO : bitmap support */
-#else
   Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f);
+
+#ifdef HAVE_NTGUI
+  ptrdiff_t id, size;
+  int width, height, rc;
+  image_fd fd;
+  char *contents, *data;
+  Emacs_Pixmap bitmap;
+
+  if (!STRINGP (image_find_image_fd (file, &fd)))
+    return -1;
+
+  contents = slurp_file (fd, &size);
+
+  if (!contents)
+    return -1;
+
+  rc = xbm_read_bitmap_data (f, contents, contents + size,
+			     &width, &height, &data, 0);
+
+  if (!rc)
+    {
+      xfree (contents);
+      return -1;
+    }
+
+  id = image_allocate_bitmap_record (f);
+  bitmap = w32_create_pixmap_from_bitmap_data (width, height, data);
+
+  dpyinfo->bitmaps[id - 1].height = width;
+  dpyinfo->bitmaps[id - 1].width = height;
+  dpyinfo->bitmaps[id - 1].stipple = bitmap;
+  dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
+  printf("%s\n", dpyinfo->bitmaps[id - 1].file);
+
+  xfree (contents);
+  xfree (data);
+  return id;
 #endif
 
 #ifdef HAVE_NS
diff --git a/src/w32term.c b/src/w32term.c
index a9aff304771..b68f0b4e3d6 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,37 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+/* Fill background with bitmap pattern from S at specified position
+   given by X and Y.  WIDTH and HEIGHT specifies bitmap size, GC is
+   used to get foreground and background color context and HDC where
+   fill it.  */
+
+static void
+w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
+			  int x, int y, unsigned int width, unsigned int height)
+{
+  /* BUG: stipple bitmap has the inverted colors, inverting
+     those 2 functions color must fix this. */
+
+  SetTextColor (hdc, gc->background);
+  SetBkColor (hdc, gc->foreground);
+
+  Emacs_Pixmap bm;
+  HBRUSH hb;
+  RECT r;
+
+  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;
+  hb = CreatePatternBrush (bm);
+
+  r.left = x;
+  r.top = y;
+  r.right = x + width;
+  r.bottom = y + height;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject (hb);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,21 +1295,16 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
-			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  w32_fill_stipple_pattern (s->hdc, s, s->gc, s->x,
+				    s->y + box_line_width,
+				    s->background_width,
+				    s->height - 2 * box_line_width);
 	  s->background_filled_p = true;
 	}
-      else
-#endif
-           if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
+      else if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
 	       /* When xdisp.c ignores FONT_HEIGHT, we cannot trust
 		  font dimensions, since the actual glyphs might be
 		  much smaller.  So in that case we always clear the
@@ -2286,16 +2312,12 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
 static void
 w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y, int w, int h)
 {
-#if 0 /* TODO: stipple */
   if (s->stippled_p)
     {
       /* Fill background with a stipple pattern.  */
-      XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-      XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, x, y, w, h);
-      XSetFillStyle (s->display, s->gc, FillSolid);
+      w32_fill_stipple_pattern (s->hdc, s, s->gc, x, y, w, h);
     }
   else
-#endif
     w32_clear_glyph_string_rect (s, x, y, w, h);
 }
 
@@ -2500,16 +2522,12 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
 	  get_glyph_string_clip_rect (s, &r);
 	  w32_set_clip_rectangle (hdc, &r);
 
-#if 0 /* TODO: stipple */
 	  if (s->face->stipple)
 	    {
 	      /* Fill background with a stipple pattern.  */
-	      XSetFillStyle (s->display, gc, FillOpaqueStippled);
-	      XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), gc, x, y, w, h);
-	      XSetFillStyle (s->display, gc, FillSolid);
+	      w32_fill_stipple_pattern (s->hdc, s, gc, x, y, w, h);
 	    }
 	  else
-#endif
             {
               w32_fill_area (s->f, s->hdc, gc->background, x, y, w, h);
             }
diff --git a/src/w32term.h b/src/w32term.h
index 3120c8bd71f..1eb6a660248 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -58,6 +58,7 @@ #define CP_DEFAULT 1004
 {
   Emacs_Pixmap pixmap;
   char *file;
+  Emacs_Pixmap stipple;
   HINSTANCE hinst; /* Used to load the file */
   int refcount;
   /* Record some info about this pixmap.  */
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-22  2:06                               ` Elijah G.
@ 2024-05-24  1:55                                 ` Elijah G.
  2024-05-24  6:24                                   ` Po Lu
  2024-05-25  7:24                                 ` Eli Zaretskii
  1 sibling, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-24  1:55 UTC (permalink / raw)
  To: Eli Zaretskii, luangruo; +Cc: emacs-devel

I've sent the final patch to the bug tracker (bug#71159),
For now i didn't have any problem with the implementation so i think
it's now ready.

One last thing i still wondering is the use of these lines
(https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1673):

  #if 0 /* TODO: stipple */
        egc.stipple = dpyinfo->gray;
        mask |= GCStipple;
  #endif



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-24  1:55                                 ` Elijah G.
@ 2024-05-24  6:24                                   ` Po Lu
  0 siblings, 0 replies; 36+ messages in thread
From: Po Lu @ 2024-05-24  6:24 UTC (permalink / raw)
  To: Elijah G.; +Cc: Eli Zaretskii, emacs-devel

"Elijah G." <eg642616@gmail.com> writes:

> I've sent the final patch to the bug tracker (bug#71159),
> For now i didn't have any problem with the implementation so i think
> it's now ready.
>
> One last thing i still wondering is the use of these lines
> (https://git.savannah.gnu.org/cgit/emacs.git/tree/src/w32term.c#n1673):
>
>   #if 0 /* TODO: stipple */
>         egc.stipple = dpyinfo->gray;
>         mask |= GCStipple;
>   #endif

I think this is not relevant on MS Windows, being specific to box relief
display on X.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-22  2:06                               ` Elijah G.
  2024-05-24  1:55                                 ` Elijah G.
@ 2024-05-25  7:24                                 ` Eli Zaretskii
  2024-05-25 11:30                                   ` Arash Esbati
  2024-05-26  0:27                                   ` Elijah G.
  1 sibling, 2 replies; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-25  7:24 UTC (permalink / raw)
  To: Elijah G.; +Cc: luangruo, emacs-devel

> From: "Elijah G." <eg642616@gmail.com>
> Cc: luangruo@yahoo.com,  emacs-devel@gnu.org
> Date: Tue, 21 May 2024 20:06:38 -0600
> 
> For now the stipple implementation is now complete (as far as i could test),
> Now uses xbm files and stipple data.

Thanks, I have a few minor comments, and then we can install this.

> +  /* Convert X bitmap to W32 bitmap */
                                      ^
Style: C comments should end in a period and 2 spaces before "*/".

> +  dpyinfo->bitmaps[id - 1].height = width;
> +  dpyinfo->bitmaps[id - 1].width = height;
> +  dpyinfo->bitmaps[id - 1].stipple = bitmap;
> +  dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
> +  printf("%s\n", dpyinfo->bitmaps[id - 1].file);
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This printf should probably be removed or commented out.

> +static void
> +w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
> +			  int x, int y, unsigned int width, unsigned int height)
> +{
> +  /* BUG: stipple bitmap has the inverted colors, inverting
> +     those 2 functions color must fix this. */

Can we fix this before installing, please?  If there are problems with
inverting the colors that you are unsure how to fix, please describe
those problems in detail, so that others could provide advice or code.

Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
on Non-Free Operating Systems" section.

> I would like if someone else can test it for see if there are any
> issues.

Please suggest how to test this.

Thanks.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-25  7:24                                 ` Eli Zaretskii
@ 2024-05-25 11:30                                   ` Arash Esbati
  2024-05-26  2:37                                     ` Po Lu
  2024-05-26  0:27                                   ` Elijah G.
  1 sibling, 1 reply; 36+ messages in thread
From: Arash Esbati @ 2024-05-25 11:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Elijah G., luangruo, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

> Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
> on Non-Free Operating Systems" section.

Severity: wishlist

While we're at it: it would be great if stipples would work on macOS as
well; see bug#70712.

Best, Arash



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-25  7:24                                 ` Eli Zaretskii
  2024-05-25 11:30                                   ` Arash Esbati
@ 2024-05-26  0:27                                   ` Elijah G.
  2024-05-26  8:09                                     ` Yuri Khan
  2024-05-26  8:51                                     ` Eli Zaretskii
  1 sibling, 2 replies; 36+ messages in thread
From: Elijah G. @ 2024-05-26  0:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 3533 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> +  /* Convert X bitmap to W32 bitmap */
>                                       ^
> Style: C comments should end in a period and 2 spaces before "*/".

Thank you, it's now fixed.

>> +  dpyinfo->bitmaps[id - 1].height = width;
>> +  dpyinfo->bitmaps[id - 1].width = height;
>> +  dpyinfo->bitmaps[id - 1].stipple = bitmap;
>> +  dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
>> +  printf("%s\n", dpyinfo->bitmaps[id - 1].file);
>      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> This printf should probably be removed or commented out.

It was already removed from the patch that i sent to bug-gnu-emacs
(bug#71159).

I'm wondering if the patch must be here or to the bug tracker, if
should it be sent here i think bug#71159 can be closed.

>> +static void
>> +w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
>> +			  int x, int y, unsigned int width, unsigned int height)
>> +{
>> +  /* BUG: stipple bitmap has the inverted colors, inverting
>> +     those 2 functions color must fix this. */
>
> Can we fix this before installing, please?  If there are problems with
> inverting the colors that you are unsure how to fix, please describe
> those problems in detail, so that others could provide advice or code.

I would like fix it, but I don't have a clear answer as to why this
problem happens, I just left the notice there as a temp solution in case
someone comes up with a better solution.

I could see that BitBlt maybe can fix this (I've had problems for test
it).

Also I don't think w32_create_pixmap_from_bitmap_data cause this
problem, as far as i could see it's a problem with the bitmap data

  image_create_bitmap_from_data (struct frame *f, char *bits,
                                                        ^^^^
                                              (as example this function)

One solution that i was thinking is using a kind of inverse-video for
make it use fg as bg and vice-versa but I'm not sure how.

Also I was thinking in modifying bitmap data with something like this,
but i don't have idea how:

  for (i = 0; i < height; i++)
    {
      -- Invert bitmap data--
      for (j = 0; j < w1; j++)
        {
          -- Invert bitmap data--
        }
    }


> Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
> on Non-Free Operating Systems" section.

Done.

>> I would like if someone else can test it for see if there are any
>> issues.
>
> Please suggest how to test this.

Sure, after apply patch and build Emacs, i open runemacs.exe with -Q,
inside the scratch-buffer i paste these code snippets and eval them:

 (let* ((w (window-font-width))
        (stipple `(,w 1 ,(apply #'unibyte-string
 			       (append (make-list (1- (/ (+ w 7) 8)) ?\0)
 				       '(1))))))
   (insert "\n" (propertize (concat  (make-string 15 ?\s)
 				    "THIS IS A TEST"
 				    (make-string 15 ?\s))
                            'face `(:background "red" :foreground "blue" :stipple ,stipple))))

The first makes a stipple with blue lines with a red background.

 (let ((str "foobar"))
   (make-face 'foo)
   (set-face-stipple 'foo (list 2 2 (string 1 2)))
   (put-text-property 0 3 'face 'foo str)
   (insert str))

This one makes a chess board-like stipple.

font-lock-mode must be disabled for make this work.

Also i use this for test xbm files, in my case i use gnus.xbm file from
etc/images/gnus/:
 (set-face-attribute 'region nil :stipple "path/to/xbm/file")

This set a stipple attribute to region face.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Stipple-support-for-MS-Windows.patch --]
[-- Type: text/x-patch, Size: 8103 bytes --]

From 1fefedc98ad2e6cd214c14e26a94188beb444d5c Mon Sep 17 00:00:00 2001
From: "Elias G. Perez" <eg642616@gmail.com>
Date: Fri, 10 May 2024 20:36:42 -0600
Subject: [PATCH] Stipple support for MS Windows

* etc/NEWS: Announce support for stipples in MS-Windows.

* src/w32term.h (w32_bitmap_record): Add stipple value.

* src/w32term.c:
(w32_fill_stipple_pattern): New function.
(w32_draw_glyph_string_background, w32_draw_glyph_string_bg_rect)
(w32_draw_stretch_glyph_string): Use new stipple function.

* src/image.c:
(image_create_bitmap_from_data): Create stipple bitmap.
(image_create_bitmap_from_file): Add suuport for pixmap and create
stipple bitmap.
---
 etc/NEWS      |  3 +++
 src/image.c   | 56 ++++++++++++++++++++++++++++++++++++++++++++-----
 src/w32term.c | 58 +++++++++++++++++++++++++++++++++------------------
 src/w32term.h |  1 +
 4 files changed, 93 insertions(+), 25 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index a79a5844a22..3f9145ba582 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2779,6 +2779,9 @@ title bars' and scroll bars' appearance.  If the new user option
 will disregard the system's Dark mode and will always use the default
 Light mode.
 
++++
+*** Support for stipples.
+
 \f
 ----------------------------------------------------------------------
 This file is part of GNU Emacs.
diff --git a/src/image.c b/src/image.c
index 3138ef25a63..f062e8e4475 100644
--- a/src/image.c
+++ b/src/image.c
@@ -214,6 +214,13 @@ #define n_planes n_image_planes
 static unsigned long *colors_in_color_table (int *n);
 #endif
 
+#ifdef HAVE_NTGUI
+static HBITMAP w32_create_pixmap_from_bitmap_data (int width,
+						   int height,
+						   char *data);
+
+#endif
+
 #if defined (HAVE_WEBP) || defined (HAVE_GIF)
 static void anim_prune_animation_cache (Lisp_Object);
 #endif
@@ -602,7 +609,12 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes,
 			 FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits,
 			 bits);
-  if (! bitmap)
+  Emacs_Pixmap stipple;
+
+  /* Convert X bitmap to W32 bitmap.  */
+  stipple = w32_create_pixmap_from_bitmap_data (width, height, bits);
+
+  if (!bitmap || !stipple)
     return -1;
 #endif /* HAVE_NTGUI */
 
@@ -681,6 +693,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 
 #ifdef HAVE_NTGUI
   dpyinfo->bitmaps[id - 1].pixmap = bitmap;
+  dpyinfo->bitmaps[id - 1].stipple = stipple;
   dpyinfo->bitmaps[id - 1].hinst = NULL;
   dpyinfo->bitmaps[id - 1].depth = 1;
 #endif /* HAVE_NTGUI */
@@ -699,7 +712,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 #endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */
 
 #if defined HAVE_HAIKU || defined HAVE_NS || defined HAVE_PGTK	\
-  || defined HAVE_ANDROID
+  || defined HAVE_ANDROID || defined HAVE_NTGUI
 static char *slurp_file (image_fd, ptrdiff_t *);
 static Lisp_Object image_find_image_fd (Lisp_Object, image_fd *);
 static bool xbm_read_bitmap_data (struct frame *, char *, char *,
@@ -711,10 +724,43 @@ image_create_bitmap_from_data (struct frame *f, char *bits,
 ptrdiff_t
 image_create_bitmap_from_file (struct frame *f, Lisp_Object file)
 {
-#if defined (HAVE_NTGUI)
-  return -1;  /* W32_TODO : bitmap support */
-#else
   Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f);
+
+#ifdef HAVE_NTGUI
+  ptrdiff_t id, size;
+  int width, height, rc;
+  image_fd fd;
+  char *contents, *data;
+  Emacs_Pixmap bitmap;
+
+  if (!STRINGP (image_find_image_fd (file, &fd)))
+    return -1;
+
+  contents = slurp_file (fd, &size);
+
+  if (!contents)
+    return -1;
+
+  rc = xbm_read_bitmap_data (f, contents, contents + size,
+			     &width, &height, &data, 0);
+
+  if (!rc)
+    {
+      xfree (contents);
+      return -1;
+    }
+
+  id = image_allocate_bitmap_record (f);
+  bitmap = w32_create_pixmap_from_bitmap_data (width, height, data);
+
+  dpyinfo->bitmaps[id - 1].height = width;
+  dpyinfo->bitmaps[id - 1].width = height;
+  dpyinfo->bitmaps[id - 1].stipple = bitmap;
+  dpyinfo->bitmaps[id - 1].file = xlispstrdup (file);
+
+  xfree (contents);
+  xfree (data);
+  return id;
 #endif
 
 #ifdef HAVE_NS
diff --git a/src/w32term.c b/src/w32term.c
index 2bcd5d86a38..900f33f3ede 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -1248,6 +1248,37 @@ w32_clear_glyph_string_rect (struct glyph_string *s,
                  real_w, real_h);
 }
 
+/* Fill background with bitmap pattern from S at specified position
+   given by X and Y.  WIDTH and HEIGHT specifies bitmap size, GC is
+   used to get foreground and background color context and HDC where
+   fill it.  */
+
+static void
+w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
+			  int x, int y, unsigned int width, unsigned int height)
+{
+  /* BUG: stipple bitmap has the inverted colors, inverting
+     those 2 functions color must fix this. */
+
+  SetTextColor (hdc, gc->background);
+  SetBkColor (hdc, gc->foreground);
+
+  Emacs_Pixmap bm;
+  HBRUSH hb;
+  RECT r;
+
+  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;
+  hb = CreatePatternBrush (bm);
+
+  r.left = x;
+  r.top = y;
+  r.right = x + width;
+  r.bottom = y + height;
+
+  FillRect (hdc, &r, hb);
+
+  DeleteObject (hb);
+}
 
 /* Draw the background of glyph_string S.  If S->background_filled_p
    is non-zero don't draw it.  FORCE_P non-zero means draw the
@@ -1264,21 +1295,16 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-#if 0 /* TODO: stipple */
       if (s->stippled_p)
 	{
 	  /* Fill background with a stipple pattern.  */
-	  XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-	  XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x,
-			  s->y + box_line_width,
-			  s->background_width,
-			  s->height - 2 * box_line_width);
-	  XSetFillStyle (s->display, s->gc, FillSolid);
+	  w32_fill_stipple_pattern (s->hdc, s, s->gc, s->x,
+				    s->y + box_line_width,
+				    s->background_width,
+				    s->height - 2 * box_line_width);
 	  s->background_filled_p = true;
 	}
-      else
-#endif
-           if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
+      else if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
 	       /* When xdisp.c ignores FONT_HEIGHT, we cannot trust
 		  font dimensions, since the actual glyphs might be
 		  much smaller.  So in that case we always clear the
@@ -2286,16 +2312,12 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap)
 static void
 w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y, int w, int h)
 {
-#if 0 /* TODO: stipple */
   if (s->stippled_p)
     {
       /* Fill background with a stipple pattern.  */
-      XSetFillStyle (s->display, s->gc, FillOpaqueStippled);
-      XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, x, y, w, h);
-      XSetFillStyle (s->display, s->gc, FillSolid);
+      w32_fill_stipple_pattern (s->hdc, s, s->gc, x, y, w, h);
     }
   else
-#endif
     w32_clear_glyph_string_rect (s, x, y, w, h);
 }
 
@@ -2500,16 +2522,12 @@ w32_draw_stretch_glyph_string (struct glyph_string *s)
 	  get_glyph_string_clip_rect (s, &r);
 	  w32_set_clip_rectangle (hdc, &r);
 
-#if 0 /* TODO: stipple */
 	  if (s->face->stipple)
 	    {
 	      /* Fill background with a stipple pattern.  */
-	      XSetFillStyle (s->display, gc, FillOpaqueStippled);
-	      XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), gc, x, y, w, h);
-	      XSetFillStyle (s->display, gc, FillSolid);
+	      w32_fill_stipple_pattern (s->hdc, s, gc, x, y, w, h);
 	    }
 	  else
-#endif
             {
               w32_fill_area (s->f, s->hdc, gc->background, x, y, w, h);
             }
diff --git a/src/w32term.h b/src/w32term.h
index 3120c8bd71f..1eb6a660248 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -58,6 +58,7 @@ #define CP_DEFAULT 1004
 {
   Emacs_Pixmap pixmap;
   char *file;
+  Emacs_Pixmap stipple;
   HINSTANCE hinst; /* Used to load the file */
   int refcount;
   /* Record some info about this pixmap.  */
-- 
2.44.0.windows.1


^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-25 11:30                                   ` Arash Esbati
@ 2024-05-26  2:37                                     ` Po Lu
  2024-05-27 15:32                                       ` Arash Esbati
  0 siblings, 1 reply; 36+ messages in thread
From: Po Lu @ 2024-05-26  2:37 UTC (permalink / raw)
  To: Arash Esbati; +Cc: Eli Zaretskii, Elijah G., emacs-devel

Arash Esbati <arash@gnu.org> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
>> on Non-Free Operating Systems" section.
>
> Severity: wishlist

You're not replying to the bug tracker, are you?  Besides, how can this
be consigned to a wishlist with any propriety when the implementation is
essentially complete?

> While we're at it: it would be great if stipples would work on macOS as
> well; see bug#70712.

I agree.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-26  0:27                                   ` Elijah G.
@ 2024-05-26  8:09                                     ` Yuri Khan
  2024-05-27  2:05                                       ` Elijah G.
  2024-05-26  8:51                                     ` Eli Zaretskii
  1 sibling, 1 reply; 36+ messages in thread
From: Yuri Khan @ 2024-05-26  8:09 UTC (permalink / raw)
  To: Elijah G.; +Cc: Eli Zaretskii, luangruo, emacs-devel

On Sun, 26 May 2024 at 07:28, Elijah G. <eg642616@gmail.com> wrote:

> >> +  /* BUG: stipple bitmap has the inverted colors, inverting
> >> +     those 2 functions color must fix this. */
> >
> > Can we fix this before installing, please?  If there are problems with
> > inverting the colors that you are unsure how to fix, please describe
> > those problems in detail, so that others could provide advice or code.
>
> I would like fix it, but I don't have a clear answer as to why this
> problem happens, I just left the notice there as a temp solution in case
> someone comes up with a better solution.

The documentation for CreatePatternBrush[1] clearly documents the behavior:

[1]: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createpatternbrush

    A brush created by using a monochrome (1 bit per pixel) bitmap
    has the text and background colors
    of the device context to which it is drawn.
    Pixels represented by a 0 bit are drawn with the current text color;
    pixels represented by a 1 bit are drawn
    with the current background color.

If swapping the background and foreground colors to account for that
mapping is not satisfactory for you, you could invert the bitmap
before creating the brush.

The steps to do that would be, if I have not completely forgotten the GDI API:

1. Use CreateCompatibleDC to create a memory DC.
2. Select the stipple bitmap into this memory DC using SelectObject.
3. Call InvertRect on that DC, passing (0, 0)–(w, h) as the target rectangle.
4. DeleteDC the memory DC.

You should be able to do that once after converting from Emacs format.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-26  0:27                                   ` Elijah G.
  2024-05-26  8:09                                     ` Yuri Khan
@ 2024-05-26  8:51                                     ` Eli Zaretskii
  2024-05-28  0:23                                       ` Elijah G.
  1 sibling, 1 reply; 36+ messages in thread
From: Eli Zaretskii @ 2024-05-26  8:51 UTC (permalink / raw)
  To: Elijah G.; +Cc: luangruo, emacs-devel

> From: "Elijah G." <eg642616@gmail.com>
> Cc: luangruo@yahoo.com,  emacs-devel@gnu.org
> Date: Sat, 25 May 2024 18:27:45 -0600
> 
> I'm wondering if the patch must be here or to the bug tracker, if
> should it be sent here i think bug#71159 can be closed.

It's better to send to the bug tracker (and to start the discussion
there in the first place).  But sending both here and to the bug
tracker is the absolute worst, so please don't do that in the future.

> >> +static void
> >> +w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
> >> +			  int x, int y, unsigned int width, unsigned int height)
> >> +{
> >> +  /* BUG: stipple bitmap has the inverted colors, inverting
> >> +     those 2 functions color must fix this. */
> >
> > Can we fix this before installing, please?  If there are problems with
> > inverting the colors that you are unsure how to fix, please describe
> > those problems in detail, so that others could provide advice or code.
> 
> I would like fix it, but I don't have a clear answer as to why this
> problem happens, I just left the notice there as a temp solution in case
> someone comes up with a better solution.
> 
> I could see that BitBlt maybe can fix this (I've had problems for test
> it).
> 
> Also I don't think w32_create_pixmap_from_bitmap_data cause this
> problem, as far as i could see it's a problem with the bitmap data
> 
>   image_create_bitmap_from_data (struct frame *f, char *bits,
>                                                         ^^^^
>                                               (as example this function)
> 
> One solution that i was thinking is using a kind of inverse-video for
> make it use fg as bg and vice-versa but I'm not sure how.
> 
> Also I was thinking in modifying bitmap data with something like this,
> but i don't have idea how:
> 
>   for (i = 0; i < height; i++)
>     {
>       -- Invert bitmap data--
>       for (j = 0; j < w1; j++)
>         {
>           -- Invert bitmap data--
>         }
>     }

Please explain the problem in more detail.  Above you are talking
about the possible cause and the potential solutions, but do not
describe the problem itself.  It's hard to think about solutions
without understanding the problem in detail.

> 
> 
> > Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
> > on Non-Free Operating Systems" section.
> 
> Done.
> 
> >> I would like if someone else can test it for see if there are any
> >> issues.
> >
> > Please suggest how to test this.
> 
> Sure, after apply patch and build Emacs, i open runemacs.exe with -Q,
> inside the scratch-buffer i paste these code snippets and eval them:
> 
>  (let* ((w (window-font-width))
>         (stipple `(,w 1 ,(apply #'unibyte-string
>  			       (append (make-list (1- (/ (+ w 7) 8)) ?\0)
>  				       '(1))))))
>    (insert "\n" (propertize (concat  (make-string 15 ?\s)
>  				    "THIS IS A TEST"
>  				    (make-string 15 ?\s))
>                             'face `(:background "red" :foreground "blue" :stipple ,stipple))))
> 
> The first makes a stipple with blue lines with a red background.

It crashed for me.  I needed to make the following changes in
image_create_bitmap_from_data:

#ifdef HAVE_NTGUI
  Emacs_Pixmap bitmap = CreateBitmap (width, height, dpyinfo->n_planes,
				      dpyinfo->n_cbits, bits);

instead of using XFRAME(frame) there, since the variable 'frame' was
not initialized, and you have dpyinfo already anyway.

I guess you sent code that was not the final version?

> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -2779,6 +2779,9 @@ title bars' and scroll bars' appearance.  If the new user option
>  will disregard the system's Dark mode and will always use the default
>  Light mode.
>  
> ++++
> +*** Support for stipples.

That's too terse.  It should say

  ---
  *** Emacs on MS-Windows now supports the :stipple face attribute.

Also, "---" not "+++" since this change does not require any changes
in the manuals.

Thanks.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-26  8:09                                     ` Yuri Khan
@ 2024-05-27  2:05                                       ` Elijah G.
  2024-05-27  6:20                                         ` Yuri Khan
  0 siblings, 1 reply; 36+ messages in thread
From: Elijah G. @ 2024-05-27  2:05 UTC (permalink / raw)
  To: Yuri Khan; +Cc: Eli Zaretskii, luangruo, emacs-devel

Yuri Khan <yuri.v.khan@gmail.com> writes:

> If swapping the background and foreground colors to account for that
> mapping is not satisfactory for you, you could invert the bitmap
> before creating the brush.
>
> The steps to do that would be, if I have not completely forgotten the GDI API:
>
> 1. Use CreateCompatibleDC to create a memory DC.
> 2. Select the stipple bitmap into this memory DC using SelectObject.
> 3. Call InvertRect on that DC, passing (0, 0)–(w, h) as the target rectangle.

Thank you for the advises.
Can you explain why use (0, 0)-(w, h) instead the defined RECT from the
code please?

Here is the current function code with the advises applied (except the
third step that i had to use a defined RECT), but it doesn't seems work
neither, i don't know if i did something wrong when applying the steps:

--8<---------------cut here---------------start------------->8---
static void
w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
			  int x, int y, unsigned int width, unsigned int height)
{
  SetTextColor (hdc, gc->foreground);
  SetBkColor (hdc, gc->background);

  RECT r;
  r.left = x;
  r.top = y;
  r.right = x + width;
  r.bottom = y + height;

  Emacs_Pixmap bm;
  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;

  HDC comp_dc = CreateCompatibleDC(hdc);
  SelectObject (comp_dc, bm);
  InvertRect (comp_dc, &r);

  HBRUSH hb = CreatePatternBrush (bm);

  FillRect (hdc, &r, hb);

  DeleteObject (hb);
  DeleteDC(comp_dc);
}
--8<---------------cut here---------------end--------------->8---


Also i'm wondering if BitBlt can be another solution too.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-27  2:05                                       ` Elijah G.
@ 2024-05-27  6:20                                         ` Yuri Khan
  2024-05-28  2:06                                           ` Elijah G.
  0 siblings, 1 reply; 36+ messages in thread
From: Yuri Khan @ 2024-05-27  6:20 UTC (permalink / raw)
  To: Elijah G.; +Cc: Eli Zaretskii, luangruo, emacs-devel

On Mon, 27 May 2024 at 09:05, Elijah G. <eg642616@gmail.com> wrote:
>
> Yuri Khan <yuri.v.khan@gmail.com> writes:
>
> > 1. Use CreateCompatibleDC to create a memory DC.
> > 2. Select the stipple bitmap into this memory DC using SelectObject.
> > 3. Call InvertRect on that DC, passing (0, 0)–(w, h) as the target rectangle.
>
> Thank you for the advises.
> Can you explain why use (0, 0)-(w, h) instead the defined RECT from the
> code please?

RECT from the code indicates the coordinates where you’re drawing the
stipple. I’m suggesting you invert the stipple bitmap once after
creation so that it could be used without further modifications on
each draw. In this case you need to act on the stipple bitmap
coordinates.

> Here is the current function code with the advises applied (except the
> third step that i had to use a defined RECT), but it doesn't seems work
> neither, i don't know if i did something wrong when applying the steps:

Two things:

1. you invert a RECT defined by coordinates where you draw the
stipple, and that is most likely outside the bounds of the stipple
bitmap;
2. you’re doing it on each draw of this stipple rather than once, so
if you fix the RECT, you’ll be inverting the stipple each time so
odd-numbered draw calls will come out okay but even-numbered draw
calls will again be inverted.

> --8<---------------cut here---------------start------------->8---
> static void
> w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
>                           int x, int y, unsigned int width, unsigned int height)
> {
>   RECT r;
>   r.left = x;
>   r.top = y;
>   r.right = x + width;
>   r.bottom = y + height;
>   HDC comp_dc = CreateCompatibleDC(hdc);
>   SelectObject (comp_dc, bm);
>   InvertRect (comp_dc, &r);
> }
> --8<---------------cut here---------------end--------------->8---
>
> Also i'm wondering if BitBlt can be another solution too.

Using BitBlt on the target DC would be trying to fix the misdraw after
the fact. You’d also have to invent a combination of a rop (raster
operation) and whichever auxiliary argument it takes so that it turns
the foreground color into the background color and vice versa.

BitBlt could be used on a memory DC into which the stipple bitmap is
selected, to emulate InvertRect, e.g. passing a rop of DSTINVERT, but
this brings no benefits.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-26  2:37                                     ` Po Lu
@ 2024-05-27 15:32                                       ` Arash Esbati
  0 siblings, 0 replies; 36+ messages in thread
From: Arash Esbati @ 2024-05-27 15:32 UTC (permalink / raw)
  To: Po Lu; +Cc: Eli Zaretskii, Elijah G., emacs-devel

Po Lu <luangruo@yahoo.com> writes:

> Arash Esbati <arash@gnu.org> writes:
>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>> Finally, this change needs a NEWS entry, in the "Changes in Emacs 30.1
>>> on Non-Free Operating Systems" section.
>>
>> Severity: wishlist
>
> You're not replying to the bug tracker, are you?  Besides, how can this
> be consigned to a wishlist with any propriety when the implementation is
> essentially complete?

Upps, sorry, I managed to paste the wrong piece into this message: It
wasn't meant for the tracker, just a mistake.

>> While we're at it: it would be great if stipples would work on macOS as
>> well; see bug#70712.
>
> I agree.

Thanks.

Best, Arash



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-26  8:51                                     ` Eli Zaretskii
@ 2024-05-28  0:23                                       ` Elijah G.
  0 siblings, 0 replies; 36+ messages in thread
From: Elijah G. @ 2024-05-28  0:23 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, emacs-devel

Eli Zaretskii <eliz@gnu.org> writes:

>> I'm wondering if the patch must be here or to the bug tracker, if
>> should it be sent here i think bug#71159 can be closed.
>
> It's better to send to the bug tracker (and to start the discussion
> there in the first place).  But sending both here and to the bug
> tracker is the absolute worst, so please don't do that in the future.

I'm sorry about that, i thought that emacs-devel was the right place for
this, now i will send the patch to the bug tracker (specifically to
bug#71159 thread)

> Please explain the problem in more detail.  Above you are talking
> about the possible cause and the potential solutions, but do not
> describe the problem itself.  It's hard to think about solutions
> without understanding the problem in detail.

It's hard to me explain it with details, i will do my best,
AFAIK the problem is with the bitmap data, which have their bits
inverted, Windows monochromatic bitmaps are reversed compared with X,
what I'm trying to do is reverse the bitmap bytes for make they use the
correct faces.

As i could see, this problem has already happened (see:
https://git.savannah.gnu.org/cgit/emacs.git/tree/src/image.c#n5222)
I would like to know how to apply or reuse that little code snippet for
this stipple implementation.

>> > Please suggest how to test this.
>> 
>> Sure, after apply patch and build Emacs, i open runemacs.exe with -Q,
>> inside the scratch-buffer i paste these code snippets and eval them:
>> 
>>  (let* ((w (window-font-width))
>>         (stipple `(,w 1 ,(apply #'unibyte-string
>>  			       (append (make-list (1- (/ (+ w 7) 8)) ?\0)
>>  				       '(1))))))
>>    (insert "\n" (propertize (concat  (make-string 15 ?\s)
>>  				    "THIS IS A TEST"
>>  				    (make-string 15 ?\s))
>>                             'face `(:background "red" :foreground "blue" :stipple ,stipple))))
>> 
>> The first makes a stipple with blue lines with a red background.
>
> It crashed for me.  I needed to make the following changes in
> image_create_bitmap_from_data:
>
> #ifdef HAVE_NTGUI
>   Emacs_Pixmap bitmap = CreateBitmap (width, height, dpyinfo->n_planes,
> 				      dpyinfo->n_cbits, bits);
>
> instead of using XFRAME(frame) there, since the variable 'frame' was
> not initialized, and you have dpyinfo already anyway.
>
> I guess you sent code that was not the final version?

I'm not sure why it crashed you, I've tested it a lot of times and I
didn't have any problem.

>> --- a/etc/NEWS
>> +++ b/etc/NEWS
>> @@ -2779,6 +2779,9 @@ title bars' and scroll bars' appearance.  If the new user option
>>  will disregard the system's Dark mode and will always use the default
>>  Light mode.
>>  
>> ++++
>> +*** Support for stipples.
>
> That's too terse.  It should say
>
>   ---
>   *** Emacs on MS-Windows now supports the :stipple face attribute.
>
> Also, "---" not "+++" since this change does not require any changes
> in the manuals.

I've applied your changes, i will send the patch to the bug tracker when
the stipple problem is solved.



^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: Stipples support in MS-Windows port
  2024-05-27  6:20                                         ` Yuri Khan
@ 2024-05-28  2:06                                           ` Elijah G.
  0 siblings, 0 replies; 36+ messages in thread
From: Elijah G. @ 2024-05-28  2:06 UTC (permalink / raw)
  To: Yuri Khan; +Cc: Eli Zaretskii, luangruo, emacs-devel

Yuri Khan <yuri.v.khan@gmail.com> writes:

> 1. you invert a RECT defined by coordinates where you draw the
> stipple, and that is most likely outside the bounds of the stipple
> bitmap;
> 2. you’re doing it on each draw of this stipple rather than once, so
> if you fix the RECT, you’ll be inverting the stipple each time so
> odd-numbered draw calls will come out okay but even-numbered draw
> calls will again be inverted.

Thanks you, at first it works, but increasing or decreasing text scale
doesn't invert the rect, I'm trying to figure how to calling it once.

Also I'm wondering if it's better invert bitmap pixels before using
_w32_create_pixmap_from_bitmap_data_

Like this:

  for (int i = 0; i < (width + 7) / 8; i++)
    bits[i] = (~(bits[i]));
  stipple = w32_create_pixmap_from_bitmap_data (width, height, bits);

Here is the code:
--8<---------------cut here---------------start------------->8---
@@ -56,10 +56,12 @@ #define CP_DEFAULT 1004
 
 struct w32_bitmap_record
 {
   Emacs_Pixmap pixmap;
   char *file;
+  Emacs_Pixmap stipple;
+  bool_bf stipple_applied_p;
   HINSTANCE hinst; /* Used to load the file */
   int refcount;
   /* Record some info about this pixmap.  */
   int height, width, depth;
 };
--8<---------------cut here---------------end--------------->8---


--8<---------------cut here---------------start------------->8---
static void
w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc,
			  int x, int y, unsigned int width, unsigned int height)
{
  SetTextColor (hdc, gc->foreground);
  SetBkColor (hdc, gc->background);

  RECT r;
  r.left = x;
  r.top = y;
  r.right = x + width;
  r.bottom = y + height;

  Emacs_Pixmap bm;
  bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple;

  /* Windows mono bitmaps are reversed compared with X.  */
  HDC compat_dc;

  if (FRAME_DISPLAY_INFO (s->f)
	->bitmaps[s->face->stipple - 1]
	.stipple_applied_p
      != true)
    {
      compat_dc = CreateCompatibleDC (hdc);

      SelectObject (compat_dc, bm);

      RECT r2;
      r2.left = 0;
      r2.top = 0;
      r2.right = width;
      r2.bottom = height;

      InvertRect (compat_dc, &r2);
    }

  HBRUSH hb = CreatePatternBrush (bm);
  FillRect (hdc, &r, hb);

  DeleteObject (hb);
  if (FRAME_DISPLAY_INFO (s->f)
	->bitmaps[s->face->stipple - 1]
	.stipple_applied_p
      != true)
    {
      DeleteDC (compat_dc);
      FRAME_DISPLAY_INFO (s->f)
	->bitmaps[s->face->stipple - 1]
	.stipple_applied_p
	= true;
    }
}
--8<---------------cut here---------------end--------------->8---



^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2024-05-28  2:06 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-03  2:53 Stipples support in MS-Windows port Elijah G
2024-05-03  6:09 ` Eli Zaretskii
2024-05-03  7:30 ` Po Lu
2024-05-05  3:43   ` Elijah G
2024-05-05  4:04     ` Po Lu
2024-05-05  4:30       ` Po Lu
2024-05-06  5:17         ` Elijah G
2024-05-11  5:10         ` Elijah G
2024-05-11  5:27           ` Po Lu
2024-05-11  8:24             ` Eli Zaretskii
2024-05-12 23:06               ` Elijah G.
2024-05-14  4:07                 ` Elijah G.
2024-05-14  5:28                   ` Po Lu
2024-05-15  1:43                     ` Elijah G.
2024-05-19 22:37                     ` Elijah G.
2024-05-20 11:15                       ` Eli Zaretskii
2024-05-20 11:19                         ` Po Lu
2024-05-20 12:32                           ` Eli Zaretskii
2024-05-20 13:12                             ` Po Lu
2024-05-20 19:44                         ` Elijah G.
2024-05-21  2:00                           ` Elijah G.
2024-05-21 11:49                             ` Eli Zaretskii
2024-05-22  2:06                               ` Elijah G.
2024-05-24  1:55                                 ` Elijah G.
2024-05-24  6:24                                   ` Po Lu
2024-05-25  7:24                                 ` Eli Zaretskii
2024-05-25 11:30                                   ` Arash Esbati
2024-05-26  2:37                                     ` Po Lu
2024-05-27 15:32                                       ` Arash Esbati
2024-05-26  0:27                                   ` Elijah G.
2024-05-26  8:09                                     ` Yuri Khan
2024-05-27  2:05                                       ` Elijah G.
2024-05-27  6:20                                         ` Yuri Khan
2024-05-28  2:06                                           ` Elijah G.
2024-05-26  8:51                                     ` Eli Zaretskii
2024-05-28  0:23                                       ` Elijah G.

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.