From 3fdfa4a9a52ab3d1a790262ee872a49853ad4626 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 7 Oct 2004 21:02:47 +0000 Subject: updated for version 7.0017 --- src/os_win32.c | 327 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 238 insertions(+), 89 deletions(-) (limited to 'src/os_win32.c') diff --git a/src/os_win32.c b/src/os_win32.c index bc6c7d4fd..fce48f9fc 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -92,6 +92,7 @@ FILE* fdDump = NULL; #define WINAPI #define WINBASEAPI typedef char * LPCSTR; +typedef char * LPWSTR; typedef int ACCESS_MASK; typedef int BOOL; typedef int COLORREF; @@ -301,19 +302,19 @@ dyn_libintl_end() } static char * -null_libintl_gettext(const char* msgid) +null_libintl_gettext(const char *msgid) { return (char*)msgid; } static char * -null_libintl_bindtextdomain(const char* domainname, const char* dirname) +null_libintl_bindtextdomain(const char *domainname, const char *dirname) { return NULL; } static char * -null_libintl_textdomain(const char* domainname) +null_libintl_textdomain(const char *domainname) { return NULL; } @@ -530,7 +531,7 @@ const static struct __stdcall #endif win32_kbd_patch_key( - KEY_EVENT_RECORD* pker) + KEY_EVENT_RECORD *pker) { UINT uMods = pker->dwControlKeyState; static int s_iIsDead = 0; @@ -734,8 +735,7 @@ decode_key_event( */ # ifdef FEAT_GUI_W32 void -mch_setmouse( - int on) +mch_setmouse(int on) { } # else @@ -749,8 +749,7 @@ static int g_yMouse; /* mouse y coordinate */ * Enable or disable mouse input */ void -mch_setmouse( - int on) +mch_setmouse(int on) { DWORD cmodein; @@ -798,7 +797,7 @@ mch_setmouse( */ static BOOL decode_mouse_event( - MOUSE_EVENT_RECORD* pmer) + MOUSE_EVENT_RECORD *pmer) { static int s_nOldButton = -1; static int s_nOldMouseClick = -1; @@ -1214,7 +1213,7 @@ WaitForChar(long msec) * return non-zero if a character is available */ int -mch_char_avail() +mch_char_avail(void) { return WaitForChar(0L); } @@ -1579,7 +1578,7 @@ executable_exists(char *name) * GUI version of mch_init(). */ void -mch_init() +mch_init(void) { #ifndef __MINGW32__ extern int _fmode; @@ -1746,10 +1745,10 @@ FitConsoleWindow( typedef struct ConsoleBufferStruct { - BOOL IsValid; - CONSOLE_SCREEN_BUFFER_INFO Info; - PCHAR_INFO Buffer; - COORD BufferSize; + BOOL IsValid; + CONSOLE_SCREEN_BUFFER_INFO Info; + PCHAR_INFO Buffer; + COORD BufferSize; } ConsoleBuffer; /* @@ -1853,8 +1852,8 @@ SaveConsoleBuffer( */ static BOOL RestoreConsoleBuffer( - ConsoleBuffer *cb, - BOOL RestoreScreen) + ConsoleBuffer *cb, + BOOL RestoreScreen) { COORD BufferCoord; SMALL_RECT WriteRegion; @@ -1949,23 +1948,19 @@ static BOOL g_fCanChangeIcon = FALSE; */ static BOOL GetConsoleIcon( - HWND hWnd, - HICON *phIconSmall, - HICON *phIcon) + HWND hWnd, + HICON *phIconSmall, + HICON *phIcon) { if (hWnd == NULL) return FALSE; if (phIconSmall != NULL) - { - *phIconSmall = (HICON) SendMessage(hWnd, WM_GETICON, - (WPARAM) ICON_SMALL, (LPARAM) 0); - } + *phIconSmall = (HICON)SendMessage(hWnd, WM_GETICON, + (WPARAM)ICON_SMALL, (LPARAM)0); if (phIcon != NULL) - { - *phIcon = (HICON) SendMessage(hWnd, WM_GETICON, - (WPARAM) ICON_BIG, (LPARAM) 0); - } + *phIcon = (HICON)SendMessage(hWnd, WM_GETICON, + (WPARAM)ICON_BIG, (LPARAM)0); return TRUE; } @@ -1979,26 +1974,22 @@ GetConsoleIcon( */ static BOOL SetConsoleIcon( - HWND hWnd, - HICON hIconSmall, - HICON hIcon) + HWND hWnd, + HICON hIconSmall, + HICON hIcon) { - HICON hPrevIconSmall; - HICON hPrevIcon; + HICON hPrevIconSmall; + HICON hPrevIcon; if (hWnd == NULL) return FALSE; if (hIconSmall != NULL) - { - hPrevIconSmall = (HICON) SendMessage(hWnd, WM_SETICON, - (WPARAM) ICON_SMALL, (LPARAM) hIconSmall); - } + hPrevIconSmall = (HICON)SendMessage(hWnd, WM_SETICON, + (WPARAM)ICON_SMALL, (LPARAM)hIconSmall); if (hIcon != NULL) - { - hPrevIcon = (HICON) SendMessage(hWnd, WM_SETICON, - (WPARAM) ICON_BIG, (LPARAM) hIcon); - } + hPrevIcon = (HICON)SendMessage(hWnd, WM_SETICON, + (WPARAM)ICON_BIG,(LPARAM) hIcon); return TRUE; } @@ -2059,7 +2050,7 @@ static DWORD g_cmodeout = 0; * non-GUI version of mch_init(). */ void -mch_init() +mch_init(void) { #ifndef FEAT_RESTORE_ORIG_SCREEN CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -2341,8 +2332,8 @@ fname_case( */ int mch_get_user_name( - char_u *s, - int len) + char_u *s, + int len) { char szUserName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD cch = sizeof szUserName; @@ -2379,7 +2370,7 @@ mch_get_host_name( * return process ID */ long -mch_get_pid() +mch_get_pid(void) { return (long)GetCurrentProcessId(); } @@ -2429,8 +2420,7 @@ mch_dirname( * else FILE_ATTRIBUTE_* defined in winnt.h */ long -mch_getperm( - char_u *name) +mch_getperm(char_u *name) { #ifdef FEAT_MBYTE if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) @@ -2457,8 +2447,8 @@ mch_getperm( */ int mch_setperm( - char_u *name, - long perm) + char_u *name, + long perm) { perm |= FILE_ATTRIBUTE_ARCHIVE; /* file has changed, set archive bit */ #ifdef FEAT_MBYTE @@ -2656,8 +2646,7 @@ struct my_acl * Return NULL if the ACL is not available for whatever reason. */ vim_acl_T -mch_get_acl(fname) - char_u *fname; +mch_get_acl(char_u *fname) { #ifndef HAVE_ACL return (vim_acl_T)NULL; @@ -2701,9 +2690,7 @@ mch_get_acl(fname) * This must only be called with "acl" equal to what mch_get_acl() returned. */ void -mch_set_acl(fname, acl) - char_u *fname; - vim_acl_T acl; +mch_set_acl(char_u *fname, vim_acl_T acl) { #ifdef HAVE_ACL struct my_acl *p = (struct my_acl *)acl; @@ -2726,8 +2713,7 @@ mch_set_acl(fname, acl) } void -mch_free_acl(acl) - vim_acl_T acl; +mch_free_acl(vim_acl_T acl) { #ifdef HAVE_ACL struct my_acl *p = (struct my_acl *)acl; @@ -2791,8 +2777,7 @@ handler_routine( * set the tty in (raw) ? "raw" : "cooked" mode */ void -mch_settmode( - int tmode) +mch_settmode(int tmode) { DWORD cmodein; DWORD cmodeout; @@ -2840,7 +2825,7 @@ mch_settmode( * Return OK when size could be determined, FAIL otherwise. */ int -mch_get_shellsize() +mch_get_shellsize(void) { CONSOLE_SCREEN_BUFFER_INFO csbi; @@ -2873,9 +2858,9 @@ mch_get_shellsize() */ static void ResizeConBufAndWindow( - HANDLE hConsole, - int xSize, - int ySize) + HANDLE hConsole, + int xSize, + int ySize) { CONSOLE_SCREEN_BUFFER_INFO csbi; /* hold current console buffer info */ SMALL_RECT srWindowRect; /* hold the new console size */ @@ -2955,7 +2940,7 @@ ResizeConBufAndWindow( * Set the console window to `Rows' * `Columns' */ void -mch_set_shellsize() +mch_set_shellsize(void) { COORD coordScreen; @@ -2984,7 +2969,7 @@ mch_set_shellsize() * Rows and/or Columns has changed. */ void -mch_new_shellsize() +mch_new_shellsize(void) { set_scroll_region(0, 0, Columns - 1, Rows - 1); } @@ -2994,7 +2979,7 @@ mch_new_shellsize() * Called when started up, to set the winsize that was delayed. */ void -mch_set_winsize_now() +mch_set_winsize_now(void) { if (suppress_winsize == 2) { @@ -3134,8 +3119,8 @@ mch_system(char *cmd, int options) */ int mch_call_shell( - char_u *cmd, - int options) /* SHELL_*, see vim.h */ + char_u *cmd, + int options) /* SHELL_*, see vim.h */ { int x = 0; int tmode = cur_tmode; @@ -3510,8 +3495,7 @@ clear_to_end_of_line(void) * Scroll the scroll region up by `cLines' lines */ static void -scroll( - unsigned cLines) +scroll(unsigned cLines) { COORD oldcoord = g_coord; @@ -3549,8 +3533,7 @@ set_scroll_region( * Insert `cLines' lines at the current cursor position */ static void -insert_lines( - unsigned cLines) +insert_lines(unsigned cLines) { SMALL_RECT source; COORD dest; @@ -3591,8 +3574,7 @@ insert_lines( * Delete `cLines' lines at the current cursor position */ static void -delete_lines( - unsigned cLines) +delete_lines(unsigned cLines) { SMALL_RECT source; COORD dest; @@ -3655,8 +3637,7 @@ gotoxy( * See ../doc/os_win32.txt for the numbers. */ static void -textattr( - WORD wAttr) +textattr(WORD wAttr) { g_attrCurrent = wAttr; @@ -3665,8 +3646,7 @@ textattr( static void -textcolor( - WORD wAttr) +textcolor(WORD wAttr) { g_attrCurrent = (g_attrCurrent & 0xf0) + wAttr; @@ -3675,8 +3655,7 @@ textcolor( static void -textbackground( - WORD wAttr) +textbackground(WORD wAttr) { g_attrCurrent = (g_attrCurrent & 0x0f) + (wAttr << 4); @@ -3688,7 +3667,7 @@ textbackground( * restore the default text attribute (whatever we started with) */ static void -normvideo() +normvideo(void) { textattr(g_attrDefault); } @@ -3711,7 +3690,7 @@ standout(void) * Turn off standout mode */ static void -standend() +standend(void) { if (g_attrPreStandout) { @@ -3725,7 +3704,7 @@ standend() * Set normal fg/bg color, based on T_ME. Called whem t_me has been set. */ void -mch_set_normal_colors() +mch_set_normal_colors(void) { char_u *p; int n; @@ -3749,7 +3728,7 @@ mch_set_normal_colors() * visual bell: flash the screen */ static void -visual_bell() +visual_bell(void) { COORD coordOrigin = {0, 0}; WORD attrFlash = ~g_attrCurrent & 0xff; @@ -3775,8 +3754,7 @@ visual_bell() * Make the cursor visible or invisible */ static void -cursor_visible( - BOOL fVisible) +cursor_visible(BOOL fVisible) { s_cursor_visible = fVisible; #ifdef MCH_CURSOR_SHAPE @@ -4178,7 +4156,7 @@ mch_remove(char_u *name) * check for an "interrupt signal": CTRL-break or CTRL-C */ void -mch_breakcheck() +mch_breakcheck(void) { #ifndef FEAT_GUI_W32 /* never used */ if (g_fCtrlCPressed || g_fCBrkPressed) @@ -4195,8 +4173,7 @@ mch_breakcheck() * Return sum of available physical and page file memory. */ long_u -mch_avail_mem( - int special) +mch_avail_mem(int special) { MEMORYSTATUS ms; @@ -4382,7 +4359,7 @@ mch_rename( * Get the default shell for the current hardware platform */ char * -default_shell() +default_shell(void) { char* psz = NULL; @@ -4867,5 +4844,177 @@ myresetstkoflw(void) return 1; } +#endif + + +#if defined(FEAT_MBYTE) || defined(PROTO) +/* + * The command line arguments in UCS2 + */ +static DWORD nArgsW = 0; +static LPWSTR *ArglistW = NULL; +static int global_argc = 0; +static char **global_argv; + +static int used_file_argc = 0; /* last argument in global_argv[] used + for the argument list. */ +static int *used_file_indexes = NULL; /* indexes in global_argv[] for + command line arguments added to + the argument list */ +static int used_file_count = 0; /* nr of entries in used_file_indexes */ +static int used_file_literal = FALSE; /* take file names literally */ +static int used_file_full_path = FALSE; /* file name was full path */ +static int used_alist_count = 0; + + +/* + * Get the command line arguments. Unicode version. + * Returns argc. Zero when something fails. + */ + int +get_cmd_argsW(char ***argvp) +{ + char **argv = NULL; + int argc = 0; + int i; + + ArglistW = CommandLineToArgvW(GetCommandLineW(), &nArgsW); + if (ArglistW != NULL) + { + argv = malloc((nArgsW + 1) * sizeof(char *)); + if (argv != NULL) + { + argc = nArgsW; + argv[argc] = NULL; + for (i = 0; i < argc; ++i) + { + int len; + + /* Convert each Unicode argument to the current codepage. */ + WideCharToMultiByte_alloc(GetACP(), 0, + ArglistW[i], wcslen(ArglistW[i]) + 1, + (LPSTR *)&argv[i], &len, 0, 0); + if (argv[i] == NULL) + { + /* Out of memory, clear everything. */ + while (i > 0) + free(argv[--i]); + free(argv); + argc = 0; + } + } + } + } + + global_argc = argc; + global_argv = argv; + if (argc > 0) + used_file_indexes = malloc(argc * sizeof(int)); + + if (argvp != NULL) + *argvp = argv; + return argc; +} + + void +free_cmd_argsW(void) +{ + if (ArglistW != NULL) + { + GlobalFree(ArglistW); + ArglistW = NULL; + } +} + +/* + * Remember "name" is an argument that was added to the argument list. + * This avoids that we have to re-parse the argument list when fix_arg_enc() + * is called. + */ + void +used_file_arg(char *name, int literal, int full_path) +{ + int i; + + if (used_file_indexes == NULL) + return; + for (i = used_file_argc + 1; i < global_argc; ++i) + if (STRCMP(global_argv[i], name) == 0) + { + used_file_argc = i; + used_file_indexes[used_file_count++] = i; + break; + } + used_file_literal = literal; + used_file_full_path = full_path; +} + +/* + * Remember the length of the argument list as it was. If it changes then we + * leave it alone when 'encoding' is set. + */ + void +set_alist_count(void) +{ + used_alist_count = GARGCOUNT; +} +/* + * Fix the encoding of the command line arguments. Invoked when 'encoding' + * has been changed while starting up. Use the UCS-2 command line arguments + * and convert them to 'encoding'. + */ + void +fix_arg_enc(void) +{ + int i; + int idx; + char_u *str; + + /* Safety checks: + * - if argument count differs between the wide and non-wide argument + * list, something must be wrong. + * - the file name arguments must have been located. + * - the length of the argument list wasn't changed by the user. + */ + if (global_argc != (int)nArgsW + || ArglistW == NULL + || used_file_indexes == NULL + || used_file_count == 0 + || used_alist_count != GARGCOUNT) + return; + + /* Clear the argument list. Make room for the new arguments. */ + alist_clear(&global_alist); + if (ga_grow(&global_alist.al_ga, used_file_count) == FAIL) + return; /* out of memory */ + + for (i = 0; i < used_file_count; ++i) + { + idx = used_file_indexes[i]; + str = ucs2_to_enc(ArglistW[idx], NULL); + if (str != NULL) + alist_add(&global_alist, str, used_file_literal ? 2 : 0); + } + + if (!used_file_literal) + { + /* Now expand wildcards in the arguments. */ + /* Temporarily add '(' and ')' to 'isfname'. These are valid + * filename characters but are excluded from 'isfname' to make + * "gf" work on a file name in parenthesis (e.g.: see vim.h). */ + do_cmdline_cmd((char_u *)":let SaVe_ISF = &isf|set isf+=(,)"); + alist_expand(); + do_cmdline_cmd((char_u *)":let &isf = SaVe_ISF|unlet SaVe_ISF"); + } + + /* If wildcard expansion failed, we are editing the first file of the + * arglist and there is no file name: Edit the first argument now. */ + if (curwin->w_arg_idx == 0 && curbuf->b_fname == NULL) + { + do_cmdline_cmd((char_u *)":rewind"); + if (GARGCOUNT == 1 && used_file_full_path) + (void)vim_chdirfile(alist_name(&GARGLIST[0])); + } +} #endif -- cgit v1.2.1