1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
12 * Win16 (Windows 3.1x) system-dependent routines.
13 * Carved brutally from os_win32.c by Vince Negri <vn@aslnet.co.uk>
28 #include <sys/types.h>
36 #include <shellapi.h> /* required for FindExecutable() */
39 /* Record all output and all keyboard & mouse input */
40 /* #define MCH_WRITE_DUMP */
48 * When generating prototypes for Win32 on Unix, these lines make the syntax
49 * errors disappear. They do not need to be correct.
53 typedef int SMALL_RECT
;
61 typedef int KEY_EVENT_RECORD
;
62 typedef int MOUSE_EVENT_RECORD
;
64 typedef int CONSOLE_CURSOR_INFO
;
65 typedef char * LPCSTR
;
67 typedef int INPUT_RECORD
;
72 /* being a more ANSI compliant compiler, BorlandC doesn't define _stricoll:
73 * but it does in BC 5.02! */
74 # if __BORLANDC__ < 0x502
75 int _stricoll(char *a
, char *b
);
79 /* cproto doesn't create a prototype for main() */
82 __ARGS((int argc
, char **argv
));
83 static int (_cdecl
*pmain
)(int, char **);
86 void _cdecl
SaveInst(HINSTANCE hInst
);
87 static void (_cdecl
*pSaveInst
)(HINSTANCE
);
102 * Ron: added full path name so that the $VIM variable will get set to our
103 * startup path (so the .vimrc file can be found w/o a VIM env. var.)
104 * Remove the ".exe" extension, and find the 1st non-space.
106 GetModuleFileName(hInstance
, prog
, 255);
108 exe_name
= FullName_save((char_u
*)prog
, FALSE
);
110 /* Separate the command line into arguments. */
111 argc
= get_cmd_args(prog
, (char *)lpszCmdLine
, &argv
, &tofree
);
118 pSaveInst
= SaveInst
;
120 pSaveInst(hInstance
);
139 * For the GUI the mouse handling is in gui_w32.c.
146 #endif /* FEAT_MOUSE */
151 * GUI version of mch_init().
159 /* Let critical errors result in a failure, not in a dialog box. Required
160 * for the timestamp test to work on removed floppies. */
161 SetErrorMode(SEM_FAILCRITICALERRORS
);
163 _fmode
= O_BINARY
; /* we do our own CR-LF translation */
165 /* Specify window size. Is there a place to get the default from? */
170 set_option_value((char_u
*)"grepprg", 0, (char_u
*)"grep -n", 0);
172 #ifdef FEAT_CLIPBOARD
176 * Vim's own clipboard format recognises whether the text is char, line,
177 * or rectangular block. Only useful for copying between two Vims.
178 * "VimClipboard" was used for previous versions, using the first
179 * character to specify MCHAR, MLINE or MBLOCK.
181 clip_star
.format
= RegisterClipboardFormat("VimClipboard2");
182 clip_star
.format_raw
= RegisterClipboardFormat("VimRawBytes");
189 * Do we have an interactive window?
198 return OK
; /* GUI always has a tty */
208 return (long)GetCurrentTask();
213 * Specialised version of system().
214 * This version proceeds as follows:
215 * 1. Start the program with WinExec
216 * 2. Wait for the module use count of the program to go to 0
217 * (This is the best way of detecting the program has finished)
221 mch_system(char *cmd
, int options
)
230 * It's nicer to run a filter command in a minimized window, but in
232 if (options
& SHELL_DOOUT
)
233 wShowWindow
= SW_SHOWMINIMIZED
;
235 wShowWindow
= SW_SHOWNORMAL
;
237 /* Now, run the command */
238 h_module
= WinExec((LPCSTR
)cmd
, wShowWindow
);
247 /* Wait for the command to terminate before continuing */
248 while (GetModuleUsage((HINSTANCE
)h_module
) > 0 && again
)
250 while( PeekMessage( &msg
, NULL
, 0, 0, PM_REMOVE
) && again
)
252 if(msg
.message
== WM_QUIT
)
255 PostQuitMessage(msg
.wParam
);
258 TranslateMessage(&msg
);
259 DispatchMessage(&msg
);
268 * Either execute a command by calling the shell or start a new shell
273 int options
) /* SHELL_, see vim.h */
276 int tmode
= cur_tmode
;
281 #ifdef MCH_WRITE_DUMP
284 fprintf(fdDump
, "mch_call_shell(\"%s\", %d)\n", cmd
, options
);
290 * Catch all deadly signals while running the external command, because a
291 * CTRL-C, Ctrl-Break or illegal instruction might otherwise kill us.
293 signal(SIGINT
, SIG_IGN
);
294 signal(SIGILL
, SIG_IGN
);
295 signal(SIGFPE
, SIG_IGN
);
296 signal(SIGSEGV
, SIG_IGN
);
297 signal(SIGTERM
, SIG_IGN
);
298 signal(SIGABRT
, SIG_IGN
);
300 if (options
& SHELL_COOKED
)
301 settmode(TMODE_COOK
); /* set to normal mode */
305 x
= mch_system(p_sh
, options
);
309 /* we use "command" or "cmd" to start the shell; slow but easy */
313 STRLEN(p_sh
) + STRLEN(p_shcf
) + STRLEN(cmd
) + 10, TRUE
);
316 if (STRNICMP(cmd
, "start ", 6) == 0)
318 sprintf((char *)newcmd
, "%s\0", cmd
+6);
319 if (WinExec((LPCSTR
)newcmd
, SW_SHOWNORMAL
) > 31)
326 sprintf((char *)newcmd
, "%s%s %s %s",
331 x
= mch_system((char *)newcmd
, options
);
337 if (tmode
== TMODE_RAW
)
338 settmode(TMODE_RAW
); /* set to raw mode */
340 if (x
&& !(options
& SHELL_SILENT
) && !emsg_silent
)
342 smsg(_("shell returned %d"), x
);
349 signal(SIGINT
, SIG_DFL
);
350 signal(SIGILL
, SIG_DFL
);
351 signal(SIGFPE
, SIG_DFL
);
352 signal(SIGSEGV
, SIG_DFL
);
353 signal(SIGTERM
, SIG_DFL
);
354 signal(SIGABRT
, SIG_DFL
);
362 * Delay for half a second.
370 Sleep((int)msec
); /* never wait for input */
376 * check for an "interrupt signal": CTRL-break or CTRL-C
386 * How much memory is available?
392 return GetFreeSpace(0);
397 * Like rename(), returns 0 upon success, non-zero upon failure.
398 * Should probably set errno appropriately when errors occur.
402 const char *pszOldFile
,
403 const char *pszNewFile
)
407 * No need to play tricks, this isn't rubbish like Windows 95 <g>
409 return rename(pszOldFile
, pszNewFile
);
414 * Get the default shell for the current hardware platform