1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
4 * OS/2 port by Paul Slootman
5 * VMS merge by Zoltan Arpadffy
7 * Do ":help uganda" in Vim to read copying and usage conditions.
8 * Do ":help credits" in Vim to see a list of people who contributed.
9 * See README.txt for an overview of the Vim source code.
13 * os_unix.c -- code for all flavors of Unix (BSD, SYSV, SVR4, POSIX, ...)
14 * Also for OS/2, using the excellent EMX package!!!
15 * Also for BeOS and Atari MiNT.
17 * A lot of this file was originally written by Juergen Weigert and later
18 * changed beyond recognition.
22 * Some systems have a prototype for select() that has (int *) instead of
23 * (fd_set *), which is wrong. This define removes that prototype. We define
24 * our own prototype below.
25 * Don't use it for the Mac, it causes a warning for precompiled headers.
26 * TODO: use a configure check for precompiled headers?
28 #if !defined(__APPLE__) && !defined(__TANDEM)
29 # define select select_declared_wrong
35 # include "if_mzsch.h"
38 #include "os_unixx.h" /* unix includes for os_unix.c only */
41 # include <X11/SM/SMlib.h>
45 # include <selinux/selinux.h>
46 static int selinux_enabled
= -1;
50 * Use this prototype for select, some include files have a wrong prototype
55 # define select beos_select
61 # include <sys/cygwin.h> /* for cygwin_conv_to_posix_path() */
65 #if defined(HAVE_SELECT)
66 extern int select
__ARGS((int, fd_set
*, fd_set
*, fd_set
*, struct timeval
*));
71 /* <linux/keyboard.h> contains defines conflicting with "keymap.h",
72 * I just copied relevant defines here. A cleaner solution would be to put gpm
73 * code into separate file and include there linux/keyboard.h
75 /* #include <linux/keyboard.h> */
84 # define KG_CAPSSHIFT 8
86 static void gpm_close
__ARGS((void));
87 static int gpm_open
__ARGS((void));
88 static int mch_gpm_process
__ARGS((void));
92 # include <sys/consio.h>
93 # include <sys/fbio.h>
95 static int sysmouse_open
__ARGS((void));
96 static void sysmouse_close
__ARGS((void));
97 static RETSIGTYPE sig_sysmouse
__ARGS(SIGPROTOARG
);
101 * end of autoconf section. To be extended...
104 /* Are the following #ifdefs still required? And why? Is that for X11? */
106 #if defined(ESIX) || defined(M_UNIX) && !defined(SCO)
115 #if defined(SIGWINDOW) && !defined(SIGWINCH) /* hpux 9.01 has it */
116 # define SIGWINCH SIGWINDOW
120 # include <X11/Xlib.h>
121 # include <X11/Xutil.h>
122 # include <X11/Xatom.h>
123 # ifdef FEAT_XCLIPBOARD
124 # include <X11/Intrinsic.h>
125 # include <X11/Shell.h>
126 # include <X11/StringDefs.h>
127 static Widget xterm_Shell
= (Widget
)0;
128 static void xterm_update
__ARGS((void));
131 # if defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE)
132 Window x11_window
= 0;
134 Display
*x11_display
= NULL
;
137 static int get_x11_windis
__ARGS((void));
138 static void set_x11_title
__ARGS((char_u
*));
139 static void set_x11_icon
__ARGS((char_u
*));
144 static int get_x11_title
__ARGS((int));
145 static int get_x11_icon
__ARGS((int));
147 static char_u
*oldtitle
= NULL
;
148 static int did_set_title
= FALSE
;
149 static char_u
*oldicon
= NULL
;
150 static int did_set_icon
= FALSE
;
153 static void may_core_dump
__ARGS((void));
155 static int WaitForChar
__ARGS((long));
156 #if defined(__BEOS__)
157 int RealWaitForChar
__ARGS((int, long, int *));
159 static int RealWaitForChar
__ARGS((int, long, int *));
162 #ifdef FEAT_XCLIPBOARD
163 static int do_xterm_trace
__ARGS((void));
164 # define XT_TRACE_DELAY 50 /* delay for xterm tracing */
167 static void handle_resize
__ARGS((void));
169 #if defined(SIGWINCH)
170 static RETSIGTYPE sig_winch
__ARGS(SIGPROTOARG
);
173 static RETSIGTYPE catch_sigint
__ARGS(SIGPROTOARG
);
176 static RETSIGTYPE catch_sigpwr
__ARGS(SIGPROTOARG
);
178 #if defined(SIGALRM) && defined(FEAT_X11) \
179 && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
180 # define SET_SIG_ALARM
181 static RETSIGTYPE sig_alarm
__ARGS(SIGPROTOARG
);
182 static int sig_alarm_called
;
184 static RETSIGTYPE deathtrap
__ARGS(SIGPROTOARG
);
186 static void catch_int_signal
__ARGS((void));
187 static void set_signals
__ARGS((void));
188 static void catch_signals
__ARGS((RETSIGTYPE (*func_deadly
)(), RETSIGTYPE (*func_other
)()));
190 static int have_wildcard
__ARGS((int, char_u
**));
191 static int have_dollars
__ARGS((int, char_u
**));
195 static int save_patterns
__ARGS((int num_pat
, char_u
**pat
, int *num_file
, char_u
***file
));
199 # define SIG_ERR ((RETSIGTYPE (*)())-1)
202 static int do_resize
= FALSE
;
204 static char_u
*extra_shell_arg
= NULL
;
205 static int show_shell_mess
= TRUE
;
207 static int deadly_signal
= 0; /* The signal we caught */
208 static int in_mch_delay
= FALSE
; /* sleeping in mch_delay() */
210 static int curr_tmode
= TMODE_COOK
; /* contains current terminal mode */
215 SmcConn smcconn
; /* The SM connection ID */
216 IceConn iceconn
; /* The ICE connection ID */
217 char *clientid
; /* The client ID for the current smc session */
218 Bool save_yourself
; /* If we're in the middle of a save_yourself */
219 Bool shutdown
; /* If we're in shutdown mode */
222 static xsmp_config_T xsmp
;
225 #ifdef SYS_SIGLIST_DECLARED
228 * extern char *_sys_siglist[NSIG];
229 * on Irix, Linux, NetBSD and Solaris. It contains a nice list of strings
230 * that describe the signals. That is nearly what we want here. But
231 * autoconf does only check for sys_siglist (without the underscore), I
232 * do not want to change everything today.... jw.
233 * This is why AC_DECL_SYS_SIGLIST is commented out in configure.in
237 static struct signalinfo
239 int sig
; /* Signal number, eg. SIGSEGV etc */
240 char *name
; /* Signal name (not char_u!). */
241 char deadly
; /* Catch as a deadly signal? */
245 {SIGHUP
, "HUP", TRUE
},
248 {SIGQUIT
, "QUIT", TRUE
},
251 {SIGILL
, "ILL", TRUE
},
254 {SIGTRAP
, "TRAP", TRUE
},
257 {SIGABRT
, "ABRT", TRUE
},
260 {SIGEMT
, "EMT", TRUE
},
263 {SIGFPE
, "FPE", TRUE
},
266 {SIGBUS
, "BUS", TRUE
},
269 {SIGSEGV
, "SEGV", TRUE
},
272 {SIGSYS
, "SYS", TRUE
},
275 {SIGALRM
, "ALRM", FALSE
}, /* Perl's alarm() can trigger it */
278 {SIGTERM
, "TERM", TRUE
},
281 {SIGVTALRM
, "VTALRM", TRUE
},
283 #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) && !defined(WE_ARE_PROFILING)
284 /* MzScheme uses SIGPROF for its own needs; On Linux with profiling
285 * this makes Vim exit. WE_ARE_PROFILING is defined in Makefile. */
286 {SIGPROF
, "PROF", TRUE
},
289 {SIGXCPU
, "XCPU", TRUE
},
292 {SIGXFSZ
, "XFSZ", TRUE
},
295 {SIGUSR1
, "USR1", TRUE
},
297 #if defined(SIGUSR2) && !defined(FEAT_SYSMOUSE)
298 /* Used for sysmouse handling */
299 {SIGUSR2
, "USR2", TRUE
},
302 {SIGINT
, "INT", FALSE
},
305 {SIGWINCH
, "WINCH", FALSE
},
308 {SIGTSTP
, "TSTP", FALSE
},
311 {SIGPIPE
, "PIPE", FALSE
},
313 {-1, "Unknown!", FALSE
}
321 write(1, (char *)s
, len
);
322 if (p_wd
) /* Unix is too fast, slow down a bit more */
323 RealWaitForChar(read_cmd_fd
, p_wd
, NULL
);
327 * mch_inchar(): low level input function.
328 * Get a characters from the keyboard.
329 * Return the number of characters that are available.
330 * If wtime == 0 do not wait for characters.
331 * If wtime == n wait a short time for characters.
332 * If wtime == -1 wait forever for characters.
335 mch_inchar(buf
, maxlen
, wtime
, tb_change_cnt
)
338 long wtime
; /* don't use "time", MIPS cannot handle it */
343 /* Check if window changed size while we were busy, perhaps the ":set
344 * columns=99" command was used. */
350 while (WaitForChar(wtime
) == 0) /* no character available */
352 if (!do_resize
) /* return if not interrupted by resize */
357 else /* wtime == -1 */
360 * If there is no character available within 'updatetime' seconds
361 * flush all the swap files to disk.
362 * Also done when interrupted by SIGWINCH.
364 if (WaitForChar(p_ut
) == 0)
367 if (trigger_cursorhold() && maxlen
>= 3
368 && !typebuf_changed(tb_change_cnt
))
372 buf
[2] = (int)KE_CURSORHOLD
;
380 for (;;) /* repeat until we got a character */
382 while (do_resize
) /* window changed size */
385 * we want to be interrupted by the winch signal
388 if (do_resize
) /* interrupted by SIGWINCH signal */
391 /* If input was put directly in typeahead buffer bail out here. */
392 if (typebuf_changed(tb_change_cnt
))
396 * For some terminals we only get one character at a time.
397 * We want the get all available characters, so we could keep on
398 * trying until none is available
399 * For some other terminals this is quite slow, that's why we don't do
402 len
= read_from_input_buf(buf
, (long)maxlen
);
408 for (i
= 0; i
< len
; i
++)
425 * return non-zero if a character is available
430 return WaitForChar(0L);
433 #if defined(HAVE_TOTAL_MEM) || defined(PROTO)
434 # ifdef HAVE_SYS_RESOURCE_H
435 # include <sys/resource.h>
437 # if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTL)
438 # include <sys/sysctl.h>
440 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
441 # include <sys/sysinfo.h>
445 * Return total amount of memory available in Kbyte.
446 * Doesn't change when memory has been allocated.
450 mch_total_mem(special
)
454 return ulimit(3, 0L) >> 10; /* always 32MB? */
457 long_u shiftright
= 10; /* how much to shift "mem" right for Kbyte */
463 /* BSD way of getting the amount of RAM available. */
466 len
= sizeof(physmem
);
467 if (sysctl(mib
, 2, &physmem
, &len
, NULL
, 0) == 0)
468 mem
= (long_u
)physmem
;
471 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
474 struct sysinfo sinfo
;
476 /* Linux way of getting amount of RAM available */
477 if (sysinfo(&sinfo
) == 0)
479 # ifdef HAVE_SYSINFO_MEM_UNIT
480 /* avoid overflow as much as possible */
481 while (shiftright
> 0 && (sinfo
.mem_unit
& 1) == 0)
483 sinfo
.mem_unit
= sinfo
.mem_unit
>> 1;
486 mem
= sinfo
.totalram
* sinfo
.mem_unit
;
488 mem
= sinfo
.totalram
;
497 long pagesize
, pagecount
;
499 /* Solaris way of getting amount of RAM available */
500 pagesize
= sysconf(_SC_PAGESIZE
);
501 pagecount
= sysconf(_SC_PHYS_PAGES
);
502 if (pagesize
> 0 && pagecount
> 0)
504 /* avoid overflow as much as possible */
505 while (shiftright
> 0 && (pagesize
& 1) == 0)
507 pagesize
= (long_u
)pagesize
>> 1;
510 mem
= (long_u
)pagesize
* pagecount
;
515 /* Return the minimum of the physical memory and the user limit, because
516 * using more than the user limit may cause Vim to be terminated. */
517 # if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)
521 if (getrlimit(RLIMIT_DATA
, &rlp
) == 0
522 && rlp
.rlim_cur
< ((rlim_t
)1 << (sizeof(long_u
) * 8 - 1))
523 # ifdef RLIM_INFINITY
524 && rlp
.rlim_cur
!= RLIM_INFINITY
526 && ((long_u
)rlp
.rlim_cur
>> 10) < (mem
>> shiftright
)
529 mem
= (long_u
)rlp
.rlim_cur
;
536 return mem
>> shiftright
;
537 return (long_u
)0x1fffff;
543 mch_delay(msec
, ignoreinput
)
549 long total
= msec
; /* remember original value */
554 /* Go to cooked mode without echo, to allow SIGINT interrupting us
555 * here. But we don't want QUIT to kill us (CTRL-\ used in a
556 * shell may produce SIGQUIT). */
558 old_tmode
= curr_tmode
;
559 if (curr_tmode
== TMODE_RAW
)
560 settmode(TMODE_SLEEP
);
563 * Everybody sleeps in a different way...
564 * Prefer nanosleep(), some versions of usleep() can only sleep up to
570 /* if total is large enough, wait by portions in p_mzq */
577 #ifdef HAVE_NANOSLEEP
581 ts
.tv_sec
= msec
/ 1000;
582 ts
.tv_nsec
= (msec
% 1000) * 1000000;
583 (void)nanosleep(&ts
, NULL
);
589 usleep((unsigned int)(999 * 1000));
592 usleep((unsigned int)(msec
* 1000));
595 poll(NULL
, 0, (int)msec
);
603 tv
.tv_sec
= msec
/ 1000;
604 tv
.tv_usec
= (msec
% 1000) * 1000;
606 * NOTE: Solaris 2.6 has a bug that makes select() hang here. Get
607 * a patch from Sun to fix this. Reported by Gunnar Pedersen.
609 select(0, NULL
, NULL
, NULL
, &tv
);
611 # endif /* __EMX__ */
612 # endif /* HAVE_SELECT */
613 # endif /* HAVE_NANOSLEEP */
614 #endif /* HAVE_USLEEP */
621 in_mch_delay
= FALSE
;
627 #if 0 /* disabled, no longer needed now that regmatch() is not recursive */
628 # if defined(HAVE_GETRLIMIT)
629 # define HAVE_STACK_LIMIT
633 #if defined(HAVE_STACK_LIMIT) \
634 || (!defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGSTACK))
635 # define HAVE_CHECK_STACK_GROWTH
637 * Support for checking for an almost-out-of-stack-space situation.
641 * Return a pointer to an item on the stack. Used to find out if the stack
644 static void check_stack_growth
__ARGS((char *p
));
645 static int stack_grows_downwards
;
648 * Find out if the stack grows upwards or downwards.
649 * "p" points to a variable on the stack of the caller.
652 check_stack_growth(p
)
657 stack_grows_downwards
= (p
> (char *)&i
);
661 #if defined(HAVE_STACK_LIMIT) || defined(PROTO)
662 static char *stack_limit
= NULL
;
664 #if defined(_THREAD_SAFE) && defined(HAVE_PTHREAD_NP_H)
665 # include <pthread.h>
666 # include <pthread_np.h>
670 * Find out until how var the stack can grow without getting into trouble.
671 * Called when starting up and when switching to the signal stack in
681 /* Set the stack limit to 15/16 of the allowable size. Skip this when the
682 * limit doesn't fit in a long (rlim_cur might be "long long"). */
683 if (getrlimit(RLIMIT_STACK
, &rlp
) == 0
684 && rlp
.rlim_cur
< ((rlim_t
)1 << (sizeof(long_u
) * 8 - 1))
685 # ifdef RLIM_INFINITY
686 && rlp
.rlim_cur
!= RLIM_INFINITY
690 lim
= (long)rlp
.rlim_cur
;
691 #if defined(_THREAD_SAFE) && defined(HAVE_PTHREAD_NP_H)
696 /* On FreeBSD the initial thread always has a fixed stack size, no
697 * matter what the limits are set to. Normally it's 1 Mbyte. */
698 pthread_attr_init(&attr
);
699 if (pthread_attr_get_np(pthread_self(), &attr
) == 0)
701 pthread_attr_getstacksize(&attr
, &size
);
702 if (lim
> (long)size
)
705 pthread_attr_destroy(&attr
);
708 if (stack_grows_downwards
)
710 stack_limit
= (char *)((long)&i
- (lim
/ 16L * 15L));
711 if (stack_limit
>= (char *)&i
)
712 /* overflow, set to 1/16 of current stack position */
713 stack_limit
= (char *)((long)&i
/ 16L);
717 stack_limit
= (char *)((long)&i
+ (lim
/ 16L * 15L));
718 if (stack_limit
<= (char *)&i
)
719 stack_limit
= NULL
; /* overflow */
725 * Return FAIL when running out of stack space.
726 * "p" must point to any variable local to the caller that's on the stack.
732 if (stack_limit
!= NULL
)
734 if (stack_grows_downwards
)
739 else if (p
> stack_limit
)
746 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
748 * Support for using the signal stack.
749 * This helps when we run out of stack space, which causes a SIGSEGV. The
750 * signal handler then must run on another stack, since the normal stack is
755 # define SIGSTKSZ 8000 /* just a guess of how much stack is needed... */
758 # ifdef HAVE_SIGALTSTACK
759 static stack_t sigstk
; /* for sigaltstack() */
761 static struct sigstack sigstk
; /* for sigstack() */
764 static void init_signal_stack
__ARGS((void));
765 static char *signal_stack
;
770 if (signal_stack
!= NULL
)
772 # ifdef HAVE_SIGALTSTACK
773 # if defined(__APPLE__) && (!defined(MAC_OS_X_VERSION_MAX_ALLOWED) \
774 || MAC_OS_X_VERSION_MAX_ALLOWED <= 1040)
775 /* missing prototype. Adding it to osdef?.h.in doesn't work, because
776 * "struct sigaltstack" needs to be declared. */
777 extern int sigaltstack
__ARGS((const struct sigaltstack
*ss
, struct sigaltstack
*oss
));
781 sigstk
.ss_base
= signal_stack
;
783 sigstk
.ss_sp
= signal_stack
;
785 sigstk
.ss_size
= SIGSTKSZ
;
787 (void)sigaltstack(&sigstk
, NULL
);
789 sigstk
.ss_sp
= signal_stack
;
790 if (stack_grows_downwards
)
791 sigstk
.ss_sp
+= SIGSTKSZ
- 1;
792 sigstk
.ss_onstack
= 0;
793 (void)sigstack(&sigstk
, NULL
);
800 * We need correct potatotypes for a signal function, otherwise mean compilers
801 * will barf when the second argument to signal() is ``wrong''.
802 * Let me try it with a few tricky defines from my own osdef.h (jw).
804 #if defined(SIGWINCH)
807 sig_winch
SIGDEFARG(sigarg
)
809 /* this is not required on all systems, but it doesn't hurt anybody */
810 signal(SIGWINCH
, (RETSIGTYPE (*)())sig_winch
);
819 catch_sigint
SIGDEFARG(sigarg
)
821 /* this is not required on all systems, but it doesn't hurt anybody */
822 signal(SIGINT
, (RETSIGTYPE (*)())catch_sigint
);
831 catch_sigpwr
SIGDEFARG(sigarg
)
833 /* this is not required on all systems, but it doesn't hurt anybody */
834 signal(SIGPWR
, (RETSIGTYPE (*)())catch_sigpwr
);
836 * I'm not sure we get the SIGPWR signal when the system is really going
837 * down or when the batteries are almost empty. Just preserve the swap
838 * files and don't exit, that can't do any harm.
840 ml_sync_all(FALSE
, FALSE
);
847 * signal function for alarm().
851 sig_alarm
SIGDEFARG(sigarg
)
853 /* doesn't do anything, just to break a system call */
854 sig_alarm_called
= TRUE
;
859 #if (defined(HAVE_SETJMP_H) \
860 && ((defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) \
861 || defined(FEAT_LIBCALL))) \
864 * A simplistic version of setjmp() that only allows one level of using.
865 * Don't call twice before calling mch_endjmp()!.
868 * if (SETJMP(lc_jump_env) != 0)
878 * Note: Can't move SETJMP() here, because a function calling setjmp() must
879 * not return before the saved environment is used.
880 * Returns OK for normal return, FAIL when the protected code caused a
881 * problem and LONGJMP() was used.
901 # if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
902 /* On FreeBSD the signal stack has to be reset after using siglongjmp(),
903 * otherwise catching the signal only works once. */
910 * This function handles deadly signals.
911 * It tries to preserve any swap file and exit properly.
912 * (partly from Elvis).
915 deathtrap
SIGDEFARG(sigarg
)
917 static int entered
= 0; /* count the number of times we got here.
918 Note: when memory has been corrupted
919 this may get an arbitrary value! */
924 #if defined(HAVE_SETJMP_H)
926 * Catch a crash in protected code.
927 * Restores the environment saved in lc_jump_env, which looks like
928 * SETJMP() returns 1.
932 # if defined(SIGHASARG)
935 lc_active
= FALSE
; /* don't jump again */
936 LONGJMP(lc_jump_env
, 1);
943 /* While in mch_delay() we go to cooked mode to allow a CTRL-C to
944 * interrupt us. But in cooked mode we may also get SIGQUIT, e.g., when
945 * pressing CTRL-\, but we don't want Vim to exit then. */
946 if (in_mch_delay
&& sigarg
== SIGQUIT
)
950 /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return
951 * here. This avoids that a non-reentrant function is interrupted, e.g.,
952 * free(). Calling free() again may then cause a crash. */
974 && !vim_handle_signal(sigarg
))
978 /* Remember how often we have been called. */
982 /* Set the v:dying variable. */
983 set_vim_var_nr(VV_DYING
, (long)entered
);
986 #ifdef HAVE_STACK_LIMIT
987 /* Since we are now using the signal stack, need to reset the stack
988 * limit. Otherwise using a regexp will fail. */
993 /* This is for opening gdb the moment Vim crashes.
994 * You need to manually adjust the file name and Vim executable name.
995 * Suggested by SungHyun Nam. */
997 # define VI_GDB_FILE "/tmp/vimgdb"
998 # define VIM_NAME "/usr/bin/vim"
999 FILE *fp
= fopen(VI_GDB_FILE
, "w");
1007 , VIM_NAME
, getpid());
1009 system("xterm -e gdb -x "VI_GDB_FILE
);
1010 unlink(VI_GDB_FILE
);
1016 /* try to find the name of this signal */
1017 for (i
= 0; signal_info
[i
].sig
!= -1; i
++)
1018 if (sigarg
== signal_info
[i
].sig
)
1020 deadly_signal
= sigarg
;
1023 full_screen
= FALSE
; /* don't write message to the GUI, it might be
1024 * part of the problem... */
1026 * If something goes wrong after entering here, we may get here again.
1027 * When this happens, give a message and try to exit nicely (resetting the
1028 * terminal mode, etc.)
1029 * When this happens twice, just exit, don't even try to give a message,
1030 * stack may be corrupt or something weird.
1031 * When this still happens again (or memory was corrupted in such a way
1032 * that "entered" was clobbered) use _exit(), don't try freeing resources.
1036 reset_signals(); /* don't catch any signals anymore */
1044 OUT_STR(_("Vim: Double signal, exiting\n"));
1050 sprintf((char *)IObuff
, _("Vim: Caught deadly signal %s\n"),
1051 signal_info
[i
].name
);
1053 sprintf((char *)IObuff
, _("Vim: Caught deadly signal\n"));
1055 preserve_exit(); /* preserve files and exit */
1068 * On Solaris with multi-threading, suspending might not work immediately.
1069 * Catch the SIGCONT signal, which will be used as an indication whether the
1070 * suspending has been done or not.
1072 static int sigcont_received
;
1073 static RETSIGTYPE sigcont_handler
__ARGS(SIGPROTOARG
);
1076 * signal handler for SIGCONT
1080 sigcont_handler
SIGDEFARG(sigarg
)
1082 sigcont_received
= TRUE
;
1088 * If the machine has job control, use it to suspend the program,
1089 * otherwise fake it by starting a new shell.
1094 /* BeOS does have SIGTSTP, but it doesn't work. */
1095 #if defined(SIGTSTP) && !defined(__BEOS__)
1096 out_flush(); /* needed to make cursor visible on some systems */
1097 settmode(TMODE_COOK
);
1098 out_flush(); /* needed to disable mouse on some systems */
1100 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
1101 /* Since we are going to sleep, we can't respond to requests for the X
1102 * selections. Lose them, otherwise other applications will hang. But
1103 * first copy the text to cut buffer 0. */
1104 if (clip_star
.owned
|| clip_plus
.owned
)
1106 x11_export_final_selection();
1107 if (clip_star
.owned
)
1108 clip_lose_selection(&clip_star
);
1109 if (clip_plus
.owned
)
1110 clip_lose_selection(&clip_plus
);
1111 if (x11_display
!= NULL
)
1112 XFlush(x11_display
);
1117 sigcont_received
= FALSE
;
1119 kill(0, SIGTSTP
); /* send ourselves a STOP signal */
1121 /* When we didn't suspend immediately in the kill(), do it now. Happens
1122 * on multi-threaded Solaris. */
1123 if (!sigcont_received
)
1129 * Set oldtitle to NULL, so the current title is obtained again.
1134 settmode(TMODE_RAW
);
1135 need_check_timestamps
= TRUE
;
1136 did_check_timestamps
= FALSE
;
1151 #ifdef MACOS_CONVERT
1159 #if defined(SIGWINCH)
1161 * WINDOW CHANGE signal is handled with sig_winch().
1163 signal(SIGWINCH
, (RETSIGTYPE (*)())sig_winch
);
1167 * We want the STOP signal to work, to make mch_suspend() work.
1168 * For "rvim" the STOP signal is ignored.
1171 signal(SIGTSTP
, restricted
? SIG_IGN
: SIG_DFL
);
1174 signal(SIGCONT
, sigcont_handler
);
1178 * We want to ignore breaking of PIPEs.
1181 signal(SIGPIPE
, SIG_IGN
);
1189 * Ignore alarm signals (Perl's alarm() generates it).
1192 signal(SIGALRM
, SIG_IGN
);
1196 * Catch SIGPWR (power failure?) to preserve the swap files, so that no
1197 * work will be lost.
1200 signal(SIGPWR
, (RETSIGTYPE (*)())catch_sigpwr
);
1204 * Arrange for other signals to gracefully shutdown Vim.
1206 catch_signals(deathtrap
, SIG_ERR
);
1208 #if defined(FEAT_GUI) && defined(SIGHUP)
1210 * When the GUI is running, ignore the hangup signal.
1213 signal(SIGHUP
, SIG_IGN
);
1217 #if defined(SIGINT) || defined(PROTO)
1219 * Catch CTRL-C (only works while in Cooked mode).
1224 signal(SIGINT
, (RETSIGTYPE (*)())catch_sigint
);
1231 catch_signals(SIG_DFL
, SIG_DFL
);
1233 /* SIGCONT isn't in the list, because its default action is ignore */
1234 signal(SIGCONT
, SIG_DFL
);
1239 catch_signals(func_deadly
, func_other
)
1240 RETSIGTYPE (*func_deadly
)();
1241 RETSIGTYPE (*func_other
)();
1245 for (i
= 0; signal_info
[i
].sig
!= -1; i
++)
1246 if (signal_info
[i
].deadly
)
1248 #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
1249 struct sigaction sa
;
1251 /* Setup to use the alternate stack for the signal function. */
1252 sa
.sa_handler
= func_deadly
;
1253 sigemptyset(&sa
.sa_mask
);
1254 # if defined(__linux__) && defined(_REENTRANT)
1255 /* On Linux, with glibc compiled for kernel 2.2, there is a bug in
1256 * thread handling in combination with using the alternate stack:
1257 * pthread library functions try to use the stack pointer to
1258 * identify the current thread, causing a SEGV signal, which
1259 * recursively calls deathtrap() and hangs. */
1262 sa
.sa_flags
= SA_ONSTACK
;
1264 sigaction(signal_info
[i
].sig
, &sa
, NULL
);
1266 # if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGVEC)
1269 /* Setup to use the alternate stack for the signal function. */
1270 sv
.sv_handler
= func_deadly
;
1272 sv
.sv_flags
= SV_ONSTACK
;
1273 sigvec(signal_info
[i
].sig
, &sv
, NULL
);
1275 signal(signal_info
[i
].sig
, func_deadly
);
1279 else if (func_other
!= SIG_ERR
)
1280 signal(signal_info
[i
].sig
, func_other
);
1284 * Handling of SIGHUP, SIGQUIT and SIGTERM:
1285 * "when" == a signal: when busy, postpone and return FALSE, otherwise
1287 * "when" == SIGNAL_BLOCK: Going to be busy, block signals
1288 * "when" == SIGNAL_UNBLOCK: Going to wait, unblock signals, use postponed
1290 * Returns TRUE when Vim should exit.
1293 vim_handle_signal(sig
)
1296 static int got_signal
= 0;
1297 static int blocked
= TRUE
;
1301 case SIGNAL_BLOCK
: blocked
= TRUE
;
1304 case SIGNAL_UNBLOCK
: blocked
= FALSE
;
1305 if (got_signal
!= 0)
1307 kill(getpid(), got_signal
);
1312 default: if (!blocked
)
1313 return TRUE
; /* exit! */
1318 got_int
= TRUE
; /* break any loops */
1325 * Check_win checks whether we have an interactive stdout.
1329 mch_check_win(argc
, argv
)
1335 * Store argv[0], may be used for $VIM. Only use it if it is an absolute
1336 * name, mostly it's just "vim" and found in the path, which is unusable.
1338 if (mch_isFullName(argv
[0]))
1339 exe_name
= vim_strsave((char_u
*)argv
[0]);
1347 * Return TRUE if the input comes from a terminal, FALSE otherwise.
1352 if (isatty(read_cmd_fd
))
1359 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) \
1360 && (defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE))
1362 static void xopen_message
__ARGS((struct timeval
*tvp
));
1365 * Give a message about the elapsed time for opening the X window.
1369 struct timeval
*tvp
; /* must contain start time */
1371 struct timeval end_tv
;
1373 /* Compute elapsed time. */
1374 gettimeofday(&end_tv
, NULL
);
1375 smsg((char_u
*)_("Opening the X display took %ld msec"),
1376 (end_tv
.tv_sec
- tvp
->tv_sec
) * 1000L
1377 + (end_tv
.tv_usec
- tvp
->tv_usec
) / 1000L);
1382 #if defined(FEAT_X11) && (defined(FEAT_TITLE) || defined(FEAT_XCLIPBOARD))
1384 * A few functions shared by X11 title and clipboard code.
1386 static int x_error_handler
__ARGS((Display
*dpy
, XErrorEvent
*error_event
));
1387 static int x_error_check
__ARGS((Display
*dpy
, XErrorEvent
*error_event
));
1388 static int x_connect_to_server
__ARGS((void));
1389 static int test_x11_window
__ARGS((Display
*dpy
));
1391 static int got_x_error
= FALSE
;
1394 * X Error handler, otherwise X just exits! (very rude) -- webb
1397 x_error_handler(dpy
, error_event
)
1399 XErrorEvent
*error_event
;
1401 XGetErrorText(dpy
, error_event
->error_code
, (char *)IObuff
, IOSIZE
);
1402 STRCAT(IObuff
, _("\nVim: Got X error\n"));
1404 /* We cannot print a message and continue, because no X calls are allowed
1405 * here (causes my system to hang). Silently continuing might be an
1407 preserve_exit(); /* preserve files and exit */
1409 return 0; /* NOTREACHED */
1413 * Another X Error handler, just used to check for errors.
1417 x_error_check(dpy
, error_event
)
1419 XErrorEvent
*error_event
;
1425 #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
1426 # if defined(HAVE_SETJMP_H)
1428 * An X IO Error handler, used to catch error while opening the display.
1430 static int x_IOerror_check
__ARGS((Display
*dpy
));
1434 x_IOerror_check(dpy
)
1437 /* This function should not return, it causes exit(). Longjump instead. */
1438 LONGJMP(lc_jump_env
, 1);
1445 * An X IO Error handler, used to catch terminal errors.
1447 static int x_IOerror_handler
__ARGS((Display
*dpy
));
1451 x_IOerror_handler(dpy
)
1457 xterm_Shell
= (Widget
)0;
1459 /* This function should not return, it causes exit(). Longjump instead. */
1460 LONGJMP(x_jump_env
, 1);
1467 * Return TRUE when connection to the X server is desired.
1470 x_connect_to_server()
1472 regmatch_T regmatch
;
1474 #if defined(FEAT_CLIENTSERVER)
1475 if (x_force_connect
)
1481 /* Check for a match with "exclude:" from 'clipboard'. */
1482 if (clip_exclude_prog
!= NULL
)
1484 regmatch
.rm_ic
= FALSE
; /* Don't ignore case */
1485 regmatch
.regprog
= clip_exclude_prog
;
1486 if (vim_regexec(®match
, T_NAME
, (colnr_T
)0))
1493 * Test if "dpy" and x11_window are valid by getting the window title.
1494 * I don't actually want it yet, so there may be a simpler call to use, but
1495 * this will cause the error handler x_error_check() to be called if anything
1496 * is wrong, such as the window pointer being invalid (as can happen when the
1497 * user changes his DISPLAY, but not his WINDOWID) -- webb
1500 test_x11_window(dpy
)
1503 int (*old_handler
)();
1504 XTextProperty text_prop
;
1506 old_handler
= XSetErrorHandler(x_error_check
);
1507 got_x_error
= FALSE
;
1508 if (XGetWMName(dpy
, x11_window
, &text_prop
))
1509 XFree((void *)text_prop
.value
);
1511 (void)XSetErrorHandler(old_handler
);
1513 if (p_verbose
> 0 && got_x_error
)
1514 verb_msg((char_u
*)_("Testing the X display failed"));
1516 return (got_x_error
? FAIL
: OK
);
1524 static int get_x11_thing
__ARGS((int get_title
, int test_only
));
1527 * try to get x11 window and display
1529 * return FAIL for failure, OK otherwise
1535 static int result
= -1;
1536 #define XD_NONE 0 /* x11_display not set here */
1537 #define XD_HERE 1 /* x11_display opened here */
1538 #define XD_GUI 2 /* x11_display used from gui.dpy */
1539 #define XD_XTERM 3 /* x11_display used from xterm_dpy */
1540 static int x11_display_from
= XD_NONE
;
1541 static int did_set_error_handler
= FALSE
;
1543 if (!did_set_error_handler
)
1545 /* X just exits if it finds an error otherwise! */
1546 (void)XSetErrorHandler(x_error_handler
);
1547 did_set_error_handler
= TRUE
;
1550 #if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
1554 * If the X11 display was opened here before, for the window where Vim
1555 * was started, close that one now to avoid a memory leak.
1557 if (x11_display_from
== XD_HERE
&& x11_display
!= NULL
)
1559 XCloseDisplay(x11_display
);
1560 x11_display_from
= XD_NONE
;
1562 if (gui_get_x11_windis(&x11_window
, &x11_display
) == OK
)
1564 x11_display_from
= XD_GUI
;
1570 else if (x11_display_from
== XD_GUI
)
1572 /* GUI must have stopped somehow, clear x11_display */
1575 x11_display_from
= XD_NONE
;
1579 /* When started with the "-X" argument, don't try connecting. */
1580 if (!x_connect_to_server())
1584 * If WINDOWID not set, should try another method to find out
1585 * what the current window number is. The only code I know for
1586 * this is very complicated.
1587 * We assume that zero is invalid for WINDOWID.
1589 if (x11_window
== 0 && (winid
= getenv("WINDOWID")) != NULL
)
1590 x11_window
= (Window
)atol(winid
);
1592 #ifdef FEAT_XCLIPBOARD
1593 if (xterm_dpy
!= NULL
&& x11_window
!= 0)
1595 /* We may have checked it already, but Gnome terminal can move us to
1596 * another window, so we need to check every time. */
1597 if (x11_display_from
!= XD_XTERM
)
1600 * If the X11 display was opened here before, for the window where
1601 * Vim was started, close that one now to avoid a memory leak.
1603 if (x11_display_from
== XD_HERE
&& x11_display
!= NULL
)
1604 XCloseDisplay(x11_display
);
1605 x11_display
= xterm_dpy
;
1606 x11_display_from
= XD_XTERM
;
1608 if (test_x11_window(x11_display
) == FAIL
)
1610 /* probably bad $WINDOWID */
1613 x11_display_from
= XD_NONE
;
1620 if (x11_window
== 0 || x11_display
== NULL
)
1623 if (result
!= -1) /* Have already been here and set this */
1624 return result
; /* Don't do all these X calls again */
1626 if (x11_window
!= 0 && x11_display
== NULL
)
1628 #ifdef SET_SIG_ALARM
1629 RETSIGTYPE (*sig_save
)();
1631 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
1632 struct timeval start_tv
;
1635 gettimeofday(&start_tv
, NULL
);
1638 #ifdef SET_SIG_ALARM
1640 * Opening the Display may hang if the DISPLAY setting is wrong, or
1641 * the network connection is bad. Set an alarm timer to get out.
1643 sig_alarm_called
= FALSE
;
1644 sig_save
= (RETSIGTYPE (*)())signal(SIGALRM
,
1645 (RETSIGTYPE (*)())sig_alarm
);
1648 x11_display
= XOpenDisplay(NULL
);
1650 #ifdef SET_SIG_ALARM
1652 signal(SIGALRM
, (RETSIGTYPE (*)())sig_save
);
1653 if (p_verbose
> 0 && sig_alarm_called
)
1654 verb_msg((char_u
*)_("Opening the X display timed out"));
1656 if (x11_display
!= NULL
)
1658 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
1662 xopen_message(&start_tv
);
1666 if (test_x11_window(x11_display
) == FAIL
)
1668 /* Maybe window id is bad */
1670 XCloseDisplay(x11_display
);
1674 x11_display_from
= XD_HERE
;
1677 if (x11_window
== 0 || x11_display
== NULL
)
1678 return (result
= FAIL
);
1679 return (result
= OK
);
1683 * Determine original x11 Window Title
1686 get_x11_title(test_only
)
1689 return get_x11_thing(TRUE
, test_only
);
1693 * Determine original x11 Window icon
1696 get_x11_icon(test_only
)
1701 retval
= get_x11_thing(FALSE
, test_only
);
1703 /* could not get old icon, use terminal name */
1704 if (oldicon
== NULL
&& !test_only
)
1706 if (STRNCMP(T_NAME
, "builtin_", 8) == 0)
1707 oldicon
= T_NAME
+ 8;
1716 get_x11_thing(get_title
, test_only
)
1717 int get_title
; /* get title string */
1720 XTextProperty text_prop
;
1724 if (get_x11_windis() == OK
)
1726 /* Get window/icon name if any */
1728 status
= XGetWMName(x11_display
, x11_window
, &text_prop
);
1730 status
= XGetWMIconName(x11_display
, x11_window
, &text_prop
);
1733 * If terminal is xterm, then x11_window may be a child window of the
1734 * outer xterm window that actually contains the window/icon name, so
1735 * keep traversing up the tree until a window with a title/icon is
1738 /* Previously this was only done for xterm and alikes. I don't see a
1739 * reason why it would fail for other terminal emulators.
1740 * if (term_is_xterm) */
1744 Window win
= x11_window
;
1746 unsigned int num_children
;
1748 while (!status
|| text_prop
.value
== NULL
)
1750 if (!XQueryTree(x11_display
, win
, &root
, &parent
, &children
,
1754 XFree((void *)children
);
1755 if (parent
== root
|| parent
== 0)
1760 status
= XGetWMName(x11_display
, win
, &text_prop
);
1762 status
= XGetWMIconName(x11_display
, win
, &text_prop
);
1765 if (status
&& text_prop
.value
!= NULL
)
1770 #ifdef FEAT_XFONTSET
1771 if (text_prop
.encoding
== XA_STRING
)
1775 oldtitle
= vim_strsave((char_u
*)text_prop
.value
);
1777 oldicon
= vim_strsave((char_u
*)text_prop
.value
);
1778 #ifdef FEAT_XFONTSET
1783 Status transform_status
;
1786 transform_status
= XmbTextPropertyToTextList(x11_display
,
1789 if (transform_status
>= Success
&& n
> 0 && cl
[0])
1792 oldtitle
= vim_strsave((char_u
*) cl
[0]);
1794 oldicon
= vim_strsave((char_u
*) cl
[0]);
1795 XFreeStringList(cl
);
1800 oldtitle
= vim_strsave((char_u
*)text_prop
.value
);
1802 oldicon
= vim_strsave((char_u
*)text_prop
.value
);
1807 XFree((void *)text_prop
.value
);
1813 /* Are Xutf8 functions available? Avoid error from old compilers. */
1814 #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE)
1815 # if X_HAVE_UTF8_STRING
1816 # define USE_UTF8_STRING
1821 * Set x11 Window Title
1823 * get_x11_windis() must be called before this and have returned OK
1826 set_x11_title(title
)
1829 /* XmbSetWMProperties() and Xutf8SetWMProperties() should use a STRING
1830 * when possible, COMPOUND_TEXT otherwise. COMPOUND_TEXT isn't
1831 * supported everywhere and STRING doesn't work for multi-byte titles.
1833 #ifdef USE_UTF8_STRING
1835 Xutf8SetWMProperties(x11_display
, x11_window
, (const char *)title
,
1836 NULL
, NULL
, 0, NULL
, NULL
, NULL
);
1840 #if XtSpecificationRelease >= 4
1841 # ifdef FEAT_XFONTSET
1842 XmbSetWMProperties(x11_display
, x11_window
, (const char *)title
,
1843 NULL
, NULL
, 0, NULL
, NULL
, NULL
);
1845 XTextProperty text_prop
;
1846 char *c_title
= (char *)title
;
1848 /* directly from example 3-18 "basicwin" of Xlib Programming Manual */
1849 (void)XStringListToTextProperty(&c_title
, 1, &text_prop
);
1850 XSetWMProperties(x11_display
, x11_window
, &text_prop
,
1851 NULL
, NULL
, 0, NULL
, NULL
, NULL
);
1854 XStoreName(x11_display
, x11_window
, (char *)title
);
1857 XFlush(x11_display
);
1861 * Set x11 Window icon
1863 * get_x11_windis() must be called before this and have returned OK
1869 /* See above for comments about using X*SetWMProperties(). */
1870 #ifdef USE_UTF8_STRING
1872 Xutf8SetWMProperties(x11_display
, x11_window
, NULL
, (const char *)icon
,
1873 NULL
, 0, NULL
, NULL
, NULL
);
1877 #if XtSpecificationRelease >= 4
1878 # ifdef FEAT_XFONTSET
1879 XmbSetWMProperties(x11_display
, x11_window
, NULL
, (const char *)icon
,
1880 NULL
, 0, NULL
, NULL
, NULL
);
1882 XTextProperty text_prop
;
1883 char *c_icon
= (char *)icon
;
1885 (void)XStringListToTextProperty(&c_icon
, 1, &text_prop
);
1886 XSetWMProperties(x11_display
, x11_window
, NULL
, &text_prop
,
1887 NULL
, 0, NULL
, NULL
, NULL
);
1890 XSetIconName(x11_display
, x11_window
, (char *)icon
);
1893 XFlush(x11_display
);
1896 #else /* FEAT_X11 */
1900 get_x11_title(test_only
)
1907 get_x11_icon(test_only
)
1912 if (STRNCMP(T_NAME
, "builtin_", 8) == 0)
1913 oldicon
= T_NAME
+ 8;
1920 #endif /* FEAT_X11 */
1923 mch_can_restore_title()
1925 return get_x11_title(TRUE
);
1929 mch_can_restore_icon()
1931 return get_x11_icon(TRUE
);
1935 * Set the window title and icon.
1938 mch_settitle(title
, icon
)
1943 static int recursive
= 0;
1945 if (T_NAME
== NULL
) /* no terminal name (yet) */
1947 if (title
== NULL
&& icon
== NULL
) /* nothing to do */
1950 /* When one of the X11 functions causes a deadly signal, we get here again
1951 * recursively. Avoid hanging then (something is probably locked). */
1957 * if the window ID and the display is known, we may use X11 calls
1960 if (get_x11_windis() == OK
)
1963 # if defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK)
1970 * Note: if "t_TS" is set, title is set with escape sequence rather
1971 * than x11 calls, because the x11 calls don't always work
1973 if ((type
|| *T_TS
!= NUL
) && title
!= NULL
)
1975 if (oldtitle
== NULL
1979 ) /* first call but not in GUI, save title */
1980 (void)get_x11_title(FALSE
);
1982 if (*T_TS
!= NUL
) /* it's OK if t_fs is empty */
1983 term_settitle(title
);
1986 # ifdef FEAT_GUI_GTK
1987 if (!gui
.in_use
) /* don't do this if GTK+ is running */
1989 set_x11_title(title
); /* x11 */
1991 #if defined(FEAT_GUI_GTK) \
1992 || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
1994 gui_mch_settitle(title
, icon
);
1996 did_set_title
= TRUE
;
1999 if ((type
|| *T_CIS
!= NUL
) && icon
!= NULL
)
2005 ) /* first call, save icon */
2006 get_x11_icon(FALSE
);
2010 out_str(T_CIS
); /* set icon start */
2012 out_str(T_CIE
); /* set icon end */
2017 # ifdef FEAT_GUI_GTK
2018 if (!gui
.in_use
) /* don't do this if GTK+ is running */
2020 set_x11_icon(icon
); /* x11 */
2022 did_set_icon
= TRUE
;
2028 * Restore the window/icon title.
2029 * "which" is one of:
2030 * 1 only restore title
2031 * 2 only restore icon
2032 * 3 restore title and icon
2035 mch_restore_title(which
)
2038 /* only restore the title or icon when it has been set */
2039 mch_settitle(((which
& 1) && did_set_title
) ?
2040 (oldtitle
? oldtitle
: p_titleold
) : NULL
,
2041 ((which
& 2) && did_set_icon
) ? oldicon
: NULL
);
2044 #endif /* FEAT_TITLE */
2047 * Return TRUE if "name" looks like some xterm name.
2048 * Seiichi Sato mentioned that "mlterm" works like xterm.
2056 return (STRNICMP(name
, "xterm", 5) == 0
2057 || STRNICMP(name
, "nxterm", 6) == 0
2058 || STRNICMP(name
, "kterm", 5) == 0
2059 || STRNICMP(name
, "mlterm", 6) == 0
2060 || STRNICMP(name
, "rxvt", 4) == 0
2061 || STRCMP(name
, "builtin_xterm") == 0);
2064 #if defined(FEAT_MOUSE_XTERM) || defined(PROTO)
2066 * Return TRUE if "name" appears to be that of a terminal
2067 * known to support the xterm-style mouse protocol.
2068 * Relies on term_is_xterm having been set to its correct value.
2071 use_xterm_like_mouse(name
)
2074 return (name
!= NULL
2075 && (term_is_xterm
|| STRNICMP(name
, "screen", 6) == 0));
2079 #if defined(FEAT_MOUSE_TTY) || defined(PROTO)
2081 * Return non-zero when using an xterm mouse, according to 'ttymouse'.
2082 * Return 1 for "xterm".
2083 * Return 2 for "xterm2".
2088 if (ttym_flags
== TTYM_XTERM2
)
2090 if (ttym_flags
== TTYM_XTERM
)
2102 return (STRNICMP(name
, "iris-ansi", 9) == 0
2103 || STRCMP(name
, "builtin_iris-ansi") == 0);
2111 return FALSE
; /* actually all ANSI comp. terminals should be here */
2112 /* catch VT100 - VT5xx */
2113 return ((STRNICMP(name
, "vt", 2) == 0
2114 && vim_strchr((char_u
*)"12345", name
[2]) != NULL
)
2115 || STRCMP(name
, "builtin_vt320") == 0);
2119 * Return TRUE if "name" is a terminal for which 'ttyfast' should be set.
2120 * This should include all windowed terminal emulators.
2123 vim_is_fastterm(name
)
2128 if (vim_is_xterm(name
) || vim_is_vt300(name
) || vim_is_iris(name
))
2130 return ( STRNICMP(name
, "hpterm", 6) == 0
2131 || STRNICMP(name
, "sun-cmd", 7) == 0
2132 || STRNICMP(name
, "screen", 6) == 0
2133 || STRNICMP(name
, "dtterm", 6) == 0);
2137 * Insert user name in s[len].
2138 * Return OK if a name found.
2141 mch_get_user_name(s
, len
)
2146 vim_strncpy(s
, (char_u
*)cuserid(NULL
), len
- 1);
2149 return mch_get_uname(getuid(), s
, len
);
2154 * Insert user name for "uid" in s[len].
2155 * Return OK if a name found.
2158 mch_get_uname(uid
, s
, len
)
2163 #if defined(HAVE_PWD_H) && defined(HAVE_GETPWUID)
2166 if ((pw
= getpwuid(uid
)) != NULL
2167 && pw
->pw_name
!= NULL
&& *(pw
->pw_name
) != NUL
)
2169 vim_strncpy(s
, (char_u
*)pw
->pw_name
, len
- 1);
2173 sprintf((char *)s
, "%d", (int)uid
); /* assumes s is long enough */
2174 return FAIL
; /* a number is not a name */
2178 * Insert host name is s[len].
2181 #ifdef HAVE_SYS_UTSNAME_H
2183 mch_get_host_name(s
, len
)
2187 struct utsname vutsname
;
2189 if (uname(&vutsname
) < 0)
2192 vim_strncpy(s
, (char_u
*)vutsname
.nodename
, len
- 1);
2194 #else /* HAVE_SYS_UTSNAME_H */
2196 # ifdef HAVE_SYS_SYSTEMINFO_H
2197 # define gethostname(nam, len) sysinfo(SI_HOSTNAME, nam, len)
2201 mch_get_host_name(s
, len
)
2206 vaxc$
gethostname((char *)s
, len
);
2208 gethostname((char *)s
, len
);
2210 s
[len
- 1] = NUL
; /* make sure it's terminated */
2212 #endif /* HAVE_SYS_UTSNAME_H */
2220 return (long)getpid();
2223 #if !defined(HAVE_STRERROR) && defined(USE_GETCWD)
2224 static char *strerror
__ARGS((int));
2230 extern int sys_nerr
;
2231 extern char *sys_errlist
[];
2234 if (err
> 0 && err
< sys_nerr
)
2235 return (sys_errlist
[err
]);
2236 sprintf(er
, "Error %d", err
);
2242 * Get name of current directory into buffer 'buf' of length 'len' bytes.
2243 * Return OK for success, FAIL for failure.
2246 mch_dirname(buf
, len
)
2250 #if defined(USE_GETCWD)
2251 if (getcwd((char *)buf
, len
) == NULL
)
2253 STRCPY(buf
, strerror(errno
));
2258 return (getwd((char *)buf
) != NULL
? OK
: FAIL
);
2262 #if defined(OS2) || defined(PROTO)
2264 * Replace all slashes by backslashes.
2265 * When 'shellslash' set do it the other way around.
2281 * Get absolute file name into "buf[len]".
2283 * return FAIL for failure, OK for success
2286 mch_FullName(fname
, buf
, len
, force
)
2287 char_u
*fname
, *buf
;
2289 int force
; /* also expand when already absolute path */
2293 int only_drive
; /* file name is only a drive letter */
2297 static int dont_fchdir
= FALSE
; /* TRUE when fchdir() doesn't work */
2299 char_u olddir
[MAXPATHL
];
2303 char_u posix_fname
[MAXPATHL
]; /* Cygwin docs mention MAX_PATH, but
2304 it's not always defined */
2308 fname
= vms_fixfilename(fname
);
2313 * This helps for when "/etc/hosts" is a symlink to "c:/something/hosts".
2315 cygwin_conv_to_posix_path(fname
, posix_fname
);
2316 fname
= posix_fname
;
2319 /* expand it if forced or not an absolute path */
2320 if (force
|| !mch_isFullName(fname
))
2323 * If the file name has a path, change to that directory for a moment,
2324 * and then do the getwd() (and get back to where we were).
2325 * This will get the correct path name with "../" things.
2329 if (((p
= vim_strrchr(fname
, '/')) != NULL
)
2330 || ((p
= vim_strrchr(fname
, '\\')) != NULL
)
2331 || (((p
= vim_strchr(fname
, ':')) != NULL
) && ++only_drive
))
2333 if ((p
= vim_strrchr(fname
, '/')) != NULL
)
2338 * Use fchdir() if possible, it's said to be faster and more
2339 * reliable. But on SunOS 4 it might not work. Check this by
2340 * doing a fchdir() right now.
2344 fd
= open(".", O_RDONLY
| O_EXTRA
, 0);
2345 if (fd
>= 0 && fchdir(fd
) < 0)
2349 dont_fchdir
= TRUE
; /* don't try again */
2354 /* Only change directory when we are sure we can return to where
2355 * we are now. After doing "su" chdir(".") might not work. */
2360 (mch_dirname(olddir
, MAXPATHL
) == FAIL
2361 || mch_chdir((char *)olddir
) != 0))
2363 p
= NULL
; /* can't get current dir: don't chdir */
2370 * compensate for case where ':' from "D:" was the only
2371 * path separator detected in the file name; the _next_
2372 * character has to be removed, and then restored later.
2377 /* The directory is copied into buf[], to be able to remove
2378 * the file name without changing it (could be a string in
2379 * read-only memory) */
2380 if (p
- fname
>= len
)
2384 vim_strncpy(buf
, fname
, p
- fname
);
2385 if (mch_chdir((char *)buf
))
2401 if (mch_dirname(buf
, len
) == FAIL
)
2416 l
= mch_chdir((char *)olddir
);
2418 EMSG(_(e_prev_dir
));
2427 if (l
> 0 && buf
[l
- 1] != '/' && *fname
!= NUL
2428 && STRCMP(fname
, ".") != 0)
2434 /* Catch file names which are too long. */
2435 if (retval
== FAIL
|| STRLEN(buf
) + STRLEN(fname
) >= len
)
2438 /* Do not append ".", "/dir/." is equal to "/dir". */
2439 if (STRCMP(fname
, ".") != 0)
2446 * Return TRUE if "fname" does not depend on the current directory.
2449 mch_isFullName(fname
)
2453 return _fnisabs(fname
);
2456 return ( fname
[0] == '/' || fname
[0] == '.' ||
2457 strchr((char *)fname
,':') || strchr((char *)fname
,'"') ||
2458 (strchr((char *)fname
,'[') && strchr((char *)fname
,']'))||
2459 (strchr((char *)fname
,'<') && strchr((char *)fname
,'>')) );
2461 return (*fname
== '/' || *fname
== '~');
2466 #if defined(USE_FNAME_CASE) || defined(PROTO)
2468 * Set the case of the file name, if it already exists. This will cause the
2469 * file name to remain exactly the same.
2470 * Only required for file systems where case is ignored and preserved.
2474 fname_case(name
, len
)
2476 int len
; /* buffer size, only used when name gets longer */
2479 char_u
*slash
, *tail
;
2483 if (lstat((char *)name
, &st
) >= 0)
2485 /* Open the directory where the file is located. */
2486 slash
= vim_strrchr(name
, '/');
2489 dirp
= opendir(".");
2495 dirp
= opendir((char *)name
);
2502 while ((dp
= readdir(dirp
)) != NULL
)
2504 /* Only accept names that differ in case and are the same byte
2505 * length. TODO: accept different length name. */
2506 if (STRICMP(tail
, dp
->d_name
) == 0
2507 && STRLEN(tail
) == STRLEN(dp
->d_name
))
2509 char_u newname
[MAXPATHL
+ 1];
2512 /* Verify the inode is equal. */
2513 vim_strncpy(newname
, name
, MAXPATHL
);
2514 vim_strncpy(newname
+ (tail
- name
), (char_u
*)dp
->d_name
,
2515 MAXPATHL
- (tail
- name
));
2516 if (lstat((char *)newname
, &st2
) >= 0
2517 && st
.st_ino
== st2
.st_ino
2518 && st
.st_dev
== st2
.st_dev
)
2520 STRCPY(tail
, dp
->d_name
);
2533 * Get file permissions for 'name'.
2534 * Returns -1 when it doesn't exist.
2542 /* Keep the #ifdef outside of stat(), it may be a macro. */
2544 if (stat((char *)vms_fixfilename(name
), &statb
))
2546 if (stat((char *)name
, &statb
))
2550 /* The top bit makes the value negative, which means the file doesn't
2551 * exist. Remove the bit, we don't use it. */
2552 return statb
.st_mode
& ~S_ADDACE
;
2554 return statb
.st_mode
;
2559 * set file permission for 'name' to 'perm'
2561 * return FAIL for failure, OK otherwise
2564 mch_setperm(name
, perm
)
2568 return (chmod((char *)
2570 vms_fixfilename(name
),
2574 (mode_t
)perm
) == 0 ? OK
: FAIL
);
2577 #if defined(HAVE_ACL) || defined(PROTO)
2578 # ifdef HAVE_SYS_ACL_H
2579 # include <sys/acl.h>
2581 # ifdef HAVE_SYS_ACCESS_H
2582 # include <sys/access.h>
2585 # ifdef HAVE_SOLARIS_ACL
2586 typedef struct vim_acl_solaris_T
{
2588 aclent_t
*acl_entry
;
2589 } vim_acl_solaris_T
;
2592 #if defined(HAVE_SELINUX) || defined(PROTO)
2594 * Copy security info from "from_file" to "to_file".
2597 mch_copy_sec(from_file
, to_file
)
2601 if (from_file
== NULL
)
2604 if (selinux_enabled
== -1)
2605 selinux_enabled
= is_selinux_enabled();
2607 if (selinux_enabled
> 0)
2609 security_context_t from_context
= NULL
;
2610 security_context_t to_context
= NULL
;
2612 if (getfilecon((char *)from_file
, &from_context
) < 0)
2614 /* If the filesystem doesn't support extended attributes,
2615 the original had no special security context and the
2616 target cannot have one either. */
2617 if (errno
== EOPNOTSUPP
)
2620 MSG_PUTS(_("\nCould not get security context for "));
2621 msg_outtrans(from_file
);
2625 if (getfilecon((char *)to_file
, &to_context
) < 0)
2627 MSG_PUTS(_("\nCould not get security context for "));
2628 msg_outtrans(to_file
);
2630 freecon (from_context
);
2633 if (strcmp(from_context
, to_context
) != 0)
2635 if (setfilecon((char *)to_file
, from_context
) < 0)
2637 MSG_PUTS(_("\nCould not set security context for "));
2638 msg_outtrans(to_file
);
2642 freecon(to_context
);
2643 freecon(from_context
);
2646 #endif /* HAVE_SELINUX */
2649 * Return a pointer to the ACL of file "fname" in allocated memory.
2650 * Return NULL if the ACL is not available for whatever reason.
2656 vim_acl_T ret
= NULL
;
2657 #ifdef HAVE_POSIX_ACL
2658 ret
= (vim_acl_T
)acl_get_file((char *)fname
, ACL_TYPE_ACCESS
);
2660 #ifdef HAVE_SOLARIS_ACL
2661 vim_acl_solaris_T
*aclent
;
2663 aclent
= malloc(sizeof(vim_acl_solaris_T
));
2664 if ((aclent
->acl_cnt
= acl((char *)fname
, GETACLCNT
, 0, NULL
)) < 0)
2669 aclent
->acl_entry
= malloc(aclent
->acl_cnt
* sizeof(aclent_t
));
2670 if (acl((char *)fname
, GETACL
, aclent
->acl_cnt
, aclent
->acl_entry
) < 0)
2672 free(aclent
->acl_entry
);
2676 ret
= (vim_acl_T
)aclent
;
2678 #if defined(HAVE_AIX_ACL)
2682 aclsize
= sizeof(struct acl
);
2683 aclent
= malloc(aclsize
);
2684 if (statacl((char *)fname
, STX_NORMAL
, aclent
, aclsize
) < 0)
2686 if (errno
== ENOSPC
)
2688 aclsize
= aclent
->acl_len
;
2689 aclent
= realloc(aclent
, aclsize
);
2690 if (statacl((char *)fname
, STX_NORMAL
, aclent
, aclsize
) < 0)
2702 ret
= (vim_acl_T
)aclent
;
2703 #endif /* HAVE_AIX_ACL */
2704 #endif /* HAVE_SOLARIS_ACL */
2705 #endif /* HAVE_POSIX_ACL */
2710 * Set the ACL of file "fname" to "acl" (unless it's NULL).
2713 mch_set_acl(fname
, aclent
)
2719 #ifdef HAVE_POSIX_ACL
2720 acl_set_file((char *)fname
, ACL_TYPE_ACCESS
, (acl_t
)aclent
);
2722 #ifdef HAVE_SOLARIS_ACL
2723 acl((char *)fname
, SETACL
, ((vim_acl_solaris_T
*)aclent
)->acl_cnt
,
2724 ((vim_acl_solaris_T
*)aclent
)->acl_entry
);
2727 chacl((char *)fname
, aclent
, ((struct acl
*)aclent
)->acl_len
);
2728 #endif /* HAVE_AIX_ACL */
2729 #endif /* HAVE_SOLARIS_ACL */
2730 #endif /* HAVE_POSIX_ACL */
2734 mch_free_acl(aclent
)
2739 #ifdef HAVE_POSIX_ACL
2740 acl_free((acl_t
)aclent
);
2742 #ifdef HAVE_SOLARIS_ACL
2743 free(((vim_acl_solaris_T
*)aclent
)->acl_entry
);
2748 #endif /* HAVE_AIX_ACL */
2749 #endif /* HAVE_SOLARIS_ACL */
2750 #endif /* HAVE_POSIX_ACL */
2755 * Set hidden flag for "name".
2762 /* can't hide a file */
2766 * return TRUE if "name" is a directory
2767 * return FALSE if "name" is not a directory
2768 * return FALSE for error
2776 if (*name
== NUL
) /* Some stat()s don't flag "" as an error. */
2778 if (stat((char *)name
, &statb
))
2780 #ifdef _POSIX_SOURCE
2781 return (S_ISDIR(statb
.st_mode
) ? TRUE
: FALSE
);
2783 return ((statb
.st_mode
& S_IFMT
) == S_IFDIR
? TRUE
: FALSE
);
2787 static int executable_file
__ARGS((char_u
*name
));
2790 * Return 1 if "name" is an executable file, 0 if not or it doesn't exist.
2793 executable_file(name
)
2798 if (stat((char *)name
, &st
))
2800 return S_ISREG(st
.st_mode
) && mch_access((char *)name
, X_OK
) == 0;
2804 * Return 1 if "name" can be found in $PATH and executed, 0 if not.
2805 * Return -1 if unknown.
2815 /* If it's an absolute or relative path don't need to use $PATH. */
2816 if (mch_isFullName(name
) || (name
[0] == '.' && (name
[1] == '/'
2817 || (name
[1] == '.' && name
[2] == '/'))))
2818 return executable_file(name
);
2820 p
= (char_u
*)getenv("PATH");
2821 if (p
== NULL
|| *p
== NUL
)
2823 buf
= alloc((unsigned)(STRLEN(name
) + STRLEN(p
) + 2));
2828 * Walk through all entries in $PATH to check if "name" exists there and
2829 * is an executable file.
2833 e
= (char_u
*)strchr((char *)p
, ':');
2836 if (e
- p
<= 1) /* empty entry means current dir */
2840 vim_strncpy(buf
, p
, e
- p
);
2844 retval
= executable_file(buf
);
2858 * Check what "name" is:
2859 * NODE_NORMAL: file or directory (or doesn't exist)
2860 * NODE_WRITABLE: writable device, socket, fifo, etc.
2861 * NODE_OTHER: non-writable things
2869 if (stat((char *)name
, &st
))
2871 if (S_ISREG(st
.st_mode
) || S_ISDIR(st
.st_mode
))
2874 if (S_ISBLK(st
.st_mode
)) /* block device isn't writable */
2877 /* Everything else is writable? */
2878 return NODE_WRITABLE
;
2884 #ifdef HAVE_CHECK_STACK_GROWTH
2887 check_stack_growth((char *)&i
);
2889 # ifdef HAVE_STACK_LIMIT
2896 * Setup an alternative stack for signals. Helps to catch signals when
2897 * running out of stack space.
2898 * Use of sigaltstack() is preferred, it's more portable.
2899 * Ignore any errors.
2901 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
2902 signal_stack
= malloc(SIGSTKSZ
);
2903 init_signal_stack();
2907 #if defined(EXITFREE) || defined(PROTO)
2911 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
2912 if (clip_star
.owned
)
2913 clip_lose_selection(&clip_star
);
2914 if (clip_plus
.owned
)
2915 clip_lose_selection(&clip_plus
);
2917 # if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
2918 if (xterm_Shell
!= (Widget
)0)
2919 XtDestroyWidget(xterm_Shell
);
2920 # ifndef LESSTIF_VERSION
2921 /* Lesstif crashes here, lose some memory */
2922 if (xterm_dpy
!= NULL
)
2923 XtCloseDisplay(xterm_dpy
);
2924 if (app_context
!= (XtAppContext
)NULL
)
2926 XtDestroyApplicationContext(app_context
);
2928 x11_display
= NULL
; /* freed by XtDestroyApplicationContext() */
2934 if (x11_display
!= NULL
2935 # ifdef FEAT_XCLIPBOARD
2936 && x11_display
!= xterm_dpy
2939 XCloseDisplay(x11_display
);
2941 # if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
2942 vim_free(signal_stack
);
2943 signal_stack
= NULL
;
2952 static void exit_scroll
__ARGS((void));
2955 * Output a newline when exiting.
2956 * Make sure the newline goes to the same stream as the text.
2963 if (newline_on_exit
|| msg_didout
)
2965 if (msg_use_printf())
2977 restore_cterm_colors(); /* get original colors back */
2978 msg_clr_eos_force(); /* clear the rest of the display */
2979 windgoto((int)Rows
- 1, 0); /* may have moved the cursor */
2989 #if defined(FEAT_X11) && defined(FEAT_CLIPBOARD)
2990 x11_export_final_selection();
2997 settmode(TMODE_COOK
);
2999 mch_restore_title(3); /* restore xterm title and icon name */
3002 * When t_ti is not empty but it doesn't cause swapping terminal
3003 * pages, need to output a newline when msg_didout is set. But when
3004 * t_ti does swap pages it should not go to the shell page. Do this
3005 * before stoptermcap().
3007 if (swapping_screen() && !newline_on_exit
)
3010 /* Stop termcap: May need to check for T_CRV response, which
3011 * requires RAW mode. */
3015 * A newline is only required after a message in the alternate screen.
3016 * This is set to TRUE by wait_return().
3018 if (!swapping_screen() || newline_on_exit
)
3021 /* Cursor may have been switched off without calling starttermcap()
3022 * when doing "vim -u vimrc" and vimrc contains ":q". */
3027 ml_close_all(TRUE
); /* remove all memfiles */
3034 #ifdef MACOS_CONVERT
3039 /* A core dump won't be created if the signal handler
3040 * doesn't return, so we can't call exit() */
3041 if (deadly_signal
!= 0)
3045 #ifdef FEAT_NETBEANS_INTG
3047 netbeans_send_disconnect();
3060 if (deadly_signal
!= 0)
3062 signal(deadly_signal
, SIG_DFL
);
3063 kill(getpid(), deadly_signal
); /* Die using the signal we caught */
3073 static int first
= TRUE
;
3075 /* Why is NeXT excluded here (and not in os_unixx.h)? */
3076 #if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
3078 * for "new" tty systems
3080 # ifdef HAVE_TERMIOS_H
3081 static struct termios told
;
3082 struct termios tnew
;
3084 static struct termio told
;
3091 # if defined(HAVE_TERMIOS_H)
3092 tcgetattr(read_cmd_fd
, &told
);
3094 ioctl(read_cmd_fd
, TCGETA
, &told
);
3099 if (tmode
== TMODE_RAW
)
3102 * ~ICRNL enables typing ^V^M
3104 tnew
.c_iflag
&= ~ICRNL
;
3105 tnew
.c_lflag
&= ~(ICANON
| ECHO
| ISIG
| ECHOE
3106 # if defined(IEXTEN) && !defined(__MINT__)
3107 | IEXTEN
/* IEXTEN enables typing ^V on SOLARIS */
3108 /* but it breaks function keys on MINT */
3111 # ifdef ONLCR /* don't map NL -> CR NL, we do it ourselves */
3112 tnew
.c_oflag
&= ~ONLCR
;
3114 tnew
.c_cc
[VMIN
] = 1; /* return after 1 char */
3115 tnew
.c_cc
[VTIME
] = 0; /* don't wait */
3117 else if (tmode
== TMODE_SLEEP
)
3118 tnew
.c_lflag
&= ~(ECHO
);
3120 # if defined(HAVE_TERMIOS_H)
3124 /* A signal may cause tcsetattr() to fail (e.g., SIGCONT). Retry a
3126 while (tcsetattr(read_cmd_fd
, TCSANOW
, &tnew
) == -1
3127 && errno
== EINTR
&& n
> 0)
3131 ioctl(read_cmd_fd
, TCSETA
, &tnew
);
3137 * for "old" tty systems
3140 # define TIOCSETN TIOCSETP /* for hpux 9.0 */
3142 static struct sgttyb ttybold
;
3143 struct sgttyb ttybnew
;
3148 ioctl(read_cmd_fd
, TIOCGETP
, &ttybold
);
3152 if (tmode
== TMODE_RAW
)
3154 ttybnew
.sg_flags
&= ~(CRMOD
| ECHO
);
3155 ttybnew
.sg_flags
|= RAW
;
3157 else if (tmode
== TMODE_SLEEP
)
3158 ttybnew
.sg_flags
&= ~(ECHO
);
3159 ioctl(read_cmd_fd
, TIOCSETN
, &ttybnew
);
3165 * Try to get the code for "t_kb" from the stty setting
3167 * Even if termcap claims a backspace key, the user's setting *should*
3168 * prevail. stty knows more about reality than termcap does, and if
3169 * somebody's usual erase key is DEL (which, for most BSD users, it will
3170 * be), they're going to get really annoyed if their erase key starts
3171 * doing forward deletes for no reason. (Eric Fischer)
3179 /* Why is NeXT excluded here (and not in os_unixx.h)? */
3180 #if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
3181 /* for "new" tty systems */
3182 # ifdef HAVE_TERMIOS_H
3183 struct termios keys
;
3188 # if defined(HAVE_TERMIOS_H)
3189 if (tcgetattr(read_cmd_fd
, &keys
) != -1)
3191 if (ioctl(read_cmd_fd
, TCGETA
, &keys
) != -1)
3194 buf
[0] = keys
.c_cc
[VERASE
];
3195 intr_char
= keys
.c_cc
[VINTR
];
3197 /* for "old" tty systems */
3200 if (ioctl(read_cmd_fd
, TIOCGETP
, &keys
) != -1)
3202 buf
[0] = keys
.sg_erase
;
3203 intr_char
= keys
.sg_kill
;
3206 add_termcode((char_u
*)"kb", buf
, FALSE
);
3209 * If <BS> and <DEL> are now the same, redefine <DEL>.
3211 p
= find_termcode((char_u
*)"kD");
3212 if (p
!= NULL
&& p
[0] == buf
[0] && p
[1] == buf
[1])
3216 } /* to keep cindent happy */
3222 #if defined(FEAT_MOUSE_TTY) || defined(PROTO)
3224 * Set mouse clicks on or off.
3230 static int ison
= FALSE
;
3231 int xterm_mouse_vers
;
3233 if (on
== ison
) /* return quickly if nothing to do */
3236 xterm_mouse_vers
= use_xterm_mouse();
3237 if (xterm_mouse_vers
> 0)
3239 if (on
) /* enable mouse events, use mouse tracking if available */
3240 out_str_nf((char_u
*)
3241 (xterm_mouse_vers
> 1
3242 ? IF_EB("\033[?1002h", ESC_STR
"[?1002h")
3243 : IF_EB("\033[?1000h", ESC_STR
"[?1000h")));
3244 else /* disable mouse events, could probably always send the same */
3245 out_str_nf((char_u
*)
3246 (xterm_mouse_vers
> 1
3247 ? IF_EB("\033[?1002l", ESC_STR
"[?1002l")
3248 : IF_EB("\033[?1000l", ESC_STR
"[?1000l")));
3252 # ifdef FEAT_MOUSE_DEC
3253 else if (ttym_flags
== TTYM_DEC
)
3255 if (on
) /* enable mouse events */
3256 out_str_nf((char_u
*)"\033[1;2'z\033[1;3'{");
3257 else /* disable mouse events */
3258 out_str_nf((char_u
*)"\033['z");
3263 # ifdef FEAT_MOUSE_GPM
3279 # ifdef FEAT_SYSMOUSE
3284 if (sysmouse_open() == OK
)
3295 # ifdef FEAT_MOUSE_JSB
3300 /* D - Enable Mouse up/down messages
3301 * L - Enable Left Button Reporting
3302 * M - Enable Middle Button Reporting
3303 * R - Enable Right Button Reporting
3304 * K - Enable SHIFT and CTRL key Reporting
3305 * + - Enable Advanced messaging of mouse moves and up/down messages
3307 * # - Numeric value of mouse pointer required
3308 * 0 = Multiview 2000 cursor, used as standard
3310 * 2 = Windows I Beam
3311 * 3 = Windows Hour Glass
3312 * 4 = Windows Cross Hair
3313 * 5 = Windows UP Arrow
3315 #ifdef JSBTERM_MOUSE_NONADVANCED /* Disables full feedback of pointer movements */
3316 out_str_nf((char_u
*)IF_EB("\033[0~ZwLMRK1Q\033\\",
3317 ESC_STR
"[0~ZwLMRK1Q" ESC_STR
"\\"));
3319 out_str_nf((char_u
*)IF_EB("\033[0~ZwLMRK+1Q\033\\",
3320 ESC_STR
"[0~ZwLMRK+1Q" ESC_STR
"\\"));
3326 out_str_nf((char_u
*)IF_EB("\033[0~ZwQ\033\\",
3327 ESC_STR
"[0~ZwQ" ESC_STR
"\\"));
3332 # ifdef FEAT_MOUSE_PTERM
3335 /* 1 = button press, 6 = release, 7 = drag, 1h...9l = right button */
3337 out_str_nf("\033[>1h\033[>6h\033[>7h\033[>1h\033[>9l");
3339 out_str_nf("\033[>1l\033[>6l\033[>7l\033[>1l\033[>9h");
3346 * Set the mouse termcode, depending on the 'term' and 'ttymouse' options.
3349 check_mouse_termcode()
3351 # ifdef FEAT_MOUSE_XTERM
3352 if (use_xterm_mouse()
3358 set_mouse_termcode(KS_MOUSE
, (char_u
*)(term_is_8bit(T_NAME
)
3359 ? IF_EB("\233M", CSI_STR
"M")
3360 : IF_EB("\033[M", ESC_STR
"[M")));
3361 if (*p_mouse
!= NUL
)
3363 /* force mouse off and maybe on to send possibly new mouse
3364 * activation sequence to the xterm, with(out) drag tracing. */
3365 mch_setmouse(FALSE
);
3370 del_mouse_termcode(KS_MOUSE
);
3373 # ifdef FEAT_MOUSE_GPM
3374 if (!use_xterm_mouse()
3379 set_mouse_termcode(KS_MOUSE
, (char_u
*)IF_EB("\033MG", ESC_STR
"MG"));
3382 # ifdef FEAT_SYSMOUSE
3383 if (!use_xterm_mouse()
3388 set_mouse_termcode(KS_MOUSE
, (char_u
*)IF_EB("\033MS", ESC_STR
"MS"));
3391 # ifdef FEAT_MOUSE_JSB
3392 /* conflicts with xterm mouse: "\033[" and "\033[M" ??? */
3393 if (!use_xterm_mouse()
3398 set_mouse_termcode(KS_JSBTERM_MOUSE
,
3399 (char_u
*)IF_EB("\033[0~zw", ESC_STR
"[0~zw"));
3401 del_mouse_termcode(KS_JSBTERM_MOUSE
);
3404 # ifdef FEAT_MOUSE_NET
3405 /* There is no conflict, but one may type "ESC }" from Insert mode. Don't
3406 * define it in the GUI or when using an xterm. */
3407 if (!use_xterm_mouse()
3412 set_mouse_termcode(KS_NETTERM_MOUSE
,
3413 (char_u
*)IF_EB("\033}", ESC_STR
"}"));
3415 del_mouse_termcode(KS_NETTERM_MOUSE
);
3418 # ifdef FEAT_MOUSE_DEC
3419 /* conflicts with xterm mouse: "\033[" and "\033[M" */
3420 if (!use_xterm_mouse()
3425 set_mouse_termcode(KS_DEC_MOUSE
, (char_u
*)(term_is_8bit(T_NAME
)
3426 ? IF_EB("\233", CSI_STR
) : IF_EB("\033[", ESC_STR
"[")));
3428 del_mouse_termcode(KS_DEC_MOUSE
);
3430 # ifdef FEAT_MOUSE_PTERM
3431 /* same as the dec mouse */
3432 if (!use_xterm_mouse()
3437 set_mouse_termcode(KS_PTERM_MOUSE
,
3438 (char_u
*) IF_EB("\033[", ESC_STR
"["));
3440 del_mouse_termcode(KS_PTERM_MOUSE
);
3446 * set screen mode, always fails.
3453 EMSG(_(e_screenmode
));
3460 * Try to get the current window size:
3461 * 1. with an ioctl(), most accurate method
3462 * 2. from the environment variables LINES and COLUMNS
3463 * 3. from the termcap
3464 * 4. keep using the old values
3465 * Return OK when size could be determined, FAIL otherwise.
3475 * For OS/2 use _scrsize().
3488 * 1. try using an ioctl. It is the most accurate method.
3490 * Try using TIOCGWINSZ first, some systems that have it also define
3491 * TIOCGSIZE but don't have a struct ttysize.
3498 /* When stdout is not a tty, use stdin for the ioctl(). */
3499 if (!isatty(fd
) && isatty(read_cmd_fd
))
3501 if (ioctl(fd
, TIOCGWINSZ
, &ws
) == 0)
3503 columns
= ws
.ws_col
;
3507 # else /* TIOCGWINSZ */
3513 /* When stdout is not a tty, use stdin for the ioctl(). */
3514 if (!isatty(fd
) && isatty(read_cmd_fd
))
3516 if (ioctl(fd
, TIOCGSIZE
, &ts
) == 0)
3518 columns
= ts
.ts_cols
;
3522 # endif /* TIOCGSIZE */
3523 # endif /* TIOCGWINSZ */
3526 * 2. get size from environment
3527 * When being POSIX compliant ('|' flag in 'cpoptions') this overrules
3528 * the ioctl() values!
3530 if (columns
== 0 || rows
== 0 || vim_strchr(p_cpo
, CPO_TSIZE
) != NULL
)
3532 if ((p
= (char_u
*)getenv("LINES")))
3533 rows
= atoi((char *)p
);
3534 if ((p
= (char_u
*)getenv("COLUMNS")))
3535 columns
= atoi((char *)p
);
3540 * 3. try reading "co" and "li" entries from termcap
3542 if (columns
== 0 || rows
== 0)
3543 getlinecol(&columns
, &rows
);
3547 * 4. If everything fails, use the old values
3549 if (columns
<= 0 || rows
<= 0)
3558 * Try to set the window size to Rows and Columns.
3566 * NOTE: if you get an error here that term_set_winsize() is
3567 * undefined, check the output of configure. It could probably not
3568 * find a ncurses, termcap or termlib library.
3570 term_set_winsize((int)Rows
, (int)Columns
);
3572 screen_start(); /* don't know where cursor is now */
3579 * Rows and/or Columns has changed.
3584 /* Nothing to do. */
3588 static void append_ga_line
__ARGS((garray_T
*gap
));
3591 * Append the text in "gap" below the cursor line and clear "gap".
3597 /* Remove trailing CR. */
3600 && ((char_u
*)gap
->ga_data
)[gap
->ga_len
- 1] == CAR
)
3602 ga_append(gap
, NUL
);
3603 ml_append(curwin
->w_cursor
.lnum
++, gap
->ga_data
, 0, FALSE
);
3609 mch_call_shell(cmd
, options
)
3611 int options
; /* SHELL_*, see vim.h */
3617 int tmode
= cur_tmode
;
3618 #ifdef USE_SYSTEM /* use system() to start the shell: simple but slow */
3621 char_u
*newcmd
; /* only needed for unix */
3624 * Set the preferred shell in the EMXSHELL environment variable (but
3625 * only if it is different from what is already in the environment).
3626 * Emx then takes care of whether to use "/c" or "-c" in an
3627 * intelligent way. Simply pass the whole thing to emx's system() call.
3628 * Emx also starts an interactive shell if system() is passed an empty
3633 if (((old
= (char_u
*)getenv("EMXSHELL")) == NULL
) || STRCMP(old
, p_sh
))
3635 /* should check HAVE_SETENV, but I know we don't have it. */
3636 p
= alloc(10 + strlen(p_sh
));
3639 sprintf((char *)p
, "EMXSHELL=%s", p_sh
);
3640 putenv((char *)p
); /* don't free the pointer! */
3647 if (options
& SHELL_COOKED
)
3648 settmode(TMODE_COOK
); /* set to normal mode */
3652 x
= system(""); /* this starts an interactive shell in emx */
3654 x
= system((char *)cmd
);
3655 /* system() returns -1 when error occurs in starting shell */
3656 if (x
== -1 && !emsg_silent
)
3658 MSG_PUTS(_("\nCannot execute shell "));
3662 # else /* not __EMX__ */
3664 x
= system((char *)p_sh
);
3668 if (ofn
= strchr((char *)cmd
, '>'))
3670 if (ifn
= strchr((char *)cmd
, '<'))
3675 p
= strchr(ifn
,' '); /* chop off any trailing spaces */
3680 x
= vms_sys((char *)cmd
, ofn
, ifn
);
3682 x
= system((char *)cmd
);
3684 newcmd
= lalloc(STRLEN(p_sh
)
3685 + (extra_shell_arg
== NULL
? 0 : STRLEN(extra_shell_arg
))
3686 + STRLEN(p_shcf
) + STRLEN(cmd
) + 4, TRUE
);
3691 sprintf((char *)newcmd
, "%s %s %s %s", p_sh
,
3692 extra_shell_arg
== NULL
? "" : (char *)extra_shell_arg
,
3695 x
= system((char *)newcmd
);
3701 x
= vms_sys_status(x
);
3706 MSG_PUTS(_("\nCannot execute shell sh\n"));
3707 # endif /* __EMX__ */
3708 else if (x
&& !(options
& SHELL_SILENT
))
3710 MSG_PUTS(_("\nshell returned "));
3711 msg_outnum((long)x
);
3715 if (tmode
== TMODE_RAW
)
3716 settmode(TMODE_RAW
); /* set to raw mode */
3722 #else /* USE_SYSTEM */ /* don't use system(), use fork()/exec() */
3724 # define EXEC_FAILED 122 /* Exit code when shell didn't execute. Don't use
3725 127, some shells use that already */
3727 char_u
*newcmd
= NULL
;
3731 # ifdef HAVE_UNION_WAIT
3742 int pty_master_fd
= -1; /* for pty's */
3744 int pty_slave_fd
= -1;
3747 int fd_toshell
[2]; /* for pipes */
3748 int fd_fromshell
[2];
3749 int pipe_error
= FALSE
;
3753 static char envbuf_Rows
[20];
3754 static char envbuf_Columns
[20];
3756 int did_settmode
= FALSE
; /* settmode(TMODE_RAW) called */
3759 if (options
& SHELL_COOKED
)
3760 settmode(TMODE_COOK
); /* set to normal mode */
3762 newcmd
= vim_strsave(p_sh
);
3763 if (newcmd
== NULL
) /* out of memory */
3767 * Do this loop twice:
3768 * 1: find number of arguments
3769 * 2: separate them and build argv[]
3771 for (i
= 0; i
< 2; ++i
)
3779 argv
[argc
] = (char *)p
;
3781 while (*p
&& (inquote
|| (*p
!= ' ' && *p
!= TAB
)))
3795 argv
= (char **)alloc((unsigned)((argc
+ 4) * sizeof(char *)));
3796 if (argv
== NULL
) /* out of memory */
3802 if (extra_shell_arg
!= NULL
)
3803 argv
[argc
++] = (char *)extra_shell_arg
;
3804 argv
[argc
++] = (char *)p_shcf
;
3805 argv
[argc
++] = (char *)cmd
;
3810 * For the GUI, when writing the output into the buffer and when reading
3811 * input from the buffer: Try using a pseudo-tty to get the stdin/stdout
3812 * of the executed command into the Vim window. Or use a pipe.
3814 if ((options
& (SHELL_READ
|SHELL_WRITE
))
3816 || (gui
.in_use
&& show_shell_mess
)
3822 * Try to open a master pty.
3823 * If this works, open the slave pty.
3824 * If the slave can't be opened, close the master pty.
3826 if (p_guipty
&& !(options
& (SHELL_READ
|SHELL_WRITE
)))
3828 pty_master_fd
= OpenPTY(&tty_name
); /* open pty */
3829 if (pty_master_fd
>= 0 && ((pty_slave_fd
=
3830 open(tty_name
, O_RDWR
| O_EXTRA
, 0)) < 0))
3832 close(pty_master_fd
);
3837 * If not opening a pty or it didn't work, try using pipes.
3839 if (pty_master_fd
< 0)
3842 pipe_error
= (pipe(fd_toshell
) < 0);
3843 if (!pipe_error
) /* pipe create OK */
3845 pipe_error
= (pipe(fd_fromshell
) < 0);
3846 if (pipe_error
) /* pipe create failed */
3848 close(fd_toshell
[0]);
3849 close(fd_toshell
[1]);
3854 MSG_PUTS(_("\nCannot create pipes\n"));
3860 if (!pipe_error
) /* pty or pipe opened or not used */
3863 beos_cleanup_read_thread();
3866 if ((pid
= fork()) == -1) /* maybe we should use vfork() */
3868 MSG_PUTS(_("\nCannot fork\n"));
3869 if ((options
& (SHELL_READ
|SHELL_WRITE
))
3871 || (gui
.in_use
&& show_shell_mess
)
3876 if (pty_master_fd
>= 0) /* close the pseudo tty */
3878 close(pty_master_fd
);
3879 close(pty_slave_fd
);
3881 else /* close the pipes */
3884 close(fd_toshell
[0]);
3885 close(fd_toshell
[1]);
3886 close(fd_fromshell
[0]);
3887 close(fd_fromshell
[1]);
3891 else if (pid
== 0) /* child */
3893 reset_signals(); /* handle signals normally */
3895 if (!show_shell_mess
|| (options
& SHELL_EXPAND
))
3900 * Don't want to show any message from the shell. Can't just
3901 * close stdout and stderr though, because some systems will
3902 * break if you try to write to them after that, so we must
3903 * use dup() to replace them with something else -- webb
3904 * Connect stdin to /dev/null too, so ":n `cat`" doesn't hang,
3905 * waiting for input.
3907 fd
= open("/dev/null", O_RDWR
| O_EXTRA
, 0);
3913 * If any of these open()'s and dup()'s fail, we just continue
3914 * anyway. It's not fatal, and on most systems it will make
3915 * no difference at all. On a few it will cause the execvp()
3916 * to exit with a non-zero status even when the completion
3917 * could be done, which is nothing too serious. If the open()
3918 * or dup() failed we'd just do the same thing ourselves
3923 dup(fd
); /* To replace stdin (file descriptor 0) */
3924 dup(fd
); /* To replace stdout (file descriptor 1) */
3925 dup(fd
); /* To replace stderr (file descriptor 2) */
3927 /* Don't need this now that we've duplicated it */
3931 else if ((options
& (SHELL_READ
|SHELL_WRITE
))
3939 /* Create our own process group, so that the child and all its
3940 * children can be kill()ed. Don't do this when using pipes,
3941 * because stdin is not a tty, we would loose /dev/tty. */
3946 if (pty_slave_fd
>= 0)
3948 /* push stream discipline modules */
3949 if (options
& SHELL_COOKED
)
3950 SetupSlavePTY(pty_slave_fd
);
3952 /* Try to become controlling tty (probably doesn't work,
3953 * unless run by root) */
3954 ioctl(pty_slave_fd
, TIOCSCTTY
, (char *)NULL
);
3958 /* Simulate to have a dumb terminal (for now) */
3960 setenv("TERM", "dumb", 1);
3961 sprintf((char *)envbuf
, "%ld", Rows
);
3962 setenv("ROWS", (char *)envbuf
, 1);
3963 sprintf((char *)envbuf
, "%ld", Rows
);
3964 setenv("LINES", (char *)envbuf
, 1);
3965 sprintf((char *)envbuf
, "%ld", Columns
);
3966 setenv("COLUMNS", (char *)envbuf
, 1);
3969 * Putenv does not copy the string, it has to remain valid.
3970 * Use a static array to avoid loosing allocated memory.
3972 putenv("TERM=dumb");
3973 sprintf(envbuf_Rows
, "ROWS=%ld", Rows
);
3974 putenv(envbuf_Rows
);
3975 sprintf(envbuf_Rows
, "LINES=%ld", Rows
);
3976 putenv(envbuf_Rows
);
3977 sprintf(envbuf_Columns
, "COLUMNS=%ld", Columns
);
3978 putenv(envbuf_Columns
);
3982 * stderr is only redirected when using the GUI, so that a
3983 * program like gpg can still access the terminal to get a
3984 * passphrase using stderr.
3987 if (pty_master_fd
>= 0)
3989 close(pty_master_fd
); /* close master side of pty */
3991 /* set up stdin/stdout/stderr for the child */
4002 close(pty_slave_fd
); /* has been dupped, close it now */
4007 /* set up stdin for the child */
4008 close(fd_toshell
[1]);
4011 close(fd_toshell
[0]);
4013 /* set up stdout for the child */
4014 close(fd_fromshell
[0]);
4016 dup(fd_fromshell
[1]);
4017 close(fd_fromshell
[1]);
4022 /* set up stderr for the child */
4031 * There is no type cast for the argv, because the type may be
4032 * different on different machines. This may cause a warning
4033 * message with strict compilers, don't worry about it.
4034 * Call _exit() instead of exit() to avoid closing the connection
4035 * to the X server (esp. with GTK, which uses atexit()).
4037 execvp(argv
[0], argv
);
4038 _exit(EXEC_FAILED
); /* exec failed, return failure code */
4043 * While child is running, ignore terminating signals.
4044 * Do catch CTRL-C, so that "got_int" is set.
4046 catch_signals(SIG_IGN
, SIG_ERR
);
4050 * For the GUI we redirect stdin, stdout and stderr to our window.
4051 * This is also used to pipe stdin/stdout to/from the external
4054 if ((options
& (SHELL_READ
|SHELL_WRITE
))
4056 || (gui
.in_use
&& show_shell_mess
)
4060 # define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */
4061 char_u buffer
[BUFLEN
+ 1];
4063 int buffer_off
= 0; /* valid bytes in buffer[] */
4065 char_u ta_buf
[BUFLEN
+ 1]; /* TypeAHead */
4066 int ta_len
= 0; /* valid bytes in ta_buf[] */
4077 if (pty_master_fd
>= 0)
4079 close(pty_slave_fd
); /* close slave side of pty */
4080 fromshell_fd
= pty_master_fd
;
4081 toshell_fd
= dup(pty_master_fd
);
4086 close(fd_toshell
[0]);
4087 close(fd_fromshell
[1]);
4088 toshell_fd
= fd_toshell
[1];
4089 fromshell_fd
= fd_fromshell
[0];
4093 * Write to the child if there are typed characters.
4094 * Read from the child if there are characters available.
4095 * Repeat the reading a few times if more characters are
4096 * available. Need to check for typed keys now and then, but
4097 * not too often (delays when no chars are available).
4098 * This loop is quit if no characters can be read from the pty
4099 * (WaitForChar detected special condition), or there are no
4100 * characters available and the child has exited.
4101 * Only check if the child has exited when there is no more
4102 * output. The child may exit before all the output has
4105 * Currently this busy loops!
4106 * This can probably dead-lock when the write blocks!
4108 p_more_save
= p_more
;
4111 State
= EXTERNCMD
; /* don't redraw at window resize */
4113 if ((options
& SHELL_WRITE
) && toshell_fd
>= 0)
4115 /* Fork a process that will write the lines to the
4116 * external program. */
4117 if ((wpid
= fork()) == -1)
4119 MSG_PUTS(_("\nCannot fork\n"));
4123 linenr_T lnum
= curbuf
->b_op_start
.lnum
;
4125 char_u
*lp
= ml_get(lnum
);
4130 close(fromshell_fd
);
4133 l
= STRLEN(lp
+ written
);
4136 else if (lp
[written
] == NL
)
4137 /* NL -> NUL translation */
4138 len
= write(toshell_fd
, "", (size_t)1);
4141 s
= vim_strchr(lp
+ written
, NL
);
4142 len
= write(toshell_fd
, (char *)lp
+ written
,
4143 s
== NULL
? l
: s
- (lp
+ written
));
4147 /* Finished a line, add a NL, unless this line
4148 * should not have one. */
4149 if (lnum
!= curbuf
->b_op_end
.lnum
4151 || (lnum
!= write_no_eol_lnum
4153 curbuf
->b_ml
.ml_line_count
4154 || curbuf
->b_p_eol
)))
4155 write(toshell_fd
, "\n", (size_t)1);
4157 if (lnum
> curbuf
->b_op_end
.lnum
)
4159 /* finished all the lines, close pipe */
4179 if (options
& SHELL_READ
)
4180 ga_init2(&ga
, 1, BUFLEN
);
4187 * Check if keys have been typed, write them to the child
4189 * Don't do this if we are expanding wild cards (would eat
4191 * Don't do this when filtering and terminal is in cooked
4192 * mode, the shell command will handle the I/O. Avoids
4193 * that a typed password is echoed for ssh or gpg command.
4194 * Don't get characters when the child has already
4195 * finished (wait_pid == 0).
4196 * Don't get extra characters when we already have one.
4197 * Don't read characters unless we didn't get output for a
4198 * while, avoids that ":r !ls" eats typeahead.
4201 if (!(options
& SHELL_EXPAND
)
4203 (SHELL_READ
|SHELL_WRITE
|SHELL_COOKED
))
4204 != (SHELL_READ
|SHELL_WRITE
|SHELL_COOKED
)
4212 && (len
= ui_inchar(ta_buf
,
4213 BUFLEN
, 10L, 0)) > 0)))
4217 * Check for CTRL-C: send interrupt signal to child.
4218 * Check for CTRL-D: EOF, close pipe to child.
4220 if (len
== 1 && (pty_master_fd
< 0 || cmd
!= NULL
))
4224 * Send SIGINT to the child's group or all
4225 * processes in our group.
4227 if (ta_buf
[ta_len
] == Ctrl_C
4228 || ta_buf
[ta_len
] == intr_char
)
4239 if (pty_master_fd
< 0 && toshell_fd
>= 0
4240 && ta_buf
[ta_len
] == Ctrl_D
)
4247 /* replace K_BS by <BS> and K_DEL by <DEL> */
4248 for (i
= ta_len
; i
< ta_len
+ len
; ++i
)
4250 if (ta_buf
[i
] == CSI
&& len
- i
> 2)
4252 c
= TERMCAP2KEY(ta_buf
[i
+ 1], ta_buf
[i
+ 2]);
4253 if (c
== K_DEL
|| c
== K_KDEL
|| c
== K_BS
)
4255 mch_memmove(ta_buf
+ i
+ 1, ta_buf
+ i
+ 3,
4256 (size_t)(len
- i
- 2));
4257 if (c
== K_DEL
|| c
== K_KDEL
)
4264 else if (ta_buf
[i
] == '\r')
4268 i
+= (*mb_ptr2len
)(ta_buf
+ i
) - 1;
4273 * For pipes: echo the typed characters.
4274 * For a pty this does not seem to work.
4276 if (pty_master_fd
< 0)
4278 for (i
= ta_len
; i
< ta_len
+ len
; ++i
)
4280 if (ta_buf
[i
] == '\n' || ta_buf
[i
] == '\b')
4281 msg_putchar(ta_buf
[i
]);
4285 int l
= (*mb_ptr2len
)(ta_buf
+ i
);
4287 msg_outtrans_len(ta_buf
+ i
, l
);
4292 msg_outtrans_len(ta_buf
+ i
, 1);
4294 windgoto(msg_row
, msg_col
);
4301 * Write the characters to the child, unless EOF has
4302 * been typed for pipes. Write one character at a
4303 * time, to avoid loosing too much typeahead.
4304 * When writing buffer lines, drop the typed
4305 * characters (only check for CTRL-C).
4307 if (options
& SHELL_WRITE
)
4309 else if (toshell_fd
>= 0)
4311 len
= write(toshell_fd
, (char *)ta_buf
, (size_t)1);
4315 mch_memmove(ta_buf
, ta_buf
+ len
, ta_len
);
4323 /* CTRL-C sends a signal to the child, we ignore it
4336 * Check if the child has any characters to be printed.
4337 * Read them and write them to our window. Repeat this as
4338 * long as there is something to do, avoid the 10ms wait
4339 * for mch_inchar(), or sending typeahead characters to
4340 * the external process.
4341 * TODO: This should handle escape sequences, compatible
4342 * to some terminal (vt52?).
4345 while (RealWaitForChar(fromshell_fd
, 10L, NULL
))
4347 len
= read(fromshell_fd
, (char *)buffer
4349 + buffer_off
, (size_t)(BUFLEN
- buffer_off
)
4354 if (len
<= 0) /* end of file or error */
4358 if (options
& SHELL_READ
)
4360 /* Do NUL -> NL translation, append NL separated
4361 * lines to the current buffer. */
4362 for (i
= 0; i
< len
; ++i
)
4364 if (buffer
[i
] == NL
)
4365 append_ga_line(&ga
);
4366 else if (buffer
[i
] == NUL
)
4369 ga_append(&ga
, buffer
[i
]);
4380 /* Check if the last character in buffer[] is
4381 * incomplete, keep these bytes for the next
4383 for (p
= buffer
; p
< buffer
+ len
; p
+= l
)
4387 l
= 1; /* NUL byte? */
4388 else if (MB_BYTE2LEN(*p
) != l
)
4391 if (p
== buffer
) /* no complete character */
4393 /* avoid getting stuck at an illegal byte */
4405 if (p
< buffer
+ len
)
4408 buffer_off
= (buffer
+ len
) - p
;
4409 mch_memmove(buffer
, p
, buffer_off
);
4414 # endif /* FEAT_MBYTE */
4421 windgoto(msg_row
, msg_col
);
4428 /* If we already detected the child has finished break the
4430 if (wait_pid
== pid
)
4434 * Check if the child still exists, before checking for
4435 * typed characters (otherwise we would loose typeahead).
4438 wait_pid
= wait4(pid
, &status
, WNOHANG
, (struct rusage
*) 0);
4440 wait_pid
= waitpid(pid
, &status
, WNOHANG
);
4442 if ((wait_pid
== (pid_t
)-1 && errno
== ECHILD
)
4443 || (wait_pid
== pid
&& WIFEXITED(status
)))
4445 /* Don't break the loop yet, try reading more
4446 * characters from "fromshell_fd" first. When using
4447 * pipes there might still be something to read and
4448 * then we'll break the loop at the "break" above. */
4455 p_more
= p_more_save
;
4456 if (options
& SHELL_READ
)
4460 append_ga_line(&ga
);
4461 /* remember that the NL was missing */
4462 write_no_eol_lnum
= curwin
->w_cursor
.lnum
;
4465 write_no_eol_lnum
= 0;
4470 * Give all typeahead that wasn't used back to ui_inchar().
4473 ui_inchar_undo(ta_buf
, ta_len
);
4475 if (toshell_fd
>= 0)
4477 close(fromshell_fd
);
4481 * Wait until our child has exited.
4482 * Ignore wait() returning pids of other children and returning
4483 * because of some signal like SIGWINCH.
4484 * Don't wait if wait_pid was already set above, indicating the
4485 * child already exited.
4487 while (wait_pid
!= pid
)
4489 # ifdef _THREAD_SAFE
4490 /* Ugly hack: when compiled with Python threads are probably
4491 * used, in which case wait() sometimes hangs for no obvious
4492 * reason. Use waitpid() instead and loop (like the GUI). */
4494 wait_pid
= wait4(pid
, &status
, WNOHANG
, (struct rusage
*)0);
4496 wait_pid
= waitpid(pid
, &status
, WNOHANG
);
4500 /* Wait for 1/100 sec before trying again. */
4501 mch_delay(10L, TRUE
);
4505 wait_pid
= wait(&status
);
4515 /* Make sure the child that writes to the external program is
4518 kill(wpid
, SIGKILL
);
4521 * Set to raw mode right now, otherwise a CTRL-C after
4522 * catch_signals() will kill Vim.
4524 if (tmode
== TMODE_RAW
)
4525 settmode(TMODE_RAW
);
4526 did_settmode
= TRUE
;
4529 if (WIFEXITED(status
))
4531 /* LINTED avoid "bitwise operation on signed value" */
4532 retval
= WEXITSTATUS(status
);
4533 if (retval
&& !emsg_silent
)
4535 if (retval
== EXEC_FAILED
)
4537 MSG_PUTS(_("\nCannot execute shell "));
4541 else if (!(options
& SHELL_SILENT
))
4543 MSG_PUTS(_("\nshell returned "));
4544 msg_outnum((long)retval
);
4550 MSG_PUTS(_("\nCommand terminated\n"));
4557 if (tmode
== TMODE_RAW
)
4558 settmode(TMODE_RAW
); /* set to raw mode */
4566 #endif /* USE_SYSTEM */
4570 * Check for CTRL-C typed by reading all available characters.
4571 * In cooked mode we should get SIGINT, no need to check.
4576 if (curr_tmode
== TMODE_RAW
&& RealWaitForChar(read_cmd_fd
, 0L, NULL
))
4577 fill_input_buf(FALSE
);
4581 * Wait "msec" msec until a character is available from the keyboard or from
4582 * inbuf[]. msec == -1 will block forever.
4583 * When a GUI is being used, this will never get called -- webb
4589 #ifdef FEAT_MOUSE_GPM
4590 int gpm_process_wanted
;
4592 #ifdef FEAT_XCLIPBOARD
4597 if (input_available()) /* something in inbuf[] */
4600 #if defined(FEAT_MOUSE_DEC)
4601 /* May need to query the mouse position. */
4604 WantQueryMouse
= FALSE
;
4605 mch_write((char_u
*)IF_EB("\033[1'|", ESC_STR
"[1'|"), 5);
4610 * For FEAT_MOUSE_GPM and FEAT_XCLIPBOARD we loop here to process mouse
4611 * events. This is a bit complicated, because they might both be defined.
4613 #if defined(FEAT_MOUSE_GPM) || defined(FEAT_XCLIPBOARD)
4614 # ifdef FEAT_XCLIPBOARD
4616 if (do_xterm_trace())
4621 # ifdef FEAT_XCLIPBOARD
4624 msec
= XT_TRACE_DELAY
;
4625 if (rest
>= 0 && rest
< XT_TRACE_DELAY
)
4631 # ifdef FEAT_MOUSE_GPM
4632 gpm_process_wanted
= 0;
4633 avail
= RealWaitForChar(read_cmd_fd
, msec
, &gpm_process_wanted
);
4635 avail
= RealWaitForChar(read_cmd_fd
, msec
, NULL
);
4639 if (input_available())
4641 # ifdef FEAT_XCLIPBOARD
4642 if (rest
== 0 || !do_xterm_trace())
4648 # ifdef FEAT_MOUSE_GPM
4649 || (gpm_process_wanted
&& mch_gpm_process() == 0)
4651 # ifdef FEAT_XCLIPBOARD
4652 || (!avail
&& rest
!= 0)
4657 avail
= RealWaitForChar(read_cmd_fd
, msec
, NULL
);
4663 * Wait "msec" msec until a character is available from file descriptor "fd".
4664 * Time == -1 will block forever.
4665 * When a GUI is being used, this will not be used for input -- webb
4666 * Returns also, when a request from Sniff is waiting -- toni.
4667 * Or when a Linux GPM mouse event is waiting.
4670 #if defined(__BEOS__)
4675 RealWaitForChar(fd
, msec
, check_for_gpm
)
4681 #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME)
4682 static int busy
= FALSE
;
4684 /* May retry getting characters after an event was handled. */
4687 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
4688 /* Remember at what time we started, so that we know how much longer we
4689 * should wait after being interrupted. */
4690 # define USE_START_TV
4691 struct timeval start_tv
;
4694 # ifdef FEAT_XCLIPBOARD
4695 xterm_Shell
!= (Widget
)0
4696 # if defined(USE_XSMP) || defined(FEAT_MZSCHEME)
4702 # ifdef FEAT_MZSCHEME
4706 # ifdef FEAT_MZSCHEME
4707 (mzthreads_allowed() && p_mzq
> 0)
4710 gettimeofday(&start_tv
, NULL
);
4713 /* Handle being called recursively. This may happen for the session
4714 * manager stuff, it may save the file, which does a breakcheck. */
4724 int finished
= TRUE
; /* default is to 'loop' just once */
4725 # ifdef FEAT_MZSCHEME
4726 int mzquantum_used
= FALSE
;
4730 struct pollfd fds
[5];
4732 # ifdef FEAT_XCLIPBOARD
4735 # ifdef FEAT_MOUSE_GPM
4741 int towait
= (int)msec
;
4743 # ifdef FEAT_MZSCHEME
4744 mzvim_check_threads();
4745 if (mzthreads_allowed() && p_mzq
> 0 && (msec
< 0 || msec
> p_mzq
))
4747 towait
= (int)p_mzq
; /* don't wait longer than 'mzquantum' */
4748 mzquantum_used
= TRUE
;
4752 fds
[0].events
= POLLIN
;
4756 # define SNIFF_IDX 1
4757 if (want_sniff_request
)
4759 fds
[SNIFF_IDX
].fd
= fd_from_sniff
;
4760 fds
[SNIFF_IDX
].events
= POLLIN
;
4764 # ifdef FEAT_XCLIPBOARD
4765 if (xterm_Shell
!= (Widget
)0)
4768 fds
[nfd
].fd
= ConnectionNumber(xterm_dpy
);
4769 fds
[nfd
].events
= POLLIN
;
4773 # ifdef FEAT_MOUSE_GPM
4774 if (check_for_gpm
!= NULL
&& gpm_flag
&& gpm_fd
>= 0)
4777 fds
[nfd
].fd
= gpm_fd
;
4778 fds
[nfd
].events
= POLLIN
;
4783 if (xsmp_icefd
!= -1)
4786 fds
[nfd
].fd
= xsmp_icefd
;
4787 fds
[nfd
].events
= POLLIN
;
4792 ret
= poll(fds
, nfd
, towait
);
4793 # ifdef FEAT_MZSCHEME
4794 if (ret
== 0 && mzquantum_used
)
4795 /* MzThreads scheduling is required and timeout occurred */
4801 sniff_disconnect(1);
4802 else if (want_sniff_request
)
4804 if (fds
[SNIFF_IDX
].revents
& POLLHUP
)
4805 sniff_disconnect(1);
4806 if (fds
[SNIFF_IDX
].revents
& POLLIN
)
4807 sniff_request_waiting
= 1;
4810 # ifdef FEAT_XCLIPBOARD
4811 if (xterm_Shell
!= (Widget
)0 && (fds
[xterm_idx
].revents
& POLLIN
))
4813 xterm_update(); /* Maybe we should hand out clipboard */
4814 if (--ret
== 0 && !input_available())
4819 # ifdef FEAT_MOUSE_GPM
4820 if (gpm_idx
>= 0 && (fds
[gpm_idx
].revents
& POLLIN
))
4826 if (xsmp_idx
>= 0 && (fds
[xsmp_idx
].revents
& (POLLIN
| POLLHUP
)))
4828 if (fds
[xsmp_idx
].revents
& POLLIN
)
4831 xsmp_handle_requests();
4834 else if (fds
[xsmp_idx
].revents
& POLLHUP
)
4837 verb_msg((char_u
*)_("XSMP lost ICE connection"));
4841 finished
= FALSE
; /* Try again */
4846 #else /* HAVE_SELECT */
4849 struct timeval
*tvp
;
4854 # ifdef FEAT_MZSCHEME
4855 mzvim_check_threads();
4856 if (mzthreads_allowed() && p_mzq
> 0 && (msec
< 0 || msec
> p_mzq
))
4858 towait
= p_mzq
; /* don't wait longer than 'mzquantum' */
4859 mzquantum_used
= TRUE
;
4863 /* don't check for incoming chars if not in raw mode, because select()
4864 * always returns TRUE then (in some version of emx.dll) */
4865 if (curr_tmode
!= TMODE_RAW
)
4871 tv
.tv_sec
= towait
/ 1000;
4872 tv
.tv_usec
= (towait
% 1000) * (1000000/1000);
4879 * Select on ready for reading and exceptional condition (end of file).
4881 FD_ZERO(&rfds
); /* calls bzero() on a sun */
4884 # if !defined(__QNX__) && !defined(__CYGWIN32__)
4885 /* For QNX select() always returns 1 if this is set. Why? */
4891 if (want_sniff_request
)
4893 FD_SET(fd_from_sniff
, &rfds
);
4894 FD_SET(fd_from_sniff
, &efds
);
4895 if (maxfd
< fd_from_sniff
)
4896 maxfd
= fd_from_sniff
;
4899 # ifdef FEAT_XCLIPBOARD
4900 if (xterm_Shell
!= (Widget
)0)
4902 FD_SET(ConnectionNumber(xterm_dpy
), &rfds
);
4903 if (maxfd
< ConnectionNumber(xterm_dpy
))
4904 maxfd
= ConnectionNumber(xterm_dpy
);
4907 # ifdef FEAT_MOUSE_GPM
4908 if (check_for_gpm
!= NULL
&& gpm_flag
&& gpm_fd
>= 0)
4910 FD_SET(gpm_fd
, &rfds
);
4911 FD_SET(gpm_fd
, &efds
);
4917 if (xsmp_icefd
!= -1)
4919 FD_SET(xsmp_icefd
, &rfds
);
4920 FD_SET(xsmp_icefd
, &efds
);
4921 if (maxfd
< xsmp_icefd
)
4927 /* Old VMS as v6.2 and older have broken select(). It waits more than
4928 * required. Should not be used */
4931 ret
= select(maxfd
+ 1, &rfds
, NULL
, &efds
, tvp
);
4934 if (ret
== -1 && errno
== ENOTSUP
)
4941 # ifdef FEAT_MZSCHEME
4942 if (ret
== 0 && mzquantum_used
)
4943 /* loop if MzThreads must be scheduled and timeout occurred */
4949 sniff_disconnect(1);
4950 else if (ret
> 0 && want_sniff_request
)
4952 if (FD_ISSET(fd_from_sniff
, &efds
))
4953 sniff_disconnect(1);
4954 if (FD_ISSET(fd_from_sniff
, &rfds
))
4955 sniff_request_waiting
= 1;
4958 # ifdef FEAT_XCLIPBOARD
4959 if (ret
> 0 && xterm_Shell
!= (Widget
)0
4960 && FD_ISSET(ConnectionNumber(xterm_dpy
), &rfds
))
4962 xterm_update(); /* Maybe we should hand out clipboard */
4963 /* continue looping when we only got the X event and the input
4964 * buffer is empty */
4965 if (--ret
== 0 && !input_available())
4972 # ifdef FEAT_MOUSE_GPM
4973 if (ret
> 0 && gpm_flag
&& check_for_gpm
!= NULL
&& gpm_fd
>= 0)
4975 if (FD_ISSET(gpm_fd
, &efds
))
4977 else if (FD_ISSET(gpm_fd
, &rfds
))
4982 if (ret
> 0 && xsmp_icefd
!= -1)
4984 if (FD_ISSET(xsmp_icefd
, &efds
))
4987 verb_msg((char_u
*)_("XSMP lost ICE connection"));
4990 finished
= FALSE
; /* keep going if event was only one */
4992 else if (FD_ISSET(xsmp_icefd
, &rfds
))
4995 xsmp_handle_requests();
4998 finished
= FALSE
; /* keep going if event was only one */
5003 #endif /* HAVE_SELECT */
5006 if (finished
|| msec
== 0)
5009 /* We're going to loop around again, find out for how long */
5012 # ifdef USE_START_TV
5015 /* Compute remaining wait time. */
5016 gettimeofday(&mtv
, NULL
);
5017 msec
-= (mtv
.tv_sec
- start_tv
.tv_sec
) * 1000L
5018 + (mtv
.tv_usec
- start_tv
.tv_usec
) / 1000L;
5020 /* Guess we got interrupted halfway. */
5024 break; /* waited long enough */
5034 #ifndef NO_EXPANDPATH
5036 * Expand a path into all matching files and/or directories. Handles "*",
5037 * "?", "[a-z]", "**", etc.
5038 * "path" has backslashes before chars that are not to be expanded.
5039 * Returns the number of matches found.
5042 mch_expandpath(gap
, path
, flags
)
5045 int flags
; /* EW_* flags */
5047 return unix_expandpath(gap
, path
, 0, flags
, FALSE
);
5052 * mch_expand_wildcards() - this code does wild-card pattern matching using
5055 * return OK for success, FAIL for error (you may lose some memory) and put
5056 * an error message in *file.
5058 * num_pat is number of input patterns
5059 * pat is array of pointers to input patterns
5060 * num_file is pointer to number of matched file names
5061 * file is pointer to array of pointers to matched file names
5071 #define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|"
5075 mch_expand_wildcards(num_pat
, pat
, num_file
, file
, flags
)
5080 int flags
; /* EW_* flags */
5088 * This is the OS/2 implementation.
5090 # define EXPL_ALLOC_INC 16
5091 char_u
**expl_files
;
5092 size_t files_alloced
, files_free
;
5096 *num_file
= 0; /* default: no files found */
5097 files_alloced
= EXPL_ALLOC_INC
; /* how much space is allocated */
5098 files_free
= EXPL_ALLOC_INC
; /* how much space is not used */
5099 *file
= (char_u
**)alloc(sizeof(char_u
**) * files_alloced
);
5103 for (; num_pat
> 0; num_pat
--, pat
++)
5106 if (vim_strchr(*pat
, '$') || vim_strchr(*pat
, '~'))
5107 /* expand environment var or home dir */
5108 buf
= expand_env_save(*pat
);
5110 buf
= vim_strsave(*pat
);
5112 has_wildcard
= mch_has_exp_wildcard(buf
); /* (still) wildcards? */
5113 if (has_wildcard
) /* yes, so expand them */
5114 expl_files
= (char_u
**)_fnexplode(buf
);
5117 * return value of buf if no wildcards left,
5118 * OR if no match AND EW_NOTFOUND is set.
5120 if ((!has_wildcard
&& ((flags
& EW_NOTFOUND
) || mch_getperm(buf
) >= 0))
5121 || (expl_files
== NULL
&& (flags
& EW_NOTFOUND
)))
5122 { /* simply save the current contents of *buf */
5123 expl_files
= (char_u
**)alloc(sizeof(char_u
**) * 2);
5124 if (expl_files
!= NULL
)
5126 expl_files
[0] = vim_strsave(buf
);
5127 expl_files
[1] = NULL
;
5133 * Count number of names resulting from expansion,
5134 * At the same time add a backslash to the end of names that happen to
5135 * be directories, and replace slashes with backslashes.
5139 for (i
= 0; (p
= expl_files
[i
]) != NULL
; i
++)
5142 /* If we don't want dirs and this is one, skip it */
5143 if ((dir
&& !(flags
& EW_DIR
)) || (!dir
&& !(flags
& EW_FILE
)))
5146 /* Skip files that are not executable if we check for that. */
5147 if (!dir
&& (flags
& EW_EXEC
) && !mch_can_exe(p
))
5150 if (--files_free
== 0)
5152 /* need more room in table of pointers */
5153 files_alloced
+= EXPL_ALLOC_INC
;
5154 *file
= (char_u
**)vim_realloc(*file
,
5155 sizeof(char_u
**) * files_alloced
);
5158 EMSG(_(e_outofmem
));
5162 files_free
= EXPL_ALLOC_INC
;
5167 /* For a directory we add a '/', unless it's already
5170 if (((*file
)[*num_file
] = alloc(len
+ 2)) != NULL
)
5172 STRCPY((*file
)[*num_file
], p
);
5173 if (!after_pathsep((*file
)[*num_file
],
5174 (*file
)[*num_file
] + len
))
5176 (*file
)[*num_file
][len
] = psepc
;
5177 (*file
)[*num_file
][len
+ 1] = NUL
;
5183 (*file
)[*num_file
] = vim_strsave(p
);
5187 * Error message already given by either alloc or vim_strsave.
5188 * Should return FAIL, but returning OK works also.
5190 if ((*file
)[*num_file
] == NULL
)
5194 _fnexplodefree((char **)expl_files
);
5201 * This is the non-OS/2 implementation (really Unix).
5208 #define STYLE_ECHO 0 /* use "echo", the default */
5209 #define STYLE_GLOB 1 /* use "glob", for csh */
5210 #define STYLE_VIMGLOB 2 /* use "vimglob", for Posix sh */
5211 #define STYLE_PRINT 3 /* use "print -N", for zsh */
5212 #define STYLE_BT 4 /* `cmd` expansion, execute the pattern
5214 int shell_style
= STYLE_ECHO
;
5216 static int did_find_nul
= FALSE
;
5217 int ampersent
= FALSE
;
5218 /* vimglob() function to define for Posix shell */
5219 static char *sh_vimglob_func
= "vimglob() { while [ $# -ge 1 ]; do echo \"$1\"; shift; done }; vimglob >";
5221 *num_file
= 0; /* default: no files found */
5225 * If there are no wildcards, just copy the names to allocated memory.
5226 * Saves a lot of time, because we don't have to start a new shell.
5228 if (!have_wildcard(num_pat
, pat
))
5229 return save_patterns(num_pat
, pat
, num_file
, file
);
5231 # ifdef HAVE_SANDBOX
5232 /* Don't allow any shell command in the sandbox. */
5233 if (sandbox
!= 0 && check_secure())
5238 * Don't allow the use of backticks in secure and restricted mode.
5240 if (secure
|| restricted
)
5241 for (i
= 0; i
< num_pat
; ++i
)
5242 if (vim_strchr(pat
[i
], '`') != NULL
5243 && (check_restricted() || check_secure()))
5247 * get a name for the temp file
5249 if ((tempname
= vim_tempname('o')) == NULL
)
5256 * Let the shell expand the patterns and write the result into the temp
5258 * STYLE_BT: NL separated
5259 * If expanding `cmd` execute it directly.
5260 * STYLE_GLOB: NUL separated
5261 * If we use *csh, "glob" will work better than "echo".
5262 * STYLE_PRINT: NL or NUL separated
5263 * If we use *zsh, "print -N" will work better than "glob".
5264 * STYLE_VIMGLOB: NL separated
5265 * If we use *sh*, we define "vimglob()".
5266 * STYLE_ECHO: space separated.
5267 * A shell we don't know, stay safe and use "echo".
5269 if (num_pat
== 1 && *pat
[0] == '`'
5270 && (len
= STRLEN(pat
[0])) > 2
5271 && *(pat
[0] + len
- 1) == '`')
5272 shell_style
= STYLE_BT
;
5273 else if ((len
= STRLEN(p_sh
)) >= 3)
5275 if (STRCMP(p_sh
+ len
- 3, "csh") == 0)
5276 shell_style
= STYLE_GLOB
;
5277 else if (STRCMP(p_sh
+ len
- 3, "zsh") == 0)
5278 shell_style
= STYLE_PRINT
;
5280 if (shell_style
== STYLE_ECHO
&& strstr((char *)gettail(p_sh
),
5282 shell_style
= STYLE_VIMGLOB
;
5284 /* Compute the length of the command. We need 2 extra bytes: for the
5285 * optional '&' and for the NUL.
5286 * Worst case: "unset nonomatch; print -N >" plus two is 29 */
5287 len
= STRLEN(tempname
) + 29;
5288 if (shell_style
== STYLE_VIMGLOB
)
5289 len
+= STRLEN(sh_vimglob_func
);
5291 for (i
= 0; i
< num_pat
; ++i
)
5293 /* Count the length of the patterns in the same way as they are put in
5294 * "command" below. */
5296 len
+= STRLEN(pat
[i
]) + 3; /* add space and two quotes */
5298 ++len
; /* add space */
5299 for (j
= 0; pat
[i
][j
] != NUL
; ++j
)
5301 if (vim_strchr(SHELL_SPECIAL
, pat
[i
][j
]) != NULL
)
5302 ++len
; /* may add a backslash */
5307 command
= alloc(len
);
5308 if (command
== NULL
)
5316 * Build the shell command:
5317 * - Set $nonomatch depending on EW_NOTFOUND (hopefully the shell
5319 * - Add the shell command to print the expanded names.
5320 * - Add the temp file name.
5321 * - Add the file name patterns.
5323 if (shell_style
== STYLE_BT
)
5325 /* change `command; command& ` to (command; command ) */
5326 STRCPY(command
, "(");
5327 STRCAT(command
, pat
[0] + 1); /* exclude first backtick */
5328 p
= command
+ STRLEN(command
) - 1;
5329 *p
-- = ')'; /* remove last backtick */
5330 while (p
> command
&& vim_iswhite(*p
))
5332 if (*p
== '&') /* remove trailing '&' */
5337 STRCAT(command
, ">");
5341 if (flags
& EW_NOTFOUND
)
5342 STRCPY(command
, "set nonomatch; ");
5344 STRCPY(command
, "unset nonomatch; ");
5345 if (shell_style
== STYLE_GLOB
)
5346 STRCAT(command
, "glob >");
5347 else if (shell_style
== STYLE_PRINT
)
5348 STRCAT(command
, "print -N >");
5349 else if (shell_style
== STYLE_VIMGLOB
)
5350 STRCAT(command
, sh_vimglob_func
);
5352 STRCAT(command
, "echo >");
5355 STRCAT(command
, tempname
);
5357 if (shell_style
!= STYLE_BT
)
5358 for (i
= 0; i
< num_pat
; ++i
)
5360 /* When using system() always add extra quotes, because the shell
5361 * is started twice. Otherwise put a backslash before special
5362 * characters, except inside ``. */
5364 STRCAT(command
, " \"");
5365 STRCAT(command
, pat
[i
]);
5366 STRCAT(command
, "\"");
5370 p
= command
+ STRLEN(command
);
5372 for (j
= 0; pat
[i
][j
] != NUL
; ++j
)
5374 if (pat
[i
][j
] == '`')
5376 else if (pat
[i
][j
] == '\\' && pat
[i
][j
+ 1] != NUL
)
5378 /* Remove a backslash, take char literally. But keep
5379 * backslash inside backticks, before a special character
5380 * and before a backtick. */
5382 || vim_strchr(SHELL_SPECIAL
, pat
[i
][j
+ 1]) != NULL
5383 || pat
[i
][j
+ 1] == '`')
5387 else if (!intick
&& vim_strchr(SHELL_SPECIAL
,
5389 /* Put a backslash before a special character, but not
5390 * when inside ``. */
5393 /* Copy one character. */
5399 if (flags
& EW_SILENT
)
5400 show_shell_mess
= FALSE
;
5402 STRCAT(command
, "&"); /* put the '&' after the redirection */
5405 * Using zsh -G: If a pattern has no matches, it is just deleted from
5406 * the argument list, otherwise zsh gives an error message and doesn't
5407 * expand any other pattern.
5409 if (shell_style
== STYLE_PRINT
)
5410 extra_shell_arg
= (char_u
*)"-G"; /* Use zsh NULL_GLOB option */
5413 * If we use -f then shell variables set in .cshrc won't get expanded.
5414 * vi can do it, so we will too, but it is only necessary if there is a "$"
5415 * in one of the patterns, otherwise we can still use the fast option.
5417 else if (shell_style
== STYLE_GLOB
&& !have_dollars(num_pat
, pat
))
5418 extra_shell_arg
= (char_u
*)"-f"; /* Use csh fast option */
5421 * execute the shell command
5423 i
= call_shell(command
, SHELL_EXPAND
| SHELL_SILENT
);
5425 /* When running in the background, give it some time to create the temp
5426 * file, but don't wait for it to finish. */
5428 mch_delay(10L, TRUE
);
5430 extra_shell_arg
= NULL
; /* cleanup */
5431 show_shell_mess
= TRUE
;
5434 if (i
!= 0) /* mch_call_shell() failed */
5436 mch_remove(tempname
);
5439 * With interactive completion, the error message is not printed.
5440 * However with USE_SYSTEM, I don't know how to turn off error messages
5441 * from the shell, so screen may still get messed up -- webb.
5444 if (!(flags
& EW_SILENT
))
5447 redraw_later_clear(); /* probably messed up screen */
5448 msg_putchar('\n'); /* clear bottom line quickly */
5449 cmdline_row
= Rows
- 1; /* continue on last line */
5451 if (!(flags
& EW_SILENT
))
5454 MSG(_(e_wildexpand
));
5455 msg_start(); /* don't overwrite this message */
5458 /* If a `cmd` expansion failed, don't list `cmd` as a match, even when
5459 * EW_NOTFOUND is given */
5460 if (shell_style
== STYLE_BT
)
5466 * read the names from the file into memory
5468 fd
= fopen((char *)tempname
, READBIN
);
5471 /* Something went wrong, perhaps a file name with a special char. */
5472 if (!(flags
& EW_SILENT
))
5474 MSG(_(e_wildexpand
));
5475 msg_start(); /* don't overwrite this message */
5480 fseek(fd
, 0L, SEEK_END
);
5481 len
= ftell(fd
); /* get size of temp file */
5482 fseek(fd
, 0L, SEEK_SET
);
5483 buffer
= alloc(len
+ 1);
5487 mch_remove(tempname
);
5492 i
= fread((char *)buffer
, 1, len
, fd
);
5494 mch_remove(tempname
);
5497 /* unexpected read error */
5498 EMSG2(_(e_notread
), tempname
);
5505 # if defined(__CYGWIN__) || defined(__CYGWIN32__)
5506 /* Translate <CR><NL> into <NL>. Caution, buffer may contain NUL. */
5508 for (i
= 0; i
< len
; ++i
)
5509 if (!(buffer
[i
] == CAR
&& buffer
[i
+ 1] == NL
))
5515 /* file names are separated with Space */
5516 if (shell_style
== STYLE_ECHO
)
5518 buffer
[len
] = '\n'; /* make sure the buffer ends in NL */
5520 for (i
= 0; *p
!= '\n'; ++i
) /* count number of entries */
5522 while (*p
!= ' ' && *p
!= '\n')
5524 p
= skipwhite(p
); /* skip to next entry */
5527 /* file names are separated with NL */
5528 else if (shell_style
== STYLE_BT
|| shell_style
== STYLE_VIMGLOB
)
5530 buffer
[len
] = NUL
; /* make sure the buffer ends in NUL */
5532 for (i
= 0; *p
!= NUL
; ++i
) /* count number of entries */
5534 while (*p
!= '\n' && *p
!= NUL
)
5538 p
= skipwhite(p
); /* skip leading white space */
5541 /* file names are separated with NUL */
5545 * Some versions of zsh use spaces instead of NULs to separate
5546 * results. Only do this when there is no NUL before the end of the
5547 * buffer, otherwise we would never be able to use file names with
5548 * embedded spaces when zsh does use NULs.
5549 * When we found a NUL once, we know zsh is OK, set did_find_nul and
5550 * don't check for spaces again.
5552 check_spaces
= FALSE
;
5553 if (shell_style
== STYLE_PRINT
&& !did_find_nul
)
5555 /* If there is a NUL, set did_find_nul, else set check_spaces */
5556 if (len
&& (int)STRLEN(buffer
) < len
- 1)
5557 did_find_nul
= TRUE
;
5559 check_spaces
= TRUE
;
5563 * Make sure the buffer ends with a NUL. For STYLE_PRINT there
5564 * already is one, for STYLE_GLOB it needs to be added.
5566 if (len
&& buffer
[len
- 1] == NUL
)
5571 for (p
= buffer
; p
< buffer
+ len
; ++p
)
5572 if (*p
== NUL
|| (*p
== ' ' && check_spaces
)) /* count entry */
5578 ++i
; /* count last entry */
5583 * Can happen when using /bin/sh and typing ":e $NO_SUCH_VAR^I".
5584 * /bin/sh will happily expand it to nothing rather than returning an
5585 * error; and hey, it's good to check anyway -- webb.
5591 *file
= (char_u
**)alloc(sizeof(char_u
*) * i
);
5600 * Isolate the individual file names.
5603 for (i
= 0; i
< *num_file
; ++i
)
5606 /* Space or NL separates */
5607 if (shell_style
== STYLE_ECHO
|| shell_style
== STYLE_BT
5608 || shell_style
== STYLE_VIMGLOB
)
5610 while (!(shell_style
== STYLE_ECHO
&& *p
== ' ')
5611 && *p
!= '\n' && *p
!= NUL
)
5613 if (p
== buffer
+ len
) /* last entry */
5618 p
= skipwhite(p
); /* skip to next entry */
5621 else /* NUL separates */
5623 while (*p
&& p
< buffer
+ len
) /* skip entry */
5630 * Move the file names to allocated memory.
5632 for (j
= 0, i
= 0; i
< *num_file
; ++i
)
5634 /* Require the files to exist. Helps when using /bin/sh */
5635 if (!(flags
& EW_NOTFOUND
) && mch_getperm((*file
)[i
]) < 0)
5638 /* check if this entry should be included */
5639 dir
= (mch_isdir((*file
)[i
]));
5640 if ((dir
&& !(flags
& EW_DIR
)) || (!dir
&& !(flags
& EW_FILE
)))
5643 /* Skip files that are not executable if we check for that. */
5644 if (!dir
&& (flags
& EW_EXEC
) && !mch_can_exe((*file
)[i
]))
5647 p
= alloc((unsigned)(STRLEN((*file
)[i
]) + 1 + dir
));
5650 STRCPY(p
, (*file
)[i
]);
5652 add_pathsep(p
); /* add '/' to a directory name */
5659 if (*num_file
== 0) /* rejected all entries */
5669 if (flags
& EW_NOTFOUND
)
5670 return save_patterns(num_pat
, pat
, num_file
, file
);
5673 #endif /* __EMX__ */
5680 save_patterns(num_pat
, pat
, num_file
, file
)
5689 *file
= (char_u
**)alloc(num_pat
* sizeof(char_u
*));
5692 for (i
= 0; i
< num_pat
; i
++)
5694 s
= vim_strsave(pat
[i
]);
5696 /* Be compatible with expand_filename(): halve the number of
5701 *num_file
= num_pat
;
5708 * Return TRUE if the string "p" contains a wildcard that mch_expandpath() can
5712 mch_has_exp_wildcard(p
)
5715 for ( ; *p
; mb_ptr_adv(p
))
5718 if (*p
== '\\' && p
[1] != NUL
)
5722 if (vim_strchr((char_u
*)
5739 * Return TRUE if the string "p" contains a wildcard.
5740 * Don't recognize '~' at the end as a wildcard.
5746 for ( ; *p
; mb_ptr_adv(p
))
5749 if (*p
== '\\' && p
[1] != NUL
)
5753 if (vim_strchr((char_u
*)
5758 # ifdef VIM_BACKTICK
5768 || (*p
== '~' && p
[1] != NUL
))
5776 have_wildcard(num
, file
)
5782 for (i
= 0; i
< num
; i
++)
5783 if (mch_has_wildcard(file
[i
]))
5789 have_dollars(num
, file
)
5795 for (i
= 0; i
< num
; i
++)
5796 if (vim_strchr(file
[i
], '$') != NULL
)
5800 #endif /* ifndef __EMX__ */
5804 * Scaled-down version of rename(), which is missing in Xenix.
5805 * This version can only move regular files and will fail if the
5806 * destination exists.
5809 mch_rename(src
, dest
)
5810 const char *src
, *dest
;
5814 if (stat(dest
, &st
) >= 0) /* fail if destination exists */
5816 if (link(src
, dest
) != 0) /* link file to new name */
5818 if (mch_remove(src
) == 0) /* delete link to old name */
5822 #endif /* !HAVE_RENAME */
5824 #ifdef FEAT_MOUSE_GPM
5826 * Initializes connection with gpm (if it isn't already opened)
5827 * Return 1 if succeeded (or connection already opened), 0 if failed
5832 static Gpm_Connect gpm_connect
; /* Must it be kept till closing ? */
5836 gpm_connect
.eventMask
= (GPM_UP
| GPM_DRAG
| GPM_DOWN
);
5837 gpm_connect
.defaultMask
= ~GPM_HARD
;
5838 /* Default handling for mouse move*/
5839 gpm_connect
.minMod
= 0; /* Handle any modifier keys */
5840 gpm_connect
.maxMod
= 0xffff;
5841 if (Gpm_Open(&gpm_connect
, 0) > 0)
5843 /* gpm library tries to handling TSTP causes
5844 * problems. Anyways, we close connection to Gpm whenever
5845 * we are going to suspend or starting an external process
5846 * so we shouldn't have problem with this
5848 signal(SIGTSTP
, restricted
? SIG_IGN
: SIG_DFL
);
5849 return 1; /* succeed */
5852 Gpm_Close(); /* We don't want to talk to xterm via gpm */
5855 return 1; /* already open */
5859 * Closes connection to gpm
5864 if (gpm_flag
&& gpm_fd
>= 0) /* if Open */
5868 /* Reads gpm event and adds special keys to input buf. Returns length of
5869 * generated key sequence.
5870 * This function is made after gui_send_mouse_event
5876 static Gpm_Event gpm_event
;
5878 int_u vim_modifiers
;
5880 unsigned char buttons_mask
;
5881 unsigned char gpm_modifiers
;
5882 static unsigned char old_buttons
= 0;
5884 Gpm_GetEvent(&gpm_event
);
5887 /* Don't put events in the input queue now. */
5888 if (hold_gui_events
)
5892 row
= gpm_event
.y
- 1;
5893 col
= gpm_event
.x
- 1;
5895 string
[0] = ESC
; /* Our termcode */
5898 switch (GPM_BARE_EVENTS(gpm_event
.type
))
5901 string
[3] = MOUSE_DRAG
;
5904 buttons_mask
= gpm_event
.buttons
& ~old_buttons
;
5905 old_buttons
= gpm_event
.buttons
;
5906 switch (buttons_mask
)
5909 button
= MOUSE_LEFT
;
5912 button
= MOUSE_MIDDLE
;
5915 button
= MOUSE_RIGHT
;
5919 /*Don't know what to do. Can more than one button be
5920 * reported in one event? */
5922 string
[3] = (char_u
)(button
| 0x20);
5923 SET_NUM_MOUSE_CLICKS(string
[3], gpm_event
.clicks
+ 1);
5926 string
[3] = MOUSE_RELEASE
;
5927 old_buttons
&= ~gpm_event
.buttons
;
5932 /*This code is based on gui_x11_mouse_cb in gui_x11.c */
5933 gpm_modifiers
= gpm_event
.modifiers
;
5934 vim_modifiers
= 0x0;
5935 /* I ignore capslock stats. Aren't we all just hate capslock mixing with
5936 * Vim commands ? Besides, gpm_event.modifiers is unsigned char, and
5937 * K_CAPSSHIFT is defined 8, so it probably isn't even reported
5939 if (gpm_modifiers
& ((1 << KG_SHIFT
) | (1 << KG_SHIFTR
) | (1 << KG_SHIFTL
)))
5940 vim_modifiers
|= MOUSE_SHIFT
;
5942 if (gpm_modifiers
& ((1 << KG_CTRL
) | (1 << KG_CTRLR
) | (1 << KG_CTRLL
)))
5943 vim_modifiers
|= MOUSE_CTRL
;
5944 if (gpm_modifiers
& ((1 << KG_ALT
) | (1 << KG_ALTGR
)))
5945 vim_modifiers
|= MOUSE_ALT
;
5946 string
[3] |= vim_modifiers
;
5947 string
[4] = (char_u
)(col
+ ' ' + 1);
5948 string
[5] = (char_u
)(row
+ ' ' + 1);
5949 add_to_input_buf(string
, 6);
5952 #endif /* FEAT_MOUSE_GPM */
5954 #ifdef FEAT_SYSMOUSE
5956 * Initialize connection with sysmouse.
5957 * Let virtual console inform us with SIGUSR2 for pending sysmouse
5958 * output, any sysmouse output than will be processed via sig_sysmouse().
5959 * Return OK if succeeded, FAIL if failed.
5964 struct mouse_info mouse
;
5966 mouse
.operation
= MOUSE_MODE
;
5967 mouse
.u
.mode
.mode
= 0;
5968 mouse
.u
.mode
.signal
= SIGUSR2
;
5969 if (ioctl(1, CONS_MOUSECTL
, &mouse
) != -1)
5971 signal(SIGUSR2
, (RETSIGTYPE (*)())sig_sysmouse
);
5972 mouse
.operation
= MOUSE_SHOW
;
5973 ioctl(1, CONS_MOUSECTL
, &mouse
);
5980 * Stop processing SIGUSR2 signals, and also make sure that
5981 * virtual console do not send us any sysmouse related signal.
5986 struct mouse_info mouse
;
5988 signal(SIGUSR2
, restricted
? SIG_IGN
: SIG_DFL
);
5989 mouse
.operation
= MOUSE_MODE
;
5990 mouse
.u
.mode
.mode
= 0;
5991 mouse
.u
.mode
.signal
= 0;
5992 ioctl(1, CONS_MOUSECTL
, &mouse
);
5996 * Gets info from sysmouse and adds special keys to input buf.
6000 sig_sysmouse
SIGDEFARG(sigarg
)
6002 struct mouse_info mouse
;
6003 struct video_info video
;
6008 static int oldbuttons
= 0;
6011 /* Don't put events in the input queue now. */
6012 if (hold_gui_events
)
6016 mouse
.operation
= MOUSE_GETINFO
;
6017 if (ioctl(1, FBIO_GETMODE
, &video
.vi_mode
) != -1
6018 && ioctl(1, FBIO_MODEINFO
, &video
) != -1
6019 && ioctl(1, CONS_MOUSECTL
, &mouse
) != -1
6020 && video
.vi_cheight
> 0 && video
.vi_cwidth
> 0)
6022 row
= mouse
.u
.data
.y
/ video
.vi_cheight
;
6023 col
= mouse
.u
.data
.x
/ video
.vi_cwidth
;
6024 buttons
= mouse
.u
.data
.buttons
;
6025 string
[0] = ESC
; /* Our termcode */
6028 if (oldbuttons
== buttons
&& buttons
!= 0)
6030 button
= MOUSE_DRAG
;
6037 button
= MOUSE_RELEASE
;
6040 button
= MOUSE_LEFT
;
6043 button
= MOUSE_MIDDLE
;
6046 button
= MOUSE_RIGHT
;
6051 oldbuttons
= buttons
;
6053 string
[3] = (char_u
)(button
);
6054 string
[4] = (char_u
)(col
+ ' ' + 1);
6055 string
[5] = (char_u
)(row
+ ' ' + 1);
6056 add_to_input_buf(string
, 6);
6060 #endif /* FEAT_SYSMOUSE */
6062 #if defined(FEAT_LIBCALL) || defined(PROTO)
6063 typedef char_u
* (*STRPROCSTR
)__ARGS((char_u
*));
6064 typedef char_u
* (*INTPROCSTR
)__ARGS((int));
6065 typedef int (*STRPROCINT
)__ARGS((char_u
*));
6066 typedef int (*INTPROCINT
)__ARGS((int));
6069 * Call a DLL routine which takes either a string or int param
6070 * and returns an allocated string.
6073 mch_libcall(libname
, funcname
, argstring
, argint
, string_result
, number_result
)
6076 char_u
*argstring
; /* NULL when using a argint */
6078 char_u
**string_result
;/* NULL when using number_result */
6081 # if defined(USE_DLOPEN)
6088 INTPROCSTR ProcAddI
;
6089 char_u
*retval_str
= NULL
;
6091 int success
= FALSE
;
6094 * Get a handle to the DLL module.
6096 # if defined(USE_DLOPEN)
6097 /* First clear any error, it's not cleared by the dlopen() call. */
6100 hinstLib
= dlopen((char *)libname
, RTLD_LAZY
6105 if (hinstLib
== NULL
)
6107 /* "dlerr" must be used before dlclose() */
6108 dlerr
= (char *)dlerror();
6110 EMSG2(_("dlerror = \"%s\""), dlerr
);
6113 hinstLib
= shl_load((const char*)libname
, BIND_IMMEDIATE
|BIND_VERBOSE
, 0L);
6116 /* If the handle is valid, try to get the function address. */
6117 if (hinstLib
!= NULL
)
6119 # ifdef HAVE_SETJMP_H
6121 * Catch a crash when calling the library function. For example when
6122 * using a number where a string pointer is expected.
6125 if (SETJMP(lc_jump_env
) != 0)
6128 # if defined(USE_DLOPEN)
6139 if (argstring
!= NULL
)
6141 # if defined(USE_DLOPEN)
6142 ProcAdd
= (STRPROCSTR
)dlsym(hinstLib
, (const char *)funcname
);
6143 dlerr
= (char *)dlerror();
6145 if (shl_findsym(&hinstLib
, (const char *)funcname
,
6146 TYPE_PROCEDURE
, (void *)&ProcAdd
) < 0)
6149 if ((success
= (ProcAdd
!= NULL
6150 # if defined(USE_DLOPEN)
6155 if (string_result
== NULL
)
6156 retval_int
= ((STRPROCINT
)ProcAdd
)(argstring
);
6158 retval_str
= (ProcAdd
)(argstring
);
6163 # if defined(USE_DLOPEN)
6164 ProcAddI
= (INTPROCSTR
)dlsym(hinstLib
, (const char *)funcname
);
6165 dlerr
= (char *)dlerror();
6167 if (shl_findsym(&hinstLib
, (const char *)funcname
,
6168 TYPE_PROCEDURE
, (void *)&ProcAddI
) < 0)
6171 if ((success
= (ProcAddI
!= NULL
6172 # if defined(USE_DLOPEN)
6177 if (string_result
== NULL
)
6178 retval_int
= ((INTPROCINT
)ProcAddI
)(argint
);
6180 retval_str
= (ProcAddI
)(argint
);
6184 /* Save the string before we free the library. */
6185 /* Assume that a "1" or "-1" result is an illegal pointer. */
6186 if (string_result
== NULL
)
6187 *number_result
= retval_int
;
6188 else if (retval_str
!= NULL
6189 && retval_str
!= (char_u
*)1
6190 && retval_str
!= (char_u
*)-1)
6191 *string_result
= vim_strsave(retval_str
);
6194 # ifdef HAVE_SETJMP_H
6201 /* try to find the name of this signal */
6202 for (i
= 0; signal_info
[i
].sig
!= -1; i
++)
6203 if (lc_signal
== signal_info
[i
].sig
)
6205 EMSG2("E368: got SIG%s in libcall()", signal_info
[i
].name
);
6210 # if defined(USE_DLOPEN)
6211 /* "dlerr" must be used before dlclose() */
6213 EMSG2(_("dlerror = \"%s\""), dlerr
);
6215 /* Free the DLL module. */
6216 (void)dlclose(hinstLib
);
6218 (void)shl_unload(hinstLib
);
6224 EMSG2(_(e_libcall
), funcname
);
6232 #if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) || defined(PROTO)
6233 static int xterm_trace
= -1; /* default: disabled */
6234 static int xterm_button
;
6237 * Setup a dummy window for X selections in a terminal.
6246 if (!x_connect_to_server())
6250 if (app_context
!= NULL
&& xterm_Shell
== (Widget
)0)
6252 int (*oldhandler
)();
6253 #if defined(HAVE_SETJMP_H)
6254 int (*oldIOhandler
)();
6256 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
6257 struct timeval start_tv
;
6260 gettimeofday(&start_tv
, NULL
);
6263 /* Ignore X errors while opening the display */
6264 oldhandler
= XSetErrorHandler(x_error_check
);
6266 #if defined(HAVE_SETJMP_H)
6267 /* Ignore X IO errors while opening the display */
6268 oldIOhandler
= XSetIOErrorHandler(x_IOerror_check
);
6270 if (SETJMP(lc_jump_env
) != 0)
6278 xterm_dpy
= XtOpenDisplay(app_context
, xterm_display
,
6279 "vim_xterm", "Vim_xterm", NULL
, 0, &z
, &strp
);
6280 #if defined(HAVE_SETJMP_H)
6285 #if defined(HAVE_SETJMP_H)
6286 /* Now handle X IO errors normally. */
6287 (void)XSetIOErrorHandler(oldIOhandler
);
6289 /* Now handle X errors normally. */
6290 (void)XSetErrorHandler(oldhandler
);
6292 if (xterm_dpy
== NULL
)
6295 verb_msg((char_u
*)_("Opening the X display failed"));
6299 /* Catch terminating error of the X server connection. */
6300 (void)XSetIOErrorHandler(x_IOerror_handler
);
6302 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
6306 xopen_message(&start_tv
);
6311 /* Create a Shell to make converters work. */
6312 AppShell
= XtVaAppCreateShell("vim_xterm", "Vim_xterm",
6313 applicationShellWidgetClass
, xterm_dpy
,
6315 if (AppShell
== (Widget
)0)
6317 xterm_Shell
= XtVaCreatePopupShell("VIM",
6318 topLevelShellWidgetClass
, AppShell
,
6319 XtNmappedWhenManaged
, 0,
6323 if (xterm_Shell
== (Widget
)0)
6326 x11_setup_atoms(xterm_dpy
);
6327 if (x11_display
== NULL
)
6328 x11_display
= xterm_dpy
;
6330 XtRealizeWidget(xterm_Shell
);
6331 XSync(xterm_dpy
, False
);
6334 if (xterm_Shell
!= (Widget
)0)
6337 if (x11_window
== 0 && (strp
= getenv("WINDOWID")) != NULL
)
6338 x11_window
= (Window
)atol(strp
);
6339 /* Check if $WINDOWID is valid. */
6340 if (test_x11_window(xterm_dpy
) == FAIL
)
6342 if (x11_window
!= 0)
6348 start_xterm_trace(button
)
6351 if (x11_window
== 0 || xterm_trace
< 0 || xterm_Shell
== (Widget
)0)
6354 xterm_button
= button
;
6362 if (xterm_trace
< 0)
6368 * Query the xterm pointer and generate mouse termcodes if necessary
6369 * return TRUE if dragging is active, else FALSE
6382 static char_u
*mouse_code
;
6383 static char_u mouse_name
[2] = {KS_MOUSE
, KE_FILLER
};
6384 static int prev_row
= 0, prev_col
= 0;
6385 static XSizeHints xterm_hints
;
6387 if (xterm_trace
<= 0)
6390 if (xterm_trace
== 1)
6392 /* Get the hints just before tracking starts. The font size might
6393 * have changed recently. */
6394 if (!XGetWMNormalHints(xterm_dpy
, x11_window
, &xterm_hints
, &got_hints
)
6395 || !(got_hints
& PResizeInc
)
6396 || xterm_hints
.width_inc
<= 1
6397 || xterm_hints
.height_inc
<= 1)
6399 xterm_trace
= -1; /* Not enough data -- disable tracing */
6403 /* Rely on the same mouse code for the duration of this */
6404 mouse_code
= find_termcode(mouse_name
);
6405 prev_row
= mouse_row
;
6406 prev_row
= mouse_col
;
6409 /* Find the offset of the chars, there might be a scrollbar on the
6410 * left of the window and/or a menu on the top (eterm etc.) */
6411 XQueryPointer(xterm_dpy
, x11_window
, &root
, &child
, &root_x
, &root_y
,
6412 &win_x
, &win_y
, &mask_return
);
6413 xterm_hints
.y
= win_y
- (xterm_hints
.height_inc
* mouse_row
)
6414 - (xterm_hints
.height_inc
/ 2);
6415 if (xterm_hints
.y
<= xterm_hints
.height_inc
/ 2)
6417 xterm_hints
.x
= win_x
- (xterm_hints
.width_inc
* mouse_col
)
6418 - (xterm_hints
.width_inc
/ 2);
6419 if (xterm_hints
.x
<= xterm_hints
.width_inc
/ 2)
6423 if (mouse_code
== NULL
)
6429 XQueryPointer(xterm_dpy
, x11_window
, &root
, &child
, &root_x
, &root_y
,
6430 &win_x
, &win_y
, &mask_return
);
6432 row
= check_row((win_y
- xterm_hints
.y
) / xterm_hints
.height_inc
);
6433 col
= check_col((win_x
- xterm_hints
.x
) / xterm_hints
.width_inc
);
6434 if (row
== prev_row
&& col
== prev_col
)
6437 STRCPY(buf
, mouse_code
);
6438 strp
= buf
+ STRLEN(buf
);
6439 *strp
++ = (xterm_button
| MOUSE_DRAG
) & ~0x20;
6440 *strp
++ = (char_u
)(col
+ ' ' + 1);
6441 *strp
++ = (char_u
)(row
+ ' ' + 1);
6443 add_to_input_buf(buf
, STRLEN(buf
));
6450 # if defined(FEAT_GUI) || defined(PROTO)
6452 * Destroy the display, window and app_context. Required for GTK.
6457 if (xterm_Shell
!= (Widget
)0)
6459 XtDestroyWidget(xterm_Shell
);
6460 xterm_Shell
= (Widget
)0;
6462 if (xterm_dpy
!= NULL
)
6465 /* Lesstif and Solaris crash here, lose some memory */
6466 XtCloseDisplay(xterm_dpy
);
6468 if (x11_display
== xterm_dpy
)
6473 if (app_context
!= (XtAppContext
)NULL
)
6475 /* Lesstif and Solaris crash here, lose some memory */
6476 XtDestroyApplicationContext(app_context
);
6477 app_context
= (XtAppContext
)NULL
;
6484 * Catch up with any queued X events. This may put keyboard input into the
6485 * input buffer, call resize call-backs, trigger timers etc. If there is
6486 * nothing in the X event queue (& no timers pending), then we return
6494 while (XtAppPending(app_context
) && !vim_is_input_buf_full())
6496 XtAppNextEvent(app_context
, &event
);
6497 #ifdef FEAT_CLIENTSERVER
6499 XPropertyEvent
*e
= (XPropertyEvent
*)&event
;
6501 if (e
->type
== PropertyNotify
&& e
->window
== commWindow
6502 && e
->atom
== commProperty
&& e
->state
== PropertyNewValue
)
6503 serverEventProc(xterm_dpy
, &event
);
6506 XtDispatchEvent(&event
);
6511 clip_xterm_own_selection(cbd
)
6514 if (xterm_Shell
!= (Widget
)0)
6515 return clip_x11_own_selection(xterm_Shell
, cbd
);
6520 clip_xterm_lose_selection(cbd
)
6523 if (xterm_Shell
!= (Widget
)0)
6524 clip_x11_lose_selection(xterm_Shell
, cbd
);
6528 clip_xterm_request_selection(cbd
)
6531 if (xterm_Shell
!= (Widget
)0)
6532 clip_x11_request_selection(xterm_Shell
, xterm_dpy
, cbd
);
6536 clip_xterm_set_selection(cbd
)
6539 clip_x11_set_selection(cbd
);
6544 #if defined(USE_XSMP) || defined(PROTO)
6546 * Code for X Session Management Protocol.
6548 static void xsmp_handle_save_yourself
__ARGS((SmcConn smc_conn
, SmPointer client_data
, int save_type
, Bool shutdown
, int interact_style
, Bool fast
));
6549 static void xsmp_die
__ARGS((SmcConn smc_conn
, SmPointer client_data
));
6550 static void xsmp_save_complete
__ARGS((SmcConn smc_conn
, SmPointer client_data
));
6551 static void xsmp_shutdown_cancelled
__ARGS((SmcConn smc_conn
, SmPointer client_data
));
6552 static void xsmp_ice_connection
__ARGS((IceConn iceConn
, IcePointer clientData
, Bool opening
, IcePointer
*watchData
));
6555 # if defined(FEAT_GUI) && defined(USE_XSMP_INTERACT)
6556 static void xsmp_handle_interaction
__ARGS((SmcConn smc_conn
, SmPointer client_data
));
6559 * This is our chance to ask the user if they want to save,
6560 * or abort the logout
6564 xsmp_handle_interaction(smc_conn
, client_data
)
6566 SmPointer client_data
;
6568 cmdmod_T save_cmdmod
;
6569 int cancel_shutdown
= False
;
6571 save_cmdmod
= cmdmod
;
6572 cmdmod
.confirm
= TRUE
;
6573 if (check_changed_any(FALSE
))
6574 /* Mustn't logout */
6575 cancel_shutdown
= True
;
6576 cmdmod
= save_cmdmod
;
6577 setcursor(); /* position cursor */
6580 /* Done interaction */
6581 SmcInteractDone(smc_conn
, cancel_shutdown
);
6584 * Only end save-yourself here if we're not cancelling shutdown;
6585 * we'll get a cancelled callback later in which we'll end it.
6586 * Hopefully get around glitchy SMs (like GNOME-1)
6588 if (!cancel_shutdown
)
6590 xsmp
.save_yourself
= False
;
6591 SmcSaveYourselfDone(smc_conn
, True
);
6597 * Callback that starts save-yourself.
6601 xsmp_handle_save_yourself(smc_conn
, client_data
, save_type
,
6602 shutdown
, interact_style
, fast
)
6604 SmPointer client_data
;
6610 /* Handle already being in saveyourself */
6611 if (xsmp
.save_yourself
)
6612 SmcSaveYourselfDone(smc_conn
, True
);
6613 xsmp
.save_yourself
= True
;
6614 xsmp
.shutdown
= shutdown
;
6616 /* First up, preserve all files */
6618 ml_sync_all(FALSE
, FALSE
); /* preserve all swap files */
6621 verb_msg((char_u
*)_("XSMP handling save-yourself request"));
6623 # if defined(FEAT_GUI) && defined(USE_XSMP_INTERACT)
6624 /* Now see if we can ask about unsaved files */
6625 if (shutdown
&& !fast
&& gui
.in_use
)
6626 /* Need to interact with user, but need SM's permission */
6627 SmcInteractRequest(smc_conn
, SmDialogError
,
6628 xsmp_handle_interaction
, client_data
);
6632 /* Can stop the cycle here */
6633 SmcSaveYourselfDone(smc_conn
, True
);
6634 xsmp
.save_yourself
= False
;
6640 * Callback to warn us of imminent death.
6644 xsmp_die(smc_conn
, client_data
)
6646 SmPointer client_data
;
6650 /* quit quickly leaving swapfiles for modified buffers behind */
6651 getout_preserve_modified(0);
6656 * Callback to tell us that save-yourself has completed.
6660 xsmp_save_complete(smc_conn
, client_data
)
6662 SmPointer client_data
;
6664 xsmp
.save_yourself
= False
;
6669 * Callback to tell us that an instigated shutdown was cancelled
6670 * (maybe even by us)
6674 xsmp_shutdown_cancelled(smc_conn
, client_data
)
6676 SmPointer client_data
;
6678 if (xsmp
.save_yourself
)
6679 SmcSaveYourselfDone(smc_conn
, True
);
6680 xsmp
.save_yourself
= False
;
6681 xsmp
.shutdown
= False
;
6686 * Callback to tell us that a new ICE connection has been established.
6690 xsmp_ice_connection(iceConn
, clientData
, opening
, watchData
)
6692 IcePointer clientData
;
6694 IcePointer
*watchData
;
6696 /* Intercept creation of ICE connection fd */
6699 xsmp_icefd
= IceConnectionNumber(iceConn
);
6700 IceRemoveConnectionWatch(xsmp_ice_connection
, NULL
);
6705 /* Handle any ICE processing that's required; return FAIL if SM lost */
6707 xsmp_handle_requests()
6711 if (IceProcessMessages(xsmp
.iceconn
, NULL
, &rep
)
6712 == IceProcessMessagesIOError
)
6716 verb_msg((char_u
*)_("XSMP lost ICE connection"));
6726 /* Set up X Session Management Protocol */
6730 char errorstring
[80];
6731 SmcCallbacks smcallbacks
;
6739 verb_msg((char_u
*)_("XSMP opening connection"));
6741 xsmp
.save_yourself
= xsmp
.shutdown
= False
;
6743 /* Set up SM callbacks - must have all, even if they're not used */
6744 smcallbacks
.save_yourself
.callback
= xsmp_handle_save_yourself
;
6745 smcallbacks
.save_yourself
.client_data
= NULL
;
6746 smcallbacks
.die
.callback
= xsmp_die
;
6747 smcallbacks
.die
.client_data
= NULL
;
6748 smcallbacks
.save_complete
.callback
= xsmp_save_complete
;
6749 smcallbacks
.save_complete
.client_data
= NULL
;
6750 smcallbacks
.shutdown_cancelled
.callback
= xsmp_shutdown_cancelled
;
6751 smcallbacks
.shutdown_cancelled
.client_data
= NULL
;
6753 /* Set up a watch on ICE connection creations. The "dummy" argument is
6754 * apparently required for FreeBSD (we get a BUS error when using NULL). */
6755 if (IceAddConnectionWatch(xsmp_ice_connection
, &dummy
) == 0)
6758 verb_msg((char_u
*)_("XSMP ICE connection watch failed"));
6762 /* Create an SM connection */
6763 xsmp
.smcconn
= SmcOpenConnection(
6768 SmcSaveYourselfProcMask
| SmcDieProcMask
6769 | SmcSaveCompleteProcMask
| SmcShutdownCancelledProcMask
,
6773 sizeof(errorstring
),
6775 if (xsmp
.smcconn
== NULL
)
6777 char errorreport
[132];
6781 vim_snprintf(errorreport
, sizeof(errorreport
),
6782 _("XSMP SmcOpenConnection failed: %s"), errorstring
);
6783 verb_msg((char_u
*)errorreport
);
6787 xsmp
.iceconn
= SmcGetIceConnection(xsmp
.smcconn
);
6791 smname
.value
= "vim";
6793 smnameprop
.name
= "SmProgram";
6794 smnameprop
.type
= "SmARRAY8";
6795 smnameprop
.num_vals
= 1;
6796 smnameprop
.vals
= &smname
;
6798 smprops
[0] = &smnameprop
;
6799 SmcSetProperties(xsmp
.smcconn
, 1, smprops
);
6804 /* Shut down XSMP comms. */
6808 if (xsmp_icefd
!= -1)
6810 SmcCloseConnection(xsmp
.smcconn
, 0, NULL
);
6811 vim_free(xsmp
.clientid
);
6812 xsmp
.clientid
= NULL
;
6816 #endif /* USE_XSMP */
6820 /* Translate character to its CTRL- value */
6824 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6825 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6827 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6829 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6833 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6836 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6847 0, 0, 0, 0, 0, 0, 0,
6858 0, 0, 0, 0, 0, 0, 0, 0,
6871 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6873 /* BE - C0 */ 0, 0, 0,
6883 /* CA - D0 */ 0, 0, 0, 0, 0, 0, 0,
6893 /* DA - DF */ 0, 0, 0, 0, 0, 0,
6904 /* EA - FF*/ 0, 0, 0, 0, 0, 0,
6905 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
6908 char MetaCharTable
[]=
6909 {/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
6910 0, 0, 0, 0,'\\', 0,'F', 0,'W','M','N', 0, 0, 0, 0, 0,
6911 0, 0, 0, 0,']', 0, 0,'G', 0, 0,'R','O', 0, 0, 0, 0,
6912 '@','A','B','C','D','E', 0, 0,'H','I','J','K','L', 0, 0, 0,
6913 'P','Q', 0,'S','T','U','V', 0,'X','Y','Z','[', 0, 0,'^', 0
6917 /* TODO: Use characters NOT numbers!!! */
6918 char CtrlCharTable
[]=
6919 {/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
6920 124,193,194,195, 0,201, 0, 0, 0, 0, 0,210,211,212,213,214,
6921 215,216,217,226, 0,209,200, 0,231,232, 0, 0,224,189, 95,109,
6922 0, 0, 0, 0, 0, 0,230,173, 0, 0, 0, 0, 0,197,198,199,
6923 0, 0,229, 0, 0, 0, 0,196, 0, 0, 0, 0,227,228, 0,233,