patch 8.0.0029
Problem:    Code for MS-Windows is complicated because of the exceptions for
            old systems.
Solution:   Drop support for MS-Windows older than Windows XP. (Ken Takata)
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 75d600f..be2158d 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -319,7 +319,7 @@
 #ifdef MSWIN_FIND_REPLACE
 static UINT		s_findrep_msg = 0;	/* set in gui_w[16/32].c */
 static FINDREPLACE	s_findrep_struct;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 static FINDREPLACEW	s_findrep_struct_w;
 # endif
 static HWND		s_findrep_hwnd = NULL;
@@ -369,7 +369,7 @@
 # define MyTranslateMessage(x) TranslateMessage(x)
 #endif
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) || defined(GLOBAL_IME)
+#if defined(FEAT_MBYTE) || defined(GLOBAL_IME)
   /* use of WindowProc depends on wide_WindowProc */
 # define MyWindowProc vim_WindowProc
 #else
@@ -473,10 +473,6 @@
 static int	s_timed_out = FALSE;
 static int	dead_key = 0;	/* 0: no dead key, 1: dead key pressed */
 
-#ifdef WIN3264
-static OSVERSIONINFO os_version;    /* like it says.  Init in gui_mch_init() */
-#endif
-
 #ifdef FEAT_BEVAL
 /* balloon-eval WM_NOTIFY_HANDLER */
 static void Handle_WM_Notify(HWND hwnd, LPNMHDR pnmh);
@@ -695,61 +691,41 @@
     WCHAR	wstring[2];
     char_u	*ws = NULL;
 
-    if (os_version.dwPlatformId != VER_PLATFORM_WIN32_NT)
+    wstring[0] = ch;
+    len = 1;
+
+    /* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
+     * "enc_codepage" is non-zero use the standard Win32 function,
+     * otherwise use our own conversion function (e.g., for UTF-8). */
+    if (enc_codepage > 0)
     {
-	/* On Windows 95/98 we apparently get the character in the active
-	 * codepage, not in UCS-2.  If conversion is needed convert it to
-	 * UCS-2 first. */
-	if ((int)GetACP() == enc_codepage)
-	    len = 0;	    /* no conversion required */
-	else
+	len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		(LPSTR)string, slen, 0, NULL);
+	/* If we had included the ALT key into the character but now the
+	 * upper bit is no longer set, that probably means the conversion
+	 * failed.  Convert the original character and set the upper bit
+	 * afterwards. */
+	if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
 	{
-	    string[0] = ch;
-	    len = MultiByteToWideChar(GetACP(), 0, (LPCSTR)string,
-		    1, wstring, 2);
+	    wstring[0] = ch & 0x7f;
+	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
+		    (LPSTR)string, slen, 0, NULL);
+	    if (len == 1) /* safety check */
+		string[0] |= 0x80;
 	}
     }
     else
     {
-	wstring[0] = ch;
 	len = 1;
-    }
-
-    if (len > 0)
-    {
-	/* "ch" is a UTF-16 character.  Convert it to a string of bytes.  When
-	 * "enc_codepage" is non-zero use the standard Win32 function,
-	 * otherwise use our own conversion function (e.g., for UTF-8). */
-	if (enc_codepage > 0)
-	{
-	    len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-	    /* If we had included the ALT key into the character but now the
-	     * upper bit is no longer set, that probably means the conversion
-	     * failed.  Convert the original character and set the upper bit
-	     * afterwards. */
-	    if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80)
-	    {
-		wstring[0] = ch & 0x7f;
-		len = WideCharToMultiByte(enc_codepage, 0, wstring, len,
-					       (LPSTR)string, slen, 0, NULL);
-		if (len == 1) /* safety check */
-		    string[0] |= 0x80;
-	    }
-	}
+	ws = utf16_to_enc(wstring, &len);
+	if (ws == NULL)
+	    len = 0;
 	else
 	{
-	    len = 1;
-	    ws = utf16_to_enc(wstring, &len);
-	    if (ws == NULL)
-		len = 0;
-	    else
-	    {
-		if (len > slen)	/* just in case */
-		    len = slen;
-		mch_memmove(string, ws, len);
-		vim_free(ws);
-	    }
+	    if (len > slen)	/* just in case */
+		len = slen;
+	    mch_memmove(string, ws, len);
+	    vim_free(ws);
 	}
     }
 
@@ -1079,7 +1055,7 @@
 #endif
 
 #ifdef MSWIN_FIND_REPLACE
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * copy useful data from structure LPFINDREPLACE to structure LPFINDREPLACEW
  */
@@ -1127,11 +1103,10 @@
     int	    flags = 0;
     int	    down;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     /* If the OS is Windows NT, and 'encoding' differs from active codepage:
      * convert text from wide string. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-			&& enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
 	findrep_wtoa(&s_findrep_struct, &s_findrep_struct_w);
     }
@@ -1279,7 +1254,7 @@
     }
 }
 
-#if (defined(WIN3264) && defined(FEAT_MBYTE)) \
+#if defined(FEAT_MBYTE) \
 	|| defined(GLOBAL_IME) \
 	|| defined(PROTO)
 # ifdef PROTO
@@ -1586,10 +1561,9 @@
 
     static SysColorTable sys_table[] =
     {
-#ifdef WIN3264
 	{"SYS_3DDKSHADOW", COLOR_3DDKSHADOW},
 	{"SYS_3DHILIGHT", COLOR_3DHILIGHT},
-#ifndef __MINGW32__
+#ifdef COLOR_3DHIGHLIGHT
 	{"SYS_3DHIGHLIGHT", COLOR_3DHIGHLIGHT},
 #endif
 	{"SYS_BTNHILIGHT", COLOR_BTNHILIGHT},
@@ -1600,7 +1574,6 @@
 	{"SYS_INFOBK", COLOR_INFOBK},
 	{"SYS_INFOTEXT", COLOR_INFOTEXT},
 	{"SYS_3DFACE", COLOR_3DFACE},
-#endif
 	{"SYS_BTNFACE", COLOR_BTNFACE},
 	{"SYS_BTNSHADOW", COLOR_BTNSHADOW},
 	{"SYS_ACTIVEBORDER", COLOR_ACTIVEBORDER},
@@ -2094,11 +2067,7 @@
 
 	if (s_need_activate)
 	{
-#ifdef WIN32
 	    (void)SetForegroundWindow(s_hwnd);
-#else
-	    (void)SetActiveWindow(s_hwnd);
-#endif
 	    s_need_activate = FALSE;
 	}
 
@@ -2421,7 +2390,6 @@
 {
 #ifdef FEAT_MBYTE
     WCHAR	*wn = NULL;
-    int		n;
 
     if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
     {
@@ -2438,11 +2406,8 @@
 	    infow.fType = MFT_STRING;
 	    infow.dwTypeData = wn;
 	    infow.cch = (UINT)wcslen(wn);
-	    n = InsertMenuItemW(pmenu, item_id, FALSE, &infow);
+	    InsertMenuItemW(pmenu, item_id, FALSE, &infow);
 	    vim_free(wn);
-	    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		/* Failed, try using non-wide function. */
-		wn = NULL;
 	}
     }
 
@@ -2563,7 +2528,7 @@
     if (s_tabhwnd == NULL)
 	return;
 
-#if defined(FEAT_MBYTE)
+#ifdef FEAT_MBYTE
 # ifndef CCM_SETUNICODEFORMAT
     /* For older compilers.  We assume this never changes. */
 #  define CCM_SETUNICODEFORMAT 0x2005
@@ -2708,18 +2673,15 @@
     if (title != NULL && enc_codepage >= 0 && enc_codepage != (int)GetACP())
     {
 	WCHAR	*wbuf;
-	int	n;
 
 	/* Convert the title from 'encoding' to UTF-16. */
 	wbuf = (WCHAR *)enc_to_utf16((char_u *)title, NULL);
 	if (wbuf != NULL)
 	{
-	    n = SetWindowTextW(hwnd, wbuf);
+	    SetWindowTextW(hwnd, wbuf);
 	    vim_free(wbuf);
-	    if (n != 0 || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return;
-	    /* Retry with non-wide function (for Windows 98). */
 	}
+	return;
     }
 #endif
     (void)SetWindowText(hwnd, (LPCSTR)title);
@@ -2737,11 +2699,10 @@
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: convert text and use wide function. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = FindTextW(
@@ -2774,9 +2735,8 @@
 	if (!IsWindow(s_findrep_hwnd))
 	{
 	    initialise_findrep(eap->arg);
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+# ifdef FEAT_MBYTE
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 		findrep_atow(&s_findrep_struct_w, &s_findrep_struct);
 		s_findrep_hwnd = ReplaceTextW(
@@ -3466,11 +3426,7 @@
     IDC_SIZEWE,			/* leftright */
     IDC_SIZEWE,			/* lrsizing */
     IDC_WAIT,			/* busy */
-#ifdef WIN3264
     IDC_NO,			/* no */
-#else
-    IDC_ICON,			/* no */
-#endif
     IDC_ARROW,			/* crosshair */
     IDC_ARROW,			/* hand1 */
     IDC_ARROW,			/* hand2 */
@@ -3497,11 +3453,7 @@
 #ifdef SetClassLongPtr
 	SetClassLongPtr(s_textArea, GCLP_HCURSOR, (__int3264)(LONG_PTR)LoadCursor(NULL, idc));
 #else
-# ifdef WIN32
 	SetClassLong(s_textArea, GCL_HCURSOR, (long_u)LoadCursor(NULL, idc));
-# else /* Win16 */
-	SetClassWord(s_textArea, GCW_HCURSOR, (WORD)LoadCursor(NULL, idc));
-# endif
 #endif
 	if (!p_mh)
 	{
@@ -3523,7 +3475,7 @@
  * Windows NT/2000/XP the "W" functions are used.
  */
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 /*
  * Wide version of convert_filter().
  */
@@ -3728,17 +3680,15 @@
 	char_u *initdir,
 	char_u *filter)
 {
+# ifdef FEAT_MBYTE
+    return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
+# else
     OPENFILENAME	fileStruct;
     char_u		fileBuf[MAXPATHL];
     char_u		*initdirp = NULL;
     char_u		*filterp;
     char_u		*p;
 
-# if defined(FEAT_MBYTE) && defined(WIN3264)
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-	return gui_mch_browseW(saving, title, dflt, ext, initdir, filter);
-# endif
-
     if (dflt == NULL)
 	fileBuf[0] = NUL;
     else
@@ -3748,12 +3698,12 @@
     filterp = convert_filter(filter);
 
     vim_memset(&fileStruct, 0, sizeof(OPENFILENAME));
-#ifdef OPENFILENAME_SIZE_VERSION_400
+#  ifdef OPENFILENAME_SIZE_VERSION_400
     /* be compatible with Windows NT 4.0 */
     fileStruct.lStructSize = OPENFILENAME_SIZE_VERSION_400;
-#else
+#  else
     fileStruct.lStructSize = sizeof(fileStruct);
-#endif
+#  endif
 
     fileStruct.lpstrTitle = (LPSTR)title;
     fileStruct.lpstrDefExt = (LPSTR)ext;
@@ -3783,10 +3733,10 @@
      * Don't use OFN_OVERWRITEPROMPT, Vim has its own ":confirm" dialog.
      */
     fileStruct.Flags = (OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY);
-#ifdef FEAT_SHORTCUT
+#  ifdef FEAT_SHORTCUT
     if (curbuf->b_p_bin)
 	fileStruct.Flags |= OFN_NODEREFERENCELINKS;
-#endif
+#  endif
     if (saving)
     {
 	if (!GetSaveFileName(&fileStruct))
@@ -3806,6 +3756,7 @@
 
     /* Shorten the file name if possible */
     return vim_strsave(shorten_fname1((char_u *)fileBuf));
+# endif
 }
 #endif /* FEAT_BROWSE */
 
@@ -3816,16 +3767,11 @@
     HDROP hDrop)
 {
 #ifdef FEAT_WINDOWS
-#ifdef WIN3264
 # define BUFPATHLEN _MAX_PATH
 # define DRAGQVAL 0xFFFFFFFF
-#else
-# define BUFPATHLEN MAXPATHL
-# define DRAGQVAL 0xFFFF
-#endif
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
     WCHAR   wszFile[BUFPATHLEN];
-#endif
+# endif
     char    szFile[BUFPATHLEN];
     UINT    cFiles = DragQueryFile(hDrop, DRAGQVAL, NULL, 0);
     UINT    i;
@@ -3846,11 +3792,11 @@
     if (fnames != NULL)
 	for (i = 0; i < cFiles; ++i)
 	{
-#ifdef FEAT_MBYTE
+# ifdef FEAT_MBYTE
 	    if (DragQueryFileW(hDrop, i, wszFile, BUFPATHLEN) > 0)
 		fnames[i] = utf16_to_enc(wszFile, NULL);
 	    else
-#endif
+# endif
 	    {
 		DragQueryFile(hDrop, i, szFile, BUFPATHLEN);
 		fnames[i] = vim_strsave((char_u *)szFile);
@@ -3888,14 +3834,10 @@
     long	val;
     int		dragging = FALSE;
     int		dont_scroll_save = dont_scroll;
-#ifndef WIN3264
-    int		nPos;
-#else
     SCROLLINFO	si;
 
     si.cbSize = sizeof(si);
     si.fMask = SIF_POS;
-#endif
 
     sb = gui_mswin_find_scrollbar(hwndCtl);
     if (sb == NULL)
@@ -3960,13 +3902,8 @@
     }
     prev_code = code;
 
-#ifdef WIN3264
     si.nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
     SetScrollInfo(hwndCtl, SB_CTL, &si, TRUE);
-#else
-    nPos = (sb->scroll_shift > 0) ? val >> sb->scroll_shift : val;
-    SetScrollPos(hwndCtl, SB_CTL, nPos, TRUE);
-#endif
 
     /*
      * When moving a vertical scrollbar, move the other vertical scrollbar too.
@@ -3976,11 +3913,7 @@
 	scrollbar_T *sba = sb->wp->w_scrollbars;
 	HWND    id = sba[ (sb == sba + SBAR_LEFT) ? SBAR_RIGHT : SBAR_LEFT].id;
 
-#ifdef WIN3264
 	SetScrollInfo(id, SB_CTL, &si, TRUE);
-#else
-	SetScrollPos(id, SB_CTL, nPos, TRUE);
-#endif
     }
 
     /* Don't let us be interrupted here by another message. */
@@ -4448,7 +4381,6 @@
 
 /* Intellimouse support */
 static int mouse_scroll_lines = 0;
-static UINT msh_msgmousewheel = 0;
 
 static int	s_usenewlook;	    /* emulate W95/NT4 non-bold dialogs */
 #ifdef FEAT_TOOLBAR
@@ -4505,34 +4437,6 @@
 # define pImmSetConversionStatus  ImmSetConversionStatus
 #endif
 
-/* multi monitor support */
-typedef struct _MONITORINFOstruct
-{
-    DWORD cbSize;
-    RECT rcMonitor;
-    RECT rcWork;
-    DWORD dwFlags;
-} _MONITORINFO;
-
-typedef HANDLE _HMONITOR;
-typedef _HMONITOR (WINAPI *TMonitorFromWindow)(HWND, DWORD);
-typedef BOOL (WINAPI *TGetMonitorInfo)(_HMONITOR, _MONITORINFO *);
-
-static TMonitorFromWindow   pMonitorFromWindow = NULL;
-static TGetMonitorInfo	    pGetMonitorInfo = NULL;
-static HANDLE		    user32_lib = NULL;
-/*
- * Return TRUE when running under Windows NT 3.x or Win32s, both of which have
- * less fancy GUI APIs.
- */
-    static int
-is_winnt_3(void)
-{
-    return ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion == 3)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32s));
-}
-
 #ifdef FEAT_MENU
 /*
  * Figure out how high the menu bar is at the moment.
@@ -4564,45 +4468,20 @@
     }
     else
     {
-	if (is_winnt_3())	/* for NT 3.xx */
+	/*
+	 * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
+	 * seem to have been set yet, so menu wraps in default window
+	 * width which is very narrow.  Instead just return height of a
+	 * single menu item.  Will still be wrong when the menu really
+	 * should wrap over more than one line.
+	 */
+	GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
+	if (gui.starting)
+	    menu_height = rc1.bottom - rc1.top + 1;
+	else
 	{
-	    if (gui.starting)
-		menu_height = GetSystemMetrics(SM_CYMENU);
-	    else
-	    {
-		RECT r1, r2;
-		int frameht = GetSystemMetrics(SM_CYFRAME);
-		int capht = GetSystemMetrics(SM_CYCAPTION);
-
-		/* get window rect of s_hwnd
-		 * get client rect of s_hwnd
-		 * get cap height
-		 * subtract from window rect, the sum of client height,
-		 * (if not maximized)frame thickness, and caption height.
-		 */
-		GetWindowRect(s_hwnd, &r1);
-		GetClientRect(s_hwnd, &r2);
-		menu_height = r1.bottom - r1.top - (r2.bottom - r2.top
-				 + 2 * frameht * (!IsZoomed(s_hwnd)) + capht);
-	    }
-	}
-	else			/* win95 and variants (NT 4.0, I guess) */
-	{
-	    /*
-	     * In case 'lines' is set in _vimrc/_gvimrc window width doesn't
-	     * seem to have been set yet, so menu wraps in default window
-	     * width which is very narrow.  Instead just return height of a
-	     * single menu item.  Will still be wrong when the menu really
-	     * should wrap over more than one line.
-	     */
-	    GetMenuItemRect(s_hwnd, s_menuBar, 0, &rc1);
-	    if (gui.starting)
-		menu_height = rc1.bottom - rc1.top + 1;
-	    else
-	    {
-		GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
-		menu_height = rc2.bottom - rc1.top + 1;
-	    }
+	    GetMenuItemRect(s_hwnd, s_menuBar, num - 1, &rc2);
+	    menu_height = rc2.bottom - rc1.top + 1;
 	}
     }
 
@@ -4636,42 +4515,11 @@
 #define VMSH_MOUSEWHEEL    "MSWHEEL_ROLLMSG"
 #define VMSH_SCROLL_LINES  "MSH_SCROLL_LINES_MSG"
 
-    HWND hdl_mswheel;
-    UINT msh_msgscrolllines;
-
-    msh_msgmousewheel = 0;
     mouse_scroll_lines = 3;	/* reasonable default */
 
-    if ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion >= 4)
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		&& ((os_version.dwMajorVersion == 4
-			&& os_version.dwMinorVersion >= 10)
-		    || os_version.dwMajorVersion >= 5)))
-    {
-	/* if NT 4.0+ (or Win98) get scroll lines directly from system */
-	SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
-		&mouse_scroll_lines, 0);
-    }
-    else if (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-	    || (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		&& os_version.dwMajorVersion < 4))
-    {	/*
-	 * If Win95 or NT 3.51,
-	 * try to find the hidden point32 window.
-	 */
-	hdl_mswheel = FindWindow(VMOUSEZ_CLASSNAME, VMOUSEZ_TITLE);
-	if (hdl_mswheel)
-	{
-	    msh_msgscrolllines = RegisterWindowMessage(VMSH_SCROLL_LINES);
-	    if (msh_msgscrolllines)
-	    {
-		mouse_scroll_lines = (int)SendMessage(hdl_mswheel,
-			msh_msgscrolllines, 0, 0);
-		msh_msgmousewheel  = RegisterWindowMessage(VMSH_MOUSEWHEEL);
-	    }
-	}
-    }
+    /* if NT 4.0+ (or Win98) get scroll lines directly from system */
+    SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0,
+	    &mouse_scroll_lines, 0);
 }
 
 
@@ -5210,13 +5058,8 @@
 #endif
 
     default:
-	if (uMsg == msh_msgmousewheel && msh_msgmousewheel != 0)
-	{   /* handle MSH_MOUSEWHEEL messages for Intellimouse */
-	    _OnMouseWheel(hwnd, HIWORD(wParam));
-	    return 0L;
-	}
 #ifdef MSWIN_FIND_REPLACE
-	else if (uMsg == s_findrep_msg && s_findrep_msg != 0)
+	if (uMsg == s_findrep_msg && s_findrep_msg != 0)
 	{
 	    _OnFindRepl();
 	}
@@ -5376,42 +5219,6 @@
 	    }
     }
 #endif
-
-    /* get the OS version info */
-    os_version.dwOSVersionInfoSize = sizeof(os_version);
-    GetVersionEx(&os_version); /* this call works on Win32s, Win95 and WinNT */
-
-    /* try and load the user32.dll library and get the entry points for
-     * multi-monitor-support. */
-    if ((user32_lib = vimLoadLib("User32.dll")) != NULL)
-    {
-	pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib,
-							 "MonitorFromWindow");
-
-	/* there are ...A and ...W version of GetMonitorInfo - looking at
-	 * winuser.h, they have exactly the same declaration. */
-	pGetMonitorInfo = (TGetMonitorInfo)GetProcAddress(user32_lib,
-							  "GetMonitorInfoA");
-    }
-
-#ifdef FEAT_MBYTE
-    /* If the OS is Windows NT, use wide functions;
-     * this enables common dialogs input unicode from IME. */
-    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)
-    {
-	pDispatchMessage = DispatchMessageW;
-	pGetMessage = GetMessageW;
-	pIsDialogMessage = IsDialogMessageW;
-	pPeekMessage = PeekMessageW;
-    }
-    else
-    {
-	pDispatchMessage = DispatchMessageA;
-	pGetMessage = GetMessageA;
-	pIsDialogMessage = IsDialogMessageA;
-	pPeekMessage = PeekMessageA;
-    }
-#endif
 }
 
 /*
@@ -5475,12 +5282,7 @@
 		    atom =
 #endif
 		    RegisterClassW(&wndclassw)) == 0)
-	{
-	    if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
-		return FAIL;
-
-	    /* Must be Windows 98, fall back to non-wide function. */
-	}
+	    return FAIL;
 	else
 	    wide_WindowProc = TRUE;
     }
@@ -5710,7 +5512,7 @@
     s_findrep_struct.lpstrReplaceWith[0] = NUL;
     s_findrep_struct.wFindWhatLen = MSWIN_FR_BUFSIZE;
     s_findrep_struct.wReplaceWithLen = MSWIN_FR_BUFSIZE;
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
     s_findrep_struct_w.lStructSize = sizeof(s_findrep_struct_w);
     s_findrep_struct_w.lpstrFindWhat =
 			      (LPWSTR)alloc(MSWIN_FR_BUFSIZE * sizeof(WCHAR));
@@ -5753,22 +5555,18 @@
     static void
 get_work_area(RECT *spi_rect)
 {
-    _HMONITOR	    mon;
-    _MONITORINFO    moninfo;
+    HMONITOR	    mon;
+    MONITORINFO	    moninfo;
 
-    /* use these functions only if available */
-    if (pMonitorFromWindow != NULL && pGetMonitorInfo != NULL)
+    /* work out which monitor the window is on, and get *it's* work area */
+    mon = MonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
+    if (mon != NULL)
     {
-	/* work out which monitor the window is on, and get *it's* work area */
-	mon = pMonitorFromWindow(s_hwnd, 1 /*MONITOR_DEFAULTTOPRIMARY*/);
-	if (mon != NULL)
+	moninfo.cbSize = sizeof(MONITORINFO);
+	if (GetMonitorInfo(mon, &moninfo))
 	{
-	    moninfo.cbSize = sizeof(_MONITORINFO);
-	    if (pGetMonitorInfo(mon, &moninfo))
-	    {
-		*spi_rect = moninfo.rcWork;
-		return;
-	    }
+	    *spi_rect = moninfo.rcWork;
+	    return;
 	}
     }
     /* this is the old method... */
@@ -6307,29 +6105,10 @@
 	CONST INT *padding)
 {
     int		ix;
-    static int	special = -1;
 
-    if (special == -1)
-    {
-	/* Check windows version: special treatment is needed if it is NT 5 or
-	 * Win98 or higher. */
-	if  ((os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && os_version.dwMajorVersion >= 5)
-		|| (os_version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
-		    && (os_version.dwMajorVersion > 4
-			|| (os_version.dwMajorVersion == 4
-			    && os_version.dwMinorVersion > 0))))
-	    special = 1;
-	else
-	    special = 0;
-    }
-
-    if (special)
-	for (ix = 0; ix < (int)len; ++ix)
-	    ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
-					    pcliprect, text + ix, 1, padding);
-    else
-	ExtTextOut(s_hdc, col, row, foptions, pcliprect, text, len, padding);
+    for (ix = 0; ix < (int)len; ++ix)
+	ExtTextOut(s_hdc, col + TEXT_X(ix), row, foptions,
+					pcliprect, text + ix, 1, padding);
 }
 #endif
 
@@ -6718,63 +6497,50 @@
 
     if (menu_is_menubar(menu->name))
     {
-	if (is_winnt_3())
-	{
-	    InsertMenu((parent == NULL) ? s_menuBar : parent->submenu_id,
-		    (UINT)pos, MF_POPUP | MF_STRING | MF_BYPOSITION,
-		    (long_u)menu->submenu_id, (LPCTSTR) menu->name);
-	}
-	else
-	{
 #ifdef FEAT_MBYTE
-	    WCHAR	*wn = NULL;
-	    int		n;
+	WCHAR	*wn = NULL;
 
-	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	{
+	    /* 'encoding' differs from active codepage: convert menu name
+	     * and use wide function */
+	    wn = enc_to_utf16(menu->name, NULL);
+	    if (wn != NULL)
 	    {
-		/* 'encoding' differs from active codepage: convert menu name
-		 * and use wide function */
-		wn = enc_to_utf16(menu->name, NULL);
-		if (wn != NULL)
-		{
-		    MENUITEMINFOW	infow;
+		MENUITEMINFOW	infow;
 
-		    infow.cbSize = sizeof(infow);
-		    infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
-							       | MIIM_SUBMENU;
-		    infow.dwItemData = (long_u)menu;
-		    infow.wID = menu->id;
-		    infow.fType = MFT_STRING;
-		    infow.dwTypeData = wn;
-		    infow.cch = (UINT)wcslen(wn);
-		    infow.hSubMenu = menu->submenu_id;
-		    n = InsertMenuItemW((parent == NULL)
-					    ? s_menuBar : parent->submenu_id,
-					    (UINT)pos, TRUE, &infow);
-		    vim_free(wn);
-		    if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-			/* Failed, try using non-wide function. */
-			wn = NULL;
-		}
+		infow.cbSize = sizeof(infow);
+		infow.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID
+		    | MIIM_SUBMENU;
+		infow.dwItemData = (long_u)menu;
+		infow.wID = menu->id;
+		infow.fType = MFT_STRING;
+		infow.dwTypeData = wn;
+		infow.cch = (UINT)wcslen(wn);
+		infow.hSubMenu = menu->submenu_id;
+		InsertMenuItemW((parent == NULL)
+			? s_menuBar : parent->submenu_id,
+			(UINT)pos, TRUE, &infow);
+		vim_free(wn);
 	    }
+	}
 
-	    if (wn == NULL)
+	if (wn == NULL)
 #endif
-	    {
-		MENUITEMINFO	info;
+	{
+	    MENUITEMINFO	info;
 
-		info.cbSize = sizeof(info);
-		info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
-		info.dwItemData = (long_u)menu;
-		info.wID = menu->id;
-		info.fType = MFT_STRING;
-		info.dwTypeData = (LPTSTR)menu->name;
-		info.cch = (UINT)STRLEN(menu->name);
-		info.hSubMenu = menu->submenu_id;
-		InsertMenuItem((parent == NULL)
-					? s_menuBar : parent->submenu_id,
-					(UINT)pos, TRUE, &info);
-	    }
+	    info.cbSize = sizeof(info);
+	    info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID | MIIM_SUBMENU;
+	    info.dwItemData = (long_u)menu;
+	    info.wID = menu->id;
+	    info.fType = MFT_STRING;
+	    info.dwTypeData = (LPTSTR)menu->name;
+	    info.cch = (UINT)STRLEN(menu->name);
+	    info.hSubMenu = menu->submenu_id;
+	    InsertMenuItem((parent == NULL)
+		    ? s_menuBar : parent->submenu_id,
+		    (UINT)pos, TRUE, &info);
 	}
     }
 
@@ -6890,7 +6656,6 @@
     {
 #ifdef FEAT_MBYTE
 	WCHAR	*wn = NULL;
-	int	n;
 
 	if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	{
@@ -6899,14 +6664,11 @@
 	    wn = enc_to_utf16(menu->name, NULL);
 	    if (wn != NULL)
 	    {
-		n = InsertMenuW(parent->submenu_id, (UINT)idx,
+		InsertMenuW(parent->submenu_id, (UINT)idx,
 			(menu_is_separator(menu->name)
 				 ? MF_SEPARATOR : MF_STRING) | MF_BYPOSITION,
 			(UINT)menu->id, wn);
 		vim_free(wn);
-		if (n == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-		    /* Failed, try using non-wide function. */
-		    wn = NULL;
 	    }
 	}
 	if (wn == NULL)
@@ -7105,11 +6867,10 @@
 	/* If the edit box exists, copy the string. */
 	if (s_textfield != NULL)
 	{
-# if defined(FEAT_MBYTE) && defined(WIN3264)
+# ifdef FEAT_MBYTE
 	    /* If the OS is Windows NT, and 'encoding' differs from active
 	     * codepage: use wide function and convert text. */
-	    if (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT
-		    && enc_codepage >= 0 && (int)GetACP() != enc_codepage)
+	    if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
 	    {
 	       WCHAR  *wp = (WCHAR *)alloc(IOSIZE * sizeof(WCHAR));
 	       char_u *p;
@@ -7866,38 +7627,31 @@
 
     s_usenewlook = FALSE;
 
-    /*
-     * For NT3.51 and Win32s, we stick with the old look
-     * because it matches everything else.
-     */
-    if (!is_winnt_3())
-    {
 #ifdef USE_SYSMENU_FONT
-	if (gui_w32_get_menu_font(&lfSysmenu) == OK)
-	    hfontTools = CreateFontIndirect(&lfSysmenu);
-	else
+    if (gui_w32_get_menu_font(&lfSysmenu) == OK)
+	hfontTools = CreateFontIndirect(&lfSysmenu);
+    else
 #endif
 	hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
 				0, 0, 0, 0, VARIABLE_PITCH , DLG_FONT_NAME);
 
-	if (hfontTools)
-	{
-	    hdc = GetDC(s_hwnd);
-	    SelectObject(hdc, hfontTools);
-	    /*
-	     * GetTextMetrics() doesn't return the right value in
-	     * tmAveCharWidth, so we have to figure out the dialog base units
-	     * ourselves.
-	     */
-	    GetTextExtentPoint(hdc,
-		    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
-		    52, &size);
-	    ReleaseDC(s_hwnd, hdc);
+    if (hfontTools)
+    {
+	hdc = GetDC(s_hwnd);
+	SelectObject(hdc, hfontTools);
+	/*
+	 * GetTextMetrics() doesn't return the right value in
+	 * tmAveCharWidth, so we have to figure out the dialog base units
+	 * ourselves.
+	 */
+	GetTextExtentPoint(hdc,
+		"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+		52, &size);
+	ReleaseDC(s_hwnd, hdc);
 
-	    s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
-	    s_dlgfntheight = (WORD)size.cy;
-	    s_usenewlook = TRUE;
-	}
+	s_dlgfntwidth = (WORD)((size.cx / 26 + 1) / 2);
+	s_dlgfntheight = (WORD)size.cy;
+	s_usenewlook = TRUE;
     }
 
     if (!s_usenewlook)
@@ -8044,10 +7798,6 @@
 	dlgwidth = textWidth;
     dlgwidth += 2 * TEAROFF_PADDING_X + TEAROFF_BUTTON_PAD_X;
 
-    /* W95 can't do thin dialogs, they look v. weird! */
-    if (mch_windows95() && dlgwidth < TEAROFF_MIN_WIDTH)
-	dlgwidth = TEAROFF_MIN_WIDTH;
-
     /* start to fill in the dlgtemplate information.  addressing by WORDs */
     if (s_usenewlook)
 	lStyle = DS_MODALFRAME | WS_CAPTION| WS_SYSMENU |DS_SETFONT| WS_VISIBLE;
@@ -8299,7 +8049,7 @@
     /*
      * Check user bitmaps first, unless builtin is specified.
      */
-    if (!is_winnt_3() && !menu->icon_builtin)
+    if (!menu->icon_builtin)
     {
 	char_u fname[MAXPATHL];
 	HANDLE hbitmap = NULL;
@@ -8556,12 +8306,6 @@
     signicon_t	sign, *psign;
     char_u	*ext;
 
-    if (is_winnt_3())
-    {
-	EMSG(_(e_signdata));
-	return NULL;
-    }
-
     sign.hImage = NULL;
     ext = signfile + STRLEN(signfile) - 4; /* get extension */
     if (ext > signfile)