Mercurial > vim
annotate src/gui_x11.c @ 34454:f8fed6c8bb60 v9.1.0143
patch 9.1.0143: [security]: autocmd causes use-after-free in set_curbuf()
Commit: https://github.com/vim/vim/commit/55f8bba73be5f9c3a5a4d0d6c5f56e65f2c7d3fc
Author: Christian Brabandt <cb@256bit.org>
Date: Wed Feb 28 23:32:00 2024 +0100
patch 9.1.0143: [security]: autocmd causes use-after-free in set_curbuf()
Problem: [security]: autocmd cause use-after-free in set_curbuf()
(kawarimidoll)
Solution: check side-effect of BufLeave autocommand, when the number
of windows changed, close windows containing buffers that will
be wiped, if curbuf changed unexpectedly make sure b_nwindows
is decremented otherwise it cannot be wiped
set_curbuf() already makes some efforts to ensure the BufLeave
autocommands do not cause issues. However there are still 2 issues
that are not taken care of:
1) If a BufLeave autocommand opens a new window containing the same
buffer as that is going got be closed in close_buffer() a bit later,
we suddenly have another window open, containing a free'd buffer. So we
must check if the number of windows changed and if it does (and the
current buffer is going to be wiped (according to the 'bufhidden'
setting), let's immediately close all windows containing the current
buffer using close_windows()
2) If a BufLeave autocommand changes our current buffer (displays it in
the current window), buf->b_nwindow will be incremented. As part of
set_curbuf() we will however enter another buffer soon, which means, the
newly created curbuf will have b_nwindows still have set, even so the
buffer is no longer displayed in a window. This causes later problems,
because it will no longer be possible to wipe such a buffer. So just
before entering the final buffer, check if the curbuf changed when
calling the BufLeave autocommand and if it does (and curbuf is still
valid), decrement curbuf->b_nwindows.
Both issues can be verified using the provided test (however the second
issue only because such an impacted buffer won't be wiped, causing
futher issues in later tests).
fixes: #13839
closes: #14104
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 28 Feb 2024 23:45:03 +0100 |
parents | 03188d05289a |
children | 8f04cf65ecff |
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 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1366 // If you get an error message here, you still need to unpack the runtime |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1367 // archive! |
7 | 1368 # ifdef magick |
1369 # undef magick | |
1370 # endif | |
1371 # define magick vim32x32 | |
1372 # include "../runtime/vim32x32.xpm" | |
1373 # undef magick | |
1374 # define magick vim16x16 | |
1375 # include "../runtime/vim16x16.xpm" | |
1376 # undef magick | |
1377 # define magick vim48x48 | |
1378 # include "../runtime/vim48x48.xpm" | |
1379 # undef magick | |
1380 | |
1381 static Pixmap icon = 0; | |
1382 static Pixmap icon_mask = 0; | |
1383 static char **magick = vim32x32; | |
1384 Window root_window; | |
1385 XIconSize *size; | |
1386 int number_sizes; | |
1387 Display *dsp; | |
1388 Screen *scr; | |
1389 XpmAttributes attr; | |
1390 Colormap cmap; | |
1391 | |
1392 /* | |
1393 * Adjust the icon to the preferences of the actual window manager. | |
1394 */ | |
1395 root_window = XRootWindowOfScreen(XtScreen(vimShell)); | |
1396 if (XGetIconSizes(XtDisplay(vimShell), root_window, | |
1397 &size, &number_sizes) != 0) | |
1398 { | |
1399 if (number_sizes > 0) | |
1400 { | |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1401 if (size->max_height >= 48 && size->max_width >= 48) |
7 | 1402 magick = vim48x48; |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1403 else if (size->max_height >= 32 && size->max_width >= 32) |
7 | 1404 magick = vim32x32; |
5196
ba9a11fe2563
updated for version 7.4a.024
Bram Moolenaar <bram@vim.org>
parents:
5086
diff
changeset
|
1405 else if (size->max_height >= 16 && size->max_width >= 16) |
7 | 1406 magick = vim16x16; |
1407 } | |
1408 } | |
1409 | |
1410 dsp = XtDisplay(vimShell); | |
1411 scr = XtScreen(vimShell); | |
1412 | |
1413 cmap = DefaultColormap(dsp, DefaultScreen(dsp)); | |
1414 XtVaSetValues(vimShell, XtNcolormap, cmap, NULL); | |
1415 | |
1416 attr.valuemask = 0L; | |
1417 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
|
1418 attr.closeness = 65535; // accuracy isn't crucial |
7 | 1419 attr.colormap = cmap; |
1420 attr.depth = DefaultDepthOfScreen(scr); | |
1421 | |
1422 if (!icon) | |
1605 | 1423 { |
7 | 1424 XpmCreatePixmapFromData(dsp, root_window, magick, &icon, |
1425 &icon_mask, &attr); | |
1605 | 1426 XpmFreeAttributes(&attr); |
1427 } | |
7 | 1428 |
1429 XtVaSetValues(vimShell, XmNiconPixmap, icon, XmNiconMask, icon_mask, NULL); | |
1430 #endif | |
1431 } | |
1432 | |
1433 if (gui.color_approx) | |
26915
3631d2deb36c
patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26893
diff
changeset
|
1434 emsg(_(e_cannot_allocate_colormap_entry_some_colors_may_be_incorrect)); |
7 | 1435 |
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
|
1436 #ifdef FEAT_BEVAL_GUI |
7 | 1437 gui_init_tooltip_font(); |
1438 #endif | |
1439 #ifdef FEAT_MENU | |
1440 gui_init_menu_font(); | |
1441 #endif | |
1442 | |
1443 #ifdef USE_XSMP | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1444 // Attach listener on ICE connection |
7 | 1445 if (-1 != xsmp_icefd) |
1446 _xsmp_xtinputid = XtAppAddInput(app_context, xsmp_icefd, | |
1447 (XtPointer)XtInputReadMask, local_xsmp_handle_requests, NULL); | |
1448 #endif | |
1449 | |
1450 return OK; | |
1451 } | |
1452 | |
1453 /* | |
1454 * Called when starting the GUI fails after calling gui_mch_init(). | |
1455 */ | |
1456 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1457 gui_mch_uninit(void) |
7 | 1458 { |
1459 gui_x11_destroy_widgets(); | |
1460 XtCloseDisplay(gui.dpy); | |
1461 gui.dpy = NULL; | |
1462 vimShell = (Widget)0; | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
1463 VIM_CLEAR(gui_argv); |
7 | 1464 } |
1465 | |
1466 /* | |
1467 * Called when the foreground or background color has been changed. | |
1468 */ | |
1469 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1470 gui_mch_new_colors(void) |
7 | 1471 { |
1472 long_u gc_mask; | |
1473 XGCValues gc_vals; | |
1474 | |
1475 gc_mask = GCForeground | GCBackground; | |
1476 gc_vals.foreground = gui.norm_pixel; | |
1477 gc_vals.background = gui.back_pixel; | |
1478 if (gui.text_gc != NULL) | |
1479 XChangeGC(gui.dpy, gui.text_gc, gc_mask, &gc_vals); | |
1480 | |
1481 gc_vals.foreground = gui.back_pixel; | |
1482 gc_vals.background = gui.norm_pixel; | |
1483 if (gui.back_gc != NULL) | |
1484 XChangeGC(gui.dpy, gui.back_gc, gc_mask, &gc_vals); | |
1485 | |
1486 gc_mask |= GCFunction; | |
1487 gc_vals.foreground = gui.norm_pixel ^ gui.back_pixel; | |
1488 gc_vals.background = gui.norm_pixel ^ gui.back_pixel; | |
1489 gc_vals.function = GXxor; | |
1490 if (gui.invert_gc != NULL) | |
1491 XChangeGC(gui.dpy, gui.invert_gc, gc_mask, &gc_vals); | |
1492 | |
1493 gui_x11_set_back_color(); | |
1494 } | |
1495 | |
1496 /* | |
1497 * Open the GUI window which was created by a call to gui_mch_init(). | |
1498 */ | |
1499 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1500 gui_mch_open(void) |
7 | 1501 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1502 // Actually open the window |
557 | 1503 XtRealizeWidget(vimShell); |
1504 XtManageChild(XtNameToWidget(vimShell, "*vimForm")); | |
7 | 1505 |
1506 gui.wid = gui_x11_get_wid(); | |
1507 gui.blank_pointer = gui_x11_create_blank_mouse(); | |
1508 | |
1509 /* | |
1510 * Add a callback for the Close item on the window managers menu, and the | |
1511 * save-yourself event. | |
1512 */ | |
1513 wm_atoms[SAVE_YOURSELF_IDX] = | |
1514 XInternAtom(gui.dpy, "WM_SAVE_YOURSELF", False); | |
1515 wm_atoms[DELETE_WINDOW_IDX] = | |
1516 XInternAtom(gui.dpy, "WM_DELETE_WINDOW", False); | |
1517 XSetWMProtocols(gui.dpy, XtWindow(vimShell), wm_atoms, 2); | |
1518 XtAddEventHandler(vimShell, NoEventMask, True, gui_x11_wm_protocol_handler, | |
1519 NULL); | |
1520 #ifdef HAVE_X11_XMU_EDITRES_H | |
1521 /* | |
1522 * Enable editres protocol (see "man editres"). | |
1523 * Usually will need to add -lXmu to the linker line as well. | |
1524 */ | |
1525 XtAddEventHandler(vimShell, (EventMask)0, True, _XEditResCheckMessages, | |
1526 (XtPointer)NULL); | |
1527 #endif | |
1528 | |
1529 #ifdef FEAT_CLIENTSERVER | |
1530 if (serverName == NULL && serverDelayedStartName != NULL) | |
1531 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1532 // This is a :gui command in a plain vim with no previous server |
7 | 1533 commWindow = XtWindow(vimShell); |
1534 (void)serverRegisterName(gui.dpy, serverDelayedStartName); | |
1535 } | |
1536 else | |
1537 { | |
1538 /* | |
1539 * Cannot handle "widget-less" windows with XtProcessEvent() we'll | |
1540 * have to change the "server" registration to that of the main window | |
1541 * If we have not registered a name yet, remember the window | |
1542 */ | |
1543 serverChangeRegisteredWindow(gui.dpy, XtWindow(vimShell)); | |
1544 } | |
1545 XtAddEventHandler(vimShell, PropertyChangeMask, False, | |
1546 gui_x11_send_event_handler, NULL); | |
1547 #endif | |
1548 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1549 // 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
|
1550 // changed them) |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1551 highlight_gui_started(); // re-init colors and fonts |
7 | 1552 |
1553 #ifdef FEAT_XIM | |
1554 xim_init(); | |
1555 #endif | |
1556 | |
1557 return OK; | |
1558 } | |
1559 | |
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
|
1560 #if defined(FEAT_BEVAL_GUI) || defined(PROTO) |
7 | 1561 /* |
1562 * Convert the tooltip fontset name to an XFontSet. | |
1563 */ | |
1564 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1565 gui_init_tooltip_font(void) |
7 | 1566 { |
1567 XrmValue from, to; | |
1568 | |
1569 from.addr = (char *)gui.rsrc_tooltip_font_name; | |
1570 from.size = strlen(from.addr); | |
1571 to.addr = (XtPointer)&gui.tooltip_fontset; | |
1572 to.size = sizeof(XFontSet); | |
1573 | |
1574 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontSet, &to) == False) | |
1575 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1576 // Failed. What to do? |
7 | 1577 } |
1578 } | |
1579 #endif | |
1580 | |
1581 #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
|
1582 // Convert the menu font/fontset name to an XFontStruct/XFontset |
7 | 1583 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1584 gui_init_menu_font(void) |
7 | 1585 { |
1586 XrmValue from, to; | |
1587 | |
1588 #ifdef FONTSET_ALWAYS | |
1589 from.addr = (char *)gui.rsrc_menu_font_name; | |
1590 from.size = strlen(from.addr); | |
1591 to.addr = (XtPointer)&gui.menu_fontset; | |
1592 to.size = sizeof(GuiFontset); | |
1593 | |
1594 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontSet, &to) == False) | |
1595 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1596 // Failed. What to do? |
7 | 1597 } |
1598 #else | |
1599 from.addr = (char *)gui.rsrc_menu_font_name; | |
1600 from.size = strlen(from.addr); | |
1601 to.addr = (XtPointer)&gui.menu_font; | |
1602 to.size = sizeof(GuiFont); | |
1603 | |
1604 if (XtConvertAndStore(vimShell, XtRString, &from, XtRFontStruct, &to) == False) | |
1605 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1606 // Failed. What to do? |
7 | 1607 } |
1608 #endif | |
1609 } | |
1610 #endif | |
1611 | |
1612 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1613 gui_mch_exit(int rc UNUSED) |
7 | 1614 { |
1615 #if 0 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1616 // 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
|
1617 // says that this isn't needed when exiting, so just skip it. |
7 | 1618 XtCloseDisplay(gui.dpy); |
1619 #endif | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
1620 VIM_CLEAR(gui_argv); |
7 | 1621 } |
1622 | |
1623 /* | |
1624 * Get the position of the top left corner of the window. | |
1625 */ | |
1626 int | |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
1627 gui_mch_get_winpos(int *x, int *y) |
7 | 1628 { |
1629 Dimension xpos, ypos; | |
1630 | |
1631 XtVaGetValues(vimShell, | |
1632 XtNx, &xpos, | |
1633 XtNy, &ypos, | |
1634 NULL); | |
1635 *x = xpos; | |
1636 *y = ypos; | |
1637 return OK; | |
1638 } | |
1639 | |
1640 /* | |
1641 * Set the position of the top left corner of the window to the given | |
1642 * coordinates. | |
1643 */ | |
1644 void | |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
1645 gui_mch_set_winpos(int x, int y) |
7 | 1646 { |
1647 XtVaSetValues(vimShell, | |
1648 XtNx, x, | |
1649 XtNy, y, | |
1650 NULL); | |
1651 } | |
1652 | |
1653 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1654 gui_mch_set_shellsize( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1655 int width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1656 int height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1657 int min_width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1658 int min_height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1659 int base_width, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1660 int base_height, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1661 int direction UNUSED) |
7 | 1662 { |
51 | 1663 #ifdef FEAT_XIM |
1664 height += xim_get_status_area_height(), | |
1665 #endif | |
7 | 1666 XtVaSetValues(vimShell, |
1667 XtNwidthInc, gui.char_width, | |
1668 XtNheightInc, gui.char_height, | |
1669 #if defined(XtSpecificationRelease) && XtSpecificationRelease >= 4 | |
1670 XtNbaseWidth, base_width, | |
1671 XtNbaseHeight, base_height, | |
1672 #endif | |
1673 XtNminWidth, min_width, | |
1674 XtNminHeight, min_height, | |
1675 XtNwidth, width, | |
1676 XtNheight, height, | |
1677 NULL); | |
1678 } | |
1679 | |
1680 /* | |
445 | 1681 * Allow 10 pixels for horizontal borders, 'guiheadroom' for vertical borders. |
7 | 1682 * Is there no way in X to find out how wide the borders really are? |
1683 */ | |
1684 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1685 gui_mch_get_screen_dimensions( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1686 int *screen_w, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1687 int *screen_h) |
7 | 1688 { |
1689 *screen_w = DisplayWidth(gui.dpy, DefaultScreen(gui.dpy)) - 10; | |
1690 *screen_h = DisplayHeight(gui.dpy, DefaultScreen(gui.dpy)) - p_ghr; | |
1691 } | |
1692 | |
1693 /* | |
1694 * Initialise vim to use the font "font_name". If it's NULL, pick a default | |
1695 * font. | |
1696 * If "fontset" is TRUE, load the "font_name" as a fontset. | |
1697 * Return FAIL if the font could not be loaded, OK otherwise. | |
1698 */ | |
1699 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1700 gui_mch_init_font( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1701 char_u *font_name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1702 int do_fontset UNUSED) |
7 | 1703 { |
1704 XFontStruct *font = NULL; | |
1705 | |
1706 #ifdef FEAT_XFONTSET | |
1707 XFontSet fontset = NULL; | |
46 | 1708 #endif |
1709 | |
1710 #ifdef FEAT_GUI_MOTIF | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1711 // 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
|
1712 // selection dialogue to get a new font name. So let us do it here. |
46 | 1713 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
|
1714 { |
46 | 1715 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
|
1716 |
982786f8454d
patch 8.2.2674: Motif: cancelling the font dialog resets the font
Bram Moolenaar <Bram@vim.org>
parents:
23408
diff
changeset
|
1717 // 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
|
1718 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
|
1719 return OK; |
982786f8454d
patch 8.2.2674: Motif: cancelling the font dialog resets the font
Bram Moolenaar <Bram@vim.org>
parents:
23408
diff
changeset
|
1720 } |
46 | 1721 #endif |
1722 | |
1723 #ifdef FEAT_XFONTSET | |
7 | 1724 if (do_fontset) |
1725 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1726 // 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
|
1727 // they were fontsets, and 'guifontset' becomes the default. |
7 | 1728 if (font_name != NULL) |
1729 { | |
1730 fontset = (XFontSet)gui_mch_get_fontset(font_name, FALSE, TRUE); | |
1731 if (fontset == NULL) | |
1732 return FAIL; | |
1733 } | |
1734 } | |
1735 else | |
1736 #endif | |
1737 { | |
1738 if (font_name == NULL) | |
1739 { | |
1740 /* | |
1741 * If none of the fonts in 'font' could be loaded, try the one set | |
1742 * in the X resource, and finally just try using DFLT_FONT, which | |
1743 * will hopefully always be there. | |
1744 */ | |
1745 font_name = gui.rsrc_font_name; | |
1746 font = (XFontStruct *)gui_mch_get_font(font_name, FALSE); | |
1747 if (font == NULL) | |
1748 font_name = (char_u *)DFLT_FONT; | |
1749 } | |
1750 if (font == NULL) | |
1751 font = (XFontStruct *)gui_mch_get_font(font_name, FALSE); | |
1752 if (font == NULL) | |
1753 return FAIL; | |
1754 } | |
1755 | |
1756 gui_mch_free_font(gui.norm_font); | |
1757 #ifdef FEAT_XFONTSET | |
1758 gui_mch_free_fontset(gui.fontset); | |
1759 | |
1760 if (fontset != NULL) | |
1761 { | |
1762 gui.norm_font = NOFONT; | |
1763 gui.fontset = (GuiFontset)fontset; | |
1764 gui.char_width = fontset_width(fontset); | |
1765 gui.char_height = fontset_height(fontset) + p_linespace; | |
1766 gui.char_ascent = fontset_ascent(fontset) + p_linespace / 2; | |
1767 } | |
1768 else | |
1769 #endif | |
1770 { | |
1771 gui.norm_font = (GuiFont)font; | |
1772 #ifdef FEAT_XFONTSET | |
1773 gui.fontset = NOFONTSET; | |
1774 #endif | |
1775 gui.char_width = font->max_bounds.width; | |
1776 gui.char_height = font->ascent + font->descent + p_linespace; | |
1777 gui.char_ascent = font->ascent + p_linespace / 2; | |
1778 } | |
1779 | |
1780 hl_set_font_name(font_name); | |
1781 | |
1782 /* | |
1783 * Try to load other fonts for bold, italic, and bold-italic. | |
1784 * We should also try to work out what font to use for these when they are | |
1785 * not specified by X resources, but we don't yet. | |
1786 */ | |
1787 if (font_name == gui.rsrc_font_name) | |
1788 { | |
1789 if (gui.bold_font == NOFONT | |
1790 && gui.rsrc_bold_font_name != NULL | |
1791 && *gui.rsrc_bold_font_name != NUL) | |
1792 gui.bold_font = gui_mch_get_font(gui.rsrc_bold_font_name, FALSE); | |
1793 if (gui.ital_font == NOFONT | |
1794 && gui.rsrc_ital_font_name != NULL | |
1795 && *gui.rsrc_ital_font_name != NUL) | |
1796 gui.ital_font = gui_mch_get_font(gui.rsrc_ital_font_name, FALSE); | |
1797 if (gui.boldital_font == NOFONT | |
1798 && gui.rsrc_boldital_font_name != NULL | |
1799 && *gui.rsrc_boldital_font_name != NUL) | |
1800 gui.boldital_font = gui_mch_get_font(gui.rsrc_boldital_font_name, | |
1801 FALSE); | |
1802 } | |
1803 else | |
1804 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1805 // 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
|
1806 // 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
|
1807 // strange. |
7 | 1808 if (gui.bold_font != NOFONT) |
1809 { | |
1810 XFreeFont(gui.dpy, (XFontStruct *)gui.bold_font); | |
1811 gui.bold_font = NOFONT; | |
1812 } | |
1813 if (gui.ital_font != NOFONT) | |
1814 { | |
1815 XFreeFont(gui.dpy, (XFontStruct *)gui.ital_font); | |
1816 gui.ital_font = NOFONT; | |
1817 } | |
1818 if (gui.boldital_font != NOFONT) | |
1819 { | |
1820 XFreeFont(gui.dpy, (XFontStruct *)gui.boldital_font); | |
1821 gui.boldital_font = NOFONT; | |
1822 } | |
1823 } | |
1824 | |
46 | 1825 #ifdef FEAT_GUI_MOTIF |
1826 gui_motif_synch_fonts(); | |
1827 #endif | |
1828 | |
7 | 1829 return OK; |
1830 } | |
1831 | |
1832 /* | |
1833 * Get a font structure for highlighting. | |
1834 */ | |
1835 GuiFont | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1836 gui_mch_get_font(char_u *name, int giveErrorIfMissing) |
7 | 1837 { |
1838 XFontStruct *font; | |
1839 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1840 if (!gui.in_use || name == NULL) // can't do this when GUI not running |
7 | 1841 return NOFONT; |
1842 | |
1843 font = XLoadQueryFont(gui.dpy, (char *)name); | |
1844 | |
1845 if (font == NULL) | |
1846 { | |
1847 if (giveErrorIfMissing) | |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
24266
diff
changeset
|
1848 semsg(_(e_unknown_font_str), name); |
7 | 1849 return NOFONT; |
1850 } | |
1851 | |
1852 #ifdef DEBUG | |
1853 printf("Font Information for '%s':\n", name); | |
1854 printf(" w = %d, h = %d, ascent = %d, descent = %d\n", | |
1855 font->max_bounds.width, font->ascent + font->descent, | |
1856 font->ascent, font->descent); | |
1857 printf(" max ascent = %d, max descent = %d, max h = %d\n", | |
1858 font->max_bounds.ascent, font->max_bounds.descent, | |
1859 font->max_bounds.ascent + font->max_bounds.descent); | |
1860 printf(" min lbearing = %d, min rbearing = %d\n", | |
1861 font->min_bounds.lbearing, font->min_bounds.rbearing); | |
1862 printf(" max lbearing = %d, max rbearing = %d\n", | |
1863 font->max_bounds.lbearing, font->max_bounds.rbearing); | |
1864 printf(" leftink = %d, rightink = %d\n", | |
1865 (font->min_bounds.lbearing < 0), | |
1866 (font->max_bounds.rbearing > font->max_bounds.width)); | |
1867 printf("\n"); | |
1868 #endif | |
1869 | |
1870 if (font->max_bounds.width != font->min_bounds.width) | |
1871 { | |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
24266
diff
changeset
|
1872 semsg(_(e_font_str_is_not_fixed_width), name); |
7 | 1873 XFreeFont(gui.dpy, font); |
1874 return NOFONT; | |
1875 } | |
1876 return (GuiFont)font; | |
1877 } | |
1878 | |
46 | 1879 #if defined(FEAT_EVAL) || defined(PROTO) |
38 | 1880 /* |
1881 * Return the name of font "font" in allocated memory. | |
1882 */ | |
1883 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
|
1884 gui_mch_get_fontname(GuiFont font, char_u *name) |
38 | 1885 { |
11119
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1886 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
|
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 (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
|
1889 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1890 // 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
|
1891 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
|
1892 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1893 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
|
1894 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
1895 // 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
|
1896 // 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
|
1897 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
|
1898 |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1899 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
|
1900 { |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1901 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
|
1902 |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1903 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
|
1904 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
|
1905 { |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1906 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
|
1907 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
|
1908 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1909 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
|
1910 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
|
1911 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1912 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
|
1913 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
|
1914 } |
d8a550329a97
patch 8.0.0447: getting font name does not work on X11
Christian Brabandt <cb@256bit.org>
parents:
10956
diff
changeset
|
1915 return ret; |
38 | 1916 } |
46 | 1917 #endif |
38 | 1918 |
445 | 1919 /* |
1920 * Adjust gui.char_height (after 'linespace' was changed). | |
1921 */ | |
7 | 1922 int |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1923 gui_mch_adjust_charheight(void) |
7 | 1924 { |
1925 #ifdef FEAT_XFONTSET | |
1926 if (gui.fontset != NOFONTSET) | |
1927 { | |
1928 gui.char_height = fontset_height((XFontSet)gui.fontset) + p_linespace; | |
1929 gui.char_ascent = fontset_ascent((XFontSet)gui.fontset) | |
1930 + p_linespace / 2; | |
1931 } | |
1932 else | |
1933 #endif | |
1934 { | |
1935 XFontStruct *font = (XFontStruct *)gui.norm_font; | |
1936 | |
1937 gui.char_height = font->ascent + font->descent + p_linespace; | |
1938 gui.char_ascent = font->ascent + p_linespace / 2; | |
1939 } | |
1940 return OK; | |
1941 } | |
1942 | |
1943 /* | |
1944 * Set the current text font. | |
1945 */ | |
1946 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1947 gui_mch_set_font(GuiFont font) |
7 | 1948 { |
1949 static Font prev_font = (Font)-1; | |
1950 Font fid = ((XFontStruct *)font)->fid; | |
1951 | |
1952 if (fid != prev_font) | |
1953 { | |
1954 XSetFont(gui.dpy, gui.text_gc, fid); | |
1955 XSetFont(gui.dpy, gui.back_gc, fid); | |
1956 prev_font = fid; | |
1957 gui.char_ascent = ((XFontStruct *)font)->ascent + p_linespace / 2; | |
1958 } | |
1959 #ifdef FEAT_XFONTSET | |
1960 current_fontset = (XFontSet)NULL; | |
1961 #endif | |
1962 } | |
1963 | |
1964 #if defined(FEAT_XFONTSET) || defined(PROTO) | |
1965 /* | |
1966 * Set the current text fontset. | |
1967 * Adjust the ascent, in case it's different. | |
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_set_fontset(GuiFontset fontset) |
7 | 1971 { |
1972 current_fontset = (XFontSet)fontset; | |
1973 gui.char_ascent = fontset_ascent(current_fontset) + p_linespace / 2; | |
1974 } | |
1975 #endif | |
1976 | |
1977 /* | |
1978 * If a font 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_font(GuiFont font) |
7 | 1982 { |
1983 if (font != NOFONT) | |
1984 XFreeFont(gui.dpy, (XFontStruct *)font); | |
1985 } | |
1986 | |
1987 #if defined(FEAT_XFONTSET) || defined(PROTO) | |
1988 /* | |
1989 * If a fontset is not going to be used, free its structure. | |
1990 */ | |
1991 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1992 gui_mch_free_fontset(GuiFontset fontset) |
7 | 1993 { |
1994 if (fontset != NOFONTSET) | |
1995 XFreeFontSet(gui.dpy, (XFontSet)fontset); | |
1996 } | |
1997 | |
1998 /* | |
1999 * Load the fontset "name". | |
2000 * Return a reference to the fontset, or NOFONTSET when failing. | |
2001 */ | |
2002 GuiFontset | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2003 gui_mch_get_fontset( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2004 char_u *name, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2005 int giveErrorIfMissing, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2006 int fixed_width) |
7 | 2007 { |
2008 XFontSet fontset; | |
2009 char **missing, *def_str; | |
2010 int num_missing; | |
2011 | |
2012 if (!gui.in_use || name == NULL) | |
2013 return NOFONTSET; | |
2014 | |
2015 fontset = XCreateFontSet(gui.dpy, (char *)name, &missing, &num_missing, | |
2016 &def_str); | |
2017 if (num_missing > 0) | |
2018 { | |
2019 int i; | |
2020 | |
2021 if (giveErrorIfMissing) | |
2022 { | |
26893
79c76ca2c53c
patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26883
diff
changeset
|
2023 semsg(_(e_fonts_for_the_following_charsets_are_missing_in_fontset), name); |
7 | 2024 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
|
2025 semsg("%s", missing[i]); |
7 | 2026 } |
2027 XFreeStringList(missing); | |
2028 } | |
2029 | |
2030 if (fontset == NULL) | |
2031 { | |
2032 if (giveErrorIfMissing) | |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
24266
diff
changeset
|
2033 semsg(_(e_unknown_fontset_str), name); |
7 | 2034 return NOFONTSET; |
2035 } | |
2036 | |
2037 if (fixed_width && check_fontset_sanity(fontset) == FAIL) | |
2038 { | |
2039 XFreeFontSet(gui.dpy, fontset); | |
2040 return NOFONTSET; | |
2041 } | |
2042 return (GuiFontset)fontset; | |
2043 } | |
2044 | |
2045 /* | |
2046 * Check if fontset "fs" is fixed width. | |
2047 */ | |
2048 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2049 check_fontset_sanity(XFontSet fs) |
7 | 2050 { |
2051 XFontStruct **xfs; | |
2052 char **font_name; | |
2053 int fn; | |
2054 char *base_name; | |
2055 int i; | |
2056 int min_width; | |
2057 int min_font_idx = 0; | |
2058 | |
2059 base_name = XBaseFontNameListOfFontSet(fs); | |
2060 fn = XFontsOfFontSet(fs, &xfs, &font_name); | |
2061 for (i = 0; i < fn; i++) | |
2062 { | |
2063 if (xfs[i]->max_bounds.width != xfs[i]->min_bounds.width) | |
2064 { | |
26893
79c76ca2c53c
patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26883
diff
changeset
|
2065 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
|
2066 base_name, font_name[i]); |
7 | 2067 return FAIL; |
2068 } | |
2069 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2070 // scan base font width |
7 | 2071 min_width = 32767; |
2072 for (i = 0; i < fn; i++) | |
2073 { | |
2074 if (xfs[i]->max_bounds.width<min_width) | |
2075 { | |
2076 min_width = xfs[i]->max_bounds.width; | |
2077 min_font_idx = i; | |
2078 } | |
2079 } | |
2080 for (i = 0; i < fn; i++) | |
2081 { | |
2082 if ( xfs[i]->max_bounds.width != 2 * min_width | |
2083 && xfs[i]->max_bounds.width != min_width) | |
2084 { | |
26893
79c76ca2c53c
patch 8.2.3975: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26883
diff
changeset
|
2085 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
|
2086 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
|
2087 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
|
2088 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
|
2089 semsg(_("Font0 width: %d"), |
98c35d312987
patch 8.1.0753: printf format not checked for semsg()
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
2090 (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
|
2091 semsg(_("Font%d width: %d"), i, (int)xfs[i]->max_bounds.width); |
7 | 2092 return FAIL; |
2093 } | |
2094 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2095 // it seems ok. Good Luck!! |
7 | 2096 return OK; |
2097 } | |
2098 | |
2099 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2100 fontset_width(XFontSet fs) |
7 | 2101 { |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2102 return XmbTextEscapement(fs, "Vim", 3) / 3; |
7 | 2103 } |
2104 | |
2105 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2106 fontset_height( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2107 XFontSet fs) |
7 | 2108 { |
2109 XFontSetExtents *extents; | |
2110 | |
2111 extents = XExtentsOfFontSet(fs); | |
2112 return extents->max_logical_extent.height; | |
2113 } | |
2114 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2115 #if 0 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2116 // NOT USED YET |
7 | 2117 static int |
7856
226ed297307f
commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents:
7825
diff
changeset
|
2118 fontset_descent(XFontSet fs) |
7 | 2119 { |
2120 XFontSetExtents *extents; | |
2121 | |
2122 extents = XExtentsOfFontSet (fs); | |
2123 return extents->max_logical_extent.height + extents->max_logical_extent.y; | |
2124 } | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2125 #endif |
7 | 2126 |
2127 static int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2128 fontset_ascent(XFontSet fs) |
7 | 2129 { |
2130 XFontSetExtents *extents; | |
2131 | |
2132 extents = XExtentsOfFontSet(fs); | |
2133 return -extents->max_logical_extent.y; | |
2134 } | |
2135 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2136 #endif // FEAT_XFONTSET |
7 | 2137 |
2138 /* | |
2139 * Return the Pixel value (color) for the given color name. | |
2140 * Return INVALCOLOR for error. | |
2141 */ | |
2142 guicolor_T | |
9634
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2143 gui_mch_get_color(char_u *name) |
7 | 2144 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
2145 guicolor_T requested; |
7 | 2146 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2147 // 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
|
2148 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
|
2149 return INVALCOLOR; |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2150 |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2151 requested = gui_get_color_cmn(name); |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2152 if (requested == INVALCOLOR) |
7 | 2153 return INVALCOLOR; |
2154 | |
11745
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2155 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
|
2156 (requested & 0xff0000) >> 16, |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2157 (requested & 0xff00) >> 8, |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2158 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
|
2159 } |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2160 |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2161 /* |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2162 * 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
|
2163 * 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
|
2164 */ |
5a5709918a98
patch 8.0.0755: terminal window does not have colors in the GUI
Christian Brabandt <cb@256bit.org>
parents:
11119
diff
changeset
|
2165 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
|
2166 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
|
2167 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13152
diff
changeset
|
2168 XColor available; |
11770
0aa1910a3dfa
patch 8.0.0767: build failure with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
11745
diff
changeset
|
2169 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
|
2170 |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2171 #if 0 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2172 // 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
|
2173 |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2174 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
|
2175 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
|
2176 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
|
2177 && XAllocColor(gui.dpy, colormap, &available) != 0) |
86d470495333
commit https://github.com/vim/vim/commit/4658228262f491fcb582d531d4e8e5754b0d5e83
Christian Brabandt <cb@256bit.org>
parents:
9428
diff
changeset
|
2178 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
|
2179 #endif |
13858
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2180 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
|
2181 CLEAR_FIELD(available); |
13858
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2182 available.red = r << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2183 available.green = g << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2184 available.blue = b << 8; |
245c053021d3
patch 8.0.1800: X11: getting color is slow
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
2185 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
|
2186 return (guicolor_T)available.pixel; |
7 | 2187 |
2188 return INVALCOLOR; | |
2189 } | |
2190 | |
2191 /* | |
206 | 2192 * Set the current text foreground color. |
2193 */ | |
7 | 2194 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2195 gui_mch_set_fg_color(guicolor_T color) |
7 | 2196 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2197 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
|
2198 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2199 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2200 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
|
2201 prev_fg_color = color; |
7 | 2202 } |
2203 | |
2204 /* | |
2205 * Set the current text background color. | |
2206 */ | |
2207 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2208 gui_mch_set_bg_color(guicolor_T color) |
7 | 2209 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2210 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
|
2211 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2212 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2213 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
|
2214 prev_bg_color = color; |
7 | 2215 } |
2216 | |
2217 /* | |
206 | 2218 * Set the current text special color. |
2219 */ | |
2220 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2221 gui_mch_set_sp_color(guicolor_T color) |
206 | 2222 { |
2223 prev_sp_color = color; | |
2224 } | |
2225 | |
2226 /* | |
7 | 2227 * create a mouse pointer that is blank |
2228 */ | |
2229 static Cursor | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2230 gui_x11_create_blank_mouse(void) |
7 | 2231 { |
2232 Pixmap blank_pixmap = XCreatePixmap(gui.dpy, gui.wid, 1, 1, 1); | |
2233 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
|
2234 |
01087b4630da
patch 9.0.0339: no check if the return value of XChangeGC() is NULL
Bram Moolenaar <Bram@vim.org>
parents:
28303
diff
changeset
|
2235 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
|
2236 { |
01087b4630da
patch 9.0.0339: no check if the return value of XChangeGC() is NULL
Bram Moolenaar <Bram@vim.org>
parents:
28303
diff
changeset
|
2237 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
|
2238 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
|
2239 } |
7 | 2240 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
|
2241 (XColor*)&gui.norm_pixel, (XColor*)&gui.norm_pixel, 0, 0); |
7 | 2242 } |
2243 | |
206 | 2244 /* |
2245 * Draw a curled line at the bottom of the character cell. | |
2246 */ | |
2247 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2248 draw_curl(int row, int col, int cells) |
206 | 2249 { |
2250 int i; | |
2251 int offset; | |
1887 | 2252 static const int val[8] = {1, 0, 0, 0, 1, 2, 2, 2 }; |
206 | 2253 |
2254 XSetForeground(gui.dpy, gui.text_gc, prev_sp_color); | |
2255 for (i = FILL_X(col); i < FILL_X(col + cells); ++i) | |
2256 { | |
2257 offset = val[i % 8]; | |
2258 XDrawPoint(gui.dpy, gui.wid, gui.text_gc, i, | |
2259 FILL_Y(row + 1) - 1 - offset); | |
2260 } | |
2261 XSetForeground(gui.dpy, gui.text_gc, prev_fg_color); | |
2262 } | |
2263 | |
7 | 2264 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2265 gui_mch_draw_string( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2266 int row, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2267 int col, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2268 char_u *s, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2269 int len, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2270 int flags) |
7 | 2271 { |
2272 int cells = len; | |
717 | 2273 static void *buf = NULL; |
7 | 2274 static int buflen = 0; |
2275 char_u *p; | |
2276 int wlen = 0; | |
2277 int c; | |
2278 | |
2279 if (enc_utf8) | |
2280 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2281 // 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
|
2282 // 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
|
2283 // between calls, because allocating it each time is slow. |
7 | 2284 if (buflen < len) |
2285 { | |
2286 XtFree((char *)buf); | |
717 | 2287 buf = (void *)XtMalloc(len * (sizeof(XChar2b) < sizeof(wchar_t) |
2288 ? sizeof(wchar_t) : sizeof(XChar2b))); | |
7 | 2289 buflen = len; |
2290 } | |
2291 p = s; | |
2292 cells = 0; | |
2293 while (p < s + len) | |
2294 { | |
2295 c = utf_ptr2char(p); | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2296 #ifdef FEAT_XFONTSET |
717 | 2297 if (current_fontset != NULL) |
2298 { | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2299 # ifdef SMALL_WCHAR_T |
1887 | 2300 if (c >= 0x10000) |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2301 c = 0xbf; // show chars > 0xffff as ? |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2302 # endif |
717 | 2303 ((wchar_t *)buf)[wlen] = c; |
2304 } | |
2305 else | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15517
diff
changeset
|
2306 #endif |
717 | 2307 { |
2308 if (c >= 0x10000) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2309 c = 0xbf; // show chars > 0xffff as ? |
717 | 2310 ((XChar2b *)buf)[wlen].byte1 = (unsigned)c >> 8; |
2311 ((XChar2b *)buf)[wlen].byte2 = c; | |
2312 } | |
7 | 2313 ++wlen; |
2314 cells += utf_char2cells(c); | |
474 | 2315 p += utf_ptr2len(p); |
7 | 2316 } |
2317 } | |
2318 else if (has_mbyte) | |
2319 { | |
2320 cells = 0; | |
2321 for (p = s; p < s + len; ) | |
2322 { | |
2323 cells += ptr2cells(p); | |
474 | 2324 p += (*mb_ptr2len)(p); |
7 | 2325 } |
2326 } | |
2327 | |
2328 #ifdef FEAT_XFONTSET | |
2329 if (current_fontset != NULL) | |
2330 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2331 // 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
|
2332 // 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
|
2333 // used in a fontset. |
7 | 2334 XRectangle clip; |
2335 | |
2336 clip.x = 0; | |
2337 clip.y = 0; | |
2338 clip.height = gui.char_height; | |
2339 clip.width = gui.char_width * cells + 1; | |
2340 XSetClipRectangles(gui.dpy, gui.text_gc, FILL_X(col), FILL_Y(row), | |
2341 &clip, 1, Unsorted); | |
2342 } | |
2343 #endif | |
2344 | |
2345 if (flags & DRAW_TRANSP) | |
2346 { | |
2347 if (enc_utf8) | |
2348 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2349 TEXT_Y(row), buf, wlen); | |
2350 else | |
2351 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2352 TEXT_Y(row), (char *)s, len); | |
2353 } | |
2354 else if (p_linespace != 0 | |
2355 #ifdef FEAT_XFONTSET | |
2356 || current_fontset != NULL | |
2357 #endif | |
2358 ) | |
2359 { | |
2360 XSetForeground(gui.dpy, gui.text_gc, prev_bg_color); | |
2361 XFillRectangle(gui.dpy, gui.wid, gui.text_gc, FILL_X(col), | |
2362 FILL_Y(row), gui.char_width * cells, gui.char_height); | |
2363 XSetForeground(gui.dpy, gui.text_gc, prev_fg_color); | |
206 | 2364 |
7 | 2365 if (enc_utf8) |
2366 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2367 TEXT_Y(row), buf, wlen); | |
2368 else | |
2369 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2370 TEXT_Y(row), (char *)s, len); | |
2371 } | |
2372 else | |
2373 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2374 // XmbDrawImageString has bug, don't use it for fontset. |
7 | 2375 if (enc_utf8) |
2376 XDrawImageString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
2377 TEXT_Y(row), buf, wlen); | |
2378 else | |
2379 XDrawImageString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col), | |
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 // Bold trick: draw the text again with a one-pixel offset. |
7 | 2384 if (flags & DRAW_BOLD) |
2385 { | |
2386 if (enc_utf8) | |
2387 XDrawString16(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col) + 1, | |
2388 TEXT_Y(row), buf, wlen); | |
2389 else | |
2390 XDrawString(gui.dpy, gui.wid, gui.text_gc, TEXT_X(col) + 1, | |
2391 TEXT_Y(row), (char *)s, len); | |
2392 } | |
2393 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2394 // Undercurl: draw curl at the bottom of the character cell. |
206 | 2395 if (flags & DRAW_UNDERC) |
2396 draw_curl(row, col, cells); | |
2397 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2398 // Underline: draw a line at the bottom of the character cell. |
7 | 2399 if (flags & DRAW_UNDERL) |
206 | 2400 { |
2401 int y = FILL_Y(row + 1) - 1; | |
2402 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2403 // 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
|
2404 // Otherwise put the line just below the character. |
206 | 2405 if (p_linespace > 1) |
2406 y -= p_linespace - 1; | |
7 | 2407 XDrawLine(gui.dpy, gui.wid, gui.text_gc, FILL_X(col), |
206 | 2408 y, FILL_X(col + cells) - 1, y); |
2409 } | |
7 | 2410 |
12317
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2411 if (flags & DRAW_STRIKE) |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2412 { |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2413 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
|
2414 |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2415 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
|
2416 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
|
2417 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
|
2418 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
|
2419 } |
2a8890b80923
patch 8.0.1038: strike-through text not supported
Christian Brabandt <cb@256bit.org>
parents:
12257
diff
changeset
|
2420 |
7 | 2421 #ifdef FEAT_XFONTSET |
2422 if (current_fontset != NULL) | |
2423 XSetClipMask(gui.dpy, gui.text_gc, None); | |
2424 #endif | |
2425 } | |
2426 | |
2427 /* | |
2428 * Return OK if the key with the termcap name "name" is supported. | |
2429 */ | |
2430 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2431 gui_mch_haskey(char_u *name) |
7 | 2432 { |
2433 int i; | |
2434 | |
2435 for (i = 0; special_keys[i].key_sym != (KeySym)0; i++) | |
2436 if (name[0] == special_keys[i].vim_code0 && | |
2437 name[1] == special_keys[i].vim_code1) | |
2438 return OK; | |
2439 return FAIL; | |
2440 } | |
2441 | |
2442 /* | |
2443 * Return the text window-id and display. Only required for X-based GUI's | |
2444 */ | |
2445 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2446 gui_get_x11_windis(Window *win, Display **dis) |
7 | 2447 { |
2448 *win = XtWindow(vimShell); | |
2449 *dis = gui.dpy; | |
2450 return OK; | |
2451 } | |
2452 | |
2453 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2454 gui_mch_beep(void) |
7 | 2455 { |
2456 XBell(gui.dpy, 0); | |
2457 } | |
2458 | |
2459 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2460 gui_mch_flash(int msec) |
7 | 2461 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2462 // Do a visual beep by reversing the foreground and background colors |
7 | 2463 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, 0, 0, |
2464 FILL_X((int)Columns) + gui.border_offset, | |
2465 FILL_Y((int)Rows) + gui.border_offset); | |
2466 XSync(gui.dpy, False); | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2467 ui_delay((long)msec, TRUE); // wait for a few msec |
7 | 2468 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, 0, 0, |
2469 FILL_X((int)Columns) + gui.border_offset, | |
2470 FILL_Y((int)Rows) + gui.border_offset); | |
2471 } | |
2472 | |
2473 /* | |
2474 * Invert a rectangle from row r, column c, for nr rows and nc columns. | |
2475 */ | |
2476 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2477 gui_mch_invert_rectangle( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2478 int r, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2479 int c, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2480 int nr, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2481 int nc) |
7 | 2482 { |
2483 XFillRectangle(gui.dpy, gui.wid, gui.invert_gc, | |
2484 FILL_X(c), FILL_Y(r), (nc) * gui.char_width, (nr) * gui.char_height); | |
2485 } | |
2486 | |
2487 /* | |
2488 * Iconify the GUI window. | |
2489 */ | |
2490 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2491 gui_mch_iconify(void) |
7 | 2492 { |
2493 XIconifyWindow(gui.dpy, XtWindow(vimShell), DefaultScreen(gui.dpy)); | |
2494 } | |
2495 | |
2496 #if defined(FEAT_EVAL) || defined(PROTO) | |
2497 /* | |
2498 * Bring the Vim window to the foreground. | |
2499 */ | |
2500 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2501 gui_mch_set_foreground(void) |
7 | 2502 { |
2503 XMapRaised(gui.dpy, XtWindow(vimShell)); | |
2504 } | |
2505 #endif | |
2506 | |
2507 /* | |
2508 * Draw a cursor without focus. | |
2509 */ | |
2510 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2511 gui_mch_draw_hollow_cursor(guicolor_T color) |
7 | 2512 { |
2513 int w = 1; | |
2514 | |
2515 if (mb_lefthalve(gui.row, gui.col)) | |
2516 w = 2; | |
2517 gui_mch_set_fg_color(color); | |
2518 XDrawRectangle(gui.dpy, gui.wid, gui.text_gc, FILL_X(gui.col), | |
2519 FILL_Y(gui.row), w * gui.char_width - 1, gui.char_height - 1); | |
2520 } | |
2521 | |
2522 /* | |
2523 * Draw part of a cursor, "w" pixels wide, and "h" pixels high, using | |
2524 * color "color". | |
2525 */ | |
2526 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2527 gui_mch_draw_part_cursor(int w, int h, guicolor_T color) |
7 | 2528 { |
2529 gui_mch_set_fg_color(color); | |
2530 | |
2531 XFillRectangle(gui.dpy, gui.wid, gui.text_gc, | |
2532 #ifdef FEAT_RIGHTLEFT | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2533 // vertical line should be on the right of current point |
7 | 2534 CURSOR_BAR_RIGHT ? FILL_X(gui.col + 1) - w : |
2535 #endif | |
2536 FILL_X(gui.col), | |
2537 FILL_Y(gui.row) + gui.char_height - h, | |
2538 w, h); | |
2539 } | |
2540 | |
2541 /* | |
2542 * Catch up with any queued X events. This may put keyboard input into the | |
2543 * input buffer, call resize call-backs, trigger timers etc. If there is | |
2544 * nothing in the X event queue (& no timers pending), then we return | |
2545 * immediately. | |
2546 */ | |
2547 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2548 gui_mch_update(void) |
7 | 2549 { |
2550 XtInputMask mask, desired; | |
2551 | |
2552 #ifdef ALT_X_INPUT | |
2553 if (suppress_alternate_input) | |
2554 desired = (XtIMXEvent | XtIMTimer); | |
2555 else | |
2556 #endif | |
2557 desired = (XtIMAll); | |
2558 while ((mask = XtAppPending(app_context)) && (mask & desired) | |
2559 && !vim_is_input_buf_full()) | |
2560 XtAppProcessEvent(app_context, desired); | |
2561 } | |
2562 | |
2563 /* | |
2564 * GUI input routine called by gui_wait_for_chars(). Waits for a character | |
2565 * from the keyboard. | |
2566 * wtime == -1 Wait forever. | |
2567 * wtime == 0 This should never happen. | |
2568 * wtime > 0 Wait wtime milliseconds for a character. | |
2569 * Returns OK if a character was found to be available within the given time, | |
2570 * or FAIL otherwise. | |
2571 */ | |
2572 int | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2573 gui_mch_wait_for_chars(long wtime) |
7 | 2574 { |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2575 int focus; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2576 int retval = FAIL; |
7 | 2577 |
2578 /* | |
2579 * Make this static, in case gui_x11_timer_cb is called after leaving | |
2580 * this function (otherwise a random value on the stack may be changed). | |
2581 */ | |
2582 static int timed_out; | |
2583 XtIntervalId timer = (XtIntervalId)0; | |
2584 XtInputMask desired; | |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2585 #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
|
2586 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
|
2587 #endif |
7 | 2588 |
2589 timed_out = FALSE; | |
2590 | |
15665
31367ce5aac7
patch 8.1.0840: getchar(0) never returns a character in the terminal
Bram Moolenaar <Bram@vim.org>
parents:
15597
diff
changeset
|
2591 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
|
2592 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
|
2593 (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
|
2594 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
|
2595 #ifdef FEAT_JOB_CHANNEL |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2596 // 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
|
2597 // on them. |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2598 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
|
2599 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
|
2600 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
|
2601 #endif |
7 | 2602 |
2603 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
|
2604 desired = (XtIMAll); |
7 | 2605 while (!timed_out) |
2606 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2607 // Stop or start blinking when focus changes |
7 | 2608 if (gui.in_focus != focus) |
2609 { | |
2610 if (gui.in_focus) | |
2611 gui_mch_start_blink(); | |
2612 else | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
2613 gui_mch_stop_blink(TRUE); |
7 | 2614 focus = gui.in_focus; |
2615 } | |
2616 | |
7109
fa95595fbc52
commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents:
5196
diff
changeset
|
2617 #ifdef MESSAGE_QUEUE |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2618 # ifdef FEAT_TIMERS |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2619 did_add_timer = FALSE; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2620 # endif |
7109
fa95595fbc52
commit https://github.com/vim/vim/commit/93c88e0f6a4a8f7634ed84721daf4af46fc0d5db
Christian Brabandt <cb@256bit.org>
parents:
5196
diff
changeset
|
2621 parse_queued_messages(); |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2622 # ifdef FEAT_TIMERS |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2623 if (did_add_timer) |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2624 // 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
|
2625 break; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2626 # endif |
2638 | 2627 #endif |
2628 | |
7 | 2629 /* |
2630 * Don't use gui_mch_update() because then we will spin-lock until a | |
2631 * char arrives, instead we use XtAppProcessEvent() to hang until an | |
2632 * event arrives. No need to check for input_buf_full because we are | |
2633 * returning as soon as it contains a single char. Note that | |
2634 * XtAppNextEvent() may not be used because it will not return after a | |
2635 * timer event has arrived -- webb | |
2636 */ | |
2637 XtAppProcessEvent(app_context, desired); | |
2638 | |
2639 if (input_available()) | |
2640 { | |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2641 retval = OK; |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2642 break; |
7 | 2643 } |
2644 } | |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2645 |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2646 if (timer != (XtIntervalId)0 && !timed_out) |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2647 XtRemoveTimeOut(timer); |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2648 #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
|
2649 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
|
2650 XtRemoveTimeOut(channel_timer); |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
2651 #endif |
9179
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2652 |
5e18efdad322
commit https://github.com/vim/vim/commit/4231da403e3c879dd6ac261e51f4ca60813935e3
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
2653 return retval; |
7 | 2654 } |
2655 | |
2656 /* | |
2657 * Output routines. | |
2658 */ | |
2659 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2660 /* |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2661 * 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
|
2662 */ |
7 | 2663 void |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2664 gui_mch_flush(void) |
7 | 2665 { |
2666 XFlush(gui.dpy); | |
2667 } | |
2668 | |
2669 /* | |
2670 * Clear a rectangular region of the screen from text pos (row1, col1) to | |
2671 * (row2, col2) inclusive. | |
2672 */ | |
2673 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2674 gui_mch_clear_block( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2675 int row1, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2676 int col1, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2677 int row2, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2678 int col2) |
7 | 2679 { |
2680 int x; | |
2681 | |
2682 x = FILL_X(col1); | |
2683 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2684 // 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
|
2685 // spilled over to the next column. |
7 | 2686 XFillRectangle(gui.dpy, gui.wid, gui.back_gc, x, FILL_Y(row1), |
2687 (col2 - col1 + 1) * gui.char_width + (col2 == Columns - 1), | |
2688 (row2 - row1 + 1) * gui.char_height); | |
2689 } | |
2690 | |
2691 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2692 gui_mch_clear_all(void) |
7 | 2693 { |
2694 XClearArea(gui.dpy, gui.wid, 0, 0, 0, 0, False); | |
2695 } | |
2696 | |
2697 /* | |
2698 * Delete the given number of lines from the given row, scrolling up any | |
2699 * text further down within the scroll region. | |
2700 */ | |
2701 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2702 gui_mch_delete_lines(int row, int num_lines) |
7 | 2703 { |
2704 if (gui.visibility == VisibilityFullyObscured) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2705 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
|
2706 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2707 // 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
|
2708 // over |
7 | 2709 XCopyArea(gui.dpy, gui.wid, gui.wid, gui.text_gc, |
2710 FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines), | |
2711 gui.char_width * (gui.scroll_region_right - gui.scroll_region_left + 1) | |
2712 + (gui.scroll_region_right == Columns - 1), | |
2713 gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), | |
2714 FILL_X(gui.scroll_region_left), FILL_Y(row)); | |
2715 | |
2716 gui_clear_block(gui.scroll_region_bot - num_lines + 1, | |
2717 gui.scroll_region_left, | |
2718 gui.scroll_region_bot, gui.scroll_region_right); | |
2719 gui_x11_check_copy_area(); | |
2720 } | |
2721 | |
2722 /* | |
2723 * Insert the given number of lines before the given row, scrolling down any | |
2724 * following text within the scroll region. | |
2725 */ | |
2726 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2727 gui_mch_insert_lines(int row, int num_lines) |
7 | 2728 { |
2729 if (gui.visibility == VisibilityFullyObscured) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2730 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
|
2731 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2732 // 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
|
2733 // over |
7 | 2734 XCopyArea(gui.dpy, gui.wid, gui.wid, gui.text_gc, |
2735 FILL_X(gui.scroll_region_left), FILL_Y(row), | |
2736 gui.char_width * (gui.scroll_region_right - gui.scroll_region_left + 1) | |
2737 + (gui.scroll_region_right == Columns - 1), | |
2738 gui.char_height * (gui.scroll_region_bot - row - num_lines + 1), | |
2739 FILL_X(gui.scroll_region_left), FILL_Y(row + num_lines)); | |
2740 | |
2741 gui_clear_block(row, gui.scroll_region_left, | |
2742 row + num_lines - 1, gui.scroll_region_right); | |
2743 gui_x11_check_copy_area(); | |
2744 } | |
2745 | |
2746 /* | |
2747 * Update the region revealed by scrolling up/down. | |
2748 */ | |
2749 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2750 gui_x11_check_copy_area(void) |
7 | 2751 { |
2752 XEvent event; | |
2753 XGraphicsExposeEvent *gevent; | |
2754 | |
2755 if (gui.visibility != VisibilityPartiallyObscured) | |
2756 return; | |
2757 | |
2758 XFlush(gui.dpy); | |
2759 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2760 // Wait to check whether the scroll worked or not |
7 | 2761 for (;;) |
2762 { | |
2763 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
|
2764 return; // The scroll worked. |
7 | 2765 |
2766 if (XCheckTypedEvent(gui.dpy, GraphicsExpose, &event)) | |
2767 { | |
2768 gevent = (XGraphicsExposeEvent *)&event; | |
2769 gui_redraw(gevent->x, gevent->y, gevent->width, gevent->height); | |
2770 if (gevent->count == 0) | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2771 return; // This was the last expose event |
7 | 2772 } |
2773 XSync(gui.dpy, False); | |
2774 } | |
2775 } | |
2776 | |
2777 /* | |
2778 * X Selection stuff, for cutting and pasting text to other windows. | |
2779 */ | |
2780 | |
2781 void | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2782 clip_mch_lose_selection(Clipboard_T *cbd) |
7 | 2783 { |
2784 clip_x11_lose_selection(vimShell, cbd); | |
2785 } | |
2786 | |
2787 int | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2788 clip_mch_own_selection(Clipboard_T *cbd) |
7 | 2789 { |
2790 return clip_x11_own_selection(vimShell, cbd); | |
2791 } | |
2792 | |
2793 void | |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2794 clip_mch_request_selection(Clipboard_T *cbd) |
7 | 2795 { |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2796 clip_x11_request_selection(vimShell, gui.dpy, cbd); |
7 | 2797 } |
2798 | |
2799 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2800 clip_mch_set_selection( |
17063
3147c7c2e86b
patch 8.1.1531: clipboard type name is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
2801 Clipboard_T *cbd) |
7 | 2802 { |
2803 clip_x11_set_selection(cbd); | |
2804 } | |
2805 | |
2806 #if defined(FEAT_MENU) || defined(PROTO) | |
2807 /* | |
2808 * Menu stuff. | |
2809 */ | |
2810 | |
2811 /* | |
2812 * Make a menu either grey or not grey. | |
2813 */ | |
2814 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2815 gui_mch_menu_grey(vimmenu_T *menu, int grey) |
7 | 2816 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2817 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
|
2818 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2819 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2820 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
|
2821 if (grey |
7 | 2822 #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
|
2823 || !menu->sensitive |
7 | 2824 #endif |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2825 ) |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2826 XtSetSensitive(menu->id, False); |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2827 else |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2828 XtSetSensitive(menu->id, True); |
7 | 2829 } |
2830 | |
2831 /* | |
2832 * Make menu item hidden or not hidden | |
2833 */ | |
2834 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2835 gui_mch_menu_hidden(vimmenu_T *menu, int hidden) |
7 | 2836 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2837 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
|
2838 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2839 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2840 if (hidden) |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2841 XtUnmanageChild(menu->id); |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2842 else |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
2843 XtManageChild(menu->id); |
7 | 2844 } |
2845 | |
2846 /* | |
2847 * This is called after setting all the menus to grey/hidden or not. | |
2848 */ | |
2849 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2850 gui_mch_draw_menubar(void) |
7 | 2851 { |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2852 // Nothing to do in X |
7 | 2853 } |
2854 | |
2855 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2856 gui_x11_menu_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2857 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2858 XtPointer client_data, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2859 XtPointer call_data UNUSED) |
7 | 2860 { |
2861 gui_menu_cb((vimmenu_T *)client_data); | |
2862 } | |
2863 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2864 #endif // FEAT_MENU |
7 | 2865 |
2866 | |
2867 | |
2868 /* | |
2869 * Function called when window closed. Works like ":qa". | |
2870 * Should put up a requester! | |
2871 */ | |
2872 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2873 gui_x11_wm_protocol_handler( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2874 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2875 XtPointer client_data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2876 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2877 Boolean *dum UNUSED) |
7 | 2878 { |
2879 /* | |
2880 * Only deal with Client messages. | |
2881 */ | |
2882 if (event->type != ClientMessage) | |
2883 return; | |
2884 | |
2885 /* | |
2886 * The WM_SAVE_YOURSELF event arrives when the window manager wants to | |
2887 * exit. That can be cancelled though, thus Vim shouldn't exit here. | |
2888 * Just sync our swap files. | |
2889 */ | |
1887 | 2890 if ((Atom)((XClientMessageEvent *)event)->data.l[0] == |
7 | 2891 wm_atoms[SAVE_YOURSELF_IDX]) |
2892 { | |
2893 out_flush(); | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2894 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
|
2895 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
2896 // 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
|
2897 // 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
|
2898 // thus set argv to NULL. |
7 | 2899 XSetCommand(gui.dpy, XtWindow(vimShell), NULL, 0); |
2900 return; | |
2901 } | |
2902 | |
1887 | 2903 if ((Atom)((XClientMessageEvent *)event)->data.l[0] != |
7 | 2904 wm_atoms[DELETE_WINDOW_IDX]) |
2905 return; | |
2906 | |
2907 gui_shell_closed(); | |
2908 } | |
2909 | |
2910 #ifdef FEAT_CLIENTSERVER | |
2911 /* | |
2912 * Function called when property changed. Check for incoming commands | |
2913 */ | |
2914 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2915 gui_x11_send_event_handler( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2916 Widget w UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2917 XtPointer client_data UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2918 XEvent *event, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2919 Boolean *dum UNUSED) |
7 | 2920 { |
2921 XPropertyEvent *e = (XPropertyEvent *) event; | |
2922 | |
2923 if (e->type == PropertyNotify && e->window == commWindow | |
2924 && 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
|
2925 serverEventProc(gui.dpy, event, 0); |
7 | 2926 } |
2927 #endif | |
2928 | |
2929 /* | |
2930 * Cursor blink functions. | |
2931 * | |
2932 * This is a simple state machine: | |
2933 * BLINK_NONE not blinking at all | |
2934 * BLINK_OFF blinking, cursor is not shown | |
2935 * BLINK_ON blinking, cursor is shown | |
2936 */ | |
2937 | |
2938 #define BLINK_NONE 0 | |
2939 #define BLINK_OFF 1 | |
2940 #define BLINK_ON 2 | |
2941 | |
2942 static int blink_state = BLINK_NONE; | |
2943 static long_u blink_waittime = 700; | |
2944 static long_u blink_ontime = 400; | |
2945 static long_u blink_offtime = 250; | |
2946 static XtIntervalId blink_timer = (XtIntervalId)0; | |
2947 | |
9213
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2948 int |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2949 gui_mch_is_blinking(void) |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2950 { |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2951 return blink_state != BLINK_NONE; |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2952 } |
bb86514cad15
commit https://github.com/vim/vim/commit/703a8044b5393d37d355b0b1054a9a5a13912a3f
Christian Brabandt <cb@256bit.org>
parents:
9179
diff
changeset
|
2953 |
9428
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2954 int |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2955 gui_mch_is_blink_off(void) |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2956 { |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2957 return blink_state == BLINK_OFF; |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2958 } |
0c7f47088e55
commit https://github.com/vim/vim/commit/9d5d3c9c4468ad76f16b50eabd3d9e7eab2ed44d
Christian Brabandt <cb@256bit.org>
parents:
9213
diff
changeset
|
2959 |
7 | 2960 void |
7825
7898da204b98
commit https://github.com/vim/vim/commit/02fdaeaa697fb5af4ba7fee6e209b3c2c825bb4f
Christian Brabandt <cb@256bit.org>
parents:
7823
diff
changeset
|
2961 gui_mch_set_blinking(long waittime, long on, long off) |
7 | 2962 { |
2963 blink_waittime = waittime; | |
2964 blink_ontime = on; | |
2965 blink_offtime = off; | |
2966 } | |
2967 | |
2968 /* | |
2969 * Stop the cursor blinking. Show the cursor if it wasn't shown. | |
2970 */ | |
2971 void | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
2972 gui_mch_stop_blink(int may_call_gui_update_cursor) |
7 | 2973 { |
2974 if (blink_timer != (XtIntervalId)0) | |
2975 { | |
2976 XtRemoveTimeOut(blink_timer); | |
2977 blink_timer = (XtIntervalId)0; | |
2978 } | |
13152
f4c3a7f410f4
patch 8.0.1450: GUI: endless loop when stopping cursor blinking
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
2979 if (blink_state == BLINK_OFF && may_call_gui_update_cursor) |
7 | 2980 gui_update_cursor(TRUE, FALSE); |
2981 blink_state = BLINK_NONE; | |
2982 } | |
2983 | |
2984 static void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2985 gui_x11_blink_cb( |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2986 XtPointer timed_out UNUSED, |
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2987 XtIntervalId *interval_id UNUSED) |
7 | 2988 { |
2989 if (blink_state == BLINK_ON) | |
2990 { | |
2991 gui_undraw_cursor(); | |
2992 blink_state = BLINK_OFF; | |
2993 blink_timer = XtAppAddTimeOut(app_context, blink_offtime, | |
2994 gui_x11_blink_cb, NULL); | |
2995 } | |
2996 else | |
2997 { | |
2998 gui_update_cursor(TRUE, FALSE); | |
2999 blink_state = BLINK_ON; | |
3000 blink_timer = XtAppAddTimeOut(app_context, blink_ontime, | |
3001 gui_x11_blink_cb, NULL); | |
3002 } | |
3003 } | |
3004 | |
3005 /* | |
12257
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3006 * 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
|
3007 * 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
|
3008 */ |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3009 void |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3010 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
|
3011 { |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3012 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
|
3013 XtRemoveTimeOut(blink_timer); |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3014 // 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
|
3015 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
|
3016 { |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3017 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
|
3018 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
|
3019 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
|
3020 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
|
3021 } |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3022 } |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3023 |
519e4e6bbc28
patch 8.0.1008: slow updating of terminal window in Motif
Christian Brabandt <cb@256bit.org>
parents:
11770
diff
changeset
|
3024 /* |
7 | 3025 * Return the RGB value of a pixel as a long. |
3026 */ | |
9939
ccb6461b82df
commit https://github.com/vim/vim/commit/1b58cdd160c2e0ada0f638679a2aa27e4665fc48
Christian Brabandt <cb@256bit.org>
parents:
9634
diff
changeset
|
3027 guicolor_T |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3028 gui_mch_get_rgb(guicolor_T pixel) |
7 | 3029 { |
3030 XColor xc; | |
3031 Colormap colormap; | |
3032 | |
3033 colormap = DefaultColormap(gui.dpy, XDefaultScreen(gui.dpy)); | |
3034 xc.pixel = pixel; | |
3035 XQueryColor(gui.dpy, colormap, &xc); | |
3036 | |
9939
ccb6461b82df
commit https://github.com/vim/vim/commit/1b58cdd160c2e0ada0f638679a2aa27e4665fc48
Christian Brabandt <cb@256bit.org>
parents:
9634
diff
changeset
|
3037 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
|
3038 + ((unsigned)xc.blue >> 8)); |
7 | 3039 } |
3040 | |
3041 /* | |
3042 * Add the callback functions. | |
3043 */ | |
3044 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3045 gui_x11_callbacks(Widget textArea, Widget vimForm) |
7 | 3046 { |
3047 XtAddEventHandler(textArea, VisibilityChangeMask, FALSE, | |
3048 gui_x11_visibility_cb, (XtPointer)0); | |
3049 | |
3050 XtAddEventHandler(textArea, ExposureMask, FALSE, gui_x11_expose_cb, | |
3051 (XtPointer)0); | |
3052 | |
3053 XtAddEventHandler(vimShell, StructureNotifyMask, FALSE, | |
3054 gui_x11_resize_window_cb, (XtPointer)0); | |
3055 | |
3056 XtAddEventHandler(vimShell, FocusChangeMask, FALSE, gui_x11_focus_change_cb, | |
3057 (XtPointer)0); | |
3058 /* | |
3059 * Only install these enter/leave callbacks when 'p' in 'guioptions'. | |
3060 * Only needed for some window managers. | |
3061 */ | |
3062 if (vim_strchr(p_go, GO_POINTER) != NULL) | |
3063 { | |
3064 XtAddEventHandler(vimShell, LeaveWindowMask, FALSE, gui_x11_leave_cb, | |
3065 (XtPointer)0); | |
3066 XtAddEventHandler(textArea, LeaveWindowMask, FALSE, gui_x11_leave_cb, | |
3067 (XtPointer)0); | |
3068 XtAddEventHandler(textArea, EnterWindowMask, FALSE, gui_x11_enter_cb, | |
3069 (XtPointer)0); | |
3070 XtAddEventHandler(vimShell, EnterWindowMask, FALSE, gui_x11_enter_cb, | |
3071 (XtPointer)0); | |
3072 } | |
3073 | |
3074 XtAddEventHandler(vimForm, KeyPressMask, FALSE, gui_x11_key_hit_cb, | |
3075 (XtPointer)0); | |
3076 XtAddEventHandler(textArea, KeyPressMask, FALSE, gui_x11_key_hit_cb, | |
3077 (XtPointer)0); | |
3078 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3079 // get pointer moved events from scrollbar, needed for 'mousefocus' |
7 | 3080 XtAddEventHandler(vimForm, PointerMotionMask, |
3081 FALSE, gui_x11_mouse_cb, (XtPointer)1); | |
3082 XtAddEventHandler(textArea, ButtonPressMask | ButtonReleaseMask | | |
3083 ButtonMotionMask | PointerMotionMask, | |
3084 FALSE, gui_x11_mouse_cb, (XtPointer)0); | |
3085 } | |
3086 | |
3087 /* | |
88 | 3088 * Get current mouse coordinates in text window. |
7 | 3089 */ |
88 | 3090 void |
3091 gui_mch_getmouse(int *x, int *y) | |
7 | 3092 { |
3093 int rootx, rooty, winx, winy; | |
3094 Window root, child; | |
3095 unsigned int mask; | |
3096 | |
3097 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
|
3098 &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
|
3099 { |
88 | 3100 *x = winx; |
3101 *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
|
3102 } |
50555279168b
patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents:
31651
diff
changeset
|
3103 else |
50555279168b
patch 9.0.1234: the code style has to be checked manually
Bram Moolenaar <Bram@vim.org>
parents:
31651
diff
changeset
|
3104 { |
88 | 3105 *x = -1; |
3106 *y = -1; | |
3107 } | |
7 | 3108 } |
3109 | |
3110 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3111 gui_mch_setmouse(int x, int y) |
7 | 3112 { |
3113 if (gui.wid) | |
3114 XWarpPointer(gui.dpy, (Window)0, gui.wid, 0, 0, 0, 0, x, y); | |
3115 } | |
3116 | |
3117 #if (defined(FEAT_GUI_MOTIF) && defined(FEAT_MENU)) || defined(PROTO) | |
3118 XButtonPressedEvent * | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3119 gui_x11_get_last_mouse_event(void) |
7 | 3120 { |
3121 return &last_mouse_event; | |
3122 } | |
3123 #endif | |
3124 | |
3125 #if defined(FEAT_SIGN_ICONS) || defined(PROTO) | |
3126 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3127 // 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
|
3128 // to provide room for the bitmap! |
7 | 3129 # define SIGN_WIDTH (gui.char_width * 2) |
3130 | |
3131 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3132 gui_mch_drawsign(int row, int col, int typenr) |
7 | 3133 { |
3134 XImage *sign; | |
3135 | |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3136 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
|
3137 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3138 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3139 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
|
3140 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
|
3141 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
|
3142 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
|
3143 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
|
3144 sign->width, sign->height); |
7 | 3145 } |
3146 | |
3147 void * | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3148 gui_mch_register_sign(char_u *signfile) |
7 | 3149 { |
3150 XpmAttributes attrs; | |
1827 | 3151 XImage *sign = NULL; |
7 | 3152 int status; |
3153 | |
3154 /* | |
3155 * Setup the color substitution table. | |
3156 */ | |
3157 if (signfile[0] != NUL && signfile[0] != '-') | |
3158 { | |
1827 | 3159 XpmColorSymbol color[5] = |
7 | 3160 { |
1827 | 3161 {"none", NULL, 0}, |
3162 {"iconColor1", NULL, 0}, | |
3163 {"bottomShadowColor", NULL, 0}, | |
3164 {"topShadowColor", NULL, 0}, | |
3165 {"selectColor", NULL, 0} | |
3166 }; | |
3167 attrs.valuemask = XpmColorSymbols; | |
3168 attrs.numsymbols = 2; | |
3169 attrs.colorsymbols = color; | |
3170 attrs.colorsymbols[0].pixel = gui.back_pixel; | |
3171 attrs.colorsymbols[1].pixel = gui.norm_pixel; | |
3172 status = XpmReadFileToImage(gui.dpy, (char *)signfile, | |
7 | 3173 &sign, NULL, &attrs); |
1827 | 3174 if (status == 0) |
3175 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3176 // 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
|
3177 // 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
|
3178 // gui.sign_width = sign->width + 8; |
7 | 3179 } |
1827 | 3180 else |
26883
7f150a4936f2
patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
3181 emsg(_(e_couldnt_read_in_sign_data)); |
7 | 3182 } |
3183 | |
3184 return (void *)sign; | |
3185 } | |
3186 | |
3187 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3188 gui_mch_destroy_sign(void *sign) |
7 | 3189 { |
1827 | 3190 XDestroyImage((XImage*)sign); |
7 | 3191 } |
3192 #endif | |
3193 | |
3194 | |
3195 #ifdef FEAT_MOUSESHAPE | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3196 // 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
|
3197 // from hidden to not hidden. |
7 | 3198 static int last_shape = 0; |
3199 #endif | |
3200 | |
3201 /* | |
3202 * Use the blank mouse pointer or not. | |
3203 */ | |
3204 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3205 gui_mch_mousehide( |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3206 int hide) // TRUE = use blank ptr, FALSE = use parent ptr |
7 | 3207 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3208 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
|
3209 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3210 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3211 gui.pointer_hidden = hide; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3212 if (hide) |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3213 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
|
3214 else |
7 | 3215 #ifdef FEAT_MOUSESHAPE |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3216 mch_set_mouse_shape(last_shape); |
7 | 3217 #else |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3218 XUndefineCursor(gui.dpy, gui.wid); |
7 | 3219 #endif |
3220 } | |
3221 | |
3222 #if defined(FEAT_MOUSESHAPE) || defined(PROTO) | |
3223 | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3224 // 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
|
3225 // misc2.c! |
7 | 3226 static int mshape_ids[] = |
3227 { | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3228 XC_left_ptr, // arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3229 0, // blank |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3230 XC_xterm, // beam |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3231 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
|
3232 XC_sizing, // udsizing |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3233 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
|
3234 XC_sizing, // lrsizing |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3235 XC_watch, // busy |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3236 XC_X_cursor, // no |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3237 XC_crosshair, // crosshair |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3238 XC_hand1, // hand1 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3239 XC_hand2, // hand2 |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3240 XC_pencil, // pencil |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3241 XC_question_arrow, // question |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3242 XC_right_ptr, // right-arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3243 XC_center_ptr, // up-arrow |
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3244 XC_left_ptr // last one |
7 | 3245 }; |
3246 | |
3247 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3248 mch_set_mouse_shape(int shape) |
7 | 3249 { |
3250 int id; | |
3251 | |
3252 if (!gui.in_use) | |
3253 return; | |
3254 | |
3255 if (shape == MSHAPE_HIDE || gui.pointer_hidden) | |
3256 XDefineCursor(gui.dpy, gui.wid, gui.blank_pointer); | |
3257 else | |
3258 { | |
3259 if (shape >= MSHAPE_NUMBERED) | |
3260 { | |
3261 id = shape - MSHAPE_NUMBERED; | |
3262 if (id >= XC_num_glyphs) | |
3263 id = XC_left_ptr; | |
3264 else | |
18788
e1f4e9d78a6a
patch 8.1.2383: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18671
diff
changeset
|
3265 id &= ~1; // they are always even (why?) |
7 | 3266 } |
3267 else | |
3268 id = mshape_ids[shape]; | |
3269 | |
3270 XDefineCursor(gui.dpy, gui.wid, XCreateFontCursor(gui.dpy, id)); | |
3271 } | |
3272 if (shape != MSHAPE_HIDE) | |
3273 last_shape = shape; | |
3274 } | |
3275 #endif | |
3276 | |
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
|
3277 #if (defined(FEAT_TOOLBAR) && defined(FEAT_BEVAL_GUI)) || defined(PROTO) |
7 | 3278 /* |
3279 * Set the balloon-eval used for the tooltip of a toolbar menu item. | |
3280 * The check for a non-toolbar item was added, because there is a crash when | |
3281 * passing a normal menu item here. Can't explain that, but better avoid it. | |
3282 */ | |
3283 void | |
7823
bcef391c101c
commit https://github.com/vim/vim/commit/68c2f638e65d914dc6e84eb7ce2624f08af525c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3284 gui_mch_menu_set_tip(vimmenu_T *menu) |
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->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
|
3287 || !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
|
3288 return; |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3289 |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3290 // 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
|
3291 // changed. |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3292 if (menu->tip != NULL) |
7 | 3293 { |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3294 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
|
3295 menu->tip = NULL; |
7 | 3296 } |
31651
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3297 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
|
3298 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
|
3299 menu->id, |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3300 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
|
3301 NULL, |
e5ee2ffd826a
patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30310
diff
changeset
|
3302 NULL); |
7 | 3303 } |
3304 #endif |