diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-04-02 22:15:55 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-04-02 22:15:55 +0200 |
commit | 0eb035c974c47e65d32439b48e5a056b370ad429 (patch) | |
tree | ae2c351889a6b6e7a42a2b74f7e961e275ca26f6 /src/os_mswin.c | |
parent | b26705afb55955306ffbe2a390e02fc052802b77 (diff) | |
download | vim-git-0eb035c974c47e65d32439b48e5a056b370ad429.tar.gz |
patch 8.1.1103: MS-Windows: old API calls are no longer neededv8.1.1103
Problem: MS-Windows: old API calls are no longer needed.
Solution: Always use the wide functions. (Ken Takata, closes #4199)
Diffstat (limited to 'src/os_mswin.c')
-rw-r--r-- | src/os_mswin.c | 429 |
1 files changed, 126 insertions, 303 deletions
diff --git a/src/os_mswin.c b/src/os_mswin.c index bd70e84b7..c638aa678 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -105,7 +105,7 @@ typedef int LRESULT; typedef int MOUSE_EVENT_RECORD; typedef int NEWTEXTMETRICW; typedef int PACL; -typedef int PRINTDLG; +typedef int PRINTDLGW; typedef int PSECURITY_DESCRIPTOR; typedef int PSID; typedef int SECURITY_INFORMATION; @@ -282,19 +282,14 @@ mch_settitle( # else if (title != NULL) { - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - /* Convert the title from 'encoding' to the active codepage. */ - WCHAR *wp = enc_to_utf16(title, NULL); + WCHAR *wp = enc_to_utf16(title, NULL); - if (wp != NULL) - { - SetConsoleTitleW(wp); - vim_free(wp); - return; - } - } - SetConsoleTitle((LPCSTR)title); + if (wp == NULL) + return; + + SetConsoleTitleW(wp); + vim_free(wp); + return; } # endif } @@ -359,40 +354,22 @@ mch_FullName( else #endif { - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - WCHAR *wname; - WCHAR wbuf[MAX_PATH]; - char_u *cname = NULL; - - /* Use the wide function: - * - convert the fname from 'encoding' to UCS2. - * - invoke _wfullpath() - * - convert the result from UCS2 to 'encoding'. - */ - wname = enc_to_utf16(fname, NULL); - if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH) != NULL) - { - cname = utf16_to_enc((short_u *)wbuf, NULL); - if (cname != NULL) - { - vim_strncpy(buf, cname, len - 1); - nResult = OK; - } - } - vim_free(wname); - vim_free(cname); - } - if (nResult == FAIL) /* fall back to non-wide function */ + WCHAR *wname; + WCHAR wbuf[MAX_PATH]; + char_u *cname = NULL; + + wname = enc_to_utf16(fname, NULL); + if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH) != NULL) { - if (_fullpath((char *)buf, (const char *)fname, len - 1) == NULL) + cname = utf16_to_enc((short_u *)wbuf, NULL); + if (cname != NULL) { - /* failed, use relative path name */ - vim_strncpy(buf, fname, len - 1); - } - else + vim_strncpy(buf, cname, len - 1); nResult = OK; + } } + vim_free(wname); + vim_free(cname); } #ifdef USE_FNAME_CASE @@ -480,57 +457,6 @@ slash_adjust(char_u *p) #endif static int -stat_symlink_aware(const char *name, stat_T *stp) -{ -#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) - /* Work around for VC12 or earlier (and MinGW). stat() can't handle - * symlinks properly. - * VC9 or earlier: stat() doesn't support a symlink at all. It retrieves - * status of a symlink itself. - * VC10: stat() supports a symlink to a normal file, but it doesn't support - * a symlink to a directory (always returns an error). - * VC11 and VC12: stat() doesn't return an error for a symlink to a - * directory, but it doesn't set S_IFDIR flag. - * MinGW: Same as VC9. */ - WIN32_FIND_DATA findData; - HANDLE hFind, h; - DWORD attr = 0; - BOOL is_symlink = FALSE; - - hFind = FindFirstFile(name, &findData); - if (hFind != INVALID_HANDLE_VALUE) - { - attr = findData.dwFileAttributes; - if ((attr & FILE_ATTRIBUTE_REPARSE_POINT) - && (findData.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) - is_symlink = TRUE; - FindClose(hFind); - } - if (is_symlink) - { - h = CreateFile(name, FILE_READ_ATTRIBUTES, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, - (attr & FILE_ATTRIBUTE_DIRECTORY) - ? FILE_FLAG_BACKUP_SEMANTICS : 0, - NULL); - if (h != INVALID_HANDLE_VALUE) - { - int fd, n; - - fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY); - n = _fstat(fd, (struct _stat *)stp); - if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY)) - stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR; - _close(fd); - return n; - } - } -#endif - return stat(name, stp); -} - - static int wstat_symlink_aware(const WCHAR *name, stat_T *stp) { #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__) @@ -593,6 +519,8 @@ vim_stat(const char *name, stat_T *stp) * UTF-8. */ char_u buf[_MAX_PATH * 3 + 1]; char_u *p; + WCHAR *wp; + int n; vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1); p = buf + STRLEN(buf); @@ -614,19 +542,14 @@ vim_stat(const char *name, stat_T *stp) STRCAT(buf, "\\"); } } - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - WCHAR *wp = enc_to_utf16(buf, NULL); - int n; - if (wp != NULL) - { - n = wstat_symlink_aware(wp, stp); - vim_free(wp); - return n; - } - } - return stat_symlink_aware((char *)buf, stp); + wp = enc_to_utf16(buf, NULL); + if (wp == NULL) + return -1; + + n = wstat_symlink_aware(wp, stp); + vim_free(wp); + return n; } #if defined(FEAT_GUI_MSWIN) || defined(PROTO) @@ -758,6 +681,9 @@ mch_has_wildcard(char_u *p) int mch_chdir(char *path) { + WCHAR *p; + int n; + if (path[0] == NUL) /* just checking... */ return -1; @@ -779,20 +705,13 @@ mch_chdir(char *path) if (*path == NUL) /* drive name only */ return 0; - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - WCHAR *p = enc_to_utf16((char_u *)path, NULL); - int n; - - if (p != NULL) - { - n = _wchdir(p); - vim_free(p); - return n; - } - } + p = enc_to_utf16((char_u *)path, NULL); + if (p == NULL) + return -1; - return chdir(path); /* let the normal chdir() do the rest */ + n = _wchdir(p); + vim_free(p); + return n; } @@ -1097,7 +1016,7 @@ mch_set_winpos(int x, int y) */ static HFONT prt_font_handles[2][2][2]; -static PRINTDLG prt_dlg; +static PRINTDLGW prt_dlg; static const int boldface[2] = {FW_REGULAR, FW_BOLD}; static TEXTMETRIC prt_tm; static int prt_line_height; @@ -1119,18 +1038,16 @@ static char_u *prt_name = NULL; static BOOL vimSetDlgItemText(HWND hDlg, int nIDDlgItem, char_u *s) { - WCHAR *wp = NULL; + WCHAR *wp; BOOL ret; - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - wp = enc_to_utf16(s, NULL); - if (wp != NULL) - { - ret = SetDlgItemTextW(hDlg, nIDDlgItem, wp); - vim_free(wp); - return ret; - } - return SetDlgItemText(hDlg, nIDDlgItem, (LPCSTR)s); + wp = enc_to_utf16(s, NULL); + if (wp == NULL) + return FALSE; + + ret = SetDlgItemTextW(hDlg, nIDDlgItem, wp); + vim_free(wp); + return ret; } /* @@ -1248,7 +1165,7 @@ PrintHookProc( { HWND hwndOwner; RECT rc, rcDlg, rcOwner; - PRINTDLG *pPD; + PRINTDLGW *pPD; if (uiMsg == WM_INITDIALOG) { @@ -1280,7 +1197,7 @@ PrintHookProc( SWP_NOSIZE); /* tackle the printdlg copiesctrl problem */ - pPD = (PRINTDLG *)lParam; + pPD = (PRINTDLGW *)lParam; pPD->nCopies = (WORD)pPD->lCustData; SetDlgItemInt( hDlg, edt3, pPD->nCopies, FALSE ); /* Bring the window to top */ @@ -1423,13 +1340,13 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) int pifBold; int pifUnderline; - DEVMODE *mem; + DEVMODEW *mem; DEVNAMES *devname; int i; bUserAbort = &(psettings->user_abort); - vim_memset(&prt_dlg, 0, sizeof(PRINTDLG)); - prt_dlg.lStructSize = sizeof(PRINTDLG); + vim_memset(&prt_dlg, 0, sizeof(PRINTDLGW)); + prt_dlg.lStructSize = sizeof(PRINTDLGW); #ifndef FEAT_GUI GetConsoleHwnd(); /* get value of s_hwnd */ #endif @@ -1470,11 +1387,11 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) else { prt_dlg.Flags |= PD_RETURNDEFAULT; - if (PrintDlg(&prt_dlg) == 0) + if (PrintDlgW(&prt_dlg) == 0) goto init_fail_dlg; } } - else if (PrintDlg(&prt_dlg) == 0) + else if (PrintDlgW(&prt_dlg) == 0) goto init_fail_dlg; else { @@ -1510,7 +1427,7 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) * passed back correctly. It must be retrieved from the * hDevMode struct. */ - mem = (DEVMODE *)GlobalLock(prt_dlg.hDevMode); + mem = (DEVMODEW *)GlobalLock(prt_dlg.hDevMode); if (mem != NULL) { if (mem->dmCopies != 1) @@ -1525,34 +1442,20 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit) devname = (DEVNAMES *)GlobalLock(prt_dlg.hDevNames); if (devname != 0) { - char_u *printer_name = (char_u *)devname + devname->wDeviceOffset; - char_u *port_name = (char_u *)devname +devname->wOutputOffset; + WCHAR *wprinter_name = (WCHAR *)devname + devname->wDeviceOffset; + WCHAR *wport_name = (WCHAR *)devname + devname->wOutputOffset; char_u *text = (char_u *)_("to %s on %s"); - char_u *printer_name_orig = printer_name; - char_u *port_name_orig = port_name; + char_u *printer_name = utf16_to_enc(wprinter_name, NULL); + char_u *port_name = utf16_to_enc(wport_name, NULL); - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - char_u *to_free = NULL; - int maxlen; - - acp_to_enc(printer_name, (int)STRLEN(printer_name), &to_free, - &maxlen); - if (to_free != NULL) - printer_name = to_free; - acp_to_enc(port_name, (int)STRLEN(port_name), &to_free, &maxlen); - if (to_free != NULL) - port_name = to_free; - } - prt_name = alloc((unsigned)(STRLEN(printer_name) + STRLEN(port_name) - + STRLEN(text))); + if (printer_name != NULL && port_name != NULL) + prt_name = alloc((unsigned)(STRLEN(printer_name) + + STRLEN(port_name) + STRLEN(text))); if (prt_name != NULL) wsprintf((char *)prt_name, (const char *)text, printer_name, port_name); - if (printer_name != printer_name_orig) - vim_free(printer_name); - if (port_name != port_name_orig) - vim_free(port_name); + vim_free(printer_name); + vim_free(port_name); } GlobalUnlock(prt_dlg.hDevNames); @@ -1639,9 +1542,9 @@ init_fail_dlg: int mch_print_begin(prt_settings_T *psettings) { - int ret; + int ret = 0; char szBuffer[300]; - WCHAR *wp = NULL; + WCHAR *wp; hDlgPrint = CreateDialog(GetModuleHandle(NULL), TEXT("PrintDlgBox"), prt_dlg.hwndOwner, PrintDlgProc); @@ -1649,8 +1552,7 @@ mch_print_begin(prt_settings_T *psettings) wsprintf(szBuffer, _("Printing '%s'"), gettail(psettings->jobname)); vimSetDlgItemText(hDlgPrint, IDC_PRINTTEXT1, (char_u *)szBuffer); - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - wp = enc_to_utf16(psettings->jobname, NULL); + wp = enc_to_utf16(psettings->jobname, NULL); if (wp != NULL) { DOCINFOW di; @@ -1661,15 +1563,6 @@ mch_print_begin(prt_settings_T *psettings) ret = StartDocW(prt_dlg.hDC, &di); vim_free(wp); } - else - { - DOCINFO di; - - vim_memset(&di, 0, sizeof(di)); - di.cbSize = sizeof(di); - di.lpszDocName = (LPCSTR)psettings->jobname; - ret = StartDoc(prt_dlg.hDC, &di); - } #ifdef FEAT_GUI /* Give focus back to main window (when using MDI). */ @@ -1725,50 +1618,32 @@ mch_print_start_line(int margin, int page_line) mch_print_text_out(char_u *p, int len) { SIZE sz; - WCHAR *wp = NULL; + WCHAR *wp; int wlen = len; + int ret = FALSE; - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - wp = enc_to_utf16(p, &wlen); - if (wp != NULL) - { - int ret = FALSE; + wp = enc_to_utf16(p, &wlen); + if (wp == NULL) + return FALSE; - TextOutW(prt_dlg.hDC, prt_pos_x + prt_left_margin, - prt_pos_y + prt_top_margin, wp, wlen); - GetTextExtentPoint32W(prt_dlg.hDC, wp, wlen, &sz); - vim_free(wp); - prt_pos_x += (sz.cx - prt_tm.tmOverhang); - /* This is wrong when printing spaces for a TAB. */ - if (p[len] != NUL) + TextOutW(prt_dlg.hDC, prt_pos_x + prt_left_margin, + prt_pos_y + prt_top_margin, wp, wlen); + GetTextExtentPoint32W(prt_dlg.hDC, wp, wlen, &sz); + vim_free(wp); + prt_pos_x += (sz.cx - prt_tm.tmOverhang); + /* This is wrong when printing spaces for a TAB. */ + if (p[len] != NUL) + { + wlen = MB_PTR2LEN(p + len); + wp = enc_to_utf16(p + len, &wlen); + if (wp != NULL) { - wlen = MB_PTR2LEN(p + len); - wp = enc_to_utf16(p + len, &wlen); - if (wp != NULL) - { - GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz); - ret = (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin); - vim_free(wp); - } + GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz); + ret = (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin); + vim_free(wp); } - return ret; } - TextOut(prt_dlg.hDC, prt_pos_x + prt_left_margin, - prt_pos_y + prt_top_margin, - (LPCSTR)p, len); -#ifndef FEAT_PROPORTIONAL_FONTS - prt_pos_x += len * prt_tm.tmAveCharWidth; - return (prt_pos_x + prt_left_margin + prt_tm.tmAveCharWidth - + prt_tm.tmOverhang > prt_right_margin); -#else - GetTextExtentPoint32(prt_dlg.hDC, (LPCSTR)p, len, &sz); - prt_pos_x += (sz.cx - prt_tm.tmOverhang); - /* This is wrong when printing spaces for a TAB. */ - if (p[len] == NUL) - return FALSE; - GetTextExtentPoint32(prt_dlg.hDC, p + len, 1, &sz); - return (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin); -#endif + return ret; } void @@ -1863,6 +1738,7 @@ resolve_reparse_point(char_u *fname) { HANDLE h = INVALID_HANDLE_VALUE; DWORD size; + WCHAR *p; char_u *rfname = NULL; FILE_NAME_INFO_ *nameinfo = NULL; WCHAR buff[MAX_PATH], *volnames = NULL; @@ -1887,33 +1763,19 @@ resolve_reparse_point(char_u *fname) return NULL; } - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) - { - WCHAR *p; - - p = enc_to_utf16(fname, NULL); - if (p == NULL) - goto fail; - - if ((GetFileAttributesW(p) & FILE_ATTRIBUTE_REPARSE_POINT) == 0) - { - vim_free(p); - goto fail; - } + p = enc_to_utf16(fname, NULL); + if (p == NULL) + goto fail; - h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, NULL); + if ((GetFileAttributesW(p) & FILE_ATTRIBUTE_REPARSE_POINT) == 0) + { vim_free(p); + goto fail; } - else - { - if ((GetFileAttributes((char*) fname) & - FILE_ATTRIBUTE_REPARSE_POINT) == 0) - goto fail; - h = CreateFile((char*) fname, 0, 0, NULL, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, NULL); - } + h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + vim_free(p); if (h == INVALID_HANDLE_VALUE) goto fail; @@ -1988,8 +1850,6 @@ resolve_shortcut(char_u *fname) IShellLink *psl = NULL; IPersistFile *ppf = NULL; OLECHAR wsz[MAX_PATH]; - WIN32_FIND_DATA ffd; // we get those free of charge - CHAR buf[MAX_PATH]; // could have simply reused 'wsz'... char_u *rfname = NULL; int len; IShellLinkW *pslw = NULL; @@ -2005,80 +1865,43 @@ resolve_shortcut(char_u *fname) CoInitialize(NULL); - if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) + // create a link manager object and request its interface + hr = CoCreateInstance( + &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, + &IID_IShellLinkW, (void**)&pslw); + if (hr == S_OK) { - // create a link manager object and request its interface - hr = CoCreateInstance( - &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - &IID_IShellLinkW, (void**)&pslw); - if (hr == S_OK) - { - WCHAR *p = enc_to_utf16(fname, NULL); + WCHAR *p = enc_to_utf16(fname, NULL); - if (p != NULL) - { - // Get a pointer to the IPersistFile interface. - hr = pslw->lpVtbl->QueryInterface( - pslw, &IID_IPersistFile, (void**)&ppf); - if (hr != S_OK) - goto shortcut_errorw; - - // "load" the name and resolve the link - hr = ppf->lpVtbl->Load(ppf, p, STGM_READ); - if (hr != S_OK) - goto shortcut_errorw; -# if 0 // This makes Vim wait a long time if the target does not exist. - hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI); - if (hr != S_OK) - goto shortcut_errorw; -# endif + if (p != NULL) + { + // Get a pointer to the IPersistFile interface. + hr = pslw->lpVtbl->QueryInterface( + pslw, &IID_IPersistFile, (void**)&ppf); + if (hr != S_OK) + goto shortcut_errorw; + + // "load" the name and resolve the link + hr = ppf->lpVtbl->Load(ppf, p, STGM_READ); + if (hr != S_OK) + goto shortcut_errorw; +# if 0 // This makes Vim wait a long time if the target does not exist. + hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI); + if (hr != S_OK) + goto shortcut_errorw; +# endif - // Get the path to the link target. - ZeroMemory(wsz, MAX_PATH * sizeof(WCHAR)); - hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0); - if (hr == S_OK && wsz[0] != NUL) - rfname = utf16_to_enc(wsz, NULL); + // Get the path to the link target. + ZeroMemory(wsz, MAX_PATH * sizeof(WCHAR)); + hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0); + if (hr == S_OK && wsz[0] != NUL) + rfname = utf16_to_enc(wsz, NULL); shortcut_errorw: - vim_free(p); - goto shortcut_end; - } + vim_free(p); } - goto shortcut_end; } - // create a link manager object and request its interface - hr = CoCreateInstance( - &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, - &IID_IShellLink, (void**)&psl); - if (hr != S_OK) - goto shortcut_end; - - // Get a pointer to the IPersistFile interface. - hr = psl->lpVtbl->QueryInterface( - psl, &IID_IPersistFile, (void**)&ppf); - if (hr != S_OK) - goto shortcut_end; - - // full path string must be in Unicode. - MultiByteToWideChar(CP_ACP, 0, (LPCSTR)fname, -1, wsz, MAX_PATH); - - // "load" the name and resolve the link - hr = ppf->lpVtbl->Load(ppf, wsz, STGM_READ); - if (hr != S_OK) - goto shortcut_end; -# if 0 // This makes Vim wait a long time if the target doesn't exist. - hr = psl->lpVtbl->Resolve(psl, NULL, SLR_NO_UI); - if (hr != S_OK) - goto shortcut_end; -# endif - - // Get the path to the link target. - ZeroMemory(buf, MAX_PATH); - hr = psl->lpVtbl->GetPath(psl, buf, MAX_PATH, &ffd, 0); - if (hr == S_OK && buf[0] != NUL) - rfname = vim_strsave((char_u *)buf); -shortcut_end: // Release all interface pointers (both belong to the same object) if (ppf != NULL) ppf->lpVtbl->Release(ppf); |