annotate src/os_mswin.c @ 32936:c517845bd10e v9.0.1776

patch 9.0.1776: No support for stable Python 3 ABI Commit: https://github.com/vim/vim/commit/c13b3d1350b60b94fe87f0761ea31c0e7fb6ebf3 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Sun Aug 20 21:18:38 2023 +0200 patch 9.0.1776: No support for stable Python 3 ABI Problem: No support for stable Python 3 ABI Solution: Support Python 3 stable ABI Commits: 1) Support Python 3 stable ABI to allow mixed version interoperatbility Vim currently supports embedding Python for use with plugins, and the "dynamic" linking option allows the user to specify a locally installed version of Python by setting `pythonthreedll`. However, one caveat is that the Python 3 libs are not binary compatible across minor versions, and mixing versions can potentially be dangerous (e.g. let's say Vim was linked against the Python 3.10 SDK, but the user sets `pythonthreedll` to a 3.11 lib). Usually, nothing bad happens, but in theory this could lead to crashes, memory corruption, and other unpredictable behaviors. It's also difficult for the user to tell something is wrong because Vim has no way of reporting what Python 3 version Vim was linked with. For Vim installed via a package manager, this usually isn't an issue because all the dependencies would already be figured out. For prebuilt Vim binaries like MacVim (my motivation for working on this), AppImage, and Win32 installer this could potentially be an issue as usually a single binary is distributed. This is more tricky when a new Python version is released, as there's a chicken-and-egg issue with deciding what Python version to build against and hard to keep in sync when a new Python version just drops and we have a mix of users of different Python versions, and a user just blindly upgrading to a new Python could lead to bad interactions with Vim. Python 3 does have a solution for this problem: stable ABI / limited API (see https://docs.python.org/3/c-api/stable.html). The C SDK limits the API to a set of functions that are promised to be stable across versions. This pull request adds an ifdef config that allows us to turn it on when building Vim. Vim binaries built with this option should be safe to freely link with any Python 3 libraies without having the constraint of having to use the same minor version. Note: Python 2 has no such concept and this doesn't change how Python 2 integration works (not that there is going to be a new version of Python 2 that would cause compatibility issues in the future anyway). --- Technical details: ====== The stable ABI can be accessed when we compile with the Python 3 limited API (by defining `Py_LIMITED_API`). The Python 3 code (in `if_python3.c` and `if_py_both.h`) would now handle this and switch to limited API mode. Without it set, Vim will still use the full API as before so this is an opt-in change. The main difference is that `PyType_Object` is now an opaque struct that we can't directly create "static types" out of, and we have to create type objects as "heap types" instead. This is because the struct is not stable and changes from version to version (e.g. 3.8 added a `tp_vectorcall` field to it). I had to change all the types to be allocated on the heap instead with just a pointer to them. Other functions are also simply missing in limited API, or they are introduced too late (e.g. `PyUnicode_AsUTF8AndSize` in 3.10) to it that we need some other ways to do the same thing, so I had to abstract a few things into macros, and sometimes re-implement functions like `PyObject_NEW`. One caveat is that in limited API, `OutputType` (used for replacing `sys.stdout`) no longer inherits from `PyStdPrinter_Type` which I don't think has any real issue other than minor differences in how they convert to a string and missing a couple functions like `mode()` and `fileno()`. Also fixed an existing bug where `tp_basicsize` was set incorrectly for `BufferObject`, `TabListObject, `WinListObject`. Technically, there could be a small performance drop, there is a little more indirection with accessing type objects, and some APIs like `PyUnicode_AsUTF8AndSize` are missing, but in practice I didn't see any difference, and any well-written Python plugin should try to avoid excessing callbacks to the `vim` module in Python anyway. I only tested limited API mode down to Python 3.7, which seemes to compile and work fine. I haven't tried earlier Python versions. 2) Fix PyIter_Check on older Python vers / type##Ptr unused warning For PyIter_Check, older versions exposed them as either macros (used in full API), or a function (for use in limited API). A previous change exposed PyIter_Check to the dynamic build because Python just moved it to function-only in 3.10 anyway. Because of that, just make sure we always grab the function in dynamic builds in earlier versions since that's what Python eventually did anyway. 3) Move Py_LIMITED_API define to configure script Can now use --with-python-stable-abi flag to customize what stable ABI version to target. Can also use an env var to do so as well. 4) Show +python/dyn-stable in :version, and allow has() feature query Not sure if the "/dyn-stable" suffix would break things, or whether we should do it another way. Or just don't show it in version and rely on has() feature checking. 5) Documentation first draft. Still need to implement v:python3_version 6) Fix PyIter_Check build breaks when compiling against Python 3.8 7) Add CI coverage stable ABI on Linux/Windows / make configurable on Windows This adds configurable options for Windows make files (both MinGW and MSVC). CI will also now exercise both traditional full API and stable ABI for Linux and Windows in the matrix for coverage. Also added a "dynamic" option to Linux matrix as a drive-by change to make other scripting languages like Ruby / Perl testable under both static and dynamic builds. 8) Fix inaccuracy in Windows docs Python's own docs are confusing but you don't actually want to use `python3.dll` for the dynamic linkage. 9) Add generated autoconf file 10) Add v:python3_version support This variable indicates the version of Python3 that Vim was built against (PY_VERSION_HEX), and will be useful to check whether the Python library you are loading in dynamically actually fits it. When built with stable ABI, it will be the limited ABI version instead (`Py_LIMITED_API`), which indicates the minimum version of Python 3 the user should have, rather than the exact match. When stable ABI is used, we won't be exposing PY_VERSION_HEX in this var because it just doesn't seem necessary to do so (the whole point of stable ABI is the promise that it will work across versions), and I don't want to confuse the user with too many variables. Also, cleaned up some documentation, and added help tags. 11) Fix Python 3.7 compat issues Fix a couple issues when using limited API < 3.8 - Crash on exit: In Python 3.7, if a heap-allocated type is destroyed before all instances are, it would cause a crash later. This happens when we destroyed `OptionsType` before calling `Py_Finalize` when using the limited API. To make it worse, later versions changed the semantics and now each instance has a strong reference to its own type and the recommendation has changed to have each instance de-ref its own type and have its type in GC traversal. To avoid dealing with these cross-version variations, we just don't free the heap type. They are static types in non-limited-API anyway and are designed to last through the entirety of the app, and we also don't restart the Python runtime and therefore do not need it to have absolutely 0 leaks. See: - https://docs.python.org/3/whatsnew/3.8.html#changes-in-the-c-api - https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-c-api - PyIter_Check: This function is not provided in limited APIs older than 3.8. Previously I was trying to mock it out using manual PyType_GetSlot() but it was brittle and also does not actually work properly for static types (it will generate a Python error). Just return false. It does mean using limited API < 3.8 is not recommended as you lose the functionality to handle iterators, but from playing with plugins I couldn't find it to be an issue. - Fix loading of PyIter_Check so it will be done when limited API < 3.8. Otherwise loading a 3.7 Python lib will fail even if limited API was specified to use it. 12) Make sure to only load `PyUnicode_AsUTF8AndSize` in needed in limited API We don't use this function unless limited API >= 3.10, but we were loading it regardless. Usually it's ok in Unix-like systems where Python just has a single lib that we load from, but in Windows where there is a separate python3.dll this would not work as the symbol would not have been exposed in this more limited DLL file. This makes it much clearer under what condition is this function needed. closes: #12032 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Sun, 20 Aug 2023 21:30:04 +0200
parents 397ff3169248
children f8dd278ab05f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * os_mswin.c
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 *
8140
563c923b1584 commit https://github.com/vim/vim/commit/cf7164a088664961e7d70dd100c5874dc5ceb293
Christian Brabandt <cb@256bit.org>
parents: 8090
diff changeset
13 * Routines for Win32.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 #include <sys/types.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 #include <signal.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 #include <limits.h>
3927
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
21 #ifndef PROTO
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
22 # include <process.h>
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
23 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 #undef chdir
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 #ifdef __GNUC__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 # ifndef __MINGW32__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 # include <dirent.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 # include <direct.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33
3927
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
34 #ifndef PROTO
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
35 # if !defined(FEAT_GUI_MSWIN)
3927
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
36 # include <shellapi.h>
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
37 # endif
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
38
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
39 # if defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
40 # include <dlgs.h>
10264
c036c0f636d5 commit https://github.com/vim/vim/commit/cea912af725c54f4727a0565e31661f6b29c6bb1
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
41 # include <winspool.h>
3927
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
42 # include <commdlg.h>
10440
f54e4c691de4 commit https://github.com/vim/vim/commit/b04a98f6c3cca14bf055934b0a793f4dc376858b
Christian Brabandt <cb@256bit.org>
parents: 10355
diff changeset
43 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
45 #endif // PROTO
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 #ifdef __MINGW32__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 # ifndef FROM_LEFT_1ST_BUTTON_PRESSED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 # define FROM_LEFT_1ST_BUTTON_PRESSED 0x0001
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 # ifndef RIGHTMOST_BUTTON_PRESSED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 # define RIGHTMOST_BUTTON_PRESSED 0x0002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 # ifndef FROM_LEFT_2ND_BUTTON_PRESSED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 # define FROM_LEFT_2ND_BUTTON_PRESSED 0x0004
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 # ifndef FROM_LEFT_3RD_BUTTON_PRESSED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 # define FROM_LEFT_3RD_BUTTON_PRESSED 0x0008
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 # ifndef FROM_LEFT_4TH_BUTTON_PRESSED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 # define FROM_LEFT_4TH_BUTTON_PRESSED 0x0010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 * EventFlags
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 # ifndef MOUSE_MOVED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 # define MOUSE_MOVED 0x0001
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 # ifndef DOUBLE_CLICK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 # define DOUBLE_CLICK 0x0002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 * When generating prototypes for Win32 on Unix, these lines make the syntax
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 * errors disappear. They do not need to be correct.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 #ifdef PROTO
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
80 # define WINAPI
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
81 # define WINBASEAPI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 typedef int BOOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 typedef int CALLBACK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 typedef int COLORREF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 typedef int CONSOLE_CURSOR_INFO;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 typedef int COORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 typedef int DWORD;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
88 typedef int ENUMLOGFONTW;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 typedef int HANDLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 typedef int HDC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 typedef int HFONT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 typedef int HICON;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 typedef int HWND;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 typedef int INPUT_RECORD;
29310
f103da6ba95f patch 8.2.5171: dependencies and proto files are outdated
Bram Moolenaar <Bram@vim.org>
parents: 29198
diff changeset
95 typedef int INT_PTR;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 typedef int KEY_EVENT_RECORD;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
97 typedef int LOGFONTW;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 typedef int LPARAM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 typedef int LPBOOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 typedef int LPCSTR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 typedef int LPCWSTR;
16354
b3bc3ba07bef patch 8.1.1182: some function prototypes are outdated
Bram Moolenaar <Bram@vim.org>
parents: 16196
diff changeset
102 typedef int LPDWORD;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 typedef int LPSTR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 typedef int LPTSTR;
16354
b3bc3ba07bef patch 8.1.1182: some function prototypes are outdated
Bram Moolenaar <Bram@vim.org>
parents: 16196
diff changeset
105 typedef int LPVOID;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 typedef int LPWSTR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 typedef int LRESULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 typedef int MOUSE_EVENT_RECORD;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
109 typedef int NEWTEXTMETRICW;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 typedef int PACL;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
111 typedef int PRINTDLGW;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 typedef int PSECURITY_DESCRIPTOR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 typedef int PSID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 typedef int SECURITY_INFORMATION;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 typedef int SHORT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 typedef int SMALL_RECT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 typedef int TEXTMETRIC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 typedef int UINT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 typedef int WCHAR;
15195
16b2f2db6f28 patch 8.1.0607: proto files are not in sync with the source code
Bram Moolenaar <Bram@vim.org>
parents: 14907
diff changeset
120 typedef int WNDENUMPROC;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 typedef int WORD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 typedef int WPARAM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 typedef void VOID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
126 // Record all output and all keyboard & mouse input
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
127 // #define MCH_WRITE_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 #ifdef MCH_WRITE_DUMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 FILE* fdDump = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
133 #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 extern char g_szOrigTitle[];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 extern HWND s_hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 #else
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
140 static HWND s_hwnd = 0; // console window handle, set by GetConsoleHwnd()
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8140
diff changeset
143 #ifdef FEAT_JOB_CHANNEL
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
144 int WSInitialized = FALSE; // WinSock is initialized
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
145 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
147 // Don't generate prototypes here, because some systems do have these
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
148 // functions.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 #if defined(__GNUC__) && !defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 # ifndef __MINGW32__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 int _stricoll(char *a, char *b)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 // the ANSI-ish correct way is to use strxfrm():
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 char a_buff[512], b_buff[512]; // file names, so this is enough on Win32
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 strxfrm(a_buff, a, 512);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 strxfrm(b_buff, b, 512);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 return strcoll(a_buff, b_buff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 char * _fullpath(char *buf, char *fname, int len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 LPTSTR toss;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 return (char *)GetFullPathName(fname, len, buf, &toss);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167
4238
26e59a39fdd9 updated for version 7.3.870
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
168 # if !defined(__MINGW32__) || (__GNUC__ < 4)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 int _chdrive(int drive)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 char temp [3] = "-:";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 temp[0] = drive + 'A' - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 return !SetCurrentDirectory(temp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 }
4238
26e59a39fdd9 updated for version 7.3.870
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
175 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
179 #ifndef PROTO
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
180 /*
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
181 * Save the instance handle of the exe/dll.
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
182 */
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
183 void
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
184 SaveInst(HINSTANCE hInst)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
185 {
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
186 g_hinst = hInst;
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
187 }
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
188 #endif
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
189
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 #if defined(FEAT_GUI_MSWIN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 * GUI version of mch_exit().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 * Shut down and exit with status `r'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 * Careful: mch_exit() may be called before mch_init()!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 void
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
197 mch_exit_g(int r)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 {
10835
c9da7f9137af patch 8.0.0307: asan detects a memory error when EXITFREE is defined
Christian Brabandt <cb@256bit.org>
parents: 10783
diff changeset
199 exiting = TRUE;
c9da7f9137af patch 8.0.0307: asan detects a memory error when EXITFREE is defined
Christian Brabandt <cb@256bit.org>
parents: 10783
diff changeset
200
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 display_errors();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
203 ml_close_all(TRUE); // remove all memfiles
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 # ifdef FEAT_OLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 UninitOLE();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 # endif
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8140
diff changeset
208 # ifdef FEAT_JOB_CHANNEL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 if (WSInitialized)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 WSInitialized = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 WSACleanup();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 # endif
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
215 # ifdef DYNAMIC_GETTEXT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 dyn_libintl_end();
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
217 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 gui_exit(r);
1071
cc03a79fdbb9 updated for version 7.0-197
vimboss
parents: 844
diff changeset
221
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
222 # ifdef EXITFREE
1071
cc03a79fdbb9 updated for version 7.0-197
vimboss
parents: 844
diff changeset
223 free_all_mem();
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
224 # endif
1071
cc03a79fdbb9 updated for version 7.0-197
vimboss
parents: 844
diff changeset
225
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 exit(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
229 #endif // FEAT_GUI_MSWIN
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 * Init the tables for toupper() and tolower().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 mch_early_init(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 PlatformId();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
242 // Init the tables for toupper() and tolower()
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 for (i = 0; i < 256; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 toupper_tab[i] = tolower_tab[i] = i;
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
245 CharUpperBuff((LPSTR)toupper_tab, 256);
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
246 CharLowerBuff((LPSTR)tolower_tab, 256);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 * Return TRUE if the input comes from a terminal, FALSE otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
254 mch_input_isatty(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 #ifdef FEAT_GUI_MSWIN
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
257 # ifdef VIMDLL
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
258 if (gui.in_use)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
259 # endif
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
260 return TRUE; // GUI always has a tty
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
261 #endif
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
262 #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 if (isatty(read_cmd_fd))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 * mch_settitle(): set titlebar of our window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 mch_settitle(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 char_u *title,
18139
59bc3cd42cf5 patch 8.1.2064: MS-Windows: compiler warnings for unused arguments
Bram Moolenaar <Bram@vim.org>
parents: 17574
diff changeset
275 char_u *icon UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 {
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
277 #ifdef FEAT_GUI_MSWIN
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
278 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
279 if (gui.in_use)
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
280 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
281 {
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
282 gui_mch_settitle(title, icon);
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
283 return;
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
284 }
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
285 #endif
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
286 #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 if (title != NULL)
26
404aac550f35 updated for version 7.0017
vimboss
parents: 23
diff changeset
288 {
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
289 WCHAR *wp = enc_to_utf16(title, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
290
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
291 if (wp == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
292 return;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
293
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
294 SetConsoleTitleW(wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
295 vim_free(wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
296 return;
26
404aac550f35 updated for version 7.0017
vimboss
parents: 23
diff changeset
297 }
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
298 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 * Restore the window/icon title.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 * which is one of:
14479
3375a8cbb442 patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents: 13929
diff changeset
305 * SAVE_RESTORE_TITLE: Just restore title
3375a8cbb442 patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents: 13929
diff changeset
306 * SAVE_RESTORE_ICON: Just restore icon (which we don't have)
3375a8cbb442 patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents: 13929
diff changeset
307 * SAVE_RESTORE_BOTH: Restore title and icon (which we don't have)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 void
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
310 mch_restore_title(int which UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 {
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
312 #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
313 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
314 if (!gui.in_use)
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
315 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
316 SetConsoleTitle(g_szOrigTitle);
26336
a2e6da79274d patch 8.2.3699: the +title feature adds a lot of #ifdef but little code
Bram Moolenaar <Bram@vim.org>
parents: 23167
diff changeset
317 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 * Return TRUE if we can restore the title (we can)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
325 mch_can_restore_title(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 * Return TRUE if we can restore the icon title (we can't)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
335 mch_can_restore_icon(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 /*
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
342 * Get absolute file name into buffer "buf" of length "len" bytes,
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
343 * turning all '/'s into '\\'s and getting the correct case of each component
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
344 * of the file name. Append a (back)slash to a directory name.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 * When 'shellslash' set do it the other way around.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 * Return OK or FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 mch_FullName(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 char_u *fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 char_u *buf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 int len,
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
353 int force UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 int nResult = FAIL;
16606
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
356 WCHAR *wname;
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
357 WCHAR wbuf[MAX_PATH];
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
358 char_u *cname = NULL;
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
359
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
360 wname = enc_to_utf16(fname, NULL);
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
361 if (wname != NULL && _wfullpath(wbuf, wname, MAX_PATH) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 {
16606
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
363 cname = utf16_to_enc((short_u *)wbuf, NULL);
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
364 if (cname != NULL)
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
365 {
16606
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
366 vim_strncpy(buf, cname, len - 1);
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
367 nResult = OK;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
368 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 }
16606
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
370 vim_free(wname);
7e733046db1d patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents: 16451
diff changeset
371 vim_free(cname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 #ifdef USE_FNAME_CASE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 fname_case(buf, len);
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
375 #else
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
376 slash_adjust(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 return nResult;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 * Return TRUE if "fname" does not depend on the current directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 mch_isFullName(char_u *fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 {
23167
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
389 // A name like "d:/foo" and "//server/share" is absolute. "d:foo" is not.
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
390 // Another way to check is to use mch_FullName() and see if the result is
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
391 // the same as the name or mch_FullName() fails. However, this has quite a
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
392 // bit of overhead, so let's not do that.
26589
22896e358a90 patch 8.2.3824: no ASAN support for MSVC
Bram Moolenaar <Bram@vim.org>
parents: 26336
diff changeset
393 if (*fname == NUL)
26821
81f0d5a958b9 patch 8.2.3939: MS-Windows: fnamemodify('', ':p') does not work
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
394 return FALSE;
23167
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
395 return ((ASCII_ISALPHA(fname[0]) && fname[1] == ':'
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
396 && (fname[2] == '/' || fname[2] == '\\'))
2b2561f8602e patch 8.2.2129: MS-Windows: Checking if a file name is absolute is slow
Bram Moolenaar <Bram@vim.org>
parents: 20439
diff changeset
397 || (fname[0] == fname[1] && (fname[0] == '/' || fname[0] == '\\')));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 * Replace all slashes by backslashes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 * This used to be the other way around, but MS-DOS sometimes has problems
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 * with slashes (e.g. in a command name). We can't have mixed slashes and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 * backslashes, because comparing file names will not work correctly. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 * commands that use a file name should try to avoid the need to type a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 * backslash twice.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 * When 'shellslash' set do it the other way around.
7170
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 6347
diff changeset
408 * When the path looks like a URL leave it unmodified.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
411 slash_adjust(char_u *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 {
7170
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 6347
diff changeset
413 if (path_with_url(p))
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 6347
diff changeset
414 return;
11991
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
415
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
416 if (*p == '`')
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
417 {
12015
7e704d75a882 patch 8.0.0888: compiler warnings with 64 bit build
Christian Brabandt <cb@256bit.org>
parents: 11991
diff changeset
418 size_t len = STRLEN(p);
7e704d75a882 patch 8.0.0888: compiler warnings with 64 bit build
Christian Brabandt <cb@256bit.org>
parents: 11991
diff changeset
419
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
420 // don't replace backslash in backtick quoted strings
11991
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
421 if (len > 2 && *(p + len - 1) == '`')
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
422 return;
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
423 }
15ec6d5adf43 patch 8.0.0876: backslashes and wildcards in backticks don't work
Christian Brabandt <cb@256bit.org>
parents: 11949
diff changeset
424
434
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 427
diff changeset
425 while (*p)
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 427
diff changeset
426 {
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 427
diff changeset
427 if (*p == psepcN)
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 427
diff changeset
428 *p = psepc;
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10835
diff changeset
429 MB_PTR_ADV(p);
434
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 427
diff changeset
430 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432
27342
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
433 // Use 64-bit stat functions.
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
434 #undef stat
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
435 #undef _stat
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
436 #undef _wstat
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
437 #undef _fstat
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
438 #define stat _stat64
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
439 #define _stat _stat64
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
440 #define _wstat _wstat64
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
441 #define _fstat _fstat64
5386
c0e3990aed3f updated for version 7.4.044
Bram Moolenaar <bram@vim.org>
parents: 5376
diff changeset
442
5376
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
443 static int
28702
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
444 read_reparse_point(const WCHAR *name, char_u *buf, DWORD *buf_len)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
445 {
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
446 HANDLE h;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
447 BOOL ok;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
448
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
449 h = CreateFileW(name, FILE_READ_ATTRIBUTES,
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
450 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
451 OPEN_EXISTING,
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
452 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
453 NULL);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
454 if (h == INVALID_HANDLE_VALUE)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
455 return FAIL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
456
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
457 ok = DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, buf, *buf_len,
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
458 buf_len, NULL);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
459 CloseHandle(h);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
460
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
461 return ok ? OK : FAIL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
462 }
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
463
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
464 static int
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9091
diff changeset
465 wstat_symlink_aware(const WCHAR *name, stat_T *stp)
5376
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
466 {
15603
639b8318472c patch 8.1.0809: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
467 #if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__)
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
468 // Work around for VC12 or earlier (and MinGW). _wstat() can't handle
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
469 // symlinks properly.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
470 // VC9 or earlier: _wstat() doesn't support a symlink at all. It retrieves
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
471 // status of a symlink itself.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
472 // VC10: _wstat() supports a symlink to a normal file, but it doesn't
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
473 // support a symlink to a directory (always returns an error).
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
474 // VC11 and VC12: _wstat() doesn't return an error for a symlink to a
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
475 // directory, but it doesn't set S_IFDIR flag.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
476 // MinGW: Same as VC9.
5376
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
477 int n;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
478 BOOL is_symlink = FALSE;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
479 HANDLE hFind, h;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
480 DWORD attr = 0;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
481 WIN32_FIND_DATAW findDataW;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
482
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
483 hFind = FindFirstFileW(name, &findDataW);
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
484 if (hFind != INVALID_HANDLE_VALUE)
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
485 {
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
486 attr = findDataW.dwFileAttributes;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
487 if ((attr & FILE_ATTRIBUTE_REPARSE_POINT)
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
488 && (findDataW.dwReserved0 == IO_REPARSE_TAG_SYMLINK))
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
489 is_symlink = TRUE;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
490 FindClose(hFind);
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
491 }
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
492 if (is_symlink)
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
493 {
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
494 h = CreateFileW(name, FILE_READ_ATTRIBUTES,
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
495 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
496 OPEN_EXISTING,
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
497 (attr & FILE_ATTRIBUTE_DIRECTORY)
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
498 ? FILE_FLAG_BACKUP_SEMANTICS : 0,
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
499 NULL);
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
500 if (h != INVALID_HANDLE_VALUE)
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
501 {
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
502 int fd;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
503
27342
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
504 fd = _open_osfhandle((intptr_t)h, _O_RDONLY);
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9091
diff changeset
505 n = _fstat(fd, (struct _stat *)stp);
7681
07cfa8fea697 commit https://github.com/vim/vim/commit/fce7b3d24fd18b1486e474e933a95f9090df9973
Christian Brabandt <cb@256bit.org>
parents: 7170
diff changeset
506 if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY))
07cfa8fea697 commit https://github.com/vim/vim/commit/fce7b3d24fd18b1486e474e933a95f9090df9973
Christian Brabandt <cb@256bit.org>
parents: 7170
diff changeset
507 stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR;
5376
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
508 _close(fd);
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
509 return n;
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
510 }
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
511 }
15603
639b8318472c patch 8.1.0809: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
512 #endif
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9091
diff changeset
513 return _wstat(name, (struct _stat *)stp);
5376
4dfba3df303c updated for version 7.4.039
Bram Moolenaar <bram@vim.org>
parents: 5320
diff changeset
514 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515
28702
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
516 char_u *
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
517 resolve_appexeclink(char_u *fname)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
518 {
28844
c0403cd5ca06 patch 8.2.4945: inconsistent use of white space
Bram Moolenaar <Bram@vim.org>
parents: 28702
diff changeset
519 DWORD attr = 0;
c0403cd5ca06 patch 8.2.4945: inconsistent use of white space
Bram Moolenaar <Bram@vim.org>
parents: 28702
diff changeset
520 int idx;
c0403cd5ca06 patch 8.2.4945: inconsistent use of white space
Bram Moolenaar <Bram@vim.org>
parents: 28702
diff changeset
521 WCHAR *p, *end, *wname;
28702
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
522 // The buffer size is arbitrarily chosen to be "big enough" (TM), the
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
523 // ceiling should be around 16k.
28844
c0403cd5ca06 patch 8.2.4945: inconsistent use of white space
Bram Moolenaar <Bram@vim.org>
parents: 28702
diff changeset
524 char_u buf[4096];
c0403cd5ca06 patch 8.2.4945: inconsistent use of white space
Bram Moolenaar <Bram@vim.org>
parents: 28702
diff changeset
525 DWORD buf_len = sizeof(buf);
28702
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
526 REPARSE_DATA_BUFFER *rb = (REPARSE_DATA_BUFFER *)buf;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
527
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
528 wname = enc_to_utf16(fname, NULL);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
529 if (wname == NULL)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
530 return NULL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
531
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
532 attr = GetFileAttributesW(wname);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
533 if (attr == INVALID_FILE_ATTRIBUTES ||
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
534 (attr & FILE_ATTRIBUTE_REPARSE_POINT) == 0)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
535 {
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
536 vim_free(wname);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
537 return NULL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
538 }
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
539
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
540 // The applinks are similar to symlinks but with a huge difference: they can
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
541 // only be executed, any other I/O operation on them is bound to fail with
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
542 // ERROR_FILE_NOT_FOUND even though the file exists.
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
543 if (read_reparse_point(wname, buf, &buf_len) == FAIL)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
544 {
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
545 vim_free(wname);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
546 return NULL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
547 }
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
548 vim_free(wname);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
549
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
550 if (rb->ReparseTag != IO_REPARSE_TAG_APPEXECLINK)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
551 return NULL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
552
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
553 // The (undocumented) reparse buffer contains a set of N null-terminated
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
554 // Unicode strings, the application path is stored in the third one.
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
555 if (rb->AppExecLinkReparseBuffer.StringCount < 3)
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
556 return NULL;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
557
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
558 p = rb->AppExecLinkReparseBuffer.StringList;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
559 end = p + rb->ReparseDataLength / sizeof(WCHAR);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
560 for (idx = 0; p < end
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
561 && idx < (int)rb->AppExecLinkReparseBuffer.StringCount
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
562 && idx != 2; )
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
563 {
29096
d2ef7d649fcb patch 8.2.5069: various warnings from clang on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents: 28844
diff changeset
564 if (*p++ == L'\0')
28702
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
565 ++idx;
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
566 }
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
567
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
568 return utf16_to_enc(p, NULL);
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
569 }
99729fe344f7 patch 8.2.4875: MS-Windows: some .exe files are not recognized
Bram Moolenaar <Bram@vim.org>
parents: 27342
diff changeset
570
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 * stat() can't handle a trailing '/' or '\', remove it first.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 int
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9091
diff changeset
575 vim_stat(const char *name, stat_T *stp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
577 // WinNT and later can use _MAX_PATH wide characters for a pathname, which
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
578 // means that the maximum pathname is _MAX_PATH * 3 bytes when 'enc' is
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
579 // UTF-8.
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
580 char_u buf[_MAX_PATH * 3 + 1];
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
581 char_u *p;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
582 WCHAR *wp;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
583 int n;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584
5320
07737d3aa817 updated for version 7.4.013
Bram Moolenaar <bram@vim.org>
parents: 5318
diff changeset
585 vim_strncpy((char_u *)buf, (char_u *)name, sizeof(buf) - 1);
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
586 p = buf + STRLEN(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 if (p > buf)
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10835
diff changeset
588 MB_PTR_BACK(buf, p);
5578
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
589
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
590 // Remove trailing '\\' except root path.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 if (p > buf && (*p == '\\' || *p == '/') && p[-1] != ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 *p = NUL;
5578
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
593
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
594 if ((buf[0] == '\\' && buf[1] == '\\') || (buf[0] == '/' && buf[1] == '/'))
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
595 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
596 // UNC root path must be followed by '\\'.
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
597 p = vim_strpbrk(buf + 2, (char_u *)"\\/");
5578
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
598 if (p != NULL)
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
599 {
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
600 p = vim_strpbrk(p + 1, (char_u *)"\\/");
5578
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
601 if (p == NULL)
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
602 STRCAT(buf, "\\");
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
603 }
3881cd916014 updated for version 7.4.136
Bram Moolenaar <bram@vim.org>
parents: 5386
diff changeset
604 }
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
605
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
606 wp = enc_to_utf16(buf, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
607 if (wp == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
608 return -1;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
609
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
610 n = wstat_symlink_aware(wp, stp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
611 vim_free(wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
612 return n;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
615 #if (defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 void
20439
d4b2a8675b78 patch 8.2.0774: t_TI and t_TE are output when using 'visualbell'
Bram Moolenaar <Bram@vim.org>
parents: 20007
diff changeset
617 mch_settmode(tmode_T tmode UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
619 // nothing to do
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 mch_get_shellsize(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
625 // never used
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 mch_set_shellsize(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
632 // never used
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 * Rows and/or Columns has changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 mch_new_shellsize(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
641 // never used
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 * We have no job control, so fake it by starting a new shell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
650 mch_suspend(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 suspend_shell();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 #if defined(USE_MCH_ERRMSG) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
657 # ifdef display_errors
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
658 # undef display_errors
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
659 # endif
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
660
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 * Display the saved error message(s).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
665 display_errors(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 {
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
667 # ifdef FEAT_GUI
29130
247a6d944401 patch 8.2.5085: gcc gives warning for signed/unsigned difference
Bram Moolenaar <Bram@vim.org>
parents: 29128
diff changeset
668 char_u *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
670 # ifdef VIMDLL
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
671 if (gui.in_use || gui.starting)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
672 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 {
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
674 if (error_ga.ga_data != NULL)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
675 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
676 // avoid putting up a message box with blanks only
29130
247a6d944401 patch 8.2.5085: gcc gives warning for signed/unsigned difference
Bram Moolenaar <Bram@vim.org>
parents: 29128
diff changeset
677 for (p = (char_u *)error_ga.ga_data; *p; ++p)
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
678 if (!isspace(*p))
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
679 {
29128
d8a962d7b008 patch 8.2.5084: when the GUI shows a dialog tests get stuck
Bram Moolenaar <Bram@vim.org>
parents: 29096
diff changeset
680 // Only use a dialog when not using --gui-dialog-file:
d8a962d7b008 patch 8.2.5084: when the GUI shows a dialog tests get stuck
Bram Moolenaar <Bram@vim.org>
parents: 29096
diff changeset
681 // write text to a file.
d8a962d7b008 patch 8.2.5084: when the GUI shows a dialog tests get stuck
Bram Moolenaar <Bram@vim.org>
parents: 29096
diff changeset
682 if (!gui_dialog_log((char_u *)"Errors", p))
d8a962d7b008 patch 8.2.5084: when the GUI shows a dialog tests get stuck
Bram Moolenaar <Bram@vim.org>
parents: 29096
diff changeset
683 (void)gui_mch_dialog(
802
c6245a087950 updated for version 7.0b01
vimboss
parents: 714
diff changeset
684 gui.starting ? VIM_INFO :
c6245a087950 updated for version 7.0b01
vimboss
parents: 714
diff changeset
685 VIM_ERROR,
c6245a087950 updated for version 7.0b01
vimboss
parents: 714
diff changeset
686 gui.starting ? (char_u *)_("Message") :
c6245a087950 updated for version 7.0b01
vimboss
parents: 714
diff changeset
687 (char_u *)_("Error"),
29130
247a6d944401 patch 8.2.5085: gcc gives warning for signed/unsigned difference
Bram Moolenaar <Bram@vim.org>
parents: 29128
diff changeset
688 p, (char_u *)_("&Ok"),
8090
54cfe888c627 commit https://github.com/vim/vim/commit/418f81b5fa400ed59793384f2f3d9df45390f080
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
689 1, NULL, FALSE);
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
690 break;
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
691 }
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
692 ga_clear(&error_ga);
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
693 }
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
694 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 }
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
696 # endif
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
697 # if !defined(FEAT_GUI) || defined(VIMDLL)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
698 FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE));
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
699 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 * Return TRUE if "p" contain a wildcard that can be expanded by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 * dos_expandpath().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 mch_has_exp_wildcard(char_u *p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 {
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10835
diff changeset
711 for ( ; *p; MB_PTR_ADV(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 if (vim_strchr((char_u *)"?*[", *p) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 || (*p == '~' && p[1] != NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 * Return TRUE if "p" contain a wildcard or a "~1" kind of thing (could be a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 * shortened file name).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 mch_has_wildcard(char_u *p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 {
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10835
diff changeset
727 for ( ; *p; MB_PTR_ADV(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 if (vim_strchr((char_u *)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
730 #ifdef VIM_BACKTICK
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 "?*$[`"
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
732 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 "?*$["
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
734 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 , *p) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 || (*p == '~' && p[1] != NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 * The normal _chdir() does not change the default drive. This one does.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 * Returning 0 implies success; -1 implies failure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 mch_chdir(char *path)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 {
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
750 WCHAR *p;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
751 int n;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
752
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
753 if (path[0] == NUL) // just checking...
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755
1936
85a99ba3eb5a updated for version 7.2-233
vimboss
parents: 1875
diff changeset
756 if (p_verbose >= 5)
85a99ba3eb5a updated for version 7.2-233
vimboss
parents: 1875
diff changeset
757 {
85a99ba3eb5a updated for version 7.2-233
vimboss
parents: 1875
diff changeset
758 verbose_enter();
15470
55ccc2d353bd patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents: 15195
diff changeset
759 smsg("chdir(%s)", path);
1936
85a99ba3eb5a updated for version 7.2-233
vimboss
parents: 1875
diff changeset
760 verbose_leave();
85a99ba3eb5a updated for version 7.2-233
vimboss
parents: 1875
diff changeset
761 }
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
762 if (isalpha(path[0]) && path[1] == ':') // has a drive name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
764 // If we can change to the drive, skip that part of the path. If we
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
765 // can't then the current directory may be invalid, try using chdir()
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
766 // with the whole path.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 if (_chdrive(TOLOWER_ASC(path[0]) - 'a' + 1) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 path += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
771 if (*path == NUL) // drive name only
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
774 p = enc_to_utf16((char_u *)path, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
775 if (p == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
776 return -1;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
777
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
778 n = _wchdir(p);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
779 vim_free(p);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
780 return n;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
784 #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 * return non-zero if a character is available
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
789 mch_char_avail(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
791 // never used
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 }
11949
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
794
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
795 # if defined(FEAT_TERMINAL) || defined(PROTO)
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
796 /*
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
797 * Check for any pending input or messages.
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
798 */
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
799 int
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
800 mch_check_messages(void)
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
801 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
802 // TODO: check for messages
11949
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
803 return TRUE;
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
804 }
74e45c11b754 patch 8.0.0854: no redraw after terminal was closed
Christian Brabandt <cb@256bit.org>
parents: 11215
diff changeset
805 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 #if defined(FEAT_LIBCALL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 * Call a DLL routine which takes either a string or int param
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 * and returns an allocated string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 * Return OK if it worked, FAIL if not.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 typedef LPTSTR (*MYSTRPROCSTR)(LPTSTR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 typedef LPTSTR (*MYINTPROCSTR)(int);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 typedef int (*MYSTRPROCINT)(LPTSTR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 typedef int (*MYINTPROCINT)(int);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 * Check if a pointer points to a valid NUL terminated string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 * Return the length of the string, including terminating NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 * Returns 0 for an invalid pointer, 1 for an empty string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 static size_t
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 check_str_len(char_u *str)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 SYSTEM_INFO si;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 MEMORY_BASIC_INFORMATION mbi;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 size_t length = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 size_t i;
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
832 const char_u *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
834 // get page size
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 GetSystemInfo(&si);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
837 // get memory information
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
838 if (!VirtualQuery(str, &mbi, sizeof(mbi)))
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
839 return 0;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
840
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
841 // pre cast these (typing savers)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
842 long_u dwStr = (long_u)str;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
843 long_u dwBaseAddress = (long_u)mbi.BaseAddress;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
844
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
845 // get start address of page that str is on
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
846 long_u strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
847
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
848 // get length from str to end of page
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
849 long_u pageLength = si.dwPageSize - (dwStr - strPage);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
850
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
851 for (p = str; !IsBadReadPtr(p, (UINT)pageLength);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
852 p += pageLength, pageLength = si.dwPageSize)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
853 for (i = 0; i < pageLength; ++i, ++length)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
854 if (p[i] == NUL)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
855 return length + 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859
6249
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
860 /*
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
861 * Passed to do_in_runtimepath() to load a vim.ico file.
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
862 */
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
863 static void
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
864 mch_icon_load_cb(char_u *fname, void *cookie)
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
865 {
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
866 HANDLE *h = (HANDLE *)cookie;
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
867
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
868 *h = LoadImage(NULL,
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
869 (LPSTR)fname,
6249
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
870 IMAGE_ICON,
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
871 64,
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
872 64,
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
873 LR_LOADFROMFILE | LR_LOADMAP3DCOLORS);
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
874 }
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
875
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
876 /*
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
877 * Try loading an icon file from 'runtimepath'.
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
878 */
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
879 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
880 mch_icon_load(HANDLE *iconp)
6249
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
881 {
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
882 return do_in_runtimepath((char_u *)"bitmaps/vim.ico",
8524
2f57bbe870ea commit https://github.com/vim/vim/commit/7f8989dd8a627af2185df381195351a913f3777f
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
883 0, mch_icon_load_cb, iconp);
6249
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
884 }
7816c24ff890 updated for version 7.4.459
Bram Moolenaar <bram@vim.org>
parents: 6193
diff changeset
885
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 mch_libcall(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 char_u *libname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 char_u *funcname,
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
890 char_u *argstring, // NULL when using a argint
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 int argint,
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
892 char_u **string_result,// NULL when using number_result
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 int *number_result)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 HINSTANCE hinstLib;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 MYSTRPROCSTR ProcAdd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 MYINTPROCSTR ProcAddI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 char_u *retval_str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 int retval_int = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 size_t len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 BOOL fRunTimeLinkSuccess = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 // Get a handle to the DLL module.
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
905 hinstLib = vimLoadLib((char *)libname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 // If the handle is valid, try to get the function address.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 if (hinstLib != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
910 # ifdef HAVE_TRY_EXCEPT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 __try
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
913 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 if (argstring != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
916 // Call with string argument
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
917 ProcAdd = (MYSTRPROCSTR)GetProcAddress(hinstLib, (LPCSTR)funcname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 if ((fRunTimeLinkSuccess = (ProcAdd != NULL)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 if (string_result == NULL)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
921 retval_int = ((MYSTRPROCINT)ProcAdd)((LPSTR)argstring);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 else
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
923 retval_str = (char_u *)(ProcAdd)((LPSTR)argstring);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
928 // Call with number argument
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
929 ProcAddI = (MYINTPROCSTR) GetProcAddress(hinstLib, (LPCSTR)funcname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 if ((fRunTimeLinkSuccess = (ProcAddI != NULL)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 if (string_result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 retval_int = ((MYINTPROCINT)ProcAddI)(argint);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 else
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
935 retval_str = (char_u *)(ProcAddI)(argint);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 // Save the string before we free the library.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 // Assume that a "1" result is an illegal pointer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 if (string_result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 *number_result = retval_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 else if (retval_str != NULL
8140
563c923b1584 commit https://github.com/vim/vim/commit/cf7164a088664961e7d70dd100c5874dc5ceb293
Christian Brabandt <cb@256bit.org>
parents: 8090
diff changeset
944 && (len = check_str_len(retval_str)) > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 {
16768
695d9ef00b03 patch 8.1.1386: unessesary type casts for lalloc()
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
946 *string_result = alloc(len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 if (*string_result != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 mch_memmove(*string_result, retval_str, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
951 # ifdef HAVE_TRY_EXCEPT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 __except(EXCEPTION_EXECUTE_HANDLER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 if (GetExceptionCode() == EXCEPTION_STACK_OVERFLOW)
27342
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
956 _resetstkoflw();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 fRunTimeLinkSuccess = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 }
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
959 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 // Free the DLL module.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 (void)FreeLibrary(hinstLib);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 if (!fRunTimeLinkSuccess)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 {
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26821
diff changeset
967 semsg(_(e_library_call_failed_for_str), funcname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 * Debugging helper: expose the MCH_WRITE_DUMP stuff to other modules
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 void
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
979 DumpPutS(const char *psz UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
981 #ifdef MCH_WRITE_DUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 if (fdDump)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 fputs(psz, fdDump);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 if (psz[strlen(psz) - 1] != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 fputc('\n', fdDump);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 fflush(fdDump);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 }
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
989 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 #ifdef _DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 void __cdecl
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 Trace(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 char *pszFormat,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 ...)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 CHAR szBuff[2048];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 va_list args;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 va_start(args, pszFormat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 vsprintf(szBuff, pszFormat, args);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 va_end(args);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 OutputDebugString(szBuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 #endif //_DEBUG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1011 #if !defined(FEAT_GUI) || defined(VIMDLL) || defined(PROTO)
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1012 extern HWND g_hWnd; // This is in os_win32.c.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 * Showing the printer dialog is tricky since we have no GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 * window to parent it. The following routines are needed to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 * get the window parenting and Z-order to work properly.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 GetConsoleHwnd(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1022 // Skip if it's already set.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 if (s_hwnd != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1026 // Window handle may have been found by init code (Windows NT only)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 if (g_hWnd != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 s_hwnd = g_hWnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032
15798
028c9fdb8469 patch 8.1.0906: using clumsy way to get console window handle
Bram Moolenaar <Bram@vim.org>
parents: 15774
diff changeset
1033 s_hwnd = GetConsoleWindow();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 }
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1035
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1036 /*
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1037 * Console implementation of ":winpos".
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1038 */
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1039 int
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1040 mch_get_winpos(int *x, int *y)
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1041 {
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1042 RECT rect;
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1043
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1044 GetConsoleHwnd();
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1045 GetWindowRect(s_hwnd, &rect);
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1046 *x = rect.left;
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1047 *y = rect.top;
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1048 return OK;
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1049 }
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1050
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1051 /*
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1052 * Console implementation of ":winpos x y".
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1053 */
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1054 void
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1055 mch_set_winpos(int x, int y)
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1056 {
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1057 GetConsoleHwnd();
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1058 SetWindowPos(s_hwnd, NULL, x, y, 0, 0,
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1059 SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
4424b47a0797 updated for version 7.0003
vimboss
parents: 7
diff changeset
1060 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 #if (defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1065 //=================================================================
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1066 // Win32 printer stuff
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 static HFONT prt_font_handles[2][2][2];
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1069 static PRINTDLGW prt_dlg;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 static const int boldface[2] = {FW_REGULAR, FW_BOLD};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 static TEXTMETRIC prt_tm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 static int prt_line_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 static int prt_number_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 static int prt_left_margin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 static int prt_right_margin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 static int prt_top_margin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 static char_u szAppName[] = TEXT("VIM");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 static HWND hDlgPrint;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 static int *bUserAbort = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 static char_u *prt_name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1082 // Defines which are also in vim.rc.
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1083 # define IDC_BOX1 400
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1084 # define IDC_PRINTTEXT1 401
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1085 # define IDC_PRINTTEXT2 402
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1086 # define IDC_PROGRESS 403
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087
4932
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1088 static BOOL
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1089 vimSetDlgItemText(HWND hDlg, int nIDDlgItem, char_u *s)
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1090 {
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1091 WCHAR *wp;
4932
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1092 BOOL ret;
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1093
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1094 wp = enc_to_utf16(s, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1095 if (wp == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1096 return FALSE;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1097
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1098 ret = SetDlgItemTextW(hDlg, nIDDlgItem, wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1099 vim_free(wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1100 return ret;
4932
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1101 }
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1102
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 * Convert BGR to RGB for Windows GDI calls
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 static COLORREF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 swap_me(COLORREF colorref)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 int temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 char *ptr = (char *)&colorref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 temp = *(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 *(ptr ) = *(ptr + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 *(ptr + 2) = temp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 return colorref;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117
27342
41a940219183 patch 8.2.4199: MS-Windows: Support for MSVC 2003 is not useful
Bram Moolenaar <Bram@vim.org>
parents: 27283
diff changeset
1118 static INT_PTR CALLBACK
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1119 PrintDlgProc(
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1120 HWND hDlg,
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1121 UINT message,
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1122 WPARAM wParam UNUSED,
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1123 LPARAM lParam UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1125 # ifdef FEAT_GETTEXT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 NONCLIENTMETRICS nm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 static HFONT hfont;
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1128 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 switch (message)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 case WM_INITDIALOG:
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1133 # ifdef FEAT_GETTEXT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 nm.cbSize = sizeof(NONCLIENTMETRICS);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 if (SystemParametersInfo(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 SPI_GETNONCLIENTMETRICS,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 sizeof(NONCLIENTMETRICS),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 &nm,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 char buff[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1144 // Translate the dialog texts
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 hfont = CreateFontIndirect(&nm.lfMessageFont);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 for (i = IDC_PRINTTEXT1; i <= IDC_PROGRESS; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 SendDlgItemMessage(hDlg, i, WM_SETFONT, (WPARAM)hfont, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 if (GetDlgItemText(hDlg,i, buff, sizeof(buff)))
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1150 vimSetDlgItemText(hDlg,i, (char_u *)_(buff));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 SendDlgItemMessage(hDlg, IDCANCEL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 WM_SETFONT, (WPARAM)hfont, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 if (GetDlgItemText(hDlg,IDCANCEL, buff, sizeof(buff)))
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1155 vimSetDlgItemText(hDlg,IDCANCEL, (char_u *)_(buff));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 }
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1157 # endif
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1158 SetWindowText(hDlg, (LPCSTR)szAppName);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 if (prt_name != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 {
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1161 vimSetDlgItemText(hDlg, IDC_PRINTTEXT2, (char_u *)prt_name);
13244
ac42c4b11dbc patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents: 12054
diff changeset
1162 VIM_CLEAR(prt_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 EnableMenuItem(GetSystemMenu(hDlg, FALSE), SC_CLOSE, MF_GRAYED);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1165 # if !defined(FEAT_GUI) || defined(VIMDLL)
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1166 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1167 if (!gui.in_use)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1168 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1169 BringWindowToTop(s_hwnd);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1170 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 case WM_COMMAND:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 *bUserAbort = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 EnableWindow(GetParent(hDlg), TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 DestroyWindow(hDlg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 hDlgPrint = NULL;
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1178 # ifdef FEAT_GETTEXT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 DeleteObject(hfont);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1180 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 static BOOL CALLBACK
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1187 AbortProc(HDC hdcPrn UNUSED, int iCode UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 MSG msg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190
27283
b4d92a69035b patch 8.2.4170: MS-Windows: still using old message API calls
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
1191 while (!*bUserAbort && PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 {
27283
b4d92a69035b patch 8.2.4170: MS-Windows: still using old message API calls
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
1193 if (!hDlgPrint || !IsDialogMessageW(hDlgPrint, &msg))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 TranslateMessage(&msg);
27283
b4d92a69035b patch 8.2.4170: MS-Windows: still using old message API calls
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
1196 DispatchMessageW(&msg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 return !*bUserAbort;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1202 # if !defined(FEAT_GUI) || defined(VIMDLL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203
3174
e618700297e8 updated for version 7.3.357
Bram Moolenaar <bram@vim.org>
parents: 3102
diff changeset
1204 static UINT_PTR CALLBACK
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 PrintHookProc(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 HWND hDlg, // handle to dialog box
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 UINT uiMsg, // message identifier
18139
59bc3cd42cf5 patch 8.1.2064: MS-Windows: compiler warnings for unused arguments
Bram Moolenaar <Bram@vim.org>
parents: 17574
diff changeset
1208 WPARAM wParam UNUSED, // message parameter
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 LPARAM lParam // message parameter
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 HWND hwndOwner;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 RECT rc, rcDlg, rcOwner;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1214 PRINTDLGW *pPD;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1216 if (uiMsg != WM_INITDIALOG)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1217 return FALSE;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1218
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1219 // Get the owner window and dialog box rectangles.
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1220 if ((hwndOwner = GetParent(hDlg)) == NULL)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1221 hwndOwner = GetDesktopWindow();
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1222
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1223 GetWindowRect(hwndOwner, &rcOwner);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1224 GetWindowRect(hDlg, &rcDlg);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1225 CopyRect(&rc, &rcOwner);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1226
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1227 // Offset the owner and dialog box rectangles so that
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1228 // right and bottom values represent the width and
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1229 // height, and then offset the owner again to discard
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1230 // space taken up by the dialog box.
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1231
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1232 OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1233 OffsetRect(&rc, -rc.left, -rc.top);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1234 OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1235
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1236 // The new position is the sum of half the remaining
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1237 // space and the owner's original position.
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1238
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1239 SetWindowPos(hDlg,
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1240 HWND_TOP,
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1241 rcOwner.left + (rc.right / 2),
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1242 rcOwner.top + (rc.bottom / 2),
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1243 0, 0, // ignores size arguments
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1244 SWP_NOSIZE);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1245
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1246 // tackle the printdlg copiesctrl problem
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1247 pPD = (PRINTDLGW *)lParam;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1248 pPD->nCopies = (WORD)pPD->lCustData;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1249 SetDlgItemInt( hDlg, edt3, pPD->nCopies, FALSE );
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1250 // Bring the window to top
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1251 BringWindowToTop(GetParent(hDlg));
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1252 SetForegroundWindow(hDlg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 }
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1256 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 mch_print_cleanup(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 int pifItalic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 int pifBold;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 int pifUnderline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 for (pifBold = 0; pifBold <= 1; pifBold++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 for (pifItalic = 0; pifItalic <= 1; pifItalic++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 for (pifUnderline = 0; pifUnderline <= 1; pifUnderline++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 DeleteObject(prt_font_handles[pifBold][pifItalic][pifUnderline]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 if (prt_dlg.hDC != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 DeleteDC(prt_dlg.hDC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 if (!*bUserAbort)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 SendMessage(hDlgPrint, WM_COMMAND, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 to_device_units(int idx, int dpi, int physsize, int offset, int def_number)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 int ret = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 int u;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 int nr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 u = prt_get_unit(idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 if (u == PRT_UNIT_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 u = PRT_UNIT_PERC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 nr = def_number;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 nr = printer_opts[idx].number;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 switch (u)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 case PRT_UNIT_PERC:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 ret = (physsize * nr) / 100;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 case PRT_UNIT_INCH:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 ret = (nr * dpi);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 case PRT_UNIT_MM:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 ret = (nr * 10 * dpi) / 254;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 case PRT_UNIT_POINT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 ret = (nr * 10 * dpi) / 720;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 if (ret < offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 return ret - offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 prt_get_cpl(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 int hr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 int phyw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 int dvoff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 int rev_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 int dpi;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 GetTextMetrics(prt_dlg.hDC, &prt_tm);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 prt_line_height = prt_tm.tmHeight + prt_tm.tmExternalLeading;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 hr = GetDeviceCaps(prt_dlg.hDC, HORZRES);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 phyw = GetDeviceCaps(prt_dlg.hDC, PHYSICALWIDTH);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 dvoff = GetDeviceCaps(prt_dlg.hDC, PHYSICALOFFSETX);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 dpi = GetDeviceCaps(prt_dlg.hDC, LOGPIXELSX);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 rev_offset = phyw - (dvoff + hr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 prt_left_margin = to_device_units(OPT_PRINT_LEFT, dpi, phyw, dvoff, 10);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 if (prt_use_number())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 prt_number_width = PRINT_NUMBER_WIDTH * prt_tm.tmAveCharWidth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 prt_left_margin += prt_number_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 prt_number_width = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 prt_right_margin = hr - to_device_units(OPT_PRINT_RIGHT, dpi, phyw,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 rev_offset, 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 return (prt_right_margin - prt_left_margin) / prt_tm.tmAveCharWidth;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 prt_get_lpp(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 int vr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 int phyw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 int dvoff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 int rev_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 int bottom_margin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 int dpi;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 vr = GetDeviceCaps(prt_dlg.hDC, VERTRES);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 phyw = GetDeviceCaps(prt_dlg.hDC, PHYSICALHEIGHT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 dvoff = GetDeviceCaps(prt_dlg.hDC, PHYSICALOFFSETY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 dpi = GetDeviceCaps(prt_dlg.hDC, LOGPIXELSY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 rev_offset = phyw - (dvoff + vr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 prt_top_margin = to_device_units(OPT_PRINT_TOP, dpi, phyw, dvoff, 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1367 // adjust top margin if there is a header
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 prt_top_margin += prt_line_height * prt_header_height();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 bottom_margin = vr - to_device_units(OPT_PRINT_BOT, dpi, phyw,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 rev_offset, 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 return (bottom_margin - prt_top_margin) / prt_line_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 static HGLOBAL stored_dm = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 static HGLOBAL stored_devn = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 static int stored_nCopies = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 static int stored_nFlags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
1384 LOGFONTW fLogFont;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 int pifItalic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 int pifBold;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 int pifUnderline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1389 DEVMODEW *mem;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 DEVNAMES *devname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 int i;
31756
07d54b738497 patch 9.0.1210: compiler complains about declaration after label
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
1392 DWORD err;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 bUserAbort = &(psettings->user_abort);
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19131
diff changeset
1395 CLEAR_FIELD(prt_dlg);
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1396 prt_dlg.lStructSize = sizeof(PRINTDLGW);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1397 # if !defined(FEAT_GUI) || defined(VIMDLL)
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1398 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1399 if (!gui.in_use)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1400 # endif
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1401 GetConsoleHwnd(); // get value of s_hwnd
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1402 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 prt_dlg.hwndOwner = s_hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 prt_dlg.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 if (!forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 prt_dlg.hDevMode = stored_dm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 prt_dlg.hDevNames = stored_devn;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 prt_dlg.lCustData = stored_nCopies; // work around bug in print dialog
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1410 # if !defined(FEAT_GUI) || defined(VIMDLL)
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1411 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1412 if (!gui.in_use)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1413 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1414 {
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1415 /*
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1416 * Use hook to prevent console window being sent to back
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1417 */
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1418 prt_dlg.lpfnPrintHook = PrintHookProc;
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1419 prt_dlg.Flags |= PD_ENABLEPRINTHOOK;
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1420 }
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1421 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 prt_dlg.Flags |= stored_nFlags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 * If bang present, return default printer setup with no dialog
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 * never show dialog if we are running over telnet
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 if (forceit
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1430 # if !defined(FEAT_GUI) || defined(VIMDLL)
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1431 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1432 || (!gui.in_use && !term_console)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1433 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 || !term_console
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1435 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1436 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 prt_dlg.Flags |= PD_RETURNDEFAULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 * MSDN suggests setting the first parameter to WINSPOOL for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 * NT, but NULL appears to work just as well.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 if (*p_pdev != NUL)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1445 prt_dlg.hDC = CreateDC(NULL, (LPCSTR)p_pdev, NULL, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 prt_dlg.Flags |= PD_RETURNDEFAULT;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1449 if (PrintDlgW(&prt_dlg) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 goto init_fail_dlg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 }
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1453 else if (PrintDlgW(&prt_dlg) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 goto init_fail_dlg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 * keep the previous driver context
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 stored_dm = prt_dlg.hDevMode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 stored_devn = prt_dlg.hDevNames;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 stored_nFlags = prt_dlg.Flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 stored_nCopies = prt_dlg.nCopies;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 if (prt_dlg.hDC == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 {
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
1468 emsg(_(e_printer_selection_failed));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 mch_print_cleanup();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1473 // Not all printer drivers report the support of color (or grey) in the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1474 // same way. Let's set has_color if there appears to be some way to print
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1475 // more than B&W.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 i = GetDeviceCaps(prt_dlg.hDC, NUMCOLORS);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 psettings->has_color = (GetDeviceCaps(prt_dlg.hDC, BITSPIXEL) > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 || GetDeviceCaps(prt_dlg.hDC, PLANES) > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 || i > 2 || i == -1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1481 // Ensure all font styles are baseline aligned
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1482 SetTextAlign(prt_dlg.hDC, TA_BASELINE|TA_LEFT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 * On some windows systems the nCopies parameter is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 * passed back correctly. It must be retrieved from the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 * hDevMode struct.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 */
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1489 mem = (DEVMODEW *)GlobalLock(prt_dlg.hDevMode);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 if (mem != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 if (mem->dmCopies != 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 stored_nCopies = mem->dmCopies;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 if ((mem->dmFields & DM_DUPLEX) && (mem->dmDuplex & ~DMDUP_SIMPLEX))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 psettings->duplex = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 if ((mem->dmFields & DM_COLOR) && (mem->dmColor & DMCOLOR_COLOR))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 psettings->has_color = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 GlobalUnlock(prt_dlg.hDevMode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 devname = (DEVNAMES *)GlobalLock(prt_dlg.hDevNames);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 if (devname != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 {
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1504 WCHAR *wprinter_name = (WCHAR *)devname + devname->wDeviceOffset;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1505 WCHAR *wport_name = (WCHAR *)devname + devname->wOutputOffset;
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1506 char_u *text = (char_u *)_("to %s on %s");
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1507 char_u *printer_name = utf16_to_enc(wprinter_name, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1508 char_u *port_name = utf16_to_enc(wport_name, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1509
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1510 if (printer_name != NULL && port_name != NULL)
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16606
diff changeset
1511 prt_name = alloc(STRLEN(printer_name)
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16606
diff changeset
1512 + STRLEN(port_name) + STRLEN(text));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 if (prt_name != NULL)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1514 wsprintf((char *)prt_name, (const char *)text,
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1515 printer_name, port_name);
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1516 vim_free(printer_name);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1517 vim_free(port_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 GlobalUnlock(prt_dlg.hDevNames);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 * Initialise the font according to 'printfont'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 */
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19131
diff changeset
1524 CLEAR_FIELD(fLogFont);
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
1525 if (get_logfont(&fLogFont, p_pfn, prt_dlg.hDC, TRUE) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 {
26948
51ddf6740ac6 patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26893
diff changeset
1527 semsg(_(e_unknown_printer_font_str), p_pfn);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 mch_print_cleanup();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 for (pifBold = 0; pifBold <= 1; pifBold++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 for (pifItalic = 0; pifItalic <= 1; pifItalic++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 for (pifUnderline = 0; pifUnderline <= 1; pifUnderline++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 fLogFont.lfWeight = boldface[pifBold];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 fLogFont.lfItalic = pifItalic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 fLogFont.lfUnderline = pifUnderline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 prt_font_handles[pifBold][pifItalic][pifUnderline]
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
1540 = CreateFontIndirectW(&fLogFont);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 SetBkMode(prt_dlg.hDC, OPAQUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 SelectObject(prt_dlg.hDC, prt_font_handles[0][0][0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 * Fill in the settings struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 psettings->chars_per_line = prt_get_cpl();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 psettings->lines_per_page = prt_get_lpp();
6253
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1551 if (prt_dlg.Flags & PD_USEDEVMODECOPIESANDCOLLATE)
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1552 {
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1553 psettings->n_collated_copies = (prt_dlg.Flags & PD_COLLATE)
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1554 ? prt_dlg.nCopies : 1;
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1555 psettings->n_uncollated_copies = (prt_dlg.Flags & PD_COLLATE)
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1556 ? 1 : prt_dlg.nCopies;
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1557
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1558 if (psettings->n_collated_copies == 0)
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1559 psettings->n_collated_copies = 1;
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1560
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1561 if (psettings->n_uncollated_copies == 0)
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1562 psettings->n_uncollated_copies = 1;
10440
f54e4c691de4 commit https://github.com/vim/vim/commit/b04a98f6c3cca14bf055934b0a793f4dc376858b
Christian Brabandt <cb@256bit.org>
parents: 10355
diff changeset
1563 }
f54e4c691de4 commit https://github.com/vim/vim/commit/b04a98f6c3cca14bf055934b0a793f4dc376858b
Christian Brabandt <cb@256bit.org>
parents: 10355
diff changeset
1564 else
f54e4c691de4 commit https://github.com/vim/vim/commit/b04a98f6c3cca14bf055934b0a793f4dc376858b
Christian Brabandt <cb@256bit.org>
parents: 10355
diff changeset
1565 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 psettings->n_collated_copies = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 psettings->n_uncollated_copies = 1;
6253
4eba2bdb26f2 updated for version 7.4.461
Bram Moolenaar <bram@vim.org>
parents: 6249
diff changeset
1568 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 psettings->jobname = jobname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 init_fail_dlg:
31756
07d54b738497 patch 9.0.1210: compiler complains about declaration after label
Bram Moolenaar <Bram@vim.org>
parents: 31752
diff changeset
1575 err = CommDlgExtendedError();
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1576 if (err)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 {
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1578 char_u *buf;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1579
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1580 // I suspect FormatMessage() doesn't work for values returned by
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1581 // CommDlgExtendedError(). What does?
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1582 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1583 FORMAT_MESSAGE_FROM_SYSTEM |
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1584 FORMAT_MESSAGE_IGNORE_INSERTS,
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1585 NULL, err, 0, (LPTSTR)(&buf), 0, NULL);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1586 semsg(_(e_print_error_str),
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1587 buf == NULL ? (char_u *)_("Unknown") : buf);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1588 LocalFree((LPVOID)(buf));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 }
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1590 else
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1591 msg_clr_eos(); // Maybe canceled
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1592
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1593 mch_print_cleanup();
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
1594 return FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 mch_print_begin(prt_settings_T *psettings)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 {
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1601 int ret = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 char szBuffer[300];
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1603 WCHAR *wp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1605 hDlgPrint = CreateDialog(g_hinst, TEXT("PrintDlgBox"),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 prt_dlg.hwndOwner, PrintDlgProc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 SetAbortProc(prt_dlg.hDC, AbortProc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 wsprintf(szBuffer, _("Printing '%s'"), gettail(psettings->jobname));
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1609 vimSetDlgItemText(hDlgPrint, IDC_PRINTTEXT1, (char_u *)szBuffer);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1611 wp = enc_to_utf16(psettings->jobname, NULL);
13929
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1612 if (wp != NULL)
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1613 {
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1614 DOCINFOW di;
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1615
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19131
diff changeset
1616 CLEAR_FIELD(di);
13929
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1617 di.cbSize = sizeof(di);
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1618 di.lpszDocName = wp;
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1619 ret = StartDocW(prt_dlg.hDC, &di);
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1620 vim_free(wp);
05aec5ac9630 patch 8.0.1835: print document name does not support multi-byte
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1621 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1623 # ifdef FEAT_GUI
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1624 // Give focus back to main window (when using MDI).
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1625 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1626 if (gui.in_use)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1627 # endif
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1628 SetFocus(s_hwnd);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1629 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 return (ret > 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 void
10783
04eb70c77cf4 patch 8.0.0281: some files are still using ARGSUSED instead of UNUSED
Christian Brabandt <cb@256bit.org>
parents: 10440
diff changeset
1635 mch_print_end(prt_settings_T *psettings UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 EndDoc(prt_dlg.hDC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 if (!*bUserAbort)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 SendMessage(hDlgPrint, WM_COMMAND, 0, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 mch_print_end_page(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 return (EndPage(prt_dlg.hDC) > 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 mch_print_begin_page(char_u *msg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 if (msg != NULL)
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
1652 vimSetDlgItemText(hDlgPrint, IDC_PROGRESS, msg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 return (StartPage(prt_dlg.hDC) > 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 mch_print_blank_page(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 return (mch_print_begin_page(NULL) ? (mch_print_end_page()) : FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 static int prt_pos_x = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 static int prt_pos_y = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
1666 mch_print_start_line(int margin, int page_line)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 if (margin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 prt_pos_x = -prt_number_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 prt_pos_x = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 prt_pos_y = page_line * prt_line_height
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 + prt_tm.tmAscent + prt_tm.tmExternalLeading;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 mch_print_text_out(char_u *p, int len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 SIZE sz;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1680 WCHAR *wp;
4932
1cf02fbe6281 updated for version 7.3.1211
Bram Moolenaar <bram@vim.org>
parents: 4926
diff changeset
1681 int wlen = len;
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1682 int ret = FALSE;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1683
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1684 wp = enc_to_utf16(p, &wlen);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1685 if (wp == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1686 return FALSE;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1687
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1688 TextOutW(prt_dlg.hDC, prt_pos_x + prt_left_margin,
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1689 prt_pos_y + prt_top_margin, wp, wlen);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1690 GetTextExtentPoint32W(prt_dlg.hDC, wp, wlen, &sz);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1691 vim_free(wp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 prt_pos_x += (sz.cx - prt_tm.tmOverhang);
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1693 // This is wrong when printing spaces for a TAB.
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1694 if (p[len] != NUL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1695 {
18251
c8a53c0daeed patch 8.1.2120: some MB_ macros are more complicated than necessary
Bram Moolenaar <Bram@vim.org>
parents: 18139
diff changeset
1696 wlen = mb_ptr2len(p + len);
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1697 wp = enc_to_utf16(p + len, &wlen);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1698 if (wp != NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1699 {
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1700 GetTextExtentPoint32W(prt_dlg.hDC, wp, 1, &sz);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1701 ret = (prt_pos_x + prt_left_margin + sz.cx > prt_right_margin);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1702 vim_free(wp);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1703 }
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1704 }
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1705 return ret;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 mch_print_set_font(int iBold, int iItalic, int iUnderline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 SelectObject(prt_dlg.hDC, prt_font_handles[iBold][iItalic][iUnderline]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 void
843
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1715 mch_print_set_bg(long_u bgcol)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 {
843
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1717 SetBkColor(prt_dlg.hDC, GetNearestColor(prt_dlg.hDC,
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1718 swap_me((COLORREF)bgcol)));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 * With a white background we can draw characters transparent, which is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 * good for italic characters that overlap to the next char cell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 if (bgcol == 0xffffffUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 SetBkMode(prt_dlg.hDC, TRANSPARENT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 SetBkMode(prt_dlg.hDC, OPAQUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729 void
843
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1730 mch_print_set_fg(long_u fgcol)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 {
843
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1732 SetTextColor(prt_dlg.hDC, GetNearestColor(prt_dlg.hDC,
9f279ebda751 updated for version 7.0f01
vimboss
parents: 840
diff changeset
1733 swap_me((COLORREF)fgcol)));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1736 #endif // FEAT_PRINTER && !FEAT_POSTSCRIPT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737
440
eb531146be0e updated for version 7.0114
vimboss
parents: 434
diff changeset
1738
eb531146be0e updated for version 7.0114
vimboss
parents: 434
diff changeset
1739
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 #if defined(FEAT_SHORTCUT) || defined(PROTO)
3927
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
1741 # ifndef PROTO
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
1742 # include <shlobj.h>
e6d8b44065bc updated for version 7.3.719
Bram Moolenaar <bram@vim.org>
parents: 3174
diff changeset
1743 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744
16945
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1745 # define is_path_sep(c) ((c) == L'\\' || (c) == L'/')
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1746
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1747 static int
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1748 is_reparse_point_included(LPCWSTR fname)
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1749 {
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1750 LPCWSTR p = fname, q;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1751 WCHAR buf[MAX_PATH];
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1752 DWORD attr;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1753
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1754 if (isalpha(p[0]) && p[1] == L':' && is_path_sep(p[2]))
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1755 p += 3;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1756 else if (is_path_sep(p[0]) && is_path_sep(p[1]))
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1757 p += 2;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1758
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1759 while (*p != L'\0')
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1760 {
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1761 q = wcspbrk(p, L"\\/");
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1762 if (q == NULL)
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1763 p = q = fname + wcslen(fname);
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1764 else
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1765 p = q + 1;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1766 if (q - fname >= MAX_PATH)
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1767 return FALSE;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1768 wcsncpy(buf, fname, q - fname);
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1769 buf[q - fname] = L'\0';
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1770 attr = GetFileAttributesW(buf);
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1771 if (attr != INVALID_FILE_ATTRIBUTES
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1772 && (attr & FILE_ATTRIBUTE_REPARSE_POINT) != 0)
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1773 return TRUE;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1774 }
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1775 return FALSE;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1776 }
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1777
32922
397ff3169248 patch 9.0.1769: executable() ignoring symlinks on Windows
Christian Brabandt <cb@256bit.org>
parents: 31756
diff changeset
1778 /*
397ff3169248 patch 9.0.1769: executable() ignoring symlinks on Windows
Christian Brabandt <cb@256bit.org>
parents: 31756
diff changeset
1779 * Return the resolved file path, NULL if "fname" is an AppExecLink reparse
397ff3169248 patch 9.0.1769: executable() ignoring symlinks on Windows
Christian Brabandt <cb@256bit.org>
parents: 31756
diff changeset
1780 * point, already fully resolved, or it doesn't exists.
397ff3169248 patch 9.0.1769: executable() ignoring symlinks on Windows
Christian Brabandt <cb@256bit.org>
parents: 31756
diff changeset
1781 */
397ff3169248 patch 9.0.1769: executable() ignoring symlinks on Windows
Christian Brabandt <cb@256bit.org>
parents: 31756
diff changeset
1782 char_u *
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1783 resolve_reparse_point(char_u *fname)
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1784 {
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1785 HANDLE h = INVALID_HANDLE_VALUE;
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1786 DWORD size;
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1787 WCHAR *p, *wp;
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1788 char_u *rfname = NULL;
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1789 WCHAR *buff = NULL;
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1790
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1791 p = enc_to_utf16(fname, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1792 if (p == NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1793 goto fail;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1794
16945
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1795 if (!is_reparse_point_included(p))
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1796 {
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1797 vim_free(p);
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1798 goto fail;
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1799 }
efd36a9052cc patch 8.1.1473: new resolve() implementation causes problem for plugins
Bram Moolenaar <Bram@vim.org>
parents: 16831
diff changeset
1800
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1801 h = CreateFileW(p, 0, 0, NULL, OPEN_EXISTING,
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1802 FILE_FLAG_BACKUP_SEMANTICS, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1803 vim_free(p);
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1804
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1805 if (h == INVALID_HANDLE_VALUE)
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1806 goto fail;
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1807
30320
0763cb330a65 patch 9.0.0496: no good reason to keep supporting Windows-XP
Bram Moolenaar <Bram@vim.org>
parents: 29310
diff changeset
1808 size = GetFinalPathNameByHandleW(h, NULL, 0, 0);
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1809 if (size == 0)
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1810 goto fail;
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1811 buff = ALLOC_MULT(WCHAR, size);
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1812 if (buff == NULL)
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1813 goto fail;
30320
0763cb330a65 patch 9.0.0496: no good reason to keep supporting Windows-XP
Bram Moolenaar <Bram@vim.org>
parents: 29310
diff changeset
1814 if (GetFinalPathNameByHandleW(h, buff, size, 0) == 0)
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1815 goto fail;
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1816
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1817 if (wcsncmp(buff, L"\\\\?\\UNC\\", 8) == 0)
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1818 {
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1819 buff[6] = L'\\';
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1820 wp = buff + 6;
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1821 }
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1822 else if (wcsncmp(buff, L"\\\\?\\", 4) == 0)
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1823 wp = buff + 4;
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1824 else
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1825 wp = buff;
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1826
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1827 rfname = utf16_to_enc(wp, NULL);
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1828
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1829 fail:
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1830 if (h != INVALID_HANDLE_VALUE)
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1831 CloseHandle(h);
17574
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1832 if (buff != NULL)
a6f392cc9587 patch 8.1.1784: MS-Windows: resolve() does not work if serial nr duplicated
Bram Moolenaar <Bram@vim.org>
parents: 16945
diff changeset
1833 vim_free(buff);
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1834
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1835 return rfname;
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1836 }
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1837
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 * When "fname" is the name of a shortcut (*.lnk) resolve the file it points
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 * to and return that name in allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 * Otherwise NULL is returned.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 */
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1843 static char_u *
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1844 resolve_shortcut(char_u *fname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 HRESULT hr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 IShellLink *psl = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 IPersistFile *ppf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 OLECHAR wsz[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 char_u *rfname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 int len;
5318
8e28c23e482c updated for version 7.4.012
Bram Moolenaar <bram@vim.org>
parents: 4932
diff changeset
1852 IShellLinkW *pslw = NULL;
8e28c23e482c updated for version 7.4.012
Bram Moolenaar <bram@vim.org>
parents: 4932
diff changeset
1853 WIN32_FIND_DATAW ffdw; // we get those free of charge
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1855 // Check if the file name ends in ".lnk". Avoid calling
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1856 // CoCreateInstance(), it's quite slow.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 return rfname;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 828
diff changeset
1859 len = (int)STRLEN(fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 if (len <= 4 || STRNICMP(fname + len - 4, ".lnk", 4) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 return rfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 CoInitialize(NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 // create a link manager object and request its interface
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 hr = CoCreateInstance(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1868 &IID_IShellLinkW, (void**)&pslw);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1869 if (hr == S_OK)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1870 {
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1871 WCHAR *p = enc_to_utf16(fname, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1872
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1873 if (p != NULL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1874 {
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1875 // Get a pointer to the IPersistFile interface.
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1876 hr = pslw->lpVtbl->QueryInterface(
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1877 pslw, &IID_IPersistFile, (void**)&ppf);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1878 if (hr != S_OK)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1879 goto shortcut_errorw;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1880
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1881 // "load" the name and resolve the link
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1882 hr = ppf->lpVtbl->Load(ppf, p, STGM_READ);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1883 if (hr != S_OK)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1884 goto shortcut_errorw;
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1885 # if 0 // This makes Vim wait a long time if the target does not exist.
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1886 hr = pslw->lpVtbl->Resolve(pslw, NULL, SLR_NO_UI);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1887 if (hr != S_OK)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1888 goto shortcut_errorw;
5318
8e28c23e482c updated for version 7.4.012
Bram Moolenaar <bram@vim.org>
parents: 4932
diff changeset
1889 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890
16196
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1891 // Get the path to the link target.
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1892 ZeroMemory(wsz, MAX_PATH * sizeof(WCHAR));
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1893 hr = pslw->lpVtbl->GetPath(pslw, wsz, MAX_PATH, &ffdw, 0);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1894 if (hr == S_OK && wsz[0] != NUL)
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1895 rfname = utf16_to_enc(wsz, NULL);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1896
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1897 shortcut_errorw:
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1898 vim_free(p);
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1899 }
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1900 }
973070a30381 patch 8.1.1103: MS-Windows: old API calls are no longer needed
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1901
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 // Release all interface pointers (both belong to the same object)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 if (ppf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 ppf->lpVtbl->Release(ppf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 if (psl != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 psl->lpVtbl->Release(psl);
5318
8e28c23e482c updated for version 7.4.012
Bram Moolenaar <bram@vim.org>
parents: 4932
diff changeset
1907 if (pslw != NULL)
8e28c23e482c updated for version 7.4.012
Bram Moolenaar <bram@vim.org>
parents: 4932
diff changeset
1908 pslw->lpVtbl->Release(pslw);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 CoUninitialize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 return rfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 }
15774
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1913
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1914 char_u *
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1915 mch_resolve_path(char_u *fname, int reparse_point)
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1916 {
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1917 char_u *path = resolve_shortcut(fname);
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1918
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1919 if (path == NULL && reparse_point)
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1920 path = resolve_reparse_point(fname);
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1921 return path;
c4efa095f323 patch 8.1.0894: MS-Windows: resolve() does not return a reparse point
Bram Moolenaar <Bram@vim.org>
parents: 15603
diff changeset
1922 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
1925 #if (defined(FEAT_EVAL) && (!defined(FEAT_GUI) || defined(VIMDLL))) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 * Bring ourselves to the foreground. Does work if the OS doesn't allow it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
1930 win32_set_foreground(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1932 GetConsoleHwnd(); // get value of s_hwnd
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 if (s_hwnd != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 SetForegroundWindow(s_hwnd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 #if defined(FEAT_CLIENTSERVER) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 * Client-server code for Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 * Originally written by Paul Moore
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1945 // In order to handle inter-process messages, we need to have a window. But
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1946 // the functions in this module can be called before the main GUI window is
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1947 // created (and may also be called in the console version, where there is no
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1948 // GUI window at all).
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1949 //
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1950 // So we create a hidden window, and arrange to destroy it on exit.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1951 HWND message_window = 0; // window that's handling messages
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1953 # define VIM_CLASSNAME "VIM_MESSAGES"
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1954 # define VIM_CLASSNAME_LEN (sizeof(VIM_CLASSNAME) - 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1956 // Timeout for sending a message to another Vim instance. Normally this works
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1957 // instantly, but it may hang when the other Vim instance is halted.
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1958 # define SENDMESSAGE_TIMEOUT (5 * 1000)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1959
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26589
diff changeset
1960 // Communication is via WM_COPYDATA messages. The message type is sent in
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1961 // the dwData parameter. Types are defined here.
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1962 # define COPYDATA_KEYS 0
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1963 # define COPYDATA_REPLY 1
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1964 # define COPYDATA_EXPR 10
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1965 # define COPYDATA_RESULT 11
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1966 # define COPYDATA_ERROR_RESULT 12
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
1967 # define COPYDATA_ENCODING 20
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1969 // This is a structure containing a server HWND and its name.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 struct server_id
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 HWND hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
1976 // Last received 'encoding' that the client uses.
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1977 static char_u *client_enc = NULL;
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1978
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1979 /*
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1980 * Tell the other side what encoding we are using.
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1981 * Return -1 if timeout happens. Other errors are ignored.
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1982 */
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1983 static int
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1984 serverSendEnc(HWND target)
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1985 {
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1986 COPYDATASTRUCT data;
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1987
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1988 data.dwData = COPYDATA_ENCODING;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 828
diff changeset
1989 data.cbData = (DWORD)STRLEN(p_enc) + 1;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1990 data.lpData = p_enc;
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1991 if (SendMessageTimeout(target, WM_COPYDATA,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1992 (WPARAM)message_window, (LPARAM)&data,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1993 SMTO_ABORTIFHUNG, SENDMESSAGE_TIMEOUT, NULL) == 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1994 return -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
1995 return 0;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1996 }
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
1997
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 * Clean up on exit. This destroys the hidden message window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 CleanUpMessaging(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 {
31752
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
2004 if (message_window == 0)
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
2005 return;
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
2006
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
2007 DestroyWindow(message_window);
3365a601e73b patch 9.0.1208: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30320
diff changeset
2008 message_window = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 static int save_reply(HWND server, char_u *reply, int expr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4238
diff changeset
2013 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 * The window procedure for the hidden message window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 * It handles callback messages and notifications from servers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 * In order to process these messages, it is necessary to run a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 * message loop. Code which may run before the main message loop
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 * is started (in the GUI) is careful to pump messages when it needs
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019 * to. Features which require message delivery during normal use will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 * not work in the console version - this basically means those
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 * features which allow Vim to act as a server, rather than a client.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 static LRESULT CALLBACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 Messaging_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 if (msg == WM_COPYDATA)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2028 // This is a message from another Vim. The dwData member of the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2029 // COPYDATASTRUCT determines the type of message:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2030 // COPYDATA_ENCODING:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2031 // The encoding that the client uses. Following messages will
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2032 // use this encoding, convert if needed.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2033 // COPYDATA_KEYS:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2034 // A key sequence. We are a server, and a client wants these keys
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2035 // adding to the input queue.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2036 // COPYDATA_REPLY:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2037 // A reply. We are a client, and a server has sent this message
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2038 // in response to a request. (server2client())
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2039 // COPYDATA_EXPR:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2040 // An expression. We are a server, and a client wants us to
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2041 // evaluate this expression.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2042 // COPYDATA_RESULT:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2043 // A reply. We are a client, and a server has sent this message
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2044 // in response to a COPYDATA_EXPR.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2045 // COPYDATA_ERROR_RESULT:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2046 // A reply. We are a client, and a server has sent this message
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2047 // in response to a COPYDATA_EXPR that failed to evaluate.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 COPYDATASTRUCT *data = (COPYDATASTRUCT*)lParam;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 HWND sender = (HWND)wParam;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 COPYDATASTRUCT reply;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 char_u *res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 int retval;
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2053 DWORD_PTR dwret = 0;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2054 char_u *str;
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2055 char_u *tofree;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 switch (data->dwData)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2059 case COPYDATA_ENCODING:
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2060 // Remember the encoding that the client uses.
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2061 vim_free(client_enc);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2062 client_enc = enc_canonize((char_u *)data->lpData);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2063 return 1;
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2064
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 case COPYDATA_KEYS:
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2066 // Remember who sent this, for <client>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 clientWindow = sender;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2069 // Add the received keys to the input buffer. The loop waiting
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2070 // for the user to do something should check the input buffer.
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2071 str = serverConvert(client_enc, (char_u *)data->lpData, &tofree);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2072 server_to_input_buf(str);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2073 vim_free(tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 # ifdef FEAT_GUI
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2076 // Wake up the main GUI loop.
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2077 # ifdef VIMDLL
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2078 if (gui.in_use)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2079 # endif
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2080 if (s_hwnd != 0)
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2081 PostMessage(s_hwnd, WM_NULL, 0, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 case COPYDATA_EXPR:
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2086 // Remember who sent this, for <client>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 clientWindow = sender;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2089 str = serverConvert(client_enc, (char_u *)data->lpData, &tofree);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2090 res = eval_client_expr_to_string(str);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2091
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 if (res == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 {
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26877
diff changeset
2094 char *err = _(e_invalid_expression_received);
11175
9836b701afd9 patch 8.0.0474: the client-server feature is not tested
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2095 size_t len = STRLEN(str) + STRLEN(err) + 5;
9836b701afd9 patch 8.0.0474: the client-server feature is not tested
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2096
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16606
diff changeset
2097 res = alloc(len);
11175
9836b701afd9 patch 8.0.0474: the client-server feature is not tested
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2098 if (res != NULL)
9836b701afd9 patch 8.0.0474: the client-server feature is not tested
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2099 vim_snprintf((char *)res, len, "%s: \"%s\"", err, str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 reply.dwData = COPYDATA_ERROR_RESULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 reply.dwData = COPYDATA_RESULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 reply.lpData = res;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 828
diff changeset
2105 reply.cbData = (DWORD)STRLEN(res) + 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2107 if (serverSendEnc(sender) < 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2108 retval = -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2109 else
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2110 {
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2111 if (SendMessageTimeout(sender, WM_COPYDATA,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2112 (WPARAM)message_window, (LPARAM)&reply,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2113 SMTO_ABORTIFHUNG, SENDMESSAGE_TIMEOUT, &dwret) == 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2114 retval = -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2115 else
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2116 retval = (int)dwret;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2117 }
11175
9836b701afd9 patch 8.0.0474: the client-server feature is not tested
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2118 vim_free(tofree);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 vim_free(res);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 case COPYDATA_REPLY:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 case COPYDATA_RESULT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 case COPYDATA_ERROR_RESULT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 if (data->lpData != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2127 str = serverConvert(client_enc, (char_u *)data->lpData,
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2128 &tofree);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2129 if (tofree == NULL)
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2130 str = vim_strsave(str);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2131 if (save_reply(sender, str,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 (data->dwData == COPYDATA_REPLY ? 0 :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 (data->dwData == COPYDATA_RESULT ? 1 :
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2134 2))) == FAIL)
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2135 vim_free(str);
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2136 else if (data->dwData == COPYDATA_REPLY)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 {
4926
784e342ddcae updated for version 7.3.1208
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
2138 char_u winstr[30];
784e342ddcae updated for version 7.3.1208
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
2139
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
2140 sprintf((char *)winstr, PRINTF_HEX_LONG_U, (long_u)sender);
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2141 apply_autocmds(EVENT_REMOTEREPLY, winstr, str,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 TRUE, curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 else if (msg == WM_ACTIVATE && wParam == WA_ACTIVE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2153 // When the message window is activated (brought to the foreground),
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2154 // this actually applies to the text window.
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2155 # if !defined(FEAT_GUI) || defined(VIMDLL)
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2156 # ifdef VIMDLL
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2157 if (!gui.in_use)
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2158 # endif
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2159 GetConsoleHwnd(); // get value of s_hwnd
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2160 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 if (s_hwnd != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 SetForegroundWindow(s_hwnd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 return DefWindowProc(hwnd, msg, wParam, lParam);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 * Initialise the message handling process. This involves creating a window
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 * to handle messages - the window will not be visible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 serverInitMessaging(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 WNDCLASS wndclass;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2180 // Clean up on exit
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 atexit(CleanUpMessaging);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2183 // Register a window class - we only really care
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2184 // about the window procedure
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 wndclass.style = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 wndclass.lpfnWndProc = Messaging_WndProc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 wndclass.cbClsExtra = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 wndclass.cbWndExtra = 0;
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2189 wndclass.hInstance = g_hinst;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 wndclass.hIcon = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 wndclass.hCursor = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 wndclass.hbrBackground = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 wndclass.lpszMenuName = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 wndclass.lpszClassName = VIM_CLASSNAME;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 RegisterClass(&wndclass);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2197 // Create the message window. It will be hidden, so the details don't
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2198 // matter. Don't use WS_OVERLAPPEDWINDOW, it will make a shortcut remove
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2199 // focus from gvim.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 message_window = CreateWindow(VIM_CLASSNAME, "",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 WS_POPUPWINDOW | WS_CAPTION,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 CW_USEDEFAULT, CW_USEDEFAULT,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 100, 100, NULL, NULL,
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2204 g_hinst, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2207 // Used by serverSendToVim() to find an alternate server name.
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2208 static char_u *altname_buf_ptr = NULL;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2209
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 * Get the title of the window "hwnd", which is the Vim server name, in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 * "name[namelen]" and return the length.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 * Returns zero if window "hwnd" is not a Vim server.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 getVimServerName(HWND hwnd, char *name, int namelen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 char buffer[VIM_CLASSNAME_LEN + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2221 // Ignore windows which aren't Vim message windows
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 len = GetClassName(hwnd, buffer, sizeof(buffer));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 if (len != VIM_CLASSNAME_LEN || STRCMP(buffer, VIM_CLASSNAME) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2226 // Get the title of the window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 return GetWindowText(hwnd, name, namelen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 static BOOL CALLBACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 enumWindowsGetServer(HWND hwnd, LPARAM lparam)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 struct server_id *id = (struct server_id *)lparam;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 char server[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2236 // Get the title of the window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 if (getVimServerName(hwnd, server, sizeof(server)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2240 // If this is the server we're looking for, return its HWND
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 if (STRICMP(server, id->name) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 id->hwnd = hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2247 // If we are looking for an alternate server, remember this name.
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2248 if (altname_buf_ptr != NULL
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2249 && STRNICMP(server, id->name, STRLEN(id->name)) == 0
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2250 && vim_isdigit(server[STRLEN(id->name)]))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2251 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2252 STRCPY(altname_buf_ptr, server);
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2253 altname_buf_ptr = NULL; // don't use another name
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2254 }
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2255
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2256 // Otherwise, keep looking
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 static BOOL CALLBACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 enumWindowsGetNames(HWND hwnd, LPARAM lparam)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 garray_T *ga = (garray_T *)lparam;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 char server[MAX_PATH];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2266 // Get the title of the window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 if (getVimServerName(hwnd, server, sizeof(server)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2270 // Add the name to the list
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2271 ga_concat(ga, (char_u *)server);
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2272 ga_concat(ga, (char_u *)"\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275
14901
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2276 struct enum_windows_s
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2277 {
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2278 WNDENUMPROC lpEnumFunc;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2279 LPARAM lParam;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2280 };
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2281
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2282 static BOOL CALLBACK
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2283 enum_windows_child(HWND hwnd, LPARAM lParam)
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2284 {
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2285 struct enum_windows_s *ew = (struct enum_windows_s *)lParam;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2286
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2287 return (ew->lpEnumFunc)(hwnd, ew->lParam);
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2288 }
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2289
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2290 static BOOL CALLBACK
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2291 enum_windows_toplevel(HWND hwnd, LPARAM lParam)
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2292 {
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2293 struct enum_windows_s *ew = (struct enum_windows_s *)lParam;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2294
14907
497009f367ea patch 8.1.0465: client-server test fails
Bram Moolenaar <Bram@vim.org>
parents: 14901
diff changeset
2295 if ((ew->lpEnumFunc)(hwnd, ew->lParam))
497009f367ea patch 8.1.0465: client-server test fails
Bram Moolenaar <Bram@vim.org>
parents: 14901
diff changeset
2296 return TRUE;
14901
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2297 return EnumChildWindows(hwnd, enum_windows_child, lParam);
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2298 }
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2299
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2300 /*
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2301 * Enumerate all windows including children.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2302 */
14901
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2303 static BOOL
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2304 enum_windows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2305 {
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2306 struct enum_windows_s ew;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2307
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2308 ew.lpEnumFunc = lpEnumFunc;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2309 ew.lParam = lParam;
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2310 return EnumWindows(enum_windows_toplevel, (LPARAM)&ew);
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2311 }
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2312
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 static HWND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 findServer(char_u *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 struct server_id id;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 id.name = name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 id.hwnd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320
14901
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2321 enum_windows(enumWindowsGetServer, (LPARAM)(&id));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 return id.hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 serverSetName(char_u *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329 char_u *ok_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 HWND hwnd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 int i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2334 // Leave enough space for a 9-digit suffix to ensure uniqueness!
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16606
diff changeset
2335 ok_name = alloc(STRLEN(name) + 10);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 STRCPY(ok_name, name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 p = ok_name + STRLEN(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2342 // This is inefficient - we're doing an EnumWindows loop for each
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2343 // possible name. It would be better to grab all names in one go,
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2344 // and scan the list each time...
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 hwnd = findServer(ok_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 if (hwnd == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 if (i >= 1000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 sprintf((char *)p, "%d", i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 if (hwnd != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 vim_free(ok_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2360 // Remember the name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 serverName = ok_name;
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2362 need_maketitle = TRUE; // update Vim window title later
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2364 // Update the message window title
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2365 SetWindowText(message_window, (LPCSTR)ok_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2367 # ifdef FEAT_EVAL
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2368 // Set the servername variable
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 set_vim_var_string(VV_SEND_SERVER, serverName, -1);
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2370 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 serverGetVimNames(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 garray_T ga;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 ga_init2(&ga, 1, 100);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380
14901
014d916ab258 patch 8.1.0462: when using ConPTY Vim can be a child process
Bram Moolenaar <Bram@vim.org>
parents: 14479
diff changeset
2381 enum_windows(enumWindowsGetNames, (LPARAM)(&ga));
21
db5102f7e29f updated for version 7.0013
vimboss
parents: 11
diff changeset
2382 ga_append(&ga, NUL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 return ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
2388 serverSendReply(
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2389 char_u *name, // Where to send.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2390 char_u *reply) // What to send.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 HWND target;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 COPYDATASTRUCT data;
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
2394 long_u n = 0;
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2395 DWORD_PTR dwret = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2397 // The "name" argument is a magic cookie obtained from expand("<client>").
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2398 // It should be of the form 0xXXXXX - i.e. a C hex literal, which is the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2399 // value of the client's message window HWND.
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
2400 sscanf((char *)name, SCANF_HEX_LONG_U, &n);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 if (n == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 target = (HWND)n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 if (!IsWindow(target))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 data.dwData = COPYDATA_REPLY;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 828
diff changeset
2409 data.cbData = (DWORD)STRLEN(reply) + 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 data.lpData = reply;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2412 if (serverSendEnc(target) < 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2413 return -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2414 if (SendMessageTimeout(target, WM_COPYDATA,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2415 (WPARAM)message_window, (LPARAM)&data,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2416 SMTO_ABORTIFHUNG, SENDMESSAGE_TIMEOUT, &dwret) == 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2417 return -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2418 return dwret ? 0 : -1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
2422 serverSendToVim(
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2423 char_u *name, // Where to send.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2424 char_u *cmd, // What to send.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2425 char_u **result, // Result of eval'ed expression
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2426 void *ptarget, // HWND of server
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2427 int asExpr, // Expression or keys?
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2428 int timeout, // timeout in seconds or zero
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2429 int silent) // don't complain about no server
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 {
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2431 HWND target;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 COPYDATASTRUCT data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 char_u *retval = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 int retcode = 0;
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2435 DWORD_PTR dwret = 0;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2436 char_u altname_buf[MAX_PATH];
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2437
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2438 // Execute locally if no display or target is ourselves
11177
76fb679a310e patch 8.0.0475: not enough testing for the client-server feature
Christian Brabandt <cb@256bit.org>
parents: 11175
diff changeset
2439 if (serverName != NULL && STRICMP(name, serverName) == 0)
76fb679a310e patch 8.0.0475: not enough testing for the client-server feature
Christian Brabandt <cb@256bit.org>
parents: 11175
diff changeset
2440 return sendToLocalVim(cmd, asExpr, result);
76fb679a310e patch 8.0.0475: not enough testing for the client-server feature
Christian Brabandt <cb@256bit.org>
parents: 11175
diff changeset
2441
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2442 // If the server name does not end in a digit then we look for an
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26589
diff changeset
2443 // alternate name. e.g. when "name" is GVIM then we may find GVIM2.
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2444 if (STRLEN(name) > 1 && !vim_isdigit(name[STRLEN(name) - 1]))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2445 altname_buf_ptr = altname_buf;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2446 altname_buf[0] = NUL;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2447 target = findServer(name);
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2448 altname_buf_ptr = NULL;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2449 if (target == 0 && altname_buf[0] != NUL)
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2450 // Use another server name we found.
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 843
diff changeset
2451 target = findServer(altname_buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 if (target == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 if (!silent)
26877
06a137af96f8 patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26821
diff changeset
2456 semsg(_(e_no_registered_server_named_str), name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 if (ptarget)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 *(HWND *)ptarget = target;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 data.dwData = asExpr ? COPYDATA_EXPR : COPYDATA_KEYS;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 828
diff changeset
2464 data.cbData = (DWORD)STRLEN(cmd) + 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 data.lpData = cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466
29198
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2467 if (serverSendEnc(target) < 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2468 return -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2469 if (SendMessageTimeout(target, WM_COPYDATA,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2470 (WPARAM)message_window, (LPARAM)&data,
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2471 SMTO_ABORTIFHUNG, SENDMESSAGE_TIMEOUT, &dwret) == 0)
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2472 return -1;
2e6c9df8bea1 patch 8.2.5118: MS-Windows: sending a message to another Vim may hang
Bram Moolenaar <Bram@vim.org>
parents: 29130
diff changeset
2473 if (dwret == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 if (asExpr)
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2477 retval = serverGetReply(target, &retcode, TRUE, TRUE, timeout);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 if (result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 vim_free(retval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 else
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2482 *result = retval; // Caller assumes responsibility for freeing
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 return retcode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488 * Bring the server to the foreground.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
2491 serverForeground(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 HWND target = findServer(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 if (target != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 SetForegroundWindow(target);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2499 // Replies from server need to be stored until the client picks them up via
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2500 // remote_read(). So we maintain a list of server-id/reply pairs.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2501 // Note that there could be multiple replies from one server pending if the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2502 // client is slow picking them up.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2503 // We just store the replies in a simple list. When we remove an entry, we
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2504 // move list entries down to fill the gap.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2505 // The server ID is simply the HWND.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2508 HWND server; // server window
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2509 char_u *reply; // reply string
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2510 int expr_result; // 0 for REPLY, 1 for RESULT 2 for error
323
03b3684919e3 updated for version 7.0084
vimboss
parents: 273
diff changeset
2511 } reply_T;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 static garray_T reply_list = {0, 0, sizeof(reply_T), 5, 0};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2515 # define REPLY_ITEM(i) ((reply_T *)(reply_list.ga_data) + (i))
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2516 # define REPLY_COUNT (reply_list.ga_len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2518 // Flag which is used to wait for a reply
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 static int reply_received = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2521 /*
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2522 * Store a reply. "reply" must be allocated memory (or NULL).
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2523 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 save_reply(HWND server, char_u *reply, int expr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 reply_T *rep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 if (ga_grow(&reply_list, 1) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 rep = REPLY_ITEM(REPLY_COUNT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 rep->server = server;
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
2534 rep->reply = reply;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 rep->expr_result = expr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 if (rep->reply == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 ++REPLY_COUNT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 reply_received = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 * Get a reply from server "server".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 * When "expr_res" is non NULL, get the result of an expression, otherwise a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 * server2client() message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 * When non NULL, point to return code. 0 => OK, -1 => ERROR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 * If "remove" is TRUE, consume the message, the caller must free it then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 * if "wait" is TRUE block until a message arrives (or the server exits).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 char_u *
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2553 serverGetReply(HWND server, int *expr_res, int remove, int wait, int timeout)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 char_u *reply;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 reply_T *rep;
11187
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2558 int did_process = FALSE;
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2559 time_t start;
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2560 time_t now;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2562 // When waiting, loop until the message waiting for is received.
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2563 time(&start);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2566 // Reset this here, in case a message arrives while we are going
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2567 // through the already received messages.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 reply_received = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 for (i = 0; i < REPLY_COUNT; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 rep = REPLY_ITEM(i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 if (rep->server == server
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 && ((rep->expr_result != 0) == (expr_res != NULL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2576 // Save the values we've found for later
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 reply = rep->reply;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 if (expr_res != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579 *expr_res = rep->expr_result == 1 ? 0 : -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 if (remove)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2583 // Move the rest of the list down to fill the gap
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 mch_memmove(rep, rep + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 (REPLY_COUNT - i - 1) * sizeof(reply_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 --REPLY_COUNT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2589 // Return the reply to the caller, who takes on responsibility
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2590 // for freeing it if "remove" is TRUE.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 return reply;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2595 // If we got here, we didn't find a reply. Return immediately if the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2596 // "wait" parameter isn't set.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 if (!wait)
11187
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2598 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2599 // Process pending messages once. Without this, looping on
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2600 // remote_peek() would never get the reply.
11187
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2601 if (!did_process)
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2602 {
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2603 did_process = TRUE;
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2604 serverProcessPendingMessages();
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2605 continue;
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2606 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 break;
11187
515db00c4676 patch 8.0.0480: the remote_peek() test fails on MS-Windows
Christian Brabandt <cb@256bit.org>
parents: 11181
diff changeset
2608 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2610 // We need to wait for a reply. Enter a message loop until the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2611 // "reply_received" flag gets set.
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2612
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2613 // Loop until we receive a reply
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 while (reply_received == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2616 # ifdef FEAT_TIMERS
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2617 // TODO: use the return value to decide how long to wait.
11181
13544aa85dc0 patch 8.0.0477: the client-server test may hang when failing
Christian Brabandt <cb@256bit.org>
parents: 11177
diff changeset
2618 check_due_timer();
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2619 # endif
11211
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2620 time(&now);
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2621 if (timeout > 0 && (now - start) >= timeout)
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2622 break;
71311d899b42 patch 8.0.0492: a failing client-server request can make Vim hang
Christian Brabandt <cb@256bit.org>
parents: 11187
diff changeset
2623
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2624 // Wait for a SendMessage() call to us. This could be the reply
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2625 // we are waiting for. Use a timeout of a second, to catch the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2626 // situation that the server died unexpectedly.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 MsgWaitForMultipleObjects(0, NULL, TRUE, 1000, QS_ALLINPUT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2629 // If the server has died, give up
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 if (!IsWindow(server))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 serverProcessPendingMessages();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 * Process any messages in the Windows message queue.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 serverProcessPendingMessages(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 MSG msg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647
27283
b4d92a69035b patch 8.2.4170: MS-Windows: still using old message API calls
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
2648 while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 TranslateMessage(&msg);
27283
b4d92a69035b patch 8.2.4170: MS-Windows: still using old message API calls
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
2651 DispatchMessageW(&msg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2655 #endif // FEAT_CLIENTSERVER
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 #if defined(FEAT_GUI) || (defined(FEAT_PRINTER) && !defined(FEAT_POSTSCRIPT)) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 struct charset_pair
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662 char *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 BYTE charset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 static struct charset_pair
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 charset_pairs[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 {"ANSI", ANSI_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 {"CHINESEBIG5", CHINESEBIG5_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 {"DEFAULT", DEFAULT_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 {"HANGEUL", HANGEUL_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 {"OEM", OEM_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 {"SHIFTJIS", SHIFTJIS_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 {"SYMBOL", SYMBOL_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 {"ARABIC", ARABIC_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 {"BALTIC", BALTIC_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 {"EASTEUROPE", EASTEUROPE_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 {"GB2312", GB2312_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 {"GREEK", GREEK_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 {"HEBREW", HEBREW_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 {"JOHAB", JOHAB_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 {"MAC", MAC_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 {"RUSSIAN", RUSSIAN_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 {"THAI", THAI_CHARSET},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 {"TURKISH", TURKISH_CHARSET},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2687 # ifdef VIETNAMESE_CHARSET
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 {"VIETNAMESE", VIETNAMESE_CHARSET},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2689 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 {NULL, 0}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2693 struct quality_pair
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2694 {
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2695 char *name;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2696 DWORD quality;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2697 };
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2698
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2699 static struct quality_pair
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2700 quality_pairs[] = {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2701 # ifdef CLEARTYPE_QUALITY
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2702 {"CLEARTYPE", CLEARTYPE_QUALITY},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2703 # endif
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2704 # ifdef ANTIALIASED_QUALITY
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2705 {"ANTIALIASED", ANTIALIASED_QUALITY},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2706 # endif
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2707 # ifdef NONANTIALIASED_QUALITY
9091
294cfd18e9c7 commit https://github.com/vim/vim/commit/73a733e08bb7853d2ac12c60756ae51e39abb4d9
Christian Brabandt <cb@256bit.org>
parents: 8843
diff changeset
2708 {"NONANTIALIASED", NONANTIALIASED_QUALITY},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2709 # endif
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2710 # ifdef PROOF_QUALITY
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2711 {"PROOF", PROOF_QUALITY},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2712 # endif
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2713 # ifdef DRAFT_QUALITY
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2714 {"DRAFT", DRAFT_QUALITY},
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2715 # endif
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2716 {"DEFAULT", DEFAULT_QUALITY},
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2717 {NULL, 0}
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2718 };
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2719
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 * Convert a charset ID to a name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 * Return NULL when not recognized.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 char *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 charset_id2name(int id)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 struct charset_pair *cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 for (cp = charset_pairs; cp->name != NULL; ++cp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 if ((BYTE)id == cp->charset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732 return cp->name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2735 /*
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2736 * Convert a quality ID to a name.
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2737 * Return NULL when not recognized.
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2738 */
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2739 char *
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2740 quality_id2name(DWORD id)
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2741 {
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2742 struct quality_pair *qp;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2743
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2744 for (qp = quality_pairs; qp->name != NULL; ++qp)
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2745 if (id == qp->quality)
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2746 break;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2747 return qp->name;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2748 }
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
2749
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2750 static const LOGFONTW s_lfDefault =
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE,
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2755 L"Fixedsys" // see _ReadVimIni
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757
16451
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2758 // Initialise the "current height" to -12 (same as s_lfDefault) just
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2759 // in case the user specifies a font in "guifont" with no size before a font
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2760 // with an explicit size has been set. This defaults the size to this value
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2761 // (-12 equates to roughly 9pt).
7ae2396cef62 patch 8.1.1230: a lot of code is shared between vim.exe and gvim.exe
Bram Moolenaar <Bram@vim.org>
parents: 16439
diff changeset
2762 int current_font_height = -12; // also used in gui_w32.c
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2764 /*
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2765 * Convert a string representing a point size into pixels. The string should
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 * be a positive decimal number, with an optional decimal point (eg, "12", or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 * "10.5"). The pixel value is returned, and a pointer to the next unconverted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 * character is stored in *end. The flag "vertical" says whether this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 * calculation is for a vertical (height) size or a horizontal (width) one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 static int
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2772 points_to_pixels(WCHAR *str, WCHAR **end, int vertical, long_i pprinter_dc)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 int pixels;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 int points = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 int divisor = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 HWND hwnd = (HWND)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 HDC hdc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 HDC printer_dc = (HDC)pprinter_dc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 while (*str != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2783 if (*str == L'.' && divisor == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2785 // Start keeping a divisor, for later
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 divisor = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 if (!VIM_ISDIGIT(*str))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 points *= 10;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2794 points += *str - L'0';
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 divisor *= 10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 ++str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 if (divisor == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 divisor = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 if (printer_dc == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 hwnd = GetDesktopWindow();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 hdc = GetWindowDC(hwnd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 hdc = printer_dc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 pixels = MulDiv(points,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 GetDeviceCaps(hdc, vertical ? LOGPIXELSY : LOGPIXELSX),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 72 * divisor);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 if (printer_dc == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 ReleaseDC(hwnd, hdc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 *end = str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 return pixels;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 static int CALLBACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 font_enumproc(
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2824 ENUMLOGFONTW *elf,
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2825 NEWTEXTMETRICW *ntm UNUSED,
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2826 DWORD type UNUSED,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 LPARAM lparam)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 {
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2829 // Return value:
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2830 // 0 = terminate now (monospace & ANSI)
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2831 // 1 = continue, still no luck...
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2832 // 2 = continue, but we have an acceptable LOGFONTW
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2833 // (monospace, not ANSI)
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2834 // We use these values, as EnumFontFamilies returns 1 if the
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2835 // callback function is never called. So, we check the return as
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2836 // 0 = perfect, 2 = OK, 1 = no good...
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2837 // It's not pretty, but it works!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2839 LOGFONTW *lf = (LOGFONTW *)(lparam);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2841 # ifndef FEAT_PROPORTIONAL_FONTS
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2842 // Ignore non-monospace fonts without further ado
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 if ((ntm->tmPitchAndFamily & 1) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 return 1;
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2845 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2847 // Remember this LOGFONTW as a "possible"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 *lf = elf->elfLogFont;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2850 // Terminate the scan as soon as we find an ANSI font
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 if (lf->lfCharSet == ANSI_CHARSET
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 || lf->lfCharSet == OEM_CHARSET
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 || lf->lfCharSet == DEFAULT_CHARSET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2856 // Continue the scan - we have a non-ANSI font
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 return 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 static int
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2861 init_logfont(LOGFONTW *lf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 HWND hwnd = GetDesktopWindow();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 HDC hdc = GetWindowDC(hwnd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2867 n = EnumFontFamiliesW(hdc,
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2868 lf->lfFaceName,
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2869 (FONTENUMPROCW)font_enumproc,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 (LPARAM)lf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 ReleaseDC(hwnd, hdc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2874 // If we couldn't find a usable font, return failure
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 if (n == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2878 // Tidy up the rest of the LOGFONTW structure. We set to a basic
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2879 // font - get_logfont() sets bold, italic, etc based on the user's
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2880 // input.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 lf->lfHeight = current_font_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 lf->lfWidth = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 lf->lfItalic = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 lf->lfUnderline = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 lf->lfStrikeOut = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 lf->lfWeight = FW_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2888 // Return success
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2892 /*
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2893 * Compare a UTF-16 string and an ASCII string literally.
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2894 * Only works all the code points are inside ASCII range.
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2895 */
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2896 static int
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2897 utf16ascncmp(const WCHAR *w, const char *p, size_t n)
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2898 {
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2899 size_t i;
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2900
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2901 for (i = 0; i < n; i++)
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2902 {
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2903 if (w[i] == 0 || w[i] != p[i])
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2904 return w[i] - p[i];
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2905 }
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2906 return 0;
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2907 }
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2908
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2909 /*
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2910 * Get font info from "name" into logfont "lf".
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2911 * Return OK for a valid name, FAIL otherwise.
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2912 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 get_logfont(
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2915 LOGFONTW *lf,
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2916 char_u *name,
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2917 HDC printer_dc,
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2918 int verbose)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2920 WCHAR *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 int i;
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
2922 int ret = FAIL;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2923 static LOGFONTW *lastlf = NULL;
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2924 WCHAR *wname;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 *lf = s_lfDefault;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 if (name == NULL)
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
2928 return OK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2930 wname = enc_to_utf16(name, NULL);
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2931 if (wname == NULL)
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2932 return FAIL;
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2933
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2934 if (wcscmp(wname, L"*") == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 {
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2936 # if defined(FEAT_GUI_MSWIN)
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2937 CHOOSEFONTW cf;
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2938 // if name is "*", bring up std font dialog:
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 19131
diff changeset
2939 CLEAR_FIELD(cf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 cf.lStructSize = sizeof(cf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 cf.hwndOwner = s_hwnd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 cf.Flags = CF_SCREENFONTS | CF_FIXEDPITCHONLY | CF_INITTOLOGFONTSTRUCT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 if (lastlf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 *lf = *lastlf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 cf.lpLogFont = lf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 cf.nFontType = 0 ; //REGULAR_FONTTYPE;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2947 if (ChooseFontW(&cf))
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
2948 ret = OK;
18773
38a3bef525e6 patch 8.1.2376: preprocessor indents are incorrect
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2949 # endif
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
2950 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 * Split name up, it could be <name>:h<height>:w<width> etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 */
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2956 for (p = wname; *p && *p != L':'; p++)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2958 if (p - wname + 1 >= LF_FACESIZE)
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2959 goto theend; // Name too long
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2960 lf->lfFaceName[p - wname] = *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 }
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2962 if (p != wname)
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2963 lf->lfFaceName[p - wname] = NUL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2965 // First set defaults
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 lf->lfHeight = -12;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 lf->lfWidth = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 lf->lfWeight = FW_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 lf->lfItalic = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 lf->lfUnderline = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 lf->lfStrikeOut = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 * If the font can't be found, try replacing '_' by ' '.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 if (init_logfont(lf) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 int did_replace = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 for (i = 0; lf->lfFaceName[i]; ++i)
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2981 if (lf->lfFaceName[i] == L'_')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2983 lf->lfFaceName[i] = L' ';
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 did_replace = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 if (!did_replace || init_logfont(lf) == FAIL)
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
2987 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2990 while (*p == L':')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
2993 // Set the values found after ':'
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 while (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 switch (*p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
2998 case L'h':
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
2999 lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3001 case L'w':
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 835
diff changeset
3002 lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 break;
16439
9d20e26dc13c patch 8.1.1224: MS-Windows: cannot specify font weight
Bram Moolenaar <Bram@vim.org>
parents: 16354
diff changeset
3004 case L'W':
9d20e26dc13c patch 8.1.1224: MS-Windows: cannot specify font weight
Bram Moolenaar <Bram@vim.org>
parents: 16354
diff changeset
3005 lf->lfWeight = wcstol(p, &p, 10);
9d20e26dc13c patch 8.1.1224: MS-Windows: cannot specify font weight
Bram Moolenaar <Bram@vim.org>
parents: 16354
diff changeset
3006 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3007 case L'b':
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 lf->lfWeight = FW_BOLD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3010 case L'i':
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 lf->lfItalic = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3013 case L'u':
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014 lf->lfUnderline = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3016 case L's':
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 lf->lfStrikeOut = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 break;
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3019 case L'c':
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 struct charset_pair *cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 for (cp = charset_pairs; cp->name != NULL; ++cp)
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3024 if (utf16ascncmp(p, cp->name, strlen(cp->name)) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 lf->lfCharSet = cp->charset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027 p += strlen(cp->name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3029 }
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
3030 if (cp->name == NULL && verbose)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3032 char_u *s = utf16_to_enc(p, NULL);
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3033
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3034 semsg(_(e_illegal_str_name_str_in_font_name_str),
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3035 "charset", s, name);
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3036 vim_free(s);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 }
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3041 case L'q':
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3042 {
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3043 struct quality_pair *qp;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3044
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3045 for (qp = quality_pairs; qp->name != NULL; ++qp)
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3046 if (utf16ascncmp(p, qp->name, strlen(qp->name)) == 0)
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3047 {
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3048 lf->lfQuality = qp->quality;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3049 p += strlen(qp->name);
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3050 break;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3051 }
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3052 if (qp->name == NULL && verbose)
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3053 {
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3054 char_u *s = utf16_to_enc(p, NULL);
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3055 semsg(_(e_illegal_str_name_str_in_font_name_str),
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3056 "quality", s, name);
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3057 vim_free(s);
8835
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3058 break;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3059 }
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3060 break;
c1a5623cfc86 commit https://github.com/vim/vim/commit/7c1c6dbb6817640fd3956a0d5417da23fde336d8
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
3061 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 default:
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 26
diff changeset
3063 if (verbose)
26893
79c76ca2c53c patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
3064 semsg(_(e_illegal_char_nr_in_font_name_str), p[-1], name);
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3065 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 }
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3067 while (*p == L':')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 }
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3070 ret = OK;
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3071
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 theend:
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
3073 // ron: init lastlf
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3074 if (ret == OK && printer_dc == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 vim_free(lastlf);
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16768
diff changeset
3077 lastlf = ALLOC_ONE(LOGFONTW);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 if (lastlf != NULL)
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3079 mch_memmove(lastlf, lf, sizeof(LOGFONTW));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 }
16152
8f4eccaaf2c0 patch 8.1.1081: MS-Windows: cannot use some fonts
Bram Moolenaar <Bram@vim.org>
parents: 15868
diff changeset
3081 vim_free(wname);
5714
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3082
22d7af9ff3e5 updated for version 7.4.202
Bram Moolenaar <bram@vim.org>
parents: 5657
diff changeset
3083 return ret;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085
18810
44b855153d8e patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18773
diff changeset
3086 #endif // defined(FEAT_GUI) || defined(FEAT_PRINTER)
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3087
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8140
diff changeset
3088 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3089 /*
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3090 * Initialize the Winsock dll.
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3091 */
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3092 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7797
diff changeset
3093 channel_init_winsock(void)
7797
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3094 {
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3095 WSADATA wsaData;
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3096 int wsaerr;
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3097
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3098 if (WSInitialized)
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3099 return;
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3100
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3101 wsaerr = WSAStartup(MAKEWORD(2, 2), &wsaData);
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3102 if (wsaerr == 0)
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3103 WSInitialized = TRUE;
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3104 }
0d46cea25641 commit https://github.com/vim/vim/commit/f12d983deab06b0408781d7a6c2f8970d765b723
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
3105 #endif