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