annotate src/os_unix.c @ 10098:72e4b7f90465 v7.4.2320

commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b Author: Bram Moolenaar <Bram@vim.org> Date: Sat Sep 3 21:04:58 2016 +0200 patch 7.4.2320 Problem: Redraw problem when using 'incsearch'. Solution: Save the current view when deleting characters. (Christian Brabandt) Fix that the '" mark is set in the wrong position. Don't change the search start when using BS.
author Christian Brabandt <cb@256bit.org>
date Sat, 03 Sep 2016 21:15:06 +0200
parents 4aead6a9b7a9
children 175b1116f96a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 10019
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 * OS/2 port by Paul Slootman
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * VMS merge by Zoltan Arpadffy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 * os_unix.c -- code for all flavors of Unix (BSD, SYSV, SVR4, POSIX, ...)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 * Also for OS/2, using the excellent EMX package!!!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 * Also for BeOS and Atari MiNT.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 * A lot of this file was originally written by Juergen Weigert and later
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 * changed beyond recognition.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 * Some systems have a prototype for select() that has (int *) instead of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 * (fd_set *), which is wrong. This define removes that prototype. We define
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 * our own prototype below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 * Don't use it for the Mac, it causes a warning for precompiled headers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 * TODO: use a configure check for precompiled headers?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 */
1076
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
28 #if !defined(__APPLE__) && !defined(__TANDEM)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 # define select select_declared_wrong
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
34 #ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
35 # include "if_mzsch.h"
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
36 #endif
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
37
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 #include "os_unixx.h" /* unix includes for os_unix.c only */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 #ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 # include <X11/SM/SMlib.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
44 #ifdef HAVE_SELINUX
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
45 # include <selinux/selinux.h>
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
46 static int selinux_enabled = -1;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
47 #endif
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
48
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
49 #ifdef HAVE_SMACK
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
50 # include <attr/xattr.h>
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
51 # include <linux/xattr.h>
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
52 # ifndef SMACK_LABEL_LEN
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
53 # define SMACK_LABEL_LEN 1024
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
54 # endif
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
55 #endif
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
56
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 * Use this prototype for select, some include files have a wrong prototype
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 */
1076
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
60 #ifndef __TANDEM
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
61 # undef select
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
62 # ifdef __BEOS__
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
63 # define select beos_select
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
64 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66
1102
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
67 #ifdef __CYGWIN__
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
68 # ifndef WIN32
1657
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
69 # include <cygwin/version.h>
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
70 # include <sys/cygwin.h> /* for cygwin_conv_to_posix_path() and/or
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
71 * for cygwin_conv_path() */
4168
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
72 # ifdef FEAT_CYGWIN_WIN32_CLIPBOARD
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
73 # define WIN32_LEAN_AND_MEAN
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
74 # include <windows.h>
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
75 # include "winclip.pro"
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
76 # endif
1102
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
77 # endif
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
78 #endif
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
79
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 #if defined(HAVE_SELECT)
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
81 extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 #ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 # include <gpm.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 /* <linux/keyboard.h> contains defines conflicting with "keymap.h",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * I just copied relevant defines here. A cleaner solution would be to put gpm
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 * code into separate file and include there linux/keyboard.h
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 /* #include <linux/keyboard.h> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 # define KG_SHIFT 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 # define KG_CTRL 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 # define KG_ALT 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 # define KG_ALTGR 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 # define KG_SHIFTL 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 # define KG_SHIFTR 5
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 # define KG_CTRLL 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 # define KG_CTRLR 7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 # define KG_CAPSSHIFT 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
101 static void gpm_close(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
102 static int gpm_open(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
103 static int mch_gpm_process(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
106 #ifdef FEAT_SYSMOUSE
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
107 # include <sys/consio.h>
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
108 # include <sys/fbio.h>
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
109
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
110 static int sysmouse_open(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
111 static void sysmouse_close(void);
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
112 static RETSIGTYPE sig_sysmouse SIGPROTOARG;
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
113 #endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
114
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 * end of autoconf section. To be extended...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 /* Are the following #ifdefs still required? And why? Is that for X11? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 #if defined(ESIX) || defined(M_UNIX) && !defined(SCO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 # ifdef SIGWINCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 # undef SIGWINCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 # ifdef TIOCGWINSZ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 # undef TIOCGWINSZ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 #if defined(SIGWINDOW) && !defined(SIGWINCH) /* hpux 9.01 has it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 # define SIGWINCH SIGWINDOW
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 # include <X11/Xlib.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 # include <X11/Xutil.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 # include <X11/Xatom.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 # include <X11/Intrinsic.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 # include <X11/Shell.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 # include <X11/StringDefs.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 static Widget xterm_Shell = (Widget)0;
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
143 static void clip_update(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
144 static void xterm_update(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 # if defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 Window x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 Display *x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 # ifdef FEAT_TITLE
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
153 static int get_x11_windis(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
154 static void set_x11_title(char_u *);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
155 static void set_x11_icon(char_u *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 #ifdef FEAT_TITLE
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
160 static int get_x11_title(int);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
161 static int get_x11_icon(int);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 static char_u *oldtitle = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 static int did_set_title = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 static char_u *oldicon = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 static int did_set_icon = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
169 static void may_core_dump(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
171 #ifdef HAVE_UNION_WAIT
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
172 typedef union wait waitstatus;
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
173 #else
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
174 typedef int waitstatus;
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
175 #endif
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
176 static pid_t wait4pid(pid_t, waitstatus *);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
177
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
178 static int WaitForChar(long msec, int *interrupted);
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
179 static int WaitForCharOrMouse(long msec, int *interrupted);
5541
2f99966971b0 updated for version 7.4.119
Bram Moolenaar <bram@vim.org>
parents: 5533
diff changeset
180 #if defined(__BEOS__) || defined(VMS)
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
181 int RealWaitForChar(int, long, int *, int *interrupted);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 #else
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
183 static int RealWaitForChar(int, long, int *, int *interrupted);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 #ifdef FEAT_XCLIPBOARD
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
187 static int do_xterm_trace(void);
331
3933332f867d updated for version 7.0086
vimboss
parents: 292
diff changeset
188 # define XT_TRACE_DELAY 50 /* delay for xterm tracing */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
191 static void handle_resize(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 #if defined(SIGWINCH)
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
194 static RETSIGTYPE sig_winch SIGPROTOARG;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 #if defined(SIGINT)
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
197 static RETSIGTYPE catch_sigint SIGPROTOARG;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 #if defined(SIGPWR)
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
200 static RETSIGTYPE catch_sigpwr SIGPROTOARG;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 #if defined(SIGALRM) && defined(FEAT_X11) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 && defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 # define SET_SIG_ALARM
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
205 static RETSIGTYPE sig_alarm SIGPROTOARG;
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
206 /* volatile because it is used in signal handler sig_alarm(). */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
207 static volatile int sig_alarm_called;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 #endif
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
209 static RETSIGTYPE deathtrap SIGPROTOARG;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
211 static void catch_int_signal(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
212 static void set_signals(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
213 static void catch_signals(RETSIGTYPE (*func_deadly)(), RETSIGTYPE (*func_other)());
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
214 static int have_wildcard(int, char_u **);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
215 static int have_dollars(int, char_u **);
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
216
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
217 static int save_patterns(int num_pat, char_u **pat, int *num_file, char_u ***file);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #ifndef SIG_ERR
1879
e8eeeff19eae updated for version 7.2-176
vimboss
parents: 1877
diff changeset
220 # define SIG_ERR ((RETSIGTYPE (*)())-1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
223 /* volatile because it is used in signal handler sig_winch(). */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
224 static volatile int do_resize = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 static char_u *extra_shell_arg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 static int show_shell_mess = TRUE;
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
227 /* volatile because it is used in signal handler deathtrap(). */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
228 static volatile int deadly_signal = 0; /* The signal we caught */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
229 /* volatile because it is used in signal handler deathtrap(). */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
230 static volatile int in_mch_delay = FALSE; /* sleeping in mch_delay() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 static int curr_tmode = TMODE_COOK; /* contains current terminal mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 #ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 SmcConn smcconn; /* The SM connection ID */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 IceConn iceconn; /* The ICE connection ID */
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
239 char *clientid; /* The client ID for the current smc session */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 Bool save_yourself; /* If we're in the middle of a save_yourself */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 Bool shutdown; /* If we're in shutdown mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 } xsmp_config_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 static xsmp_config_T xsmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 #ifdef SYS_SIGLIST_DECLARED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 * I have seen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 * extern char *_sys_siglist[NSIG];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 * on Irix, Linux, NetBSD and Solaris. It contains a nice list of strings
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 * that describe the signals. That is nearly what we want here. But
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 * autoconf does only check for sys_siglist (without the underscore), I
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 * do not want to change everything today.... jw.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 * This is why AC_DECL_SYS_SIGLIST is commented out in configure.in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 static struct signalinfo
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 int sig; /* Signal number, eg. SIGSEGV etc */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 char *name; /* Signal name (not char_u!). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 char deadly; /* Catch as a deadly signal? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 } signal_info[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 #ifdef SIGHUP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 {SIGHUP, "HUP", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 #ifdef SIGQUIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 {SIGQUIT, "QUIT", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 #ifdef SIGILL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 {SIGILL, "ILL", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 #ifdef SIGTRAP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 {SIGTRAP, "TRAP", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 #ifdef SIGABRT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 {SIGABRT, "ABRT", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 #ifdef SIGEMT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 {SIGEMT, "EMT", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 #ifdef SIGFPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 {SIGFPE, "FPE", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 #ifdef SIGBUS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 {SIGBUS, "BUS", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 #endif
4074
16e8a09e8ab0 updated for version 7.3.791
Bram Moolenaar <bram@vim.org>
parents: 3867
diff changeset
290 #if defined(SIGSEGV) && !defined(FEAT_MZSCHEME)
16e8a09e8ab0 updated for version 7.3.791
Bram Moolenaar <bram@vim.org>
parents: 3867
diff changeset
291 /* MzScheme uses SEGV in its garbage collector */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 {SIGSEGV, "SEGV", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 #ifdef SIGSYS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 {SIGSYS, "SYS", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 #ifdef SIGALRM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 {SIGALRM, "ALRM", FALSE}, /* Perl's alarm() can trigger it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 #ifdef SIGTERM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 {SIGTERM, "TERM", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 #endif
2701
6d80dbca8501 updated for version 7.3.118
Bram Moolenaar <bram@vim.org>
parents: 2664
diff changeset
303 #if defined(SIGVTALRM) && !defined(FEAT_RUBY)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 {SIGVTALRM, "VTALRM", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 #endif
1560
c7905d03c72e updated for version 7.1-273
vimboss
parents: 1530
diff changeset
306 #if defined(SIGPROF) && !defined(FEAT_MZSCHEME) && !defined(WE_ARE_PROFILING)
c7905d03c72e updated for version 7.1-273
vimboss
parents: 1530
diff changeset
307 /* MzScheme uses SIGPROF for its own needs; On Linux with profiling
c7905d03c72e updated for version 7.1-273
vimboss
parents: 1530
diff changeset
308 * this makes Vim exit. WE_ARE_PROFILING is defined in Makefile. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 {SIGPROF, "PROF", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 #ifdef SIGXCPU
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 {SIGXCPU, "XCPU", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 #ifdef SIGXFSZ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 {SIGXFSZ, "XFSZ", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 #ifdef SIGUSR1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 {SIGUSR1, "USR1", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 #endif
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
320 #if defined(SIGUSR2) && !defined(FEAT_SYSMOUSE)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
321 /* Used for sysmouse handling */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 {SIGUSR2, "USR2", TRUE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 #ifdef SIGINT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 {SIGINT, "INT", FALSE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 #ifdef SIGWINCH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 {SIGWINCH, "WINCH", FALSE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 #ifdef SIGTSTP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 {SIGTSTP, "TSTP", FALSE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 #ifdef SIGPIPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 {SIGPIPE, "PIPE", FALSE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 {-1, "Unknown!", FALSE}
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338
1935
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
339 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
340 mch_chdir(char *path)
1935
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
341 {
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
342 if (p_verbose >= 5)
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
343 {
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
344 verbose_enter();
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
345 smsg((char_u *)"chdir(%s)", path);
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
346 verbose_leave();
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
347 }
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
348 # ifdef VMS
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
349 return chdir(vms_fixfilename(path));
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
350 # else
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
351 return chdir(path);
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
352 # endif
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
353 }
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
354
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
355 /*
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
356 * Write s[len] to the screen.
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
357 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
359 mch_write(char_u *s, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
361 ignored = (int)write(1, (char *)s, len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 if (p_wd) /* Unix is too fast, slow down a bit more */
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
363 RealWaitForChar(read_cmd_fd, p_wd, NULL, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
366 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
367 /*
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
368 * Return time in msec since "start_tv".
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
369 */
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
370 static long
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
371 elapsed(struct timeval *start_tv)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
372 {
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
373 struct timeval now_tv;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
374
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
375 gettimeofday(&now_tv, NULL);
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
376 return (now_tv.tv_sec - start_tv->tv_sec) * 1000L
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
377 + (now_tv.tv_usec - start_tv->tv_usec) / 1000L;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
378 }
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
379 #endif
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
380
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 /*
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
382 * mch_inchar(): low level input function.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 * Get a characters from the keyboard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 * Return the number of characters that are available.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 * If wtime == 0 do not wait for characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 * If wtime == n wait a short time for characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 * If wtime == -1 wait forever for characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
390 mch_inchar(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
391 char_u *buf,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
392 int maxlen,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
393 long wtime, /* don't use "time", MIPS cannot handle it */
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
394 int tb_change_cnt)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 int len;
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
397 int interrupted = FALSE;
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
398 long wait_time;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
399 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
400 struct timeval start_tv;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
401
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
402 gettimeofday(&start_tv, NULL);
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
403 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
405 #ifdef MESSAGE_QUEUE
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
406 parse_queued_messages();
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
407 #endif
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
408
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 /* Check if window changed size while we were busy, perhaps the ":set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 * columns=99" command was used. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 while (do_resize)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 handle_resize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
414 for (;;)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
415 {
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
416 if (wtime >= 0)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
417 wait_time = wtime;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
418 else
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
419 wait_time = p_ut;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
420 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
421 wait_time -= elapsed(&start_tv);
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
422 if (wait_time >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 {
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
424 #endif
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
425 if (WaitForChar(wait_time, &interrupted))
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
426 break;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
427
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
428 /* no character available */
7239
89c6f7c6704a commit https://github.com/vim/vim/commit/5d8afebb5bf7fb1e8ce06062451dc6a1f9a53ac0
Christian Brabandt <cb@256bit.org>
parents: 7109
diff changeset
429 if (do_resize)
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
430 {
7239
89c6f7c6704a commit https://github.com/vim/vim/commit/5d8afebb5bf7fb1e8ce06062451dc6a1f9a53ac0
Christian Brabandt <cb@256bit.org>
parents: 7109
diff changeset
431 handle_resize();
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
432 continue;
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
433 }
7239
89c6f7c6704a commit https://github.com/vim/vim/commit/5d8afebb5bf7fb1e8ce06062451dc6a1f9a53ac0
Christian Brabandt <cb@256bit.org>
parents: 7109
diff changeset
434 #ifdef FEAT_CLIENTSERVER
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
435 if (server_waiting())
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
436 {
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
437 parse_queued_messages();
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
438 continue;
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
439 }
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
440 #endif
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
441 #ifdef MESSAGE_QUEUE
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
442 if (interrupted)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
443 {
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
444 parse_queued_messages();
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
445 continue;
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
446 }
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
447 #endif
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
448 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 }
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
450 #endif
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
451 if (wtime >= 0)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
452 /* no character available within "wtime" */
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
453 return 0;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
454
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
455 /* wtime == -1: no character available within 'updatetime' */
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
456 #ifdef FEAT_AUTOCMD
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
457 if (trigger_cursorhold() && maxlen >= 3
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
458 && !typebuf_changed(tb_change_cnt))
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
459 {
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
460 buf[0] = K_SPECIAL;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
461 buf[1] = KS_EXTRA;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
462 buf[2] = (int)KE_CURSORHOLD;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
463 return 3;
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
464 }
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
465 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 * If there is no character available within 'updatetime' seconds
216
da182deebec7 updated for version 7.0061
vimboss
parents: 188
diff changeset
468 * flush all the swap files to disk.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 * Also done when interrupted by SIGWINCH.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 */
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
471 before_blocking();
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
472 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
475 /* repeat until we got a character */
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
476 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 {
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
478 long wtime_now = -1L;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
479
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 while (do_resize) /* window changed size */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 handle_resize();
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
482
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
483 #ifdef MESSAGE_QUEUE
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
484 parse_queued_messages();
9189
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
485
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
486 # ifdef FEAT_JOB_CHANNEL
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
487 if (has_pending_job())
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
488 {
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
489 /* Don't wait longer than a few seconds, checking for a finished
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
490 * job requires polling. */
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
491 if (p_ut > 9000L)
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
492 wtime_now = 1000L;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
493 else
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
494 wtime_now = 10000L - p_ut;
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
495 }
4b55d8e162d4 commit https://github.com/vim/vim/commit/cf7c11a9479ba7ce775b86c7a846fae48321d260
Christian Brabandt <cb@256bit.org>
parents: 9074
diff changeset
496 # endif
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
497 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 /*
2436
e1c84b92c881 Few more fixes for VMS.
Bram Moolenaar <bram@vim.org>
parents: 2414
diff changeset
499 * We want to be interrupted by the winch signal
e1c84b92c881 Few more fixes for VMS.
Bram Moolenaar <bram@vim.org>
parents: 2414
diff changeset
500 * or by an event on the monitored file descriptors.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 */
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
502 if (!WaitForChar(wtime_now, &interrupted))
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
503 {
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
504 if (do_resize) /* interrupted by SIGWINCH signal */
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
505 continue;
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
506 #ifdef MESSAGE_QUEUE
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
507 if (interrupted || wtime_now > 0)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
508 {
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
509 parse_queued_messages();
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
510 continue;
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
511 }
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
512 #endif
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
513 return 0;
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
514 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 /* If input was put directly in typeahead buffer bail out here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 if (typebuf_changed(tb_change_cnt))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 * For some terminals we only get one character at a time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 * We want the get all available characters, so we could keep on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 * trying until none is available
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 * For some other terminals this is quite slow, that's why we don't do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 * it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 len = read_from_input_buf(buf, (long)maxlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 if (len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 return len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
534 handle_resize(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 do_resize = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 shell_resized();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 /*
8947
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
541 * Return non-zero if a character is available.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
544 mch_char_avail(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 {
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
546 return WaitForChar(0L, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 #if defined(HAVE_TOTAL_MEM) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 # ifdef HAVE_SYS_RESOURCE_H
1879
e8eeeff19eae updated for version 7.2-176
vimboss
parents: 1877
diff changeset
551 # include <sys/resource.h>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 # if defined(HAVE_SYS_SYSCTL_H) && defined(HAVE_SYSCTL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 # include <sys/sysctl.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 # include <sys/sysinfo.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 /*
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
561 * Return total amount of memory available in Kbyte.
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
562 * Doesn't change when memory has been allocated.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 long_u
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
565 mch_total_mem(int special UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 long_u mem = 0;
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
568 long_u shiftright = 10; /* how much to shift "mem" right for Kbyte */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
570 # ifdef HAVE_SYSCTL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 int mib[2], physmem;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 size_t len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 /* BSD way of getting the amount of RAM available. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 mib[0] = CTL_HW;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 mib[1] = HW_USERMEM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 len = sizeof(physmem);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 mem = (long_u)physmem;
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
580 # endif
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
581
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
582 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 if (mem == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 struct sysinfo sinfo;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 /* Linux way of getting amount of RAM available */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 if (sysinfo(&sinfo) == 0)
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
589 {
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
590 # ifdef HAVE_SYSINFO_MEM_UNIT
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
591 /* avoid overflow as much as possible */
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
592 while (shiftright > 0 && (sinfo.mem_unit & 1) == 0)
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
593 {
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
594 sinfo.mem_unit = sinfo.mem_unit >> 1;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
595 --shiftright;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
596 }
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
597 mem = sinfo.totalram * sinfo.mem_unit;
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
598 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 mem = sinfo.totalram;
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
600 # endif
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
601 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 }
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
603 # endif
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
604
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
605 # ifdef HAVE_SYSCONF
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 if (mem == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 long pagesize, pagecount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 /* Solaris way of getting amount of RAM available */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 pagesize = sysconf(_SC_PAGESIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 pagecount = sysconf(_SC_PHYS_PAGES);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 if (pagesize > 0 && pagecount > 0)
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
614 {
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
615 /* avoid overflow as much as possible */
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
616 while (shiftright > 0 && (pagesize & 1) == 0)
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
617 {
1204
a3c21128b246 updated for version 7.1b
vimboss
parents: 1146
diff changeset
618 pagesize = (long_u)pagesize >> 1;
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
619 --shiftright;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
620 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 mem = (long_u)pagesize * pagecount;
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
622 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 }
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
624 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 /* Return the minimum of the physical memory and the user limit, because
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 * using more than the user limit may cause Vim to be terminated. */
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
628 # if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 struct rlimit rlp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 if (getrlimit(RLIMIT_DATA, &rlp) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 && rlp.rlim_cur < ((rlim_t)1 << (sizeof(long_u) * 8 - 1))
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
634 # ifdef RLIM_INFINITY
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 && rlp.rlim_cur != RLIM_INFINITY
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
636 # endif
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
637 && ((long_u)rlp.rlim_cur >> 10) < (mem >> shiftright)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 )
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
639 {
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
640 mem = (long_u)rlp.rlim_cur;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
641 shiftright = 10;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
642 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 }
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
644 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 if (mem > 0)
1110
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
647 return mem >> shiftright;
b77f790d53f6 updated for version 7.0-236
vimboss
parents: 1102
diff changeset
648 return (long_u)0x1fffff;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
653 mch_delay(long msec, int ignoreinput)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 int old_tmode;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
656 #ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
657 long total = msec; /* remember original value */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
658 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 if (ignoreinput)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 /* Go to cooked mode without echo, to allow SIGINT interrupting us
1530
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
663 * here. But we don't want QUIT to kill us (CTRL-\ used in a
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
664 * shell may produce SIGQUIT). */
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
665 in_mch_delay = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 old_tmode = curr_tmode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 if (curr_tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 settmode(TMODE_SLEEP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 * Everybody sleeps in a different way...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 * Prefer nanosleep(), some versions of usleep() can only sleep up to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 * one second.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
675 #ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
676 do
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
677 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
678 /* if total is large enough, wait by portions in p_mzq */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
679 if (total > p_mzq)
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
680 msec = p_mzq;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
681 else
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
682 msec = total;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
683 total -= msec;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
684 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 #ifdef HAVE_NANOSLEEP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 struct timespec ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 ts.tv_sec = msec / 1000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 ts.tv_nsec = (msec % 1000) * 1000000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 (void)nanosleep(&ts, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 # ifdef HAVE_USLEEP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 while (msec >= 1000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 usleep((unsigned int)(999 * 1000));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 msec -= 999;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 usleep((unsigned int)(msec * 1000));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 # ifndef HAVE_SELECT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 poll(NULL, 0, (int)msec);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 struct timeval tv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 tv.tv_sec = msec / 1000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 tv.tv_usec = (msec % 1000) * 1000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 * NOTE: Solaris 2.6 has a bug that makes select() hang here. Get
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 * a patch from Sun to fix this. Reported by Gunnar Pedersen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 select(0, NULL, NULL, NULL, &tv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 # endif /* HAVE_SELECT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 # endif /* HAVE_NANOSLEEP */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 #endif /* HAVE_USLEEP */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
719 #ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
720 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
721 while (total > 0);
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
722 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 settmode(old_tmode);
1530
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
725 in_mch_delay = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 else
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
728 WaitForChar(msec, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
731 #if defined(HAVE_STACK_LIMIT) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 || (!defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGSTACK))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 # define HAVE_CHECK_STACK_GROWTH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 * Support for checking for an almost-out-of-stack-space situation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 * Return a pointer to an item on the stack. Used to find out if the stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 * grows up or down.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
742 static void check_stack_growth(char *p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 static int stack_grows_downwards;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 * Find out if the stack grows upwards or downwards.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 * "p" points to a variable on the stack of the caller.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
750 check_stack_growth(char *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 stack_grows_downwards = (p > (char *)&i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
758 #if defined(HAVE_STACK_LIMIT) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 static char *stack_limit = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 #if defined(_THREAD_SAFE) && defined(HAVE_PTHREAD_NP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 # include <pthread.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 # include <pthread_np.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 * Find out until how var the stack can grow without getting into trouble.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 * Called when starting up and when switching to the signal stack in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 * deathtrap().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
772 get_stack_limit(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 struct rlimit rlp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 long lim;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 /* Set the stack limit to 15/16 of the allowable size. Skip this when the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 * limit doesn't fit in a long (rlim_cur might be "long long"). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 if (getrlimit(RLIMIT_STACK, &rlp) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 && rlp.rlim_cur < ((rlim_t)1 << (sizeof(long_u) * 8 - 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 # ifdef RLIM_INFINITY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 && rlp.rlim_cur != RLIM_INFINITY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 lim = (long)rlp.rlim_cur;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 #if defined(_THREAD_SAFE) && defined(HAVE_PTHREAD_NP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 pthread_attr_t attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 size_t size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 /* On FreeBSD the initial thread always has a fixed stack size, no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 * matter what the limits are set to. Normally it's 1 Mbyte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 pthread_attr_init(&attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 if (pthread_attr_get_np(pthread_self(), &attr) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 pthread_attr_getstacksize(&attr, &size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 if (lim > (long)size)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 lim = (long)size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 pthread_attr_destroy(&attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 if (stack_grows_downwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 stack_limit = (char *)((long)&i - (lim / 16L * 15L));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 if (stack_limit >= (char *)&i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 /* overflow, set to 1/16 of current stack position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 stack_limit = (char *)((long)&i / 16L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 stack_limit = (char *)((long)&i + (lim / 16L * 15L));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 if (stack_limit <= (char *)&i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 stack_limit = NULL; /* overflow */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 * Return FAIL when running out of stack space.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 * "p" must point to any variable local to the caller that's on the stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
826 mch_stackcheck(char *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 if (stack_limit != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 if (stack_grows_downwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 if (p < stack_limit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 else if (p > stack_limit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 * Support for using the signal stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 * This helps when we run out of stack space, which causes a SIGSEGV. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 * signal handler then must run on another stack, since the normal stack is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 * completely full.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849
5421
739074bdceb8 updated for version 7.4.061
Bram Moolenaar <bram@vim.org>
parents: 5411
diff changeset
850 #if defined(HAVE_AVAILABILITYMACROS_H)
5411
8d83c219fc7b updated for version 7.4.056
Bram Moolenaar <bram@vim.org>
parents: 5338
diff changeset
851 # include <AvailabilityMacros.h>
8d83c219fc7b updated for version 7.4.056
Bram Moolenaar <bram@vim.org>
parents: 5338
diff changeset
852 #endif
8d83c219fc7b updated for version 7.4.056
Bram Moolenaar <bram@vim.org>
parents: 5338
diff changeset
853
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 #ifndef SIGSTKSZ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 # define SIGSTKSZ 8000 /* just a guess of how much stack is needed... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 # ifdef HAVE_SIGALTSTACK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859 static stack_t sigstk; /* for sigaltstack() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861 static struct sigstack sigstk; /* for sigstack() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
864 static void init_signal_stack(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 static char *signal_stack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
868 init_signal_stack(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 if (signal_stack != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 # ifdef HAVE_SIGALTSTACK
1375
61b50044616b updated for version 7.1-090
vimboss
parents: 1350
diff changeset
873 # if defined(__APPLE__) && (!defined(MAC_OS_X_VERSION_MAX_ALLOWED) \
61b50044616b updated for version 7.1-090
vimboss
parents: 1350
diff changeset
874 || MAC_OS_X_VERSION_MAX_ALLOWED <= 1040)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 /* missing prototype. Adding it to osdef?.h.in doesn't work, because
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 * "struct sigaltstack" needs to be declared. */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
877 extern int sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 # ifdef HAVE_SS_BASE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 sigstk.ss_base = signal_stack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 sigstk.ss_sp = signal_stack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 sigstk.ss_size = SIGSTKSZ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 sigstk.ss_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 (void)sigaltstack(&sigstk, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 sigstk.ss_sp = signal_stack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 if (stack_grows_downwards)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 sigstk.ss_sp += SIGSTKSZ - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 sigstk.ss_onstack = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 (void)sigstack(&sigstk, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 /*
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
900 * We need correct prototypes for a signal function, otherwise mean compilers
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 * will barf when the second argument to signal() is ``wrong''.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 * Let me try it with a few tricky defines from my own osdef.h (jw).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 #if defined(SIGWINCH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 sig_winch SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 /* this is not required on all systems, but it doesn't hurt anybody */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 do_resize = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 #if defined(SIGINT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 catch_sigint SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 /* this is not required on all systems, but it doesn't hurt anybody */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 got_int = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 #if defined(SIGPWR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 catch_sigpwr SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 {
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
930 /* this is not required on all systems, but it doesn't hurt anybody */
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
931 signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 * I'm not sure we get the SIGPWR signal when the system is really going
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 * down or when the batteries are almost empty. Just preserve the swap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 * files and don't exit, that can't do any harm.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 ml_sync_all(FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 #ifdef SET_SIG_ALARM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 * signal function for alarm().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 sig_alarm SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 /* doesn't do anything, just to break a system call */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 sig_alarm_called = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954
188
041a413d626d updated for version 7.0057
vimboss
parents: 180
diff changeset
955 #if (defined(HAVE_SETJMP_H) \
041a413d626d updated for version 7.0057
vimboss
parents: 180
diff changeset
956 && ((defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) \
041a413d626d updated for version 7.0057
vimboss
parents: 180
diff changeset
957 || defined(FEAT_LIBCALL))) \
041a413d626d updated for version 7.0057
vimboss
parents: 180
diff changeset
958 || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 * A simplistic version of setjmp() that only allows one level of using.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 * Don't call twice before calling mch_endjmp()!.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 * Usage:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 * mch_startjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 * if (SETJMP(lc_jump_env) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 * {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 * mch_didjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 * EMSG("crash!");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 * }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 * else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 * {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 * do_the_work;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 * mch_endjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 * }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 * Note: Can't move SETJMP() here, because a function calling setjmp() must
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 * not return before the saved environment is used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 * Returns OK for normal return, FAIL when the protected code caused a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 * problem and LONGJMP() was used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
980 mch_startjmp(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 #ifdef SIGHASARG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 lc_signal = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 lc_active = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
989 mch_endjmp(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 lc_active = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
995 mch_didjmp(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 # if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 /* On FreeBSD the signal stack has to be reset after using siglongjmp(),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 * otherwise catching the signal only works once. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 init_signal_stack();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 * This function handles deadly signals.
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1007 * It tries to preserve any swap files and exit properly.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 * (partly from Elvis).
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1009 * NOTE: Avoid unsafe functions, such as allocating memory, they can result in
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1010 * a deadlock.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 deathtrap SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 static int entered = 0; /* count the number of times we got here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 Note: when memory has been corrupted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 this may get an arbitrary value! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 #ifdef SIGHASARG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 #if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 * Catch a crash in protected code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 * Restores the environment saved in lc_jump_env, which looks like
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 * SETJMP() returns 1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 if (lc_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 # if defined(SIGHASARG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 lc_signal = sigarg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 lc_active = FALSE; /* don't jump again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 LONGJMP(lc_jump_env, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1039 #ifdef SIGHASARG
1530
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1040 # ifdef SIGQUIT
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1041 /* While in mch_delay() we go to cooked mode to allow a CTRL-C to
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1042 * interrupt us. But in cooked mode we may also get SIGQUIT, e.g., when
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1043 * pressing CTRL-\, but we don't want Vim to exit then. */
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1044 if (in_mch_delay && sigarg == SIGQUIT)
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1045 SIGRETURN;
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1046 # endif
f0d6b2bb1093 updated for version 7.1-245
vimboss
parents: 1510
diff changeset
1047
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1048 /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1049 * here. This avoids that a non-reentrant function is interrupted, e.g.,
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1050 * free(). Calling free() again may then cause a crash. */
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1051 if (entered == 0
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1052 && (0
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1053 # ifdef SIGHUP
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1054 || sigarg == SIGHUP
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1055 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1056 # ifdef SIGQUIT
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1057 || sigarg == SIGQUIT
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1058 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1059 # ifdef SIGTERM
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1060 || sigarg == SIGTERM
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1061 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1062 # ifdef SIGPWR
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1063 || sigarg == SIGPWR
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1064 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1065 # ifdef SIGUSR1
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1066 || sigarg == SIGUSR1
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1067 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1068 # ifdef SIGUSR2
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1069 || sigarg == SIGUSR2
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1070 # endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1071 )
413
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 407
diff changeset
1072 && !vim_handle_signal(sigarg))
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1073 SIGRETURN;
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1074 #endif
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1075
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 /* Remember how often we have been called. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 ++entered;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078
9262
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1079 #ifdef FEAT_AUTOCMD
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1080 /* Executing autocommands is likely to use more stack space than we have
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1081 * available in the signal stack. */
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1082 block_autocmds();
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1083 #endif
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1084
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 /* Set the v:dying variable. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 set_vim_var_nr(VV_DYING, (long)entered);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
1090 #ifdef HAVE_STACK_LIMIT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 /* Since we are now using the signal stack, need to reset the stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 * limit. Otherwise using a regexp will fail. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 get_stack_limit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095
758
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1096 #if 0
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1097 /* This is for opening gdb the moment Vim crashes.
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1098 * You need to manually adjust the file name and Vim executable name.
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1099 * Suggested by SungHyun Nam. */
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1100 {
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1101 # define VI_GDB_FILE "/tmp/vimgdb"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1102 # define VIM_NAME "/usr/bin/vim"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1103 FILE *fp = fopen(VI_GDB_FILE, "w");
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1104 if (fp)
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1105 {
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1106 fprintf(fp,
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1107 "file %s\n"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1108 "attach %d\n"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1109 "set height 1000\n"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1110 "bt full\n"
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1111 , VIM_NAME, getpid());
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1112 fclose(fp);
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1113 system("xterm -e gdb -x "VI_GDB_FILE);
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1114 unlink(VI_GDB_FILE);
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1115 }
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1116 }
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1117 #endif
d591d4ceeaee updated for version 7.0224
vimboss
parents: 715
diff changeset
1118
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 #ifdef SIGHASARG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 /* try to find the name of this signal */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 for (i = 0; signal_info[i].sig != -1; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 if (sigarg == signal_info[i].sig)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 deadly_signal = sigarg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 full_screen = FALSE; /* don't write message to the GUI, it might be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 * part of the problem... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 * If something goes wrong after entering here, we may get here again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 * When this happens, give a message and try to exit nicely (resetting the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 * terminal mode, etc.)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 * When this happens twice, just exit, don't even try to give a message,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 * stack may be corrupt or something weird.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 * When this still happens again (or memory was corrupted in such a way
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 * that "entered" was clobbered) use _exit(), don't try freeing resources.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 if (entered >= 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 reset_signals(); /* don't catch any signals anymore */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 may_core_dump();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 if (entered >= 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 _exit(8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 exit(7);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 if (entered == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 {
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1148 /* No translation, it may call malloc(). */
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1149 OUT_STR("Vim: Double signal, exiting\n");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 getout(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1154 /* No translation, it may call malloc(). */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 #ifdef SIGHASARG
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1156 sprintf((char *)IObuff, "Vim: Caught deadly signal %s\n",
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 signal_info[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 #else
5338
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1159 sprintf((char *)IObuff, "Vim: Caught deadly signal\n");
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1160 #endif
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1161
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1162 /* Preserve files and exit. This sets the really_exiting flag to prevent
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1163 * calling free(). */
965044860b7f updated for version 7.4.022
Bram Moolenaar <bram@vim.org>
parents: 5132
diff changeset
1164 preserve_exit();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165
9262
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1166 /* NOTREACHED */
c9f2b70feac0 commit https://github.com/vim/vim/commit/e429e70f050cb2941f1f8427cf918b68444c904e
Christian Brabandt <cb@256bit.org>
parents: 9209
diff changeset
1167
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1168 #ifdef NBDEBUG
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1169 reset_signals();
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1170 may_core_dump();
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1171 abort();
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1172 #endif
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
1173
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1177 #if defined(_REENTRANT) && defined(SIGCONT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 * On Solaris with multi-threading, suspending might not work immediately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 * Catch the SIGCONT signal, which will be used as an indication whether the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 * suspending has been done or not.
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1182 *
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1183 * On Linux, signal is not always handled immediately either.
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1184 * See https://bugs.launchpad.net/bugs/291373
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1185 *
2701
6d80dbca8501 updated for version 7.3.118
Bram Moolenaar <bram@vim.org>
parents: 2664
diff changeset
1186 * volatile because it is used in signal handler sigcont_handler().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187 */
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1188 static volatile int sigcont_received;
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1189 static RETSIGTYPE sigcont_handler SIGPROTOARG;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 * signal handler for SIGCONT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 static RETSIGTYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 sigcont_handler SIGDEFARG(sigarg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 sigcont_received = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 SIGRETURN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1202 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1203 static void loose_clipboard(void);
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
1204 # ifdef USE_SYSTEM
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1205 static void save_clipboard(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1206 static void restore_clipboard(void);
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1207
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1208 static void *clip_star_save = NULL;
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1209 static void *clip_plus_save = NULL;
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
1210 # endif
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1211
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1212 /*
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1213 * Called when Vim is going to sleep or execute a shell command.
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1214 * We can't respond to requests for the X selections. Lose them, otherwise
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1215 * other applications will hang. But first copy the text to cut buffer 0.
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1216 */
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1217 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1218 loose_clipboard(void)
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1219 {
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1220 if (clip_star.owned || clip_plus.owned)
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1221 {
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1222 x11_export_final_selection();
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1223 if (clip_star.owned)
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1224 clip_lose_selection(&clip_star);
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1225 if (clip_plus.owned)
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1226 clip_lose_selection(&clip_plus);
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1227 if (x11_display != NULL)
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1228 XFlush(x11_display);
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1229 }
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1230 }
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1231
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
1232 # ifdef USE_SYSTEM
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1233 /*
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1234 * Save clipboard text to restore later.
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1235 */
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1236 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1237 save_clipboard(void)
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1238 {
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1239 if (clip_star.owned)
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1240 clip_star_save = get_register('*', TRUE);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1241 if (clip_plus.owned)
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1242 clip_plus_save = get_register('+', TRUE);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1243 }
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1244
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1245 /*
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1246 * Restore clipboard text if no one own the X selection.
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1247 */
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1248 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1249 restore_clipboard(void)
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1250 {
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1251 if (clip_star_save != NULL)
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1252 {
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1253 if (!clip_gen_owner_exists(&clip_star))
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1254 put_register('*', clip_star_save);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1255 else
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1256 free_register(clip_star_save);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1257 clip_star_save = NULL;
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1258 }
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1259 if (clip_plus_save != NULL)
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1260 {
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1261 if (!clip_gen_owner_exists(&clip_plus))
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1262 put_register('+', clip_plus_save);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1263 else
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1264 free_register(clip_plus_save);
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1265 clip_plus_save = NULL;
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1266 }
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
1267 }
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
1268 # endif
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1269 #endif
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1270
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 * If the machine has job control, use it to suspend the program,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 * otherwise fake it by starting a new shell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1276 mch_suspend(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 /* BeOS does have SIGTSTP, but it doesn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 #if defined(SIGTSTP) && !defined(__BEOS__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 out_flush(); /* needed to make cursor visible on some systems */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 settmode(TMODE_COOK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 out_flush(); /* needed to disable mouse on some systems */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
1285 loose_clipboard();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1288 # if defined(_REENTRANT) && defined(SIGCONT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 sigcont_received = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 kill(0, SIGTSTP); /* send ourselves a STOP signal */
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1292 # if defined(_REENTRANT) && defined(SIGCONT)
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1293 /*
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1294 * Wait for the SIGCONT signal to be handled. It generally happens
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1295 * immediately, but somehow not all the time. Do not call pause()
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1296 * because there would be race condition which would hang Vim if
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1297 * signal happened in between the test of sigcont_received and the
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1298 * call to pause(). If signal is not yet received, call sleep(0)
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1299 * to just yield CPU. Signal should then be received. If somehow
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1300 * it's still not received, sleep 1, 2, 3 ms. Don't bother waiting
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1301 * further if signal is not received after 1+2+3+4 ms (not expected
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1302 * to happen).
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1303 */
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1304 {
1932
f339305875fa updated for version 7.2-229
vimboss
parents: 1903
diff changeset
1305 long wait_time;
f339305875fa updated for version 7.2-229
vimboss
parents: 1903
diff changeset
1306 for (wait_time = 0; !sigcont_received && wait_time <= 3L; wait_time++)
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1307 /* Loop is not entered most of the time */
1932
f339305875fa updated for version 7.2-229
vimboss
parents: 1903
diff changeset
1308 mch_delay(wait_time, FALSE);
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1309 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 # ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 * Set oldtitle to NULL, so the current title is obtained again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 vim_free(oldtitle);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 oldtitle = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 settmode(TMODE_RAW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 need_check_timestamps = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 did_check_timestamps = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 suspend_shell();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1328 mch_init(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 Columns = 80;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 Rows = 24;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 set_signals();
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1335
765
335444c09581 updated for version 7.0225
vimboss
parents: 758
diff changeset
1336 #ifdef MACOS_CONVERT
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1337 mac_conv_init();
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1338 #endif
4168
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
1339 #ifdef FEAT_CYGWIN_WIN32_CLIPBOARD
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
1340 win_clip_init();
ff193256398a updated for version 7.3.836
Bram Moolenaar <bram@vim.org>
parents: 4074
diff changeset
1341 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1345 set_signals(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 #if defined(SIGWINCH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 * WINDOW CHANGE signal is handled with sig_winch().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 signal(SIGWINCH, (RETSIGTYPE (*)())sig_winch);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 * We want the STOP signal to work, to make mch_suspend() work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 * For "rvim" the STOP signal is ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 #ifdef SIGTSTP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 #endif
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1361 #if defined(_REENTRANT) && defined(SIGCONT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 signal(SIGCONT, sigcont_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 * We want to ignore breaking of PIPEs.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 #ifdef SIGPIPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 signal(SIGPIPE, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 #ifdef SIGINT
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1373 catch_int_signal();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 * Ignore alarm signals (Perl's alarm() generates it).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 #ifdef SIGALRM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 signal(SIGALRM, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 * Catch SIGPWR (power failure?) to preserve the swap files, so that no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 * work will be lost.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 #ifdef SIGPWR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 * Arrange for other signals to gracefully shutdown Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 catch_signals(deathtrap, SIG_ERR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 #if defined(FEAT_GUI) && defined(SIGHUP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 * When the GUI is running, ignore the hangup signal.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 signal(SIGHUP, SIG_IGN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1405 #if defined(SIGINT) || defined(PROTO)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1406 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1407 * Catch CTRL-C (only works while in Cooked mode).
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1408 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1409 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1410 catch_int_signal(void)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1411 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1412 signal(SIGINT, (RETSIGTYPE (*)())catch_sigint);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1413 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1414 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
1415
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1417 reset_signals(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 catch_signals(SIG_DFL, SIG_DFL);
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
1420 #if defined(_REENTRANT) && defined(SIGCONT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 /* SIGCONT isn't in the list, because its default action is ignore */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 signal(SIGCONT, SIG_DFL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1427 catch_signals(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1428 RETSIGTYPE (*func_deadly)(),
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1429 RETSIGTYPE (*func_other)())
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 for (i = 0; signal_info[i].sig != -1; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 if (signal_info[i].deadly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 struct sigaction sa;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 /* Setup to use the alternate stack for the signal function. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 sa.sa_handler = func_deadly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 sigemptyset(&sa.sa_mask);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 # if defined(__linux__) && defined(_REENTRANT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 /* On Linux, with glibc compiled for kernel 2.2, there is a bug in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 * thread handling in combination with using the alternate stack:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 * pthread library functions try to use the stack pointer to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 * identify the current thread, causing a SEGV signal, which
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 * recursively calls deathtrap() and hangs. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 sa.sa_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 sa.sa_flags = SA_ONSTACK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 sigaction(signal_info[i].sig, &sa, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 # if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGVEC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 struct sigvec sv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 /* Setup to use the alternate stack for the signal function. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 sv.sv_handler = func_deadly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 sv.sv_mask = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 sv.sv_flags = SV_ONSTACK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 sigvec(signal_info[i].sig, &sv, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 signal(signal_info[i].sig, func_deadly);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 else if (func_other != SIG_ERR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 signal(signal_info[i].sig, func_other);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 /*
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1472 * Handling of SIGHUP, SIGQUIT and SIGTERM:
1146
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1110
diff changeset
1473 * "when" == a signal: when busy, postpone and return FALSE, otherwise
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1110
diff changeset
1474 * return TRUE
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1110
diff changeset
1475 * "when" == SIGNAL_BLOCK: Going to be busy, block signals
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1110
diff changeset
1476 * "when" == SIGNAL_UNBLOCK: Going to wait, unblock signals, use postponed
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
1477 * signal
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1478 * Returns TRUE when Vim should exit.
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1479 */
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1480 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1481 vim_handle_signal(int sig)
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1482 {
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1483 static int got_signal = 0;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1484 static int blocked = TRUE;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1485
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1486 switch (sig)
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1487 {
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1488 case SIGNAL_BLOCK: blocked = TRUE;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1489 break;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1490
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1491 case SIGNAL_UNBLOCK: blocked = FALSE;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1492 if (got_signal != 0)
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1493 {
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1494 kill(getpid(), got_signal);
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1495 got_signal = 0;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1496 }
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1497 break;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1498
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1499 default: if (!blocked)
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1500 return TRUE; /* exit! */
37
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1501 got_signal = sig;
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1502 #ifdef SIGPWR
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1503 if (sig != SIGPWR)
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1504 #endif
fdf55076c53f updated for version 7.0022
vimboss
parents: 36
diff changeset
1505 got_int = TRUE; /* break any loops */
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1506 break;
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1507 }
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1508 return FALSE;
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1509 }
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1510
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
1511 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 * Check_win checks whether we have an interactive stdout.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1515 mch_check_win(int argc UNUSED, char **argv UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 if (isatty(1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 * Return TRUE if the input comes from a terminal, FALSE otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1526 mch_input_isatty(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 if (isatty(read_cmd_fd))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 && (defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
1538 static void xopen_message(struct timeval *start_tv);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 * Give a message about the elapsed time for opening the X window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 static void
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
1544 xopen_message(struct timeval *start_tv)
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
1545 {
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
1546 smsg((char_u *)_("Opening the X display took %ld msec"), elapsed(start_tv));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 #if defined(FEAT_X11) && (defined(FEAT_TITLE) || defined(FEAT_XCLIPBOARD))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 * A few functions shared by X11 title and clipboard code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1555 static int x_error_handler(Display *dpy, XErrorEvent *error_event);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1556 static int x_error_check(Display *dpy, XErrorEvent *error_event);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1557 static int x_connect_to_server(void);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1558 static int test_x11_window(Display *dpy);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 static int got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 * X Error handler, otherwise X just exits! (very rude) -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1566 x_error_handler(Display *dpy, XErrorEvent *error_event)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 {
42
c75153d791d0 updated for version 7.0026
vimboss
parents: 39
diff changeset
1568 XGetErrorText(dpy, error_event->error_code, (char *)IObuff, IOSIZE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 STRCAT(IObuff, _("\nVim: Got X error\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 /* We cannot print a message and continue, because no X calls are allowed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 * here (causes my system to hang). Silently continuing might be an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 * alternative... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 preserve_exit(); /* preserve files and exit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 return 0; /* NOTREACHED */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 * Another X Error handler, just used to check for errors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1583 x_error_check(Display *dpy UNUSED, XErrorEvent *error_event UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 got_x_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 # if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 * An X IO Error handler, used to catch error while opening the display.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1594 static int x_IOerror_check(Display *dpy);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1597 x_IOerror_check(Display *dpy UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 /* This function should not return, it causes exit(). Longjump instead. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 LONGJMP(lc_jump_env, 1);
5037
5e0b6a9282df updated for version 7.3.1262
Bram Moolenaar <bram@vim.org>
parents: 4299
diff changeset
1601 # if defined(VMS) || defined(__CYGWIN__) || defined(__CYGWIN32__)
2074
1bb06e6512a2 updated for version 7.2.358
Bram Moolenaar <bram@zimbu.org>
parents: 1940
diff changeset
1602 return 0; /* avoid the compiler complains about missing return value */
1bb06e6512a2 updated for version 7.2.358
Bram Moolenaar <bram@zimbu.org>
parents: 1940
diff changeset
1603 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 * An X IO Error handler, used to catch terminal errors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1610 static int x_IOerror_handler(Display *dpy);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1611 static void may_restore_clipboard(void);
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1612 static int xterm_dpy_was_reset = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1615 x_IOerror_handler(Display *dpy UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 xterm_dpy = NULL;
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1618 xterm_dpy_was_reset = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 xterm_Shell = (Widget)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 /* This function should not return, it causes exit(). Longjump instead. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 LONGJMP(x_jump_env, 1);
5037
5e0b6a9282df updated for version 7.3.1262
Bram Moolenaar <bram@vim.org>
parents: 4299
diff changeset
1625 # if defined(VMS) || defined(__CYGWIN__) || defined(__CYGWIN32__)
2074
1bb06e6512a2 updated for version 7.2.358
Bram Moolenaar <bram@zimbu.org>
parents: 1940
diff changeset
1626 return 0; /* avoid the compiler complains about missing return value */
1bb06e6512a2 updated for version 7.2.358
Bram Moolenaar <bram@zimbu.org>
parents: 1940
diff changeset
1627 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 }
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1629
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1630 /*
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1631 * If the X11 connection was lost try to restore it.
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1632 * Helps when the X11 server was stopped and restarted while Vim was inactive
6448
e13f8073c9f9 updated for version 7.4.553
Bram Moolenaar <bram@vim.org>
parents: 6383
diff changeset
1633 * (e.g. through tmux).
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1634 */
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1635 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1636 may_restore_clipboard(void)
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1637 {
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1638 if (xterm_dpy_was_reset)
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1639 {
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1640 xterm_dpy_was_reset = FALSE;
6458
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1641
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1642 # ifndef LESSTIF_VERSION
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1643 /* This has been reported to avoid Vim getting stuck. */
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1644 if (app_context != (XtAppContext)NULL)
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1645 {
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1646 XtDestroyApplicationContext(app_context);
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1647 app_context = (XtAppContext)NULL;
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1648 x11_display = NULL; /* freed by XtDestroyApplicationContext() */
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1649 }
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1650 # endif
48111d5fd8a8 updated for version 7.4.558
Bram Moolenaar <bram@vim.org>
parents: 6448
diff changeset
1651
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1652 setup_term_clip();
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1653 get_x11_title(FALSE);
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1654 }
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
1655 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 * Return TRUE when connection to the X server is desired.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1662 x_connect_to_server(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 #if defined(FEAT_CLIENTSERVER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 if (x_force_connect)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 if (x_no_connect)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 /* Check for a match with "exclude:" from 'clipboard'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 if (clip_exclude_prog != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 {
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6282
diff changeset
1674 if (vim_regexec_prog(&clip_exclude_prog, FALSE, T_NAME, (colnr_T)0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 * Test if "dpy" and x11_window are valid by getting the window title.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 * I don't actually want it yet, so there may be a simpler call to use, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 * this will cause the error handler x_error_check() to be called if anything
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 * is wrong, such as the window pointer being invalid (as can happen when the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 * user changes his DISPLAY, but not his WINDOWID) -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1688 test_x11_window(Display *dpy)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 int (*old_handler)();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 XTextProperty text_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 old_handler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 got_x_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 if (XGetWMName(dpy, x11_window, &text_prop))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 XFree((void *)text_prop.value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 (void)XSetErrorHandler(old_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 if (p_verbose > 0 && got_x_error)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1701 verb_msg((char_u *)_("Testing the X display failed"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 return (got_x_error ? FAIL : OK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
1711 static int get_x11_thing(int get_title, int test_only);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1712
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 * try to get x11 window and display
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 * return FAIL for failure, OK otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1719 get_x11_windis(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 char *winid;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 static int result = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 #define XD_NONE 0 /* x11_display not set here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724 #define XD_HERE 1 /* x11_display opened here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 #define XD_GUI 2 /* x11_display used from gui.dpy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1726 #define XD_XTERM 3 /* x11_display used from xterm_dpy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1727 static int x11_display_from = XD_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1728 static int did_set_error_handler = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1729
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1730 if (!did_set_error_handler)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1731 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1732 /* X just exits if it finds an error otherwise! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 (void)XSetErrorHandler(x_error_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 did_set_error_handler = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 557
diff changeset
1737 #if defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 * If the X11 display was opened here before, for the window where Vim
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 * was started, close that one now to avoid a memory leak.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 if (x11_display_from == XD_HERE && x11_display != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 XCloseDisplay(x11_display);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 x11_display_from = XD_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 if (gui_get_x11_windis(&x11_window, &x11_display) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 x11_display_from = XD_GUI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 else if (x11_display_from == XD_GUI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 /* GUI must have stopped somehow, clear x11_display */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 x11_display_from = XD_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 /* When started with the "-X" argument, don't try connecting. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 if (!x_connect_to_server())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 * If WINDOWID not set, should try another method to find out
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 * what the current window number is. The only code I know for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 * this is very complicated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 * We assume that zero is invalid for WINDOWID.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 if (x11_window == 0 && (winid = getenv("WINDOWID")) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 x11_window = (Window)atol(winid);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 if (xterm_dpy != NULL && x11_window != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 {
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1782 /* We may have checked it already, but Gnome terminal can move us to
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1783 * another window, so we need to check every time. */
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1784 if (x11_display_from != XD_XTERM)
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1785 {
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1786 /*
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1787 * If the X11 display was opened here before, for the window where
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1788 * Vim was started, close that one now to avoid a memory leak.
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1789 */
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1790 if (x11_display_from == XD_HERE && x11_display != NULL)
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1791 XCloseDisplay(x11_display);
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1792 x11_display = xterm_dpy;
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1793 x11_display_from = XD_XTERM;
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
1794 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 if (test_x11_window(x11_display) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 /* probably bad $WINDOWID */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 x11_display_from = XD_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 if (x11_window == 0 || x11_display == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 result = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 if (result != -1) /* Have already been here and set this */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 return result; /* Don't do all these X calls again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 if (x11_window != 0 && x11_display == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 #ifdef SET_SIG_ALARM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 RETSIGTYPE (*sig_save)();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 struct timeval start_tv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 if (p_verbose > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 gettimeofday(&start_tv, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 #ifdef SET_SIG_ALARM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 * Opening the Display may hang if the DISPLAY setting is wrong, or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 * the network connection is bad. Set an alarm timer to get out.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 sig_alarm_called = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 sig_save = (RETSIGTYPE (*)())signal(SIGALRM,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 (RETSIGTYPE (*)())sig_alarm);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 alarm(2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 x11_display = XOpenDisplay(NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 #ifdef SET_SIG_ALARM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 alarm(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 signal(SIGALRM, (RETSIGTYPE (*)())sig_save);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 if (p_verbose > 0 && sig_alarm_called)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1841 verb_msg((char_u *)_("Opening the X display timed out"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 if (x11_display != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1847 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1848 verbose_enter();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 xopen_message(&start_tv);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1850 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1851 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 if (test_x11_window(x11_display) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 /* Maybe window id is bad */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 XCloseDisplay(x11_display);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 x11_display_from = XD_HERE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 if (x11_window == 0 || x11_display == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 return (result = FAIL);
2609
758822790b43 updated for version 7.3.031
Bram Moolenaar <bram@vim.org>
parents: 2600
diff changeset
1866
758822790b43 updated for version 7.3.031
Bram Moolenaar <bram@vim.org>
parents: 2600
diff changeset
1867 # ifdef FEAT_EVAL
758822790b43 updated for version 7.3.031
Bram Moolenaar <bram@vim.org>
parents: 2600
diff changeset
1868 set_vim_var_nr(VV_WINDOWID, (long)x11_window);
758822790b43 updated for version 7.3.031
Bram Moolenaar <bram@vim.org>
parents: 2600
diff changeset
1869 # endif
758822790b43 updated for version 7.3.031
Bram Moolenaar <bram@vim.org>
parents: 2600
diff changeset
1870
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 return (result = OK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 * Determine original x11 Window Title
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1878 get_x11_title(int test_only)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 {
32
41f9fd58cf13 updated for version 7.0019
vimboss
parents: 22
diff changeset
1880 return get_x11_thing(TRUE, test_only);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 * Determine original x11 Window icon
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1887 get_x11_icon(int test_only)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 retval = get_x11_thing(FALSE, test_only);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 /* could not get old icon, use terminal name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 if (oldicon == NULL && !test_only)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 if (STRNCMP(T_NAME, "builtin_", 8) == 0)
1940
e753954c86e2 updated for version 7.2-237
vimboss
parents: 1935
diff changeset
1897 oldicon = vim_strsave(T_NAME + 8);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 else
1940
e753954c86e2 updated for version 7.2-237
vimboss
parents: 1935
diff changeset
1899 oldicon = vim_strsave(T_NAME);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1906 get_x11_thing(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1907 int get_title, /* get title string */
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
1908 int test_only)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 XTextProperty text_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 Status status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 if (get_x11_windis() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 /* Get window/icon name if any */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 if (get_title)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 status = XGetWMName(x11_display, x11_window, &text_prop);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 status = XGetWMIconName(x11_display, x11_window, &text_prop);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 * If terminal is xterm, then x11_window may be a child window of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 * outer xterm window that actually contains the window/icon name, so
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 * keep traversing up the tree until a window with a title/icon is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 * found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 /* Previously this was only done for xterm and alikes. I don't see a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 * reason why it would fail for other terminal emulators.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 * if (term_is_xterm) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 Window root;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 Window parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 Window win = x11_window;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 Window *children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 unsigned int num_children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 while (!status || text_prop.value == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 if (!XQueryTree(x11_display, win, &root, &parent, &children,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 &num_children))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 if (children)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 XFree((void *)children);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 if (parent == root || parent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 win = parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 if (get_title)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 status = XGetWMName(x11_display, win, &text_prop);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 status = XGetWMIconName(x11_display, win, &text_prop);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 if (status && text_prop.value != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 if (!test_only)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 {
2414
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1960 #if defined(FEAT_XFONTSET) || defined(FEAT_MBYTE)
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1961 if (text_prop.encoding == XA_STRING
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1962 # ifdef FEAT_MBYTE
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1963 && !has_mbyte
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1964 # endif
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1965 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 if (get_title)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 oldtitle = vim_strsave((char_u *)text_prop.value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 oldicon = vim_strsave((char_u *)text_prop.value);
2414
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1972 #if defined(FEAT_XFONTSET) || defined(FEAT_MBYTE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 char **cl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 Status transform_status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 int n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 transform_status = XmbTextPropertyToTextList(x11_display,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 &text_prop,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 &cl, &n);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 if (transform_status >= Success && n > 0 && cl[0])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 if (get_title)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 oldtitle = vim_strsave((char_u *) cl[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 oldicon = vim_strsave((char_u *) cl[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 XFreeStringList(cl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 if (get_title)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 oldtitle = vim_strsave((char_u *)text_prop.value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 oldicon = vim_strsave((char_u *)text_prop.value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 XFree((void *)text_prop.value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006
6282
0446fa17bd95 updated for version 7.4.475
Bram Moolenaar <bram@vim.org>
parents: 6174
diff changeset
2007 /* Xutf8 functions are not avaialble on older systems. Note that on some
0446fa17bd95 updated for version 7.4.475
Bram Moolenaar <bram@vim.org>
parents: 6174
diff changeset
2008 * systems X_HAVE_UTF8_STRING may be defined in a header file but
0446fa17bd95 updated for version 7.4.475
Bram Moolenaar <bram@vim.org>
parents: 6174
diff changeset
2009 * Xutf8SetWMProperties() is not in the X11 library. Configure checks for
0446fa17bd95 updated for version 7.4.475
Bram Moolenaar <bram@vim.org>
parents: 6174
diff changeset
2010 * that and defines HAVE_XUTF8SETWMPROPERTIES. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 #if defined(X_HAVE_UTF8_STRING) && defined(FEAT_MBYTE)
6282
0446fa17bd95 updated for version 7.4.475
Bram Moolenaar <bram@vim.org>
parents: 6174
diff changeset
2012 # if X_HAVE_UTF8_STRING && HAVE_XUTF8SETWMPROPERTIES
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 # define USE_UTF8_STRING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 * Set x11 Window Title
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020 * get_x11_windis() must be called before this and have returned OK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2023 set_x11_title(char_u *title)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 /* XmbSetWMProperties() and Xutf8SetWMProperties() should use a STRING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 * when possible, COMPOUND_TEXT otherwise. COMPOUND_TEXT isn't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 * supported everywhere and STRING doesn't work for multi-byte titles.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 #ifdef USE_UTF8_STRING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 Xutf8SetWMProperties(x11_display, x11_window, (const char *)title,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 NULL, NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2034 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2036 #if XtSpecificationRelease >= 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037 # ifdef FEAT_XFONTSET
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2038 XmbSetWMProperties(x11_display, x11_window, (const char *)title,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 NULL, NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041 XTextProperty text_prop;
129
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
2042 char *c_title = (char *)title;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 /* directly from example 3-18 "basicwin" of Xlib Programming Manual */
129
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
2045 (void)XStringListToTextProperty(&c_title, 1, &text_prop);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 XSetWMProperties(x11_display, x11_window, &text_prop,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 NULL, NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 XStoreName(x11_display, x11_window, (char *)title);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 XFlush(x11_display);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 * Set x11 Window icon
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 * get_x11_windis() must be called before this and have returned OK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2062 set_x11_icon(char_u *icon)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 /* See above for comments about using X*SetWMProperties(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 #ifdef USE_UTF8_STRING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 Xutf8SetWMProperties(x11_display, x11_window, NULL, (const char *)icon,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 #if XtSpecificationRelease >= 4
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 # ifdef FEAT_XFONTSET
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 XmbSetWMProperties(x11_display, x11_window, NULL, (const char *)icon,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 XTextProperty text_prop;
129
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
2078 char *c_icon = (char *)icon;
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
2079
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
2080 (void)XStringListToTextProperty(&c_icon, 1, &text_prop);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 XSetWMProperties(x11_display, x11_window, NULL, &text_prop,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 NULL, 0, NULL, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 XSetIconName(x11_display, x11_window, (char *)icon);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 XFlush(x11_display);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 #else /* FEAT_X11 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 static int
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2094 get_x11_title(int test_only UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 static int
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2100 get_x11_icon(int test_only)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 if (!test_only)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 if (STRNCMP(T_NAME, "builtin_", 8) == 0)
1940
e753954c86e2 updated for version 7.2-237
vimboss
parents: 1935
diff changeset
2105 oldicon = vim_strsave(T_NAME + 8);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 else
1940
e753954c86e2 updated for version 7.2-237
vimboss
parents: 1935
diff changeset
2107 oldicon = vim_strsave(T_NAME);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 #endif /* FEAT_X11 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2115 mch_can_restore_title(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 return get_x11_title(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2121 mch_can_restore_icon(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 return get_x11_icon(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 * Set the window title and icon.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2130 mch_settitle(char_u *title, char_u *icon)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 int type = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 static int recursive = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 if (T_NAME == NULL) /* no terminal name (yet) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 if (title == NULL && icon == NULL) /* nothing to do */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 /* When one of the X11 functions causes a deadly signal, we get here again
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 * recursively. Avoid hanging then (something is probably locked). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 if (recursive)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 ++recursive;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 * if the window ID and the display is known, we may use X11 calls
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 if (get_x11_windis() == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 type = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 # if defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 type = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 /*
2414
5bd81e397907 Fix: terminal title not properly restured when there are multi-byte
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2160 * Note: if "t_ts" is set, title is set with escape sequence rather
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 * than x11 calls, because the x11 calls don't always work
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 if ((type || *T_TS != NUL) && title != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 if (oldtitle == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 ) /* first call but not in GUI, save title */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 (void)get_x11_title(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 if (*T_TS != NUL) /* it's OK if t_fs is empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 term_settitle(title);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 # ifdef FEAT_GUI_GTK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 if (!gui.in_use) /* don't do this if GTK+ is running */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 set_x11_title(title); /* x11 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 #endif
64
587305d23d2c updated for version 7.0030
vimboss
parents: 42
diff changeset
2181 #if defined(FEAT_GUI_GTK) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 gui_mch_settitle(title, icon);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 did_set_title = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 if ((type || *T_CIS != NUL) && icon != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 if (oldicon == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 ) /* first call, save icon */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 get_x11_icon(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 if (*T_CIS != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 out_str(T_CIS); /* set icon start */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 out_str_nf(icon);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 out_str(T_CIE); /* set icon end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 # ifdef FEAT_GUI_GTK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 if (!gui.in_use) /* don't do this if GTK+ is running */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 set_x11_icon(icon); /* x11 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 did_set_icon = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 --recursive;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 * Restore the window/icon title.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 * "which" is one of:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 * 1 only restore title
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 * 2 only restore icon
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 * 3 restore title and icon
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2225 mch_restore_title(int which)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 /* only restore the title or icon when it has been set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 mch_settitle(((which & 1) && did_set_title) ?
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 (oldtitle ? oldtitle : p_titleold) : NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 ((which & 2) && did_set_icon) ? oldicon : NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 #endif /* FEAT_TITLE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 * Return TRUE if "name" looks like some xterm name.
158
78423945b251 updated for version 7.0048
vimboss
parents: 147
diff changeset
2237 * Seiichi Sato mentioned that "mlterm" works like xterm.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2240 vim_is_xterm(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 if (name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 return (STRNICMP(name, "xterm", 5) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 || STRNICMP(name, "nxterm", 6) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 || STRNICMP(name, "kterm", 5) == 0
158
78423945b251 updated for version 7.0048
vimboss
parents: 147
diff changeset
2247 || STRNICMP(name, "mlterm", 6) == 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 || STRNICMP(name, "rxvt", 4) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 || STRCMP(name, "builtin_xterm") == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2252 #if defined(FEAT_MOUSE_XTERM) || defined(PROTO)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2253 /*
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2254 * Return TRUE if "name" appears to be that of a terminal
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2255 * known to support the xterm-style mouse protocol.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2256 * Relies on term_is_xterm having been set to its correct value.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2257 */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2258 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2259 use_xterm_like_mouse(char_u *name)
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2260 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2261 return (name != NULL
9873
043b7a9579e6 commit https://github.com/vim/vim/commit/e56132bb4167f8b6ea4814cc2c99a71df3d07ff8
Christian Brabandt <cb@256bit.org>
parents: 9552
diff changeset
2262 && (term_is_xterm
043b7a9579e6 commit https://github.com/vim/vim/commit/e56132bb4167f8b6ea4814cc2c99a71df3d07ff8
Christian Brabandt <cb@256bit.org>
parents: 9552
diff changeset
2263 || STRNICMP(name, "screen", 6) == 0
043b7a9579e6 commit https://github.com/vim/vim/commit/e56132bb4167f8b6ea4814cc2c99a71df3d07ff8
Christian Brabandt <cb@256bit.org>
parents: 9552
diff changeset
2264 || STRICMP(name, "st") == 0
043b7a9579e6 commit https://github.com/vim/vim/commit/e56132bb4167f8b6ea4814cc2c99a71df3d07ff8
Christian Brabandt <cb@256bit.org>
parents: 9552
diff changeset
2265 || STRNICMP(name, "st-", 3) == 0
043b7a9579e6 commit https://github.com/vim/vim/commit/e56132bb4167f8b6ea4814cc2c99a71df3d07ff8
Christian Brabandt <cb@256bit.org>
parents: 9552
diff changeset
2266 || STRNICMP(name, "stterm", 6) == 0));
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2267 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2268 #endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2269
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 #if defined(FEAT_MOUSE_TTY) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 * Return non-zero when using an xterm mouse, according to 'ttymouse'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 * Return 1 for "xterm".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 * Return 2 for "xterm2".
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
2275 * Return 3 for "urxvt".
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
2276 * Return 4 for "sgr".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2279 use_xterm_mouse(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 {
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
2281 if (ttym_flags == TTYM_SGR)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
2282 return 4;
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
2283 if (ttym_flags == TTYM_URXVT)
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
2284 return 3;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 if (ttym_flags == TTYM_XTERM2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 return 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 if (ttym_flags == TTYM_XTERM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2290 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2294 vim_is_iris(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 if (name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 return (STRNICMP(name, "iris-ansi", 9) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 || STRCMP(name, "builtin_iris-ansi") == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2303 vim_is_vt300(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 if (name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 return FALSE; /* actually all ANSI comp. terminals should be here */
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 14
diff changeset
2307 /* catch VT100 - VT5xx */
cc049b00ee70 updated for version 7.0014
vimboss
parents: 14
diff changeset
2308 return ((STRNICMP(name, "vt", 2) == 0
cc049b00ee70 updated for version 7.0014
vimboss
parents: 14
diff changeset
2309 && vim_strchr((char_u *)"12345", name[2]) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 || STRCMP(name, "builtin_vt320") == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 * Return TRUE if "name" is a terminal for which 'ttyfast' should be set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 * This should include all windowed terminal emulators.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2318 vim_is_fastterm(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 if (name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 if (vim_is_xterm(name) || vim_is_vt300(name) || vim_is_iris(name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 return ( STRNICMP(name, "hpterm", 6) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 || STRNICMP(name, "sun-cmd", 7) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 || STRNICMP(name, "screen", 6) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 || STRNICMP(name, "dtterm", 6) == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 * Insert user name in s[len].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 * Return OK if a name found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2335 mch_get_user_name(char_u *s, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 #ifdef VMS
509
c30adca15506 updated for version 7.0143
vimboss
parents: 501
diff changeset
2338 vim_strncpy(s, (char_u *)cuserid(NULL), len - 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 return mch_get_uname(getuid(), s, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 * Insert user name for "uid" in s[len].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 * Return OK if a name found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2350 mch_get_uname(uid_t uid, char_u *s, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 #if defined(HAVE_PWD_H) && defined(HAVE_GETPWUID)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 struct passwd *pw;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 if ((pw = getpwuid(uid)) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 && pw->pw_name != NULL && *(pw->pw_name) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 {
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
2358 vim_strncpy(s, (char_u *)pw->pw_name, len - 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 sprintf((char *)s, "%d", (int)uid); /* assumes s is long enough */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 return FAIL; /* a number is not a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 * Insert host name is s[len].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 #ifdef HAVE_SYS_UTSNAME_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2372 mch_get_host_name(char_u *s, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 struct utsname vutsname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 if (uname(&vutsname) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 *s = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 else
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
2379 vim_strncpy(s, (char_u *)vutsname.nodename, len - 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381 #else /* HAVE_SYS_UTSNAME_H */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383 # ifdef HAVE_SYS_SYSTEMINFO_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 # define gethostname(nam, len) sysinfo(SI_HOSTNAME, nam, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 void
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2388 mch_get_host_name(char_u *s, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 # ifdef VAXC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 vaxc$gethostname((char *)s, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 gethostname((char *)s, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 s[len - 1] = NUL; /* make sure it's terminated */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 #endif /* HAVE_SYS_UTSNAME_H */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 * return process ID
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 long
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2403 mch_get_pid(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 return (long)getpid();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 #if !defined(HAVE_STRERROR) && defined(USE_GETCWD)
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
2409 static char *strerror(int);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 static char *
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2412 strerror(int err)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 extern int sys_nerr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 extern char *sys_errlist[];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 static char er[20];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 if (err > 0 && err < sys_nerr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 return (sys_errlist[err]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 sprintf(er, "Error %d", err);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 return er;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 * Get name of current directory into buffer 'buf' of length 'len' bytes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 * Return OK for success, FAIL for failure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2430 mch_dirname(char_u *buf, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 #if defined(USE_GETCWD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 if (getcwd((char *)buf, len) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 STRCPY(buf, strerror(errno));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 return (getwd((char *)buf) != NULL ? OK : FAIL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2441 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 /*
1045
7f01e52cc97a updated for version 7.0-171
vimboss
parents: 944
diff changeset
2445 * Get absolute file name into "buf[len]".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 * return FAIL for failure, OK for success
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2450 mch_FullName(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2451 char_u *fname,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2452 char_u *buf,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2453 int len,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2454 int force) /* also expand when already absolute path */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 int l;
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2457 #ifdef HAVE_FCHDIR
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 int fd = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 static int dont_fchdir = FALSE; /* TRUE when fchdir() doesn't work */
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2460 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 char_u olddir[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 int retval = OK;
1615
fc2ee817dc98 updated for version 7.1-328
vimboss
parents: 1605
diff changeset
2464 #ifdef __CYGWIN__
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2465 char_u posix_fname[MAXPATHL]; /* Cygwin docs mention MAX_PATH, but
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2466 it's not always defined */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
2467 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2469 #ifdef VMS
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2470 fname = vms_fixfilename(fname);
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2471 #endif
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2472
1102
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2473 #ifdef __CYGWIN__
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2474 /*
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2475 * This helps for when "/etc/hosts" is a symlink to "c:/something/hosts".
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2476 */
1657
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
2477 # if CYGWIN_VERSION_DLL_MAJOR >= 1007
7420
37092e334ef2 commit https://github.com/vim/vim/commit/06b0734d9cd2f39d4c12c7fd89a100eadbe5be78
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
2478 /* Use CCP_RELATIVE to avoid that it sometimes returns a path that ends in
37092e334ef2 commit https://github.com/vim/vim/commit/06b0734d9cd2f39d4c12c7fd89a100eadbe5be78
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
2479 * a forward slash. */
37092e334ef2 commit https://github.com/vim/vim/commit/06b0734d9cd2f39d4c12c7fd89a100eadbe5be78
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
2480 cygwin_conv_path(CCP_WIN_A_TO_POSIX | CCP_RELATIVE,
37092e334ef2 commit https://github.com/vim/vim/commit/06b0734d9cd2f39d4c12c7fd89a100eadbe5be78
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
2481 fname, posix_fname, MAXPATHL);
1657
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
2482 # else
1615
fc2ee817dc98 updated for version 7.1-328
vimboss
parents: 1605
diff changeset
2483 cygwin_conv_to_posix_path(fname, posix_fname);
1657
c3e225bc213a updated for version 7.2a-009
vimboss
parents: 1620
diff changeset
2484 # endif
1615
fc2ee817dc98 updated for version 7.1-328
vimboss
parents: 1605
diff changeset
2485 fname = posix_fname;
1102
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2486 #endif
50a932187204 updated for version 7.0-228
vimboss
parents: 1082
diff changeset
2487
7406
c97735aaef9f commit https://github.com/vim/vim/commit/e3303cb0817e826e3c25d5dc4ac10b569d0841e1
Christian Brabandt <cb@256bit.org>
parents: 7239
diff changeset
2488 /* Expand it if forced or not an absolute path.
c97735aaef9f commit https://github.com/vim/vim/commit/e3303cb0817e826e3c25d5dc4ac10b569d0841e1
Christian Brabandt <cb@256bit.org>
parents: 7239
diff changeset
2489 * Do not do it for "/file", the result is always "/". */
c97735aaef9f commit https://github.com/vim/vim/commit/e3303cb0817e826e3c25d5dc4ac10b569d0841e1
Christian Brabandt <cb@256bit.org>
parents: 7239
diff changeset
2490 if ((force || !mch_isFullName(fname))
c97735aaef9f commit https://github.com/vim/vim/commit/e3303cb0817e826e3c25d5dc4ac10b569d0841e1
Christian Brabandt <cb@256bit.org>
parents: 7239
diff changeset
2491 && ((p = vim_strrchr(fname, '/')) == NULL || p != fname))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 * If the file name has a path, change to that directory for a moment,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 * and then do the getwd() (and get back to where we were).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 * This will get the correct path name with "../" things.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 */
7406
c97735aaef9f commit https://github.com/vim/vim/commit/e3303cb0817e826e3c25d5dc4ac10b569d0841e1
Christian Brabandt <cb@256bit.org>
parents: 7239
diff changeset
2498 if (p != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 {
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2500 #ifdef HAVE_FCHDIR
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 * Use fchdir() if possible, it's said to be faster and more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503 * reliable. But on SunOS 4 it might not work. Check this by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 * doing a fchdir() right now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 if (!dont_fchdir)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 fd = open(".", O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 if (fd >= 0 && fchdir(fd) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 close(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 fd = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 dont_fchdir = TRUE; /* don't try again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 }
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2516 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 /* Only change directory when we are sure we can return to where
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 * we are now. After doing "su" chdir(".") might not work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 if (
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2521 #ifdef HAVE_FCHDIR
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 fd < 0 &&
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2523 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 (mch_dirname(olddir, MAXPATHL) == FAIL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 || mch_chdir((char *)olddir) != 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 p = NULL; /* can't get current dir: don't chdir */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 /* The directory is copied into buf[], to be able to remove
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 * the file name without changing it (could be a string in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 * read-only memory) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 if (p - fname >= len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 {
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
2539 vim_strncpy(buf, fname, p - fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 if (mch_chdir((char *)buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 fname = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 *buf = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 if (mch_dirname(buf, len) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 *buf = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 {
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2555 #ifdef HAVE_FCHDIR
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 if (fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 {
1935
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2558 if (p_verbose >= 5)
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2559 {
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2560 verbose_enter();
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2561 MSG("fchdir() to previous dir");
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2562 verbose_leave();
5bd06a91c65c updated for version 7.2-232
vimboss
parents: 1932
diff changeset
2563 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 l = fchdir(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 close(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 else
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2568 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 l = mch_chdir((char *)olddir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 if (l != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 EMSG(_(e_prev_dir));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 l = STRLEN(buf);
3867
caa0ca9ad06c updated for version 7.3.690
Bram Moolenaar <bram@vim.org>
parents: 3748
diff changeset
2575 if (l >= len - 1)
caa0ca9ad06c updated for version 7.3.690
Bram Moolenaar <bram@vim.org>
parents: 3748
diff changeset
2576 retval = FAIL; /* no space for trailing "/" */
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2577 #ifndef VMS
3867
caa0ca9ad06c updated for version 7.3.690
Bram Moolenaar <bram@vim.org>
parents: 3748
diff changeset
2578 else if (l > 0 && buf[l - 1] != '/' && *fname != NUL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579 && STRCMP(fname, ".") != 0)
3867
caa0ca9ad06c updated for version 7.3.690
Bram Moolenaar <bram@vim.org>
parents: 3748
diff changeset
2580 STRCAT(buf, "/");
1082
342d2b3a072a updated for version 7.0-208
vimboss
parents: 1076
diff changeset
2581 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 }
1045
7f01e52cc97a updated for version 7.0-171
vimboss
parents: 944
diff changeset
2583
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 /* Catch file names which are too long. */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1869
diff changeset
2585 if (retval == FAIL || (int)(STRLEN(buf) + STRLEN(fname)) >= len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 /* Do not append ".", "/dir/." is equal to "/dir". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 if (STRCMP(fname, ".") != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 STRCAT(buf, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 * Return TRUE if "fname" does not depend on the current directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2599 mch_isFullName(char_u *fname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 {
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
2601 #ifdef VMS
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 return ( fname[0] == '/' || fname[0] == '.' ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 strchr((char *)fname,':') || strchr((char *)fname,'"') ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 (strchr((char *)fname,'[') && strchr((char *)fname,']'))||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 (strchr((char *)fname,'<') && strchr((char *)fname,'>')) );
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
2606 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 return (*fname == '/' || *fname == '~');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610
585
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2611 #if defined(USE_FNAME_CASE) || defined(PROTO)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2612 /*
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2613 * Set the case of the file name, if it already exists. This will cause the
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2614 * file name to remain exactly the same.
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
2615 * Only required for file systems where case is ignored and preserved.
585
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2616 */
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2617 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2618 fname_case(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2619 char_u *name,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2620 int len UNUSED) /* buffer size, only used when name gets longer */
585
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2621 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2622 struct stat st;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2623 char_u *slash, *tail;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2624 DIR *dirp;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2625 struct dirent *dp;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2626
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2627 if (lstat((char *)name, &st) >= 0)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2628 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2629 /* Open the directory where the file is located. */
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2630 slash = vim_strrchr(name, '/');
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2631 if (slash == NULL)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2632 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2633 dirp = opendir(".");
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2634 tail = name;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2635 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2636 else
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2637 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2638 *slash = NUL;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2639 dirp = opendir((char *)name);
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2640 *slash = '/';
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2641 tail = slash + 1;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2642 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2643
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2644 if (dirp != NULL)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2645 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2646 while ((dp = readdir(dirp)) != NULL)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2647 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2648 /* Only accept names that differ in case and are the same byte
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2649 * length. TODO: accept different length name. */
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2650 if (STRICMP(tail, dp->d_name) == 0
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2651 && STRLEN(tail) == STRLEN(dp->d_name))
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2652 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2653 char_u newname[MAXPATHL + 1];
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2654 struct stat st2;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2655
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2656 /* Verify the inode is equal. */
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2657 vim_strncpy(newname, name, MAXPATHL);
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2658 vim_strncpy(newname + (tail - name), (char_u *)dp->d_name,
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2659 MAXPATHL - (tail - name));
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2660 if (lstat((char *)newname, &st2) >= 0
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2661 && st.st_ino == st2.st_ino
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2662 && st.st_dev == st2.st_dev)
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2663 {
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2664 STRCPY(tail, dp->d_name);
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2665 break;
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2666 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2667 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2668 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2669
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2670 closedir(dirp);
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2671 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2672 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2673 }
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2674 #endif
c10855f07ab0 updated for version 7.0166
vimboss
parents: 578
diff changeset
2675
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 * Get file permissions for 'name'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 * Returns -1 when it doesn't exist.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 long
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2681 mch_getperm(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 struct stat statb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 /* Keep the #ifdef outside of stat(), it may be a macro. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 if (stat((char *)vms_fixfilename(name), &statb))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689 if (stat((char *)name, &statb))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 return -1;
1350
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2692 #ifdef __INTERIX
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2693 /* The top bit makes the value negative, which means the file doesn't
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2694 * exist. Remove the bit, we don't use it. */
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2695 return statb.st_mode & ~S_ADDACE;
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2696 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 return statb.st_mode;
1350
3d698caa5dfc updated for version 7.1-064
vimboss
parents: 1204
diff changeset
2698 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 * set file permission for 'name' to 'perm'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 * return FAIL for failure, OK otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2707 mch_setperm(char_u *name, long perm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 return (chmod((char *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 vms_fixfilename(name),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 name,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 (mode_t)perm) == 0 ? OK : FAIL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 #if defined(HAVE_ACL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 # ifdef HAVE_SYS_ACL_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 # include <sys/acl.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 # ifdef HAVE_SYS_ACCESS_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 # include <sys/access.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 # ifdef HAVE_SOLARIS_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 typedef struct vim_acl_solaris_T {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 int acl_cnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 aclent_t *acl_entry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 } vim_acl_solaris_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2733 #if defined(HAVE_SELINUX) || defined(PROTO)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2734 /*
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2735 * Copy security info from "from_file" to "to_file".
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2736 */
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2737 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2738 mch_copy_sec(char_u *from_file, char_u *to_file)
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2739 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2740 if (from_file == NULL)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2741 return;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2742
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2743 if (selinux_enabled == -1)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2744 selinux_enabled = is_selinux_enabled();
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2745
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2746 if (selinux_enabled > 0)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2747 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2748 security_context_t from_context = NULL;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2749 security_context_t to_context = NULL;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2750
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2751 if (getfilecon((char *)from_file, &from_context) < 0)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2752 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2753 /* If the filesystem doesn't support extended attributes,
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2754 the original had no special security context and the
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2755 target cannot have one either. */
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2756 if (errno == EOPNOTSUPP)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2757 return;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2758
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2759 MSG_PUTS(_("\nCould not get security context for "));
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2760 msg_outtrans(from_file);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2761 msg_putchar('\n');
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2762 return;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2763 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2764 if (getfilecon((char *)to_file, &to_context) < 0)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2765 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2766 MSG_PUTS(_("\nCould not get security context for "));
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2767 msg_outtrans(to_file);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2768 msg_putchar('\n');
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2769 freecon (from_context);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2770 return ;
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2771 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2772 if (strcmp(from_context, to_context) != 0)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2773 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2774 if (setfilecon((char *)to_file, from_context) < 0)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2775 {
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2776 MSG_PUTS(_("\nCould not set security context for "));
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2777 msg_outtrans(to_file);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2778 msg_putchar('\n');
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2779 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2780 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2781 freecon(to_context);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2782 freecon(from_context);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2783 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2784 }
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2785 #endif /* HAVE_SELINUX */
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1560
diff changeset
2786
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2787 #if defined(HAVE_SMACK) && !defined(PROTO)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2788 /*
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2789 * Copy security info from "from_file" to "to_file".
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2790 */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2791 void
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7833
diff changeset
2792 mch_copy_sec(char_u *from_file, char_u *to_file)
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2793 {
5832
e4cd5bb75029 updated for version 7.4.259
Bram Moolenaar <bram@vim.org>
parents: 5800
diff changeset
2794 static const char * const smack_copied_attributes[] =
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2795 {
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2796 XATTR_NAME_SMACK,
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2797 XATTR_NAME_SMACKEXEC,
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2798 XATTR_NAME_SMACKMMAP
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2799 };
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2800
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2801 char buffer[SMACK_LABEL_LEN];
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2802 const char *name;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2803 int index;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2804 int ret;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2805 ssize_t size;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2806
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2807 if (from_file == NULL)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2808 return;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2809
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2810 for (index = 0 ; index < (int)(sizeof(smack_copied_attributes)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2811 / sizeof(smack_copied_attributes)[0]) ; index++)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2812 {
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2813 /* get the name of the attribute to copy */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2814 name = smack_copied_attributes[index];
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2815
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2816 /* get the value of the attribute in buffer */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2817 size = getxattr((char*)from_file, name, buffer, sizeof(buffer));
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2818 if (size >= 0)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2819 {
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2820 /* copy the attribute value of buffer */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2821 ret = setxattr((char*)to_file, name, buffer, (size_t)size, 0);
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2822 if (ret < 0)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2823 {
7778
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2824 vim_snprintf((char *)IObuff, IOSIZE,
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2825 _("Could not set security context %s for %s"),
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2826 name, to_file);
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2827 msg_outtrans(IObuff);
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2828 msg_putchar('\n');
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2829 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2830 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2831 else
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2832 {
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2833 /* what reason of not having the attribute value? */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2834 switch (errno)
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2835 {
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2836 case ENOTSUP:
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2837 /* extended attributes aren't supported or enabled */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2838 /* should a message be echoed? not sure... */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2839 return; /* leave because it isn't usefull to continue */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2840
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2841 case ERANGE:
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2842 default:
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2843 /* no enough size OR unexpected error */
7778
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2844 vim_snprintf((char *)IObuff, IOSIZE,
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2845 _("Could not get security context %s for %s. Removing it!"),
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2846 name, from_file);
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2847 msg_puts(IObuff);
4e09a38129a3 commit https://github.com/vim/vim/commit/4a1314cb9c1847dc32ceeb3eebeae123ef10b16e
Christian Brabandt <cb@256bit.org>
parents: 7743
diff changeset
2848 msg_putchar('\n');
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2849 /* FALLTHROUGH to remove the attribute */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2850
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2851 case ENODATA:
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2852 /* no attribute of this name */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2853 ret = removexattr((char*)to_file, name);
5800
da17c7de616e updated for version 7.4.244
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
2854 /* Silently ignore errors, apparently this happens when
da17c7de616e updated for version 7.4.244
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
2855 * smack is not actually being used. */
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2856 break;
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2857 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2858 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2859 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2860 }
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2861 #endif /* HAVE_SMACK */
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5782
diff changeset
2862
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 * Return a pointer to the ACL of file "fname" in allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 * Return NULL if the ACL is not available for whatever reason.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 vim_acl_T
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2868 mch_get_acl(char_u *fname UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 vim_acl_T ret = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 #ifdef HAVE_POSIX_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 ret = (vim_acl_T)acl_get_file((char *)fname, ACL_TYPE_ACCESS);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 #else
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2874 #ifdef HAVE_SOLARIS_ZFS_ACL
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2875 acl_t *aclent;
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2876
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2877 if (acl_get((char *)fname, 0, &aclent) < 0)
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2878 return NULL;
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2879 ret = (vim_acl_T)aclent;
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2880 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 #ifdef HAVE_SOLARIS_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 vim_acl_solaris_T *aclent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 aclent = malloc(sizeof(vim_acl_solaris_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 if ((aclent->acl_cnt = acl((char *)fname, GETACLCNT, 0, NULL)) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 aclent->acl_entry = malloc(aclent->acl_cnt * sizeof(aclent_t));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 if (acl((char *)fname, GETACL, aclent->acl_cnt, aclent->acl_entry) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 free(aclent->acl_entry);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 ret = (vim_acl_T)aclent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 #if defined(HAVE_AIX_ACL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 int aclsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 struct acl *aclent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 aclsize = sizeof(struct acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 aclent = malloc(aclsize);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 if (statacl((char *)fname, STX_NORMAL, aclent, aclsize) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 if (errno == ENOSPC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 aclsize = aclent->acl_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 aclent = realloc(aclent, aclsize);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 if (statacl((char *)fname, STX_NORMAL, aclent, aclsize) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 ret = (vim_acl_T)aclent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 #endif /* HAVE_AIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 #endif /* HAVE_SOLARIS_ACL */
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2926 #endif /* HAVE_SOLARIS_ZFS_ACL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 #endif /* HAVE_POSIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 * Set the ACL of file "fname" to "acl" (unless it's NULL).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2935 mch_set_acl(char_u *fname UNUSED, vim_acl_T aclent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 if (aclent == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 #ifdef HAVE_POSIX_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 acl_set_file((char *)fname, ACL_TYPE_ACCESS, (acl_t)aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 #else
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2942 #ifdef HAVE_SOLARIS_ZFS_ACL
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2943 acl_set((char *)fname, (acl_t *)aclent);
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2944 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 #ifdef HAVE_SOLARIS_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 acl((char *)fname, SETACL, ((vim_acl_solaris_T *)aclent)->acl_cnt,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 ((vim_acl_solaris_T *)aclent)->acl_entry);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 #ifdef HAVE_AIX_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 chacl((char *)fname, aclent, ((struct acl *)aclent)->acl_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 #endif /* HAVE_AIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 #endif /* HAVE_SOLARIS_ACL */
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2953 #endif /* HAVE_SOLARIS_ZFS_ACL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 #endif /* HAVE_POSIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2958 mch_free_acl(vim_acl_T aclent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 if (aclent == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 #ifdef HAVE_POSIX_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 acl_free((acl_t)aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964 #else
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2965 #ifdef HAVE_SOLARIS_ZFS_ACL
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2966 acl_free((acl_t *)aclent);
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2967 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 #ifdef HAVE_SOLARIS_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 free(((vim_acl_solaris_T *)aclent)->acl_entry);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 #ifdef HAVE_AIX_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 free(aclent);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 #endif /* HAVE_AIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 #endif /* HAVE_SOLARIS_ACL */
3330
81201fb337a5 updated for version 7.3.432
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
2976 #endif /* HAVE_SOLARIS_ZFS_ACL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 #endif /* HAVE_POSIX_ACL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 * Set hidden flag for "name".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2985 mch_hide(char_u *name UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 /* can't hide a file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 /*
7629
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
2991 * return TRUE if "name" is a directory or a symlink to a directory
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 * return FALSE if "name" is not a directory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 * return FALSE for error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
2996 mch_isdir(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 struct stat statb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 if (*name == NUL) /* Some stat()s don't flag "" as an error. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 if (stat((char *)name, &statb))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 #ifdef _POSIX_SOURCE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005 return (S_ISDIR(statb.st_mode) ? TRUE : FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 return ((statb.st_mode & S_IFMT) == S_IFDIR ? TRUE : FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010
7629
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3011 /*
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3012 * return TRUE if "name" is a directory, NOT a symlink to a directory
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3013 * return FALSE if "name" is not a directory
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3014 * return FALSE for error
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3015 */
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3016 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3017 mch_isrealdir(char_u *name)
7629
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3018 {
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3019 struct stat statb;
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3020
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3021 if (*name == NUL) /* Some stat()s don't flag "" as an error. */
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3022 return FALSE;
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3023 if (lstat((char *)name, &statb))
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3024 return FALSE;
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3025 #ifdef _POSIX_SOURCE
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3026 return (S_ISDIR(statb.st_mode) ? TRUE : FALSE);
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3027 #else
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3028 return ((statb.st_mode & S_IFMT) == S_IFDIR ? TRUE : FALSE);
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3029 #endif
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3030 }
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7469
diff changeset
3031
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
3032 static int executable_file(char_u *name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 * Return 1 if "name" is an executable file, 0 if not or it doesn't exist.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3038 executable_file(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 if (stat((char *)name, &st))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 return 0;
5704
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3044 #ifdef VMS
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3045 /* Like on Unix system file can have executable rights but not necessarily
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3046 * be an executable, but on Unix is not a default for an ordianry file to
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3047 * have an executable flag - on VMS it is in most cases.
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3048 * Therefore, this check does not have any sense - let keep us to the
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3049 * conventions instead:
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3050 * *.COM and *.EXE files are the executables - the rest are not. This is
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3051 * not ideal but better then it was.
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3052 */
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3053 int vms_executable = 0;
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3054 if (S_ISREG(st.st_mode) && mch_access((char *)name, X_OK) == 0)
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3055 {
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3056 if (strstr(vms_tolower((char*)name),".exe") != NULL
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3057 || strstr(vms_tolower((char*)name),".com")!= NULL)
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3058 vms_executable = 1;
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3059 }
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3060 return vms_executable;
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3061 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 return S_ISREG(st.st_mode) && mch_access((char *)name, X_OK) == 0;
5704
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3063 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 * Return 1 if "name" can be found in $PATH and executed, 0 if not.
6695
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3068 * If "use_path" is FALSE only check if "name" is executable.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 * Return -1 if unknown.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3072 mch_can_exe(char_u *name, char_u **path, int use_path)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 char_u *p, *e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077
6695
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3078 /* When "use_path" is false and if it's an absolute or relative path don't
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3079 * need to use $PATH. */
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3080 if (!use_path || mch_isFullName(name) || (name[0] == '.'
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3081 && (name[1] == '/' || (name[1] == '.' && name[2] == '/'))))
5704
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3082 {
6695
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3083 /* There must be a path separator, files in the current directory
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3084 * can't be executed. */
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
3085 if (gettail(name) != name && executable_file(name))
5782
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3086 {
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3087 if (path != NULL)
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3088 {
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3089 if (name[0] == '.')
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3090 *path = FullName_save(name, TRUE);
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3091 else
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3092 *path = vim_strsave(name);
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3093 }
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3094 return TRUE;
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3095 }
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3096 return FALSE;
5704
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5541
diff changeset
3097 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 p = (char_u *)getenv("PATH");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 if (p == NULL || *p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 buf = alloc((unsigned)(STRLEN(name) + STRLEN(p) + 2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107 * Walk through all entries in $PATH to check if "name" exists there and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 * is an executable file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 e = (char_u *)strchr((char *)p, ':');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 if (e == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 e = p + STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 if (e - p <= 1) /* empty entry means current dir */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 STRCPY(buf, "./");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 {
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
3119 vim_strncpy(buf, p, e - p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120 add_pathsep(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3121 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 STRCAT(buf, name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 retval = executable_file(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 if (retval == 1)
5782
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3125 {
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3126 if (path != NULL)
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3127 {
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3128 if (buf[0] == '.')
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3129 *path = FullName_save(buf, TRUE);
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3130 else
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3131 *path = vim_strsave(buf);
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3132 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 break;
5782
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
3134 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 if (*e != ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 p = e + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 vim_free(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 * Check what "name" is:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 * NODE_NORMAL: file or directory (or doesn't exist)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 * NODE_WRITABLE: writable device, socket, fifo, etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 * NODE_OTHER: non-writable things
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3152 mch_nodetype(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 if (stat((char *)name, &st))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 return NODE_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 return NODE_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 if (S_ISBLK(st.st_mode)) /* block device isn't writable */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 return NODE_OTHER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 /* Everything else is writable? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 return NODE_WRITABLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3167 mch_early_init(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 #ifdef HAVE_CHECK_STACK_GROWTH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 int i;
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3171
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 check_stack_growth((char *)&i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3174 # ifdef HAVE_STACK_LIMIT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 get_stack_limit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 * Setup an alternative stack for signals. Helps to catch signals when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 * running out of stack space.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 * Use of sigaltstack() is preferred, it's more portable.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 * Ignore any errors.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
1737
8272535dee77 updated for version 7.2-035
vimboss
parents: 1698
diff changeset
3187 signal_stack = (char *)alloc(SIGSTKSZ);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 init_signal_stack();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3192 #if defined(EXITFREE) || defined(PROTO)
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3193 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3194 mch_free_mem(void)
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3195 {
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3196 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3197 if (clip_star.owned)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3198 clip_lose_selection(&clip_star);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3199 if (clip_plus.owned)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3200 clip_lose_selection(&clip_plus);
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3201 # endif
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3202 # if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3203 if (xterm_Shell != (Widget)0)
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3204 XtDestroyWidget(xterm_Shell);
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3205 # ifndef LESSTIF_VERSION
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3206 /* Lesstif crashes here, lose some memory */
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3207 if (xterm_dpy != NULL)
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3208 XtCloseDisplay(xterm_dpy);
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3209 if (app_context != (XtAppContext)NULL)
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3210 {
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3211 XtDestroyApplicationContext(app_context);
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3212 # ifdef FEAT_X11
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3213 x11_display = NULL; /* freed by XtDestroyApplicationContext() */
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3214 # endif
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3215 }
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3216 # endif
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3217 # endif
2277
f42e0b5ff9e9 Change remaining HAVE_GTK2 to FEAT_GUI_GTK.
Bram Moolenaar <bram@vim.org>
parents: 2275
diff changeset
3218 # if defined(FEAT_X11)
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3219 if (x11_display != NULL
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3220 # ifdef FEAT_XCLIPBOARD
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3221 && x11_display != xterm_dpy
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3222 # endif
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
3223 )
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3224 XCloseDisplay(x11_display);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3225 # endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3226 # if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3227 vim_free(signal_stack);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3228 signal_stack = NULL;
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3229 # endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3230 # ifdef FEAT_TITLE
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3231 vim_free(oldtitle);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3232 vim_free(oldicon);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 355
diff changeset
3233 # endif
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3234 }
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3235 #endif
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3236
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
3237 static void exit_scroll(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3238
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3239 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 * Output a newline when exiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241 * Make sure the newline goes to the same stream as the text.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3244 exit_scroll(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3246 if (silent_mode)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3247 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248 if (newline_on_exit || msg_didout)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3250 if (msg_use_printf())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 if (info_message)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 mch_msg("\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 mch_errmsg("\r\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 out_char('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 restore_cterm_colors(); /* get original colors back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263 msg_clr_eos_force(); /* clear the rest of the display */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 windgoto((int)Rows - 1, 0); /* may have moved the cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3269 mch_exit(int r)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271 exiting = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273 #if defined(FEAT_X11) && defined(FEAT_CLIPBOARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 x11_export_final_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 if (!gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281 settmode(TMODE_COOK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 mch_restore_title(3); /* restore xterm title and icon name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 * When t_ti is not empty but it doesn't cause swapping terminal
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287 * pages, need to output a newline when msg_didout is set. But when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 * t_ti does swap pages it should not go to the shell page. Do this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 * before stoptermcap().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3290 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3291 if (swapping_screen() && !newline_on_exit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292 exit_scroll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 /* Stop termcap: May need to check for T_CRV response, which
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 * requires RAW mode. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 stoptermcap();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 * A newline is only required after a message in the alternate screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 * This is set to TRUE by wait_return().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 if (!swapping_screen() || newline_on_exit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 exit_scroll();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 /* Cursor may have been switched off without calling starttermcap()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 * when doing "vim -u vimrc" and vimrc contains ":q". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307 if (full_screen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 cursor_on();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3310 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 ml_close_all(TRUE); /* remove all memfiles */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3312 may_core_dump();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3314 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 gui_exit(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 #endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3317
765
335444c09581 updated for version 7.0225
vimboss
parents: 758
diff changeset
3318 #ifdef MACOS_CONVERT
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3319 mac_conv_cleanup();
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3320 #endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3321
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3322 #ifdef __QNX__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 /* A core dump won't be created if the signal handler
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 * doesn't return, so we can't call exit() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 if (deadly_signal != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
3329 #ifdef FEAT_NETBEANS_INTG
2210
8c6a66e2b3cc Add :nbstart and :nbclose.
Bram Moolenaar <bram@vim.org>
parents: 2209
diff changeset
3330 netbeans_send_disconnect();
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 32
diff changeset
3331 #endif
355
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3332
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3333 #ifdef EXITFREE
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3334 free_all_mem();
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3335 #endif
644578c9e219 updated for version 7.0092
vimboss
parents: 331
diff changeset
3336
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3337 exit(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3338 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3341 may_core_dump(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 if (deadly_signal != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 signal(deadly_signal, SIG_DFL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 kill(getpid(), deadly_signal); /* Die using the signal we caught */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3350 #ifndef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3352 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3353 mch_settmode(int tmode)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3355 static int first = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3357 /* Why is NeXT excluded here (and not in os_unixx.h)? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3358 #if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3359 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3360 * for "new" tty systems
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3361 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3362 # ifdef HAVE_TERMIOS_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3363 static struct termios told;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3364 struct termios tnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3365 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3366 static struct termio told;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3367 struct termio tnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3368 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3370 if (first)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3372 first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3373 # if defined(HAVE_TERMIOS_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3374 tcgetattr(read_cmd_fd, &told);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3375 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3376 ioctl(read_cmd_fd, TCGETA, &told);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3379
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3380 tnew = told;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3381 if (tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3382 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3384 * ~ICRNL enables typing ^V^M
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3385 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 tnew.c_iflag &= ~ICRNL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 tnew.c_lflag &= ~(ICANON | ECHO | ISIG | ECHOE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3388 # if defined(IEXTEN) && !defined(__MINT__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 | IEXTEN /* IEXTEN enables typing ^V on SOLARIS */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 /* but it breaks function keys on MINT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393 # ifdef ONLCR /* don't map NL -> CR NL, we do it ourselves */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 tnew.c_oflag &= ~ONLCR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396 tnew.c_cc[VMIN] = 1; /* return after 1 char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 tnew.c_cc[VTIME] = 0; /* don't wait */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 else if (tmode == TMODE_SLEEP)
9381
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3400 {
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3401 /* Also reset ICANON here, otherwise on Solaris select() won't see
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3402 * typeahead characters. */
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3403 tnew.c_lflag &= ~(ICANON | ECHO);
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3404 tnew.c_cc[VMIN] = 1; /* return after 1 char */
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3405 tnew.c_cc[VTIME] = 0; /* don't wait */
c665cc3292e0 commit https://github.com/vim/vim/commit/40de45664c20e7ca46a28a3f472202f90e47f8bf
Christian Brabandt <cb@256bit.org>
parents: 9262
diff changeset
3406 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 # if defined(HAVE_TERMIOS_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 int n = 10;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 /* A signal may cause tcsetattr() to fail (e.g., SIGCONT). Retry a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 * few times. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 while (tcsetattr(read_cmd_fd, TCSANOW, &tnew) == -1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3415 && errno == EINTR && n > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 --n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3417 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3418 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 ioctl(read_cmd_fd, TCSETA, &tnew);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 * for "old" tty systems
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 # ifndef TIOCSETN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 # define TIOCSETN TIOCSETP /* for hpux 9.0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 static struct sgttyb ttybold;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 struct sgttyb ttybnew;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3433 if (first)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435 first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3436 ioctl(read_cmd_fd, TIOCGETP, &ttybold);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 ttybnew = ttybold;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 if (tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442 ttybnew.sg_flags &= ~(CRMOD | ECHO);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3443 ttybnew.sg_flags |= RAW;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3444 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 else if (tmode == TMODE_SLEEP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 ttybnew.sg_flags &= ~(ECHO);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 ioctl(read_cmd_fd, TIOCSETN, &ttybnew);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 curr_tmode = tmode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 * Try to get the code for "t_kb" from the stty setting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 * Even if termcap claims a backspace key, the user's setting *should*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 * prevail. stty knows more about reality than termcap does, and if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 * somebody's usual erase key is DEL (which, for most BSD users, it will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 * be), they're going to get really annoyed if their erase key starts
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 * doing forward deletes for no reason. (Eric Fischer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3462 get_stty(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 char_u buf[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 /* Why is NeXT excluded here (and not in os_unixx.h)? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 #if defined(ECHOE) && defined(ICANON) && (defined(HAVE_TERMIO_H) || defined(HAVE_TERMIOS_H)) && !defined(__NeXT__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469 /* for "new" tty systems */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3470 # ifdef HAVE_TERMIOS_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3471 struct termios keys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473 struct termio keys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 # if defined(HAVE_TERMIOS_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3477 if (tcgetattr(read_cmd_fd, &keys) != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 if (ioctl(read_cmd_fd, TCGETA, &keys) != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 buf[0] = keys.c_cc[VERASE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483 intr_char = keys.c_cc[VINTR];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3484 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3485 /* for "old" tty systems */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3486 struct sgttyb keys;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3488 if (ioctl(read_cmd_fd, TIOCGETP, &keys) != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3490 buf[0] = keys.sg_erase;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3491 intr_char = keys.sg_kill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3492 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3493 buf[1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 add_termcode((char_u *)"kb", buf, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3495
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3496 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 * If <BS> and <DEL> are now the same, redefine <DEL>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3498 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 p = find_termcode((char_u *)"kD");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 if (p != NULL && p[0] == buf[0] && p[1] == buf[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3501 do_fixdel(NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3504 } /* to keep cindent happy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 #endif /* VMS */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3510 #if defined(FEAT_MOUSE_TTY) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 * Set mouse clicks on or off.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3515 mch_setmouse(int on)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517 static int ison = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 int xterm_mouse_vers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520 if (on == ison) /* return quickly if nothing to do */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3522
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3523 xterm_mouse_vers = use_xterm_mouse();
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3524
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3525 # ifdef FEAT_MOUSE_URXVT
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3526 if (ttym_flags == TTYM_URXVT)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3527 {
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3528 out_str_nf((char_u *)
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3529 (on
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3530 ? IF_EB("\033[?1015h", ESC_STR "[?1015h")
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3531 : IF_EB("\033[?1015l", ESC_STR "[?1015l")));
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3532 ison = on;
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3533 }
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3534 # endif
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3535
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3536 # ifdef FEAT_MOUSE_SGR
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3537 if (ttym_flags == TTYM_SGR)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3538 {
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3539 out_str_nf((char_u *)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3540 (on
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3541 ? IF_EB("\033[?1006h", ESC_STR "[?1006h")
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3542 : IF_EB("\033[?1006l", ESC_STR "[?1006l")));
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3543 ison = on;
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3544 }
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3545 # endif
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3546
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 if (xterm_mouse_vers > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549 if (on) /* enable mouse events, use mouse tracking if available */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 out_str_nf((char_u *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 (xterm_mouse_vers > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 ? IF_EB("\033[?1002h", ESC_STR "[?1002h")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3553 : IF_EB("\033[?1000h", ESC_STR "[?1000h")));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3554 else /* disable mouse events, could probably always send the same */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 out_str_nf((char_u *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 (xterm_mouse_vers > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 ? IF_EB("\033[?1002l", ESC_STR "[?1002l")
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 : IF_EB("\033[?1000l", ESC_STR "[?1000l")));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 ison = on;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 # ifdef FEAT_MOUSE_DEC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3563 else if (ttym_flags == TTYM_DEC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3564 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 if (on) /* enable mouse events */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 out_str_nf((char_u *)"\033[1;2'z\033[1;3'{");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 else /* disable mouse events */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 out_str_nf((char_u *)"\033['z");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 ison = on;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3571 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 if (on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578 if (gpm_open())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 ison = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 gpm_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 ison = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3589 # ifdef FEAT_SYSMOUSE
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3590 else
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3591 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3592 if (on)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3593 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3594 if (sysmouse_open() == OK)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3595 ison = TRUE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3596 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3597 else
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3598 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3599 sysmouse_close();
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3600 ison = FALSE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3601 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3602 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3603 # endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3604
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3605 # ifdef FEAT_MOUSE_JSB
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608 if (on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 /* D - Enable Mouse up/down messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 * L - Enable Left Button Reporting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 * M - Enable Middle Button Reporting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3613 * R - Enable Right Button Reporting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 * K - Enable SHIFT and CTRL key Reporting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615 * + - Enable Advanced messaging of mouse moves and up/down messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 * Q - Quiet No Ack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 * # - Numeric value of mouse pointer required
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 * 0 = Multiview 2000 cursor, used as standard
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3619 * 1 = Windows Arrow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3620 * 2 = Windows I Beam
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 * 3 = Windows Hour Glass
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 * 4 = Windows Cross Hair
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3623 * 5 = Windows UP Arrow
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3624 */
4299
bb3cfdb62607 updated for version 7.3.899
Bram Moolenaar <bram@vim.org>
parents: 4248
diff changeset
3625 # ifdef JSBTERM_MOUSE_NONADVANCED
bb3cfdb62607 updated for version 7.3.899
Bram Moolenaar <bram@vim.org>
parents: 4248
diff changeset
3626 /* Disables full feedback of pointer movements */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK1Q\033\\",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 ESC_STR "[0~ZwLMRK1Q" ESC_STR "\\"));
4299
bb3cfdb62607 updated for version 7.3.899
Bram Moolenaar <bram@vim.org>
parents: 4248
diff changeset
3629 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 out_str_nf((char_u *)IF_EB("\033[0~ZwLMRK+1Q\033\\",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631 ESC_STR "[0~ZwLMRK+1Q" ESC_STR "\\"));
4299
bb3cfdb62607 updated for version 7.3.899
Bram Moolenaar <bram@vim.org>
parents: 4248
diff changeset
3632 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3633 ison = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 out_str_nf((char_u *)IF_EB("\033[0~ZwQ\033\\",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 ESC_STR "[0~ZwQ" ESC_STR "\\"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 ison = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 # ifdef FEAT_MOUSE_PTERM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 /* 1 = button press, 6 = release, 7 = drag, 1h...9l = right button */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647 if (on)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3648 out_str_nf("\033[>1h\033[>6h\033[>7h\033[>1h\033[>9l");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 out_str_nf("\033[>1l\033[>6l\033[>7l\033[>1l\033[>9h");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651 ison = on;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3652 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 * Set the mouse termcode, depending on the 'term' and 'ttymouse' options.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3660 check_mouse_termcode(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3662 # ifdef FEAT_MOUSE_XTERM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3663 if (use_xterm_mouse()
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3664 # ifdef FEAT_MOUSE_URXVT
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3665 && use_xterm_mouse() != 3
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3666 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3667 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3669 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3671 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3672 set_mouse_termcode(KS_MOUSE, (char_u *)(term_is_8bit(T_NAME)
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3673 ? IF_EB("\233M", CSI_STR "M")
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3674 : IF_EB("\033[M", ESC_STR "[M")));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3675 if (*p_mouse != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 /* force mouse off and maybe on to send possibly new mouse
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3678 * activation sequence to the xterm, with(out) drag tracing. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679 mch_setmouse(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680 setmouse();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684 del_mouse_termcode(KS_MOUSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3687 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 if (!use_xterm_mouse()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3691 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3692 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 set_mouse_termcode(KS_MOUSE, (char_u *)IF_EB("\033MG", ESC_STR "MG"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3696 # ifdef FEAT_SYSMOUSE
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3697 if (!use_xterm_mouse()
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3698 # ifdef FEAT_GUI
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3699 && !gui.in_use
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3700 # endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3701 )
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3702 set_mouse_termcode(KS_MOUSE, (char_u *)IF_EB("\033MS", ESC_STR "MS"));
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3703 # endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
3704
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705 # ifdef FEAT_MOUSE_JSB
6102
3d206df5c828 updated for version 7.4.389
Bram Moolenaar <bram@vim.org>
parents: 6039
diff changeset
3706 /* Conflicts with xterm mouse: "\033[" and "\033[M" ??? */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 if (!use_xterm_mouse()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 set_mouse_termcode(KS_JSBTERM_MOUSE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 (char_u *)IF_EB("\033[0~zw", ESC_STR "[0~zw"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3714 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 del_mouse_termcode(KS_JSBTERM_MOUSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3718 # ifdef FEAT_MOUSE_NET
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3719 /* There is no conflict, but one may type "ESC }" from Insert mode. Don't
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3720 * define it in the GUI or when using an xterm. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3721 if (!use_xterm_mouse()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3723 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3724 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3725 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 set_mouse_termcode(KS_NETTERM_MOUSE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 (char_u *)IF_EB("\033}", ESC_STR "}"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 del_mouse_termcode(KS_NETTERM_MOUSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3730 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 # ifdef FEAT_MOUSE_DEC
6102
3d206df5c828 updated for version 7.4.389
Bram Moolenaar <bram@vim.org>
parents: 6039
diff changeset
3733 /* Conflicts with xterm mouse: "\033[" and "\033[M" */
5932
06c10522d321 updated for version 7.4.307
Bram Moolenaar <bram@vim.org>
parents: 5927
diff changeset
3734 if (!use_xterm_mouse()
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3735 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 )
180
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3739 set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME)
7e70fc748752 updated for version 7.0056
vimboss
parents: 177
diff changeset
3740 ? IF_EB("\233", CSI_STR) : IF_EB("\033[", ESC_STR "[")));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 del_mouse_termcode(KS_DEC_MOUSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3744 # ifdef FEAT_MOUSE_PTERM
6102
3d206df5c828 updated for version 7.4.389
Bram Moolenaar <bram@vim.org>
parents: 6039
diff changeset
3745 /* same conflict as the dec mouse */
5932
06c10522d321 updated for version 7.4.307
Bram Moolenaar <bram@vim.org>
parents: 5927
diff changeset
3746 if (!use_xterm_mouse()
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3747 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3748 && !gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3750 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3751 set_mouse_termcode(KS_PTERM_MOUSE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 (char_u *) IF_EB("\033[", ESC_STR "["));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 del_mouse_termcode(KS_PTERM_MOUSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 # endif
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3756 # ifdef FEAT_MOUSE_URXVT
6102
3d206df5c828 updated for version 7.4.389
Bram Moolenaar <bram@vim.org>
parents: 6039
diff changeset
3757 /* same conflict as the dec mouse */
5932
06c10522d321 updated for version 7.4.307
Bram Moolenaar <bram@vim.org>
parents: 5927
diff changeset
3758 if (use_xterm_mouse() == 3
3145
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3759 # ifdef FEAT_GUI
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3760 && !gui.in_use
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3761 # endif
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3762 )
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3763 {
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3764 set_mouse_termcode(KS_URXVT_MOUSE, (char_u *)(term_is_8bit(T_NAME)
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3765 ? IF_EB("\233", CSI_STR)
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3766 : IF_EB("\033[", ESC_STR "[")));
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3767
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3768 if (*p_mouse != NUL)
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3769 {
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3770 mch_setmouse(FALSE);
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3771 setmouse();
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3772 }
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3773 }
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3774 else
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3775 del_mouse_termcode(KS_URXVT_MOUSE);
98a05814f1b4 updated for version 7.3.343
Bram Moolenaar <bram@vim.org>
parents: 3133
diff changeset
3776 # endif
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3777 # ifdef FEAT_MOUSE_SGR
5905
662ae48e7e24 updated for version 7.4.295
Bram Moolenaar <bram@vim.org>
parents: 5832
diff changeset
3778 /* There is no conflict with xterm mouse */
3746
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3779 if (use_xterm_mouse() == 4
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3780 # ifdef FEAT_GUI
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3781 && !gui.in_use
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3782 # endif
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3783 )
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3784 {
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3785 set_mouse_termcode(KS_SGR_MOUSE, (char_u *)(term_is_8bit(T_NAME)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3786 ? IF_EB("\233<", CSI_STR "<")
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3787 : IF_EB("\033[<", ESC_STR "[<")));
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3788
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3789 if (*p_mouse != NUL)
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3790 {
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3791 mch_setmouse(FALSE);
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3792 setmouse();
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3793 }
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3794 }
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3795 else
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3796 del_mouse_termcode(KS_SGR_MOUSE);
44038a9777aa updated for version 7.3.632
Bram Moolenaar <bram@vim.org>
parents: 3470
diff changeset
3797 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3798 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3799 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3800
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3801 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3802 * set screen mode, always fails.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3803 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3804 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3805 mch_screenmode(char_u *arg UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3806 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3807 EMSG(_(e_screenmode));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3808 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3809 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3810
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3811 #ifndef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3812
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3813 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3814 * Try to get the current window size:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3815 * 1. with an ioctl(), most accurate method
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3816 * 2. from the environment variables LINES and COLUMNS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3817 * 3. from the termcap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3818 * 4. keep using the old values
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3819 * Return OK when size could be determined, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3820 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3821 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3822 mch_get_shellsize(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 long rows = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825 long columns = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3826 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3827
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3828 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3829 * 1. try using an ioctl. It is the most accurate method.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3830 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3831 * Try using TIOCGWINSZ first, some systems that have it also define
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3832 * TIOCGSIZE but don't have a struct ttysize.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3833 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3834 # ifdef TIOCGWINSZ
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3835 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3836 struct winsize ws;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3837 int fd = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3838
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3839 /* When stdout is not a tty, use stdin for the ioctl(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3840 if (!isatty(fd) && isatty(read_cmd_fd))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3841 fd = read_cmd_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3842 if (ioctl(fd, TIOCGWINSZ, &ws) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3844 columns = ws.ws_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3845 rows = ws.ws_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3846 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3847 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3848 # else /* TIOCGWINSZ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3849 # ifdef TIOCGSIZE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3851 struct ttysize ts;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3852 int fd = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3853
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3854 /* When stdout is not a tty, use stdin for the ioctl(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3855 if (!isatty(fd) && isatty(read_cmd_fd))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3856 fd = read_cmd_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3857 if (ioctl(fd, TIOCGSIZE, &ts) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3858 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3859 columns = ts.ts_cols;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3860 rows = ts.ts_lines;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3861 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3863 # endif /* TIOCGSIZE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3864 # endif /* TIOCGWINSZ */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3865
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3866 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3867 * 2. get size from environment
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
3868 * When being POSIX compliant ('|' flag in 'cpoptions') this overrules
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
3869 * the ioctl() values!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3870 */
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
3871 if (columns == 0 || rows == 0 || vim_strchr(p_cpo, CPO_TSIZE) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3873 if ((p = (char_u *)getenv("LINES")))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3874 rows = atoi((char *)p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3875 if ((p = (char_u *)getenv("COLUMNS")))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3876 columns = atoi((char *)p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3877 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3878
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3879 #ifdef HAVE_TGETENT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3880 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3881 * 3. try reading "co" and "li" entries from termcap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3882 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3883 if (columns == 0 || rows == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3884 getlinecol(&columns, &rows);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3885 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3886
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3887 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3888 * 4. If everything fails, use the old values
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3889 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3890 if (columns <= 0 || rows <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3891 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3892
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3893 Rows = rows;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3894 Columns = columns;
5070
cf52d2a8c05c updated for version 7.3.1278
Bram Moolenaar <bram@vim.org>
parents: 5037
diff changeset
3895 limit_screen_size();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3896 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3898
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3899 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3900 * Try to set the window size to Rows and Columns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3901 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3902 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3903 mch_set_shellsize(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3904 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3905 if (*T_CWS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3906 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3907 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3908 * NOTE: if you get an error here that term_set_winsize() is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3909 * undefined, check the output of configure. It could probably not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3910 * find a ncurses, termcap or termlib library.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3911 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3912 term_set_winsize((int)Rows, (int)Columns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3913 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3914 screen_start(); /* don't know where cursor is now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3916 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3917
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3918 #endif /* VMS */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3920 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3921 * Rows and/or Columns has changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3922 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3923 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3924 mch_new_shellsize(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3925 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3926 /* Nothing to do. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3927 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3928
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3929 /*
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3930 * Wait for process "child" to end.
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3931 * Return "child" if it exited properly, <= 0 on error.
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3932 */
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3933 static pid_t
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
3934 wait4pid(pid_t child, waitstatus *status)
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3935 {
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3936 pid_t wait_pid = 0;
10019
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
3937 long delay_msec = 1;
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3938
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3939 while (wait_pid != child)
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3940 {
3470
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3941 /* When compiled with Python threads are probably used, in which case
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3942 * wait() sometimes hangs for no obvious reason. Use waitpid()
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3943 * instead and loop (like the GUI). Also needed for other interfaces,
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3944 * they might call system(). */
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3945 # ifdef __NeXT__
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3946 wait_pid = wait4(child, status, WNOHANG, (struct rusage *)0);
3470
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3947 # else
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3948 wait_pid = waitpid(child, status, WNOHANG);
3470
4a2cb025b641 updated for version 7.3.499
Bram Moolenaar <bram@vim.org>
parents: 3330
diff changeset
3949 # endif
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3950 if (wait_pid == 0)
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3951 {
10019
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
3952 /* Wait for 1 to 10 msec before trying again. */
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
3953 mch_delay(delay_msec, TRUE);
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
3954 if (++delay_msec > 10)
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
3955 delay_msec = 10;
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3956 continue;
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3957 }
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3958 if (wait_pid <= 0
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3959 # ifdef ECHILD
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3960 && errno == ECHILD
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3961 # endif
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3962 )
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3963 break;
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3964 }
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3965 return wait_pid;
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3966 }
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
3967
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
3968 #if defined(FEAT_JOB_CHANNEL) || !defined(USE_SYSTEM) || defined(PROTO)
7999
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
3969 /*
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
3970 * Parse "cmd" and put the white-separated parts in "argv".
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
3971 * "argv" is an allocated array with "argc" entries.
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
3972 * Returns FAIL when out of memory.
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
3973 */
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3974 int
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3975 mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3976 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3977 int i;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3978 char_u *p;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3979 int inquote;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3980
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3981 /*
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3982 * Do this loop twice:
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3983 * 1: find number of arguments
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3984 * 2: separate them and build argv[]
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3985 */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3986 for (i = 0; i < 2; ++i)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3987 {
9009
149d976650a1 commit https://github.com/vim/vim/commit/6231cb8b5b208becf088531816027001acc754e5
Christian Brabandt <cb@256bit.org>
parents: 8958
diff changeset
3988 p = skipwhite(cmd);
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3989 inquote = FALSE;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3990 *argc = 0;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3991 for (;;)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3992 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3993 if (i == 1)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3994 (*argv)[*argc] = (char *)p;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3995 ++*argc;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3996 while (*p != NUL && (inquote || (*p != ' ' && *p != TAB)))
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3997 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3998 if (*p == '"')
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
3999 inquote = !inquote;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4000 ++p;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4001 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4002 if (*p == NUL)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4003 break;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4004 if (i == 1)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4005 *p++ = NUL;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4006 p = skipwhite(p);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4007 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4008 if (*argv == NULL)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4009 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4010 if (use_shcf)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4011 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4012 /* Account for possible multiple args in p_shcf. */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4013 p = p_shcf;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4014 for (;;)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4015 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4016 p = skiptowhite(p);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4017 if (*p == NUL)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4018 break;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4019 ++*argc;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4020 p = skipwhite(p);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4021 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4022 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4023
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4024 *argv = (char **)alloc((unsigned)((*argc + 4) * sizeof(char *)));
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4025 if (*argv == NULL) /* out of memory */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4026 return FAIL;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4027 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4028 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4029 return OK;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4030 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4031 #endif
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4032
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
4033 #if !defined(USE_SYSTEM) || defined(FEAT_JOB_CHANNEL)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4034 static void
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4035 set_child_environment(void)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4036 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4037 # ifdef HAVE_SETENV
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4038 char envbuf[50];
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4039 # else
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4040 static char envbuf_Rows[20];
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4041 static char envbuf_Columns[20];
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4042 # endif
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4043
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4044 /* Simulate to have a dumb terminal (for now) */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4045 # ifdef HAVE_SETENV
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4046 setenv("TERM", "dumb", 1);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4047 sprintf((char *)envbuf, "%ld", Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4048 setenv("ROWS", (char *)envbuf, 1);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4049 sprintf((char *)envbuf, "%ld", Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4050 setenv("LINES", (char *)envbuf, 1);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4051 sprintf((char *)envbuf, "%ld", Columns);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4052 setenv("COLUMNS", (char *)envbuf, 1);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4053 # else
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4054 /*
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4055 * Putenv does not copy the string, it has to remain valid.
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4056 * Use a static array to avoid losing allocated memory.
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4057 */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4058 putenv("TERM=dumb");
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4059 sprintf(envbuf_Rows, "ROWS=%ld", Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4060 putenv(envbuf_Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4061 sprintf(envbuf_Rows, "LINES=%ld", Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4062 putenv(envbuf_Rows);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4063 sprintf(envbuf_Columns, "COLUMNS=%ld", Columns);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4064 putenv(envbuf_Columns);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4065 # endif
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4066 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4067 #endif
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4068
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
4070 mch_call_shell(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
4071 char_u *cmd,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
4072 int options) /* SHELL_*, see vim.h */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075 char *ifn = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 char *ofn = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4078 int tmode = cur_tmode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4079 #ifdef USE_SYSTEM /* use system() to start the shell: simple but slow */
9552
49512aba8e32 commit https://github.com/vim/vim/commit/b2b050ab16565c117f0e7e411ffef3700d99203b
Christian Brabandt <cb@256bit.org>
parents: 9536
diff changeset
4080 char_u *newcmd; /* only needed for unix */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4081
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4082 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4084 if (options & SHELL_COOKED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4085 settmode(TMODE_COOK); /* set to normal mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4087 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
4088 save_clipboard();
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4089 loose_clipboard();
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4090 # endif
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4091
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4092 if (cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4093 x = system((char *)p_sh);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4094 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4095 {
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
4096 # ifdef VMS
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4097 if (ofn = strchr((char *)cmd, '>'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4098 *ofn++ = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4099 if (ifn = strchr((char *)cmd, '<'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4100 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4101 char *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4102
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4103 *ifn++ = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4104 p = strchr(ifn,' '); /* chop off any trailing spaces */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4105 if (p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106 *p = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4107 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4108 if (ofn)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4109 x = vms_sys((char *)cmd, ofn, ifn);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4110 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4111 x = system((char *)cmd);
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
4112 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4113 newcmd = lalloc(STRLEN(p_sh)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4114 + (extra_shell_arg == NULL ? 0 : STRLEN(extra_shell_arg))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4115 + STRLEN(p_shcf) + STRLEN(cmd) + 4, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4116 if (newcmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4117 x = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120 sprintf((char *)newcmd, "%s %s %s %s", p_sh,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 extra_shell_arg == NULL ? "" : (char *)extra_shell_arg,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4122 (char *)p_shcf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 (char *)cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4124 x = system((char *)newcmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125 vim_free(newcmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126 }
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
4127 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4129 # ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4130 x = vms_sys_status(x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4131 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4132 if (emsg_silent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4133 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4134 else if (x == 127)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4135 MSG_PUTS(_("\nCannot execute shell sh\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4136 else if (x && !(options & SHELL_SILENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4138 MSG_PUTS(_("\nshell returned "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4139 msg_outnum((long)x);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4140 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 if (tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144 settmode(TMODE_RAW); /* set to raw mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4145 # ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 resettitle();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 # endif
4209
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
4148 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
4149 restore_clipboard();
fb533fb6c015 updated for version 7.3.856
Bram Moolenaar <bram@vim.org>
parents: 4168
diff changeset
4150 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151 return x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4153 #else /* USE_SYSTEM */ /* don't use system(), use fork()/exec() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4154
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4155 # define EXEC_FAILED 122 /* Exit code when shell didn't execute. Don't use
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4156 127, some shells use that already */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4157
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4158 char_u *newcmd;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4159 pid_t pid;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4160 pid_t wpid = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 pid_t wait_pid = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162 # ifdef HAVE_UNION_WAIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 union wait status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165 int status = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167 int retval = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4168 char **argv = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4169 int argc;
2994
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4170 char_u *p_shcf_copy = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 char_u *p;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4173 int pty_master_fd = -1; /* for pty's */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 int pty_slave_fd = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176 char *tty_name;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4177 # endif
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4178 int fd_toshell[2]; /* for pipes */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 int fd_fromshell[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4180 int pipe_error = FALSE;
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4181 int did_settmode = FALSE; /* settmode(TMODE_RAW) called */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4182
2586
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4183 newcmd = vim_strsave(p_sh);
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4184 if (newcmd == NULL) /* out of memory */
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4185 goto error;
538cd3220874 updated for version 7.3.011
Bram Moolenaar <bram@vim.org>
parents: 2520
diff changeset
4186
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4187 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 if (options & SHELL_COOKED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4189 settmode(TMODE_COOK); /* set to normal mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4191 if (mch_parse_cmd(newcmd, TRUE, &argv, &argc) == FAIL)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4192 goto error;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
4193
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4194 if (cmd != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4195 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3145
diff changeset
4196 char_u *s;
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3145
diff changeset
4197
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4198 if (extra_shell_arg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4199 argv[argc++] = (char *)extra_shell_arg;
2994
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4200
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4201 /* Break 'shellcmdflag' into white separated parts. This doesn't
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4202 * handle quoted strings, they are very unlikely to appear. */
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4203 p_shcf_copy = alloc((unsigned)STRLEN(p_shcf) + 1);
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4204 if (p_shcf_copy == NULL) /* out of memory */
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4205 goto error;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4206 s = p_shcf_copy;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4207 p = p_shcf;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4208 while (*p != NUL)
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4209 {
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4210 argv[argc++] = (char *)s;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4211 while (*p && *p != ' ' && *p != TAB)
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4212 *s++ = *p++;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4213 *s++ = NUL;
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4214 p = skipwhite(p);
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4215 }
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
4216
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217 argv[argc++] = (char *)cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4219 argv[argc] = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4221 /*
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4222 * For the GUI, when writing the output into the buffer and when reading
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4223 * input from the buffer: Try using a pseudo-tty to get the stdin/stdout
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4224 * of the executed command into the Vim window. Or use a pipe.
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4225 */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4226 if ((options & (SHELL_READ|SHELL_WRITE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4227 # ifdef FEAT_GUI
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4228 || (gui.in_use && show_shell_mess)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4229 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4230 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4231 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4232 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4233 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4234 * Try to open a master pty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4235 * If this works, open the slave pty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4236 * If the slave can't be opened, close the master pty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4237 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4238 if (p_guipty && !(options & (SHELL_READ|SHELL_WRITE)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240 pty_master_fd = OpenPTY(&tty_name); /* open pty */
2992
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4241 if (pty_master_fd >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 {
2992
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4243 /* Leaving out O_NOCTTY may lead to waitpid() always returning
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4244 * 0 on Mac OS X 10.7 thereby causing freezes. Let's assume
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4245 * adding O_NOCTTY always works when defined. */
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4246 #ifdef O_NOCTTY
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4247 pty_slave_fd = open(tty_name, O_RDWR | O_NOCTTY | O_EXTRA, 0);
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4248 #else
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4249 pty_slave_fd = open(tty_name, O_RDWR | O_EXTRA, 0);
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4250 #endif
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4251 if (pty_slave_fd < 0)
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4252 {
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4253 close(pty_master_fd);
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4254 pty_master_fd = -1;
ee17ee712512 updated for version 7.3.268
Bram Moolenaar <bram@vim.org>
parents: 2935
diff changeset
4255 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 * If not opening a pty or it didn't work, try using pipes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4260 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4261 if (pty_master_fd < 0)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4262 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4264 pipe_error = (pipe(fd_toshell) < 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4265 if (!pipe_error) /* pipe create OK */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4266 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4267 pipe_error = (pipe(fd_fromshell) < 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4268 if (pipe_error) /* pipe create failed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4269 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4270 close(fd_toshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4271 close(fd_toshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4274 if (pipe_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4275 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4276 MSG_PUTS(_("\nCannot create pipes\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4277 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4278 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4279 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4282 if (!pipe_error) /* pty or pipe opened or not used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4284 # ifdef __BEOS__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4285 beos_cleanup_read_thread();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4286 # endif
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4287
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4288 if ((pid = fork()) == -1) /* maybe we should use vfork() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4289 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4290 MSG_PUTS(_("\nCannot fork\n"));
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4291 if ((options & (SHELL_READ|SHELL_WRITE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 # ifdef FEAT_GUI
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4293 || (gui.in_use && show_shell_mess)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4294 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4295 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4296 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4297 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4298 if (pty_master_fd >= 0) /* close the pseudo tty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4300 close(pty_master_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4301 close(pty_slave_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4302 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4303 else /* close the pipes */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4304 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4305 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4306 close(fd_toshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4307 close(fd_toshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4308 close(fd_fromshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4309 close(fd_fromshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4310 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4312 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4313 else if (pid == 0) /* child */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4315 reset_signals(); /* handle signals normally */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4316
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4317 if (!show_shell_mess || (options & SHELL_EXPAND))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4319 int fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4321 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4322 * Don't want to show any message from the shell. Can't just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4323 * close stdout and stderr though, because some systems will
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4324 * break if you try to write to them after that, so we must
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4325 * use dup() to replace them with something else -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4326 * Connect stdin to /dev/null too, so ":n `cat`" doesn't hang,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4327 * waiting for input.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4328 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4329 fd = open("/dev/null", O_RDWR | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4330 fclose(stdin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4331 fclose(stdout);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4332 fclose(stderr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4333
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4334 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4335 * If any of these open()'s and dup()'s fail, we just continue
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4336 * anyway. It's not fatal, and on most systems it will make
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337 * no difference at all. On a few it will cause the execvp()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4338 * to exit with a non-zero status even when the completion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4339 * could be done, which is nothing too serious. If the open()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 * or dup() failed we'd just do the same thing ourselves
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341 * anyway -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 if (fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4344 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4345 ignored = dup(fd); /* To replace stdin (fd 0) */
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4346 ignored = dup(fd); /* To replace stdout (fd 1) */
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4347 ignored = dup(fd); /* To replace stderr (fd 2) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4349 /* Don't need this now that we've duplicated it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4350 close(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4351 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4352 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4353 else if ((options & (SHELL_READ|SHELL_WRITE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4354 # ifdef FEAT_GUI
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4355 || gui.in_use
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4356 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4357 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4358 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4360 # ifdef HAVE_SETSID
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4361 /* Create our own process group, so that the child and all its
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4362 * children can be kill()ed. Don't do this when using pipes,
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1657
diff changeset
4363 * because stdin is not a tty, we would lose /dev/tty. */
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4364 if (p_stmp)
1799
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4365 {
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4366 (void)setsid();
1799
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4367 # if defined(SIGHUP)
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4368 /* When doing "!xterm&" and 'shell' is bash: the shell
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4369 * will exit and send SIGHUP to all processes in its
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4370 * group, killing the just started process. Ignore SIGHUP
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4371 * to avoid that. (suggested by Simon Schubert)
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4372 */
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4373 signal(SIGHUP, SIG_IGN);
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4374 # endif
acc572c5660c updated for version 7.2-097
vimboss
parents: 1757
diff changeset
4375 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4376 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4377 # ifdef FEAT_GUI
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4378 if (pty_slave_fd >= 0)
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4379 {
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4380 /* push stream discipline modules */
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4381 if (options & SHELL_COOKED)
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4382 SetupSlavePTY(pty_slave_fd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4383 # ifdef TIOCSCTTY
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4384 /* Try to become controlling tty (probably doesn't work,
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4385 * unless run by root) */
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4386 ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4387 # endif
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4388 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4389 # endif
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
4390 set_child_environment();
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4391
557
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4392 /*
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4393 * stderr is only redirected when using the GUI, so that a
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4394 * program like gpg can still access the terminal to get a
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4395 * passphrase using stderr.
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4396 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4397 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4398 if (pty_master_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4400 close(pty_master_fd); /* close master side of pty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4401
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4402 /* set up stdin/stdout/stderr for the child */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4403 close(0);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4404 ignored = dup(pty_slave_fd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4405 close(1);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4406 ignored = dup(pty_slave_fd);
557
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4407 if (gui.in_use)
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4408 {
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4409 close(2);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4410 ignored = dup(pty_slave_fd);
557
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4411 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4413 close(pty_slave_fd); /* has been dupped, close it now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4414 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4415 else
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4416 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4417 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4418 /* set up stdin for the child */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4419 close(fd_toshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4420 close(0);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4421 ignored = dup(fd_toshell[0]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4422 close(fd_toshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4423
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4424 /* set up stdout for the child */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4425 close(fd_fromshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4426 close(1);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4427 ignored = dup(fd_fromshell[1]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4428 close(fd_fromshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4429
557
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4430 # ifdef FEAT_GUI
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4431 if (gui.in_use)
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4432 {
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4433 /* set up stderr for the child */
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4434 close(2);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4435 ignored = dup(1);
557
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4436 }
862863033fdd updated for version 7.0158
vimboss
parents: 509
diff changeset
4437 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4438 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4439 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4440
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4441 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4442 * There is no type cast for the argv, because the type may be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4443 * different on different machines. This may cause a warning
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4444 * message with strict compilers, don't worry about it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4445 * Call _exit() instead of exit() to avoid closing the connection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4446 * to the X server (esp. with GTK, which uses atexit()).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4447 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4448 execvp(argv[0], argv);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4449 _exit(EXEC_FAILED); /* exec failed, return failure code */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4451 else /* parent */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4452 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4453 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4454 * While child is running, ignore terminating signals.
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4455 * Do catch CTRL-C, so that "got_int" is set.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4456 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4457 catch_signals(SIG_IGN, SIG_ERR);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4458 catch_int_signal();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4460 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4461 * For the GUI we redirect stdin, stdout and stderr to our window.
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4462 * This is also used to pipe stdin/stdout to/from the external
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4463 * command.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4464 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4465 if ((options & (SHELL_READ|SHELL_WRITE))
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4466 # ifdef FEAT_GUI
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4467 || (gui.in_use && show_shell_mess)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4468 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4469 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4470 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4471 # define BUFLEN 100 /* length for buffer, pseudo tty limit is 128 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4472 char_u buffer[BUFLEN + 1];
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4473 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4474 int buffer_off = 0; /* valid bytes in buffer[] */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4475 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4476 char_u ta_buf[BUFLEN + 1]; /* TypeAHead */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4477 int ta_len = 0; /* valid bytes in ta_buf[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4478 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4479 int p_more_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4480 int old_State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4481 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4482 int toshell_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4483 int fromshell_fd;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4484 garray_T ga;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4485 int noread_cnt;
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4486 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4487 struct timeval start_tv;
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4488 # endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4489
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4490 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4491 if (pty_master_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4493 fromshell_fd = pty_master_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4494 toshell_fd = dup(pty_master_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4495 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4496 else
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4497 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4498 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4499 close(fd_toshell[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4500 close(fd_fromshell[1]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4501 toshell_fd = fd_toshell[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4502 fromshell_fd = fd_fromshell[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4503 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4504
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4505 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4506 * Write to the child if there are typed characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4507 * Read from the child if there are characters available.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4508 * Repeat the reading a few times if more characters are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4509 * available. Need to check for typed keys now and then, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4510 * not too often (delays when no chars are available).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4511 * This loop is quit if no characters can be read from the pty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4512 * (WaitForChar detected special condition), or there are no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4513 * characters available and the child has exited.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4514 * Only check if the child has exited when there is no more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4515 * output. The child may exit before all the output has
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4516 * been printed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4517 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4518 * Currently this busy loops!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4519 * This can probably dead-lock when the write blocks!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4520 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4521 p_more_save = p_more;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4522 p_more = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4523 old_State = State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4524 State = EXTERNCMD; /* don't redraw at window resize */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4525
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4526 if ((options & SHELL_WRITE) && toshell_fd >= 0)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4527 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4528 /* Fork a process that will write the lines to the
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4529 * external program. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4530 if ((wpid = fork()) == -1)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4531 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4532 MSG_PUTS(_("\nCannot fork\n"));
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4533 }
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4534 else if (wpid == 0) /* child */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4535 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4536 linenr_T lnum = curbuf->b_op_start.lnum;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4537 int written = 0;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 902
diff changeset
4538 char_u *lp = ml_get(lnum);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4539 size_t l;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4540
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 167
diff changeset
4541 close(fromshell_fd);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4542 for (;;)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4543 {
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 902
diff changeset
4544 l = STRLEN(lp + written);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4545 if (l == 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4546 len = 0;
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 902
diff changeset
4547 else if (lp[written] == NL)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4548 /* NL -> NUL translation */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4549 len = write(toshell_fd, "", (size_t)1);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4550 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4551 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3145
diff changeset
4552 char_u *s = vim_strchr(lp + written, NL);
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3145
diff changeset
4553
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 902
diff changeset
4554 len = write(toshell_fd, (char *)lp + written,
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1869
diff changeset
4555 s == NULL ? l
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1869
diff changeset
4556 : (size_t)(s - (lp + written)));
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4557 }
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1869
diff changeset
4558 if (len == (int)l)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4559 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4560 /* Finished a line, add a NL, unless this line
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4561 * should not have one. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4562 if (lnum != curbuf->b_op_end.lnum
6933
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
4563 || (!curbuf->b_p_bin
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
4564 && curbuf->b_p_fixeol)
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2701
diff changeset
4565 || (lnum != curbuf->b_no_eol_lnum
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4566 && (lnum !=
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4567 curbuf->b_ml.ml_line_count
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4568 || curbuf->b_p_eol)))
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4569 ignored = write(toshell_fd, "\n",
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1739
diff changeset
4570 (size_t)1);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4571 ++lnum;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4572 if (lnum > curbuf->b_op_end.lnum)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4573 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4574 /* finished all the lines, close pipe */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4575 close(toshell_fd);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4576 toshell_fd = -1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4577 break;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4578 }
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 902
diff changeset
4579 lp = ml_get(lnum);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4580 written = 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4581 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4582 else if (len > 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4583 written += len;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4584 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4585 _exit(0);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4586 }
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4587 else /* parent */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4588 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4589 close(toshell_fd);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4590 toshell_fd = -1;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4591 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4592 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4593
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4594 if (options & SHELL_READ)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4595 ga_init2(&ga, 1, BUFLEN);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4596
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4597 noread_cnt = 0;
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4598 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4599 gettimeofday(&start_tv, NULL);
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4600 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4601 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4602 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4603 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4604 * Check if keys have been typed, write them to the child
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4605 * if there are any.
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4606 * Don't do this if we are expanding wild cards (would eat
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4607 * typeahead).
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4608 * Don't do this when filtering and terminal is in cooked
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4609 * mode, the shell command will handle the I/O. Avoids
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4610 * that a typed password is echoed for ssh or gpg command.
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4611 * Don't get characters when the child has already
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4612 * finished (wait_pid == 0).
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4613 * Don't read characters unless we didn't get output for a
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4614 * while (noread_cnt > 4), avoids that ":r !ls" eats
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4615 * typeahead.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4616 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4617 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4618 if (!(options & SHELL_EXPAND)
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4619 && ((options &
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4620 (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4621 != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4622 # ifdef FEAT_GUI
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4623 || gui.in_use
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4624 # endif
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 585
diff changeset
4625 )
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4626 && wait_pid == 0
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4627 && (ta_len > 0 || noread_cnt > 4))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628 {
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4629 if (ta_len == 0)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4630 {
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4631 /* Get extra characters when we don't have any.
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4632 * Reset the counter and timer. */
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4633 noread_cnt = 0;
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4634 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4635 gettimeofday(&start_tv, NULL);
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4636 # endif
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4637 len = ui_inchar(ta_buf, BUFLEN, 10L, 0);
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4638 }
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4639 if (ta_len > 0 || len > 0)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4640 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4641 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4642 * For pipes:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4643 * Check for CTRL-C: send interrupt signal to child.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4644 * Check for CTRL-D: EOF, close pipe to child.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4645 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4646 if (len == 1 && (pty_master_fd < 0 || cmd != NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4647 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4648 # ifdef SIGINT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4649 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4650 * Send SIGINT to the child's group or all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4651 * processes in our group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4652 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4653 if (ta_buf[ta_len] == Ctrl_C
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4654 || ta_buf[ta_len] == intr_char)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4655 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4656 # ifdef HAVE_SETSID
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4657 kill(-pid, SIGINT);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4658 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4659 kill(0, SIGINT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4660 # endif
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4661 if (wpid > 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4662 kill(wpid, SIGINT);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4663 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4664 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4665 if (pty_master_fd < 0 && toshell_fd >= 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4666 && ta_buf[ta_len] == Ctrl_D)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4667 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4668 close(toshell_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4669 toshell_fd = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4670 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4671 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4673 /* replace K_BS by <BS> and K_DEL by <DEL> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4674 for (i = ta_len; i < ta_len + len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4675 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4676 if (ta_buf[i] == CSI && len - i > 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4677 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4678 c = TERMCAP2KEY(ta_buf[i + 1], ta_buf[i + 2]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4679 if (c == K_DEL || c == K_KDEL || c == K_BS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4680 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4681 mch_memmove(ta_buf + i + 1, ta_buf + i + 3,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4682 (size_t)(len - i - 2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4683 if (c == K_DEL || c == K_KDEL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4684 ta_buf[i] = DEL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4685 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4686 ta_buf[i] = Ctrl_H;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4687 len -= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4688 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4689 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4690 else if (ta_buf[i] == '\r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4691 ta_buf[i] = '\n';
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4692 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4693 if (has_mbyte)
1903
4c02214d1465 updated for version 7.2-200
vimboss
parents: 1883
diff changeset
4694 i += (*mb_ptr2len_len)(ta_buf + i,
4c02214d1465 updated for version 7.2-200
vimboss
parents: 1883
diff changeset
4695 ta_len + len - i) - 1;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4696 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4697 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4698
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4699 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4700 * For pipes: echo the typed characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4701 * For a pty this does not seem to work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4702 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4703 if (pty_master_fd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4704 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4705 for (i = ta_len; i < ta_len + len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4706 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4707 if (ta_buf[i] == '\n' || ta_buf[i] == '\b')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4708 msg_putchar(ta_buf[i]);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4709 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4710 else if (has_mbyte)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4711 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 444
diff changeset
4712 int l = (*mb_ptr2len)(ta_buf + i);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4714 msg_outtrans_len(ta_buf + i, l);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4715 i += l - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4716 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4717 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4718 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4719 msg_outtrans_len(ta_buf + i, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4720 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4721 windgoto(msg_row, msg_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4722 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4723 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4725 ta_len += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4726
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4727 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4728 * Write the characters to the child, unless EOF has
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4729 * been typed for pipes. Write one character at a
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1657
diff changeset
4730 * time, to avoid losing too much typeahead.
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4731 * When writing buffer lines, drop the typed
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4732 * characters (only check for CTRL-C).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4733 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4734 if (options & SHELL_WRITE)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4735 ta_len = 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4736 else if (toshell_fd >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4737 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4738 len = write(toshell_fd, (char *)ta_buf, (size_t)1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4739 if (len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4740 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4741 ta_len -= len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4742 mch_memmove(ta_buf, ta_buf + len, ta_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4743 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4744 }
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4745 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4746 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4747
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4748 if (got_int)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4749 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4750 /* CTRL-C sends a signal to the child, we ignore it
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4751 * ourselves */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4752 # ifdef HAVE_SETSID
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4753 kill(-pid, SIGINT);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4754 # else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4755 kill(0, SIGINT);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4756 # endif
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4757 if (wpid > 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4758 kill(wpid, SIGINT);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4759 got_int = FALSE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4760 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4761
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4762 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4763 * Check if the child has any characters to be printed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4764 * Read them and write them to our window. Repeat this as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4765 * long as there is something to do, avoid the 10ms wait
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4766 * for mch_inchar(), or sending typeahead characters to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4767 * the external process.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4768 * TODO: This should handle escape sequences, compatible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4769 * to some terminal (vt52?).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4770 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4771 ++noread_cnt;
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
4772 while (RealWaitForChar(fromshell_fd, 10L, NULL, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4773 {
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2609
diff changeset
4774 len = read_eintr(fromshell_fd, buffer
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4775 # ifdef FEAT_MBYTE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4776 + buffer_off, (size_t)(BUFLEN - buffer_off)
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4777 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4778 , (size_t)BUFLEN
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4779 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4780 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4781 if (len <= 0) /* end of file or error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4782 goto finished;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4783
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4784 noread_cnt = 0;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4785 if (options & SHELL_READ)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4786 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4787 /* Do NUL -> NL translation, append NL separated
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4788 * lines to the current buffer. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4789 for (i = 0; i < len; ++i)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4790 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4791 if (buffer[i] == NL)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4792 append_ga_line(&ga);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4793 else if (buffer[i] == NUL)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4794 ga_append(&ga, NL);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4795 else
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4796 ga_append(&ga, buffer[i]);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4797 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4798 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4799 # ifdef FEAT_MBYTE
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4800 else if (has_mbyte)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4801 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4802 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4803
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4804 len += buffer_off;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4805 buffer[len] = NUL;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4806
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4807 /* Check if the last character in buffer[] is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4808 * incomplete, keep these bytes for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4809 * round. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4810 for (p = buffer; p < buffer + len; p += l)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4811 {
9898
bff8a09016a5 commit https://github.com/vim/vim/commit/d3c907b5d2b352482b580a0cf687cbbea4c19ea1
Christian Brabandt <cb@256bit.org>
parents: 9873
diff changeset
4812 l = MB_CPTR2LEN(p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4813 if (l == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4814 l = 1; /* NUL byte? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4815 else if (MB_BYTE2LEN(*p) != l)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4816 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4817 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4818 if (p == buffer) /* no complete character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4819 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4820 /* avoid getting stuck at an illegal byte */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4821 if (len >= 12)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4822 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4823 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4824 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4825 buffer_off = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4826 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4828 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4829 c = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4830 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4831 msg_puts(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 if (p < buffer + len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4833 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4834 *p = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4835 buffer_off = (buffer + len) - p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4836 mch_memmove(buffer, p, buffer_off);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4837 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4838 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4839 buffer_off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4840 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4841 # endif /* FEAT_MBYTE */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4842 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4844 buffer[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 msg_puts(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4846 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 windgoto(msg_row, msg_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 cursor_on();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4850 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4851 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 break;
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4853
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4854 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
8845
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4855 if (wait_pid == 0)
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4856 {
9207
61e669c5da6f commit https://github.com/vim/vim/commit/e30a3d01dc1b6b066748b1d61cced05cf92b3c80
Christian Brabandt <cb@256bit.org>
parents: 9205
diff changeset
4857 long msec = elapsed(&start_tv);
1823
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4858
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4859 /* Avoid that we keep looping here without
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4860 * checking for a CTRL-C for a long time. Don't
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4861 * break out too often to avoid losing typeahead. */
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4862 if (msec > 2000)
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4863 {
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4864 noread_cnt = 5;
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4865 break;
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4866 }
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4867 }
134c7695af32 updated for version 7.2-121
vimboss
parents: 1799
diff changeset
4868 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870
8845
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4871 /* If we already detected the child has finished, continue
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4872 * reading output for a short while. Some text may be
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4873 * buffered. */
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4874 if (wait_pid == pid)
8845
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4875 {
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4876 if (noread_cnt < 5)
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4877 continue;
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4878 break;
8845
210e767296d9 commit https://github.com/vim/vim/commit/17fe5e1aecbeff5ca4b2a821ede9badd5dddae59
Christian Brabandt <cb@256bit.org>
parents: 8761
diff changeset
4879 }
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4880
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4882 * Check if the child still exists, before checking for
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1657
diff changeset
4883 * typed characters (otherwise we would lose typeahead).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884 */
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4885 # ifdef __NeXT__
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4886 wait_pid = wait4(pid, &status, WNOHANG, (struct rusage *)0);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4887 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 wait_pid = waitpid(pid, &status, WNOHANG);
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4889 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 if ((wait_pid == (pid_t)-1 && errno == ECHILD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4891 || (wait_pid == pid && WIFEXITED(status)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4892 {
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4893 /* Don't break the loop yet, try reading more
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4894 * characters from "fromshell_fd" first. When using
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4895 * pipes there might still be something to read and
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4896 * then we'll break the loop at the "break" above. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4897 wait_pid = pid;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4898 }
602
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4899 else
111509d2767a updated for version 7.0171
vimboss
parents: 592
diff changeset
4900 wait_pid = 0;
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4901
4248
beab15a2ef14 updated for version 7.3.875
Bram Moolenaar <bram@vim.org>
parents: 4230
diff changeset
4902 # if defined(FEAT_XCLIPBOARD) && defined(FEAT_X11)
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4903 /* Handle any X events, e.g. serving the clipboard. */
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4904 clip_update();
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4905 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 finished:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 p_more = p_more_save;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4909 if (options & SHELL_READ)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4910 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4911 if (ga.ga_len > 0)
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4912 {
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4913 append_ga_line(&ga);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4914 /* remember that the NL was missing */
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2701
diff changeset
4915 curbuf->b_no_eol_lnum = curwin->w_cursor.lnum;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4916 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4917 else
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2701
diff changeset
4918 curbuf->b_no_eol_lnum = 0;
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4919 ga_clear(&ga);
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4920 }
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4921
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4923 * Give all typeahead that wasn't used back to ui_inchar().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4925 if (ta_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4926 ui_inchar_undo(ta_buf, ta_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4927 State = old_State;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 if (toshell_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929 close(toshell_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 close(fromshell_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 }
4248
beab15a2ef14 updated for version 7.3.875
Bram Moolenaar <bram@vim.org>
parents: 4230
diff changeset
4932 # if defined(FEAT_XCLIPBOARD) && defined(FEAT_X11)
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4933 else
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4934 {
10019
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4935 long delay_msec = 1;
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4936
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4937 /*
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4938 * Similar to the loop above, but only handle X events, no
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4939 * I/O.
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4940 */
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4941 for (;;)
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4942 {
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4943 if (got_int)
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4944 {
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4945 /* CTRL-C sends a signal to the child, we ignore it
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4946 * ourselves */
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4947 # ifdef HAVE_SETSID
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4948 kill(-pid, SIGINT);
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4949 # else
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4950 kill(0, SIGINT);
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4951 # endif
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4952 got_int = FALSE;
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4953 }
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4954 # ifdef __NeXT__
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4955 wait_pid = wait4(pid, &status, WNOHANG, (struct rusage *)0);
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4956 # else
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4957 wait_pid = waitpid(pid, &status, WNOHANG);
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4958 # endif
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4959 if ((wait_pid == (pid_t)-1 && errno == ECHILD)
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4960 || (wait_pid == pid && WIFEXITED(status)))
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4961 {
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4962 wait_pid = pid;
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4963 break;
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4964 }
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4965
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4966 /* Handle any X events, e.g. serving the clipboard. */
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4967 clip_update();
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4968
10019
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4969 /* Wait for 1 to 10 msec. 1 is faster but gives the child
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4970 * less time. */
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4971 mch_delay(delay_msec, TRUE);
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4972 if (++delay_msec > 10)
782a8070c3a6 commit https://github.com/vim/vim/commit/0abe0522d0e52b50c6eab52323be558eb56fe95e
Christian Brabandt <cb@256bit.org>
parents: 9898
diff changeset
4973 delay_msec = 10;
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4974 }
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4975 }
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
4976 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 * Wait until our child has exited.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 * Ignore wait() returning pids of other children and returning
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4981 * because of some signal like SIGWINCH.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4982 * Don't wait if wait_pid was already set above, indicating the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 * child already exited.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984 */
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4985 if (wait_pid != pid)
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4986 wait_pid = wait4pid(pid, &status);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4987
2600
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4988 # ifdef FEAT_GUI
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4989 /* Close slave side of pty. Only do this after the child has
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4990 * exited, otherwise the child may hang when it tries to write on
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4991 * the pty. */
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4992 if (pty_master_fd >= 0)
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4993 close(pty_slave_fd);
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4994 # endif
d982226b7aaa updated for version 7.3.023
Bram Moolenaar <bram@vim.org>
parents: 2586
diff changeset
4995
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4996 /* Make sure the child that writes to the external program is
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4997 * dead. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
4998 if (wpid > 0)
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
4999 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
5000 kill(wpid, SIGKILL);
3048
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
5001 wait4pid(wpid, NULL);
c19c15a9e9bf updated for version 7.3.296
Bram Moolenaar <bram@vim.org>
parents: 3046
diff changeset
5002 }
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
5003
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5004 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5005 * Set to raw mode right now, otherwise a CTRL-C after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5006 * catch_signals() will kill Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5007 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5008 if (tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5009 settmode(TMODE_RAW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5010 did_settmode = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5011 set_signals();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5012
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5013 if (WIFEXITED(status))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5014 {
129
2983cde45542 updated for version 7.0044
vimboss
parents: 107
diff changeset
5015 /* LINTED avoid "bitwise operation on signed value" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5016 retval = WEXITSTATUS(status);
4074
16e8a09e8ab0 updated for version 7.3.791
Bram Moolenaar <bram@vim.org>
parents: 3867
diff changeset
5017 if (retval != 0 && !emsg_silent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5019 if (retval == EXEC_FAILED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5020 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5021 MSG_PUTS(_("\nCannot execute shell "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5022 msg_outtrans(p_sh);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5023 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5024 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5025 else if (!(options & SHELL_SILENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5026 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5027 MSG_PUTS(_("\nshell returned "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 msg_outnum((long)retval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5032 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5034 MSG_PUTS(_("\nCommand terminated\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5037 vim_free(argv);
2994
7f4f5ca70dbd updated for version 7.3.269
Bram Moolenaar <bram@vim.org>
parents: 2992
diff changeset
5038 vim_free(p_shcf_copy);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5039
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5040 error:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5041 if (!did_settmode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5042 if (tmode == TMODE_RAW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5043 settmode(TMODE_RAW); /* set to raw mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5044 # ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5045 resettitle();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5046 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5047 vim_free(newcmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5048
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5049 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5050
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5051 #endif /* USE_SYSTEM */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5052 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5053
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5054 #if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5055 void
8408
2f1a63269250 commit https://github.com/vim/vim/commit/802d559431e6003a46c7f19628213b7cec8ba6d0
Christian Brabandt <cb@256bit.org>
parents: 8386
diff changeset
5056 mch_start_job(char **argv, job_T *job, jobopt_T *options UNUSED)
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5057 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5058 pid_t pid;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5059 int fd_in[2]; /* for stdin */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5060 int fd_out[2]; /* for stdout */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5061 int fd_err[2]; /* for stderr */
8049
15253130abd8 commit https://github.com/vim/vim/commit/16eb4f88000cfdba68df6c421fe44e7e029ba53e
Christian Brabandt <cb@256bit.org>
parents: 8047
diff changeset
5062 channel_T *channel = NULL;
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5063 int use_null_for_in = options->jo_io[PART_IN] == JIO_NULL;
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5064 int use_null_for_out = options->jo_io[PART_OUT] == JIO_NULL;
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5065 int use_null_for_err = options->jo_io[PART_ERR] == JIO_NULL;
8430
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5066 int use_file_for_in = options->jo_io[PART_IN] == JIO_FILE;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5067 int use_file_for_out = options->jo_io[PART_OUT] == JIO_FILE;
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5068 int use_file_for_err = options->jo_io[PART_ERR] == JIO_FILE;
8384
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5069 int use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5070
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5071 if (use_out_for_err && use_null_for_out)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5072 use_null_for_err = TRUE;
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5073
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5074 /* default is to fail */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5075 job->jv_status = JOB_FAILED;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5076 fd_in[0] = -1;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5077 fd_in[1] = -1;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5078 fd_out[0] = -1;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5079 fd_out[1] = -1;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5080 fd_err[0] = -1;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5081 fd_err[1] = -1;
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5082
8068
9c6740f2204f commit https://github.com/vim/vim/commit/12dcf024e90ab511f04a08b20fe7eedbe92096d2
Christian Brabandt <cb@256bit.org>
parents: 8049
diff changeset
5083 /* TODO: without the channel feature connect the child to /dev/null? */
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5084 /* Open pipes for stdin, stdout, stderr. */
8430
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5085 if (use_file_for_in)
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5086 {
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5087 char_u *fname = options->jo_io_name[PART_IN];
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5088
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5089 fd_in[0] = mch_open((char *)fname, O_RDONLY, 0);
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5090 if (fd_in[0] < 0)
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5091 {
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5092 EMSG2(_(e_notopen), fname);
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5093 goto failed;
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5094 }
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5095 }
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5096 else if (!use_null_for_in && pipe(fd_in) < 0)
8430
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5097 goto failed;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5098
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5099 if (use_file_for_out)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5100 {
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5101 char_u *fname = options->jo_io_name[PART_OUT];
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5102
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5103 fd_out[1] = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0644);
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5104 if (fd_out[1] < 0)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5105 {
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5106 EMSG2(_(e_notopen), fname);
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5107 goto failed;
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5108 }
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5109 }
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5110 else if (!use_null_for_out && pipe(fd_out) < 0)
8430
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5111 goto failed;
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5112
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5113 if (use_file_for_err)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5114 {
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5115 char_u *fname = options->jo_io_name[PART_ERR];
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5116
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5117 fd_err[1] = mch_open((char *)fname, O_WRONLY | O_CREAT | O_TRUNC, 0600);
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5118 if (fd_err[1] < 0)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5119 {
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5120 EMSG2(_(e_notopen), fname);
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5121 goto failed;
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5122 }
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5123 }
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5124 else if (!use_out_for_err && !use_null_for_err && pipe(fd_err) < 0)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5125 goto failed;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5126
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5127 if (!use_null_for_in || !use_null_for_out || !use_null_for_err)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5128 {
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5129 if (options->jo_set & JO_CHANNEL)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5130 {
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5131 channel = options->jo_channel;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5132 if (channel != NULL)
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5133 ++channel->ch_refcount;
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5134 }
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5135 else
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5136 channel = add_channel();
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5137 if (channel == NULL)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5138 goto failed;
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5139 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5140
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5141 pid = fork(); /* maybe we should use vfork() */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5142 if (pid == -1)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5143 {
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5144 /* failed to fork */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5145 goto failed;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5146 }
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5147
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5148 if (pid == 0)
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5149 {
8958
12392eb2923a commit https://github.com/vim/vim/commit/4694a17d1ec08382f996990a7fac1ac60197ec81
Christian Brabandt <cb@256bit.org>
parents: 8947
diff changeset
5150 int null_fd = -1;
12392eb2923a commit https://github.com/vim/vim/commit/4694a17d1ec08382f996990a7fac1ac60197ec81
Christian Brabandt <cb@256bit.org>
parents: 8947
diff changeset
5151 int stderr_works = TRUE;
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5152
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5153 /* child */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5154 reset_signals(); /* handle signals normally */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5155
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5156 # ifdef HAVE_SETSID
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5157 /* Create our own process group, so that the child and all its
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5158 * children can be kill()ed. Don't do this when using pipes,
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5159 * because stdin is not a tty, we would lose /dev/tty. */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5160 (void)setsid();
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5161 # endif
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5162
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5163 set_child_environment();
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5164
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5165 if (use_null_for_in || use_null_for_out || use_null_for_err)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5166 null_fd = open("/dev/null", O_RDWR | O_EXTRA, 0);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5167
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5168 /* set up stdin for the child */
8611
f12689430f4b commit https://github.com/vim/vim/commit/c0a1d7f3ad4d41b64c6c881bb8ad7c201f8439a3
Christian Brabandt <cb@256bit.org>
parents: 8609
diff changeset
5169 if (use_null_for_in && null_fd >= 0)
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5170 {
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5171 close(0);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5172 ignored = dup(null_fd);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5173 }
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5174 else
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5175 {
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5176 if (!use_file_for_in)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5177 close(fd_in[1]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5178 close(0);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5179 ignored = dup(fd_in[0]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5180 close(fd_in[0]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5181 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5182
8384
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5183 /* set up stderr for the child */
8611
f12689430f4b commit https://github.com/vim/vim/commit/c0a1d7f3ad4d41b64c6c881bb8ad7c201f8439a3
Christian Brabandt <cb@256bit.org>
parents: 8609
diff changeset
5184 if (use_null_for_err && null_fd >= 0)
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5185 {
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5186 close(2);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5187 ignored = dup(null_fd);
8958
12392eb2923a commit https://github.com/vim/vim/commit/4694a17d1ec08382f996990a7fac1ac60197ec81
Christian Brabandt <cb@256bit.org>
parents: 8947
diff changeset
5188 stderr_works = FALSE;
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5189 }
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5190 else if (use_out_for_err)
8384
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5191 {
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5192 close(2);
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5193 ignored = dup(fd_out[1]);
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5194 }
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5195 else
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5196 {
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5197 if (!use_file_for_err)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5198 close(fd_err[0]);
8384
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5199 close(2);
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5200 ignored = dup(fd_err[1]);
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5201 close(fd_err[1]);
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5202 }
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5203
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5204 /* set up stdout for the child */
8611
f12689430f4b commit https://github.com/vim/vim/commit/c0a1d7f3ad4d41b64c6c881bb8ad7c201f8439a3
Christian Brabandt <cb@256bit.org>
parents: 8609
diff changeset
5205 if (use_null_for_out && null_fd >= 0)
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5206 {
9074
3aab62b76363 commit https://github.com/vim/vim/commit/ea83bf06b92baeb6d68a10d8e8ffad289d31dae2
Christian Brabandt <cb@256bit.org>
parents: 9009
diff changeset
5207 close(1);
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5208 ignored = dup(null_fd);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5209 }
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5210 else
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5211 {
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5212 if (!use_file_for_out)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5213 close(fd_out[0]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5214 close(1);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5215 ignored = dup(fd_out[1]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5216 close(fd_out[1]);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5217 }
9074
3aab62b76363 commit https://github.com/vim/vim/commit/ea83bf06b92baeb6d68a10d8e8ffad289d31dae2
Christian Brabandt <cb@256bit.org>
parents: 9009
diff changeset
5218
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5219 if (null_fd >= 0)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5220 close(null_fd);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5221
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5222 /* See above for type of argv. */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5223 execvp(argv[0], argv);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5224
8958
12392eb2923a commit https://github.com/vim/vim/commit/4694a17d1ec08382f996990a7fac1ac60197ec81
Christian Brabandt <cb@256bit.org>
parents: 8947
diff changeset
5225 if (stderr_works)
12392eb2923a commit https://github.com/vim/vim/commit/4694a17d1ec08382f996990a7fac1ac60197ec81
Christian Brabandt <cb@256bit.org>
parents: 8947
diff changeset
5226 perror("executing job failed");
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5227 #ifdef EXITFREE
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5228 /* calling free_all_mem() here causes problems. Ignore valgrind
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5229 * reporting possibly leaked memory. */
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5230 #endif
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5231 _exit(EXEC_FAILED); /* exec failed, return failure code */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5232 }
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5233
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5234 /* parent */
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5235 job->jv_pid = pid;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5236 job->jv_status = JOB_STARTED;
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5237 job->jv_channel = channel; /* ch_refcount was set above */
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5238
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5239 /* child stdin, stdout and stderr */
8671
8f6bc5626829 commit https://github.com/vim/vim/commit/be6aa46c4d8948e164f7d181dc19ed2fc4818395
Christian Brabandt <cb@256bit.org>
parents: 8611
diff changeset
5240 if (!use_file_for_in && fd_in[0] >= 0)
8430
800423dbc260 commit https://github.com/vim/vim/commit/b69fccf377f43544b86817b0de6cc1498a4ff9ec
Christian Brabandt <cb@256bit.org>
parents: 8408
diff changeset
5241 close(fd_in[0]);
8671
8f6bc5626829 commit https://github.com/vim/vim/commit/be6aa46c4d8948e164f7d181dc19ed2fc4818395
Christian Brabandt <cb@256bit.org>
parents: 8611
diff changeset
5242 if (!use_file_for_out && fd_out[1] >= 0)
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5243 close(fd_out[1]);
8671
8f6bc5626829 commit https://github.com/vim/vim/commit/be6aa46c4d8948e164f7d181dc19ed2fc4818395
Christian Brabandt <cb@256bit.org>
parents: 8611
diff changeset
5244 if (!use_out_for_err && !use_file_for_err && fd_err[1] >= 0)
8384
764dba33605c commit https://github.com/vim/vim/commit/c25558bff4ed10d2642e6f5c016701641c494916
Christian Brabandt <cb@256bit.org>
parents: 8360
diff changeset
5245 close(fd_err[1]);
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5246 if (channel != NULL)
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5247 {
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5248 channel_set_pipes(channel,
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5249 use_file_for_in || use_null_for_in
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5250 ? INVALID_FD : fd_in[1],
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5251 use_file_for_out || use_null_for_out
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5252 ? INVALID_FD : fd_out[0],
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5253 use_out_for_err || use_file_for_err || use_null_for_err
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5254 ? INVALID_FD : fd_err[0]);
8455
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5255 channel_set_job(channel, job, options);
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5256 }
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5257
d0717262d802 commit https://github.com/vim/vim/commit/f65333c9b59654a70f2a07200f65c93dfcaa49b3
Christian Brabandt <cb@256bit.org>
parents: 8447
diff changeset
5258 /* success! */
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5259 return;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5260
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5261 failed:
8491
daebcbd87bd3 commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Christian Brabandt <cb@256bit.org>
parents: 8455
diff changeset
5262 channel_unref(channel);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5263 if (fd_in[0] >= 0)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5264 close(fd_in[0]);
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5265 if (fd_in[1] >= 0)
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5266 close(fd_in[1]);
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5267 if (fd_out[0] >= 0)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5268 close(fd_out[0]);
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5269 if (fd_out[1] >= 0)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5270 close(fd_out[1]);
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5271 if (fd_err[0] >= 0)
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5272 close(fd_err[0]);
8447
6f26b680c243 commit https://github.com/vim/vim/commit/e98d12105213975f37b8d653bd909bd787a2cda9
Christian Brabandt <cb@256bit.org>
parents: 8430
diff changeset
5273 if (fd_err[1] >= 0)
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5274 close(fd_err[1]);
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5275 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5276
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5277 char *
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5278 mch_job_status(job_T *job)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5279 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5280 # ifdef HAVE_UNION_WAIT
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5281 union wait status;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5282 # else
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5283 int status = -1;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5284 # endif
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5285 pid_t wait_pid = 0;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5286
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5287 # ifdef __NeXT__
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5288 wait_pid = wait4(job->jv_pid, &status, WNOHANG, (struct rusage *)0);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5289 # else
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5290 wait_pid = waitpid(job->jv_pid, &status, WNOHANG);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5291 # endif
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5292 if (wait_pid == -1)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5293 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5294 /* process must have exited */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5295 job->jv_status = JOB_ENDED;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5296 return "dead";
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5297 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5298 if (wait_pid == 0)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5299 return "run";
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5300 if (WIFEXITED(status))
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5301 {
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5302 /* LINTED avoid "bitwise operation on signed value" */
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5303 job->jv_exitval = WEXITSTATUS(status);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5304 job->jv_status = JOB_ENDED;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5305 return "dead";
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5306 }
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5307 if (WIFSIGNALED(status))
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5308 {
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5309 job->jv_exitval = -1;
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5310 job->jv_status = JOB_ENDED;
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5311 return "dead";
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5312 }
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5313 return "run";
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5314 }
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5315
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5316 int
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5317 mch_stop_job(job_T *job, char_u *how)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5318 {
8031
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5319 int sig = -1;
ece323e2b57f commit https://github.com/vim/vim/commit/6463ca229cb9412581419497924c85fcbfc854ab
Christian Brabandt <cb@256bit.org>
parents: 8023
diff changeset
5320 pid_t job_pid;
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5321
8251
989ac3aed1ef commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Christian Brabandt <cb@256bit.org>
parents: 8112
diff changeset
5322 if (*how == NUL || STRCMP(how, "term") == 0)
989ac3aed1ef commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Christian Brabandt <cb@256bit.org>
parents: 8112
diff changeset
5323 sig = SIGTERM;
989ac3aed1ef commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Christian Brabandt <cb@256bit.org>
parents: 8112
diff changeset
5324 else if (STRCMP(how, "hup") == 0)
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5325 sig = SIGHUP;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5326 else if (STRCMP(how, "quit") == 0)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5327 sig = SIGQUIT;
8251
989ac3aed1ef commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Christian Brabandt <cb@256bit.org>
parents: 8112
diff changeset
5328 else if (STRCMP(how, "int") == 0)
989ac3aed1ef commit https://github.com/vim/vim/commit/923d926d57d985ec8965da9d0cd3634e6b24bfe1
Christian Brabandt <cb@256bit.org>
parents: 8112
diff changeset
5329 sig = SIGINT;
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5330 else if (STRCMP(how, "kill") == 0)
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5331 sig = SIGKILL;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5332 else if (isdigit(*how))
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5333 sig = atoi((char *)how);
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5334 else
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5335 return FAIL;
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5336
7999
92ad477c6ab3 commit https://github.com/vim/vim/commit/7280140c08799f683ef31a6c1019e283c3dc13aa
Christian Brabandt <cb@256bit.org>
parents: 7957
diff changeset
5337 /* TODO: have an option to only kill the process, not the group? */
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5338 job_pid = job->jv_pid;
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5339 if (job_pid == getpgid(job_pid))
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5340 job_pid = -job_pid;
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5341
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5342 kill(job_pid, sig);
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5343
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5344 return OK;
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5345 }
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5346
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5347 /*
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5348 * Clear the data related to "job".
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5349 */
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5350 void
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5351 mch_clear_job(job_T *job)
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5352 {
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5353 /* call waitpid because child process may become zombie */
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5354 # ifdef __NeXT__
8360
45740f83b3ce commit https://github.com/vim/vim/commit/4ca812b15378f83e56a2dc42947a61d0aa40697f
Christian Brabandt <cb@256bit.org>
parents: 8336
diff changeset
5355 (void)wait4(job->jv_pid, NULL, WNOHANG, (struct rusage *)0);
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5356 # else
8360
45740f83b3ce commit https://github.com/vim/vim/commit/4ca812b15378f83e56a2dc42947a61d0aa40697f
Christian Brabandt <cb@256bit.org>
parents: 8336
diff changeset
5357 (void)waitpid(job->jv_pid, NULL, WNOHANG);
8023
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5358 # endif
75e0831549f1 commit https://github.com/vim/vim/commit/76467dfcafcf295fd987f712730774c6f55317d3
Christian Brabandt <cb@256bit.org>
parents: 7999
diff changeset
5359 }
7957
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5360 #endif
b74549818500 commit https://github.com/vim/vim/commit/835dc636a5350f610b62f110227d2363b5b2880a
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
5361
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5362 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5363 * Check for CTRL-C typed by reading all available characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5364 * In cooked mode we should get SIGINT, no need to check.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5365 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5366 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5367 mch_breakcheck(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5368 {
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5369 if (curr_tmode == TMODE_RAW && RealWaitForChar(read_cmd_fd, 0L, NULL, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5370 fill_input_buf(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5372
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5373 /*
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5374 * Wait "msec" msec until a character is available from the mouse, keyboard,
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5375 * from inbuf[].
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5376 * "msec" == -1 will block forever.
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5377 * Invokes timer callbacks when needed.
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5378 * "interrupted" (if not NULL) is set to TRUE when no character is available
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5379 * but something else needs to be done.
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5380 * Returns TRUE when a character is available.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5381 * When a GUI is being used, this will never get called -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5382 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5383 static int
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5384 WaitForChar(long msec, int *interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5385 {
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5386 #ifdef FEAT_TIMERS
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5387 long due_time;
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5388 long remaining = msec;
8947
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5389 int tb_change_cnt = typebuf.tb_change_cnt;
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5390
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5391 /* When waiting very briefly don't trigger timers. */
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5392 if (msec >= 0 && msec < 10L)
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5393 return WaitForCharOrMouse(msec, NULL);
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5394
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5395 while (msec < 0 || remaining > 0)
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5396 {
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5397 /* Trigger timers and then get the time in msec until the next one is
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5398 * due. Wait up to that time. */
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5399 due_time = check_due_timer();
8947
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5400 if (typebuf.tb_change_cnt != tb_change_cnt)
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5401 {
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5402 /* timer may have used feedkeys() */
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5403 return FALSE;
c07caeb90a35 commit https://github.com/vim/vim/commit/40b1b5443c88fab77f1f7c6f9e801f7ffdb7e0a8
Christian Brabandt <cb@256bit.org>
parents: 8845
diff changeset
5404 }
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5405 if (due_time <= 0 || (msec > 0 && due_time > remaining))
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5406 due_time = remaining;
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5407 if (WaitForCharOrMouse(due_time, interrupted))
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5408 return TRUE;
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5409 if (interrupted != NULL && *interrupted)
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5410 /* Nothing available, but need to return so that side effects get
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5411 * handled, such as handling a message on a channel. */
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5412 return FALSE;
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5413 if (msec > 0)
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5414 remaining -= due_time;
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5415 }
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5416 return FALSE;
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5417 #else
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5418 return WaitForCharOrMouse(msec, interrupted);
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5419 #endif
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5420 }
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5421
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5422 /*
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5423 * Wait "msec" msec until a character is available from the mouse or keyboard
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5424 * or from inbuf[].
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5425 * "msec" == -1 will block forever.
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5426 * "interrupted" (if not NULL) is set to TRUE when no character is available
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5427 * but something else needs to be done.
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5428 * When a GUI is being used, this will never get called -- webb
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5429 */
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5430 static int
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5431 WaitForCharOrMouse(long msec, int *interrupted)
8609
40bb2619f5e2 commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61
Christian Brabandt <cb@256bit.org>
parents: 8493
diff changeset
5432 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5433 #ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5434 int gpm_process_wanted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5435 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5436 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5437 int rest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5438 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5439 int avail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5440
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5441 if (input_available()) /* something in inbuf[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5442 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5444 #if defined(FEAT_MOUSE_DEC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5445 /* May need to query the mouse position. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5446 if (WantQueryMouse)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5447 {
227
ef254e0f2365 updated for version 7.0063
vimboss
parents: 216
diff changeset
5448 WantQueryMouse = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5449 mch_write((char_u *)IF_EB("\033[1'|", ESC_STR "[1'|"), 5);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5451 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5452
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5453 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5454 * For FEAT_MOUSE_GPM and FEAT_XCLIPBOARD we loop here to process mouse
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5455 * events. This is a bit complicated, because they might both be defined.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5456 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5457 #if defined(FEAT_MOUSE_GPM) || defined(FEAT_XCLIPBOARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5458 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5459 rest = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5460 if (do_xterm_trace())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5461 rest = msec;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5462 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5463 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5464 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5465 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5466 if (rest != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5468 msec = XT_TRACE_DELAY;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5469 if (rest >= 0 && rest < XT_TRACE_DELAY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5470 msec = rest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5471 if (rest >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5472 rest -= msec;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5474 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5475 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5476 gpm_process_wanted = 0;
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5477 avail = RealWaitForChar(read_cmd_fd, msec,
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5478 &gpm_process_wanted, interrupted);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5479 # else
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5480 avail = RealWaitForChar(read_cmd_fd, msec, NULL, interrupted);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5481 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5482 if (!avail)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5483 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5484 if (input_available())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5485 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5486 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5487 if (rest == 0 || !do_xterm_trace())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5488 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5489 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5490 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5491 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5492 while (FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5493 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5494 || (gpm_process_wanted && mch_gpm_process() == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5495 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5496 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5497 || (!avail && rest != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5498 # endif
8736
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5499 )
06bf71f13eb7 commit https://github.com/vim/vim/commit/8fdd7210479f0c486822ad8934087b4bfd8a4765
Christian Brabandt <cb@256bit.org>
parents: 8671
diff changeset
5500 ;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5501
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5502 #else
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5503 avail = RealWaitForChar(read_cmd_fd, msec, NULL, interrupted);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5504 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5505 return avail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5507
5541
2f99966971b0 updated for version 7.4.119
Bram Moolenaar <bram@vim.org>
parents: 5533
diff changeset
5508 #ifndef VMS
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5509 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5510 * Wait "msec" msec until a character is available from file descriptor "fd".
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5511 * "msec" == 0 will check for characters once.
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5512 * "msec" == -1 will block until a character is available.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5513 * When a GUI is being used, this will not be used for input -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5514 * Or when a Linux GPM mouse event is waiting.
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5515 * Or when a clientserver message is on the queue.
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5516 * "interrupted" (if not NULL) is set to TRUE when no character is available
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5517 * but something else needs to be done.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5518 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5519 #if defined(__BEOS__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5520 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5521 #else
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5522 static int
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5523 #endif
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5524 RealWaitForChar(int fd, long msec, int *check_for_gpm UNUSED, int *interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5526 int ret;
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5527 int result;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5528 #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5529 static int busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5530
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5531 /* May retry getting characters after an event was handled. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5532 # define MAY_LOOP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5533
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5534 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5535 /* Remember at what time we started, so that we know how much longer we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5536 * should wait after being interrupted. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5537 # define USE_START_TV
9209
f8f41f4e0acd commit https://github.com/vim/vim/commit/76b6dfe54ba9b85cd9d8e6539205c1679a187961
Christian Brabandt <cb@256bit.org>
parents: 9207
diff changeset
5538 long start_msec = msec;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5539 struct timeval start_tv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5540
9209
f8f41f4e0acd commit https://github.com/vim/vim/commit/76b6dfe54ba9b85cd9d8e6539205c1679a187961
Christian Brabandt <cb@256bit.org>
parents: 9207
diff changeset
5541 if (msec > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5542 gettimeofday(&start_tv, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5543 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5544
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5545 /* Handle being called recursively. This may happen for the session
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5546 * manager stuff, it may save the file, which does a breakcheck. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5547 if (busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5548 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5549 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5550
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5551 #ifdef MAY_LOOP
407
0f6afaf1b8d1 updated for version 7.0106
vimboss
parents: 369
diff changeset
5552 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5553 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5554 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5555 #ifdef MAY_LOOP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5556 int finished = TRUE; /* default is to 'loop' just once */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5557 # ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5558 int mzquantum_used = FALSE;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5559 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5560 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5561 #ifndef HAVE_SELECT
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5562 /* each channel may use in, out and err */
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5563 struct pollfd fds[6 + 3 * MAX_OPEN_CHANNELS];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5564 int nfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5565 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5566 int xterm_idx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5567 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5568 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5569 int gpm_idx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5570 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5571 # ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5572 int xsmp_idx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5573 # endif
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5574 int towait = (int)msec;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5575
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5576 # ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5577 mzvim_check_threads();
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5578 if (mzthreads_allowed() && p_mzq > 0 && (msec < 0 || msec > p_mzq))
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5579 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5580 towait = (int)p_mzq; /* don't wait longer than 'mzquantum' */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5581 mzquantum_used = TRUE;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5582 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5583 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5584 fds[0].fd = fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5585 fds[0].events = POLLIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5586 nfd = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5588 # ifdef FEAT_XCLIPBOARD
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
5589 may_restore_clipboard();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5590 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5591 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5592 xterm_idx = nfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5593 fds[nfd].fd = ConnectionNumber(xterm_dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5594 fds[nfd].events = POLLIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5595 nfd++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5596 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5597 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5598 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5599 if (check_for_gpm != NULL && gpm_flag && gpm_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5600 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5601 gpm_idx = nfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5602 fds[nfd].fd = gpm_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5603 fds[nfd].events = POLLIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5604 nfd++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5606 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5607 # ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5608 if (xsmp_icefd != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5610 xsmp_idx = nfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5611 fds[nfd].fd = xsmp_icefd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5612 fds[nfd].events = POLLIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5613 nfd++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5615 # endif
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5616 #ifdef FEAT_JOB_CHANNEL
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents: 7629
diff changeset
5617 nfd = channel_poll_setup(nfd, &fds);
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
5618 #endif
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5619 if (interrupted != NULL)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5620 *interrupted = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5621
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5622 ret = poll(fds, nfd, towait);
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5623
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5624 result = ret > 0 && (fds[0].revents & POLLIN);
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5625 if (result == 0 && interrupted != NULL && ret > 0)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5626 *interrupted = TRUE;
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5627
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5628 # ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5629 if (ret == 0 && mzquantum_used)
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
5630 /* MzThreads scheduling is required and timeout occurred */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5631 finished = FALSE;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5632 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5634 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5635 if (xterm_Shell != (Widget)0 && (fds[xterm_idx].revents & POLLIN))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5637 xterm_update(); /* Maybe we should hand out clipboard */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5638 if (--ret == 0 && !input_available())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5639 /* Try again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5640 finished = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5642 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5643 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5644 if (gpm_idx >= 0 && (fds[gpm_idx].revents & POLLIN))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5646 *check_for_gpm = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5648 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5649 # ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5650 if (xsmp_idx >= 0 && (fds[xsmp_idx].revents & (POLLIN | POLLHUP)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5651 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5652 if (fds[xsmp_idx].revents & POLLIN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654 busy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5655 xsmp_handle_requests();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656 busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5657 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5658 else if (fds[xsmp_idx].revents & POLLHUP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5659 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5660 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
5661 verb_msg((char_u *)_("XSMP lost ICE connection"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5662 xsmp_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5663 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5664 if (--ret == 0)
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5665 finished = FALSE; /* Try again */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5666 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5667 # endif
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5668 #ifdef FEAT_JOB_CHANNEL
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents: 7629
diff changeset
5669 if (ret > 0)
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents: 7629
diff changeset
5670 ret = channel_poll_check(ret, &fds);
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
5671 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5673 #else /* HAVE_SELECT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5674
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5675 struct timeval tv;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5676 struct timeval *tvp;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5677 fd_set rfds, wfds, efds;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5678 int maxfd;
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5679 long towait = msec;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5680
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5681 # ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5682 mzvim_check_threads();
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5683 if (mzthreads_allowed() && p_mzq > 0 && (msec < 0 || msec > p_mzq))
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5684 {
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5685 towait = p_mzq; /* don't wait longer than 'mzquantum' */
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5686 mzquantum_used = TRUE;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5687 }
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5688 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5689
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5690 if (towait >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5691 {
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5692 tv.tv_sec = towait / 1000;
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5693 tv.tv_usec = (towait % 1000) * (1000000/1000);
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5694 tvp = &tv;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5695 }
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5696 else
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5697 tvp = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5698
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5699 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5700 * Select on ready for reading and exceptional condition (end of file).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5701 */
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5702 select_eintr:
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5703 FD_ZERO(&rfds);
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5704 FD_ZERO(&wfds);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5705 FD_ZERO(&efds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5706 FD_SET(fd, &rfds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5707 # if !defined(__QNX__) && !defined(__CYGWIN32__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 /* For QNX select() always returns 1 if this is set. Why? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709 FD_SET(fd, &efds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 maxfd = fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5712
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5713 # ifdef FEAT_XCLIPBOARD
6383
9c9c70625444 updated for version 7.4.523
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
5714 may_restore_clipboard();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5715 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5716 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5717 FD_SET(ConnectionNumber(xterm_dpy), &rfds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 if (maxfd < ConnectionNumber(xterm_dpy))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5719 maxfd = ConnectionNumber(xterm_dpy);
3748
ad5fbf3596e0 updated for version 7.3.633
Bram Moolenaar <bram@vim.org>
parents: 3746
diff changeset
5720
ad5fbf3596e0 updated for version 7.3.633
Bram Moolenaar <bram@vim.org>
parents: 3746
diff changeset
5721 /* An event may have already been read but not handled. In
ad5fbf3596e0 updated for version 7.3.633
Bram Moolenaar <bram@vim.org>
parents: 3746
diff changeset
5722 * particulary, XFlush may cause this. */
ad5fbf3596e0 updated for version 7.3.633
Bram Moolenaar <bram@vim.org>
parents: 3746
diff changeset
5723 xterm_update();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5724 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5725 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5726 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5727 if (check_for_gpm != NULL && gpm_flag && gpm_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5729 FD_SET(gpm_fd, &rfds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5730 FD_SET(gpm_fd, &efds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5731 if (maxfd < gpm_fd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5732 maxfd = gpm_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5733 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5734 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5735 # ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5736 if (xsmp_icefd != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5737 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5738 FD_SET(xsmp_icefd, &rfds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5739 FD_SET(xsmp_icefd, &efds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5740 if (maxfd < xsmp_icefd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5741 maxfd = xsmp_icefd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5742 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5743 # endif
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5744 # ifdef FEAT_JOB_CHANNEL
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5745 maxfd = channel_select_setup(maxfd, &rfds, &wfds);
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5746 # endif
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5747 if (interrupted != NULL)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5748 *interrupted = FALSE;
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5749
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5750 ret = select(maxfd + 1, &rfds, &wfds, &efds, tvp);
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5751 result = ret > 0 && FD_ISSET(fd, &rfds);
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5752 if (result)
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5753 --ret;
9205
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5754 else if (interrupted != NULL && ret > 0)
c19eb05b19df commit https://github.com/vim/vim/commit/cda7764d8e65325d4524e5d6c3174121eeb12cad
Christian Brabandt <cb@256bit.org>
parents: 9189
diff changeset
5755 *interrupted = TRUE;
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5756
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5757 # ifdef EINTR
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5758 if (ret == -1 && errno == EINTR)
3133
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5759 {
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5760 /* Check whether window has been resized, EINTR may be caused by
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5761 * SIGWINCH. */
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5762 if (do_resize)
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5763 handle_resize();
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5764
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5765 /* Interrupted by a signal, need to try again. We ignore msec
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5766 * here, because we do want to check even after a timeout if
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5767 * characters are available. Needed for reading output of an
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5768 * external command after the process has finished. */
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5769 goto select_eintr;
3133
176bfa951339 updated for version 7.3.337
Bram Moolenaar <bram@vim.org>
parents: 3062
diff changeset
5770 }
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5771 # endif
1076
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5772 # ifdef __TANDEM
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5773 if (ret == -1 && errno == ENOTSUP)
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5774 {
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5775 FD_ZERO(&rfds);
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5776 FD_ZERO(&efds);
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5777 ret = 0;
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1054
diff changeset
5778 }
3046
0d8494c05113 updated for version 7.3.295
Bram Moolenaar <bram@vim.org>
parents: 2994
diff changeset
5779 # endif
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5780 # ifdef FEAT_MZSCHEME
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5781 if (ret == 0 && mzquantum_used)
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
5782 /* loop if MzThreads must be scheduled and timeout occurred */
14
946da5994c01 updated for version 7.0006
vimboss
parents: 12
diff changeset
5783 finished = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5784 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5785
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5786 # ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5787 if (ret > 0 && xterm_Shell != (Widget)0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5788 && FD_ISSET(ConnectionNumber(xterm_dpy), &rfds))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5789 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5790 xterm_update(); /* Maybe we should hand out clipboard */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5791 /* continue looping when we only got the X event and the input
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5792 * buffer is empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5793 if (--ret == 0 && !input_available())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5794 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5795 /* Try again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5796 finished = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5797 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5798 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5799 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5800 # ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5801 if (ret > 0 && gpm_flag && check_for_gpm != NULL && gpm_fd >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5802 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5803 if (FD_ISSET(gpm_fd, &efds))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5804 gpm_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5805 else if (FD_ISSET(gpm_fd, &rfds))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5806 *check_for_gpm = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5807 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5808 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5809 # ifdef USE_XSMP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5810 if (ret > 0 && xsmp_icefd != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5811 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5812 if (FD_ISSET(xsmp_icefd, &efds))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5813 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5814 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
5815 verb_msg((char_u *)_("XSMP lost ICE connection"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5816 xsmp_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5817 if (--ret == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5818 finished = FALSE; /* keep going if event was only one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5820 else if (FD_ISSET(xsmp_icefd, &rfds))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5822 busy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5823 xsmp_handle_requests();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5824 busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5825 if (--ret == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5826 finished = FALSE; /* keep going if event was only one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5828 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5829 # endif
8493
caed4b2d305f commit https://github.com/vim/vim/commit/509ce2a558e7e0c03242e32e844255af52f1c821
Christian Brabandt <cb@256bit.org>
parents: 8491
diff changeset
5830 #ifdef FEAT_JOB_CHANNEL
7743
6069f43cea4e commit https://github.com/vim/vim/commit/e0874f8cbcddfcf9965a85ba35199964efb1d01a
Christian Brabandt <cb@256bit.org>
parents: 7629
diff changeset
5831 if (ret > 0)
8761
f8707ec9efe4 commit https://github.com/vim/vim/commit/8b877ac38e96424a08a8b8eb713ef4b3cf0064be
Christian Brabandt <cb@256bit.org>
parents: 8740
diff changeset
5832 ret = channel_select_check(ret, &rfds, &wfds);
2209
d0ddf7ba1630 Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents: 2074
diff changeset
5833 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5835 #endif /* HAVE_SELECT */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5836
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5837 #ifdef MAY_LOOP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5838 if (finished || msec == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5839 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5840
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5841 # ifdef FEAT_CLIENTSERVER
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5842 if (server_waiting())
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5843 break;
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5844 # endif
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
5845
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5846 /* We're going to loop around again, find out for how long */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5847 if (msec > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5848 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5849 # ifdef USE_START_TV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5850 /* Compute remaining wait time. */
9209
f8f41f4e0acd commit https://github.com/vim/vim/commit/76b6dfe54ba9b85cd9d8e6539205c1679a187961
Christian Brabandt <cb@256bit.org>
parents: 9207
diff changeset
5851 msec = start_msec - elapsed(&start_tv);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5852 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5853 /* Guess we got interrupted halfway. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5854 msec = msec / 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5855 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5856 if (msec <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5857 break; /* waited long enough */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5859 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5860 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5861
8112
a62ff5ff60c1 commit https://github.com/vim/vim/commit/ec70bdd68a531762a62728747ab529d7a6dfc842
Christian Brabandt <cb@256bit.org>
parents: 8094
diff changeset
5862 return result;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5864
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5865 #ifndef NO_EXPANDPATH
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5866 /*
444
d0d15b184c56 updated for version 7.0116
vimboss
parents: 428
diff changeset
5867 * Expand a path into all matching files and/or directories. Handles "*",
d0d15b184c56 updated for version 7.0116
vimboss
parents: 428
diff changeset
5868 * "?", "[a-z]", "**", etc.
d0d15b184c56 updated for version 7.0116
vimboss
parents: 428
diff changeset
5869 * "path" has backslashes before chars that are not to be expanded.
d0d15b184c56 updated for version 7.0116
vimboss
parents: 428
diff changeset
5870 * Returns the number of matches found.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5871 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5872 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5873 mch_expandpath(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5874 garray_T *gap,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5875 char_u *path,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5876 int flags) /* EW_* flags */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5877 {
444
d0d15b184c56 updated for version 7.0116
vimboss
parents: 428
diff changeset
5878 return unix_expandpath(gap, path, 0, flags, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5880 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5881
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5882 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5883 * mch_expand_wildcards() - this code does wild-card pattern matching using
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5884 * the shell
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5885 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5886 * return OK for success, FAIL for error (you may lose some memory) and put
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5887 * an error message in *file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5888 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5889 * num_pat is number of input patterns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5890 * pat is array of pointers to input patterns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5891 * num_file is pointer to number of matched file names
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5892 * file is pointer to array of pointers to matched file names
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5893 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5894
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5895 #ifndef SEEK_SET
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5896 # define SEEK_SET 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5897 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5898 #ifndef SEEK_END
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5899 # define SEEK_END 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5900 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5901
822
45fad0f590d0 updated for version 7.0c12
vimboss
parents: 765
diff changeset
5902 #define SHELL_SPECIAL (char_u *)"\t \"&'$;<>()\\|"
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
5903
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5904 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5905 mch_expand_wildcards(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5906 int num_pat,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5907 char_u **pat,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5908 int *num_file,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5909 char_u ***file,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
5910 int flags) /* EW_* flags */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5911 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5912 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5913 size_t len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5914 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5915 int dir;
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9381
diff changeset
5916
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5917 /*
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5918 * This is the non-OS/2 implementation (really Unix).
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5919 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5920 int j;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5921 char_u *tempname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5922 char_u *command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5923 FILE *fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5924 char_u *buffer;
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5925 #define STYLE_ECHO 0 /* use "echo", the default */
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5926 #define STYLE_GLOB 1 /* use "glob", for csh */
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5927 #define STYLE_VIMGLOB 2 /* use "vimglob", for Posix sh */
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5928 #define STYLE_PRINT 3 /* use "print -N", for zsh */
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5929 #define STYLE_BT 4 /* `cmd` expansion, execute the pattern
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5930 * directly */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5931 int shell_style = STYLE_ECHO;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5932 int check_spaces;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5933 static int did_find_nul = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5934 int ampersent = FALSE;
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5935 /* vimglob() function to define for Posix shell */
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
5936 static char *sh_vimglob_func = "vimglob() { while [ $# -ge 1 ]; do echo \"$1\"; shift; done }; vimglob >";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5938 *num_file = 0; /* default: no files found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5939 *file = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5941 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5942 * If there are no wildcards, just copy the names to allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5943 * Saves a lot of time, because we don't have to start a new shell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5944 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5945 if (!have_wildcard(num_pat, pat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5946 return save_patterns(num_pat, pat, num_file, file);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5947
428
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5948 # ifdef HAVE_SANDBOX
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5949 /* Don't allow any shell command in the sandbox. */
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5950 if (sandbox != 0 && check_secure())
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5951 return FAIL;
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5952 # endif
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5953
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5954 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5955 * Don't allow the use of backticks in secure and restricted mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5956 */
428
7290ddc7ba55 updated for version 7.0111
vimboss
parents: 421
diff changeset
5957 if (secure || restricted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5958 for (i = 0; i < num_pat; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5959 if (vim_strchr(pat[i], '`') != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5960 && (check_restricted() || check_secure()))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5961 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5962
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5963 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5964 * get a name for the temp file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5965 */
6721
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6695
diff changeset
5966 if ((tempname = vim_tempname('o', FALSE)) == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5967 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5968 EMSG(_(e_notmp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5969 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5970 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5971
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5972 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5973 * Let the shell expand the patterns and write the result into the temp
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5974 * file.
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5975 * STYLE_BT: NL separated
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5976 * If expanding `cmd` execute it directly.
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5977 * STYLE_GLOB: NUL separated
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5978 * If we use *csh, "glob" will work better than "echo".
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5979 * STYLE_PRINT: NL or NUL separated
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5980 * If we use *zsh, "print -N" will work better than "glob".
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5981 * STYLE_VIMGLOB: NL separated
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5982 * If we use *sh*, we define "vimglob()".
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5983 * STYLE_ECHO: space separated.
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5984 * A shell we don't know, stay safe and use "echo".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5985 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5986 if (num_pat == 1 && *pat[0] == '`'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5987 && (len = STRLEN(pat[0])) > 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5988 && *(pat[0] + len - 1) == '`')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5989 shell_style = STYLE_BT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5990 else if ((len = STRLEN(p_sh)) >= 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5991 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5992 if (STRCMP(p_sh + len - 3, "csh") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5993 shell_style = STYLE_GLOB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5994 else if (STRCMP(p_sh + len - 3, "zsh") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5995 shell_style = STYLE_PRINT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5996 }
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5997 if (shell_style == STYLE_ECHO && strstr((char *)gettail(p_sh),
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5998 "sh") != NULL)
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
5999 shell_style = STYLE_VIMGLOB;
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6000
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6001 /* Compute the length of the command. We need 2 extra bytes: for the
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6002 * optional '&' and for the NUL.
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6003 * Worst case: "unset nonomatch; print -N >" plus two is 29 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6004 len = STRLEN(tempname) + 29;
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6005 if (shell_style == STYLE_VIMGLOB)
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6006 len += STRLEN(sh_vimglob_func);
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6007
147
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6008 for (i = 0; i < num_pat; ++i)
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6009 {
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6010 /* Count the length of the patterns in the same way as they are put in
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6011 * "command" below. */
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6012 #ifdef USE_SYSTEM
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6013 len += STRLEN(pat[i]) + 3; /* add space and two quotes */
147
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6014 #else
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6015 ++len; /* add space */
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6016 for (j = 0; pat[i][j] != NUL; ++j)
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6017 {
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6018 if (vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6019 ++len; /* may add a backslash */
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6020 ++len;
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6021 }
147
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6022 #endif
2f5a3b881ada updated for version 7.0046
vimboss
parents: 129
diff changeset
6023 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6024 command = alloc(len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6025 if (command == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6026 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6027 /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6028 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6029 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6030 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6031
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6032 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6033 * Build the shell command:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6034 * - Set $nonomatch depending on EW_NOTFOUND (hopefully the shell
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6035 * recognizes this).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6036 * - Add the shell command to print the expanded names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6037 * - Add the temp file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6038 * - Add the file name patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6039 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6040 if (shell_style == STYLE_BT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6041 {
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6042 /* change `command; command& ` to (command; command ) */
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6043 STRCPY(command, "(");
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6044 STRCAT(command, pat[0] + 1); /* exclude first backtick */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6045 p = command + STRLEN(command) - 1;
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6046 *p-- = ')'; /* remove last backtick */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6047 while (p > command && vim_iswhite(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6048 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6049 if (*p == '&') /* remove trailing '&' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6050 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6051 ampersent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6052 *p = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6053 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6054 STRCAT(command, ">");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6055 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6058 if (flags & EW_NOTFOUND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6059 STRCPY(command, "set nonomatch; ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6060 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6061 STRCPY(command, "unset nonomatch; ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6062 if (shell_style == STYLE_GLOB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6063 STRCAT(command, "glob >");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6064 else if (shell_style == STYLE_PRINT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6065 STRCAT(command, "print -N >");
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6066 else if (shell_style == STYLE_VIMGLOB)
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6067 STRCAT(command, sh_vimglob_func);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6068 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6069 STRCAT(command, "echo >");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6070 }
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6071
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6072 STRCAT(command, tempname);
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6073
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6074 if (shell_style != STYLE_BT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6075 for (i = 0; i < num_pat; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6076 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6077 /* When using system() always add extra quotes, because the shell
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6078 * is started twice. Otherwise put a backslash before special
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
6079 * characters, except inside ``. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6080 #ifdef USE_SYSTEM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6081 STRCAT(command, " \"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6082 STRCAT(command, pat[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6083 STRCAT(command, "\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6084 #else
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6085 int intick = FALSE;
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6086
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6087 p = command + STRLEN(command);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6088 *p++ = ' ';
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6089 for (j = 0; pat[i][j] != NUL; ++j)
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6090 {
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6091 if (pat[i][j] == '`')
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6092 intick = !intick;
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6093 else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL)
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6094 {
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 631
diff changeset
6095 /* Remove a backslash, take char literally. But keep
652
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6096 * backslash inside backticks, before a special character
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6097 * and before a backtick. */
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 631
diff changeset
6098 if (intick
652
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6099 || vim_strchr(SHELL_SPECIAL, pat[i][j + 1]) != NULL
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6100 || pat[i][j + 1] == '`')
644
e4fa26ce8769 updated for version 7.0187
vimboss
parents: 631
diff changeset
6101 *p++ = '\\';
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
6102 ++j;
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6103 }
6174
96a4fa8e530c updated for version 7.4.423
Bram Moolenaar <bram@vim.org>
parents: 6102
diff changeset
6104 else if (!intick
96a4fa8e530c updated for version 7.4.423
Bram Moolenaar <bram@vim.org>
parents: 6102
diff changeset
6105 && ((flags & EW_KEEPDOLLAR) == 0 || pat[i][j] != '$')
96a4fa8e530c updated for version 7.4.423
Bram Moolenaar <bram@vim.org>
parents: 6102
diff changeset
6106 && vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL)
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6107 /* Put a backslash before a special character, but not
6174
96a4fa8e530c updated for version 7.4.423
Bram Moolenaar <bram@vim.org>
parents: 6102
diff changeset
6108 * when inside ``. And not for $var when EW_KEEPDOLLAR is
96a4fa8e530c updated for version 7.4.423
Bram Moolenaar <bram@vim.org>
parents: 6102
diff changeset
6109 * set. */
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 609
diff changeset
6110 *p++ = '\\';
648
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
6111
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
6112 /* Copy one character. */
9032e4668296 updated for version 7.0189
vimboss
parents: 644
diff changeset
6113 *p++ = pat[i][j];
233
fca8a9b65afa updated for version 7.0065
vimboss
parents: 227
diff changeset
6114 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6115 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6116 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6117 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6118 if (flags & EW_SILENT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6119 show_shell_mess = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6120 if (ampersent)
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6121 STRCAT(command, "&"); /* put the '&' after the redirection */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6122
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6123 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6124 * Using zsh -G: If a pattern has no matches, it is just deleted from
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6125 * the argument list, otherwise zsh gives an error message and doesn't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6126 * expand any other pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6127 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6128 if (shell_style == STYLE_PRINT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6129 extra_shell_arg = (char_u *)"-G"; /* Use zsh NULL_GLOB option */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6130
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6131 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6132 * If we use -f then shell variables set in .cshrc won't get expanded.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6133 * vi can do it, so we will too, but it is only necessary if there is a "$"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6134 * in one of the patterns, otherwise we can still use the fast option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6135 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6136 else if (shell_style == STYLE_GLOB && !have_dollars(num_pat, pat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6137 extra_shell_arg = (char_u *)"-f"; /* Use csh fast option */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6138
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6139 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6140 * execute the shell command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6141 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6142 i = call_shell(command, SHELL_EXPAND | SHELL_SILENT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6143
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6144 /* When running in the background, give it some time to create the temp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6145 * file, but don't wait for it to finish. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6146 if (ampersent)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6147 mch_delay(10L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6148
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6149 extra_shell_arg = NULL; /* cleanup */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6150 show_shell_mess = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 vim_free(command);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6153 if (i != 0) /* mch_call_shell() failed */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 mch_remove(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 * With interactive completion, the error message is not printed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 * However with USE_SYSTEM, I don't know how to turn off error messages
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 * from the shell, so screen may still get messed up -- webb.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 #ifndef USE_SYSTEM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 if (!(flags & EW_SILENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6165 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166 redraw_later_clear(); /* probably messed up screen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6167 msg_putchar('\n'); /* clear bottom line quickly */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168 cmdline_row = Rows - 1; /* continue on last line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169 #ifdef USE_SYSTEM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170 if (!(flags & EW_SILENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6173 MSG(_(e_wildexpand));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174 msg_start(); /* don't overwrite this message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177 /* If a `cmd` expansion failed, don't list `cmd` as a match, even when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 * EW_NOTFOUND is given */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 if (shell_style == STYLE_BT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6181 goto notfound;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 * read the names from the file into memory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6187 fd = fopen((char *)tempname, READBIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6188 if (fd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 /* Something went wrong, perhaps a file name with a special char. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6191 if (!(flags & EW_SILENT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6192 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6193 MSG(_(e_wildexpand));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6194 msg_start(); /* don't overwrite this message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6195 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6196 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6197 goto notfound;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6199 fseek(fd, 0L, SEEK_END);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6200 len = ftell(fd); /* get size of temp file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6201 fseek(fd, 0L, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6202 buffer = alloc(len + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6203 if (buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6204 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6205 /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6206 mch_remove(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6207 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6208 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6209 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6210 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6211 i = fread((char *)buffer, 1, len, fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6212 fclose(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6213 mch_remove(tempname);
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1869
diff changeset
6214 if (i != (int)len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6215 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6216 /* unexpected read error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6217 EMSG2(_(e_notread), tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6218 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6219 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6220 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6221 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6222 vim_free(tempname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6223
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6224 # if defined(__CYGWIN__) || defined(__CYGWIN32__)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6225 /* Translate <CR><NL> into <NL>. Caution, buffer may contain NUL. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6226 p = buffer;
5037
5e0b6a9282df updated for version 7.3.1262
Bram Moolenaar <bram@vim.org>
parents: 4299
diff changeset
6227 for (i = 0; i < (int)len; ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6228 if (!(buffer[i] == CAR && buffer[i + 1] == NL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6229 *p++ = buffer[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6230 len = p - buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6231 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6232
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6233
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6234 /* file names are separated with Space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6235 if (shell_style == STYLE_ECHO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6237 buffer[len] = '\n'; /* make sure the buffer ends in NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6238 p = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6239 for (i = 0; *p != '\n'; ++i) /* count number of entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6240 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6241 while (*p != ' ' && *p != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6242 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6243 p = skipwhite(p); /* skip to next entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6245 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6246 /* file names are separated with NL */
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6247 else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6249 buffer[len] = NUL; /* make sure the buffer ends in NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6250 p = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6251 for (i = 0; *p != NUL; ++i) /* count number of entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6253 while (*p != '\n' && *p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6254 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6255 if (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6256 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6257 p = skipwhite(p); /* skip leading white space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6258 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6260 /* file names are separated with NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6261 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6263 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6264 * Some versions of zsh use spaces instead of NULs to separate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6265 * results. Only do this when there is no NUL before the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6266 * buffer, otherwise we would never be able to use file names with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6267 * embedded spaces when zsh does use NULs.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6268 * When we found a NUL once, we know zsh is OK, set did_find_nul and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6269 * don't check for spaces again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6270 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6271 check_spaces = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6272 if (shell_style == STYLE_PRINT && !did_find_nul)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6273 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6274 /* If there is a NUL, set did_find_nul, else set check_spaces */
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2707
diff changeset
6275 buffer[len] = NUL;
5533
e35c69ad4823 updated for version 7.4.115
Bram Moolenaar <bram@vim.org>
parents: 5421
diff changeset
6276 if (len && (int)STRLEN(buffer) < (int)len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6277 did_find_nul = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6278 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6279 check_spaces = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6282 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6283 * Make sure the buffer ends with a NUL. For STYLE_PRINT there
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6284 * already is one, for STYLE_GLOB it needs to be added.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6285 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6286 if (len && buffer[len - 1] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6287 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6288 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6289 buffer[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6290 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6291 for (p = buffer; p < buffer + len; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6292 if (*p == NUL || (*p == ' ' && check_spaces)) /* count entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6293 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6294 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6295 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6297 if (len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6298 ++i; /* count last entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6300 if (i == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6301 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6302 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6303 * Can happen when using /bin/sh and typing ":e $NO_SUCH_VAR^I".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6304 * /bin/sh will happily expand it to nothing rather than returning an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6305 * error; and hey, it's good to check anyway -- webb.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6306 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6307 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6308 goto notfound;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6310 *num_file = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6311 *file = (char_u **)alloc(sizeof(char_u *) * i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6312 if (*file == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6313 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6314 /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6315 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6316 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6317 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6318
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6319 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6320 * Isolate the individual file names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6321 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6322 p = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6323 for (i = 0; i < *num_file; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6325 (*file)[i] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6326 /* Space or NL separates */
1508
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6327 if (shell_style == STYLE_ECHO || shell_style == STYLE_BT
c89903e16772 updated for version 7.1-223
vimboss
parents: 1479
diff changeset
6328 || shell_style == STYLE_VIMGLOB)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6329 {
652
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6330 while (!(shell_style == STYLE_ECHO && *p == ' ')
14fc0209d8c8 updated for version 7.0192
vimboss
parents: 648
diff changeset
6331 && *p != '\n' && *p != NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6333 if (p == buffer + len) /* last entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 *p++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6338 p = skipwhite(p); /* skip to next entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6340 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 else /* NUL separates */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 while (*p && p < buffer + len) /* skip entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 ++p; /* skip NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6349 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 * Move the file names to allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 for (j = 0, i = 0; i < *num_file; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 /* Require the files to exist. Helps when using /bin/sh */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355 if (!(flags & EW_NOTFOUND) && mch_getperm((*file)[i]) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6356 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6358 /* check if this entry should be included */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359 dir = (mch_isdir((*file)[i]));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6360 if ((dir && !(flags & EW_DIR)) || (!dir && !(flags & EW_FILE)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362
715
b526e10493b1 updated for version 7.0217
vimboss
parents: 652
diff changeset
6363 /* Skip files that are not executable if we check for that. */
6695
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
6364 if (!dir && (flags & EW_EXEC)
6529590f6c43 updated for version 7.4.672
Bram Moolenaar <bram@vim.org>
parents: 6683
diff changeset
6365 && !mch_can_exe((*file)[i], NULL, !(flags & EW_SHELLCMD)))
715
b526e10493b1 updated for version 7.0217
vimboss
parents: 652
diff changeset
6366 continue;
b526e10493b1 updated for version 7.0217
vimboss
parents: 652
diff changeset
6367
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6368 p = alloc((unsigned)(STRLEN((*file)[i]) + 1 + dir));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6369 if (p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 STRCPY(p, (*file)[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 if (dir)
1479
ae7e29b64923 updated for version 7.1-194
vimboss
parents: 1450
diff changeset
6373 add_pathsep(p); /* add '/' to a directory name */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 (*file)[j++] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6376 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6377 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378 *num_file = j;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 if (*num_file == 0) /* rejected all entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6381 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6382 vim_free(*file);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6383 *file = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6384 goto notfound;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6385 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6387 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6389 notfound:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6390 if (flags & EW_NOTFOUND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6391 return save_patterns(num_pat, pat, num_file, file);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6392 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6393 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6394
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6395 #endif /* VMS */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6397 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6398 save_patterns(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6399 int num_pat,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6400 char_u **pat,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6401 int *num_file,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6402 char_u ***file)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6403 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6404 int i;
99
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6405 char_u *s;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6406
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6407 *file = (char_u **)alloc(num_pat * sizeof(char_u *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6408 if (*file == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6409 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6410 for (i = 0; i < num_pat; i++)
99
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6411 {
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6412 s = vim_strsave(pat[i]);
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6413 if (s != NULL)
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6414 /* Be compatible with expand_filename(): halve the number of
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6415 * backslashes. */
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6416 backslash_halve(s);
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6417 (*file)[i] = s;
04f2e519ab18 updated for version 7.0038
vimboss
parents: 64
diff changeset
6418 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 *num_file = num_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6421 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6423 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6424 * Return TRUE if the string "p" contains a wildcard that mch_expandpath() can
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 * expand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6427 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6428 mch_has_exp_wildcard(char_u *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
6430 for ( ; *p; mb_ptr_adv(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6432 if (*p == '\\' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6433 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6434 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6435 if (vim_strchr((char_u *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6436 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6437 "*?%"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6438 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6439 "*?[{'"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6440 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6441 , *p) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6442 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6443 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6444 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6445 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6447 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6448 * Return TRUE if the string "p" contains a wildcard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6449 * Don't recognize '~' at the end as a wildcard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6450 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6451 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6452 mch_has_wildcard(char_u *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6453 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 37
diff changeset
6454 for ( ; *p; mb_ptr_adv(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6455 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6456 if (*p == '\\' && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6457 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6458 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6459 if (vim_strchr((char_u *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6460 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6461 "*?%$"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6462 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6463 "*?[{`'$"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6464 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6465 , *p) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6466 || (*p == '~' && p[1] != NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6467 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6468 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6469 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6470 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6471
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6472 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6473 have_wildcard(int num, char_u **file)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6474 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6475 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6477 for (i = 0; i < num; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6478 if (mch_has_wildcard(file[i]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6479 return 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6480 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6481 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6482
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6483 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6484 have_dollars(int num, char_u **file)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6485 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6486 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6488 for (i = 0; i < num; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6489 if (vim_strchr(file[i], '$') != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6490 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6491 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6493
8336
d44ff1525ff0 commit https://github.com/vim/vim/commit/fdcc9afb71ea88fe63bbed8bad0d5bae607bfb73
Christian Brabandt <cb@256bit.org>
parents: 8281
diff changeset
6494 #if !defined(HAVE_RENAME) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6495 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6496 * Scaled-down version of rename(), which is missing in Xenix.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6497 * This version can only move regular files and will fail if the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6498 * destination exists.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6499 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6500 int
8336
d44ff1525ff0 commit https://github.com/vim/vim/commit/fdcc9afb71ea88fe63bbed8bad0d5bae607bfb73
Christian Brabandt <cb@256bit.org>
parents: 8281
diff changeset
6501 mch_rename(const char *src, const char *dest)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6502 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6503 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6505 if (stat(dest, &st) >= 0) /* fail if destination exists */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507 if (link(src, dest) != 0) /* link file to new name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6509 if (mch_remove(src) == 0) /* delete link to old name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6510 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6511 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6512 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6513 #endif /* !HAVE_RENAME */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6514
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6515 #ifdef FEAT_MOUSE_GPM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6516 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6517 * Initializes connection with gpm (if it isn't already opened)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6518 * Return 1 if succeeded (or connection already opened), 0 if failed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6519 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6520 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6521 gpm_open(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6523 static Gpm_Connect gpm_connect; /* Must it be kept till closing ? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6525 if (!gpm_flag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6526 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6527 gpm_connect.eventMask = (GPM_UP | GPM_DRAG | GPM_DOWN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6528 gpm_connect.defaultMask = ~GPM_HARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6529 /* Default handling for mouse move*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6530 gpm_connect.minMod = 0; /* Handle any modifier keys */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6531 gpm_connect.maxMod = 0xffff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6532 if (Gpm_Open(&gpm_connect, 0) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6533 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6534 /* gpm library tries to handling TSTP causes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6535 * problems. Anyways, we close connection to Gpm whenever
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6536 * we are going to suspend or starting an external process
1450
1d6d99daf4dc updated for version 7.1-165
vimboss
parents: 1375
diff changeset
6537 * so we shouldn't have problem with this
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6538 */
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
6539 # ifdef SIGTSTP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6540 signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
1832
b34d985598f6 updated for version 7.2-130
vimboss
parents: 1823
diff changeset
6541 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6542 return 1; /* succeed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6544 if (gpm_fd == -2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6545 Gpm_Close(); /* We don't want to talk to xterm via gpm */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6546 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6548 return 1; /* already open */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6549 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6550
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6551 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6552 * Closes connection to gpm
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6553 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6554 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6555 gpm_close(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6557 if (gpm_flag && gpm_fd >= 0) /* if Open */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6558 Gpm_Close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6559 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6560
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6561 /* Reads gpm event and adds special keys to input buf. Returns length of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6562 * generated key sequence.
5782
5ab2946f7ce5 updated for version 7.4.235
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
6563 * This function is styled after gui_send_mouse_event().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6564 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6565 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6566 mch_gpm_process(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6568 int button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6569 static Gpm_Event gpm_event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6570 char_u string[6];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6571 int_u vim_modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6572 int row,col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6573 unsigned char buttons_mask;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6574 unsigned char gpm_modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6575 static unsigned char old_buttons = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6576
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6577 Gpm_GetEvent(&gpm_event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6578
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6579 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6580 /* Don't put events in the input queue now. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6581 if (hold_gui_events)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6582 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6583 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6585 row = gpm_event.y - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6586 col = gpm_event.x - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6588 string[0] = ESC; /* Our termcode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6589 string[1] = 'M';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6590 string[2] = 'G';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6591 switch (GPM_BARE_EVENTS(gpm_event.type))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6592 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6593 case GPM_DRAG:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6594 string[3] = MOUSE_DRAG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6595 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6596 case GPM_DOWN:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6597 buttons_mask = gpm_event.buttons & ~old_buttons;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6598 old_buttons = gpm_event.buttons;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6599 switch (buttons_mask)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6600 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6601 case GPM_B_LEFT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6602 button = MOUSE_LEFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6603 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6604 case GPM_B_MIDDLE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6605 button = MOUSE_MIDDLE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6606 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6607 case GPM_B_RIGHT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6608 button = MOUSE_RIGHT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6609 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6610 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6611 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 /*Don't know what to do. Can more than one button be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 * reported in one event? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6615 string[3] = (char_u)(button | 0x20);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6616 SET_NUM_MOUSE_CLICKS(string[3], gpm_event.clicks + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6617 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 case GPM_UP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 string[3] = MOUSE_RELEASE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620 old_buttons &= ~gpm_event.buttons;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6622 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625 /*This code is based on gui_x11_mouse_cb in gui_x11.c */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6626 gpm_modifiers = gpm_event.modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6627 vim_modifiers = 0x0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6628 /* I ignore capslock stats. Aren't we all just hate capslock mixing with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6629 * Vim commands ? Besides, gpm_event.modifiers is unsigned char, and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6630 * K_CAPSSHIFT is defined 8, so it probably isn't even reported
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6631 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6632 if (gpm_modifiers & ((1 << KG_SHIFT) | (1 << KG_SHIFTR) | (1 << KG_SHIFTL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6633 vim_modifiers |= MOUSE_SHIFT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6634
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6635 if (gpm_modifiers & ((1 << KG_CTRL) | (1 << KG_CTRLR) | (1 << KG_CTRLL)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6636 vim_modifiers |= MOUSE_CTRL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6637 if (gpm_modifiers & ((1 << KG_ALT) | (1 << KG_ALTGR)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6638 vim_modifiers |= MOUSE_ALT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639 string[3] |= vim_modifiers;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 string[4] = (char_u)(col + ' ' + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 string[5] = (char_u)(row + ' ' + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 add_to_input_buf(string, 6);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 return 6;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645 #endif /* FEAT_MOUSE_GPM */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6647 #ifdef FEAT_SYSMOUSE
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6648 /*
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6649 * Initialize connection with sysmouse.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6650 * Let virtual console inform us with SIGUSR2 for pending sysmouse
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6651 * output, any sysmouse output than will be processed via sig_sysmouse().
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6652 * Return OK if succeeded, FAIL if failed.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6653 */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6654 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6655 sysmouse_open(void)
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6656 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6657 struct mouse_info mouse;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6658
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6659 mouse.operation = MOUSE_MODE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6660 mouse.u.mode.mode = 0;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6661 mouse.u.mode.signal = SIGUSR2;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6662 if (ioctl(1, CONS_MOUSECTL, &mouse) != -1)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6663 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6664 signal(SIGUSR2, (RETSIGTYPE (*)())sig_sysmouse);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6665 mouse.operation = MOUSE_SHOW;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6666 ioctl(1, CONS_MOUSECTL, &mouse);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6667 return OK;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6668 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6669 return FAIL;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6670 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6671
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6672 /*
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6673 * Stop processing SIGUSR2 signals, and also make sure that
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6674 * virtual console do not send us any sysmouse related signal.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6675 */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6676 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6677 sysmouse_close(void)
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6678 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6679 struct mouse_info mouse;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6680
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6681 signal(SIGUSR2, restricted ? SIG_IGN : SIG_DFL);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6682 mouse.operation = MOUSE_MODE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6683 mouse.u.mode.mode = 0;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6684 mouse.u.mode.signal = 0;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6685 ioctl(1, CONS_MOUSECTL, &mouse);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6686 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6687
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6688 /*
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6689 * Gets info from sysmouse and adds special keys to input buf.
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6690 */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6691 static RETSIGTYPE
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6692 sig_sysmouse SIGDEFARG(sigarg)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6693 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6694 struct mouse_info mouse;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6695 struct video_info video;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6696 char_u string[6];
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6697 int row, col;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6698 int button;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6699 int buttons;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6700 static int oldbuttons = 0;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6701
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6702 #ifdef FEAT_GUI
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6703 /* Don't put events in the input queue now. */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6704 if (hold_gui_events)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6705 return;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6706 #endif
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6707
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6708 mouse.operation = MOUSE_GETINFO;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6709 if (ioctl(1, FBIO_GETMODE, &video.vi_mode) != -1
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6710 && ioctl(1, FBIO_MODEINFO, &video) != -1
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6711 && ioctl(1, CONS_MOUSECTL, &mouse) != -1
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6712 && video.vi_cheight > 0 && video.vi_cwidth > 0)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6713 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6714 row = mouse.u.data.y / video.vi_cheight;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6715 col = mouse.u.data.x / video.vi_cwidth;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6716 buttons = mouse.u.data.buttons;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6717 string[0] = ESC; /* Our termcode */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6718 string[1] = 'M';
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6719 string[2] = 'S';
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6720 if (oldbuttons == buttons && buttons != 0)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6721 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6722 button = MOUSE_DRAG;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6723 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6724 else
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6725 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6726 switch (buttons)
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6727 {
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6728 case 0:
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6729 button = MOUSE_RELEASE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6730 break;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6731 case 1:
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6732 button = MOUSE_LEFT;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6733 break;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6734 case 2:
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6735 button = MOUSE_MIDDLE;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6736 break;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6737 case 4:
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6738 button = MOUSE_RIGHT;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6739 break;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6740 default:
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6741 return;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6742 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6743 oldbuttons = buttons;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6744 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6745 string[3] = (char_u)(button);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6746 string[4] = (char_u)(col + ' ' + 1);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6747 string[5] = (char_u)(row + ' ' + 1);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6748 add_to_input_buf(string, 6);
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6749 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6750 return;
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6751 }
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6752 #endif /* FEAT_SYSMOUSE */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1615
diff changeset
6753
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 #if defined(FEAT_LIBCALL) || defined(PROTO)
7807
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
6755 typedef char_u * (*STRPROCSTR)(char_u *);
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
6756 typedef char_u * (*INTPROCSTR)(int);
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
6757 typedef int (*STRPROCINT)(char_u *);
1a5d34492798 commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
6758 typedef int (*INTPROCINT)(int);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6759
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6760 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6761 * Call a DLL routine which takes either a string or int param
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6762 * and returns an allocated string.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6763 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6764 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6765 mch_libcall(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6766 char_u *libname,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6767 char_u *funcname,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6768 char_u *argstring, /* NULL when using a argint */
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6769 int argint,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6770 char_u **string_result,/* NULL when using number_result */
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6771 int *number_result)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 # if defined(USE_DLOPEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774 void *hinstLib;
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6775 char *dlerr = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 shl_t hinstLib;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779 STRPROCSTR ProcAdd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 INTPROCSTR ProcAddI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 char_u *retval_str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6782 int retval_int = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6783 int success = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6784
900
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6785 /*
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6786 * Get a handle to the DLL module.
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6787 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 # if defined(USE_DLOPEN)
900
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6789 /* First clear any error, it's not cleared by the dlopen() call. */
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6790 (void)dlerror();
7bc38b35f1e8 updated for version 7.0-026
vimboss
parents: 857
diff changeset
6791
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 hinstLib = dlopen((char *)libname, RTLD_LAZY
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 # ifdef RTLD_LOCAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6794 | RTLD_LOCAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 );
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6797 if (hinstLib == NULL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6798 {
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6799 /* "dlerr" must be used before dlclose() */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6800 dlerr = (char *)dlerror();
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6801 if (dlerr != NULL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6802 EMSG2(_("dlerror = \"%s\""), dlerr);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6803 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 hinstLib = shl_load((const char*)libname, BIND_IMMEDIATE|BIND_VERBOSE, 0L);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6808 /* If the handle is valid, try to get the function address. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 if (hinstLib != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 # ifdef HAVE_SETJMP_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 * Catch a crash when calling the library function. For example when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 * using a number where a string pointer is expected.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6815 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6816 mch_startjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6817 if (SETJMP(lc_jump_env) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6818 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819 success = FALSE;
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 840
diff changeset
6820 # if defined(USE_DLOPEN)
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6821 dlerr = NULL;
857
b933657f7c9d updated for version 7.0g01
vimboss
parents: 840
diff changeset
6822 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 mch_didjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6828 retval_str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 retval_int = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831 if (argstring != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6833 # if defined(USE_DLOPEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6834 ProcAdd = (STRPROCSTR)dlsym(hinstLib, (const char *)funcname);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6835 dlerr = (char *)dlerror();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837 if (shl_findsym(&hinstLib, (const char *)funcname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 TYPE_PROCEDURE, (void *)&ProcAdd) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839 ProcAdd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840 # endif
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6841 if ((success = (ProcAdd != NULL
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6842 # if defined(USE_DLOPEN)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6843 && dlerr == NULL
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6844 # endif
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6845 )))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 if (string_result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 retval_int = ((STRPROCINT)ProcAdd)(argstring);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6849 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6850 retval_str = (ProcAdd)(argstring);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6851 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6852 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6853 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6854 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6855 # if defined(USE_DLOPEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 ProcAddI = (INTPROCSTR)dlsym(hinstLib, (const char *)funcname);
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6857 dlerr = (char *)dlerror();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6859 if (shl_findsym(&hinstLib, (const char *)funcname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 TYPE_PROCEDURE, (void *)&ProcAddI) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861 ProcAddI = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6862 # endif
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6863 if ((success = (ProcAddI != NULL
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6864 # if defined(USE_DLOPEN)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6865 && dlerr == NULL
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6866 # endif
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6867 )))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 if (string_result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 retval_int = ((INTPROCINT)ProcAddI)(argint);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 retval_str = (ProcAddI)(argint);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6873 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6874 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6875
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6876 /* Save the string before we free the library. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6877 /* Assume that a "1" or "-1" result is an illegal pointer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6878 if (string_result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6879 *number_result = retval_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6880 else if (retval_str != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6881 && retval_str != (char_u *)1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6882 && retval_str != (char_u *)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6883 *string_result = vim_strsave(retval_str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6884 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6885
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6886 # ifdef HAVE_SETJMP_H
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6887 mch_endjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 # ifdef SIGHASARG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889 if (lc_signal != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6890 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6891 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6892
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893 /* try to find the name of this signal */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 for (i = 0; signal_info[i].sig != -1; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6895 if (lc_signal == signal_info[i].sig)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6896 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6897 EMSG2("E368: got SIG%s in libcall()", signal_info[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6898 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6899 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6900 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6902 # if defined(USE_DLOPEN)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6903 /* "dlerr" must be used before dlclose() */
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6904 if (dlerr != NULL)
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6905 EMSG2(_("dlerror = \"%s\""), dlerr);
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
6906
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 /* Free the DLL module. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6908 (void)dlclose(hinstLib);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6909 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6910 (void)shl_unload(hinstLib);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6911 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6913
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6914 if (!success)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6915 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6916 EMSG2(_(e_libcall), funcname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6917 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6918 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6920 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6922 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 #if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925 static int xterm_trace = -1; /* default: disabled */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926 static int xterm_button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929 * Setup a dummy window for X selections in a terminal.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
6932 setup_term_clip(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 int z = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6935 char *strp = "";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6936 Widget AppShell;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6938 if (!x_connect_to_server())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6939 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6941 open_app_context();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6942 if (app_context != NULL && xterm_Shell == (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6943 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6944 int (*oldhandler)();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6945 #if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6946 int (*oldIOhandler)();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6948 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6949 struct timeval start_tv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6950
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6951 if (p_verbose > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6952 gettimeofday(&start_tv, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6953 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6955 /* Ignore X errors while opening the display */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6956 oldhandler = XSetErrorHandler(x_error_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6957
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6958 #if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 /* Ignore X IO errors while opening the display */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 oldIOhandler = XSetIOErrorHandler(x_IOerror_check);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6961 mch_startjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 if (SETJMP(lc_jump_env) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 mch_didjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6965 xterm_dpy = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6967 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6968 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6969 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6970 xterm_dpy = XtOpenDisplay(app_context, xterm_display,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6971 "vim_xterm", "Vim_xterm", NULL, 0, &z, &strp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6972 #if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6973 mch_endjmp();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6974 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6975 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6976
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6977 #if defined(HAVE_SETJMP_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 /* Now handle X IO errors normally. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6979 (void)XSetIOErrorHandler(oldIOhandler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6980 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6981 /* Now handle X errors normally. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6982 (void)XSetErrorHandler(oldhandler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6984 if (xterm_dpy == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6985 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6986 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
6987 verb_msg((char_u *)_("Opening the X display failed"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6991 /* Catch terminating error of the X server connection. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 (void)XSetIOErrorHandler(x_IOerror_handler);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6994 # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6995 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
6996 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
6997 verbose_enter();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6998 xopen_message(&start_tv);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
6999 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7000 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7001 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7002
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7003 /* Create a Shell to make converters work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7004 AppShell = XtVaAppCreateShell("vim_xterm", "Vim_xterm",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7005 applicationShellWidgetClass, xterm_dpy,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7007 if (AppShell == (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7008 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7009 xterm_Shell = XtVaCreatePopupShell("VIM",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7010 topLevelShellWidgetClass, AppShell,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7011 XtNmappedWhenManaged, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7012 XtNwidth, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7013 XtNheight, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015 if (xterm_Shell == (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 x11_setup_atoms(xterm_dpy);
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
7019 x11_setup_selection(xterm_Shell);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 if (x11_display == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 x11_display = xterm_dpy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 XtRealizeWidget(xterm_Shell);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 XSync(xterm_dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7025 xterm_update();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7027 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029 clip_init(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030 if (x11_window == 0 && (strp = getenv("WINDOWID")) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 x11_window = (Window)atol(strp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 /* Check if $WINDOWID is valid. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033 if (test_x11_window(xterm_dpy) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7034 x11_window = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 if (x11_window != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 xterm_trace = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7039
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7040 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7041 start_xterm_trace(int button)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7042 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7043 if (x11_window == 0 || xterm_trace < 0 || xterm_Shell == (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7044 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7045 xterm_trace = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7046 xterm_button = button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7047 do_xterm_trace();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7049
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7050
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7051 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7052 stop_xterm_trace(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7054 if (xterm_trace < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7055 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 xterm_trace = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7057 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7060 * Query the xterm pointer and generate mouse termcodes if necessary
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7061 * return TRUE if dragging is active, else FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7062 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7063 static int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7064 do_xterm_trace(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7065 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7066 Window root, child;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7067 int root_x, root_y;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7068 int win_x, win_y;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7069 int row, col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7070 int_u mask_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7071 char_u buf[50];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7072 char_u *strp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7073 long got_hints;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7074 static char_u *mouse_code;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7075 static char_u mouse_name[2] = {KS_MOUSE, KE_FILLER};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7076 static int prev_row = 0, prev_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7077 static XSizeHints xterm_hints;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7078
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7079 if (xterm_trace <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7080 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7081
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7082 if (xterm_trace == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7083 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7084 /* Get the hints just before tracking starts. The font size might
1510
56fb4ab9f62f updated for version 7.1-225
vimboss
parents: 1508
diff changeset
7085 * have changed recently. */
56fb4ab9f62f updated for version 7.1-225
vimboss
parents: 1508
diff changeset
7086 if (!XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints)
56fb4ab9f62f updated for version 7.1-225
vimboss
parents: 1508
diff changeset
7087 || !(got_hints & PResizeInc)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7088 || xterm_hints.width_inc <= 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7089 || xterm_hints.height_inc <= 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7091 xterm_trace = -1; /* Not enough data -- disable tracing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7092 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7095 /* Rely on the same mouse code for the duration of this */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7096 mouse_code = find_termcode(mouse_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7097 prev_row = mouse_row;
7009
286fd54c7ae3 patch 7.4.822
Bram Moolenaar <bram@vim.org>
parents: 6933
diff changeset
7098 prev_col = mouse_col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7099 xterm_trace = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7101 /* Find the offset of the chars, there might be a scrollbar on the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7102 * left of the window and/or a menu on the top (eterm etc.) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7103 XQueryPointer(xterm_dpy, x11_window, &root, &child, &root_x, &root_y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7104 &win_x, &win_y, &mask_return);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7105 xterm_hints.y = win_y - (xterm_hints.height_inc * mouse_row)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7106 - (xterm_hints.height_inc / 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7107 if (xterm_hints.y <= xterm_hints.height_inc / 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7108 xterm_hints.y = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7109 xterm_hints.x = win_x - (xterm_hints.width_inc * mouse_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7110 - (xterm_hints.width_inc / 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7111 if (xterm_hints.x <= xterm_hints.width_inc / 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7112 xterm_hints.x = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7113 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7114 }
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2707
diff changeset
7115 if (mouse_code == NULL || STRLEN(mouse_code) > 45)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7116 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7117 xterm_trace = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7118 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7119 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7121 XQueryPointer(xterm_dpy, x11_window, &root, &child, &root_x, &root_y,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7122 &win_x, &win_y, &mask_return);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7124 row = check_row((win_y - xterm_hints.y) / xterm_hints.height_inc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7125 col = check_col((win_x - xterm_hints.x) / xterm_hints.width_inc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7126 if (row == prev_row && col == prev_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7127 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7129 STRCPY(buf, mouse_code);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7130 strp = buf + STRLEN(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7131 *strp++ = (xterm_button | MOUSE_DRAG) & ~0x20;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7132 *strp++ = (char_u)(col + ' ' + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7133 *strp++ = (char_u)(row + ' ' + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7134 *strp = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7135 add_to_input_buf(buf, STRLEN(buf));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7136
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7137 prev_row = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7138 prev_col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7139 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7140 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7142 # if defined(FEAT_GUI) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7143 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7144 * Destroy the display, window and app_context. Required for GTK.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7145 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7146 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7147 clear_xterm_clip(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7148 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7149 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7150 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7151 XtDestroyWidget(xterm_Shell);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7152 xterm_Shell = (Widget)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7153 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7154 if (xterm_dpy != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7155 {
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7156 # if 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7157 /* Lesstif and Solaris crash here, lose some memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7158 XtCloseDisplay(xterm_dpy);
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7159 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7160 if (x11_display == xterm_dpy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7161 x11_display = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7162 xterm_dpy = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7163 }
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7164 # if 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7165 if (app_context != (XtAppContext)NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7166 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7167 /* Lesstif and Solaris crash here, lose some memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7168 XtDestroyApplicationContext(app_context);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7169 app_context = (XtAppContext)NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7170 }
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7171 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7173 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7175 /*
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7176 * Catch up with GUI or X events.
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7177 */
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7178 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7179 clip_update(void)
4230
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7180 {
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7181 # ifdef FEAT_GUI
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7182 if (gui.in_use)
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7183 gui_mch_update();
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7184 else
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7185 # endif
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7186 if (xterm_Shell != (Widget)0)
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7187 xterm_update();
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7188 }
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7189
90d72df431e5 updated for version 7.3.866
Bram Moolenaar <bram@vim.org>
parents: 4209
diff changeset
7190 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7191 * Catch up with any queued X events. This may put keyboard input into the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7192 * input buffer, call resize call-backs, trigger timers etc. If there is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7193 * nothing in the X event queue (& no timers pending), then we return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7194 * immediately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7195 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7196 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7197 xterm_update(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7199 XEvent event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7200
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7201 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7202 {
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7203 XtInputMask mask = XtAppPending(app_context);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7204
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7205 if (mask == 0 || vim_is_input_buf_full())
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7206 break;
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7207
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7208 if (mask & XtIMXEvent)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7209 {
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7210 /* There is an event to process. */
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7211 XtAppNextEvent(app_context, &event);
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7212 #ifdef FEAT_CLIENTSERVER
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7213 {
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7214 XPropertyEvent *e = (XPropertyEvent *)&event;
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7215
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7216 if (e->type == PropertyNotify && e->window == commWindow
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7217 && e->atom == commProperty && e->state == PropertyNewValue)
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7218 serverEventProc(xterm_dpy, &event, 0);
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7219 }
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7220 #endif
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7221 XtDispatchEvent(&event);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7222 }
6683
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7223 else
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7224 {
781104cb0d06 updated for version 7.4.666
Bram Moolenaar <bram@vim.org>
parents: 6458
diff changeset
7225 /* There is something else than an event to process. */
7109
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7226 XtAppProcessEvent(app_context, mask);
fa95595fbc52 commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents: 7009
diff changeset
7227 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7231 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7232 clip_xterm_own_selection(VimClipboard *cbd)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7233 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7234 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7235 return clip_x11_own_selection(xterm_Shell, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7236 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7237 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7238
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7239 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7240 clip_xterm_lose_selection(VimClipboard *cbd)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7241 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7242 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7243 clip_x11_lose_selection(xterm_Shell, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7245
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7246 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7247 clip_xterm_request_selection(VimClipboard *cbd)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7249 if (xterm_Shell != (Widget)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7250 clip_x11_request_selection(xterm_Shell, xterm_dpy, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7251 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7252
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7253 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7254 clip_xterm_set_selection(VimClipboard *cbd)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7255 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7256 clip_x11_set_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7258 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7259
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7260
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7261 #if defined(USE_XSMP) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7262 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7263 * Code for X Session Management Protocol.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7264 */
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7265 static void xsmp_handle_save_yourself(SmcConn smc_conn, SmPointer client_data, int save_type, Bool shutdown, int interact_style, Bool fast);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7266 static void xsmp_die(SmcConn smc_conn, SmPointer client_data);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7267 static void xsmp_save_complete(SmcConn smc_conn, SmPointer client_data);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7268 static void xsmp_shutdown_cancelled(SmcConn smc_conn, SmPointer client_data);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7269 static void xsmp_ice_connection(IceConn iceConn, IcePointer clientData, Bool opening, IcePointer *watchData);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7270
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7272 # if defined(FEAT_GUI) && defined(USE_XSMP_INTERACT)
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7778
diff changeset
7273 static void xsmp_handle_interaction(SmcConn smc_conn, SmPointer client_data);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7275 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7276 * This is our chance to ask the user if they want to save,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7277 * or abort the logout
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7278 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7279 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7280 xsmp_handle_interaction(SmcConn smc_conn, SmPointer client_data UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7281 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7282 cmdmod_T save_cmdmod;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7283 int cancel_shutdown = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7284
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7285 save_cmdmod = cmdmod;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7286 cmdmod.confirm = TRUE;
7469
15eefe1b0dad commit https://github.com/vim/vim/commit/027387f70c671f62e3e08e0bdd09ec05b0232735
Christian Brabandt <cb@256bit.org>
parents: 7420
diff changeset
7287 if (check_changed_any(FALSE, FALSE))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7288 /* Mustn't logout */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7289 cancel_shutdown = True;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7290 cmdmod = save_cmdmod;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7291 setcursor(); /* position cursor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7292 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7293
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7294 /* Done interaction */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7295 SmcInteractDone(smc_conn, cancel_shutdown);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7297 /* Finish off
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7298 * Only end save-yourself here if we're not cancelling shutdown;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7299 * we'll get a cancelled callback later in which we'll end it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7300 * Hopefully get around glitchy SMs (like GNOME-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7301 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7302 if (!cancel_shutdown)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 xsmp.save_yourself = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7305 SmcSaveYourselfDone(smc_conn, True);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7307 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7308 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 * Callback that starts save-yourself.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7313 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7314 xsmp_handle_save_yourself(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7315 SmcConn smc_conn,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7316 SmPointer client_data UNUSED,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7317 int save_type UNUSED,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7318 Bool shutdown,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7319 int interact_style UNUSED,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7320 Bool fast UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7321 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7322 /* Handle already being in saveyourself */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7323 if (xsmp.save_yourself)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7324 SmcSaveYourselfDone(smc_conn, True);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7325 xsmp.save_yourself = True;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7326 xsmp.shutdown = shutdown;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7327
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7328 /* First up, preserve all files */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7329 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7330 ml_sync_all(FALSE, FALSE); /* preserve all swap files */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7332 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7333 verb_msg((char_u *)_("XSMP handling save-yourself request"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7335 # if defined(FEAT_GUI) && defined(USE_XSMP_INTERACT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7336 /* Now see if we can ask about unsaved files */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7337 if (shutdown && !fast && gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7338 /* Need to interact with user, but need SM's permission */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7339 SmcInteractRequest(smc_conn, SmDialogError,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7340 xsmp_handle_interaction, client_data);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7341 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7342 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7343 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7344 /* Can stop the cycle here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7345 SmcSaveYourselfDone(smc_conn, True);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7346 xsmp.save_yourself = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7350
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7351 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7352 * Callback to warn us of imminent death.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7353 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7354 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7355 xsmp_die(SmcConn smc_conn UNUSED, SmPointer client_data UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7356 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7357 xsmp_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7359 /* quit quickly leaving swapfiles for modified buffers behind */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7360 getout_preserve_modified(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7361 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7364 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7365 * Callback to tell us that save-yourself has completed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7366 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7368 xsmp_save_complete(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7369 SmcConn smc_conn UNUSED,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7370 SmPointer client_data UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 xsmp.save_yourself = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7374
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7377 * Callback to tell us that an instigated shutdown was cancelled
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7378 * (maybe even by us)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7379 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7380 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7381 xsmp_shutdown_cancelled(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7382 SmcConn smc_conn,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7383 SmPointer client_data UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7384 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7385 if (xsmp.save_yourself)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7386 SmcSaveYourselfDone(smc_conn, True);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7387 xsmp.save_yourself = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7388 xsmp.shutdown = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7389 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7390
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7391
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7392 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7393 * Callback to tell us that a new ICE connection has been established.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7394 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7395 static void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7396 xsmp_ice_connection(
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7397 IceConn iceConn,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7398 IcePointer clientData UNUSED,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7399 Bool opening,
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7400 IcePointer *watchData UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7401 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7402 /* Intercept creation of ICE connection fd */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7403 if (opening)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7404 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7405 xsmp_icefd = IceConnectionNumber(iceConn);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7406 IceRemoveConnectionWatch(xsmp_ice_connection, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7407 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7408 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7409
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7411 /* Handle any ICE processing that's required; return FAIL if SM lost */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7412 int
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7413 xsmp_handle_requests(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7414 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7415 Bool rep;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7416
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7417 if (IceProcessMessages(xsmp.iceconn, NULL, &rep)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7418 == IceProcessMessagesIOError)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7420 /* Lost ICE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7422 verb_msg((char_u *)_("XSMP lost ICE connection"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 xsmp_close();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 static int dummy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7432 /* Set up X Session Management Protocol */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434 xsmp_init(void)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 char errorstring[80];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 SmcCallbacks smcallbacks;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 SmPropValue smname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 SmProp smnameprop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7441 SmProp *smprops[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7442 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7444 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7445 verb_msg((char_u *)_("XSMP opening connection"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7447 xsmp.save_yourself = xsmp.shutdown = False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7448
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7449 /* Set up SM callbacks - must have all, even if they're not used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7450 smcallbacks.save_yourself.callback = xsmp_handle_save_yourself;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7451 smcallbacks.save_yourself.client_data = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7452 smcallbacks.die.callback = xsmp_die;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7453 smcallbacks.die.client_data = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7454 smcallbacks.save_complete.callback = xsmp_save_complete;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7455 smcallbacks.save_complete.client_data = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7456 smcallbacks.shutdown_cancelled.callback = xsmp_shutdown_cancelled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7457 smcallbacks.shutdown_cancelled.client_data = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7459 /* Set up a watch on ICE connection creations. The "dummy" argument is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7460 * apparently required for FreeBSD (we get a BUS error when using NULL). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7461 if (IceAddConnectionWatch(xsmp_ice_connection, &dummy) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7462 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7463 if (p_verbose > 0)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7464 verb_msg((char_u *)_("XSMP ICE connection watch failed"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7465 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7467
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7468 /* Create an SM connection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7469 xsmp.smcconn = SmcOpenConnection(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7470 NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7471 NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7472 SmProtoMajor,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7473 SmProtoMinor,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7474 SmcSaveYourselfProcMask | SmcDieProcMask
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7475 | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7476 &smcallbacks,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7477 NULL,
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7478 &xsmp.clientid,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 sizeof(errorstring),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7480 errorstring);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7481 if (xsmp.smcconn == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7482 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7483 char errorreport[132];
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
7484
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7485 if (p_verbose > 0)
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7486 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7487 vim_snprintf(errorreport, sizeof(errorreport),
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
7488 _("XSMP SmcOpenConnection failed: %s"), errorstring);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7489 verb_msg((char_u *)errorreport);
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7490 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7491 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7493 xsmp.iceconn = SmcGetIceConnection(xsmp.smcconn);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7494
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7495 #if 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7496 /* ID ourselves */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7497 smname.value = "vim";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7498 smname.length = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7499 smnameprop.name = "SmProgram";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 smnameprop.type = "SmARRAY8";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501 smnameprop.num_vals = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7502 smnameprop.vals = &smname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504 smprops[0] = &smnameprop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505 SmcSetProperties(xsmp.smcconn, 1, smprops);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7507 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7508
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 /* Shut down XSMP comms. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7511 void
7833
c079097365f3 commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents: 7807
diff changeset
7512 xsmp_close(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7514 if (xsmp_icefd != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 SmcCloseConnection(xsmp.smcconn, 0, NULL);
1737
8272535dee77 updated for version 7.2-035
vimboss
parents: 1698
diff changeset
7517 if (xsmp.clientid != NULL)
8272535dee77 updated for version 7.2-035
vimboss
parents: 1698
diff changeset
7518 free(xsmp.clientid);
1605
7d127d580b6d updated for version 7.1-318
vimboss
parents: 1583
diff changeset
7519 xsmp.clientid = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 xsmp_icefd = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7522 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 #endif /* USE_XSMP */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 #ifdef EBCDIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 /* Translate character to its CTRL- value */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 char CtrlTable[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 /* 00 - 5E */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7536 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 /* ^ */ 0x1E,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7538 /* - */ 0x1F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539 /* 61 - 6C */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7540 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541 /* _ */ 0x1F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7542 /* 6E - 80 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 /* a */ 0x01,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7545 /* b */ 0x02,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 /* c */ 0x03,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 /* d */ 0x37,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 /* e */ 0x2D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549 /* f */ 0x2E,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 /* g */ 0x2F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 /* h */ 0x16,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7552 /* i */ 0x05,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7553 /* 8A - 90 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7554 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7555 /* j */ 0x15,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7556 /* k */ 0x0B,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7557 /* l */ 0x0C,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7558 /* m */ 0x0D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7559 /* n */ 0x0E,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7560 /* o */ 0x0F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7561 /* p */ 0x10,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7562 /* q */ 0x11,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7563 /* r */ 0x12,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7564 /* 9A - A1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7565 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7566 /* s */ 0x13,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7567 /* t */ 0x3C,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7568 /* u */ 0x3D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7569 /* v */ 0x32,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7570 /* w */ 0x26,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7571 /* x */ 0x18,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7572 /* y */ 0x19,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7573 /* z */ 0x3F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7574 /* AA - AC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7575 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 /* [ */ 0x27,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7577 /* AE - BC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7579 /* ] */ 0x1D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7580 /* BE - C0 */ 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7581 /* A */ 0x01,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7582 /* B */ 0x02,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7583 /* C */ 0x03,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7584 /* D */ 0x37,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7585 /* E */ 0x2D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7586 /* F */ 0x2E,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7587 /* G */ 0x2F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7588 /* H */ 0x16,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7589 /* I */ 0x05,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7590 /* CA - D0 */ 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 /* J */ 0x15,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7592 /* K */ 0x0B,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7593 /* L */ 0x0C,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7594 /* M */ 0x0D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7595 /* N */ 0x0E,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7596 /* O */ 0x0F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597 /* P */ 0x10,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7598 /* Q */ 0x11,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7599 /* R */ 0x12,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7600 /* DA - DF */ 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7601 /* \ */ 0x1C,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7602 /* E1 */ 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7603 /* S */ 0x13,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7604 /* T */ 0x3C,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7605 /* U */ 0x3D,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7606 /* V */ 0x32,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7607 /* W */ 0x26,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7608 /* X */ 0x18,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609 /* Y */ 0x19,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7610 /* Z */ 0x3F,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7611 /* EA - FF*/ 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7613 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7614
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7615 char MetaCharTable[]=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7616 {/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7617 0, 0, 0, 0,'\\', 0,'F', 0,'W','M','N', 0, 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7618 0, 0, 0, 0,']', 0, 0,'G', 0, 0,'R','O', 0, 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7619 '@','A','B','C','D','E', 0, 0,'H','I','J','K','L', 0, 0, 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7620 'P','Q', 0,'S','T','U','V', 0,'X','Y','Z','[', 0, 0,'^', 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7621 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7622
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7624 /* TODO: Use characters NOT numbers!!! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7625 char CtrlCharTable[]=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7626 {/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7627 124,193,194,195, 0,201, 0, 0, 0, 0, 0,210,211,212,213,214,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7628 215,216,217,226, 0,209,200, 0,231,232, 0, 0,224,189, 95,109,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7629 0, 0, 0, 0, 0, 0,230,173, 0, 0, 0, 0, 0,197,198,199,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7630 0, 0,229, 0, 0, 0, 0,196, 0, 0, 0, 0,227,228, 0,233,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7631 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7633
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7634 #endif