Mercurial > vim
annotate src/gui_x11.c @ 19730:fe8ba2f82f59 v8.2.0421
patch 8.2.0421: interrupting with CTRL-C does not always work
Commit: https://github.com/vim/vim/commit/9645e2d9fc8a591f1db30383caccf71d40e0810c
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Mar 20 20:48:49 2020 +0100
patch 8.2.0421: interrupting with CTRL-C does not always work
Problem: Interrupting with CTRL-C does not always work.
Solution: Recognize CTRL-C while modifyOtherKeys is set.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 20 Mar 2020 21:00:05 +0100 |
parents | e1f4e9d78a6a |
children | aadd1cae2ff5 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9939
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * GUI/Motif support by Robert Webb | |
5 * | |
6 * Do ":help uganda" in Vim to read copying and usage conditions. | |
7 * Do ":help credits" in Vim to see a list of people who contributed. | |
8 * See README.txt for an overview of the Vim source code. | |
9 */ | |
10 /* | |
11 * Common code for the Motif and Athena GUI. | |
12 * Not used for GTK. | |
13 */ | |
14 | |
10956
90af0c60d78d
patch 8.0.0367: types in include files may be inconsistent
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
15 #include "vim.h" |
90af0c60d78d
patch 8.0.0367: types in include files may be inconsistent
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
16 |
7 | 17 #include <X11/keysym.h> |
18 #include <X11/Xatom.h> | |
19 #include <X11/StringDefs.h> | |
20 #include <X11/Intrinsic.h> | |
21 #include <X11/Shell.h> | |
22 #include <X11/cursorfont.h> | |
23 | |
24 /* | |
15510
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15500
diff
changeset
|
25 * XpmP.h is preferred, because it makes the signs drawn with a transparent |
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15500
diff
changeset
|
26 * background instead of black. |
7 | 27 */ |
28 #if defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF) \ | |
15510
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15500
diff
changeset
|
29 && !defined(HAVE_X11_XPM_H) |
7 | 30 # include <Xm/XpmP.h> |
31 #else | |
32 # ifdef HAVE_X11_XPM_H | |
15517
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15510
diff
changeset
|
33 # ifdef VMS |
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15510
diff
changeset
|
34 # include <xpm.h> |
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15510
diff
changeset
|
35 # else |
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15510
diff
changeset
|
36 # include <X11/xpm.h> |
2ad5f0ffaa2e
patch 8.1.0766: various problems when using Vim on VMS
Bram Moolenaar <Bram@vim.org>
parents:
15510
diff
changeset
|
37 # endif |
7 | 38 # endif |
39 #endif | |
40 | |
41 #ifdef FEAT_XFONTSET | |
42 # ifdef X_LOCALE | |
43 # include <X11/Xlocale.h> | |
44 # else | |
45 # include <locale.h> | |
46 # endif | |
47 #endif | |
48 | |
49 #ifdef HAVE_X11_SUNKEYSYM_H | |
50 # include <X11/Sunkeysym.h> | |
51 #endif | |
52 | |
53 #ifdef HAVE_X11_XMU_EDITRES_H | |
54 # include <X11/Xmu/Editres.h> | |
55 #endif | |
56 | |
57 #define VIM_NAME "vim" | |
58 #define VIM_CLASS "Vim" | |
59 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
60 // Default resource values |
7 | 61 #define DFLT_FONT "7x13" |
62 #ifdef FONTSET_ALWAYS | |
63 # define DFLT_MENU_FONT XtDefaultFontSet | |
64 #else | |
65 # define DFLT_MENU_FONT XtDefaultFont | |
66 #endif | |
67 #define DFLT_TOOLTIP_FONT XtDefaultFontSet | |
68 | |
69 #ifdef FEAT_GUI_ATHENA | |
70 # define DFLT_MENU_BG_COLOR "gray77" | |
71 # define DFLT_MENU_FG_COLOR "black" | |
72 # define DFLT_SCROLL_BG_COLOR "gray60" | |
73 # define DFLT_SCROLL_FG_COLOR "gray77" | |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
74 # define DFLT_TOOLTIP_BG_COLOR "#ffff91" |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
75 # define DFLT_TOOLTIP_FG_COLOR "#000000" |
7 | 76 #else |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
77 // use the default (CDE) colors |
7 | 78 # define DFLT_MENU_BG_COLOR "" |
79 # define DFLT_MENU_FG_COLOR "" | |
80 # define DFLT_SCROLL_BG_COLOR "" | |
81 # define DFLT_SCROLL_FG_COLOR "" | |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
82 # define DFLT_TOOLTIP_BG_COLOR "#ffff91" |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
83 # define DFLT_TOOLTIP_FG_COLOR "#000000" |
7 | 84 #endif |
85 | |
86 Widget vimShell = (Widget)0; | |
87 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
88 static Atom wm_atoms[2]; // Window Manager Atoms |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
89 #define DELETE_WINDOW_IDX 0 // index in wm_atoms[] for WM_DELETE_WINDOW |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
90 #define SAVE_YOURSELF_IDX 1 // index in wm_atoms[] for WM_SAVE_YOURSELF |
7 | 91 |
92 #ifdef FEAT_XFONTSET | |
93 /* | |
94 * We either draw with a fontset (when current_fontset != NULL) or with a | |
95 * normal font (current_fontset == NULL, use gui.text_gc and gui.back_gc). | |
96 */ | |
97 static XFontSet current_fontset = NULL; | |
98 | |
99 #define XDrawString(dpy, win, gc, x, y, str, n) \ | |
100 do \ | |
101 { \ | |
102 if (current_fontset != NULL) \ | |
103 XmbDrawString(dpy, win, current_fontset, gc, x, y, str, n); \ | |
104 else \ | |
105 XDrawString(dpy, win, gc, x, y, str, n); \ | |
106 } while (0) | |
107 | |
108 #define XDrawString16(dpy, win, gc, x, y, str, n) \ | |
109 do \ | |
110 { \ | |
111 if (current_fontset != NULL) \ | |
112 XwcDrawString(dpy, win, current_fontset, gc, x, y, (wchar_t *)str, n); \ | |
113 else \ | |
717 | 114 XDrawString16(dpy, win, gc, x, y, (XChar2b *)str, n); \ |
115 } while (0) | |
116 | |
117 #define XDrawImageString16(dpy, win, gc, x, y, str, n) \ | |
118 do \ | |
119 { \ | |
120 if (current_fontset != NULL) \ | |
121 XwcDrawImageString(dpy, win, current_fontset, gc, x, y, (wchar_t *)str, n); \ | |
122 else \ | |
123 XDrawImageString16(dpy, win, gc, x, y, (XChar2b *)str, n); \ | |
7 | 124 } while (0) |
125 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
126 static int check_fontset_sanity(XFontSet fs); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
127 static int fontset_width(XFontSet fs); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
128 static int fontset_ascent(XFontSet fs); |
7 | 129 #endif |
130 | |
131 static guicolor_T prev_fg_color = INVALCOLOR; | |
132 static guicolor_T prev_bg_color = INVALCOLOR; | |
206 | 133 static guicolor_T prev_sp_color = INVALCOLOR; |
7 | 134 |
135 #if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU) | |
136 static XButtonPressedEvent last_mouse_event; | |
137 #endif | |
138 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
139 static void gui_x11_check_copy_area(void); |
7 | 140 #ifdef FEAT_CLIENTSERVER |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
141 static void gui_x11_send_event_handler(Widget, XtPointer, XEvent *, Boolean *); |
7 | 142 #endif |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
143 static void gui_x11_wm_protocol_handler(Widget, XtPointer, XEvent *, Boolean *); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7260
diff
changeset
|
144 static Cursor gui_x11_create_blank_mouse(void); |
7 | 145 |
146 | |
147 /* | |
148 * Keycodes recognized by vim. | |
149 * NOTE: when changing this, the table in gui_gtk_x11.c probably needs the | |
150 * same change! | |
151 */ | |
152 static struct specialkey | |
153 { | |
154 KeySym key_sym; | |
155 char_u vim_code0; | |
156 char_u vim_code1; | |
157 } special_keys[] = | |
158 { | |
159 {XK_Up, 'k', 'u'}, | |
160 {XK_Down, 'k', 'd'}, | |
161 {XK_Left, 'k', 'l'}, | |
162 {XK_Right, 'k', 'r'}, | |
163 | |
164 {XK_F1, 'k', '1'}, | |
165 {XK_F2, 'k', '2'}, | |
166 {XK_F3, 'k', '3'}, | |
167 {XK_F4, 'k', '4'}, | |
168 {XK_F5, 'k', '5'}, | |
169 {XK_F6, 'k', '6'}, | |
170 {XK_F7, 'k', '7'}, | |
171 {XK_F8, 'k', '8'}, | |
172 {XK_F9, 'k', '9'}, | |
173 {XK_F10, 'k', ';'}, | |
174 | |
175 {XK_F11, 'F', '1'}, | |
176 {XK_F12, 'F', '2'}, | |
177 {XK_F13, 'F', '3'}, | |
178 {XK_F14, 'F', '4'}, | |
179 {XK_F15, 'F', '5'}, | |
180 {XK_F16, 'F', '6'}, | |
181 {XK_F17, 'F', '7'}, | |
182 {XK_F18, 'F', '8'}, | |
183 {XK_F19, 'F', '9'}, | |
184 {XK_F20, 'F', 'A'}, | |
185 | |
186 {XK_F21, 'F', 'B'}, | |
187 {XK_F22, 'F', 'C'}, | |
188 {XK_F23, 'F', 'D'}, | |
189 {XK_F24, 'F', 'E'}, | |
190 {XK_F25, 'F', 'F'}, | |
191 {XK_F26, 'F', 'G'}, | |
192 {XK_F27, 'F', 'H'}, | |
193 {XK_F28, 'F', 'I'}, | |
194 {XK_F29, 'F', 'J'}, | |
195 {XK_F30, 'F', 'K'}, | |
196 | |
197 {XK_F31, 'F', 'L'}, | |
198 {XK_F32, 'F', 'M'}, | |
199 {XK_F33, 'F', 'N'}, | |
200 {XK_F34, 'F', 'O'}, | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
201 {XK_F35, 'F', 'P'}, // keysymdef.h defines up to F35 |
7 | 202 #ifdef SunXK_F36 |
203 {SunXK_F36, 'F', 'Q'}, | |
204 {SunXK_F37, 'F', 'R'}, | |
205 #endif | |
206 | |
207 {XK_Help, '%', '1'}, | |
208 {XK_Undo, '&', '8'}, | |
209 {XK_BackSpace, 'k', 'b'}, | |
210 {XK_Insert, 'k', 'I'}, | |
211 {XK_Delete, 'k', 'D'}, | |
212 {XK_Home, 'k', 'h'}, | |
213 {XK_End, '@', '7'}, | |
214 {XK_Prior, 'k', 'P'}, | |
215 {XK_Next, 'k', 'N'}, | |
216 {XK_Print, '%', '9'}, | |
217 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
218 // Keypad keys: |
7 | 219 #ifdef XK_KP_Left |
220 {XK_KP_Left, 'k', 'l'}, | |
221 {XK_KP_Right, 'k', 'r'}, | |
222 {XK_KP_Up, 'k', 'u'}, | |
223 {XK_KP_Down, 'k', 'd'}, | |
224 {XK_KP_Insert, KS_EXTRA, (char_u)KE_KINS}, | |
225 {XK_KP_Delete, KS_EXTRA, (char_u)KE_KDEL}, | |
226 {XK_KP_Home, 'K', '1'}, | |
227 {XK_KP_End, 'K', '4'}, | |
228 {XK_KP_Prior, 'K', '3'}, | |
229 {XK_KP_Next, 'K', '5'}, | |
230 | |
231 {XK_KP_Add, 'K', '6'}, | |
232 {XK_KP_Subtract, 'K', '7'}, | |
233 {XK_KP_Divide, 'K', '8'}, | |
234 {XK_KP_Multiply, 'K', '9'}, | |
235 {XK_KP_Enter, 'K', 'A'}, | |
236 {XK_KP_Decimal, 'K', 'B'}, | |
237 | |
238 {XK_KP_0, 'K', 'C'}, | |
239 {XK_KP_1, 'K', 'D'}, | |
240 {XK_KP_2, 'K', 'E'}, | |
241 {XK_KP_3, 'K', 'F'}, | |
242 {XK_KP_4, 'K', 'G'}, | |
243 {XK_KP_5, 'K', 'H'}, | |
244 {XK_KP_6, 'K', 'I'}, | |
245 {XK_KP_7, 'K', 'J'}, | |
246 {XK_KP_8, 'K', 'K'}, | |
247 {XK_KP_9, 'K', 'L'}, | |
248 #endif | |
249 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
250 // End of list marker: |
7 | 251 {(KeySym)0, 0, 0} |
252 }; | |
253 | |
254 #define XtNboldFont "boldFont" | |
255 #define XtCBoldFont "BoldFont" | |
256 #define XtNitalicFont "italicFont" | |
257 #define XtCItalicFont "ItalicFont" | |
258 #define XtNboldItalicFont "boldItalicFont" | |
259 #define XtCBoldItalicFont "BoldItalicFont" | |
260 #define XtNscrollbarWidth "scrollbarWidth" | |
261 #define XtCScrollbarWidth "ScrollbarWidth" | |
262 #define XtNmenuHeight "menuHeight" | |
263 #define XtCMenuHeight "MenuHeight" | |
264 #define XtNmenuFont "menuFont" | |
265 #define XtCMenuFont "MenuFont" | |
266 #define XtNmenuFontSet "menuFontSet" | |
267 #define XtCMenuFontSet "MenuFontSet" | |
268 | |
269 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
270 // Resources for setting the foreground and background colors of menus |
7 | 271 #define XtNmenuBackground "menuBackground" |
272 #define XtCMenuBackground "MenuBackground" | |
273 #define XtNmenuForeground "menuForeground" | |
274 #define XtCMenuForeground "MenuForeground" | |
275 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
276 // Resources for setting the foreground and background colors of scrollbars |
7 | 277 #define XtNscrollBackground "scrollBackground" |
278 #define XtCScrollBackground "ScrollBackground" | |
279 #define XtNscrollForeground "scrollForeground" | |
280 #define XtCScrollForeground "ScrollForeground" | |
281 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
282 // Resources for setting the foreground and background colors of tooltip |
7 | 283 #define XtNtooltipBackground "tooltipBackground" |
284 #define XtCTooltipBackground "TooltipBackground" | |
285 #define XtNtooltipForeground "tooltipForeground" | |
286 #define XtCTooltipForeground "TooltipForeground" | |
287 #define XtNtooltipFont "tooltipFont" | |
288 #define XtCTooltipFont "TooltipFont" | |
289 | |
290 /* | |
291 * X Resources: | |
292 */ | |
293 static XtResource vim_resources[] = | |
294 { | |
295 { | |
296 XtNforeground, | |
297 XtCForeground, | |
298 XtRPixel, | |
299 sizeof(Pixel), | |
300 XtOffsetOf(gui_T, def_norm_pixel), | |
301 XtRString, | |
302 XtDefaultForeground | |
303 }, | |
304 { | |
305 XtNbackground, | |
306 XtCBackground, | |
307 XtRPixel, | |
308 sizeof(Pixel), | |
309 XtOffsetOf(gui_T, def_back_pixel), | |
310 XtRString, | |
311 XtDefaultBackground | |
312 }, | |
313 { | |
314 XtNfont, | |
315 XtCFont, | |
316 XtRString, | |
317 sizeof(String *), | |
318 XtOffsetOf(gui_T, rsrc_font_name), | |
319 XtRImmediate, | |
320 XtDefaultFont | |
321 }, | |
322 { | |
323 XtNboldFont, | |
324 XtCBoldFont, | |
325 XtRString, | |
326 sizeof(String *), | |
327 XtOffsetOf(gui_T, rsrc_bold_font_name), | |
328 XtRImmediate, | |
329 "" | |
330 }, | |
331 { | |
332 XtNitalicFont, | |
333 XtCItalicFont, | |
334 XtRString, | |
335 sizeof(String *), | |
336 XtOffsetOf(gui_T, rsrc_ital_font_name), | |
337 XtRImmediate, | |
338 "" | |
339 }, | |
340 { | |
341 XtNboldItalicFont, | |
342 XtCBoldItalicFont, | |
343 XtRString, | |
344 sizeof(String *), | |
345 XtOffsetOf(gui_T, rsrc_boldital_font_name), | |
346 XtRImmediate, | |
347 "" | |
348 }, | |
349 { | |
350 XtNgeometry, | |
351 XtCGeometry, | |
352 XtRString, | |
353 sizeof(String *), | |
354 XtOffsetOf(gui_T, geom), | |
355 XtRImmediate, | |
356 "" | |
357 }, | |
358 { | |
359 XtNreverseVideo, | |
360 XtCReverseVideo, | |
361 XtRBool, | |
362 sizeof(Bool), | |
363 XtOffsetOf(gui_T, rsrc_rev_video), | |
364 XtRImmediate, | |
365 (XtPointer)False | |
366 }, | |
367 { | |
368 XtNborderWidth, | |
369 XtCBorderWidth, | |
370 XtRInt, | |
371 sizeof(int), | |
372 XtOffsetOf(gui_T, border_width), | |
373 XtRImmediate, | |
374 (XtPointer)2 | |
375 }, | |
376 { | |
377 XtNscrollbarWidth, | |
378 XtCScrollbarWidth, | |
379 XtRInt, | |
380 sizeof(int), | |
381 XtOffsetOf(gui_T, scrollbar_width), | |
382 XtRImmediate, | |
383 (XtPointer)SB_DEFAULT_WIDTH | |
384 }, | |
385 #ifdef FEAT_MENU | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
386 # ifdef FEAT_GUI_ATHENA // with Motif the height is always computed |
7 | 387 { |
388 XtNmenuHeight, | |
389 XtCMenuHeight, | |
390 XtRInt, | |
391 sizeof(int), | |
392 XtOffsetOf(gui_T, menu_height), | |
393 XtRImmediate, | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
394 (XtPointer)MENU_DEFAULT_HEIGHT // Should figure out at run time |
7 | 395 }, |
396 # endif | |
397 { | |
398 # ifdef FONTSET_ALWAYS | |
399 XtNmenuFontSet, | |
400 XtCMenuFontSet, | |
401 #else | |
402 XtNmenuFont, | |
403 XtCMenuFont, | |
404 #endif | |
405 XtRString, | |
406 sizeof(char *), | |
407 XtOffsetOf(gui_T, rsrc_menu_font_name), | |
408 XtRString, | |
409 DFLT_MENU_FONT | |
410 }, | |
411 #endif | |
412 { | |
413 XtNmenuForeground, | |
414 XtCMenuForeground, | |
415 XtRString, | |
416 sizeof(char *), | |
417 XtOffsetOf(gui_T, rsrc_menu_fg_name), | |
418 XtRString, | |
419 DFLT_MENU_FG_COLOR | |
420 }, | |
421 { | |
422 XtNmenuBackground, | |
423 XtCMenuBackground, | |
424 XtRString, | |
425 sizeof(char *), | |
426 XtOffsetOf(gui_T, rsrc_menu_bg_name), | |
427 XtRString, | |
428 DFLT_MENU_BG_COLOR | |
429 }, | |
430 { | |
431 XtNscrollForeground, | |
432 XtCScrollForeground, | |
433 XtRString, | |
434 sizeof(char *), | |
435 XtOffsetOf(gui_T, rsrc_scroll_fg_name), | |
436 XtRString, | |
437 DFLT_SCROLL_FG_COLOR | |
438 }, | |
439 { | |
440 XtNscrollBackground, | |
441 XtCScrollBackground, | |
442 XtRString, | |
443 sizeof(char *), | |
444 XtOffsetOf(gui_T, rsrc_scroll_bg_name), | |
445 XtRString, | |
446 DFLT_SCROLL_BG_COLOR | |
447 }, | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12317
diff
changeset
|
448 #ifdef FEAT_BEVAL_GUI |
7 | 449 { |
450 XtNtooltipForeground, | |
451 XtCTooltipForeground, | |
452 XtRString, | |
453 sizeof(char *), | |
454 XtOffsetOf(gui_T, rsrc_tooltip_fg_name), | |
455 XtRString, | |
456 DFLT_TOOLTIP_FG_COLOR | |
457 }, | |
458 { | |
459 XtNtooltipBackground, | |
460 XtCTooltipBackground, | |
461 XtRString, | |
462 sizeof(char *), | |
463 XtOffsetOf(gui_T, rsrc_tooltip_bg_name), | |
464 XtRString, | |
465 DFLT_TOOLTIP_BG_COLOR | |
466 }, | |
467 { | |
468 XtNtooltipFont, | |
469 XtCTooltipFont, | |
470 XtRString, | |
471 sizeof(char *), | |
472 XtOffsetOf(gui_T, rsrc_tooltip_font_name), | |
473 XtRString, | |
474 DFLT_TOOLTIP_FONT | |
475 }, | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
476 // This one may not be really needed? |
7 | 477 { |
478 "balloonEvalFontSet", | |
479 XtCFontSet, | |
480 XtRFontSet, | |
481 sizeof(XFontSet), | |
482 XtOffsetOf(gui_T, tooltip_fontset), | |
483 XtRImmediate, | |
484 (XtPointer)NOFONTSET | |
485 }, | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
486 #endif // FEAT_BEVAL_GUI |
7 | 487 #ifdef FEAT_XIM |
488 { | |
489 "preeditType", | |
490 "PreeditType", | |
491 XtRString, | |
492 sizeof(char*), | |
493 XtOffsetOf(gui_T, rsrc_preedit_type_name), | |
494 XtRString, | |
495 (XtPointer)"OverTheSpot,OffTheSpot,Root" | |
496 }, | |
497 { | |
498 "inputMethod", | |
499 "InputMethod", | |
500 XtRString, | |
501 sizeof(char*), | |
502 XtOffsetOf(gui_T, rsrc_input_method), | |
503 XtRString, | |
504 NULL | |
505 }, | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
506 #endif // FEAT_XIM |
7 | 507 }; |
508 | |
509 /* | |
510 * This table holds all the X GUI command line options allowed. This includes | |
511 * the standard ones so that we can skip them when vim is started without the | |
512 * GUI (but the GUI might start up later). | |
513 * When changing this, also update doc/vim_gui.txt and the usage message!!! | |
514 */ | |
515 static XrmOptionDescRec cmdline_options[] = | |
516 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
517 // We handle these options ourselves |
7 | 518 {"-bg", ".background", XrmoptionSepArg, NULL}, |
519 {"-background", ".background", XrmoptionSepArg, NULL}, | |
520 {"-fg", ".foreground", XrmoptionSepArg, NULL}, | |
521 {"-foreground", ".foreground", XrmoptionSepArg, NULL}, | |
522 {"-fn", ".font", XrmoptionSepArg, NULL}, | |
523 {"-font", ".font", XrmoptionSepArg, NULL}, | |
524 {"-boldfont", ".boldFont", XrmoptionSepArg, NULL}, | |
525 {"-italicfont", ".italicFont", XrmoptionSepArg, NULL}, | |
526 {"-geom", ".geometry", XrmoptionSepArg, NULL}, | |
527 {"-geometry", ".geometry", XrmoptionSepArg, NULL}, | |
528 {"-reverse", "*reverseVideo", XrmoptionNoArg, "True"}, | |
529 {"-rv", "*reverseVideo", XrmoptionNoArg, "True"}, | |
530 {"+reverse", "*reverseVideo", XrmoptionNoArg, "False"}, | |
531 {"+rv", "*reverseVideo", XrmoptionNoArg, "False"}, | |
532 {"-display", ".display", XrmoptionSepArg, NULL}, | |
557 | 533 {"-iconic", ".iconic", XrmoptionNoArg, "True"}, |
7 | 534 {"-name", ".name", XrmoptionSepArg, NULL}, |
535 {"-bw", ".borderWidth", XrmoptionSepArg, NULL}, | |
536 {"-borderwidth", ".borderWidth", XrmoptionSepArg, NULL}, | |
537 {"-sw", ".scrollbarWidth", XrmoptionSepArg, NULL}, | |
538 {"-scrollbarwidth", ".scrollbarWidth", XrmoptionSepArg, NULL}, | |
539 {"-mh", ".menuHeight", XrmoptionSepArg, NULL}, | |
540 {"-menuheight", ".menuHeight", XrmoptionSepArg, NULL}, | |
541 #ifdef FONTSET_ALWAYS | |
542 {"-mf", ".menuFontSet", XrmoptionSepArg, NULL}, | |
543 {"-menufont", ".menuFontSet", XrmoptionSepArg, NULL}, | |
544 {"-menufontset", ".menuFontSet", XrmoptionSepArg, NULL}, | |
545 #else | |
546 {"-mf", ".menuFont", XrmoptionSepArg, NULL}, | |
547 {"-menufont", ".menuFont", XrmoptionSepArg, NULL}, | |
548 #endif | |
549 {"-xrm", NULL, XrmoptionResArg, NULL} | |
550 }; | |
551 | |
552 static int gui_argc = 0; | |
553 static char **gui_argv = NULL; | |
554 | |
555 /* | |
556 * Call-back routines. | |
557 */ | |
558 | |
559 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
560 gui_x11_timer_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
561 XtPointer timed_out, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
562 XtIntervalId *interval_id UNUSED) |
7 | 563 { |
564 *((int *)timed_out) = TRUE; | |
565 } | |
566 | |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
567 #ifdef FEAT_JOB_CHANNEL |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
568 static void |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
569 channel_poll_cb( |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
570 XtPointer client_data, |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
571 XtIntervalId *interval_id UNUSED) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
572 { |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
573 XtIntervalId *channel_timer = (XtIntervalId *)client_data; |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
574 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
575 // Using an event handler for a channel that may be disconnected does |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
576 // not work, it hangs. Instead poll for messages. |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
577 channel_handle_events(TRUE); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
578 parse_queued_messages(); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
579 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
580 // repeat |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
581 *channel_timer = XtAppAddTimeOut(app_context, (long_u)20, |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
582 channel_poll_cb, client_data); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
583 } |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
584 #endif |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
585 |
7 | 586 static void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
587 gui_x11_visibility_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
588 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
589 XtPointer dud UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
590 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
591 Boolean *dum UNUSED) |
7 | 592 { |
593 if (event->type != VisibilityNotify) | |
594 return; | |
595 | |
596 gui.visibility = event->xvisibility.state; | |
597 | |
598 /* | |
599 * When we do an XCopyArea(), and the window is partially obscured, we want | |
600 * to receive an event to tell us whether it worked or not. | |
601 */ | |
602 XSetGraphicsExposures(gui.dpy, gui.text_gc, | |
603 gui.visibility != VisibilityUnobscured); | |
604 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
605 // This is needed for when redrawing is slow. |
7 | 606 gui_mch_update(); |
607 } | |
608 | |
609 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
610 gui_x11_expose_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
611 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
612 XtPointer dud UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
613 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
614 Boolean *dum UNUSED) |
7 | 615 { |
616 XExposeEvent *gevent; | |
617 int new_x; | |
618 | |
619 if (event->type != Expose) | |
620 return; | |
621 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
622 out_flush(); // make sure all output has been processed |
7 | 623 |
624 gevent = (XExposeEvent *)event; | |
625 gui_redraw(gevent->x, gevent->y, gevent->width, gevent->height); | |
626 | |
627 new_x = FILL_X(0); | |
628 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
629 // Clear the border areas if needed |
7 | 630 if (gevent->x < new_x) |
631 XClearArea(gui.dpy, gui.wid, 0, 0, new_x, 0, False); | |
632 if (gevent->y < FILL_Y(0)) | |
633 XClearArea(gui.dpy, gui.wid, 0, 0, 0, FILL_Y(0), False); | |
634 if (gevent->x > FILL_X(Columns)) | |
635 XClearArea(gui.dpy, gui.wid, FILL_X((int)Columns), 0, 0, 0, False); | |
636 if (gevent->y > FILL_Y(Rows)) | |
637 XClearArea(gui.dpy, gui.wid, 0, FILL_Y((int)Rows), 0, 0, False); | |
638 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
639 // This is needed for when redrawing is slow. |
7 | 640 gui_mch_update(); |
641 } | |
642 | |
15510
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15500
diff
changeset
|
643 #if (defined(FEAT_NETBEANS_INTG) && defined(FEAT_GUI_MOTIF)) || defined(PROTO) |
7 | 644 /* |
445 | 645 * This function fills in the XRectangle object with the current x,y |
646 * coordinates and height, width so that an XtVaSetValues to the same shell of | |
1226 | 647 * those resources will restore the window to its former position and |
445 | 648 * dimensions. |
7 | 649 * |
445 | 650 * Note: This function may fail, in which case the XRectangle will be |
651 * unchanged. Be sure to have the XRectangle set with the proper values for a | |
652 * failed condition prior to calling this function. | |
7 | 653 */ |
654 static void | |
655 shellRectangle(Widget shell, XRectangle *r) | |
656 { | |
657 Window rootw, shellw, child, parentw; | |
658 int absx, absy; | |
659 XWindowAttributes a; | |
660 Window *children; | |
661 unsigned int childrenCount; | |
662 | |
663 shellw = XtWindow(shell); | |
664 if (shellw == 0) | |
665 return; | |
666 for (;;) | |
667 { | |
668 XQueryTree(XtDisplay(shell), shellw, &rootw, &parentw, | |
669 &children, &childrenCount); | |
670 XFree(children); | |
671 if (parentw == rootw) | |
672 break; | |
673 shellw = parentw; | |
674 } | |
675 XGetWindowAttributes(XtDisplay(shell), shellw, &a); | |
676 XTranslateCoordinates(XtDisplay(shell), shellw, a.root, 0, 0, | |
677 &absx, &absy, &child); | |
678 r->x = absx; | |
679 r->y = absy; | |
680 XtVaGetValues(shell, XmNheight, &r->height, XmNwidth, &r->width, NULL); | |
681 } | |
682 #endif | |
683 | |
684 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
685 gui_x11_resize_window_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
686 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
687 XtPointer dud UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
688 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
689 Boolean *dum UNUSED) |
7 | 690 { |
691 static int lastWidth, lastHeight; | |
692 | |
693 if (event->type != ConfigureNotify) | |
694 return; | |
695 | |
696 if (event->xconfigure.width != lastWidth | |
697 || event->xconfigure.height != lastHeight) | |
698 { | |
699 lastWidth = event->xconfigure.width; | |
700 lastHeight = event->xconfigure.height; | |
701 gui_resize_shell(event->xconfigure.width, event->xconfigure.height | |
702 #ifdef FEAT_XIM | |
703 - xim_get_status_area_height() | |
704 #endif | |
705 ); | |
706 } | |
2209
d0ddf7ba1630
Included the patch to support netbeans in a terminal.
Bram Moolenaar <bram@vim.org>
parents:
1887
diff
changeset
|
707 #if defined(FEAT_NETBEANS_INTG) && defined(FEAT_GUI_MOTIF) |
2210 | 708 if (netbeans_active()) |
7 | 709 { |
710 XRectangle rec; | |
711 | |
712 shellRectangle(w, &rec); | |
713 netbeans_frame_moved(rec.x, rec.y); | |
714 } | |
715 #endif | |
716 #ifdef FEAT_XIM | |
717 xim_set_preedit(); | |
718 #endif | |
719 } | |
720 | |
721 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
722 gui_x11_focus_change_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
723 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
724 XtPointer data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
725 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
726 Boolean *dum UNUSED) |
7 | 727 { |
728 gui_focus_change(event->type == FocusIn); | |
729 } | |
730 | |
731 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
732 gui_x11_enter_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
733 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
734 XtPointer data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
735 XEvent *event UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
736 Boolean *dum UNUSED) |
7 | 737 { |
738 gui_focus_change(TRUE); | |
739 } | |
740 | |
741 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
742 gui_x11_leave_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
743 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
744 XtPointer data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
745 XEvent *event UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
746 Boolean *dum UNUSED) |
7 | 747 { |
748 gui_focus_change(FALSE); | |
749 } | |
750 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
751 #if defined(X_HAVE_UTF8_STRING) |
7 | 752 # if X_HAVE_UTF8_STRING |
753 # define USE_UTF8LOOKUP | |
754 # endif | |
755 #endif | |
756 | |
757 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
758 gui_x11_key_hit_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
759 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
760 XtPointer dud UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
761 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
762 Boolean *dum UNUSED) |
7 | 763 { |
764 XKeyPressedEvent *ev_press; | |
765 #ifdef FEAT_XIM | |
766 char_u string2[256]; | |
767 char_u string_shortbuf[256]; | |
768 char_u *string = string_shortbuf; | |
769 Boolean string_alloced = False; | |
770 Status status; | |
771 #else | |
772 char_u string[4], string2[3]; | |
773 #endif | |
774 KeySym key_sym, key_sym2; | |
775 int len, len2; | |
776 int i; | |
777 int modifiers; | |
778 int key; | |
779 | |
780 ev_press = (XKeyPressedEvent *)event; | |
781 | |
782 #ifdef FEAT_XIM | |
783 if (xic) | |
784 { | |
785 # ifdef USE_UTF8LOOKUP | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
786 // XFree86 4.0.2 or newer: Be able to get UTF-8 characters even when |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
787 // the locale isn't utf-8. |
7 | 788 if (enc_utf8) |
789 len = Xutf8LookupString(xic, ev_press, (char *)string, | |
790 sizeof(string_shortbuf), &key_sym, &status); | |
791 else | |
792 # endif | |
793 len = XmbLookupString(xic, ev_press, (char *)string, | |
794 sizeof(string_shortbuf), &key_sym, &status); | |
795 if (status == XBufferOverflow) | |
796 { | |
797 string = (char_u *)XtMalloc(len + 1); | |
798 string_alloced = True; | |
799 # ifdef USE_UTF8LOOKUP | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
800 // XFree86 4.0.2 or newer: Be able to get UTF-8 characters even |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
801 // when the locale isn't utf-8. |
7 | 802 if (enc_utf8) |
803 len = Xutf8LookupString(xic, ev_press, (char *)string, | |
804 len, &key_sym, &status); | |
805 else | |
806 # endif | |
807 len = XmbLookupString(xic, ev_press, (char *)string, | |
808 len, &key_sym, &status); | |
809 } | |
810 if (status == XLookupNone || status == XLookupChars) | |
811 key_sym = XK_VoidSymbol; | |
812 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
813 // Do conversion from 'termencoding' to 'encoding'. When using |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
814 // Xutf8LookupString() it has already been done. |
7 | 815 if (len > 0 && input_conv.vc_type != CONV_NONE |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
816 # ifdef USE_UTF8LOOKUP |
7 | 817 && !enc_utf8 |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
818 # endif |
7 | 819 ) |
820 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
821 int maxlen = len * 4 + 40; // guessed |
7 | 822 char_u *p = (char_u *)XtMalloc(maxlen); |
823 | |
824 mch_memmove(p, string, len); | |
825 if (string_alloced) | |
826 XtFree((char *)string); | |
827 string = p; | |
828 string_alloced = True; | |
829 len = convert_input(p, len, maxlen); | |
830 } | |
831 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
832 // Translate CSI to K_CSI, otherwise it could be recognized as the |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
833 // start of a special key. |
7 | 834 for (i = 0; i < len; ++i) |
835 if (string[i] == CSI) | |
836 { | |
837 char_u *p = (char_u *)XtMalloc(len + 3); | |
838 | |
839 mch_memmove(p, string, i + 1); | |
840 p[i + 1] = KS_EXTRA; | |
841 p[i + 2] = (int)KE_CSI; | |
842 mch_memmove(p + i + 3, string + i + 1, len - i); | |
843 if (string_alloced) | |
844 XtFree((char *)string); | |
845 string = p; | |
846 string_alloced = True; | |
847 i += 2; | |
848 len += 2; | |
849 } | |
850 } | |
851 else | |
852 #endif | |
853 len = XLookupString(ev_press, (char *)string, sizeof(string), | |
854 &key_sym, NULL); | |
855 | |
856 #ifdef SunXK_F36 | |
857 /* | |
858 * These keys have bogus lookup strings, and trapping them here is | |
859 * easier than trying to XRebindKeysym() on them with every possible | |
860 * combination of modifiers. | |
861 */ | |
862 if (key_sym == SunXK_F36 || key_sym == SunXK_F37) | |
863 len = 0; | |
864 #endif | |
865 | |
866 if (key_sym == XK_space) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
867 string[0] = ' '; // Otherwise Ctrl-Space doesn't work |
7 | 868 |
869 /* | |
870 * Only on some machines ^_ requires Ctrl+Shift+minus. For consistency, | |
871 * allow just Ctrl+minus too. | |
872 */ | |
873 if (key_sym == XK_minus && (ev_press->state & ControlMask)) | |
874 string[0] = Ctrl__; | |
875 | |
876 #ifdef XK_ISO_Left_Tab | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
877 // why do we get XK_ISO_Left_Tab instead of XK_Tab for shift-tab? |
7 | 878 if (key_sym == XK_ISO_Left_Tab) |
879 { | |
880 key_sym = XK_Tab; | |
881 string[0] = TAB; | |
882 len = 1; | |
883 } | |
884 #endif | |
885 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
886 // Check for Alt/Meta key (Mod1Mask), but not for a BS, DEL or character |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
887 // that already has the 8th bit set. And not when using a double-byte |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
888 // encoding, setting the 8th bit may make it the lead byte of a |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
889 // double-byte character. |
7 | 890 if (len == 1 |
891 && (ev_press->state & Mod1Mask) | |
892 && !(key_sym == XK_BackSpace || key_sym == XK_Delete) | |
893 && (string[0] & 0x80) == 0 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
894 && !enc_dbcs) |
7 | 895 { |
896 #if defined(FEAT_MENU) && defined(FEAT_GUI_MOTIF) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
897 // Ignore ALT keys when they are used for the menu only |
7 | 898 if (gui.menu_is_active |
899 && (p_wak[0] == 'y' | |
900 || (p_wak[0] == 'm' && gui_is_menu_shortcut(string[0])))) | |
901 goto theend; | |
902 #endif | |
903 /* | |
904 * Before we set the 8th bit, check to make sure the user doesn't | |
905 * already have a mapping defined for this sequence. We determine this | |
906 * by checking to see if the input would be the same without the | |
907 * Alt/Meta key. | |
908 * Don't do this for <S-M-Tab>, that should become K_S_TAB with ALT. | |
909 */ | |
910 ev_press->state &= ~Mod1Mask; | |
911 len2 = XLookupString(ev_press, (char *)string2, sizeof(string2), | |
912 &key_sym2, NULL); | |
913 if (key_sym2 == XK_space) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
914 string2[0] = ' '; // Otherwise Meta-Ctrl-Space doesn't work |
7 | 915 if ( len2 == 1 |
916 && string[0] == string2[0] | |
917 && !(key_sym == XK_Tab && (ev_press->state & ShiftMask))) | |
918 { | |
919 string[0] |= 0x80; | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
920 if (enc_utf8) // convert to utf-8 |
7 | 921 { |
922 string[1] = string[0] & 0xbf; | |
923 string[0] = ((unsigned)string[0] >> 6) + 0xc0; | |
924 if (string[1] == CSI) | |
925 { | |
926 string[2] = KS_EXTRA; | |
927 string[3] = (int)KE_CSI; | |
928 len = 4; | |
929 } | |
930 else | |
931 len = 2; | |
932 } | |
933 } | |
934 else | |
935 ev_press->state |= Mod1Mask; | |
936 } | |
937 | |
938 if (len == 1 && string[0] == CSI) | |
939 { | |
940 string[1] = KS_EXTRA; | |
941 string[2] = (int)KE_CSI; | |
942 len = -3; | |
943 } | |
944 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
945 // Check for special keys. Also do this when len == 1 (key has an ASCII |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
946 // value) to detect backspace, delete and keypad keys. |
7 | 947 if (len == 0 || len == 1) |
948 { | |
949 for (i = 0; special_keys[i].key_sym != (KeySym)0; i++) | |
950 { | |
951 if (special_keys[i].key_sym == key_sym) | |
952 { | |
953 string[0] = CSI; | |
954 string[1] = special_keys[i].vim_code0; | |
955 string[2] = special_keys[i].vim_code1; | |
956 len = -3; | |
957 break; | |
958 } | |
959 } | |
960 } | |
961 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
962 // Unrecognised key is ignored. |
7 | 963 if (len == 0) |
964 goto theend; | |
965 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
966 // Special keys (and a few others) may have modifiers. Also when using a |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
967 // double-byte encoding (can't set the 8th bit). |
7 | 968 if (len == -3 || key_sym == XK_space || key_sym == XK_Tab |
969 || key_sym == XK_Return || key_sym == XK_Linefeed | |
970 || key_sym == XK_Escape | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
971 || (enc_dbcs && len == 1 && (ev_press->state & Mod1Mask))) |
7 | 972 { |
973 modifiers = 0; | |
974 if (ev_press->state & ShiftMask) | |
975 modifiers |= MOD_MASK_SHIFT; | |
976 if (ev_press->state & ControlMask) | |
977 modifiers |= MOD_MASK_CTRL; | |
978 if (ev_press->state & Mod1Mask) | |
979 modifiers |= MOD_MASK_ALT; | |
179 | 980 if (ev_press->state & Mod4Mask) |
981 modifiers |= MOD_MASK_META; | |
7 | 982 |
983 /* | |
984 * For some keys a shift modifier is translated into another key | |
985 * code. | |
986 */ | |
987 if (len == -3) | |
988 key = TO_SPECIAL(string[1], string[2]); | |
989 else | |
990 key = string[0]; | |
991 key = simplify_key(key, &modifiers); | |
992 if (key == CSI) | |
993 key = K_CSI; | |
994 if (IS_SPECIAL(key)) | |
995 { | |
996 string[0] = CSI; | |
997 string[1] = K_SECOND(key); | |
998 string[2] = K_THIRD(key); | |
999 len = 3; | |
1000 } | |
1001 else | |
1002 { | |
1003 string[0] = key; | |
1004 len = 1; | |
1005 } | |
1006 | |
1007 if (modifiers != 0) | |
1008 { | |
1009 string2[0] = CSI; | |
1010 string2[1] = KS_MODIFIER; | |
1011 string2[2] = modifiers; | |
1012 add_to_input_buf(string2, 3); | |
1013 } | |
1014 } | |
1015 | |
1016 if (len == 1 && ((string[0] == Ctrl_C && ctrl_c_interrupts) | |
1017 #ifdef UNIX | |
1018 || (intr_char != 0 && string[0] == intr_char) | |
1019 #endif | |
1020 )) | |
1021 { | |
1022 trash_input_buf(); | |
1023 got_int = TRUE; | |
1024 } | |
1025 | |
1026 add_to_input_buf(string, len); | |
1027 | |
1028 /* | |
1029 * blank out the pointer if necessary | |
1030 */ | |
1031 if (p_mh) | |
1032 gui_mch_mousehide(TRUE); | |
1033 | |
1034 #if defined(FEAT_BEVAL_TIP) | |
1035 { | |
1036 BalloonEval *be; | |
1037 | |
1038 if ((be = gui_mch_currently_showing_beval()) != NULL) | |
1039 gui_mch_unpost_balloon(be); | |
1040 } | |
1041 #endif | |
1042 theend: | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1043 {} // some compilers need a statement here |
7 | 1044 #ifdef FEAT_XIM |
1045 if (string_alloced) | |
1046 XtFree((char *)string); | |
1047 #endif | |
1048 } | |
1049 | |
1050 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1051 gui_x11_mouse_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1052 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1053 XtPointer dud UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1054 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1055 Boolean *dum UNUSED) |
7 | 1056 { |
1057 static XtIntervalId timer = (XtIntervalId)0; | |
1058 static int timed_out = TRUE; | |
1059 | |
1060 int button; | |
1061 int repeated_click = FALSE; | |
1062 int x, y; | |
1063 int_u x_modifiers; | |
1064 int_u vim_modifiers; | |
1065 | |
1066 if (event->type == MotionNotify) | |
1067 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1068 // Get the latest position, avoids lagging behind on a drag. |
7 | 1069 x = event->xmotion.x; |
1070 y = event->xmotion.y; | |
1071 x_modifiers = event->xmotion.state; | |
1072 button = (x_modifiers & (Button1Mask | Button2Mask | Button3Mask)) | |
1073 ? MOUSE_DRAG : ' '; | |
1074 | |
1075 /* | |
1076 * if our pointer is currently hidden, then we should show it. | |
1077 */ | |
1078 gui_mch_mousehide(FALSE); | |
1079 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1080 if (button != MOUSE_DRAG) // just moving the rodent |
7 | 1081 { |
1082 #ifdef FEAT_MENU | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1083 if (dud) // moved in vimForm |
7 | 1084 y -= gui.menu_height; |
1085 #endif | |
1086 gui_mouse_moved(x, y); | |
1087 return; | |
1088 } | |
1089 } | |
1090 else | |
1091 { | |
1092 x = event->xbutton.x; | |
1093 y = event->xbutton.y; | |
1094 if (event->type == ButtonPress) | |
1095 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1096 // Handle multiple clicks |
7 | 1097 if (!timed_out) |
1098 { | |
1099 XtRemoveTimeOut(timer); | |
1100 repeated_click = TRUE; | |
1101 } | |
1102 timed_out = FALSE; | |
1103 timer = XtAppAddTimeOut(app_context, (long_u)p_mouset, | |
1104 gui_x11_timer_cb, &timed_out); | |
1105 switch (event->xbutton.button) | |
1106 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1107 // keep in sync with gui_gtk_x11.c |
7 | 1108 case Button1: button = MOUSE_LEFT; break; |
1109 case Button2: button = MOUSE_MIDDLE; break; | |
1110 case Button3: button = MOUSE_RIGHT; break; | |
1111 case Button4: button = MOUSE_4; break; | |
1112 case Button5: button = MOUSE_5; break; | |
7260
8ba562cb3e07
commit https://github.com/vim/vim/commit/88e484bf1b0afb5f2dec44f19335729578ace66a
Christian Brabandt <cb@256bit.org>
parents:
7109
diff
changeset
|
1113 case 6: button = MOUSE_7; break; |
8ba562cb3e07
commit https://github.com/vim/vim/commit/88e484bf1b0afb5f2dec44f19335729578ace66a
Christian Brabandt <cb@256bit.org>
parents:
7109
diff
changeset
|
1114 case 7: button = MOUSE_6; break; |
8ba562cb3e07
commit https://github.com/vim/vim/commit/88e484bf1b0afb5f2dec44f19335729578ace66a
Christian Brabandt <cb@256bit.org>
parents:
7109
diff
changeset
|
1115 case 8: button = MOUSE_X1; break; |
8ba562cb3e07
commit https://github.com/vim/vim/commit/88e484bf1b0afb5f2dec44f19335729578ace66a
Christian Brabandt <cb@256bit.org>
parents:
7109
diff
changeset
|
1116 case 9: button = MOUSE_X2; break; |
7 | 1117 default: |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1118 return; // Unknown button |
7 | 1119 } |
1120 } | |
1121 else if (event->type == ButtonRelease) | |
1122 button = MOUSE_RELEASE; | |
1123 else | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1124 return; // Unknown mouse event type |
7 | 1125 |
1126 x_modifiers = event->xbutton.state; | |
1127 #if defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU) | |
1128 last_mouse_event = event->xbutton; | |
1129 #endif | |
1130 } | |
1131 | |
1132 vim_modifiers = 0x0; | |
1133 if (x_modifiers & ShiftMask) | |
1134 vim_modifiers |= MOUSE_SHIFT; | |
1135 if (x_modifiers & ControlMask) | |
1136 vim_modifiers |= MOUSE_CTRL; | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1137 if (x_modifiers & Mod1Mask) // Alt or Meta key |
7 | 1138 vim_modifiers |= MOUSE_ALT; |
1139 | |
1140 gui_send_mouse_event(button, x, y, repeated_click, vim_modifiers); | |
1141 } | |
1142 | |
1143 /* | |
1144 * End of call-back routines | |
1145 */ | |
1146 | |
1147 /* | |
1148 * Parse the GUI related command-line arguments. Any arguments used are | |
1149 * deleted from argv, and *argc is decremented accordingly. This is called | |
1150 * when vim is started, whether or not the GUI has been started. | |
1151 */ | |
1152 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1153 gui_mch_prepare(int *argc, char **argv) |
7 | 1154 { |
1155 int arg; | |
1156 int i; | |
1157 | |
1158 /* | |
1159 * Move all the entries in argv which are relevant to X into gui_argv. | |
1160 */ | |
1161 gui_argc = 0; | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1162 gui_argv = LALLOC_MULT(char *, *argc); |
7 | 1163 if (gui_argv == NULL) |
1164 return; | |
1165 gui_argv[gui_argc++] = argv[0]; | |
1166 arg = 1; | |
1167 while (arg < *argc) | |
1168 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1169 // Look for argv[arg] in cmdline_options[] table |
1887 | 1170 for (i = 0; i < (int)XtNumber(cmdline_options); i++) |
7 | 1171 if (strcmp(argv[arg], cmdline_options[i].option) == 0) |
1172 break; | |
1173 | |
1887 | 1174 if (i < (int)XtNumber(cmdline_options)) |
7 | 1175 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1176 // Remember finding "-rv" or "-reverse" |
7 | 1177 if (strcmp("-rv", argv[arg]) == 0 |
1178 || strcmp("-reverse", argv[arg]) == 0) | |
1179 found_reverse_arg = TRUE; | |
1180 else if ((strcmp("-fn", argv[arg]) == 0 | |
1181 || strcmp("-font", argv[arg]) == 0) | |
1182 && arg + 1 < *argc) | |
1183 font_argument = argv[arg + 1]; | |
1184 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1185 // Found match in table, so move it into gui_argv |
7 | 1186 gui_argv[gui_argc++] = argv[arg]; |
1187 if (--*argc > arg) | |
1188 { | |
1189 mch_memmove(&argv[arg], &argv[arg + 1], (*argc - arg) | |
1190 * sizeof(char *)); | |
1191 if (cmdline_options[i].argKind != XrmoptionNoArg) | |
1192 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1193 // Move the options argument as well |
7 | 1194 gui_argv[gui_argc++] = argv[arg]; |
1195 if (--*argc > arg) | |
1196 mch_memmove(&argv[arg], &argv[arg + 1], (*argc - arg) | |
1197 * sizeof(char *)); | |
1198 } | |
1199 } | |
1200 argv[*argc] = NULL; | |
1201 } | |
1202 else | |
1203 #ifdef FEAT_NETBEANS_INTG | |
1204 if (strncmp("-nb", argv[arg], 3) == 0) | |
1205 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1206 gui.dofork = FALSE; // don't fork() when starting GUI |
7 | 1207 netbeansArg = argv[arg]; |
1208 mch_memmove(&argv[arg], &argv[arg + 1], | |
1209 (--*argc - arg) * sizeof(char *)); | |
1210 argv[*argc] = NULL; | |
1211 } | |
1212 else | |
1213 #endif | |
1214 arg++; | |
1215 } | |
1216 } | |
1217 | |
1218 #ifndef XtSpecificationRelease | |
1219 # define CARDINAL (Cardinal *) | |
1220 #else | |
1221 # if XtSpecificationRelease == 4 | |
1222 # define CARDINAL (Cardinal *) | |
1223 # else | |
1224 # define CARDINAL (int *) | |
1225 # endif | |
1226 #endif | |
1227 | |
1228 /* | |
1229 * Check if the GUI can be started. Called before gvimrc is sourced. | |
1230 * Return OK or FAIL. | |
1231 */ | |
1232 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1233 gui_mch_init_check(void) |
7 | 1234 { |
1235 #ifdef FEAT_XIM | |
1236 XtSetLanguageProc(NULL, NULL, NULL); | |
1237 #endif | |
1238 open_app_context(); | |
1239 if (app_context != NULL) | |
1240 gui.dpy = XtOpenDisplay(app_context, 0, VIM_NAME, VIM_CLASS, | |
51 | 1241 cmdline_options, XtNumber(cmdline_options), |
1242 CARDINAL &gui_argc, gui_argv); | |
7 | 1243 |
13925
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1244 # if defined(FEAT_FLOAT) && defined(LC_NUMERIC) |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1245 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1246 // The call to XtOpenDisplay() may have set the locale from the |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1247 // environment. Set LC_NUMERIC to "C" to make sure that strtod() uses a |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1248 // decimal point, not a comma. |
13925
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1249 char *p = setlocale(LC_NUMERIC, NULL); |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1250 |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1251 if (p == NULL || strcmp(p, "C") != 0) |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1252 setlocale(LC_NUMERIC, "C"); |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1253 } |
eb264a775071
patch 8.0.1833: X11: ":echo 3.14" gives E806
Christian Brabandt <cb@256bit.org>
parents:
13858
diff
changeset
|
1254 # endif |
7 | 1255 if (app_context == NULL || gui.dpy == NULL) |
1256 { | |
1257 gui.dying = TRUE; | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
1258 emsg(_(e_opendisp)); |
7 | 1259 return FAIL; |
1260 } | |
1261 return OK; | |
1262 } | |
1263 | |
1264 | |
1265 #ifdef USE_XSMP | |
1266 /* | |
1267 * Handle XSMP processing, de-registering the attachment upon error | |
1268 */ | |
1269 static XtInputId _xsmp_xtinputid; | |
1270 | |
1271 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1272 local_xsmp_handle_requests( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1273 XtPointer c UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1274 int *s UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1275 XtInputId *i UNUSED) |
7 | 1276 { |
1277 if (xsmp_handle_requests() == FAIL) | |
1278 XtRemoveInput(_xsmp_xtinputid); | |
1279 } | |
1280 #endif | |
1281 | |
1282 | |
1283 /* | |
1284 * Initialise the X GUI. Create all the windows, set up all the call-backs etc. | |
1285 * Returns OK for success, FAIL when the GUI can't be started. | |
1286 */ | |
1287 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1288 gui_mch_init(void) |
7 | 1289 { |
1290 XtGCMask gc_mask; | |
1291 XGCValues gc_vals; | |
1292 int x, y, mask; | |
1293 unsigned w, h; | |
1294 | |
1295 #if 0 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1296 // Uncomment this to enable synchronous mode for debugging |
7 | 1297 XSynchronize(gui.dpy, True); |
1298 #endif | |
1299 | |
1300 vimShell = XtVaAppCreateShell(VIM_NAME, VIM_CLASS, | |
1301 applicationShellWidgetClass, gui.dpy, NULL); | |
1302 | |
1303 /* | |
1304 * Get the application resources | |
1305 */ | |
1306 XtVaGetApplicationResources(vimShell, (XtPointer)&gui, | |
1307 vim_resources, XtNumber(vim_resources), NULL); | |
1308 | |
1309 gui.scrollbar_height = gui.scrollbar_width; | |
1310 | |
1311 /* | |
1312 * Get the colors ourselves. Using the automatic conversion doesn't | |
1313 * handle looking for approximate colors. | |
1314 */ | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1315 // NOTE: These next few lines are an exact duplicate of gui_athena.c's |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1316 // gui_mch_def_colors(). Why? |
7 | 1317 gui.menu_fg_pixel = gui_get_color((char_u *)gui.rsrc_menu_fg_name); |
1318 gui.menu_bg_pixel = gui_get_color((char_u *)gui.rsrc_menu_bg_name); | |
1319 gui.scroll_fg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_fg_name); | |
1320 gui.scroll_bg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_bg_name); | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12317
diff
changeset
|
1321 #ifdef FEAT_BEVAL_GUI |
7 | 1322 gui.tooltip_fg_pixel = gui_get_color((char_u *)gui.rsrc_tooltip_fg_name); |
1323 gui.tooltip_bg_pixel = gui_get_color((char_u *)gui.rsrc_tooltip_bg_name); | |
1324 #endif | |
1325 | |
1326 #if defined(FEAT_MENU) && defined(FEAT_GUI_ATHENA) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1327 // If the menu height was set, don't change it at runtime |
7 | 1328 if (gui.menu_height != MENU_DEFAULT_HEIGHT) |
1329 gui.menu_height_fixed = TRUE; | |
1330 #endif | |
1331 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1332 // Set default foreground and background colours |
7 | 1333 gui.norm_pixel = gui.def_norm_pixel; |
1334 gui.back_pixel = gui.def_back_pixel; | |
1335 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1336 // Check if reverse video needs to be applied (on Sun it's done by X) |
7 | 1337 if (gui.rsrc_rev_video && gui_get_lightness(gui.back_pixel) |
1338 > gui_get_lightness(gui.norm_pixel)) | |
1339 { | |
1340 gui.norm_pixel = gui.def_back_pixel; | |
1341 gui.back_pixel = gui.def_norm_pixel; | |
1342 gui.def_norm_pixel = gui.norm_pixel; | |
1343 gui.def_back_pixel = gui.back_pixel; | |
1344 } | |
1345 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1346 // Get the colors from the "Normal", "Tooltip", "Scrollbar" and "Menu" |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1347 // group (set in syntax.c or in a vimrc file) |
7 | 1348 set_normal_colors(); |
1349 | |
1350 /* | |
1351 * Check that none of the colors are the same as the background color | |
1352 */ | |
1353 gui_check_colors(); | |
1354 | |
1355 /* | |
1356 * Set up the GCs. The font attributes will be set in gui_init_font(). | |
1357 */ | |
1358 gc_mask = GCForeground | GCBackground; | |
1359 gc_vals.foreground = gui.norm_pixel; | |
1360 gc_vals.background = gui.back_pixel; | |
1361 gui.text_gc = XtGetGC(vimShell, gc_mask, &gc_vals); | |
1362 | |
1363 gc_vals.foreground = gui.back_pixel; | |
1364 gc_vals.background = gui.norm_pixel; | |
1365 gui.back_gc = XtGetGC(vimShell, gc_mask, &gc_vals); | |
1366 | |
1367 gc_mask |= GCFunction; | |
1368 gc_vals.foreground = gui.norm_pixel ^ gui.back_pixel; | |
1369 gc_vals.background = gui.norm_pixel ^ gui.back_pixel; | |
1370 gc_vals.function = GXxor; | |
1371 gui.invert_gc = XtGetGC(vimShell, gc_mask, &gc_vals); | |
1372 | |
1373 gui.visibility = VisibilityUnobscured; | |
1374 x11_setup_atoms(gui.dpy); | |
1375 | |
1376 if (gui_win_x != -1 && gui_win_y != -1) | |
1377 gui_mch_set_winpos(gui_win_x, gui_win_y); | |
1378 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1379 // Now adapt the supplied(?) geometry-settings |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1380 // Added by Kjetil Jacobsen <kjetilja@stud.cs.uit.no> |
7 | 1381 if (gui.geom != NULL && *gui.geom != NUL) |
1382 { | |
1383 mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h); | |
1384 if (mask & WidthValue) | |
1385 Columns = w; | |
1386 if (mask & HeightValue) | |
857 | 1387 { |
1887 | 1388 if (p_window > (long)h - 1 || !option_was_set((char_u *)"window")) |
857 | 1389 p_window = h - 1; |
7 | 1390 Rows = h; |
857 | 1391 } |
5086
6ddc1785c4ff
updated for version 7.3.1286
Bram Moolenaar <bram@vim.org>
parents:
4885
diff
changeset
|
1392 limit_screen_size(); |
7 | 1393 /* |
1394 * Set the (x,y) position of the main window only if specified in the | |
1395 * users geometry, so we get good defaults when they don't. This needs | |
1396 * to be done before the shell is popped up. | |
1397 */ | |
1398 if (mask & (XValue|YValue)) | |
1399 XtVaSetValues(vimShell, XtNgeometry, gui.geom, NULL); | |
1400 } | |
1401 | |
1402 gui_x11_create_widgets(); | |
1403 | |
1404 /* | |
1405 * Add an icon to Vim (Marcel Douben: 11 May 1998). | |
1406 */ | |
1407 if (vim_strchr(p_go, GO_ICON) != NULL) | |
1408 { | |
1409 #ifndef HAVE_XPM | |
1410 # include "vim_icon.xbm" | |
1411 # include "vim_mask.xbm" | |
1412 | |
1413 Arg arg[2]; | |
1414 | |
1415 XtSetArg(arg[0], XtNiconPixmap, | |
1416 XCreateBitmapFromData(gui.dpy, | |
1417 DefaultRootWindow(gui.dpy), | |
1418 (char *)vim_icon_bits, | |
1419 vim_icon_width, | |
1420 vim_icon_height)); | |
1421 XtSetArg(arg[1], XtNiconMask, | |
1422 XCreateBitmapFromData(gui.dpy, | |
1423 DefaultRootWindow(gui.dpy), | |
1424 (char *)vim_mask_icon_bits, | |
1425 vim_mask_icon_width, | |
1426 vim_mask_icon_height)); | |
1427 XtSetValues(vimShell, arg, (Cardinal)2); | |
1428 #else | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1429 // Use Pixmaps, looking much nicer. |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1430 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1431 // If you get an error message here, you still need to unpack the runtime |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1432 // archive! |
7 | 1433 # ifdef magick |
1434 # undef magick | |
1435 # endif | |
1436 # define magick vim32x32 | |
1437 # include "../runtime/vim32x32.xpm" | |
1438 # undef magick | |
1439 # define magick vim16x16 | |
1440 # include "../runtime/vim16x16.xpm" | |
1441 # undef magick | |
1442 # define magick vim48x48 | |
1443 # include "../runtime/vim48x48.xpm" | |
1444 # undef magick | |
1445 | |
1446 static Pixmap icon = 0; | |
1447 static Pixmap icon_mask = 0; | |
1448 static char **magick = vim32x32; | |
1449 Window root_window; | |
1450 XIconSize *size; | |
1451 int number_sizes; | |
1452 Display *dsp; | |
1453 Screen *scr; | |
1454 XpmAttributes attr; | |
1455 Colormap cmap; | |
1456 | |
1457 /* | |
1458 * Adjust the icon to the preferences of the actual window manager. | |
1459 */ | |
1460 root_window = XRootWindowOfScreen(XtScreen(vimShell)); | |
1461 if (XGetIconSizes(XtDisplay(vimShell), root_window, | |
1462 &size, &number_sizes) != 0) | |
1463 { | |
1464 if (number_sizes > 0) | |
1465 { | |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1466 if (size->max_height >= 48 && size->max_width >= 48) |
7 | 1467 magick = vim48x48; |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1468 else if (size->max_height >= 32 && size->max_width >= 32) |
7 | 1469 magick = vim32x32; |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1470 else if (size->max_height >= 16 && size->max_width >= 16) |
7 | 1471 magick = vim16x16; |
1472 } | |
1473 } | |
1474 | |
1475 dsp = XtDisplay(vimShell); | |
1476 scr = XtScreen(vimShell); | |
1477 | |
1478 cmap = DefaultColormap(dsp, DefaultScreen(dsp)); | |
1479 XtVaSetValues(vimShell, XtNcolormap, cmap, NULL); | |
1480 | |
1481 attr.valuemask = 0L; | |
1482 attr.valuemask = XpmCloseness | XpmReturnPixels | XpmColormap | XpmDepth; | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1483 attr.closeness = 65535; // accuracy isn't crucial |
7 | 1484 attr.colormap = cmap; |
1485 attr.depth = DefaultDepthOfScreen(scr); | |
1486 | |
1487 if (!icon) | |
1605 | 1488 { |
7 | 1489 XpmCreatePixmapFromData(dsp, root_window, magick, &icon, |
1490 &icon_mask, &attr); | |
1605 | 1491 XpmFreeAttributes(&attr); |
1492 } | |
7 | 1493 |
1494 # ifdef FEAT_GUI_ATHENA | |
1495 XtVaSetValues(vimShell, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL); | |
1496 # else | |
1497 XtVaSetValues(vimShell, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL); | |
1498 # endif | |
1499 #endif | |
1500 } | |
1501 | |
1502 if (gui.color_approx) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
1503 emsg(_("Vim E458: Cannot allocate colormap entry, some colors may be incorrect")); |
7 | 1504 |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12317
diff
changeset
|
1505 #ifdef FEAT_BEVAL_GUI |
7 | 1506 gui_init_tooltip_font(); |
1507 #endif | |
1508 #ifdef FEAT_MENU | |
1509 gui_init_menu_font(); | |
1510 #endif | |
1511 | |
1512 #ifdef USE_XSMP | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1513 // Attach listener on ICE connection |
7 | 1514 if (-1 != xsmp_icefd) |
1515 _xsmp_xtinputid = XtAppAddInput(app_context, xsmp_icefd, | |
1516 (XtPointer)XtInputReadMask, local_xsmp_handle_requests, NULL); | |
1517 #endif | |
1518 | |
1519 return OK; | |
1520 } | |
1521 | |
1522 /* | |
1523 * Called when starting the GUI fails after calling gui_mch_init(). | |
1524 */ | |
1525 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1526 gui_mch_uninit(void) |
7 | 1527 { |
1528 gui_x11_destroy_widgets(); | |
1529 XtCloseDisplay(gui.dpy); | |
1530 gui.dpy = NULL; | |
1531 vimShell = (Widget)0; | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
1532 VIM_CLEAR(gui_argv); |
7 | 1533 } |
1534 | |
1535 /* | |
1536 * Called when the foreground or background color has been changed. | |
1537 */ | |
1538 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1539 gui_mch_new_colors(void) |
7 | 1540 { |
1541 long_u gc_mask; | |
1542 XGCValues gc_vals; | |
1543 | |
1544 gc_mask = GCForeground | GCBackground; | |
1545 gc_vals.foreground = gui.norm_pixel; | |
1546 gc_vals.background = gui.back_pixel; | |
1547 if (gui.text_gc != NULL) | |
1548 XChangeGC(gui.dpy, gui.text_gc, gc_mask, &gc_vals); | |
1549 | |
1550 gc_vals.foreground = gui.back_pixel; | |
1551 gc_vals.background = gui.norm_pixel; | |
1552 if (gui.back_gc != NULL) | |
1553 XChangeGC(gui.dpy, gui.back_gc, gc_mask, &gc_vals); | |
1554 | |
1555 gc_mask |= GCFunction; | |
1556 gc_vals.foreground = gui.norm_pixel ^ gui.back_pixel; | |
1557 gc_vals.background = gui.norm_pixel ^ gui.back_pixel; | |
1558 gc_vals.function = GXxor; | |
1559 if (gui.invert_gc != NULL) | |
1560 XChangeGC(gui.dpy, gui.invert_gc, gc_mask, &gc_vals); | |
1561 | |
1562 gui_x11_set_back_color(); | |
1563 } | |
1564 | |
1565 /* | |
1566 * Open the GUI window which was created by a call to gui_mch_init(). | |
1567 */ | |
1568 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1569 gui_mch_open(void) |
7 | 1570 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1571 // Actually open the window |
557 | 1572 XtRealizeWidget(vimShell); |
1573 XtManageChild(XtNameToWidget(vimShell, "*vimForm")); | |
7 | 1574 |
1575 gui.wid = gui_x11_get_wid(); | |
1576 gui.blank_pointer = gui_x11_create_blank_mouse(); | |
1577 | |
1578 /* | |
1579 * Add a callback for the Close item on the window managers menu, and the | |
1580 * save-yourself event. | |
1581 */ | |
1582 wm_atoms[SAVE_YOURSELF_IDX] = | |
1583 XInternAtom(gui.dpy, "WM_SAVE_YOURSELF", False); | |
1584 wm_atoms[DELETE_WINDOW_IDX] = | |
1585 XInternAtom(gui.dpy, "WM_DELETE_WINDOW", False); | |
1586 XSetWMProtocols(gui.dpy, XtWindow(vimShell), wm_atoms, 2); | |
1587 XtAddEventHandler(vimShell, NoEventMask, True, gui_x11_wm_protocol_handler, | |
1588 NULL); | |
1589 #ifdef HAVE_X11_XMU_EDITRES_H | |
1590 /* | |
1591 * Enable editres protocol (see "man editres"). | |
1592 * Usually will need to add -lXmu to the linker line as well. | |
1593 */ | |
1594 XtAddEventHandler(vimShell, (EventMask)0, True, _XEditResCheckMessages, | |
1595 (XtPointer)NULL); | |
1596 #endif | |
1597 | |
1598 #ifdef FEAT_CLIENTSERVER | |
1599 if (serverName == NULL && serverDelayedStartName != NULL) | |
1600 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1601 // This is a :gui command in a plain vim with no previous server |
7 | 1602 commWindow = XtWindow(vimShell); |
1603 (void)serverRegisterName(gui.dpy, serverDelayedStartName); | |
1604 } | |
1605 else | |
1606 { | |
1607 /* | |
1608 * Cannot handle "widget-less" windows with XtProcessEvent() we'll | |
1609 * have to change the "server" registration to that of the main window | |
1610 * If we have not registered a name yet, remember the window | |
1611 */ | |
1612 serverChangeRegisteredWindow(gui.dpy, XtWindow(vimShell)); | |
1613 } | |
1614 XtAddEventHandler(vimShell, PropertyChangeMask, False, | |
1615 gui_x11_send_event_handler, NULL); | |
1616 #endif | |
1617 | |
1618 | |
1619 #if defined(FEAT_MENU) && defined(FEAT_GUI_ATHENA) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1620 // The Athena GUI needs this again after opening the window |
7 | 1621 gui_position_menu(); |
1622 # ifdef FEAT_TOOLBAR | |
1623 gui_mch_set_toolbar_pos(0, gui.menu_height, gui.menu_width, | |
1624 gui.toolbar_height); | |
1625 # endif | |
1626 #endif | |
1627 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1628 // Get the colors for the highlight groups (gui_check_colors() might have |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1629 // changed them) |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1630 highlight_gui_started(); // re-init colors and fonts |
7 | 1631 |
1632 #ifdef FEAT_XIM | |
1633 xim_init(); | |
1634 #endif | |
1635 | |
1636 return OK; | |
1637 } | |
1638 | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12317
diff
changeset
|
1639 #if defined(FEAT_BEVAL_GUI) || defined(PROTO) |
7 | 1640 /* |
1641 * Convert the tooltip fontset name to an XFontSet. | |
1642 */ | |
1643 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1644 gui_init_tooltip_font(void) |
7 | 1645 { |
1646 XrmValue from, to; | |
1647 | |
1648 from.addr = (char *)gui.rsrc_tooltip_font_name; | |
1649 from.size = strlen(from.addr); | |
1650 to.addr = (XtPointer)&gui.tooltip_fontset; | |
1651 to.size = sizeof(XFontSet); | |
1652 | |
1653 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontSet, &to) == False) | |
1654 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1655 // Failed. What to do? |
7 | 1656 } |
1657 } | |
1658 #endif | |
1659 | |
1660 #if defined(FEAT_MENU) || defined(PROTO) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1661 // Convert the menu font/fontset name to an XFontStruct/XFontset |
7 | 1662 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1663 gui_init_menu_font(void) |
7 | 1664 { |
1665 XrmValue from, to; | |
1666 | |
1667 #ifdef FONTSET_ALWAYS | |
1668 from.addr = (char *)gui.rsrc_menu_font_name; | |
1669 from.size = strlen(from.addr); | |
1670 to.addr = (XtPointer)&gui.menu_fontset; | |
1671 to.size = sizeof(GuiFontset); | |
1672 | |
1673 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontSet, &to) == False) | |
1674 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1675 // Failed. What to do? |
7 | 1676 } |
1677 #else | |
1678 from.addr = (char *)gui.rsrc_menu_font_name; | |
1679 from.size = strlen(from.addr); | |
1680 to.addr = (XtPointer)&gui.menu_font; | |
1681 to.size = sizeof(GuiFont); | |
1682 | |
1683 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontStruct, &to) == False) | |
1684 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1685 // Failed. What to do? |
7 | 1686 } |
1687 #endif | |
1688 } | |
1689 #endif | |
1690 | |
1691 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1692 gui_mch_exit(int rc UNUSED) |
7 | 1693 { |
1694 #if 0 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1695 // Lesstif gives an error message here, and so does Solaris. The man page |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1696 // says that this isn't needed when exiting, so just skip it. |
7 | 1697 XtCloseDisplay(gui.dpy); |
1698 #endif | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
1699 VIM_CLEAR(gui_argv); |
7 | 1700 } |
1701 | |
1702 /* | |
1703 * Get the position of the top left corner of the window. | |
1704 */ | |
1705 int | |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
1706 gui_mch_get_winpos(int *x, int *y) |
7 | 1707 { |
1708 Dimension xpos, ypos; | |
1709 | |
1710 XtVaGetValues(vimShell, | |
1711 XtNx, &xpos, | |
1712 XtNy, &ypos, | |
1713 NULL); | |
1714 *x = xpos; | |
1715 *y = ypos; | |
1716 return OK; | |
1717 } | |
1718 | |
1719 /* | |
1720 * Set the position of the top left corner of the window to the given | |
1721 * coordinates. | |
1722 */ | |
1723 void | |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
1724 gui_mch_set_winpos(int x, int y) |
7 | 1725 { |
1726 XtVaSetValues(vimShell, | |
1727 XtNx, x, | |
1728 XtNy, y, | |
1729 NULL); | |
1730 } | |
1731 | |
1732 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1733 gui_mch_set_shellsize( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1734 int width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1735 int height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1736 int min_width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1737 int min_height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1738 int base_width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1739 int base_height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1740 int direction UNUSED) |
7 | 1741 { |
51 | 1742 #ifdef FEAT_XIM |
1743 height += xim_get_status_area_height(), | |
1744 #endif | |
7 | 1745 XtVaSetValues(vimShell, |
1746 XtNwidthInc, gui.char_width, | |
1747 XtNheightInc, gui.char_height, | |
1748 #if defined(XtSpecificationRelease) && XtSpecificationRelease >= 4 | |
1749 XtNbaseWidth, base_width, | |
1750 XtNbaseHeight, base_height, | |
1751 #endif | |
1752 XtNminWidth, min_width, | |
1753 XtNminHeight, min_height, | |
1754 XtNwidth, width, | |
1755 XtNheight, height, | |
1756 NULL); | |
1757 } | |
1758 | |
1759 /* | |
445 | 1760 * Allow 10 pixels for horizontal borders, 'guiheadroom' for vertical borders. |
7 | 1761 * Is there no way in X to find out how wide the borders really are? |
1762 */ | |
1763 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1764 gui_mch_get_screen_dimensions( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1765 int *screen_w, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1766 int *screen_h) |
7 | 1767 { |
1768 *screen_w = DisplayWidth(gui.dpy, DefaultScreen(gui.dpy)) - 10; | |
1769 *screen_h = DisplayHeight(gui.dpy, DefaultScreen(gui.dpy)) - p_ghr; | |
1770 } | |
1771 | |
1772 /* | |
1773 * Initialise vim to use the font "font_name". If it's NULL, pick a default | |
1774 * font. | |
1775 * If "fontset" is TRUE, load the "font_name" as a fontset. | |
1776 * Return FAIL if the font could not be loaded, OK otherwise. | |
1777 */ | |
1778 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1779 gui_mch_init_font( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1780 char_u *font_name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1781 int do_fontset UNUSED) |
7 | 1782 { |
1783 XFontStruct *font = NULL; | |
1784 | |
1785 #ifdef FEAT_XFONTSET | |
1786 XFontSet fontset = NULL; | |
46 | 1787 #endif |
1788 | |
1789 #ifdef FEAT_GUI_MOTIF | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1790 // A font name equal "*" is indicating, that we should activate the font |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1791 // selection dialogue to get a new font name. So let us do it here. |
46 | 1792 if (font_name != NULL && STRCMP(font_name, "*") == 0) |
1793 font_name = gui_xm_select_font(hl_get_font_name()); | |
1794 #endif | |
1795 | |
1796 #ifdef FEAT_XFONTSET | |
7 | 1797 if (do_fontset) |
1798 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1799 // If 'guifontset' is set, VIM treats all font specifications as if |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1800 // they were fontsets, and 'guifontset' becomes the default. |
7 | 1801 if (font_name != NULL) |
1802 { | |
1803 fontset = (XFontSet)gui_mch_get_fontset(font_name, FALSE, TRUE); | |
1804 if (fontset == NULL) | |
1805 return FAIL; | |
1806 } | |
1807 } | |
1808 else | |
1809 #endif | |
1810 { | |
1811 if (font_name == NULL) | |
1812 { | |
1813 /* | |
1814 * If none of the fonts in 'font' could be loaded, try the one set | |
1815 * in the X resource, and finally just try using DFLT_FONT, which | |
1816 * will hopefully always be there. | |
1817 */ | |
1818 font_name = gui.rsrc_font_name; | |
1819 font = (XFontStruct *)gui_mch_get_font(font_name, FALSE); | |
1820 if (font == NULL) | |
1821 font_name = (char_u *)DFLT_FONT; | |
1822 } | |
1823 if (font == NULL) | |
1824 font = (XFontStruct *)gui_mch_get_font(font_name, FALSE); | |
1825 if (font == NULL) | |
1826 return FAIL; | |
1827 } | |
1828 | |
1829 gui_mch_free_font(gui.norm_font); | |
1830 #ifdef FEAT_XFONTSET | |
1831 gui_mch_free_fontset(gui.fontset); | |
1832 | |
1833 if (fontset != NULL) | |
1834 { | |
1835 gui.norm_font = NOFONT; | |
1836 gui.fontset = (GuiFontset)fontset; | |
1837 gui.char_width = fontset_width(fontset); | |
1838 gui.char_height = fontset_height(fontset) + p_linespace; | |
1839 gui.char_ascent = fontset_ascent(fontset) + p_linespace / 2; | |
1840 } | |
1841 else | |
1842 #endif | |
1843 { | |
1844 gui.norm_font = (GuiFont)font; | |
1845 #ifdef FEAT_XFONTSET | |
1846 gui.fontset = NOFONTSET; | |
1847 #endif | |
1848 gui.char_width = font->max_bounds.width; | |
1849 gui.char_height = font->ascent + font->descent + p_linespace; | |
1850 gui.char_ascent = font->ascent + p_linespace / 2; | |
1851 } | |
1852 | |
1853 hl_set_font_name(font_name); | |
1854 | |
1855 /* | |
1856 * Try to load other fonts for bold, italic, and bold-italic. | |
1857 * We should also try to work out what font to use for these when they are | |
1858 * not specified by X resources, but we don't yet. | |
1859 */ | |
1860 if (font_name == gui.rsrc_font_name) | |
1861 { | |
1862 if (gui.bold_font == NOFONT | |
1863 && gui.rsrc_bold_font_name != NULL | |
1864 && *gui.rsrc_bold_font_name != NUL) | |
1865 gui.bold_font = gui_mch_get_font(gui.rsrc_bold_font_name, FALSE); | |
1866 if (gui.ital_font == NOFONT | |
1867 && gui.rsrc_ital_font_name != NULL | |
1868 && *gui.rsrc_ital_font_name != NUL) | |
1869 gui.ital_font = gui_mch_get_font(gui.rsrc_ital_font_name, FALSE); | |
1870 if (gui.boldital_font == NOFONT | |
1871 && gui.rsrc_boldital_font_name != NULL | |
1872 && *gui.rsrc_boldital_font_name != NUL) | |
1873 gui.boldital_font = gui_mch_get_font(gui.rsrc_boldital_font_name, | |
1874 FALSE); | |
1875 } | |
1876 else | |
1877 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1878 // When not using the font specified by the resources, also don't use |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1879 // the bold/italic fonts, otherwise setting 'guifont' will look very |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1880 // strange. |
7 | 1881 if (gui.bold_font != NOFONT) |
1882 { | |
1883 XFreeFont(gui.dpy, (XFontStruct *)gui.bold_font); | |
1884 gui.bold_font = NOFONT; | |
1885 } | |
1886 if (gui.ital_font != NOFONT) | |
1887 { | |
1888 XFreeFont(gui.dpy, (XFontStruct *)gui.ital_font); | |
1889 gui.ital_font = NOFONT; | |
1890 } | |
1891 if (gui.boldital_font != NOFONT) | |
1892 { | |
1893 XFreeFont(gui.dpy, (XFontStruct *)gui.boldital_font); | |
1894 gui.boldital_font = NOFONT; | |
1895 } | |
1896 } | |
1897 | |
46 | 1898 #ifdef FEAT_GUI_MOTIF |
1899 gui_motif_synch_fonts(); | |
1900 #endif | |
1901 | |
7 | 1902 return OK; |
1903 } | |
1904 | |
1905 /* | |
1906 * Get a font structure for highlighting. | |
1907 */ | |
1908 GuiFont | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1909 gui_mch_get_font(char_u *name, int giveErrorIfMissing) |
7 | 1910 { |
1911 XFontStruct *font; | |
1912 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1913 if (!gui.in_use || name == NULL) // can't do this when GUI not running |
7 | 1914 return NOFONT; |
1915 | |
1916 font = XLoadQueryFont(gui.dpy, (char *)name); | |
1917 | |
1918 if (font == NULL) | |
1919 { | |
1920 if (giveErrorIfMissing) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
1921 semsg(_(e_font), name); |
7 | 1922 return NOFONT; |
1923 } | |
1924 | |
1925 #ifdef DEBUG | |
1926 printf("Font Information for '%s':\n", name); | |
1927 printf(" w = %d, h = %d, ascent = %d, descent = %d\n", | |
1928 font->max_bounds.width, font->ascent + font->descent, | |
1929 font->ascent, font->descent); | |
1930 printf(" max ascent = %d, max descent = %d, max h = %d\n", | |
1931 font->max_bounds.ascent, font->max_bounds.descent, | |
1932 font->max_bounds.ascent + font->max_bounds.descent); | |
1933 printf(" min lbearing = %d, min rbearing = %d\n", | |
1934 font->min_bounds.lbearing, font->min_bounds.rbearing); | |
1935 printf(" max lbearing = %d, max rbearing = %d\n", | |
1936 font->max_bounds.lbearing, font->max_bounds.rbearing); | |
1937 printf(" leftink = %d, rightink = %d\n", | |
1938 (font->min_bounds.lbearing < 0), | |
1939 (font->max_bounds.rbearing > font->max_bounds.width)); | |
1940 printf("\n"); | |
1941 #endif | |
1942 | |
1943 if (font->max_bounds.width != font->min_bounds.width) | |
1944 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
1945 semsg(_(e_fontwidth), name); |
7 | 1946 XFreeFont(gui.dpy, font); |
1947 return NOFONT; | |
1948 } | |
1949 return (GuiFont)font; | |
1950 } | |
1951 | |
46 | 1952 #if defined(FEAT_EVAL) || defined(PROTO) |
38 | 1953 /* |
1954 * Return the name of font "font" in allocated memory. | |
1955 */ | |
1956 char_u * | |
11119
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1957 gui_mch_get_fontname(GuiFont font, char_u *name) |
38 | 1958 { |
11119
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1959 char_u *ret = NULL; |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1960 |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1961 if (name != NULL && font == NULL) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1962 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1963 // In this case, there's no way other than doing this. |
11119
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1964 ret = vim_strsave(name); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1965 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1966 else if (font != NULL) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1967 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1968 // In this case, try to retrieve the XLFD corresponding to 'font'->fid; |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1969 // if failed, use 'name' unless it's NULL. |
11119
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1970 unsigned long value = 0L; |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1971 |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1972 if (XGetFontProperty(font, XA_FONT, &value)) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1973 { |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1974 char *xa_font_name = NULL; |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1975 |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1976 xa_font_name = XGetAtomName(gui.dpy, value); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1977 if (xa_font_name != NULL) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1978 { |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1979 ret = vim_strsave((char_u *)xa_font_name); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1980 XFree(xa_font_name); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1981 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1982 else if (name != NULL) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1983 ret = vim_strsave(name); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1984 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1985 else if (name != NULL) |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1986 ret = vim_strsave(name); |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1987 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1988 return ret; |
38 | 1989 } |
46 | 1990 #endif |
38 | 1991 |
445 | 1992 /* |
1993 * Adjust gui.char_height (after 'linespace' was changed). | |
1994 */ | |
7 | 1995 int |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1996 gui_mch_adjust_charheight(void) |
7 | 1997 { |
1998 #ifdef FEAT_XFONTSET | |
1999 if (gui.fontset != NOFONTSET) | |
2000 { | |
2001 gui.char_height = fontset_height((XFontSet)gui.fontset) + p_linespace; | |
2002 gui.char_ascent = fontset_ascent((XFontSet)gui.fontset) | |
2003 + p_linespace / 2; | |
2004 } | |
2005 else | |
2006 #endif | |
2007 { | |
2008 XFontStruct *font = (XFontStruct *)gui.norm_font; | |
2009 | |
2010 gui.char_height = font->ascent + font->descent + p_linespace; | |
2011 gui.char_ascent = font->ascent + p_linespace / 2; | |
2012 } | |
2013 return OK; | |
2014 } | |
2015 | |
2016 /* | |
2017 * Set the current text font. | |
2018 */ | |
2019 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2020 gui_mch_set_font(GuiFont font) |
7 | 2021 { |
2022 static Font prev_font = (Font)-1; | |
2023 Font fid = ((XFontStruct *)font)->fid; | |
2024 | |
2025 if (fid != prev_font) | |
2026 { | |
2027 XSetFont(gui.dpy, gui.text_gc, fid); | |
2028 XSetFont(gui.dpy, gui.back_gc, fid); | |
2029 prev_font = fid; | |
2030 gui.char_ascent = ((XFontStruct *)font)->ascent + p_linespace / 2; | |
2031 } | |
2032 #ifdef FEAT_XFONTSET | |
2033 current_fontset = (XFontSet)NULL; | |
2034 #endif | |
2035 } | |
2036 | |
2037 #if defined(FEAT_XFONTSET) || defined(PROTO) | |
2038 /* | |
2039 * Set the current text fontset. | |
2040 * Adjust the ascent, in case it's different. | |
2041 */ | |
2042 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2043 gui_mch_set_fontset(GuiFontset fontset) |
7 | 2044 { |
2045 current_fontset = (XFontSet)fontset; | |
2046 gui.char_ascent = fontset_ascent(current_fontset) + p_linespace / 2; | |
2047 } | |
2048 #endif | |
2049 | |
2050 /* | |
2051 * If a font is not going to be used, free its structure. | |
2052 */ | |
2053 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2054 gui_mch_free_font(GuiFont font) |
7 | 2055 { |
2056 if (font != NOFONT) | |
2057 XFreeFont(gui.dpy, (XFontStruct *)font); | |
2058 } | |
2059 | |
2060 #if defined(FEAT_XFONTSET) || defined(PROTO) | |
2061 /* | |
2062 * If a fontset is not going to be used, free its structure. | |
2063 */ | |
2064 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2065 gui_mch_free_fontset(GuiFontset fontset) |
7 | 2066 { |
2067 if (fontset != NOFONTSET) | |
2068 XFreeFontSet(gui.dpy, (XFontSet)fontset); | |
2069 } | |
2070 | |
2071 /* | |
2072 * Load the fontset "name". | |
2073 * Return a reference to the fontset, or NOFONTSET when failing. | |
2074 */ | |
2075 GuiFontset | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2076 gui_mch_get_fontset( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2077 char_u *name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2078 int giveErrorIfMissing, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2079 int fixed_width) |
7 | 2080 { |
2081 XFontSet fontset; | |
2082 char **missing, *def_str; | |
2083 int num_missing; | |
2084 | |
2085 if (!gui.in_use || name == NULL) | |
2086 return NOFONTSET; | |
2087 | |
2088 fontset = XCreateFontSet(gui.dpy, (char *)name, &missing, &num_missing, | |
2089 &def_str); | |
2090 if (num_missing > 0) | |
2091 { | |
2092 int i; | |
2093 | |
2094 if (giveErrorIfMissing) | |
2095 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2096 semsg(_("E250: Fonts for the following charsets are missing in fontset %s:"), name); |
7 | 2097 for (i = 0; i < num_missing; i++) |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2098 semsg("%s", missing[i]); |
7 | 2099 } |
2100 XFreeStringList(missing); | |
2101 } | |
2102 | |
2103 if (fontset == NULL) | |
2104 { | |
2105 if (giveErrorIfMissing) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2106 semsg(_(e_fontset), name); |
7 | 2107 return NOFONTSET; |
2108 } | |
2109 | |
2110 if (fixed_width && check_fontset_sanity(fontset) == FAIL) | |
2111 { | |
2112 XFreeFontSet(gui.dpy, fontset); | |
2113 return NOFONTSET; | |
2114 } | |
2115 return (GuiFontset)fontset; | |
2116 } | |
2117 | |
2118 /* | |
2119 * Check if fontset "fs" is fixed width. | |
2120 */ | |
2121 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2122 check_fontset_sanity(XFontSet fs) |
7 | 2123 { |
2124 XFontStruct **xfs; | |
2125 char **font_name; | |
2126 int fn; | |
2127 char *base_name; | |
2128 int i; | |
2129 int min_width; | |
2130 int min_font_idx = 0; | |
2131 | |
2132 base_name = XBaseFontNameListOfFontSet(fs); | |
2133 fn = XFontsOfFontSet(fs, &xfs, &font_name); | |
2134 for (i = 0; i < fn; i++) | |
2135 { | |
2136 if (xfs[i]->max_bounds.width != xfs[i]->min_bounds.width) | |
2137 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2138 semsg(_("E252: Fontset name: %s"), base_name); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2139 semsg(_("Font '%s' is not fixed-width"), font_name[i]); |
7 | 2140 return FAIL; |
2141 } | |
2142 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2143 // scan base font width |
7 | 2144 min_width = 32767; |
2145 for (i = 0; i < fn; i++) | |
2146 { | |
2147 if (xfs[i]->max_bounds.width<min_width) | |
2148 { | |
2149 min_width = xfs[i]->max_bounds.width; | |
2150 min_font_idx = i; | |
2151 } | |
2152 } | |
2153 for (i = 0; i < fn; i++) | |
2154 { | |
2155 if ( xfs[i]->max_bounds.width != 2 * min_width | |
2156 && xfs[i]->max_bounds.width != min_width) | |
2157 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2158 semsg(_("E253: Fontset name: %s"), base_name); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2159 semsg(_("Font0: %s"), font_name[min_font_idx]); |
15500
7ce4992e4ab7
patch 8.1.0758: font number is always one instead of the actual
Bram Moolenaar <Bram@vim.org>
parents:
15490
diff
changeset
|
2160 semsg(_("Font%d: %s"), i, font_name[i]); |
15490
98c35d312987
patch 8.1.0753: printf format not checked for semsg()
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
2161 semsg(_("Font%d width is not twice that of font0"), i); |
98c35d312987
patch 8.1.0753: printf format not checked for semsg()
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
2162 semsg(_("Font0 width: %d"), |
98c35d312987
patch 8.1.0753: printf format not checked for semsg()
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
2163 (int)xfs[min_font_idx]->max_bounds.width); |
98c35d312987
patch 8.1.0753: printf format not checked for semsg()
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
2164 semsg(_("Font%d width: %d"), i, (int)xfs[i]->max_bounds.width); |
7 | 2165 return FAIL; |
2166 } | |
2167 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2168 // it seems ok. Good Luck!! |
7 | 2169 return OK; |
2170 } | |
2171 | |
2172 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2173 fontset_width(XFontSet fs) |
7 | 2174 { |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2175 return XmbTextEscapement(fs, "Vim", 3) / 3; |
7 | 2176 } |
2177 | |
2178 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2179 fontset_height( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2180 XFontSet fs) |
7 | 2181 { |
2182 XFontSetExtents *extents; | |
2183 | |
2184 extents = XExtentsOfFontSet(fs); | |
2185 return extents->max_logical_extent.height; | |
2186 } | |
2187 | |
2188 #if (defined(FONTSET_ALWAYS) && defined(FEAT_GUI_ATHENA) \ | |
2189 && defined(FEAT_MENU)) || defined(PROTO) | |
2190 /* | |
2191 * Returns the bounding box height around the actual glyph image of all | |
2192 * characters in all fonts of the fontset. | |
2193 */ | |
2194 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2195 fontset_height2(XFontSet fs) |
7 | 2196 { |
2197 XFontSetExtents *extents; | |
2198 | |
2199 extents = XExtentsOfFontSet(fs); | |
2200 return extents->max_ink_extent.height; | |
2201 } | |
2202 #endif | |
2203 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2204 #if 0 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2205 // NOT USED YET |
7 | 2206 static int |
7856
226ed297307f
commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents:
7825
diff
changeset
|
2207 fontset_descent(XFontSet fs) |
7 | 2208 { |
2209 XFontSetExtents *extents; | |
2210 | |
2211 extents = XExtentsOfFontSet (fs); | |
2212 return extents->max_logical_extent.height + extents->max_logical_extent.y; | |
2213 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2214 #endif |
7 | 2215 |
2216 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2217 fontset_ascent(XFontSet fs) |
7 | 2218 { |
2219 XFontSetExtents *extents; | |
2220 | |
2221 extents = XExtentsOfFontSet(fs); | |
2222 return -extents->max_logical_extent.y; | |
2223 } | |
2224 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2225 #endif // FEAT_XFONTSET |
7 | 2226 |
2227 /* | |
2228 * Return the Pixel value (color) for the given color name. | |
2229 * Return INVALCOLOR for error. | |
2230 */ | |
2231 guicolor_T | |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2232 gui_mch_get_color(char_u *name) |
7 | 2233 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
2234 guicolor_T requested; |
7 | 2235 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2236 // can't do this when GUI not running |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2237 if (!gui.in_use || name == NULL || *name == NUL) |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2238 return INVALCOLOR; |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2239 |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2240 requested = gui_get_color_cmn(name); |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2241 if (requested == INVALCOLOR) |
7 | 2242 return INVALCOLOR; |
2243 | |
11745
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2244 return gui_mch_get_rgb_color( |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2245 (requested & 0xff0000) >> 16, |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2246 (requested & 0xff00) >> 8, |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2247 requested & 0xff); |
11745
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2248 } |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2249 |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2250 /* |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2251 * Return the Pixel value (color) for the given RGB values. |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2252 * Return INVALCOLOR for error. |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2253 */ |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2254 guicolor_T |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2255 gui_mch_get_rgb_color(int r, int g, int b) |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2256 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
2257 XColor available; |
11770
0aa1910a3dfa
patch 8.0.0767: build failure with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
11745
diff
changeset
|
2258 Colormap colormap; |
11745
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2259 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2260 #if 0 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2261 // Using XParseColor() is very slow, put rgb in XColor directly. |
13858
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2262 |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2263 char spec[8]; // space enough to hold "#RRGGBB" |
11745
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2264 vim_snprintf(spec, sizeof(spec), "#%.2x%.2x%.2x", r, g, b); |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2265 if (XParseColor(gui.dpy, colormap, (char *)spec, &available) != 0 |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2266 && XAllocColor(gui.dpy, colormap, &available) != 0) |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2267 return (guicolor_T)available.pixel; |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2268 #endif |
13858
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2269 colormap = DefaultColormap(gui.dpy, DefaultScreen(gui.dpy)); |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2270 vim_memset(&available, 0, sizeof(XColor)); |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2271 available.red = r << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2272 available.green = g << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2273 available.blue = b << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2274 if (XAllocColor(gui.dpy, colormap, &available) != 0) |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2275 return (guicolor_T)available.pixel; |
7 | 2276 |
2277 return INVALCOLOR; | |
2278 } | |
2279 | |
2280 /* | |
206 | 2281 * Set the current text foreground color. |
2282 */ | |
7 | 2283 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2284 gui_mch_set_fg_color(guicolor_T color) |
7 | 2285 { |
2286 if (color != prev_fg_color) | |
2287 { | |
2288 XSetForeground(gui.dpy, gui.text_gc, (Pixel)color); | |
2289 prev_fg_color = color; | |
2290 } | |
2291 } | |
2292 | |
2293 /* | |
2294 * Set the current text background color. | |
2295 */ | |
2296 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2297 gui_mch_set_bg_color(guicolor_T color) |
7 | 2298 { |
2299 if (color != prev_bg_color) | |
2300 { | |
2301 XSetBackground(gui.dpy, gui.text_gc, (Pixel)color); | |
2302 prev_bg_color = color; | |
2303 } | |
2304 } | |
2305 | |
2306 /* | |
206 | 2307 * Set the current text special color. |
2308 */ | |
2309 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2310 gui_mch_set_sp_color(guicolor_T color) |
206 | 2311 { |
2312 prev_sp_color = color; | |
2313 } | |
2314 | |
2315 /* | |
7 | 2316 * create a mouse pointer that is blank |
2317 */ | |
2318 static Cursor | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2319 gui_x11_create_blank_mouse(void) |
7 | 2320 { |
2321 Pixmap blank_pixmap = XCreatePixmap(gui.dpy, gui.wid, 1, 1, 1); | |
2322 GC gc = XCreateGC(gui.dpy, blank_pixmap, (unsigned long)0, (XGCValues*)0); | |
2323 XDrawPoint(gui.dpy, blank_pixmap, gc, 0, 0); | |
2324 XFreeGC(gui.dpy, gc); | |
2325 return XCreatePixmapCursor(gui.dpy, blank_pixmap, blank_pixmap, | |
2326 (XColor*)&gui.norm_pixel, (XColor*)&gui.norm_pixel, 0, 0); | |
2327 } | |
2328 | |
206 | 2329 /* |
2330 * Draw a curled line at the bottom of the character cell. | |
2331 */ | |
2332 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2333 draw_curl(int row, int col, int cells) |
206 | 2334 { |
2335 int i; | |
2336 int offset; | |
1887 | 2337 static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; |
206 | 2338 |
2339 XSetForeground(gui.dpy, gui.text_gc, prev_sp_color); | |
2340 for (i = FILL_X(col); i < FILL_X(col + cells); ++i) | |
2341 { | |
2342 offset = val[i % 8]; | |
2343 XDrawPoint(gui.dpy, gui.wid, gui.text_gc, i, | |
2344 FILL_Y(row + 1) - 1 - offset); | |
2345 } | |
2346 XSetForeground(gui.dpy, gui.text_gc, prev_fg_color); | |
2347 } | |
2348 | |
7 | 2349 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2350 gui_mch_draw_string( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2351 int row, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2352 int col, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2353 char_u *s, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2354 int len, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2355 int flags) |
7 | 2356 { |
2357 int cells = len; | |
717 | 2358 static void *buf = NULL; |
7 | 2359 static int buflen = 0; |
2360 char_u *p; | |
2361 int wlen = 0; | |
2362 int c; | |
2363 | |
2364 if (enc_utf8) | |
2365 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2366 // Convert UTF-8 byte sequence to 16 bit characters for the X |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2367 // functions. Need a buffer for the 16 bit characters. Keep it |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2368 // between calls, because allocating it each time is slow. |
7 | 2369 if (buflen < len) |
2370 { | |
2371 XtFree((char *)buf); | |
717 | 2372 buf = (void *)XtMalloc(len * (sizeof(XChar2b) < sizeof(wchar_t) |
2373 ? sizeof(wchar_t) : sizeof(XChar2b))); | |
7 | 2374 buflen = len; |
2375 } | |
2376 p = s; | |
2377 cells = 0; | |
2378 while (p < s + len) | |
2379 { | |
2380 c = utf_ptr2char(p); | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2381 #ifdef FEAT_XFONTSET |
717 | 2382 if (current_fontset != NULL) |
2383 { | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2384 # ifdef SMALL_WCHAR_T |
1887 | 2385 if (c >= 0x10000) |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2386 c = 0xbf; // show chars > 0xffff as ? |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2387 # endif |
717 | 2388 ((wchar_t *)buf)[wlen] = c; |
2389 } | |
2390 else | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2391 #endif |
717 | 2392 { |
2393 if (c >= 0x10000) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2394 c = 0xbf; // show chars > 0xffff as ? |
717 | 2395 ((XChar2b *)buf)[wlen].byte1 = (unsigned)c >> 8; |
2396 ((XChar2b *)buf)[wlen].byte2 = c; | |
2397 } | |
7 | 2398 ++wlen; |
2399 cells += utf_char2cells(c); | |
474 | 2400 p += utf_ptr2len(p); |
7 | 2401 } |
2402 } | |
2403 else if (has_mbyte) | |
2404 { | |
2405 cells = 0; | |
2406 for (p = s; p < s + len; ) | |
2407 { | |
2408 cells += ptr2cells(p); | |
474 | 2409 p += (*mb_ptr2len)(p); |
7 | 2410 } |
2411 } | |
2412 | |
2413 #ifdef FEAT_XFONTSET | |
2414 if (current_fontset != NULL) | |
2415 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2416 // Setup a clip rectangle to avoid spilling over in the next or |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2417 // previous line. This is apparently needed for some fonts which are |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2418 // used in a fontset. |
7 | 2419 XRectangle clip; |
2420 | |
2421 clip.x = 0; | |
2422 clip.y = 0; | |
2423 clip.height = gui.char_height; | |
2424 clip.width = gui.char_width * cells + 1; | |
2425 XSetClipRectangles(gui.dpy, gui.text_gc, FILL_X(col), FILL_Y(row), | |
2426 &clip, 1, Unsorted); | |
2427 } | |
2428 #endif | |
2429 | |
2430 if (flags & DRAW_TRANSP) | |
2431 { | |
2432 if (enc_utf8) | |
2433 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2434 TEXT_Y(row), buf, wlen); | |
2435 else | |
2436 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2437 TEXT_Y(row), (char *)s, len); | |
2438 } | |
2439 else if (p_linespace != 0 | |
2440 #ifdef FEAT_XFONTSET | |
2441 || current_fontset != NULL | |
2442 #endif | |
2443 ) | |
2444 { | |
2445 XSetForeground(gui.dpy, gui.text_gc, prev_bg_color); | |
2446 XFillRectangle(gui.dpy, gui.wid, gui.text_gc, FILL_X(col), | |
2447 FILL_Y(row), gui.char_width * cells, gui.char_height); | |
2448 XSetForeground(gui.dpy, gui.text_gc, prev_fg_color); | |
206 | 2449 |
7 | 2450 if (enc_utf8) |
2451 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2452 TEXT_Y(row), buf, wlen); | |
2453 else | |
2454 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2455 TEXT_Y(row), (char *)s, len); | |
2456 } | |
2457 else | |
2458 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2459 // XmbDrawImageString has bug, don't use it for fontset. |
7 | 2460 if (enc_utf8) |
2461 XDrawImageString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2462 TEXT_Y(row), buf, wlen); | |
2463 else | |
2464 XDrawImageString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2465 TEXT_Y(row), (char *)s, len); | |
2466 } | |
2467 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2468 // Bold trick: draw the text again with a one-pixel offset. |
7 | 2469 if (flags & DRAW_BOLD) |
2470 { | |
2471 if (enc_utf8) | |
2472 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col) + 1, | |
2473 TEXT_Y(row), buf, wlen); | |
2474 else | |
2475 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col) + 1, | |
2476 TEXT_Y(row), (char *)s, len); | |
2477 } | |
2478 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2479 // Undercurl: draw curl at the bottom of the character cell. |
206 | 2480 if (flags & DRAW_UNDERC) |
2481 draw_curl(row, col, cells); | |
2482 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2483 // Underline: draw a line at the bottom of the character cell. |
7 | 2484 if (flags & DRAW_UNDERL) |
206 | 2485 { |
2486 int y = FILL_Y(row + 1) - 1; | |
2487 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2488 // When p_linespace is 0, overwrite the bottom row of pixels. |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2489 // Otherwise put the line just below the character. |
206 | 2490 if (p_linespace > 1) |
2491 y -= p_linespace - 1; | |
7 | 2492 XDrawLine(gui.dpy, gui.wid, gui.text_gc, FILL_X(col), |
206 | 2493 y, FILL_X(col + cells) - 1, y); |
2494 } | |
7 | 2495 |
12317
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2496 if (flags & DRAW_STRIKE) |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2497 { |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2498 int y = FILL_Y(row + 1) - gui.char_height/2; |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2499 |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2500 XSetForeground(gui.dpy, gui.text_gc, prev_sp_color); |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2501 XDrawLine(gui.dpy, gui.wid, gui.text_gc, FILL_X(col), |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2502 y, FILL_X(col + cells) - 1, y); |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2503 XSetForeground(gui.dpy, gui.text_gc, prev_fg_color); |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2504 } |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2505 |
7 | 2506 #ifdef FEAT_XFONTSET |
2507 if (current_fontset != NULL) | |
2508 XSetClipMask(gui.dpy, gui.text_gc, None); | |
2509 #endif | |
2510 } | |
2511 | |
2512 /* | |
2513 * Return OK if the key with the termcap name "name" is supported. | |
2514 */ | |
2515 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2516 gui_mch_haskey(char_u *name) |
7 | 2517 { |
2518 int i; | |
2519 | |
2520 for (i = 0; special_keys[i].key_sym != (KeySym)0; i++) | |
2521 if (name[0] == special_keys[i].vim_code0 && | |
2522 name[1] == special_keys[i].vim_code1) | |
2523 return OK; | |
2524 return FAIL; | |
2525 } | |
2526 | |
2527 /* | |
2528 * Return the text window-id and display. Only required for X-based GUI's | |
2529 */ | |
2530 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2531 gui_get_x11_windis(Window *win, Display **dis) |
7 | 2532 { |
2533 *win = XtWindow(vimShell); | |
2534 *dis = gui.dpy; | |
2535 return OK; | |
2536 } | |
2537 | |
2538 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2539 gui_mch_beep(void) |
7 | 2540 { |
2541 XBell(gui.dpy, 0); | |
2542 } | |
2543 | |
2544 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2545 gui_mch_flash(int msec) |
7 | 2546 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2547 // Do a visual beep by reversing the foreground and background colors |
7 | 2548 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, 0, 0, |
2549 FILL_X((int)Columns) + gui.border_offset, | |
2550 FILL_Y((int)Rows) + gui.border_offset); | |
2551 XSync(gui.dpy, False); | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2552 ui_delay((long)msec, TRUE); // wait for a few msec |
7 | 2553 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, 0, 0, |
2554 FILL_X((int)Columns) + gui.border_offset, | |
2555 FILL_Y((int)Rows) + gui.border_offset); | |
2556 } | |
2557 | |
2558 /* | |
2559 * Invert a rectangle from row r, column c, for nr rows and nc columns. | |
2560 */ | |
2561 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2562 gui_mch_invert_rectangle( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2563 int r, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2564 int c, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2565 int nr, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2566 int nc) |
7 | 2567 { |
2568 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, | |
2569 FILL_X(c), FILL_Y(r), (nc) * gui.char_width, (nr) * gui.char_height); | |
2570 } | |
2571 | |
2572 /* | |
2573 * Iconify the GUI window. | |
2574 */ | |
2575 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2576 gui_mch_iconify(void) |
7 | 2577 { |
2578 XIconifyWindow(gui.dpy, XtWindow(vimShell), DefaultScreen(gui.dpy)); | |
2579 } | |
2580 | |
2581 #if defined(FEAT_EVAL) || defined(PROTO) | |
2582 /* | |
2583 * Bring the Vim window to the foreground. | |
2584 */ | |
2585 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2586 gui_mch_set_foreground(void) |
7 | 2587 { |
2588 XMapRaised(gui.dpy, XtWindow(vimShell)); | |
2589 } | |
2590 #endif | |
2591 | |
2592 /* | |
2593 * Draw a cursor without focus. | |
2594 */ | |
2595 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2596 gui_mch_draw_hollow_cursor(guicolor_T color) |
7 | 2597 { |
2598 int w = 1; | |
2599 | |
2600 if (mb_lefthalve(gui.row, gui.col)) | |
2601 w = 2; | |
2602 gui_mch_set_fg_color(color); | |
2603 XDrawRectangle(gui.dpy, gui.wid, gui.text_gc, FILL_X(gui.col), | |
2604 FILL_Y(gui.row), w * gui.char_width - 1, gui.char_height - 1); | |
2605 } | |
2606 | |
2607 /* | |
2608 * Draw part of a cursor, "w" pixels wide, and "h" pixels high, using | |
2609 * color "color". | |
2610 */ | |
2611 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2612 gui_mch_draw_part_cursor(int w, int h, guicolor_T color) |
7 | 2613 { |
2614 gui_mch_set_fg_color(color); | |
2615 | |
2616 XFillRectangle(gui.dpy, gui.wid, gui.text_gc, | |
2617 #ifdef FEAT_RIGHTLEFT | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2618 // vertical line should be on the right of current point |
7 | 2619 CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : |
2620 #endif | |
2621 FILL_X(gui.col), | |
2622 FILL_Y(gui.row) + gui.char_height - h, | |
2623 w, h); | |
2624 } | |
2625 | |
2626 /* | |
2627 * Catch up with any queued X events. This may put keyboard input into the | |
2628 * input buffer, call resize call-backs, trigger timers etc. If there is | |
2629 * nothing in the X event queue (& no timers pending), then we return | |
2630 * immediately. | |
2631 */ | |
2632 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2633 gui_mch_update(void) |
7 | 2634 { |
2635 XtInputMask mask, desired; | |
2636 | |
2637 #ifdef ALT_X_INPUT | |
2638 if (suppress_alternate_input) | |
2639 desired = (XtIMXEvent | XtIMTimer); | |
2640 else | |
2641 #endif | |
2642 desired = (XtIMAll); | |
2643 while ((mask = XtAppPending(app_context)) && (mask & desired) | |
2644 && !vim_is_input_buf_full()) | |
2645 XtAppProcessEvent(app_context, desired); | |
2646 } | |
2647 | |
2648 /* | |
2649 * GUI input routine called by gui_wait_for_chars(). Waits for a character | |
2650 * from the keyboard. | |
2651 * wtime == -1 Wait forever. | |
2652 * wtime == 0 This should never happen. | |
2653 * wtime > 0 Wait wtime milliseconds for a character. | |
2654 * Returns OK if a character was found to be available within the given time, | |
2655 * or FAIL otherwise. | |
2656 */ | |
2657 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2658 gui_mch_wait_for_chars(long wtime) |
7 | 2659 { |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2660 int focus; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2661 int retval = FAIL; |
7 | 2662 |
2663 /* | |
2664 * Make this static, in case gui_x11_timer_cb is called after leaving | |
2665 * this function (otherwise a random value on the stack may be changed). | |
2666 */ | |
2667 static int timed_out; | |
2668 XtIntervalId timer = (XtIntervalId)0; | |
2669 XtInputMask desired; | |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2670 #ifdef FEAT_JOB_CHANNEL |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2671 XtIntervalId channel_timer = (XtIntervalId)0; |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2672 #endif |
7 | 2673 |
2674 timed_out = FALSE; | |
2675 | |
15665
31367ce5aac7
patch 8.1.0840: getchar(0) never returns a character in the terminal
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2676 if (wtime >= 0) |
31367ce5aac7
patch 8.1.0840: getchar(0) never returns a character in the terminal
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2677 timer = XtAppAddTimeOut(app_context, |
31367ce5aac7
patch 8.1.0840: getchar(0) never returns a character in the terminal
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2678 (long_u)(wtime == 0 ? 1L : wtime), |
31367ce5aac7
patch 8.1.0840: getchar(0) never returns a character in the terminal
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2679 gui_x11_timer_cb, &timed_out); |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2680 #ifdef FEAT_JOB_CHANNEL |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2681 // If there is a channel with the keep_open flag we need to poll for input |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2682 // on them. |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2683 if (channel_any_keep_open()) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2684 channel_timer = XtAppAddTimeOut(app_context, (long_u)20, |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2685 channel_poll_cb, (XtPointer)&channel_timer); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2686 #endif |
7 | 2687 |
2688 focus = gui.in_focus; | |
15510
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15500
diff
changeset
|
2689 desired = (XtIMAll); |
7 | 2690 while (!timed_out) |
2691 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2692 // Stop or start blinking when focus changes |
7 | 2693 if (gui.in_focus != focus) |
2694 { | |
2695 if (gui.in_focus) | |
2696 gui_mch_start_blink(); | |
2697 else | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
2698 gui_mch_stop_blink(TRUE); |
7 | 2699 focus = gui.in_focus; |
2700 } | |
2701 | |
7109
fa95595fbc52
commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents:
5196
diff
changeset
|
2702 #ifdef MESSAGE_QUEUE |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2703 # ifdef FEAT_TIMERS |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2704 did_add_timer = FALSE; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2705 # endif |
7109
fa95595fbc52
commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents:
5196
diff
changeset
|
2706 parse_queued_messages(); |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2707 # ifdef FEAT_TIMERS |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2708 if (did_add_timer) |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2709 // Need to recompute the waiting time. |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2710 break; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2711 # endif |
2638 | 2712 #endif |
2713 | |
7 | 2714 /* |
2715 * Don't use gui_mch_update() because then we will spin-lock until a | |
2716 * char arrives, instead we use XtAppProcessEvent() to hang until an | |
2717 * event arrives. No need to check for input_buf_full because we are | |
2718 * returning as soon as it contains a single char. Note that | |
2719 * XtAppNextEvent() may not be used because it will not return after a | |
2720 * timer event has arrived -- webb | |
2721 */ | |
2722 XtAppProcessEvent(app_context, desired); | |
2723 | |
2724 if (input_available()) | |
2725 { | |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2726 retval = OK; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2727 break; |
7 | 2728 } |
2729 } | |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2730 |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2731 if (timer != (XtIntervalId)0 && !timed_out) |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2732 XtRemoveTimeOut(timer); |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2733 #ifdef FEAT_JOB_CHANNEL |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2734 if (channel_timer != (XtIntervalId)0) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2735 XtRemoveTimeOut(channel_timer); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2736 #endif |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2737 |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2738 return retval; |
7 | 2739 } |
2740 | |
2741 /* | |
2742 * Output routines. | |
2743 */ | |
2744 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2745 /* |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2746 * Flush any output to the screen |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2747 */ |
7 | 2748 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2749 gui_mch_flush(void) |
7 | 2750 { |
2751 XFlush(gui.dpy); | |
2752 } | |
2753 | |
2754 /* | |
2755 * Clear a rectangular region of the screen from text pos (row1, col1) to | |
2756 * (row2, col2) inclusive. | |
2757 */ | |
2758 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2759 gui_mch_clear_block( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2760 int row1, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2761 int col1, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2762 int row2, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2763 int col2) |
7 | 2764 { |
2765 int x; | |
2766 | |
2767 x = FILL_X(col1); | |
2768 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2769 // Clear one extra pixel at the far right, for when bold characters have |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2770 // spilled over to the next column. |
7 | 2771 XFillRectangle(gui.dpy, gui.wid, gui.back_gc, x, FILL_Y(row1), |
2772 (col2 - col1 + 1) * gui.char_width + (col2 == Columns - 1), | |
2773 (row2 - row1 + 1) * gui.char_height); | |
2774 } | |
2775 | |
2776 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2777 gui_mch_clear_all(void) |
7 | 2778 { |
2779 XClearArea(gui.dpy, gui.wid, 0, 0, 0, 0, False); | |
2780 } | |
2781 | |
2782 /* | |
2783 * Delete the given number of lines from the given row, scrolling up any | |
2784 * text further down within the scroll region. | |
2785 */ | |
2786 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2787 gui_mch_delete_lines(int row, int num_lines) |
7 | 2788 { |
2789 if (gui.visibility == VisibilityFullyObscured) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2790 return; // Can't see the window |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2791 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2792 // copy one extra pixel at the far right, for when bold has spilled |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2793 // over |
7 | 2794 XCopyArea(gui.dpy, gui.wid, gui.wid, gui.text_gc, |
2795 FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), | |
2796 gui.char_width * (gui.scroll_region_right - gui.scroll_region_left + 1) | |
2797 + (gui.scroll_region_right == Columns - 1), | |
2798 gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), | |
2799 FILL_X(gui.scroll_region_left), FILL_Y(row)); | |
2800 | |
2801 gui_clear_block(gui.scroll_region_bot - num_lines + 1, | |
2802 gui.scroll_region_left, | |
2803 gui.scroll_region_bot, gui.scroll_region_right); | |
2804 gui_x11_check_copy_area(); | |
2805 } | |
2806 | |
2807 /* | |
2808 * Insert the given number of lines before the given row, scrolling down any | |
2809 * following text within the scroll region. | |
2810 */ | |
2811 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2812 gui_mch_insert_lines(int row, int num_lines) |
7 | 2813 { |
2814 if (gui.visibility == VisibilityFullyObscured) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2815 return; // Can't see the window |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2816 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2817 // copy one extra pixel at the far right, for when bold has spilled |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2818 // over |
7 | 2819 XCopyArea(gui.dpy, gui.wid, gui.wid, gui.text_gc, |
2820 FILL_X(gui.scroll_region_left), FILL_Y(row), | |
2821 gui.char_width * (gui.scroll_region_right - gui.scroll_region_left + 1) | |
2822 + (gui.scroll_region_right == Columns - 1), | |
2823 gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), | |
2824 FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines)); | |
2825 | |
2826 gui_clear_block(row, gui.scroll_region_left, | |
2827 row + num_lines - 1, gui.scroll_region_right); | |
2828 gui_x11_check_copy_area(); | |
2829 } | |
2830 | |
2831 /* | |
2832 * Update the region revealed by scrolling up/down. | |
2833 */ | |
2834 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2835 gui_x11_check_copy_area(void) |
7 | 2836 { |
2837 XEvent event; | |
2838 XGraphicsExposeEvent *gevent; | |
2839 | |
2840 if (gui.visibility != VisibilityPartiallyObscured) | |
2841 return; | |
2842 | |
2843 XFlush(gui.dpy); | |
2844 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2845 // Wait to check whether the scroll worked or not |
7 | 2846 for (;;) |
2847 { | |
2848 if (XCheckTypedEvent(gui.dpy, NoExpose, &event)) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2849 return; // The scroll worked. |
7 | 2850 |
2851 if (XCheckTypedEvent(gui.dpy, GraphicsExpose, &event)) | |
2852 { | |
2853 gevent = (XGraphicsExposeEvent *)&event; | |
2854 gui_redraw(gevent->x, gevent->y, gevent->width, gevent->height); | |
2855 if (gevent->count == 0) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2856 return; // This was the last expose event |
7 | 2857 } |
2858 XSync(gui.dpy, False); | |
2859 } | |
2860 } | |
2861 | |
2862 /* | |
2863 * X Selection stuff, for cutting and pasting text to other windows. | |
2864 */ | |
2865 | |
2866 void | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2867 clip_mch_lose_selection(Clipboard_T *cbd) |
7 | 2868 { |
2869 clip_x11_lose_selection(vimShell, cbd); | |
2870 } | |
2871 | |
2872 int | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2873 clip_mch_own_selection(Clipboard_T *cbd) |
7 | 2874 { |
2875 return clip_x11_own_selection(vimShell, cbd); | |
2876 } | |
2877 | |
2878 void | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2879 clip_mch_request_selection(Clipboard_T *cbd) |
7 | 2880 { |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2881 clip_x11_request_selection(vimShell, gui.dpy, cbd); |
7 | 2882 } |
2883 | |
2884 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2885 clip_mch_set_selection( |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2886 Clipboard_T *cbd) |
7 | 2887 { |
2888 clip_x11_set_selection(cbd); | |
2889 } | |
2890 | |
2891 #if defined(FEAT_MENU) || defined(PROTO) | |
2892 /* | |
2893 * Menu stuff. | |
2894 */ | |
2895 | |
2896 /* | |
2897 * Make a menu either grey or not grey. | |
2898 */ | |
2899 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2900 gui_mch_menu_grey(vimmenu_T *menu, int grey) |
7 | 2901 { |
2902 if (menu->id != (Widget)0) | |
2903 { | |
2904 gui_mch_menu_hidden(menu, False); | |
2905 if (grey | |
2906 #ifdef FEAT_GUI_MOTIF | |
2907 || !menu->sensitive | |
2908 #endif | |
2909 ) | |
2910 XtSetSensitive(menu->id, False); | |
2911 else | |
2912 XtSetSensitive(menu->id, True); | |
2913 } | |
2914 } | |
2915 | |
2916 /* | |
2917 * Make menu item hidden or not hidden | |
2918 */ | |
2919 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2920 gui_mch_menu_hidden(vimmenu_T *menu, int hidden) |
7 | 2921 { |
2922 if (menu->id != (Widget)0) | |
2923 { | |
2924 if (hidden) | |
2925 XtUnmanageChild(menu->id); | |
2926 else | |
2927 XtManageChild(menu->id); | |
2928 } | |
2929 } | |
2930 | |
2931 /* | |
2932 * This is called after setting all the menus to grey/hidden or not. | |
2933 */ | |
2934 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2935 gui_mch_draw_menubar(void) |
7 | 2936 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2937 // Nothing to do in X |
7 | 2938 } |
2939 | |
2940 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2941 gui_x11_menu_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2942 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2943 XtPointer client_data, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2944 XtPointer call_data UNUSED) |
7 | 2945 { |
2946 gui_menu_cb((vimmenu_T *)client_data); | |
2947 } | |
2948 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2949 #endif // FEAT_MENU |
7 | 2950 |
2951 | |
2952 | |
2953 /* | |
2954 * Function called when window closed. Works like ":qa". | |
2955 * Should put up a requester! | |
2956 */ | |
2957 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2958 gui_x11_wm_protocol_handler( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2959 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2960 XtPointer client_data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2961 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2962 Boolean *dum UNUSED) |
7 | 2963 { |
2964 /* | |
2965 * Only deal with Client messages. | |
2966 */ | |
2967 if (event->type != ClientMessage) | |
2968 return; | |
2969 | |
2970 /* | |
2971 * The WM_SAVE_YOURSELF event arrives when the window manager wants to | |
2972 * exit. That can be cancelled though, thus Vim shouldn't exit here. | |
2973 * Just sync our swap files. | |
2974 */ | |
1887 | 2975 if ((Atom)((XClientMessageEvent *)event)->data.l[0] == |
7 | 2976 wm_atoms[SAVE_YOURSELF_IDX]) |
2977 { | |
2978 out_flush(); | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2979 ml_sync_all(FALSE, FALSE); // preserve all swap files |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2980 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2981 // Set the window's WM_COMMAND property, to let the window manager |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2982 // know we are done saving ourselves. We don't want to be restarted, |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2983 // thus set argv to NULL. |
7 | 2984 XSetCommand(gui.dpy, XtWindow(vimShell), NULL, 0); |
2985 return; | |
2986 } | |
2987 | |
1887 | 2988 if ((Atom)((XClientMessageEvent *)event)->data.l[0] != |
7 | 2989 wm_atoms[DELETE_WINDOW_IDX]) |
2990 return; | |
2991 | |
2992 gui_shell_closed(); | |
2993 } | |
2994 | |
2995 #ifdef FEAT_CLIENTSERVER | |
2996 /* | |
2997 * Function called when property changed. Check for incoming commands | |
2998 */ | |
2999 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3000 gui_x11_send_event_handler( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3001 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3002 XtPointer client_data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3003 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3004 Boolean *dum UNUSED) |
7 | 3005 { |
3006 XPropertyEvent *e = (XPropertyEvent *) event; | |
3007 | |
3008 if (e->type == PropertyNotify && e->window == commWindow | |
3009 && e->atom == commProperty && e->state == PropertyNewValue) | |
7109
fa95595fbc52
commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents:
5196
diff
changeset
|
3010 serverEventProc(gui.dpy, event, 0); |
7 | 3011 } |
3012 #endif | |
3013 | |
3014 /* | |
3015 * Cursor blink functions. | |
3016 * | |
3017 * This is a simple state machine: | |
3018 * BLINK_NONE not blinking at all | |
3019 * BLINK_OFF blinking, cursor is not shown | |
3020 * BLINK_ON blinking, cursor is shown | |
3021 */ | |
3022 | |
3023 #define BLINK_NONE 0 | |
3024 #define BLINK_OFF 1 | |
3025 #define BLINK_ON 2 | |
3026 | |
3027 static int blink_state = BLINK_NONE; | |
3028 static long_u blink_waittime = 700; | |
3029 static long_u blink_ontime = 400; | |
3030 static long_u blink_offtime = 250; | |
3031 static XtIntervalId blink_timer = (XtIntervalId)0; | |
3032 | |
9213
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3033 int |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3034 gui_mch_is_blinking(void) |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3035 { |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3036 return blink_state != BLINK_NONE; |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3037 } |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
3038 |
9428
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3039 int |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3040 gui_mch_is_blink_off(void) |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3041 { |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3042 return blink_state == BLINK_OFF; |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3043 } |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
3044 |
7 | 3045 void |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
3046 gui_mch_set_blinking(long waittime, long on, long off) |
7 | 3047 { |
3048 blink_waittime = waittime; | |
3049 blink_ontime = on; | |
3050 blink_offtime = off; | |
3051 } | |
3052 | |
3053 /* | |
3054 * Stop the cursor blinking. Show the cursor if it wasn't shown. | |
3055 */ | |
3056 void | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
3057 gui_mch_stop_blink(int may_call_gui_update_cursor) |
7 | 3058 { |
3059 if (blink_timer != (XtIntervalId)0) | |
3060 { | |
3061 XtRemoveTimeOut(blink_timer); | |
3062 blink_timer = (XtIntervalId)0; | |
3063 } | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
3064 if (blink_state == BLINK_OFF && may_call_gui_update_cursor) |
7 | 3065 gui_update_cursor(TRUE, FALSE); |
3066 blink_state = BLINK_NONE; | |
3067 } | |
3068 | |
3069 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3070 gui_x11_blink_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3071 XtPointer timed_out UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3072 XtIntervalId *interval_id UNUSED) |
7 | 3073 { |
3074 if (blink_state == BLINK_ON) | |
3075 { | |
3076 gui_undraw_cursor(); | |
3077 blink_state = BLINK_OFF; | |
3078 blink_timer = XtAppAddTimeOut(app_context, blink_offtime, | |
3079 gui_x11_blink_cb, NULL); | |
3080 } | |
3081 else | |
3082 { | |
3083 gui_update_cursor(TRUE, FALSE); | |
3084 blink_state = BLINK_ON; | |
3085 blink_timer = XtAppAddTimeOut(app_context, blink_ontime, | |
3086 gui_x11_blink_cb, NULL); | |
3087 } | |
3088 } | |
3089 | |
3090 /* | |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3091 * Start the cursor blinking. If it was already blinking, this restarts the |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3092 * waiting time and shows the cursor. |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3093 */ |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3094 void |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3095 gui_mch_start_blink(void) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3096 { |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3097 if (blink_timer != (XtIntervalId)0) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3098 XtRemoveTimeOut(blink_timer); |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3099 // Only switch blinking on if none of the times is zero |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3100 if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus) |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3101 { |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3102 blink_timer = XtAppAddTimeOut(app_context, blink_waittime, |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3103 gui_x11_blink_cb, NULL); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3104 blink_state = BLINK_ON; |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3105 gui_update_cursor(TRUE, FALSE); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3106 } |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3107 } |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3108 |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3109 /* |
7 | 3110 * Return the RGB value of a pixel as a long. |
3111 */ | |
9939
ccb6461b82df
commit https://github.com/vim/vim/commit/1b58cdd160c2e0ada0f638679a2aa27e4665fc48
Christian Brabandt <cb@256bit.org>
parents:
9634
diff
changeset
|
3112 guicolor_T |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3113 gui_mch_get_rgb(guicolor_T pixel) |
7 | 3114 { |
3115 XColor xc; | |
3116 Colormap colormap; | |
3117 | |
3118 colormap = DefaultColormap(gui.dpy, XDefaultScreen(gui.dpy)); | |
3119 xc.pixel = pixel; | |
3120 XQueryColor(gui.dpy, colormap, &xc); | |
3121 | |
9939
ccb6461b82df
commit https://github.com/vim/vim/commit/1b58cdd160c2e0ada0f638679a2aa27e4665fc48
Christian Brabandt <cb@256bit.org>
parents:
9634
diff
changeset
|
3122 return (guicolor_T)(((xc.red & 0xff00) << 8) + (xc.green & 0xff00) |
ccb6461b82df
commit https://github.com/vim/vim/commit/1b58cdd160c2e0ada0f638679a2aa27e4665fc48
Christian Brabandt <cb@256bit.org>
parents:
9634
diff
changeset
|
3123 + ((unsigned)xc.blue >> 8)); |
7 | 3124 } |
3125 | |
3126 /* | |
3127 * Add the callback functions. | |
3128 */ | |
3129 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3130 gui_x11_callbacks(Widget textArea, Widget vimForm) |
7 | 3131 { |
3132 XtAddEventHandler(textArea, VisibilityChangeMask, FALSE, | |
3133 gui_x11_visibility_cb, (XtPointer)0); | |
3134 | |
3135 XtAddEventHandler(textArea, ExposureMask, FALSE, gui_x11_expose_cb, | |
3136 (XtPointer)0); | |
3137 | |
3138 XtAddEventHandler(vimShell, StructureNotifyMask, FALSE, | |
3139 gui_x11_resize_window_cb, (XtPointer)0); | |
3140 | |
3141 XtAddEventHandler(vimShell, FocusChangeMask, FALSE, gui_x11_focus_change_cb, | |
3142 (XtPointer)0); | |
3143 /* | |
3144 * Only install these enter/leave callbacks when 'p' in 'guioptions'. | |
3145 * Only needed for some window managers. | |
3146 */ | |
3147 if (vim_strchr(p_go, GO_POINTER) != NULL) | |
3148 { | |
3149 XtAddEventHandler(vimShell, LeaveWindowMask, FALSE, gui_x11_leave_cb, | |
3150 (XtPointer)0); | |
3151 XtAddEventHandler(textArea, LeaveWindowMask, FALSE, gui_x11_leave_cb, | |
3152 (XtPointer)0); | |
3153 XtAddEventHandler(textArea, EnterWindowMask, FALSE, gui_x11_enter_cb, | |
3154 (XtPointer)0); | |
3155 XtAddEventHandler(vimShell, EnterWindowMask, FALSE, gui_x11_enter_cb, | |
3156 (XtPointer)0); | |
3157 } | |
3158 | |
3159 XtAddEventHandler(vimForm, KeyPressMask, FALSE, gui_x11_key_hit_cb, | |
3160 (XtPointer)0); | |
3161 XtAddEventHandler(textArea, KeyPressMask, FALSE, gui_x11_key_hit_cb, | |
3162 (XtPointer)0); | |
3163 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3164 // get pointer moved events from scrollbar, needed for 'mousefocus' |
7 | 3165 XtAddEventHandler(vimForm, PointerMotionMask, |
3166 FALSE, gui_x11_mouse_cb, (XtPointer)1); | |
3167 XtAddEventHandler(textArea, ButtonPressMask | ButtonReleaseMask | | |
3168 ButtonMotionMask | PointerMotionMask, | |
3169 FALSE, gui_x11_mouse_cb, (XtPointer)0); | |
3170 } | |
3171 | |
3172 /* | |
88 | 3173 * Get current mouse coordinates in text window. |
7 | 3174 */ |
88 | 3175 void |
3176 gui_mch_getmouse(int *x, int *y) | |
7 | 3177 { |
3178 int rootx, rooty, winx, winy; | |
3179 Window root, child; | |
3180 unsigned int mask; | |
3181 | |
3182 if (gui.wid && XQueryPointer(gui.dpy, gui.wid, &root, &child, | |
88 | 3183 &rootx, &rooty, &winx, &winy, &mask)) { |
3184 *x = winx; | |
3185 *y = winy; | |
3186 } else { | |
3187 *x = -1; | |
3188 *y = -1; | |
3189 } | |
7 | 3190 } |
3191 | |
3192 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3193 gui_mch_setmouse(int x, int y) |
7 | 3194 { |
3195 if (gui.wid) | |
3196 XWarpPointer(gui.dpy, (Window)0, gui.wid, 0, 0, 0, 0, x, y); | |
3197 } | |
3198 | |
3199 #if (defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU)) || defined(PROTO) | |
3200 XButtonPressedEvent * | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3201 gui_x11_get_last_mouse_event(void) |
7 | 3202 { |
3203 return &last_mouse_event; | |
3204 } | |
3205 #endif | |
3206 | |
3207 #if defined(FEAT_SIGN_ICONS) || defined(PROTO) | |
3208 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3209 // Signs are currently always 2 chars wide. Hopefully the font is big enough |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3210 // to provide room for the bitmap! |
7 | 3211 # define SIGN_WIDTH (gui.char_width * 2) |
3212 | |
3213 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3214 gui_mch_drawsign(int row, int col, int typenr) |
7 | 3215 { |
3216 XImage *sign; | |
3217 | |
3218 if (gui.in_use && (sign = (XImage *)sign_get_image(typenr)) != NULL) | |
3219 { | |
3220 XClearArea(gui.dpy, gui.wid, TEXT_X(col), TEXT_Y(row) - sign->height, | |
3221 SIGN_WIDTH, gui.char_height, FALSE); | |
3222 XPutImage(gui.dpy, gui.wid, gui.text_gc, sign, 0, 0, | |
3223 TEXT_X(col) + (SIGN_WIDTH - sign->width) / 2, | |
3224 TEXT_Y(row) - sign->height, | |
3225 sign->width, sign->height); | |
3226 } | |
3227 } | |
3228 | |
3229 void * | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3230 gui_mch_register_sign(char_u *signfile) |
7 | 3231 { |
3232 XpmAttributes attrs; | |
1827 | 3233 XImage *sign = NULL; |
7 | 3234 int status; |
3235 | |
3236 /* | |
3237 * Setup the color substitution table. | |
3238 */ | |
3239 if (signfile[0] != NUL && signfile[0] != '-') | |
3240 { | |
1827 | 3241 XpmColorSymbol color[5] = |
7 | 3242 { |
1827 | 3243 {"none", NULL, 0}, |
3244 {"iconColor1", NULL, 0}, | |
3245 {"bottomShadowColor", NULL, 0}, | |
3246 {"topShadowColor", NULL, 0}, | |
3247 {"selectColor", NULL, 0} | |
3248 }; | |
3249 attrs.valuemask = XpmColorSymbols; | |
3250 attrs.numsymbols = 2; | |
3251 attrs.colorsymbols = color; | |
3252 attrs.colorsymbols[0].pixel = gui.back_pixel; | |
3253 attrs.colorsymbols[1].pixel = gui.norm_pixel; | |
3254 status = XpmReadFileToImage(gui.dpy, (char *)signfile, | |
7 | 3255 &sign, NULL, &attrs); |
1827 | 3256 if (status == 0) |
3257 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3258 // Sign width is fixed at two columns now. |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3259 // if (sign->width > gui.sign_width) |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3260 // gui.sign_width = sign->width + 8; |
7 | 3261 } |
1827 | 3262 else |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
3263 emsg(_(e_signdata)); |
7 | 3264 } |
3265 | |
3266 return (void *)sign; | |
3267 } | |
3268 | |
3269 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3270 gui_mch_destroy_sign(void *sign) |
7 | 3271 { |
1827 | 3272 XDestroyImage((XImage*)sign); |
7 | 3273 } |
3274 #endif | |
3275 | |
3276 | |
3277 #ifdef FEAT_MOUSESHAPE | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3278 // The last set mouse pointer shape is remembered, to be used when it goes |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3279 // from hidden to not hidden. |
7 | 3280 static int last_shape = 0; |
3281 #endif | |
3282 | |
3283 /* | |
3284 * Use the blank mouse pointer or not. | |
3285 */ | |
3286 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3287 gui_mch_mousehide( |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3288 int hide) // TRUE = use blank ptr, FALSE = use parent ptr |
7 | 3289 { |
3290 if (gui.pointer_hidden != hide) | |
3291 { | |
3292 gui.pointer_hidden = hide; | |
3293 if (hide) | |
3294 XDefineCursor(gui.dpy, gui.wid, gui.blank_pointer); | |
3295 else | |
3296 #ifdef FEAT_MOUSESHAPE | |
3297 mch_set_mouse_shape(last_shape); | |
3298 #else | |
3299 XUndefineCursor(gui.dpy, gui.wid); | |
3300 #endif | |
3301 } | |
3302 } | |
3303 | |
3304 #if defined(FEAT_MOUSESHAPE) || defined(PROTO) | |
3305 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3306 // Table for shape IDs. Keep in sync with the mshape_names[] table in |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3307 // misc2.c! |
7 | 3308 static int mshape_ids[] = |
3309 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3310 XC_left_ptr, // arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3311 0, // blank |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3312 XC_xterm, // beam |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3313 XC_sb_v_double_arrow, // updown |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3314 XC_sizing, // udsizing |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3315 XC_sb_h_double_arrow, // leftright |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3316 XC_sizing, // lrsizing |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3317 XC_watch, // busy |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3318 XC_X_cursor, // no |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3319 XC_crosshair, // crosshair |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3320 XC_hand1, // hand1 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3321 XC_hand2, // hand2 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3322 XC_pencil, // pencil |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3323 XC_question_arrow, // question |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3324 XC_right_ptr, // right-arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3325 XC_center_ptr, // up-arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3326 XC_left_ptr // last one |
7 | 3327 }; |
3328 | |
3329 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3330 mch_set_mouse_shape(int shape) |
7 | 3331 { |
3332 int id; | |
3333 | |
3334 if (!gui.in_use) | |
3335 return; | |
3336 | |
3337 if (shape == MSHAPE_HIDE || gui.pointer_hidden) | |
3338 XDefineCursor(gui.dpy, gui.wid, gui.blank_pointer); | |
3339 else | |
3340 { | |
3341 if (shape >= MSHAPE_NUMBERED) | |
3342 { | |
3343 id = shape - MSHAPE_NUMBERED; | |
3344 if (id >= XC_num_glyphs) | |
3345 id = XC_left_ptr; | |
3346 else | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3347 id &= ~1; // they are always even (why?) |
7 | 3348 } |
3349 else | |
3350 id = mshape_ids[shape]; | |
3351 | |
3352 XDefineCursor(gui.dpy, gui.wid, XCreateFontCursor(gui.dpy, id)); | |
3353 } | |
3354 if (shape != MSHAPE_HIDE) | |
3355 last_shape = shape; | |
3356 } | |
3357 #endif | |
3358 | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12317
diff
changeset
|
3359 #if (defined(FEAT_TOOLBAR) && defined(FEAT_BEVAL_GUI)) || defined(PROTO) |
7 | 3360 /* |
3361 * Set the balloon-eval used for the tooltip of a toolbar menu item. | |
3362 * The check for a non-toolbar item was added, because there is a crash when | |
3363 * passing a normal menu item here. Can't explain that, but better avoid it. | |
3364 */ | |
3365 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3366 gui_mch_menu_set_tip(vimmenu_T *menu) |
7 | 3367 { |
3368 if (menu->id != NULL && menu->parent != NULL | |
3369 && menu_is_toolbar(menu->parent->name)) | |
3370 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3371 // Always destroy and create the balloon, in case the string was |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3372 // changed. |
7 | 3373 if (menu->tip != NULL) |
3374 { | |
3375 gui_mch_destroy_beval_area(menu->tip); | |
3376 menu->tip = NULL; | |
3377 } | |
3378 if (menu->strings[MENU_INDEX_TIP] != NULL) | |
3379 menu->tip = gui_mch_create_beval_area( | |
3380 menu->id, | |
3381 menu->strings[MENU_INDEX_TIP], | |
3382 NULL, | |
3383 NULL); | |
3384 } | |
3385 } | |
3386 #endif |