annotate src/ui.c @ 2378:85b7dc8da5eb vim73

Add the 'concealcursor' option to decide when the cursor line is to be concealed or not. Rename 'conc' to 'cole' as the short name for 'conceallevel'.
author Bram Moolenaar <bram@vim.org>
date Fri, 23 Jul 2010 22:10:27 +0200
parents ccda151dde4e
children 33148c37f3c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * ui.c: functions that handle the user interface.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 * 1. Keyboard input stuff, and a bit of windowing stuff. These are called
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 * before the machine specific stuff (mch_*) so that we can call the GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 * stuff instead if the GUI is running.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 * 2. Clipboard stuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 * 3. Input buffer stuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 ui_write(s, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 if (gui.in_use && !gui.dying && !gui.starting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 gui_write(s, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 if (p_wd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 gui_wait_for_chars(p_wd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 #ifndef NO_CONSOLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 /* Don't output anything in silent mode ("ex -s") unless 'verbose' set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 if (!(silent_mode && p_verbose == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 char_u *tofree = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 if (output_conv.vc_type != CONV_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 /* Convert characters from 'encoding' to 'termencoding'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 tofree = string_convert(&output_conv, s, &len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 if (tofree != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 s = tofree;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 mch_write(s, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 if (output_conv.vc_type != CONV_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 vim_free(tofree);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60
169
0e902b8f511f updated for version 7.0051
vimboss
parents: 39
diff changeset
61 #if defined(UNIX) || defined(VMS) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 * When executing an external program, there may be some typed characters that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 * are not consumed by it. Give them back to ui_inchar() and they are stored
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 * here for the next call.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 static char_u *ta_str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 static int ta_off; /* offset for next char to use when ta_str != NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 static int ta_len; /* length of ta_str when it's not NULL*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 ui_inchar_undo(s, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 char_u *new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 int newlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 newlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 if (ta_str != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 newlen += ta_len - ta_off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 new = alloc(newlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 if (new != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 if (ta_str != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 mch_memmove(new, ta_str + ta_off, (size_t)(ta_len - ta_off));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 mch_memmove(new + ta_len - ta_off, s, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 vim_free(ta_str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 mch_memmove(new, s, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 ta_str = new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 ta_len = newlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 ta_off = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 * ui_inchar(): low level input funcion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 * Get characters from the keyboard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 * Return the number of characters that are available.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 * If "wtime" == 0 do not wait for characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 * If "wtime" == -1 wait forever for characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * If "wtime" > 0 wait "wtime" milliseconds for a character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 * "tb_change_cnt" is the value of typebuf.tb_change_cnt if "buf" points into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 * it. When typebuf.tb_change_cnt changes (e.g., when a message is received
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 * from a remote client) "buf" can no longer be used. "tb_change_cnt" is NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 * otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 ui_inchar(buf, maxlen, wtime, tb_change_cnt)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 int maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 long wtime; /* don't use "time", MIPS cannot handle it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 int tb_change_cnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 int retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 #if defined(FEAT_GUI) && (defined(UNIX) || defined(VMS))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 * Use the typeahead if there is any.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 if (ta_str != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 if (maxlen >= ta_len - ta_off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 mch_memmove(buf, ta_str + ta_off, (size_t)ta_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 vim_free(ta_str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 ta_str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 return ta_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 mch_memmove(buf, ta_str + ta_off, (size_t)maxlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 ta_off += maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 return maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
141 #ifdef FEAT_PROFILE
791
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
142 if (do_profiling == PROF_YES && wtime != 0)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
143 prof_inchar_enter();
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
144 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
145
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 #ifdef NO_CONSOLE_INPUT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 /* Don't wait for character input when the window hasn't been opened yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 * Do try reading, this works when redirecting stdin from a file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 * Must return something, otherwise we'll loop forever. If we run into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 * this very often we probably got stuck, exit Vim. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 if (no_console_input())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 static int count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 # ifndef NO_CONSOLE
228
d97518d6b325 updated for version 7.0063
vimboss
parents: 170
diff changeset
156 retval = mch_inchar(buf, maxlen, (wtime >= 0 && wtime < 10)
d97518d6b325 updated for version 7.0063
vimboss
parents: 170
diff changeset
157 ? 10L : wtime, tb_change_cnt);
d97518d6b325 updated for version 7.0063
vimboss
parents: 170
diff changeset
158 if (retval > 0 || typebuf_changed(tb_change_cnt) || wtime >= 0)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
159 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 if (wtime == -1 && ++count == 1000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 read_error_exit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 buf[0] = CAR;
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
164 retval = 1;
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
165 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168
1086
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
169 /* If we are going to wait for some time or block... */
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
170 if (wtime == -1 || wtime > 100L)
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
171 {
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
172 /* ... allow signals to kill us. */
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
173 (void)vim_handle_signal(SIGNAL_UNBLOCK);
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
174
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
175 /* ... there is no need for CTRL-C to interrupt something, don't let
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
176 * it set got_int when it was mapped. */
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
177 if (mapped_ctrl_c)
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
178 ctrl_c_interrupts = FALSE;
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
179 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 if (gui_wait_for_chars(wtime) && !typebuf_changed(tb_change_cnt))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 retval = read_from_input_buf(buf, (long)maxlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 #ifndef NO_CONSOLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 # endif
36
125e80798a85 updated for version 7.0021
vimboss
parents: 11
diff changeset
192 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
36
125e80798a85 updated for version 7.0021
vimboss
parents: 11
diff changeset
194 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196
1086
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
197 if (wtime == -1 || wtime > 100L)
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
198 /* block SIGHUP et al. */
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
199 (void)vim_handle_signal(SIGNAL_BLOCK);
1a511b7b69eb updated for version 7.0-212
vimboss
parents: 944
diff changeset
200
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 ctrl_c_interrupts = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
203 #ifdef NO_CONSOLE_INPUT
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
204 theend:
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
205 #endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
206 #ifdef FEAT_PROFILE
791
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
207 if (do_profiling == PROF_YES && wtime != 0)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
208 prof_inchar_exit();
8c60f65311fa updated for version 7.0052
vimboss
parents: 169
diff changeset
209 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 * return non-zero if a character is available
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 ui_char_avail()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 gui_mch_update();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 return input_available();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 #ifndef NO_CONSOLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 # ifdef NO_CONSOLE_INPUT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 if (no_console_input())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 return mch_char_avail();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 * Delay for the given number of milliseconds. If ignoreinput is FALSE then we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 * cancel the delay if a key is hit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 ui_delay(msec, ignoreinput)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 long msec;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 int ignoreinput;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 if (gui.in_use && !ignoreinput)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 gui_wait_for_chars(msec);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 mch_delay(msec, ignoreinput);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 * If the machine has job control, use it to suspend the program,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 * otherwise fake it by starting a new shell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 * When running the GUI iconify the window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 ui_suspend()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 gui_mch_iconify();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 mch_suspend();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 #if !defined(UNIX) || !defined(SIGTSTP) || defined(PROTO) || defined(__BEOS__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 * When the OS can't really suspend, call this function to start a shell.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 * This is never called in the GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 suspend_shell()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 if (*p_sh == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 EMSG(_(e_shellempty));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 MSG_PUTS(_("new shell started\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 do_shell(NULL, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 * Try to get the current Vim shell size. Put the result in Rows and Columns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 * Use the new sizes as defaults for 'columns' and 'lines'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 * Return OK when size could be determined, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 ui_get_shellsize()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 retval = gui_get_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 retval = mch_get_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 check_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 /* adjust the default for 'lines' and 'columns' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 if (retval == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 set_number_default("lines", Rows);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 set_number_default("columns", Columns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 * Set the size of the Vim shell according to Rows and Columns, if possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 * The gui_set_shellsize() or mch_set_shellsize() function will try to set the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 * new size. If this is not possible, it will adjust Rows and Columns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 ui_set_shellsize(mustset)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
325 int mustset UNUSED; /* set by the user */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 gui_set_shellsize(mustset,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 TRUE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 # endif
814
f40f1a8520ff updated for version 7.0c01
vimboss
parents: 791
diff changeset
335 , RESIZE_BOTH);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 mch_set_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 * Called when Rows and/or Columns changed. Adjust scroll region and mouse
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 * region.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 ui_new_shellsize()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 if (full_screen && !exiting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 gui_new_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
353 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 mch_new_shellsize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
357 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 ui_breakcheck()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 gui_mch_update();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 mch_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 * Functions for copying and pasting text between applications.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 * This is always included in a GUI version, but may also be included when the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 * clipboard and mouse is available to a terminal version such as xterm.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 * Note: there are some more functions in ops.c that handle selection stuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 * Also note that the majority of functions here deal with the X 'primary'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 * (visible - for Visual mode use) selection, and only that. There are no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 * versions of these for the 'clipboard' selection, as Visual mode has no use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 * for them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 #if defined(FEAT_CLIPBOARD) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 * Selection stuff using Visual mode, for cutting and pasting text to other
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 * windows.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 * Call this to initialise the clipboard. Pass it FALSE if the clipboard code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 * is included, but the clipboard can not be used, or TRUE if the clipboard can
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 * be used. Eg unix may call this with FALSE, then call it again with TRUE if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 * the GUI starts.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 clip_init(can_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 int can_use;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 VimClipboard *cb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 cb = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 cb->available = can_use;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 cb->owned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 cb->start.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 cb->start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 cb->end.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 cb->end.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 cb->state = SELECT_CLEARED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 if (cb == &clip_plus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 cb = &clip_plus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 * Check whether the VIsual area has changed, and if so try to become the owner
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 * of the selection, and free any old converted selection we may still have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 * lying around. If the VIsual mode has ended, make a copy of what was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 * selected so we can still give it to others. Will probably have to make sure
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 * this is called whenever VIsual mode is ended.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 clip_update_selection()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 pos_T start, end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 /* If visual mode is only due to a redo command ("."), then ignore it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 if (!redo_VIsual_busy && VIsual_active && (State & NORMAL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 if (lt(VIsual, curwin->w_cursor))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 start = VIsual;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 end = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 if (has_mbyte)
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 415
diff changeset
439 end.col += (*mb_ptr2len)(ml_get_cursor()) - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 start = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 end = VIsual;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 if (!equalpos(clip_star.start, start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 || !equalpos(clip_star.end, end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 || clip_star.vmode != VIsual_mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 clip_clear_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 clip_star.start = start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 clip_star.end = end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 clip_star.vmode = VIsual_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 clip_free_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 clip_own_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 clip_gen_set_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 clip_own_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 * Also want to check somehow that we are reading from the keyboard rather
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 * than a mapping etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 */
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
470 #ifdef FEAT_X11
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
471 /* Always own the selection, we might have lost it without being
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
472 * notified. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
473 if (cbd->available)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 {
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
475 int was_owned = cbd->owned;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
476
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 cbd->owned = (clip_gen_own_selection(cbd) == OK);
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
478 if (!was_owned && cbd == &clip_star)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 {
620
9e359e5759f6 updated for version 7.0177
vimboss
parents: 575
diff changeset
480 /* May have to show a different kind of highlighting for the
9e359e5759f6 updated for version 7.0177
vimboss
parents: 575
diff changeset
481 * selected area. There is no specific redraw command for this,
9e359e5759f6 updated for version 7.0177
vimboss
parents: 575
diff changeset
482 * just redraw all windows on the current buffer. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 if (cbd->owned
791
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
484 && (get_real_state() == VISUAL
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
485 || get_real_state() == SELECTMODE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 && clip_isautosel()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 && hl_attr(HLF_V) != hl_attr(HLF_VNC))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 redraw_curbuf_later(INVERTED_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 }
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
490 }
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
491 #else
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
492 /* Only own the clibpard when we didn't own it yet. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
493 if (!cbd->owned && cbd->available)
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
494 cbd->owned = (clip_gen_own_selection(cbd) == OK);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 clip_lose_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 int was_owned = cbd->owned;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 int visual_selection = (cbd == &clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 clip_free_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 cbd->owned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 if (visual_selection)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 clip_clear_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 clip_gen_lose_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 if (visual_selection)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 /* May have to show a different kind of highlighting for the selected
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 * area. There is no specific redraw command for this, just redraw all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 * windows on the current buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 if (was_owned
791
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
519 && (get_real_state() == VISUAL
98a88a884610 updated for version 7.0230
vimboss
parents: 761
diff changeset
520 || get_real_state() == SELECTMODE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 && clip_isautosel()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 && hl_attr(HLF_V) != hl_attr(HLF_VNC))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 update_curbuf(INVERTED_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 cursor_on();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 gui_update_cursor(TRUE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 clip_copy_selection()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 if (VIsual_active && (State & NORMAL) && clip_star.available)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 if (clip_isautosel())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 clip_update_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 clip_free_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 clip_own_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 if (clip_star.owned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 clip_get_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 clip_gen_set_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 * Called when Visual mode is ended: update the selection.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 clip_auto_select()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 if (clip_isautosel())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 clip_copy_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 * Return TRUE if automatic selection of Visual area is desired.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 clip_isautosel()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 return (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 clip_autoselect);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 * Stuff for general mouse selection, without using Visual mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 static int clip_compare_pos __ARGS((int row1, int col1, int row2, int col2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 static void clip_invert_area __ARGS((int, int, int, int, int how));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 static void clip_invert_rectangle __ARGS((int row, int col, int height, int width, int invert));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 static void clip_get_word_boundaries __ARGS((VimClipboard *, int, int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 static int clip_get_line_end __ARGS((int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 static void clip_update_modeless_selection __ARGS((VimClipboard *, int, int,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 int, int));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 /* flags for clip_invert_area() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 #define CLIP_CLEAR 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 #define CLIP_SET 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 #define CLIP_TOGGLE 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 * Start, continue or end a modeless selection. Used when editing the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 * command-line and in the cmdline window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 clip_modeless(button, is_click, is_drag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 int button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 int is_click;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 int is_drag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 int repeat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 repeat = ((clip_star.mode == SELECT_MODE_CHAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 || clip_star.mode == SELECT_MODE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 && (mod_mask & MOD_MASK_2CLICK))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 || (clip_star.mode == SELECT_MODE_WORD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 && (mod_mask & MOD_MASK_3CLICK));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 if (is_click && button == MOUSE_RIGHT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 /* Right mouse button: If there was no selection, start one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 * Otherwise extend the existing selection. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 if (clip_star.state == SELECT_CLEARED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 clip_start_selection(mouse_col, mouse_row, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616 clip_process_selection(button, mouse_col, mouse_row, repeat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 else if (is_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 clip_start_selection(mouse_col, mouse_row, repeat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 else if (is_drag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 /* Don't try extending a selection if there isn't one. Happens when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 * button-down is in the cmdline and them moving mouse upwards. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 if (clip_star.state != SELECT_CLEARED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 clip_process_selection(button, mouse_col, mouse_row, repeat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 else /* release */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 clip_process_selection(MOUSE_RELEASE, mouse_col, mouse_row, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 * Compare two screen positions ala strcmp()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 clip_compare_pos(row1, col1, row2, col2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 int row1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 int col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 int row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 int col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 if (row1 > row2) return(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 if (row1 < row2) return(-1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 if (col1 > col2) return(1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 if (col1 < col2) return(-1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 return(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 * Start the selection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 clip_start_selection(col, row, repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 int repeated_click;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 VimClipboard *cb = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 if (cb->state == SELECT_DONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 clip_clear_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 row = check_row(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 col = check_col(col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 col = mb_fix_col(col, row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 cb->start.lnum = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 cb->start.col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 cb->end = cb->start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 cb->origin_row = (short_u)cb->start.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 cb->state = SELECT_IN_PROGRESS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 if (repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 if (++cb->mode > SELECT_MODE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 cb->mode = SELECT_MODE_CHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 cb->mode = SELECT_MODE_CHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 /* clear the cursor until the selection is made */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 gui_undraw_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 switch (cb->mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 case SELECT_MODE_CHAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 cb->origin_start_col = cb->start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 cb->word_end_col = clip_get_line_end((int)cb->start.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 case SELECT_MODE_WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 clip_get_word_boundaries(cb, (int)cb->start.lnum, cb->start.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 cb->origin_start_col = cb->word_start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 cb->origin_end_col = cb->word_end_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 clip_invert_area((int)cb->start.lnum, cb->word_start_col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 (int)cb->end.lnum, cb->word_end_col, CLIP_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 cb->start.col = cb->word_start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 cb->end.col = cb->word_end_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 case SELECT_MODE_LINE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
707 clip_invert_area((int)cb->start.lnum, 0, (int)cb->start.lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
708 (int)Columns, CLIP_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 cb->start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 cb->end.col = Columns;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 cb->prev = cb->start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 #ifdef DEBUG_SELECTION
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 printf("Selection started at (%u,%u)\n", cb->start.lnum, cb->start.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 * Continue processing the selection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 clip_process_selection(button, col, row, repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 int button;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 int_u repeated_click;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 VimClipboard *cb = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 int diff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 int slen = 1; /* cursor shape width */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 if (button == MOUSE_RELEASE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 /* Check to make sure we have something selected */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 if (cb->start.lnum == cb->end.lnum && cb->start.col == cb->end.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 gui_update_cursor(FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 cb->state = SELECT_CLEARED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 #ifdef DEBUG_SELECTION
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 cb->start.col, cb->end.lnum, cb->end.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 if (clip_isautosel()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 || (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 clip_autoselectml))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 clip_copy_modeless_selection(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 gui_update_cursor(FALSE, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 cb->state = SELECT_DONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 row = check_row(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 col = check_col(col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 col = mb_fix_col(col, row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 if (col == (int)cb->prev.col && row == cb->prev.lnum && !repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 * When extending the selection with the right mouse button, swap the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 * start and end if the position is before half the selection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 if (cb->state == SELECT_DONE && button == MOUSE_RIGHT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 * If the click is before the start, or the click is inside the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 * selection and the start is the closest side, set the origin to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 * end of the selection.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 if (clip_compare_pos(row, col, (int)cb->start.lnum, cb->start.col) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 || (clip_compare_pos(row, col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 (int)cb->end.lnum, cb->end.col) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 && (((cb->start.lnum == cb->end.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 && cb->end.col - col > col - cb->start.col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 || ((diff = (cb->end.lnum - row) -
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 (row - cb->start.lnum)) > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 || (diff == 0 && col < (int)(cb->start.col +
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 cb->end.col) / 2)))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 cb->origin_row = (short_u)cb->end.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 cb->origin_start_col = cb->end.col - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 cb->origin_end_col = cb->end.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 cb->origin_row = (short_u)cb->start.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 cb->origin_start_col = cb->start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 cb->origin_end_col = cb->start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 if (cb->mode == SELECT_MODE_WORD && !repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 cb->mode = SELECT_MODE_CHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 /* set state, for when using the right mouse button */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 cb->state = SELECT_IN_PROGRESS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 #ifdef DEBUG_SELECTION
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816 printf("Selection extending to (%d,%d)\n", row, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 if (repeated_click && ++cb->mode > SELECT_MODE_LINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 cb->mode = SELECT_MODE_CHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 switch (cb->mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 case SELECT_MODE_CHAR:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 /* If we're on a different line, find where the line ends */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 if (row != cb->prev.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 cb->word_end_col = clip_get_line_end(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 /* See if we are before or after the origin of the selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 if (clip_compare_pos(row, col, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 cb->origin_start_col) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 if (col >= (int)cb->word_end_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 clip_update_modeless_selection(cb, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 cb->origin_start_col, row, (int)Columns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 if (has_mbyte && mb_lefthalve(row, col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 slen = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 clip_update_modeless_selection(cb, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 cb->origin_start_col, row, col + slen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 if (has_mbyte
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 && mb_lefthalve(cb->origin_row, cb->origin_start_col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 slen = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853 if (col >= (int)cb->word_end_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 clip_update_modeless_selection(cb, row, cb->word_end_col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 cb->origin_row, cb->origin_start_col + slen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 clip_update_modeless_selection(cb, row, col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 cb->origin_row, cb->origin_start_col + slen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 case SELECT_MODE_WORD:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 /* If we are still within the same word, do nothing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 if (row == cb->prev.lnum && col >= (int)cb->word_start_col
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 && col < (int)cb->word_end_col && !repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 /* Get new word boundaries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 clip_get_word_boundaries(cb, row, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 /* Handle being after the origin point of selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
872 if (clip_compare_pos(row, col, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 cb->origin_start_col) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874 clip_update_modeless_selection(cb, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 cb->origin_start_col, row, cb->word_end_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 clip_update_modeless_selection(cb, row, cb->word_start_col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 cb->origin_row, cb->origin_end_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 case SELECT_MODE_LINE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 if (row == cb->prev.lnum && !repeated_click)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 if (clip_compare_pos(row, col, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 cb->origin_start_col) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 clip_update_modeless_selection(cb, cb->origin_row, 0, row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 (int)Columns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 clip_update_modeless_selection(cb, row, 0, cb->origin_row,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 (int)Columns);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 cb->prev.lnum = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 cb->prev.col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 #ifdef DEBUG_SELECTION
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 printf("Selection is: (%u,%u) to (%u,%u)\n", cb->start.lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 cb->start.col, cb->end.lnum, cb->end.col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 #if 0 /* not used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 * Called after an Expose event to redraw the selection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 clip_redraw_selection(x, y, w, h)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 int x;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 int y;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 int w;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 int h;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 VimClipboard *cb = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 int row1, col1, row2, col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
918 int start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 int end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 if (cb->state == SELECT_CLEARED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 row1 = check_row(Y_2_ROW(y));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 col1 = check_col(X_2_COL(x));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 row2 = check_row(Y_2_ROW(y + h - 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 col2 = check_col(X_2_COL(x + w - 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 /* Limit the rows that need to be re-drawn */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 if (cb->start.lnum > row1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 row1 = cb->start.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 if (cb->end.lnum < row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 row2 = cb->end.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 /* Look at each row that might need to be re-drawn */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 for (row = row1; row <= row2; row++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 /* For the first selection row, use the starting selection column */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 if (row == cb->start.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 start = cb->start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 start = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 /* For the last selection row, use the ending selection column */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 if (row == cb->end.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 end = cb->end.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 end = Columns;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 if (col1 > start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 start = col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 if (col2 < end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 end = col2 + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 if (end > start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 gui_mch_invert_rectangle(row, start, 1, end - start);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 # if defined(FEAT_GUI) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 * Redraw part of the selection if character at "row,col" is inside of it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 * Only used for the GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 clip_may_redraw_selection(row, col, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 int row, col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 int start = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 int end = col + len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 if (clip_star.state != SELECT_CLEARED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 && row >= clip_star.start.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 && row <= clip_star.end.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 if (row == clip_star.start.lnum && start < (int)clip_star.start.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 start = clip_star.start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 if (row == clip_star.end.lnum && end > (int)clip_star.end.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 end = clip_star.end.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 if (end > start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 clip_invert_area(row, start, row, end, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 * Called from outside to clear selected region from the display
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993 clip_clear_selection()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 VimClipboard *cb = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 if (cb->state == SELECT_CLEARED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 clip_invert_area((int)cb->start.lnum, cb->start.col, (int)cb->end.lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 cb->end.col, CLIP_CLEAR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 cb->state = SELECT_CLEARED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 }
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 * Clear the selection if any lines from "row1" to "row2" are inside of it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 clip_may_clear_selection(row1, row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 int row1, row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 if (clip_star.state == SELECT_DONE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 && row2 >= clip_star.start.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 && row1 <= clip_star.end.lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 clip_clear_selection();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 * Called before the screen is scrolled up or down. Adjusts the line numbers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 * of the selection. Call with big number when clearing the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 clip_scroll_selection(rows)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 int rows; /* negative for scroll down */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 int lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 if (clip_star.state == SELECT_CLEARED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 lnum = clip_star.start.lnum - rows;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 if (lnum <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 clip_star.start.lnum = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 else if (lnum >= screen_Rows) /* scrolled off of the screen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 clip_star.state = SELECT_CLEARED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 clip_star.start.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 lnum = clip_star.end.lnum - rows;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 if (lnum < 0) /* scrolled off of the screen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 clip_star.state = SELECT_CLEARED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 else if (lnum >= screen_Rows)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 clip_star.end.lnum = screen_Rows - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 clip_star.end.lnum = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 * Invert a region of the display between a starting and ending row and column
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 * Values for "how":
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 * CLIP_CLEAR: undo inversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 * CLIP_SET: set inversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 * CLIP_TOGGLE: set inversion if pos1 < pos2, undo inversion otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 * 0: invert (GUI only).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 clip_invert_area(row1, col1, row2, col2, how)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 int row1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 int col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 int row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 int col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 int how;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 int invert = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 if (how == CLIP_SET)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 invert = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 /* Swap the from and to positions so the from is always before */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 if (clip_compare_pos(row1, col1, row2, col2) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 int tmp_row, tmp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 tmp_row = row1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 tmp_col = col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 row1 = row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 col1 = col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 row2 = tmp_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 col2 = tmp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 else if (how == CLIP_TOGGLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 invert = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 /* If all on the same line, do it the easy way */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 if (row1 == row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 clip_invert_rectangle(row1, col1, 1, col2 - col1, invert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 /* Handle a piece of the first line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 if (col1 > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 clip_invert_rectangle(row1, col1, 1, (int)Columns - col1, invert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 row1++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 /* Handle a piece of the last line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 if (col2 < Columns - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 clip_invert_rectangle(row2, 0, 1, col2, invert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 row2--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 /* Handle the rectangle thats left */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 if (row2 >= row1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 clip_invert_rectangle(row1, 0, row2 - row1 + 1, (int)Columns,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 invert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 * Invert or un-invert a rectangle of the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 * "invert" is true if the result is inverted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 clip_invert_rectangle(row, col, height, width, invert)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 int height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 int width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 int invert;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 gui_mch_invert_rectangle(row, col, height, width);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 screen_draw_rectangle(row, col, height, width, invert);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 * Copy the currently selected area into the '*' register so it will be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 * available for pasting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 * When "both" is TRUE also copy to the '+' register.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 clip_copy_modeless_selection(both)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
1139 int both UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 char_u *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 char_u *bufp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 int start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 int end_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 int line_end_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 int add_newline_flag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 int row1 = clip_star.start.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 int col1 = clip_star.start.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 int row2 = clip_star.end.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 int col2 = clip_star.end.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1157 /* Can't use ScreenLines unless initialized */
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1158 if (ScreenLines == NULL)
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1159 return;
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1160
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 * Make sure row1 <= row2, and if row1 == row2 that col1 <= col2.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 if (row1 > row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 row = row1; row1 = row2; row2 = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167 row = col1; col1 = col2; col2 = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 else if (row1 == row2 && col1 > col2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 row = col1; col1 = col2; col2 = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 /* correct starting point for being on right halve of double-wide char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 p = ScreenLines + LineOffset[row1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 if (enc_dbcs != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 col1 -= (*mb_head_off)(p, p + col1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178 else if (enc_utf8 && p[col1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 --col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182 /* Create a temporary buffer for storing the text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 len = (row2 - row1 + 1) * Columns + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1185 if (enc_dbcs != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 len *= 2; /* max. 2 bytes per display cell */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187 else if (enc_utf8)
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 667
diff changeset
1188 len *= MB_MAXBYTES;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190 buffer = lalloc((long_u)len, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 if (buffer == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 /* Process each row in the selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 for (bufp = buffer, row = row1; row <= row2; row++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 if (row == row1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 start_col = col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 start_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202 if (row == row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 end_col = col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 end_col = Columns;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 line_end_col = clip_get_line_end(row);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 /* See if we need to nuke some trailing whitespace */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 if (end_col >= Columns && (row < row2 || end_col > line_end_col))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 /* Get rid of trailing whitespace */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 end_col = line_end_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 if (end_col < start_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 end_col = start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 /* If the last line extended to the end, add an extra newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 if (row == row2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 add_newline_flag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 /* If after the first row, we need to always add a newline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 if (row > row1 && !LineWraps[row - 1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 *bufp++ = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 if (row < screen_Rows && end_col <= screen_Columns)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 if (enc_dbcs != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 {
944
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 814
diff changeset
1231 int i;
b2dcb8457067 updated for version 7.0-070
vimboss
parents: 814
diff changeset
1232
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 p = ScreenLines + LineOffset[row];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 for (i = start_col; i < end_col; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 if (enc_dbcs == DBCS_JPNU && p[i] == 0x8e)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 /* single-width double-byte char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 *bufp++ = 0x8e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 *bufp++ = ScreenLines2[LineOffset[row] + i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 *bufp++ = p[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 if (MB_BYTE2LEN(p[i]) == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 *bufp++ = p[++i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 else if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 int off;
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 667
diff changeset
1251 int i;
761
6252da4e8223 updated for version 7.0224
vimboss
parents: 714
diff changeset
1252 int ci;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 off = LineOffset[row];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 for (i = start_col; i < end_col; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 /* The base character is either in ScreenLinesUC[] or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 * ScreenLines[]. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 if (ScreenLinesUC[off + i] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 *bufp++ = ScreenLines[off + i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 bufp += utf_char2bytes(ScreenLinesUC[off + i], bufp);
761
6252da4e8223 updated for version 7.0224
vimboss
parents: 714
diff changeset
1264 for (ci = 0; ci < Screen_mco; ++ci)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 {
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 667
diff changeset
1266 /* Add a composing character. */
761
6252da4e8223 updated for version 7.0224
vimboss
parents: 714
diff changeset
1267 if (ScreenLinesC[ci][off + i] == 0)
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 667
diff changeset
1268 break;
761
6252da4e8223 updated for version 7.0224
vimboss
parents: 714
diff changeset
1269 bufp += utf_char2bytes(ScreenLinesC[ci][off + i],
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 bufp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 /* Skip right halve of double-wide character. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 if (ScreenLines[off + i + 1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 ++i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 STRNCPY(bufp, ScreenLines + LineOffset[row] + start_col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 end_col - start_col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 bufp += end_col - start_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 /* Add a newline at the end if the selection ended there */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 if (add_newline_flag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 *bufp++ = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 /* First cleanup any old selection and become the owner. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 clip_free_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 clip_own_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 /* Yank the text into the '*' register. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 clip_yank_selection(MCHAR, buffer, (long)(bufp - buffer), &clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 /* Make the register contents available to the outside world. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 clip_gen_set_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 #ifdef FEAT_X11
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 if (both)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 /* Do the same for the '+' register. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 clip_free_selection(&clip_plus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 clip_own_selection(&clip_plus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 clip_yank_selection(MCHAR, buffer, (long)(bufp - buffer), &clip_plus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 clip_gen_set_selection(&clip_plus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 * Find the starting and ending positions of the word at the given row and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 * column. Only white-separated words are recognized here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 #define CHAR_CLASS(c) (c <= ' ' ? ' ' : vim_iswordc(c))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 clip_get_word_boundaries(cb, row, col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 VimClipboard *cb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 int start_class;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 int temp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 int mboff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1334 if (row >= screen_Rows || col >= screen_Columns || ScreenLines == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 p = ScreenLines + LineOffset[row];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 /* Correct for starting in the right halve of a double-wide char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 if (enc_dbcs != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 col -= dbcs_screen_head_off(p, p + col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 else if (enc_utf8 && p[col] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 --col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 start_class = CHAR_CLASS(p[col]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 temp_col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 for ( ; temp_col > 0; temp_col--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 if (enc_dbcs != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 && (mboff = dbcs_screen_head_off(p, p + temp_col - 1)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 temp_col -= mboff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 if (CHAR_CLASS(p[temp_col - 1]) != start_class
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 && !(enc_utf8 && p[temp_col - 1] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 cb->word_start_col = temp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 temp_col = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 for ( ; temp_col < screen_Columns; temp_col++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 if (enc_dbcs != 0 && dbcs_ptr2cells(p + temp_col) == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 ++temp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 if (CHAR_CLASS(p[temp_col]) != start_class
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 && !(enc_utf8 && p[temp_col] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 cb->word_end_col = temp_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 * Find the column position for the last non-whitespace character on the given
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 * line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1384 clip_get_line_end(row)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1386 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
1389 if (row >= screen_Rows || ScreenLines == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1391 for (i = screen_Columns; i > 0; i--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1392 if (ScreenLines[LineOffset[row] + i - 1] != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 * Update the currently selected region by adding and/or subtracting from the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 * beginning or end and inverting the changed area(s).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 clip_update_modeless_selection(cb, row1, col1, row2, col2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 VimClipboard *cb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 int row1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 int col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 int row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 int col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 /* See if we changed at the beginning of the selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 if (row1 != cb->start.lnum || col1 != (int)cb->start.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 clip_invert_area(row1, col1, (int)cb->start.lnum, cb->start.col,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 CLIP_TOGGLE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 cb->start.lnum = row1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 cb->start.col = col1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418 /* See if we changed at the end of the selection */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 if (row2 != cb->end.lnum || col2 != (int)cb->end.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 clip_invert_area((int)cb->end.lnum, cb->end.col, row2, col2,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422 CLIP_TOGGLE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 cb->end.lnum = row2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 cb->end.col = col2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429 clip_gen_own_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 return clip_mch_own_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 return clip_xterm_own_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 return clip_mch_own_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1442 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 clip_gen_lose_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 clip_mch_lose_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 clip_xterm_lose_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456 clip_mch_lose_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1457 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 clip_gen_set_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 clip_mch_set_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 clip_xterm_set_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 clip_mch_set_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 clip_gen_request_selection(cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 #ifdef FEAT_XCLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1482 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 clip_mch_request_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 clip_xterm_request_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 clip_mch_request_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 #endif /* FEAT_CLIPBOARD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 /*****************************************************************************
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 * Functions that handle the input buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 * This is used for any GUI version, and the unix terminal version.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 * For Unix, the input characters are buffered to be able to check for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 * CTRL-C. This should be done with signals, but I don't know how to do that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 * in a portable way for a tty in RAW mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 * For the client-server code in the console the received keys are put in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 * input buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 #if defined(USE_INPUT_BUF) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 * Internal typeahead buffer. Includes extra space for long key code
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 * descriptions which would otherwise overflow. The buffer is considered full
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 * when only this extra space (or part of it) remains.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 || defined(FEAT_CLIENTSERVER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 * Sun WorkShop and NetBeans stuff debugger commands into the input buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 * This requires a larger buffer...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 * (Madsen) Go with this for remote input as well ...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 # define INBUFLEN 4096
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 # define INBUFLEN 250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 static char_u inbuf[INBUFLEN + MAX_KEY_CODE_LEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 static int inbufcount = 0; /* number of chars in inbuf[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 * vim_is_input_buf_full(), vim_is_input_buf_empty(), add_to_input_buf(), and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 * trash_input_buf() are functions for manipulating the input buffer. These
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 * are used by the gui_* calls when a GUI is used to handle keyboard input.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 vim_is_input_buf_full()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 return (inbufcount >= INBUFLEN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 vim_is_input_buf_empty()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 return (inbufcount == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 #if defined(FEAT_OLE) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 vim_free_in_input_buf()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 return (INBUFLEN - inbufcount);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553
575
f1d46f948241 updated for version 7.0163
vimboss
parents: 534
diff changeset
1554 #if defined(FEAT_GUI_GTK) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 vim_used_in_input_buf()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 return inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562 #if defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1563 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 * Return the current contents of the input buffer and make it empty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 * The returned pointer must be passed to set_input_buf() later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 get_input_buf()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 garray_T *gap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 /* We use a growarray to store the data pointer and the length. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 gap = (garray_T *)alloc((unsigned)sizeof(garray_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 if (gap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 /* Add one to avoid a zero size. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 gap->ga_data = alloc((unsigned)inbufcount + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 if (gap->ga_data != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 mch_memmove(gap->ga_data, inbuf, (size_t)inbufcount);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 gap->ga_len = inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 trash_input_buf();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 return (char_u *)gap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 * Restore the input buffer with a pointer returned from get_input_buf().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 * The allocated memory is freed, this only works once!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 set_input_buf(p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 garray_T *gap = (garray_T *)p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 if (gap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 if (gap->ga_data != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 mch_memmove(inbuf, gap->ga_data, gap->ga_len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 inbufcount = gap->ga_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 vim_free(gap->ga_data);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 vim_free(gap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608
1621
82b5078be2dd updated for version 7.2a
vimboss
parents: 1364
diff changeset
1609 #if defined(FEAT_GUI) \
82b5078be2dd updated for version 7.2a
vimboss
parents: 1364
diff changeset
1610 || defined(FEAT_MOUSE_GPM) || defined(FEAT_SYSMOUSE) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 || defined(FEAT_XCLIPBOARD) || defined(VMS) \
666
0137e7c3d31b updated for version 7.0196
vimboss
parents: 642
diff changeset
1612 || defined(FEAT_SNIFF) || defined(FEAT_CLIENTSERVER) \
0137e7c3d31b updated for version 7.0196
vimboss
parents: 642
diff changeset
1613 || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 * Add the given bytes to the input buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 * Special keys start with CSI. A real CSI must have been translated to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 * CSI KS_EXTRA KE_CSI. K_SPECIAL doesn't require translation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 add_to_input_buf(s, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 if (inbufcount + len > INBUFLEN + MAX_KEY_CODE_LEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 return; /* Shouldn't ever happen! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 #ifdef FEAT_HANGULIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 if ((State & (INSERT|CMDLINE)) && hangul_input_state_get())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 if ((len = hangul_input_process(s, len)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 while (len--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 inbuf[inbufcount++] = *s++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637
1364
9947133ce85b updated for version 7.1-078
vimboss
parents: 1226
diff changeset
1638 #if ((defined(FEAT_XIM) || defined(FEAT_DND)) && defined(FEAT_GUI_GTK)) \
9947133ce85b updated for version 7.1-078
vimboss
parents: 1226
diff changeset
1639 || defined(FEAT_GUI_MSWIN) \
9947133ce85b updated for version 7.1-078
vimboss
parents: 1226
diff changeset
1640 || defined(FEAT_GUI_MAC) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 || (defined(FEAT_MBYTE) && defined(FEAT_MBYTE_IME)) \
666
0137e7c3d31b updated for version 7.0196
vimboss
parents: 642
diff changeset
1642 || (defined(FEAT_GUI) && (!defined(USE_ON_FLY_SCROLL) \
0137e7c3d31b updated for version 7.0196
vimboss
parents: 642
diff changeset
1643 || defined(FEAT_MENU))) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1644 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 * Add "str[len]" to the input buffer while escaping CSI bytes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 add_to_input_buf_csi(char_u *str, int len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 char_u buf[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 for (i = 0; i < len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 add_to_input_buf(str + i, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 if (str[i] == CSI)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 /* Turn CSI into K_CSI. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 buf[0] = KS_EXTRA;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 buf[1] = (int)KE_CSI;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 add_to_input_buf(buf, 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 #if defined(FEAT_HANGULIN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 push_raw_key (s, len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 while (len--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 inbuf[inbufcount++] = *s++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 #if defined(FEAT_GUI) || defined(FEAT_EVAL) || defined(FEAT_EX_EXTRA) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 /* Remove everything from the input buffer. Called when ^C is found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 trash_input_buf()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 inbufcount = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 * Read as much data from the input buffer as possible up to maxlen, and store
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 * it in buf.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 * Note: this function used to be Read() in unix.c
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 read_from_input_buf(buf, maxlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 long maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 if (inbufcount == 0) /* if the buffer is empty, fill it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 fill_input_buf(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 if (maxlen > inbufcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 maxlen = inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 mch_memmove(buf, inbuf, (size_t)maxlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 inbufcount -= maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 if (inbufcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 mch_memmove(inbuf, inbuf + maxlen, (size_t)inbufcount);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 return (int)maxlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 fill_input_buf(exit_on_error)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
1712 int exit_on_error UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1714 #if defined(UNIX) || defined(OS2) || defined(VMS) || defined(MACOS_X_UNIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1715 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1716 int try;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 static int did_read_something = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1718 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1719 static char_u *rest = NULL; /* unconverted rest of previous read */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1720 static int restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1721 int unconverted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1722 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1723 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1725 #ifdef FEAT_GUI
294
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1726 if (gui.in_use
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1727 # ifdef NO_CONSOLE_INPUT
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1728 /* Don't use the GUI input when the window hasn't been opened yet.
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1729 * We get here from ui_inchar() when we should try reading from stdin. */
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1730 && !no_console_input()
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1731 # endif
1c1cbdc42f75 updated for version 7.0077
vimboss
parents: 274
diff changeset
1732 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1733 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1734 gui_mch_update();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1735 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1736 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1737 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1738 #if defined(UNIX) || defined(OS2) || defined(VMS) || defined(MACOS_X_UNIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1739 if (vim_is_input_buf_full())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 * Fill_input_buf() is only called when we really need a character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 * If we can't get any, but there is some in the buffer, just return.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 * If we can't get any, and there isn't any in the buffer, we give up and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 * exit Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 # ifdef __BEOS__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 * On the BeBox version (for now), all input is secretly performed within
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 * beos_select() which is called from RealWaitForChar().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 while (!vim_is_input_buf_full() && RealWaitForChar(read_cmd_fd, 0, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 len = inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 inbufcount = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 # ifdef FEAT_SNIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 if (sniff_request_waiting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 add_to_input_buf((char_u *)"\233sniff",6); /* results in K_SNIFF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 sniff_request_waiting = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 want_sniff_request = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 if (rest != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771 /* Use remainder of previous call, starts with an invalid character
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 * that may become valid when reading more. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 if (restlen > INBUFLEN - inbufcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 unconverted = INBUFLEN - inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 unconverted = restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 mch_memmove(inbuf + inbufcount, rest, unconverted);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 if (unconverted == restlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 vim_free(rest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 rest = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 restlen -= unconverted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 mch_memmove(rest, rest + unconverted, restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 inbufcount += unconverted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 unconverted = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 len = 0; /* to avoid gcc warning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 for (try = 0; try < 100; ++try)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 # ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 len = vms_read(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 len = read(read_cmd_fd,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 (char *)inbuf + inbufcount, (size_t)((INBUFLEN - inbufcount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 / input_conv.vc_factor
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 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 ) /* avoid syntax highlight error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 # endif
169
0e902b8f511f updated for version 7.0051
vimboss
parents: 39
diff changeset
1810
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 if (len > 0 || got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 * If reading stdin results in an error, continue reading stderr.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 * This helps when using "foo | xargs vim".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 if (!did_read_something && !isatty(read_cmd_fd) && read_cmd_fd == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 int m = cur_tmode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 /* We probably set the wrong file descriptor to raw mode. Switch
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 * back to cooked mode, use another descriptor and set the mode to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 * what it was. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 settmode(TMODE_COOK);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 #ifdef HAVE_DUP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 /* Use stderr for stdin, also works for shell commands. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 close(0);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1719
diff changeset
1828 ignored = dup(2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 read_cmd_fd = 2; /* read from stderr instead of stdin */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 settmode(m);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 if (!exit_on_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 if (len <= 0 && !got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 read_error_exit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 if (len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 did_read_something = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 /* Interrupted, pretend a CTRL-C was typed. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 inbuf[0] = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 inbufcount = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 * May perform conversion on the input characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 * Include the unconverted rest of the previous call.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 * If there is an incomplete char at the end it is kept for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 * time, reading more bytes should make conversion possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 * Don't do this in the unlikely event that the input buffer is too
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 * small ("rest" still contains more bytes).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 if (input_conv.vc_type != CONV_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 inbufcount -= unconverted;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 len = convert_input_safe(inbuf + inbufcount,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 len + unconverted, INBUFLEN - inbufcount,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 rest == NULL ? &rest : NULL, &restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 while (len-- > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 * if a CTRL-C was typed, remove it from the buffer and set got_int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 if (inbuf[inbufcount] == 3 && ctrl_c_interrupts)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 /* remove everything typed before the CTRL-C */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 mch_memmove(inbuf, inbuf + inbufcount, (size_t)(len + 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 inbufcount = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 got_int = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 ++inbufcount;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 #endif /* UNIX or OS2 or VMS*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 #endif /* defined(UNIX) || defined(FEAT_GUI) || defined(OS2) || defined(VMS) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 * Exit because of an input read error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 read_error_exit()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 if (silent_mode) /* Normal way to exit for "ex -s" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 getout(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 STRCPY(IObuff, _("Vim: Error reading input, exiting...\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 preserve_exit();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 #if defined(CURSOR_SHAPE) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 * May update the shape of the cursor.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 ui_cursor_shape()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 gui_update_cursor_later();
36
125e80798a85 updated for version 7.0021
vimboss
parents: 11
diff changeset
1908 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 # endif
36
125e80798a85 updated for version 7.0021
vimboss
parents: 11
diff changeset
1910 term_cursor_shape();
125e80798a85 updated for version 7.0021
vimboss
parents: 11
diff changeset
1911
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 # ifdef MCH_CURSOR_SHAPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 mch_update_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 # endif
2378
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1915
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1916 # ifdef FEAT_CONCEAL
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1917 conceal_check_cursur_line_redraw();
85b7dc8da5eb Add the 'concealcursor' option to decide when the cursor line is to be
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1918 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 #if defined(FEAT_CLIPBOARD) || defined(FEAT_GUI) || defined(FEAT_RIGHTLEFT) \
1671
5d25cdc3c3f3 updated for version 7.2b-003
vimboss
parents: 1621
diff changeset
1923 || defined(FEAT_MBYTE) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 * Check bounds for column number
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 check_col(col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 int col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 if (col < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 if (col >= (int)screen_Columns)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 return (int)screen_Columns - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 return col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 * Check bounds for row number
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 check_row(row)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 int row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 if (row < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 if (row >= (int)screen_Rows)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 return (int)screen_Rows - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 return row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 * Stuff for the X clipboard. Shared between VMS and Unix.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 #if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 # include <X11/Xatom.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 # include <X11/Intrinsic.h>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 * Open the application context (if it hasn't been opened yet).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 * Used for Motif and Athena GUI and the xterm clipboard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 open_app_context()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 if (app_context == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 XtToolkitInitialize();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 app_context = XtCreateApplicationContext();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 static Atom vim_atom; /* Vim's own special selection format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 static Atom vimenc_atom; /* Vim's extended selection format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 static Atom compound_text_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 static Atom text_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 static Atom targets_atom;
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1982 static Atom timestamp_atom; /* Used to get a timestamp */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 x11_setup_atoms(dpy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 Display *dpy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 vim_atom = XInternAtom(dpy, VIM_ATOM_NAME, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 vimenc_atom = XInternAtom(dpy, VIMENC_ATOM_NAME,False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 compound_text_atom = XInternAtom(dpy, "COMPOUND_TEXT", False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 text_atom = XInternAtom(dpy, "TEXT", False);
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1994 targets_atom = XInternAtom(dpy, "TARGETS", False);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 clip_star.sel_atom = XA_PRIMARY;
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1996 clip_plus.sel_atom = XInternAtom(dpy, "CLIPBOARD", False);
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
1997 timestamp_atom = XInternAtom(dpy, "TIMESTAMP", False);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 * X Selection stuff, for cutting and pasting text to other windows.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2004 static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *));
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2005
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2006 static void clip_x11_lose_ownership_cb __ARGS((Widget, Atom *));
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2007
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2008 static void clip_x11_timestamp_cb __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont));
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2009
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2010 /*
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2011 * Property callback to get a timestamp for XtOwnSelection.
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2012 */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2013 static void
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2014 clip_x11_timestamp_cb(w, n, event, cont)
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2015 Widget w;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2016 XtPointer n UNUSED;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2017 XEvent *event;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2018 Boolean *cont UNUSED;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2019 {
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2020 Atom actual_type;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2021 int format;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2022 unsigned long nitems, bytes_after;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2023 unsigned char *prop=NULL;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2024 XPropertyEvent *xproperty=&event->xproperty;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2025
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2026 /* Must be a property notify, state can't be Delete (True), has to be
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2027 * one of the supported selection types. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2028 if (event->type != PropertyNotify || xproperty->state
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2029 || (xproperty->atom != clip_star.sel_atom
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2030 && xproperty->atom != clip_plus.sel_atom))
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2031 return;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2032
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2033 if (XGetWindowProperty(xproperty->display, xproperty->window,
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2034 xproperty->atom, 0, 0, False, timestamp_atom, &actual_type, &format,
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2035 &nitems, &bytes_after, &prop))
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2036 return;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2037
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2038 if (prop)
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2039 XFree(prop);
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2040
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2041 /* Make sure the property type is "TIMESTAMP" and it's 32 bits. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2042 if (actual_type != timestamp_atom || format != 32)
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2043 return;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2044
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2045 /* Get the selection, using the event timestamp. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2046 XtOwnSelection(w, xproperty->atom, xproperty->time,
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2047 clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb, NULL);
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2048 }
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2049
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2050 void
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2051 x11_setup_selection(w)
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2052 Widget w;
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2053 {
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2054 XtAddEventHandler(w, PropertyChangeMask, False,
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2055 /*(XtEventHandler)*/clip_x11_timestamp_cb, (XtPointer)NULL);
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2056 }
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2057
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 format)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
2063 Widget w UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 XtPointer success;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 Atom *sel_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 Atom *type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 XtPointer value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 long_u *length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 int *format;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 int motion_type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 long_u len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 char **text_list = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 char_u *tmpbuf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 if (*sel_atom == clip_plus.sel_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 cbd = &clip_plus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 cbd = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 if (value == NULL || *length == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 {
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2087 clip_free_selection(cbd); /* nothing received, clear register */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 *(int *)success = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 motion_type = MCHAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 p = (char_u *)value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 len = *length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094 if (*type == vim_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 motion_type = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 len--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 else if (*type == vimenc_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 char_u *enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 vimconv_T conv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105 int convlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 motion_type = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 enc = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 p += STRLEN(p) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 len -= p - enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 /* If the encoding of the text is different from 'encoding', attempt
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 * converting it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 conv.vc_type = CONV_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 convert_setup(&conv, enc, p_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 if (conv.vc_type != CONV_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 convlen = len; /* Need to use an int here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 tmpbuf = string_convert(&conv, p, &convlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 len = convlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 if (tmpbuf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 p = tmpbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 convert_setup(&conv, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 else if (*type == compound_text_atom || (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 enc_dbcs != 0 &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 *type == text_atom))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 XTextProperty text_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 int n_text = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 int status;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 text_prop.value = (unsigned char *)value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 text_prop.encoding = *type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 text_prop.format = *format;
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2143 text_prop.nitems = len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 &text_list, &n_text);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 if (status != Success || n_text < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 *(int *)success = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 p = (char_u *)text_list[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 len = STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 clip_yank_selection(motion_type, p, (long)len, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 if (text_list != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 XFreeStringList(text_list);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 vim_free(tmpbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 XtFree((char *)value);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 *(int *)success = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 clip_x11_request_selection(myShell, dpy, cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 Widget myShell;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 Display *dpy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 XEvent event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 Atom type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 static int success;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 int i;
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2175 time_t start_time;
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2176 int timed_out = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 for (i =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 ; i < 5; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 switch (i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 case 0: type = vimenc_atom; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 case 1: type = vim_atom; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 case 2: type = compound_text_atom; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 case 3: type = text_atom; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 default: type = XA_STRING;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 }
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2196 success = MAYBE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 XtGetSelectionValue(myShell, cbd->sel_atom, type,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 /* Make sure the request for the selection goes out before waiting for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 * a response. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 XFlush(dpy);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 * Wait for result of selection request, otherwise if we type more
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 * characters, then they will appear before the one that requested the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 * paste! Don't worry, we will catch up with any other events later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 */
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2209 start_time = time(NULL);
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2210 while (success == MAYBE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 {
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2212 if (XCheckTypedEvent(dpy, SelectionNotify, &event)
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2213 || XCheckTypedEvent(dpy, SelectionRequest, &event)
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2214 || XCheckTypedEvent(dpy, PropertyNotify, &event))
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2215 {
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2216 /* This is where clip_x11_request_selection_cb() should be
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2217 * called. It may actually happen a bit later, so we loop
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2218 * until "success" changes.
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2219 * We may get a SelectionRequest here and if we don't handle
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2220 * it we hang. KDE klipper does this, for example.
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2221 * We need to handle a PropertyNotify for large selections. */
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2222 XtDispatchEvent(&event);
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2223 continue;
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2224 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2226 /* Time out after 2 to 3 seconds to avoid that we hang when the
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2227 * other process doesn't respond. Note that the SelectionNotify
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2228 * event may still come later when the selection owner comes back
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2229 * to life and the text gets inserted unexpectedly. Don't know
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2230 * why that happens or how to avoid that :-(. */
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2231 if (time(NULL) > start_time + 2)
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2232 {
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2233 timed_out = TRUE;
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2234 break;
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2235 }
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2236
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 /* Do we need this? Probably not. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 XSync(dpy, False);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2240 /* Wait for 1 msec to avoid that we eat up all CPU time. */
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2241 ui_delay(1L, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243
1719
0670d0df210a updated for version 7.2-017
vimboss
parents: 1715
diff changeset
2244 if (success == TRUE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 return;
1715
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2246
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2247 /* don't do a retry with another type after timing out, otherwise we
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2248 * hang for 15 seconds. */
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2249 if (timed_out)
afb64d9f5b8e updated for version 7.2-013
vimboss
parents: 1671
diff changeset
2250 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 /* Final fallback position - use the X CUT_BUFFER0 store */
1924
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2254 yank_cut_buffer0(dpy, cbd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 static Boolean
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 clip_x11_convert_selection_cb(w, sel_atom, target, type, value, length, format)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
2259 Widget w UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 Atom *sel_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 Atom *target;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 Atom *type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 XtPointer *value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 long_u *length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 int *format;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 char_u *string;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 char_u *result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 int motion_type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 if (*sel_atom == clip_plus.sel_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 cbd = &clip_plus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 cbd = &clip_star;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 if (!cbd->owned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 return False; /* Shouldn't ever happen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281 /* requestor wants to know what target types we support */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 if (*target == targets_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284 Atom *array;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 if ((array = (Atom *)XtMalloc((unsigned)(sizeof(Atom) * 6))) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 return False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 *value = (XtPointer)array;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2290 array[i++] = XA_STRING;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 array[i++] = targets_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 array[i++] = vimenc_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 array[i++] = vim_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 array[i++] = text_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 array[i++] = compound_text_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 *type = XA_ATOM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 /* This used to be: *format = sizeof(Atom) * 8; but that caused
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 * crashes on 64 bit machines. (Peter Derr) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 *format = 32;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 *length = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303 return True;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 if ( *target != XA_STRING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 && *target != vimenc_atom
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 && *target != vim_atom
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 && *target != text_atom
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 && *target != compound_text_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 return False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 clip_get_selection(cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 motion_type = clip_convert_selection(&string, length, cbd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 if (motion_type < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 return False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 /* For our own format, the first byte contains the motion type */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 if (*target == vim_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 (*length)++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 /* Our own format with encoding: motion 'encoding' NUL text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 if (*target == vimenc_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 *length += STRLEN(p_enc) + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 *value = XtMalloc((Cardinal)*length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 result = (char_u *)*value;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 if (result == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 vim_free(string);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335 return False;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 if (*target == XA_STRING)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 mch_memmove(result, string, (size_t)(*length));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 *type = XA_STRING;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 else if (*target == compound_text_atom
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 || *target == text_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 XTextProperty text_prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 char *string_nt = (char *)alloc((unsigned)*length + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 /* create NUL terminated string which XmbTextListToTextProperty wants */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 mch_memmove(string_nt, string, (size_t)*length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 string_nt[*length] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 XmbTextListToTextProperty(X_DISPLAY, (char **)&string_nt, 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 XCompoundTextStyle, &text_prop);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 vim_free(string_nt);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 XtFree(*value); /* replace with COMPOUND text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 *value = (XtPointer)(text_prop.value); /* from plain text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 *length = text_prop.nitems;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 *type = compound_text_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 else if (*target == vimenc_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 int l = STRLEN(p_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 result[0] = motion_type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 STRCPY(result + 1, p_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 mch_memmove(result + l + 2, string, (size_t)(*length - l - 2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 *type = vimenc_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 result[0] = motion_type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 mch_memmove(result + 1, string, (size_t)(*length - 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 *type = vim_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 *format = 8; /* 8 bits per char */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 vim_free(string);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381 return True;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 clip_x11_lose_ownership_cb(w, sel_atom)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
2386 Widget w UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 Atom *sel_atom;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 if (*sel_atom == clip_plus.sel_atom)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 clip_lose_selection(&clip_plus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 clip_lose_selection(&clip_star);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 clip_x11_lose_selection(myShell, cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 Widget myShell;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 XtDisownSelection(myShell, cbd->sel_atom, CurrentTime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 clip_x11_own_selection(myShell, cbd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 Widget myShell;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 VimClipboard *cbd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 {
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2408 /* Get the time by a zero-length append, clip_x11_timestamp_cb will be
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2409 * called with the current timestamp. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2410 if (!XChangeProperty(XtDisplay(myShell), XtWindow(myShell), cbd->sel_atom,
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2411 timestamp_atom, 32, PropModeAppend, NULL, 0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 return FAIL;
2270
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2413 /* Flush is required in a terminal as nothing else is doing it. */
917fff7bc09d Fixes for time in clipboard request. Also fix ownership. (David Fries)
Bram Moolenaar <bram@vim.org>
parents: 2250
diff changeset
2414 XFlush(XtDisplay(myShell));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 * Send the current selection to the clipboard. Do nothing for X because we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 * will fill in the selection only when requested by another app.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 clip_x11_set_selection(cbd)
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
2424 VimClipboard *cbd UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428
1924
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2429 #if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11) \
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2430 || defined(FEAT_GUI_GTK) || defined(PROTO)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2431 /*
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2432 * Get the contents of the X CUT_BUFFER0 and put it in "cbd".
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2433 */
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2434 void
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2435 yank_cut_buffer0(dpy, cbd)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2436 Display *dpy;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2437 VimClipboard *cbd;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2438 {
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2439 int nbytes = 0;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2440 char_u *buffer = (char_u *)XFetchBuffer(dpy, &nbytes, 0);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2441
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2442 if (nbytes > 0)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2443 {
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2444 #ifdef FEAT_MBYTE
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2445 int done = FALSE;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2446
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2447 /* CUT_BUFFER0 is supposed to be always latin1. Convert to 'enc' when
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2448 * using a multi-byte encoding. Conversion between two 8-bit
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2449 * character sets usually fails and the text might actually be in
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2450 * 'enc' anyway. */
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2451 if (has_mbyte)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2452 {
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 1961
diff changeset
2453 char_u *conv_buf;
1924
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2454 vimconv_T vc;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2455
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2456 vc.vc_type = CONV_NONE;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2457 if (convert_setup(&vc, (char_u *)"latin1", p_enc) == OK)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2458 {
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2459 conv_buf = string_convert(&vc, buffer, &nbytes);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2460 if (conv_buf != NULL)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2461 {
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2462 clip_yank_selection(MCHAR, conv_buf, (long)nbytes, cbd);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2463 vim_free(conv_buf);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2464 done = TRUE;
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2465 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2466 convert_setup(&vc, NULL, NULL);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2467 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2468 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2469 if (!done) /* use the text without conversion */
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2470 #endif
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2471 clip_yank_selection(MCHAR, buffer, (long)nbytes, cbd);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2472 XFree((void *)buffer);
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2473 if (p_verbose > 0)
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2474 {
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2475 verbose_enter();
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2476 verb_msg((char_u *)_("Used CUT_BUFFER0 instead of empty selection"));
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2477 verbose_leave();
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2478 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2479 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2480 }
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2481 #endif
75a69023117c updated for version 7.2-221
vimboss
parents: 1883
diff changeset
2482
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 #if defined(FEAT_MOUSE) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 * Move the cursor to the specified row and column on the screen.
1226
a49d06539452 updated for version 7.1b
vimboss
parents: 1164
diff changeset
2487 * Change current window if necessary. Returns an integer with the
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488 * CURSOR_MOVED bit set if the cursor has moved or unset otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 * The MOUSE_FOLD_CLOSE bit is set when clicked on the '-' in a fold column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 * The MOUSE_FOLD_OPEN bit is set when clicked on the '+' in a fold column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 * If flags has MOUSE_FOCUS, then the current window will not be changed, and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 * if the mouse is outside the window then the text will scroll, or if the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 * mouse was previously on a status line, then the status line may be dragged.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 * If flags has MOUSE_MAY_VIS, then VIsual mode will be started before the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 * cursor is moved unless the cursor was on a status line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 * This function returns one of IN_UNKNOWN, IN_BUFFER, IN_STATUS_LINE or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2500 * IN_SEP_LINE depending on where the cursor was clicked.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 * If flags has MOUSE_MAY_STOP_VIS, then Visual mode will be stopped, unless
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503 * the mouse is on the status line of the same window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 * If flags has MOUSE_DID_MOVE, nothing is done if the mouse didn't move since
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 * the last call.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 * If flags has MOUSE_SETPOS, nothing is done, only the current position is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 * remembered.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 jump_to_mouse(flags, inclusive, which_button)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 int *inclusive; /* used for inclusive operator, can be NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 int which_button; /* MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 static int on_status_line = 0; /* #lines below bottom of window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 static int on_sep_line = 0; /* on separator right of window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 static int prev_row = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 static int prev_col = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 static win_T *dragwin = NULL; /* window being dragged */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 static int did_drag = FALSE; /* drag was noticed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 win_T *wp, *old_curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 pos_T old_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 int first;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 int row = mouse_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531 int col = mouse_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 int mouse_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 mouse_past_bottom = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 mouse_past_eol = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 if (flags & MOUSE_RELEASED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 /* On button release we may change window focus if positioned on a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 * status line and no dragging happened. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 if (dragwin != NULL && !did_drag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 flags &= ~(MOUSE_FOCUS | MOUSE_DID_MOVE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 dragwin = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 did_drag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 if ((flags & MOUSE_DID_MOVE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 && prev_row == mouse_row
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551 && prev_col == mouse_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 retnomove:
1226
a49d06539452 updated for version 7.1b
vimboss
parents: 1164
diff changeset
2554 /* before moving the cursor for a left click which is NOT in a status
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 * line, stop Visual mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 if (on_status_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 return IN_STATUS_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 if (on_sep_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 return IN_SEP_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 if (flags & MOUSE_MAY_STOP_VIS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 end_visual_mode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 redraw_curbuf_later(INVERTED); /* delete the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 #if defined(FEAT_CMDWIN) && defined(FEAT_CLIPBOARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 /* Continue a modeless selection in another window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 if (cmdwin_type != 0 && row < W_WINROW(curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 return IN_OTHER_WIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2573 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 return IN_BUFFER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 prev_row = mouse_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 prev_col = mouse_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 if (flags & MOUSE_SETPOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 goto retnomove; /* ugly goto... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 /* Remember the character under the mouse, it might be a '-' or '+' in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 * fold column. */
534
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
2586 if (row >= 0 && row < Rows && col >= 0 && col <= Columns
c6296b0ad9ea updated for version 7.0151
vimboss
parents: 474
diff changeset
2587 && ScreenLines != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 mouse_char = ScreenLines[LineOffset[row] + col];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 mouse_char = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 old_curwin = curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 old_cursor = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 if (!(flags & MOUSE_FOCUS))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 if (row < 0 || col < 0) /* check if it makes sense */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 return IN_UNKNOWN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 /* find the window where the row is in */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 wp = mouse_find_win(&row, &col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 wp = firstwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 dragwin = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 * winpos and height may change in win_enter()!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 if (row >= wp->w_height) /* In (or below) status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 on_status_line = row - wp->w_height + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 dragwin = wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 on_status_line = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 if (col >= wp->w_width) /* In separator line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 on_sep_line = col - wp->w_width + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 dragwin = wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 on_sep_line = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 /* The rightmost character of the status line might be a vertical
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 * separator character if there is no connecting window to the right. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 if (on_status_line && on_sep_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 if (stl_connected(wp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 on_sep_line = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 on_status_line = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 /* Before jumping to another buffer, or moving the cursor for a left
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 * click, stop Visual mode. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 if (VIsual_active
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 && (wp->w_buffer != curwin->w_buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 || (!on_status_line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 # ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 && !on_sep_line
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 # ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 && (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 # ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 wp->w_p_rl ? col < W_WIDTH(wp) - wp->w_p_fdc :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 col >= wp->w_p_fdc
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 # ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 + (cmdwin_type == 0 && wp == curwin ? 0 : 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 && (flags & MOUSE_MAY_STOP_VIS))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 end_visual_mode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 redraw_curbuf_later(INVERTED); /* delete the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 #ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2665 if (cmdwin_type != 0 && wp != curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2666 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2667 /* A click outside the command-line window: Use modeless
2102
907cf09fbb32 updated for version 7.2.385
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
2668 * selection if possible. Allow dragging the status lines. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 # ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 on_sep_line = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672 # ifdef FEAT_CLIPBOARD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 if (on_status_line)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 return IN_STATUS_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 return IN_OTHER_WIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 row = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 col += wp->w_wincol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2679 wp = curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 /* Only change window focus when not clicking on or dragging the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 * status line. Do change focus when releasing the mouse button
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 * (MOUSE_FOCUS was set above if we dragged first). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 if (dragwin == NULL || (flags & MOUSE_RELEASED))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688 win_enter(wp, TRUE); /* can make wp invalid! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689 # ifdef CHECK_DOUBLE_CLICK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 /* set topline, to be able to check for double click ourselves */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 if (curwin != old_curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 set_mouse_topline(curwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 if (on_status_line) /* In (or below) status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 /* Don't use start_arrow() if we're in the same window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 if (curwin == old_curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 return IN_STATUS_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 return IN_STATUS_LINE | CURSOR_MOVED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 if (on_sep_line) /* In (or below) status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 /* Don't use start_arrow() if we're in the same window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 if (curwin == old_curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 return IN_SEP_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 return IN_SEP_LINE | CURSOR_MOVED;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 curwin->w_cursor.lnum = curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 /* remember topline, needed for double click */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717 gui_prev_topline = curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 # ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 gui_prev_topfill = curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 else if (on_status_line && which_button == MOUSE_LEFT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2726 if (dragwin != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 /* Drag the status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 count = row - dragwin->w_winrow - dragwin->w_height + 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 - on_status_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 win_drag_status_line(dragwin, count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732 did_drag |= count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 return IN_STATUS_LINE; /* Cursor didn't move */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2736 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2737 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 else if (on_sep_line && which_button == MOUSE_LEFT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2739 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2740 if (dragwin != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 /* Drag the separator column */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 count = col - dragwin->w_wincol - dragwin->w_width + 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 - on_sep_line;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 win_drag_vsep_line(dragwin, count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 did_drag |= count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 return IN_SEP_LINE; /* Cursor didn't move */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 else /* keep_window_focus must be TRUE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 /* before moving the cursor for a left click, stop Visual mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 if (flags & MOUSE_MAY_STOP_VIS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 end_visual_mode();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 redraw_curbuf_later(INVERTED); /* delete the inversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 #if defined(FEAT_CMDWIN) && defined(FEAT_CLIPBOARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 /* Continue a modeless selection in another window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 if (cmdwin_type != 0 && row < W_WINROW(curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 return IN_OTHER_WIN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 row -= W_WINROW(curwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 col -= W_WINCOL(curwin);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 * When clicking beyond the end of the window, scroll the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 * Scroll by however many rows outside the window we are.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 if (row < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 for (first = TRUE; curwin->w_topline > 1; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 count += plines(curwin->w_topline - 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 if (!first && count > -row)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 hasFolding(curwin->w_topline, &curwin->w_topline, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 if (curwin->w_topfill < diff_check(curwin, curwin->w_topline))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 ++curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 --curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 curwin->w_topfill = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 check_topfill(curwin, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 curwin->w_valid &=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_BOTLINE_AP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 row = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 else if (row >= curwin->w_height)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 for (first = TRUE; curwin->w_topline < curbuf->b_ml.ml_line_count; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 if (curwin->w_topfill > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 ++count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 count += plines(curwin->w_topline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 if (!first && count > row - curwin->w_height + 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2829 if (hasFolding(curwin->w_topline, NULL, &curwin->w_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830 && curwin->w_topline == curbuf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 if (curwin->w_topfill > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 --curwin->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 ++curwin->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 curwin->w_topfill =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 diff_check_fill(curwin, curwin->w_topline);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 check_topfill(curwin, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 curwin->w_valid &=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 ~(VALID_WROW|VALID_CROW|VALID_BOTLINE|VALID_BOTLINE_AP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 row = curwin->w_height - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 else if (row == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2856 /* When dragging the mouse, while the text has been scrolled up as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 * far as it goes, moving the mouse in the top line should scroll
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 * the text down (done later when recomputing w_topline). */
1164
d0830c09ed10 updated for version 7.1a
vimboss
parents: 1086
diff changeset
2859 if (mouse_dragging > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 && curwin->w_cursor.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 == curwin->w_buffer->b_ml.ml_line_count
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 && curwin->w_cursor.lnum == curwin->w_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 curwin->w_valid &= ~(VALID_TOPLINE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868 /* Check for position outside of the fold column. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 # ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 curwin->w_p_rl ? col < W_WIDTH(curwin) - curwin->w_p_fdc :
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 col >= curwin->w_p_fdc
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 # ifdef FEAT_CMDWIN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 + (cmdwin_type == 0 ? 0 : 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 mouse_char = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 /* compute the position in the buffer line from the posn on the screen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 if (mouse_comp_pos(curwin, &row, &col, &curwin->w_cursor.lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 mouse_past_bottom = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 #ifdef FEAT_VISUAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 /* Start Visual mode before coladvance(), for when 'sel' != "old" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 if ((flags & MOUSE_MAY_VIS) && !VIsual_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 check_visual_highlight();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890 VIsual = old_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 VIsual_active = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 VIsual_reselect = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 /* if 'selectmode' contains "mouse", start Select mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 may_start_select('o');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 setmouse();
642
2392a6da4aa4 updated for version 7.0186
vimboss
parents: 620
diff changeset
2896 if (p_smd && msg_silent == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 redraw_cmdline = TRUE; /* show visual mode later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 curwin->w_curswant = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 curwin->w_set_curswant = FALSE; /* May still have been TRUE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 if (coladvance(col) == FAIL) /* Mouse click beyond end of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 if (inclusive != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 *inclusive = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 mouse_past_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 else if (inclusive != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 *inclusive = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 count = IN_BUFFER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 if (curwin != old_curwin || curwin->w_cursor.lnum != old_cursor.lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 || curwin->w_cursor.col != old_cursor.col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 count |= CURSOR_MOVED; /* Cursor has moved */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 if (mouse_char == '+')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 count |= MOUSE_FOLD_OPEN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 else if (mouse_char != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 count |= MOUSE_FOLD_CLOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 return count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 * Compute the position in the buffer line from the posn on the screen in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 * window "win".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 * Returns TRUE if the position is below the last line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 mouse_comp_pos(win, rowp, colp, lnump)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 win_T *win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 int *rowp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 int *colp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 linenr_T *lnump;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 int col = *colp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 int row = *rowp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 int off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 #ifdef FEAT_RIGHTLEFT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 if (win->w_p_rl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 col = W_WIDTH(win) - 1 - col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 lnum = win->w_topline;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 while (row > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 #ifdef FEAT_DIFF
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 /* Don't include filler lines in "count" */
237
73354c21f1e4 updated for version 7.0066
vimboss
parents: 228
diff changeset
2957 if (win->w_p_diff
73354c21f1e4 updated for version 7.0066
vimboss
parents: 228
diff changeset
2958 # ifdef FEAT_FOLDING
73354c21f1e4 updated for version 7.0066
vimboss
parents: 228
diff changeset
2959 && !hasFoldingWin(win, lnum, NULL, NULL, TRUE, NULL)
73354c21f1e4 updated for version 7.0066
vimboss
parents: 228
diff changeset
2960 # endif
73354c21f1e4 updated for version 7.0066
vimboss
parents: 228
diff changeset
2961 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 if (lnum == win->w_topline)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964 row -= win->w_topfill;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 row -= diff_check_fill(win, lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 count = plines_win_nofill(win, lnum, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 count = plines_win(win, lnum, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 if (count > row)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 break; /* Position is in this buffer line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 (void)hasFoldingWin(win, lnum, NULL, &lnum, TRUE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 if (lnum == win->w_buffer->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 break; /* past end of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 row -= count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 if (!retval)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 /* Compute the column without wrapping. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 off = win_col_off(win) - win_col_off2(win);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 if (col < off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991 col = off;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 col += row * (W_WIDTH(win) - off);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 /* add skip column (for long wrapping line) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 col += win->w_skipcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 if (!win->w_p_wrap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 col += win->w_leftcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 /* skip line number and fold column in front of the line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 col -= win_col_off(win);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 if (col < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 #ifdef FEAT_NETBEANS_INTG
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2270
diff changeset
3005 netbeans_gutter_click(lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010 *colp = col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 *rowp = row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 *lnump = lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016 #if defined(FEAT_WINDOWS) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 * Find the window at screen position "*rowp" and "*colp". The positions are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 * updated to become relative to the top-left of the window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 win_T *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022 mouse_find_win(rowp, colp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 int *rowp;
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1757
diff changeset
3024 int *colp UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 frame_T *fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 fp = topframe;
667
9090f866cd57 updated for version 7.0197
vimboss
parents: 666
diff changeset
3029 *rowp -= firstwin->w_winrow;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3032 if (fp->fr_layout == FR_LEAF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 if (fp->fr_layout == FR_ROW)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 for (fp = fp->fr_child; fp->fr_next != NULL; fp = fp->fr_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 if (*colp < fp->fr_width)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 *colp -= fp->fr_width;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 else /* fr_layout == FR_COL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 for (fp = fp->fr_child; fp->fr_next != NULL; fp = fp->fr_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 if (*rowp < fp->fr_height)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 *rowp -= fp->fr_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 return fp->fr_win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058
2250
1bac28a53fae Add the conceal patch from Vince Negri.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3059 #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MAC) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 || defined(FEAT_GUI_PHOTON) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 * Translate window coordinates to buffer position without any side effects
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 get_fpos_of_mouse(mpos)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 pos_T *mpos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 win_T *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 int row = mouse_row;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 int col = mouse_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 if (row < 0 || col < 0) /* check if it makes sense */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 return IN_UNKNOWN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 /* find the window where the row is in */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 wp = mouse_find_win(&row, &col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 wp = firstwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083 * winpos and height may change in win_enter()!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 if (row >= wp->w_height) /* In (or below) status line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086 return IN_STATUS_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 #ifdef FEAT_VERTSPLIT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 if (col >= wp->w_width) /* In vertical separator line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089 return IN_SEP_LINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 if (wp != curwin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 return IN_UNKNOWN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095 /* compute the position in the buffer line from the posn on the screen */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096 if (mouse_comp_pos(curwin, &row, &col, &mpos->lnum))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 return IN_STATUS_LINE; /* past bottom */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 mpos->col = vcol2col(wp, mpos->lnum, col);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 if (mpos->col > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 --mpos->col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 return IN_BUFFER;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 }
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 * Convert a virtual (screen) column to a character column.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 * The first column is one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 vcol2col(wp, lnum, vcol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 win_T *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 int vcol;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 /* try to advance to the specified column */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 int count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 char_u *ptr;
1961
0a1d45e2d8e3 updated for version 7.2-258
vimboss
parents: 1924
diff changeset
3119 char_u *start;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120
1961
0a1d45e2d8e3 updated for version 7.2-258
vimboss
parents: 1924
diff changeset
3121 start = ptr = ml_get_buf(wp->w_buffer, lnum, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 while (count <= vcol && *ptr != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 count += win_lbr_chartabsize(wp, ptr, count, NULL);
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 38
diff changeset
3125 mb_ptr_adv(ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 }
1961
0a1d45e2d8e3 updated for version 7.2-258
vimboss
parents: 1924
diff changeset
3127 return (int)(ptr - start);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 #endif /* FEAT_MOUSE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 #if defined(FEAT_GUI) || defined(WIN3264) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 * Called when focus changed. Used for the GUI or for systems where this can
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 * be done in the console (Win32).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 ui_focus_change(in_focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 int in_focus; /* TRUE if focus gained. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 static time_t last_time = (time_t)0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 int need_redraw = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 /* When activated: Check if any file was modified outside of Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 * Only do this when not done within the last two seconds (could get
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 * several events in a row). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 if (in_focus && last_time + 2 < time(NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 need_redraw = check_timestamps(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 FALSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 last_time = time(NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 * Fire the focus gained/lost autocommand.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 need_redraw |= apply_autocmds(in_focus ? EVENT_FOCUSGAINED
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 : EVENT_FOCUSLOST, NULL, NULL, FALSE, curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 if (need_redraw)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 /* Something was executed, make sure the cursor is put back where it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 * belongs. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 need_wait_return = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 if (State & CMDLINE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 redrawcmdline();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 else if (State == HITRETURN || State == SETWSIZE || State == ASKMORE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 || State == EXTERNCMD || State == CONFIRM || exmode_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 repeat_message();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 else if ((State & NORMAL) || (State & INSERT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 if (must_redraw != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 update_screen(0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 setcursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 cursor_on(); /* redrawing may have switched it off */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 gui_update_cursor(FALSE, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191 gui_update_scrollbars(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3192 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 /* File may have been changed from 'readonly' to 'noreadonly' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3197 if (need_maketitle)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 maketitle();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 #if defined(USE_IM_CONTROL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205 * Save current Input Method status to specified place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 im_save_status(psave)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 long *psave;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211 /* Don't save when 'imdisable' is set or "xic" is NULL, IM is always
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212 * disabled then (but might start later).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 * Also don't save when inside a mapping, vgetc_im_active has not been set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 * then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 * And don't save when the keys were stuffed (e.g., for a "." command).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 * And don't save when the GUI is running but our window doesn't have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 * input focus (e.g., when a find dialog is open). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 if (!p_imdisable && KeyTyped && !KeyStuffed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219 # ifdef FEAT_XIM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 && xic != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 # ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 && (!gui.in_use || gui.in_focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 /* Do save when IM is on, or IM is off and saved status is on. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 if (vgetc_im_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 *psave = B_IMODE_IM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 else if (*psave == B_IMODE_IM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 *psave = B_IMODE_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 #endif