Mercurial > vim
annotate src/gui_beval.c @ 14194:6fbb8dfb3389 v8.1.0114
patch 8.1.0114: confusing variable name
commit https://github.com/vim/vim/commit/0119a59ffdfb21cf1c0a56e7ed6105e875150163
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jun 24 23:53:28 2018 +0200
patch 8.1.0114: confusing variable name
Problem: Confusing variable name.
Solution: Rename new_ts to new_vts_array. Change zero to NULL.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 25 Jun 2018 00:00:07 +0200 |
parents | 2ad722003b36 |
children | 4cb334816bb1 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9630
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * Visual Workshop integration by Gordon Prieur | |
5 * | |
6 * Do ":help uganda" in Vim to read copying and usage conditions. | |
7 * Do ":help credits" in Vim to see a list of people who contributed. | |
8 * See README.txt for an overview of the Vim source code. | |
9 */ | |
10 | |
11 #include "vim.h" | |
12 | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
13 #if defined(FEAT_BEVAL_GUI) || defined(PROTO) |
192 | 14 |
15 /* on Win32 only get_beval_info() is required */ | |
7 | 16 #if !defined(FEAT_GUI_W32) || defined(PROTO) |
17 | |
18 #ifdef FEAT_GUI_GTK | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
19 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
20 # include <gdk/gdkkeysyms-compat.h> |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
21 # else |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
22 # include <gdk/gdkkeysyms.h> |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
23 # endif |
7 | 24 # include <gtk/gtk.h> |
25 #else | |
26 # include <X11/keysym.h> | |
27 # ifdef FEAT_GUI_MOTIF | |
28 # include <Xm/PushB.h> | |
29 # include <Xm/Separator.h> | |
30 # include <Xm/List.h> | |
31 # include <Xm/Label.h> | |
32 # include <Xm/AtomMgr.h> | |
33 # include <Xm/Protocols.h> | |
34 # else | |
35 /* Assume Athena */ | |
36 # include <X11/Shell.h> | |
680 | 37 # ifdef FEAT_GUI_NEXTAW |
38 # include <X11/neXtaw/Label.h> | |
39 # else | |
40 # include <X11/Xaw/Label.h> | |
41 # endif | |
7 | 42 # endif |
43 #endif | |
44 | |
45 #ifndef FEAT_GUI_GTK | |
46 extern Widget vimShell; | |
47 | |
48 /* | |
49 * Currently, we assume that there can be only one BalloonEval showing | |
50 * on-screen at any given moment. This variable will hold the currently | |
51 * showing BalloonEval or NULL if none is showing. | |
52 */ | |
53 static BalloonEval *current_beval = NULL; | |
54 #endif | |
55 | |
56 #ifdef FEAT_GUI_GTK | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
57 static void addEventHandler(GtkWidget *, BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
58 static void removeEventHandler(BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
59 static gint target_event_cb(GtkWidget *, GdkEvent *, gpointer); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
60 static gint mainwin_event_cb(GtkWidget *, GdkEvent *, gpointer); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
61 static void pointer_event(BalloonEval *, int, int, unsigned); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
62 static void key_event(BalloonEval *, unsigned, int); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
63 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
64 static gboolean timeout_cb(gpointer); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
65 # else |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
66 static gint timeout_cb(gpointer); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
67 # endif |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
68 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
69 static gboolean balloon_draw_event_cb (GtkWidget *, cairo_t *, gpointer); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
70 # else |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
71 static gint balloon_expose_event_cb (GtkWidget *, GdkEventExpose *, gpointer); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
72 # endif |
7 | 73 #else |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
74 static void addEventHandler(Widget, BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
75 static void removeEventHandler(BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
76 static void pointerEventEH(Widget, XtPointer, XEvent *, Boolean *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
77 static void pointerEvent(BalloonEval *, XEvent *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
78 static void timerRoutine(XtPointer, XtIntervalId *); |
7 | 79 #endif |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
80 static void cancelBalloon(BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
81 static void requestBalloon(BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
82 static void drawBalloon(BalloonEval *); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
83 static void undrawBalloon(BalloonEval *beval); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
6297
diff
changeset
|
84 static void createBalloonEvalWindow(BalloonEval *); |
7 | 85 |
86 /* | |
87 * Create a balloon-evaluation area for a Widget. | |
88 * There can be either a "mesg" for a fixed string or "mesgCB" to generate a | |
89 * message by calling this callback function. | |
90 * When "mesg" is not NULL it must remain valid for as long as the balloon is | |
91 * used. It is not freed here. | |
92 * Returns a pointer to the resulting object (NULL when out of memory). | |
93 */ | |
94 BalloonEval * | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
95 gui_mch_create_beval_area( |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
96 void *target, |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
97 char_u *mesg, |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
98 void (*mesgCB)(BalloonEval *, int), |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
99 void *clientData) |
7 | 100 { |
101 #ifndef FEAT_GUI_GTK | |
102 char *display_name; /* get from gui.dpy */ | |
103 int screen_num; | |
104 char *p; | |
105 #endif | |
106 BalloonEval *beval; | |
107 | |
108 if (mesg != NULL && mesgCB != NULL) | |
109 { | |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10176
diff
changeset
|
110 IEMSG(_("E232: Cannot create BalloonEval with both message and callback")); |
7 | 111 return NULL; |
112 } | |
113 | |
114 beval = (BalloonEval *)alloc(sizeof(BalloonEval)); | |
115 if (beval != NULL) | |
116 { | |
117 #ifdef FEAT_GUI_GTK | |
118 beval->target = GTK_WIDGET(target); | |
119 beval->balloonShell = NULL; | |
120 beval->timerID = 0; | |
121 #else | |
122 beval->target = (Widget)target; | |
123 beval->balloonShell = NULL; | |
124 beval->timerID = (XtIntervalId)NULL; | |
125 beval->appContext = XtWidgetToApplicationContext((Widget)target); | |
126 #endif | |
127 beval->showState = ShS_NEUTRAL; | |
128 beval->x = 0; | |
129 beval->y = 0; | |
130 beval->msg = mesg; | |
131 beval->msgCB = mesgCB; | |
132 beval->clientData = clientData; | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
133 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
134 beval->vts = NULL; |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
135 #endif |
7 | 136 |
137 /* | |
138 * Set up event handler which will keep its eyes on the pointer, | |
139 * and when the pointer rests in a certain spot for a given time | |
140 * interval, show the beval. | |
141 */ | |
142 addEventHandler(beval->target, beval); | |
143 createBalloonEvalWindow(beval); | |
144 | |
145 #ifndef FEAT_GUI_GTK | |
146 /* | |
147 * Now create and save the screen width and height. Used in drawing. | |
148 */ | |
149 display_name = DisplayString(gui.dpy); | |
150 p = strrchr(display_name, '.'); | |
151 if (p != NULL) | |
152 screen_num = atoi(++p); | |
153 else | |
154 screen_num = 0; | |
155 beval->screen_width = DisplayWidth(gui.dpy, screen_num); | |
156 beval->screen_height = DisplayHeight(gui.dpy, screen_num); | |
157 #endif | |
158 } | |
159 | |
160 return beval; | |
161 } | |
162 | |
163 #if defined(FEAT_BEVAL_TIP) || defined(PROTO) | |
164 /* | |
1228 | 165 * Destroy a balloon-eval and free its associated memory. |
7 | 166 */ |
167 void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
168 gui_mch_destroy_beval_area(BalloonEval *beval) |
7 | 169 { |
170 cancelBalloon(beval); | |
171 removeEventHandler(beval); | |
172 /* Children will automatically be destroyed */ | |
173 # ifdef FEAT_GUI_GTK | |
174 gtk_widget_destroy(beval->balloonShell); | |
175 # else | |
176 XtDestroyWidget(beval->balloonShell); | |
177 # endif | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
178 # ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
179 if (beval->vts) |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
180 vim_free(beval->vts); |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
12871
diff
changeset
|
181 # endif |
7 | 182 vim_free(beval); |
183 } | |
184 #endif | |
185 | |
186 void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
187 gui_mch_enable_beval_area(BalloonEval *beval) |
7 | 188 { |
189 if (beval != NULL) | |
190 addEventHandler(beval->target, beval); | |
191 } | |
192 | |
193 void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
194 gui_mch_disable_beval_area(BalloonEval *beval) |
7 | 195 { |
196 if (beval != NULL) | |
197 removeEventHandler(beval); | |
198 } | |
199 | |
200 #if defined(FEAT_BEVAL_TIP) || defined(PROTO) | |
201 /* | |
202 * This function returns the BalloonEval * associated with the currently | |
203 * displayed tooltip. Returns NULL if there is no tooltip currently showing. | |
204 * | |
205 * Assumption: Only one tooltip can be shown at a time. | |
206 */ | |
207 BalloonEval * | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
208 gui_mch_currently_showing_beval(void) |
7 | 209 { |
210 return current_beval; | |
211 } | |
212 #endif | |
213 #endif /* !FEAT_GUI_W32 */ | |
214 | |
192 | 215 #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) \ |
216 || defined(FEAT_EVAL) || defined(PROTO) | |
7 | 217 # if !defined(FEAT_GUI_W32) || defined(PROTO) |
218 | |
219 /* | |
220 * Show a balloon with "mesg". | |
221 */ | |
222 void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
223 gui_mch_post_balloon(BalloonEval *beval, char_u *mesg) |
7 | 224 { |
225 beval->msg = mesg; | |
226 if (mesg != NULL) | |
227 drawBalloon(beval); | |
228 else | |
229 undrawBalloon(beval); | |
230 } | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
231 # endif /* !FEAT_GUI_W32 */ |
7 | 232 #endif /* FEAT_SUN_WORKSHOP || FEAT_NETBEANS_INTG || PROTO */ |
233 | |
234 #if !defined(FEAT_GUI_W32) || defined(PROTO) | |
235 #if defined(FEAT_BEVAL_TIP) || defined(PROTO) | |
236 /* | |
237 * Hide the given balloon. | |
238 */ | |
239 void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
240 gui_mch_unpost_balloon(BalloonEval *beval) |
7 | 241 { |
242 undrawBalloon(beval); | |
243 } | |
244 #endif | |
245 | |
246 #ifdef FEAT_GUI_GTK | |
247 static void | |
248 addEventHandler(GtkWidget *target, BalloonEval *beval) | |
249 { | |
250 /* | |
251 * Connect to the generic "event" signal instead of the individual | |
252 * signals for each event type, because the former is emitted earlier. | |
253 * This allows us to catch events independently of the signal handlers | |
254 * in gui_gtk_x11.c. | |
255 */ | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
256 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
257 g_signal_connect(G_OBJECT(target), "event", |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
258 G_CALLBACK(target_event_cb), |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
259 beval); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
260 # else |
7 | 261 /* Should use GTK_OBJECT() here, but that causes a lint warning... */ |
262 gtk_signal_connect((GtkObject*)(target), "event", | |
263 GTK_SIGNAL_FUNC(target_event_cb), | |
264 beval); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
265 # endif |
7 | 266 /* |
267 * Nasty: Key press events go to the main window thus the drawing area | |
268 * will never see them. This means we have to connect to the main window | |
269 * as well in order to catch those events. | |
270 */ | |
271 if (gtk_socket_id == 0 && gui.mainwin != NULL | |
272 && gtk_widget_is_ancestor(target, gui.mainwin)) | |
273 { | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
274 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
275 g_signal_connect(G_OBJECT(gui.mainwin), "event", |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
276 G_CALLBACK(mainwin_event_cb), |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
277 beval); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
278 # else |
7 | 279 gtk_signal_connect((GtkObject*)(gui.mainwin), "event", |
280 GTK_SIGNAL_FUNC(mainwin_event_cb), | |
281 beval); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
282 # endif |
7 | 283 } |
284 } | |
285 | |
286 static void | |
287 removeEventHandler(BalloonEval *beval) | |
288 { | |
137 | 289 /* LINTED: avoid warning: dubious operation on enum */ |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
290 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
291 g_signal_handlers_disconnect_by_func(G_OBJECT(beval->target), |
10176
51888fb2599f
commit https://github.com/vim/vim/commit/d47d83745ff450232328ca7a4b8b00b31bad22fc
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
292 FUNC2GENERIC(target_event_cb), |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
293 beval); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
294 # else |
7 | 295 gtk_signal_disconnect_by_func((GtkObject*)(beval->target), |
296 GTK_SIGNAL_FUNC(target_event_cb), | |
297 beval); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
298 # endif |
7 | 299 |
300 if (gtk_socket_id == 0 && gui.mainwin != NULL | |
301 && gtk_widget_is_ancestor(beval->target, gui.mainwin)) | |
302 { | |
137 | 303 /* LINTED: avoid warning: dubious operation on enum */ |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
304 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
305 g_signal_handlers_disconnect_by_func(G_OBJECT(gui.mainwin), |
10176
51888fb2599f
commit https://github.com/vim/vim/commit/d47d83745ff450232328ca7a4b8b00b31bad22fc
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
306 FUNC2GENERIC(mainwin_event_cb), |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
307 beval); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
308 # else |
7 | 309 gtk_signal_disconnect_by_func((GtkObject*)(gui.mainwin), |
310 GTK_SIGNAL_FUNC(mainwin_event_cb), | |
311 beval); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
312 # endif |
7 | 313 } |
314 } | |
315 | |
316 static gint | |
317 target_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data) | |
318 { | |
319 BalloonEval *beval = (BalloonEval *)data; | |
320 | |
321 switch (event->type) | |
322 { | |
323 case GDK_ENTER_NOTIFY: | |
324 pointer_event(beval, (int)event->crossing.x, | |
325 (int)event->crossing.y, | |
326 event->crossing.state); | |
327 break; | |
328 case GDK_MOTION_NOTIFY: | |
329 if (event->motion.is_hint) | |
330 { | |
331 int x; | |
332 int y; | |
333 GdkModifierType state; | |
334 /* | |
335 * GDK_POINTER_MOTION_HINT_MASK is set, thus we cannot obtain | |
336 * the coordinates from the GdkEventMotion struct directly. | |
337 */ | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
338 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
339 { |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
340 GdkWindow * const win = gtk_widget_get_window(widget); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
341 GdkDisplay * const dpy = gdk_window_get_display(win); |
8926
fc69eed19ba7
commit https://github.com/vim/vim/commit/30e12d259ee78272359f9da2655d0593a4f6a626
Christian Brabandt <cb@256bit.org>
parents:
8218
diff
changeset
|
342 # if GTK_CHECK_VERSION(3,20,0) |
fc69eed19ba7
commit https://github.com/vim/vim/commit/30e12d259ee78272359f9da2655d0593a4f6a626
Christian Brabandt <cb@256bit.org>
parents:
8218
diff
changeset
|
343 GdkSeat * const seat = gdk_display_get_default_seat(dpy); |
fc69eed19ba7
commit https://github.com/vim/vim/commit/30e12d259ee78272359f9da2655d0593a4f6a626
Christian Brabandt <cb@256bit.org>
parents:
8218
diff
changeset
|
344 GdkDevice * const dev = gdk_seat_get_pointer(seat); |
fc69eed19ba7
commit https://github.com/vim/vim/commit/30e12d259ee78272359f9da2655d0593a4f6a626
Christian Brabandt <cb@256bit.org>
parents:
8218
diff
changeset
|
345 # else |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
346 GdkDeviceManager * const mngr = gdk_display_get_device_manager(dpy); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
347 GdkDevice * const dev = gdk_device_manager_get_client_pointer(mngr); |
8926
fc69eed19ba7
commit https://github.com/vim/vim/commit/30e12d259ee78272359f9da2655d0593a4f6a626
Christian Brabandt <cb@256bit.org>
parents:
8218
diff
changeset
|
348 # endif |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
349 gdk_window_get_device_position(win, dev , &x, &y, &state); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
350 } |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
351 # else |
7 | 352 gdk_window_get_pointer(widget->window, &x, &y, &state); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
353 # endif |
7 | 354 pointer_event(beval, x, y, (unsigned int)state); |
355 } | |
356 else | |
357 { | |
358 pointer_event(beval, (int)event->motion.x, | |
359 (int)event->motion.y, | |
360 event->motion.state); | |
361 } | |
362 break; | |
363 case GDK_LEAVE_NOTIFY: | |
364 /* | |
365 * Ignore LeaveNotify events that are not "normal". | |
366 * Apparently we also get it when somebody else grabs focus. | |
367 */ | |
368 if (event->crossing.mode == GDK_CROSSING_NORMAL) | |
369 cancelBalloon(beval); | |
370 break; | |
371 case GDK_BUTTON_PRESS: | |
372 case GDK_SCROLL: | |
373 cancelBalloon(beval); | |
374 break; | |
375 case GDK_KEY_PRESS: | |
376 key_event(beval, event->key.keyval, TRUE); | |
377 break; | |
378 case GDK_KEY_RELEASE: | |
379 key_event(beval, event->key.keyval, FALSE); | |
380 break; | |
381 default: | |
382 break; | |
383 } | |
384 | |
385 return FALSE; /* continue emission */ | |
386 } | |
387 | |
388 static gint | |
1884 | 389 mainwin_event_cb(GtkWidget *widget UNUSED, GdkEvent *event, gpointer data) |
7 | 390 { |
391 BalloonEval *beval = (BalloonEval *)data; | |
392 | |
393 switch (event->type) | |
394 { | |
395 case GDK_KEY_PRESS: | |
396 key_event(beval, event->key.keyval, TRUE); | |
397 break; | |
398 case GDK_KEY_RELEASE: | |
399 key_event(beval, event->key.keyval, FALSE); | |
400 break; | |
401 default: | |
402 break; | |
403 } | |
404 | |
405 return FALSE; /* continue emission */ | |
406 } | |
407 | |
408 static void | |
409 pointer_event(BalloonEval *beval, int x, int y, unsigned state) | |
410 { | |
411 int distance; | |
412 | |
413 distance = ABS(x - beval->x) + ABS(y - beval->y); | |
414 | |
415 if (distance > 4) | |
416 { | |
417 /* | |
418 * Moved out of the balloon location: cancel it. | |
419 * Remember button state | |
420 */ | |
421 beval->state = state; | |
422 cancelBalloon(beval); | |
423 | |
424 /* Mouse buttons are pressed - no balloon now */ | |
425 if (!(state & ((int)GDK_BUTTON1_MASK | (int)GDK_BUTTON2_MASK | |
426 | (int)GDK_BUTTON3_MASK))) | |
427 { | |
428 beval->x = x; | |
429 beval->y = y; | |
430 | |
431 if (state & (int)GDK_MOD1_MASK) | |
432 { | |
433 /* | |
434 * Alt is pressed -- enter super-evaluate-mode, | |
435 * where there is no time delay | |
436 */ | |
437 if (beval->msgCB != NULL) | |
438 { | |
439 beval->showState = ShS_PENDING; | |
440 (*beval->msgCB)(beval, state); | |
441 } | |
442 } | |
443 else | |
444 { | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
445 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
446 beval->timerID = g_timeout_add((guint)p_bdlay, |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
447 &timeout_cb, beval); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
448 # else |
7 | 449 beval->timerID = gtk_timeout_add((guint32)p_bdlay, |
450 &timeout_cb, beval); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
451 # endif |
7 | 452 } |
453 } | |
454 } | |
455 } | |
456 | |
457 static void | |
458 key_event(BalloonEval *beval, unsigned keyval, int is_keypress) | |
459 { | |
460 if (beval->showState == ShS_SHOWING && beval->msgCB != NULL) | |
461 { | |
462 switch (keyval) | |
463 { | |
464 case GDK_Shift_L: | |
465 case GDK_Shift_R: | |
466 beval->showState = ShS_UPDATE_PENDING; | |
467 (*beval->msgCB)(beval, (is_keypress) | |
468 ? (int)GDK_SHIFT_MASK : 0); | |
469 break; | |
470 case GDK_Control_L: | |
471 case GDK_Control_R: | |
472 beval->showState = ShS_UPDATE_PENDING; | |
473 (*beval->msgCB)(beval, (is_keypress) | |
474 ? (int)GDK_CONTROL_MASK : 0); | |
475 break; | |
476 default: | |
667 | 477 /* Don't do this for key release, we apparently get these with |
478 * focus changes in some GTK version. */ | |
479 if (is_keypress) | |
480 cancelBalloon(beval); | |
7 | 481 break; |
482 } | |
483 } | |
484 else | |
485 cancelBalloon(beval); | |
486 } | |
487 | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
488 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
489 static gboolean |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
490 # else |
7 | 491 static gint |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
492 # endif |
7 | 493 timeout_cb(gpointer data) |
494 { | |
495 BalloonEval *beval = (BalloonEval *)data; | |
496 | |
497 beval->timerID = 0; | |
498 /* | |
499 * If the timer event happens then the mouse has stopped long enough for | |
500 * a request to be started. The request will only send to the debugger if | |
501 * there the mouse is pointing at real data. | |
502 */ | |
503 requestBalloon(beval); | |
504 | |
505 return FALSE; /* don't call me again */ | |
506 } | |
507 | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
508 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
509 static gboolean |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
510 balloon_draw_event_cb(GtkWidget *widget, |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
511 cairo_t *cr, |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
512 gpointer data UNUSED) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
513 { |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
514 GtkStyleContext *context = NULL; |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
515 gint width = -1, height = -1; |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
516 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
517 if (widget == NULL) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
518 return TRUE; |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
519 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
520 context = gtk_widget_get_style_context(widget); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
521 width = gtk_widget_get_allocated_width(widget); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
522 height = gtk_widget_get_allocated_height(widget); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
523 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
524 gtk_style_context_save(context); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
525 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
526 gtk_style_context_add_class(context, "tooltip"); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
527 gtk_style_context_set_state(context, GTK_STATE_FLAG_NORMAL); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
528 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
529 cairo_save(cr); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
530 gtk_render_frame(context, cr, 0, 0, width, height); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
531 gtk_render_background(context, cr, 0, 0, width, height); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
532 cairo_restore(cr); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
533 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
534 gtk_style_context_restore(context); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
535 |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
536 return FALSE; |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
537 } |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
538 # else |
7 | 539 static gint |
1884 | 540 balloon_expose_event_cb(GtkWidget *widget, |
541 GdkEventExpose *event, | |
542 gpointer data UNUSED) | |
7 | 543 { |
544 gtk_paint_flat_box(widget->style, widget->window, | |
545 GTK_STATE_NORMAL, GTK_SHADOW_OUT, | |
546 &event->area, widget, "tooltip", | |
547 0, 0, -1, -1); | |
548 | |
549 return FALSE; /* continue emission */ | |
550 } | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
551 # endif /* !GTK_CHECK_VERSION(3,0,0) */ |
7 | 552 |
553 #else /* !FEAT_GUI_GTK */ | |
554 | |
555 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
556 addEventHandler(Widget target, BalloonEval *beval) |
7 | 557 { |
558 XtAddEventHandler(target, | |
559 PointerMotionMask | EnterWindowMask | | |
560 LeaveWindowMask | ButtonPressMask | KeyPressMask | | |
561 KeyReleaseMask, | |
562 False, | |
563 pointerEventEH, (XtPointer)beval); | |
564 } | |
565 | |
566 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
567 removeEventHandler(BalloonEval *beval) |
7 | 568 { |
569 XtRemoveEventHandler(beval->target, | |
570 PointerMotionMask | EnterWindowMask | | |
571 LeaveWindowMask | ButtonPressMask | KeyPressMask | | |
572 KeyReleaseMask, | |
573 False, | |
574 pointerEventEH, (XtPointer)beval); | |
575 } | |
576 | |
577 | |
578 /* | |
579 * The X event handler. All it does is call the real event handler. | |
580 */ | |
581 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
582 pointerEventEH( |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
583 Widget w UNUSED, |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
584 XtPointer client_data, |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
585 XEvent *event, |
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
586 Boolean *unused UNUSED) |
7 | 587 { |
588 BalloonEval *beval = (BalloonEval *)client_data; | |
589 pointerEvent(beval, event); | |
590 } | |
591 | |
592 | |
593 /* | |
594 * The real event handler. Called by pointerEventEH() whenever an event we are | |
1228 | 595 * interested in occurs. |
7 | 596 */ |
597 | |
598 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
599 pointerEvent(BalloonEval *beval, XEvent *event) |
7 | 600 { |
4352 | 601 Position distance; /* a measure of how much the pointer moved */ |
7 | 602 Position delta; /* used to compute distance */ |
603 | |
604 switch (event->type) | |
605 { | |
606 case EnterNotify: | |
607 case MotionNotify: | |
608 delta = event->xmotion.x - beval->x; | |
609 if (delta < 0) | |
610 delta = -delta; | |
611 distance = delta; | |
612 delta = event->xmotion.y - beval->y; | |
613 if (delta < 0) | |
614 delta = -delta; | |
615 distance += delta; | |
616 if (distance > 4) | |
617 { | |
618 /* | |
619 * Moved out of the balloon location: cancel it. | |
620 * Remember button state | |
621 */ | |
622 beval->state = event->xmotion.state; | |
623 if (beval->state & (Button1Mask|Button2Mask|Button3Mask)) | |
624 { | |
625 /* Mouse buttons are pressed - no balloon now */ | |
626 cancelBalloon(beval); | |
627 } | |
628 else if (beval->state & (Mod1Mask|Mod2Mask|Mod3Mask)) | |
629 { | |
630 /* | |
631 * Alt is pressed -- enter super-evaluate-mode, | |
632 * where there is no time delay | |
633 */ | |
634 beval->x = event->xmotion.x; | |
635 beval->y = event->xmotion.y; | |
636 beval->x_root = event->xmotion.x_root; | |
637 beval->y_root = event->xmotion.y_root; | |
638 cancelBalloon(beval); | |
639 if (beval->msgCB != NULL) | |
640 { | |
641 beval->showState = ShS_PENDING; | |
642 (*beval->msgCB)(beval, beval->state); | |
643 } | |
644 } | |
645 else | |
646 { | |
647 beval->x = event->xmotion.x; | |
648 beval->y = event->xmotion.y; | |
649 beval->x_root = event->xmotion.x_root; | |
650 beval->y_root = event->xmotion.y_root; | |
651 cancelBalloon(beval); | |
652 beval->timerID = XtAppAddTimeOut( beval->appContext, | |
653 (long_u)p_bdlay, timerRoutine, beval); | |
654 } | |
655 } | |
656 break; | |
657 | |
658 /* | |
659 * Motif and Athena version: Keystrokes will be caught by the | |
660 * "textArea" widget, and handled in gui_x11_key_hit_cb(). | |
661 */ | |
662 case KeyPress: | |
663 if (beval->showState == ShS_SHOWING && beval->msgCB != NULL) | |
664 { | |
665 Modifiers modifier; | |
666 KeySym keysym; | |
667 | |
668 XtTranslateKeycode(gui.dpy, | |
669 event->xkey.keycode, event->xkey.state, | |
670 &modifier, &keysym); | |
671 if (keysym == XK_Shift_L || keysym == XK_Shift_R) | |
672 { | |
673 beval->showState = ShS_UPDATE_PENDING; | |
674 (*beval->msgCB)(beval, ShiftMask); | |
675 } | |
676 else if (keysym == XK_Control_L || keysym == XK_Control_R) | |
677 { | |
678 beval->showState = ShS_UPDATE_PENDING; | |
679 (*beval->msgCB)(beval, ControlMask); | |
680 } | |
681 else | |
682 cancelBalloon(beval); | |
683 } | |
684 else | |
685 cancelBalloon(beval); | |
686 break; | |
687 | |
688 case KeyRelease: | |
689 if (beval->showState == ShS_SHOWING && beval->msgCB != NULL) | |
690 { | |
691 Modifiers modifier; | |
692 KeySym keysym; | |
693 | |
694 XtTranslateKeycode(gui.dpy, event->xkey.keycode, | |
695 event->xkey.state, &modifier, &keysym); | |
696 if ((keysym == XK_Shift_L) || (keysym == XK_Shift_R)) { | |
697 beval->showState = ShS_UPDATE_PENDING; | |
698 (*beval->msgCB)(beval, 0); | |
699 } | |
700 else if ((keysym == XK_Control_L) || (keysym == XK_Control_R)) | |
701 { | |
702 beval->showState = ShS_UPDATE_PENDING; | |
703 (*beval->msgCB)(beval, 0); | |
704 } | |
705 else | |
706 cancelBalloon(beval); | |
707 } | |
708 else | |
709 cancelBalloon(beval); | |
710 break; | |
711 | |
712 case LeaveNotify: | |
713 /* Ignore LeaveNotify events that are not "normal". | |
714 * Apparently we also get it when somebody else grabs focus. | |
715 * Happens for me every two seconds (some clipboard tool?) */ | |
716 if (event->xcrossing.mode == NotifyNormal) | |
717 cancelBalloon(beval); | |
718 break; | |
719 | |
720 case ButtonPress: | |
721 cancelBalloon(beval); | |
722 break; | |
723 | |
724 default: | |
725 break; | |
726 } | |
727 } | |
728 | |
729 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
730 timerRoutine(XtPointer dx, XtIntervalId *id UNUSED) |
7 | 731 { |
732 BalloonEval *beval = (BalloonEval *)dx; | |
733 | |
734 beval->timerID = (XtIntervalId)NULL; | |
735 | |
736 /* | |
737 * If the timer event happens then the mouse has stopped long enough for | |
738 * a request to be started. The request will only send to the debugger if | |
739 * there the mouse is pointing at real data. | |
740 */ | |
741 requestBalloon(beval); | |
742 } | |
743 | |
744 #endif /* !FEAT_GUI_GTK */ | |
745 | |
746 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
747 requestBalloon(BalloonEval *beval) |
7 | 748 { |
749 if (beval->showState != ShS_PENDING) | |
750 { | |
751 /* Determine the beval to display */ | |
752 if (beval->msgCB != NULL) | |
753 { | |
754 beval->showState = ShS_PENDING; | |
755 (*beval->msgCB)(beval, beval->state); | |
756 } | |
757 else if (beval->msg != NULL) | |
758 drawBalloon(beval); | |
759 } | |
760 } | |
761 | |
762 #ifdef FEAT_GUI_GTK | |
763 /* | |
764 * Convert the string to UTF-8 if 'encoding' is not "utf-8". | |
765 * Replace any non-printable characters and invalid bytes sequences with | |
766 * "^X" or "<xx>" escapes, and apply SpecialKey highlighting to them. | |
767 * TAB and NL are passed through unscathed. | |
768 */ | |
2275
e4d849f4df03
Remove the old and not well supported GTK 1 code. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2251
diff
changeset
|
769 # define IS_NONPRINTABLE(c) (((c) < 0x20 && (c) != TAB && (c) != NL) \ |
7 | 770 || (c) == DEL) |
771 static void | |
944 | 772 set_printable_label_text(GtkLabel *label, char_u *text) |
7 | 773 { |
774 char_u *convbuf = NULL; | |
775 char_u *buf; | |
776 char_u *p; | |
777 char_u *pdest; | |
778 unsigned int len; | |
779 int charlen; | |
780 int uc; | |
781 PangoAttrList *attr_list; | |
782 | |
783 /* Convert to UTF-8 if it isn't already */ | |
784 if (output_conv.vc_type != CONV_NONE) | |
785 { | |
944 | 786 convbuf = string_convert(&output_conv, text, NULL); |
7 | 787 if (convbuf != NULL) |
944 | 788 text = convbuf; |
7 | 789 } |
790 | |
791 /* First let's see how much we need to allocate */ | |
792 len = 0; | |
944 | 793 for (p = text; *p != NUL; p += charlen) |
7 | 794 { |
795 if ((*p & 0x80) == 0) /* be quick for ASCII */ | |
796 { | |
797 charlen = 1; | |
798 len += IS_NONPRINTABLE(*p) ? 2 : 1; /* nonprintable: ^X */ | |
799 } | |
800 else | |
801 { | |
474 | 802 charlen = utf_ptr2len(p); |
7 | 803 uc = utf_ptr2char(p); |
804 | |
805 if (charlen != utf_char2len(uc)) | |
806 charlen = 1; /* reject overlong sequences */ | |
807 | |
808 if (charlen == 1 || uc < 0xa0) /* illegal byte or */ | |
809 len += 4; /* control char: <xx> */ | |
810 else if (!utf_printable(uc)) | |
811 /* Note: we assume here that utf_printable() doesn't | |
812 * care about characters outside the BMP. */ | |
813 len += 6; /* nonprintable: <xxxx> */ | |
814 else | |
815 len += charlen; | |
816 } | |
817 } | |
818 | |
819 attr_list = pango_attr_list_new(); | |
820 buf = alloc(len + 1); | |
821 | |
822 /* Now go for the real work */ | |
823 if (buf != NULL) | |
824 { | |
825 attrentry_T *aep; | |
826 PangoAttribute *attr; | |
827 guicolor_T pixel; | |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
828 #if GTK_CHECK_VERSION(3,0,0) |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
829 GdkRGBA color = { 0.0, 0.0, 0.0, 1.0 }; |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
830 # if PANGO_VERSION_CHECK(1,38,0) |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
831 PangoAttribute *attr_alpha; |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
832 # endif |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
833 #else |
7 | 834 GdkColor color = { 0, 0, 0, 0 }; |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
835 #endif |
7 | 836 |
837 /* Look up the RGB values of the SpecialKey foreground color. */ | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
838 aep = syn_gui_attr2entry(HL_ATTR(HLF_8)); |
7 | 839 pixel = (aep != NULL) ? aep->ae_u.gui.fg_color : INVALCOLOR; |
840 if (pixel != INVALCOLOR) | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
841 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
842 { |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
843 color.red = ((pixel & 0xff0000) >> 16) / 255.0; |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
844 color.green = ((pixel & 0xff00) >> 8) / 255.0; |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
845 color.blue = (pixel & 0xff) / 255.0; |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
846 color.alpha = 1.0; |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
847 } |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
848 # else |
7 | 849 gdk_colormap_query_color(gtk_widget_get_colormap(gui.drawarea), |
850 (unsigned long)pixel, &color); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
851 # endif |
7 | 852 |
853 pdest = buf; | |
944 | 854 p = text; |
7 | 855 while (*p != NUL) |
856 { | |
857 /* Be quick for ASCII */ | |
858 if ((*p & 0x80) == 0 && !IS_NONPRINTABLE(*p)) | |
859 { | |
860 *pdest++ = *p++; | |
861 } | |
862 else | |
863 { | |
474 | 864 charlen = utf_ptr2len(p); |
7 | 865 uc = utf_ptr2char(p); |
866 | |
867 if (charlen != utf_char2len(uc)) | |
868 charlen = 1; /* reject overlong sequences */ | |
869 | |
870 if (charlen == 1 || uc < 0xa0 || !utf_printable(uc)) | |
871 { | |
872 int outlen; | |
873 | |
874 /* Careful: we can't just use transchar_byte() here, | |
875 * since 'encoding' is not necessarily set to "utf-8". */ | |
876 if (*p & 0x80 && charlen == 1) | |
877 { | |
878 transchar_hex(pdest, *p); /* <xx> */ | |
879 outlen = 4; | |
880 } | |
881 else if (uc >= 0x80) | |
882 { | |
883 /* Note: we assume here that utf_printable() doesn't | |
884 * care about characters outside the BMP. */ | |
885 transchar_hex(pdest, uc); /* <xx> or <xxxx> */ | |
886 outlen = (uc < 0x100) ? 4 : 6; | |
887 } | |
888 else | |
889 { | |
890 transchar_nonprint(pdest, *p); /* ^X */ | |
891 outlen = 2; | |
892 } | |
893 if (pixel != INVALCOLOR) | |
894 { | |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
895 #if GTK_CHECK_VERSION(3,0,0) |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
896 # define DOUBLE2UINT16(val) ((guint16)((val) * 65535 + 0.5)) |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
897 attr = pango_attr_foreground_new( |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
898 DOUBLE2UINT16(color.red), |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
899 DOUBLE2UINT16(color.green), |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
900 DOUBLE2UINT16(color.blue)); |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
901 # if PANGO_VERSION_CHECK(1,38,0) |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
902 attr_alpha = pango_attr_foreground_alpha_new( |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
903 DOUBLE2UINT16(color.alpha)); |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
904 # endif |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
905 # undef DOUBLE2UINT16 |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
906 #else |
7 | 907 attr = pango_attr_foreground_new( |
908 color.red, color.green, color.blue); | |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
909 #endif |
7 | 910 attr->start_index = pdest - buf; |
911 attr->end_index = pdest - buf + outlen; | |
912 pango_attr_list_insert(attr_list, attr); | |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
913 #if GTK_CHECK_VERSION(3,0,0) |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
914 # if PANGO_VERSION_CHECK(1,38,0) |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
915 attr_alpha->start_index = pdest - buf; |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
916 attr_alpha->end_index = pdest - buf + outlen; |
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
917 pango_attr_list_insert(attr_list, attr_alpha); |
9630
0c098fb3994c
commit https://github.com/vim/vim/commit/870b749ce1db1cec80f0f3766064a031688e6a46
Christian Brabandt <cb@256bit.org>
parents:
9624
diff
changeset
|
918 # endif |
9624
d63b85fe3dc7
commit https://github.com/vim/vim/commit/36edf0685c8b55ee3ce709058d83ada8027fec1e
Christian Brabandt <cb@256bit.org>
parents:
9217
diff
changeset
|
919 #endif |
7 | 920 } |
921 pdest += outlen; | |
922 p += charlen; | |
923 } | |
924 else | |
925 { | |
926 do | |
927 *pdest++ = *p++; | |
928 while (--charlen != 0); | |
929 } | |
930 } | |
931 } | |
932 *pdest = NUL; | |
933 } | |
934 | |
935 vim_free(convbuf); | |
936 | |
937 gtk_label_set_text(label, (const char *)buf); | |
938 vim_free(buf); | |
939 | |
940 gtk_label_set_attributes(label, attr_list); | |
941 pango_attr_list_unref(attr_list); | |
942 } | |
2275
e4d849f4df03
Remove the old and not well supported GTK 1 code. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2251
diff
changeset
|
943 # undef IS_NONPRINTABLE |
7 | 944 |
945 /* | |
946 * Draw a balloon. | |
947 */ | |
948 static void | |
949 drawBalloon(BalloonEval *beval) | |
950 { | |
951 if (beval->msg != NULL) | |
952 { | |
953 GtkRequisition requisition; | |
954 int screen_w; | |
955 int screen_h; | |
956 int x; | |
957 int y; | |
958 int x_offset = EVAL_OFFSET_X; | |
959 int y_offset = EVAL_OFFSET_Y; | |
960 PangoLayout *layout; | |
10390
6c8a4d21b873
commit https://github.com/vim/vim/commit/a859f04b4db651860c07db3587f29906517c552b
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
961 |
12409
2c020bc30f62
patch 8.0.1084: GTK build has compiler warnings
Christian Brabandt <cb@256bit.org>
parents:
11474
diff
changeset
|
962 # if !GTK_CHECK_VERSION(3,22,2) |
7 | 963 GdkScreen *screen; |
964 | |
965 screen = gtk_widget_get_screen(beval->target); | |
966 gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen); | |
967 # endif | |
12409
2c020bc30f62
patch 8.0.1084: GTK build has compiler warnings
Christian Brabandt <cb@256bit.org>
parents:
11474
diff
changeset
|
968 gui_gtk_get_screen_size_of_win(beval->balloonShell, |
2c020bc30f62
patch 8.0.1084: GTK build has compiler warnings
Christian Brabandt <cb@256bit.org>
parents:
11474
diff
changeset
|
969 &screen_w, &screen_h); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
970 # if !GTK_CHECK_VERSION(3,0,0) |
7 | 971 gtk_widget_ensure_style(beval->balloonShell); |
972 gtk_widget_ensure_style(beval->balloonLabel); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
973 # endif |
7 | 974 |
975 set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg); | |
976 /* | |
977 * Dirty trick: Enable wrapping mode on the label's layout behind its | |
978 * back. This way GtkLabel won't try to constrain the wrap width to a | |
979 * builtin maximum value of about 65 Latin characters. | |
980 */ | |
981 layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel)); | |
2275
e4d849f4df03
Remove the old and not well supported GTK 1 code. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2251
diff
changeset
|
982 # ifdef PANGO_WRAP_WORD_CHAR |
7 | 983 pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR); |
2275
e4d849f4df03
Remove the old and not well supported GTK 1 code. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2251
diff
changeset
|
984 # else |
7 | 985 pango_layout_set_wrap(layout, PANGO_WRAP_WORD); |
2275
e4d849f4df03
Remove the old and not well supported GTK 1 code. (James Vega)
Bram Moolenaar <bram@vim.org>
parents:
2251
diff
changeset
|
986 # endif |
7 | 987 pango_layout_set_width(layout, |
988 /* try to come up with some reasonable width */ | |
989 PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width, | |
990 screen_w / 2, | |
991 MAX(20, screen_w - 20))); | |
992 | |
993 /* Calculate the balloon's width and height. */ | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
994 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
995 gtk_widget_get_preferred_size(beval->balloonShell, &requisition, NULL); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
996 # else |
7 | 997 gtk_widget_size_request(beval->balloonShell, &requisition); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
998 # endif |
7 | 999 |
1000 /* Compute position of the balloon area */ | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1001 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1002 gdk_window_get_origin(gtk_widget_get_window(beval->target), &x, &y); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1003 # else |
7 | 1004 gdk_window_get_origin(beval->target->window, &x, &y); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1005 # endif |
7 | 1006 x += beval->x; |
1007 y += beval->y; | |
1008 | |
1009 /* Get out of the way of the mouse pointer */ | |
1010 if (x + x_offset + requisition.width > screen_w) | |
1011 y_offset += 15; | |
1012 if (y + y_offset + requisition.height > screen_h) | |
1013 y_offset = -requisition.height - EVAL_OFFSET_Y; | |
1014 | |
1015 /* Sanitize values */ | |
1016 x = CLAMP(x + x_offset, 0, MAX(0, screen_w - requisition.width)); | |
1017 y = CLAMP(y + y_offset, 0, MAX(0, screen_h - requisition.height)); | |
1018 | |
1019 /* Show the balloon */ | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1020 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1021 gtk_window_move(GTK_WINDOW(beval->balloonShell), x, y); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1022 # else |
7 | 1023 gtk_widget_set_uposition(beval->balloonShell, x, y); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1024 # endif |
7 | 1025 gtk_widget_show(beval->balloonShell); |
1026 | |
1027 beval->showState = ShS_SHOWING; | |
1028 } | |
1029 } | |
1030 | |
1031 /* | |
1032 * Undraw a balloon. | |
1033 */ | |
1034 static void | |
1035 undrawBalloon(BalloonEval *beval) | |
1036 { | |
1037 if (beval->balloonShell != NULL) | |
1038 gtk_widget_hide(beval->balloonShell); | |
1039 beval->showState = ShS_NEUTRAL; | |
1040 } | |
1041 | |
1042 static void | |
1043 cancelBalloon(BalloonEval *beval) | |
1044 { | |
1045 if (beval->showState == ShS_SHOWING | |
1046 || beval->showState == ShS_UPDATE_PENDING) | |
1047 undrawBalloon(beval); | |
1048 | |
1049 if (beval->timerID != 0) | |
1050 { | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1051 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1052 g_source_remove(beval->timerID); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1053 # else |
7 | 1054 gtk_timeout_remove(beval->timerID); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1055 # endif |
7 | 1056 beval->timerID = 0; |
1057 } | |
1058 beval->showState = ShS_NEUTRAL; | |
1059 } | |
1060 | |
1061 static void | |
1062 createBalloonEvalWindow(BalloonEval *beval) | |
1063 { | |
1064 beval->balloonShell = gtk_window_new(GTK_WINDOW_POPUP); | |
1065 | |
1066 gtk_widget_set_app_paintable(beval->balloonShell, TRUE); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1067 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1068 gtk_window_set_resizable(GTK_WINDOW(beval->balloonShell), FALSE); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1069 # else |
7 | 1070 gtk_window_set_policy(GTK_WINDOW(beval->balloonShell), FALSE, FALSE, TRUE); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1071 # endif |
7 | 1072 gtk_widget_set_name(beval->balloonShell, "gtk-tooltips"); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1073 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1074 gtk_container_set_border_width(GTK_CONTAINER(beval->balloonShell), 4); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1075 # else |
7 | 1076 gtk_container_border_width(GTK_CONTAINER(beval->balloonShell), 4); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1077 # endif |
7 | 1078 |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1079 # if GTK_CHECK_VERSION(3,0,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1080 g_signal_connect(G_OBJECT(beval->balloonShell), "draw", |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1081 G_CALLBACK(balloon_draw_event_cb), NULL); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1082 # else |
7 | 1083 gtk_signal_connect((GtkObject*)(beval->balloonShell), "expose_event", |
1084 GTK_SIGNAL_FUNC(balloon_expose_event_cb), NULL); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1085 # endif |
7 | 1086 beval->balloonLabel = gtk_label_new(NULL); |
1087 | |
1088 gtk_label_set_line_wrap(GTK_LABEL(beval->balloonLabel), FALSE); | |
1089 gtk_label_set_justify(GTK_LABEL(beval->balloonLabel), GTK_JUSTIFY_LEFT); | |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1090 # if GTK_CHECK_VERSION(3,16,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1091 gtk_label_set_xalign(GTK_LABEL(beval->balloonLabel), 0.5); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1092 gtk_label_set_yalign(GTK_LABEL(beval->balloonLabel), 0.5); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1093 # elif GTK_CHECK_VERSION(3,14,0) |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1094 GValue align_val = G_VALUE_INIT; |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1095 g_value_init(&align_val, G_TYPE_FLOAT); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1096 g_value_set_float(&align_val, 0.5); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1097 g_object_set_property(G_OBJECT(beval->balloonLabel), "xalign", &align_val); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1098 g_object_set_property(G_OBJECT(beval->balloonLabel), "yalign", &align_val); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1099 g_value_unset(&align_val); |
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1100 # else |
7 | 1101 gtk_misc_set_alignment(GTK_MISC(beval->balloonLabel), 0.5f, 0.5f); |
8218
3456e2ebebd4
commit https://github.com/vim/vim/commit/9892189d2e7ab94b750f99e6da4cbfc3c8014517
Christian Brabandt <cb@256bit.org>
parents:
7821
diff
changeset
|
1102 # endif |
7 | 1103 gtk_widget_set_name(beval->balloonLabel, "vim-balloon-label"); |
1104 gtk_widget_show(beval->balloonLabel); | |
1105 | |
1106 gtk_container_add(GTK_CONTAINER(beval->balloonShell), beval->balloonLabel); | |
1107 } | |
1108 | |
1109 #else /* !FEAT_GUI_GTK */ | |
1110 | |
1111 /* | |
1112 * Draw a balloon. | |
1113 */ | |
1114 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
1115 drawBalloon(BalloonEval *beval) |
7 | 1116 { |
1117 Dimension w; | |
1118 Dimension h; | |
1119 Position tx; | |
1120 Position ty; | |
1121 | |
1122 if (beval->msg != NULL) | |
1123 { | |
1124 /* Show the Balloon */ | |
1125 | |
1126 /* Calculate the label's width and height */ | |
1127 #ifdef FEAT_GUI_MOTIF | |
1128 XmString s; | |
1129 | |
1130 /* For the callback function we parse NL characters to create a | |
1131 * multi-line label. This doesn't work for all languages, but | |
1132 * XmStringCreateLocalized() doesn't do multi-line labels... */ | |
1133 if (beval->msgCB != NULL) | |
1134 s = XmStringCreateLtoR((char *)beval->msg, XmFONTLIST_DEFAULT_TAG); | |
1135 else | |
1136 s = XmStringCreateLocalized((char *)beval->msg); | |
1137 { | |
1138 XmFontList fl; | |
1139 | |
1140 fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); | |
6003 | 1141 if (fl == NULL) |
7 | 1142 { |
6003 | 1143 XmStringFree(s); |
1144 return; | |
7 | 1145 } |
6003 | 1146 XmStringExtent(fl, s, &w, &h); |
1147 XmFontListFree(fl); | |
7 | 1148 } |
1149 w += gui.border_offset << 1; | |
1150 h += gui.border_offset << 1; | |
1151 XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL); | |
1152 XmStringFree(s); | |
1153 #else /* Athena */ | |
1154 /* Assume XtNinternational == True */ | |
1155 XFontSet fset; | |
1156 XFontSetExtents *ext; | |
1157 | |
1158 XtVaGetValues(beval->balloonLabel, XtNfontSet, &fset, NULL); | |
1159 ext = XExtentsOfFontSet(fset); | |
1160 h = ext->max_ink_extent.height; | |
1161 w = XmbTextEscapement(fset, | |
1162 (char *)beval->msg, | |
1163 (int)STRLEN(beval->msg)); | |
1164 w += gui.border_offset << 1; | |
1165 h += gui.border_offset << 1; | |
1166 XtVaSetValues(beval->balloonLabel, XtNlabel, beval->msg, NULL); | |
1167 #endif | |
1168 | |
1169 /* Compute position of the balloon area */ | |
1170 tx = beval->x_root + EVAL_OFFSET_X; | |
1171 ty = beval->y_root + EVAL_OFFSET_Y; | |
1172 if ((tx + w) > beval->screen_width) | |
1173 tx = beval->screen_width - w; | |
1174 if ((ty + h) > beval->screen_height) | |
1175 ty = beval->screen_height - h; | |
1176 #ifdef FEAT_GUI_MOTIF | |
1177 XtVaSetValues(beval->balloonShell, | |
1178 XmNx, tx, | |
1179 XmNy, ty, | |
1180 NULL); | |
1181 #else | |
1182 /* Athena */ | |
1183 XtVaSetValues(beval->balloonShell, | |
1184 XtNx, tx, | |
1185 XtNy, ty, | |
1186 NULL); | |
1187 #endif | |
1844 | 1188 /* Set tooltip colors */ |
1189 { | |
1190 Arg args[2]; | |
1191 | |
1192 #ifdef FEAT_GUI_MOTIF | |
1193 args[0].name = XmNbackground; | |
1194 args[0].value = gui.tooltip_bg_pixel; | |
1195 args[1].name = XmNforeground; | |
1196 args[1].value = gui.tooltip_fg_pixel; | |
1197 #else /* Athena */ | |
1198 args[0].name = XtNbackground; | |
1199 args[0].value = gui.tooltip_bg_pixel; | |
1200 args[1].name = XtNforeground; | |
1201 args[1].value = gui.tooltip_fg_pixel; | |
1202 #endif | |
1203 XtSetValues(beval->balloonLabel, &args[0], XtNumber(args)); | |
1204 } | |
7 | 1205 |
1206 XtPopup(beval->balloonShell, XtGrabNone); | |
1207 | |
1208 beval->showState = ShS_SHOWING; | |
1209 | |
1210 current_beval = beval; | |
1211 } | |
1212 } | |
1213 | |
1214 /* | |
1215 * Undraw a balloon. | |
1216 */ | |
1217 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
1218 undrawBalloon(BalloonEval *beval) |
7 | 1219 { |
1220 if (beval->balloonShell != (Widget)0) | |
1221 XtPopdown(beval->balloonShell); | |
1222 beval->showState = ShS_NEUTRAL; | |
1223 | |
1224 current_beval = NULL; | |
1225 } | |
1226 | |
1227 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
1228 cancelBalloon(BalloonEval *beval) |
7 | 1229 { |
1230 if (beval->showState == ShS_SHOWING | |
1231 || beval->showState == ShS_UPDATE_PENDING) | |
1232 undrawBalloon(beval); | |
1233 | |
1234 if (beval->timerID != (XtIntervalId)NULL) | |
1235 { | |
1236 XtRemoveTimeOut(beval->timerID); | |
1237 beval->timerID = (XtIntervalId)NULL; | |
1238 } | |
1239 beval->showState = ShS_NEUTRAL; | |
1240 } | |
1241 | |
1242 | |
1243 static void | |
7821
81794242a275
commit https://github.com/vim/vim/commit/66f948e928d5e0cd3123af902aa8ac1613534c94
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
1244 createBalloonEvalWindow(BalloonEval *beval) |
7 | 1245 { |
1246 Arg args[12]; | |
1247 int n; | |
1248 | |
1249 n = 0; | |
1250 #ifdef FEAT_GUI_MOTIF | |
1251 XtSetArg(args[n], XmNallowShellResize, True); n++; | |
1252 beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval", | |
1253 overrideShellWidgetClass, gui.dpy, args, n); | |
1254 #else | |
1255 /* Athena */ | |
1256 XtSetArg(args[n], XtNallowShellResize, True); n++; | |
1257 beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval", | |
1258 overrideShellWidgetClass, gui.dpy, args, n); | |
1259 #endif | |
1260 | |
1261 n = 0; | |
1262 #ifdef FEAT_GUI_MOTIF | |
1263 { | |
1264 XmFontList fl; | |
1265 | |
1266 fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset); | |
1267 XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++; | |
1268 XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++; | |
1269 XtSetArg(args[n], XmNfontList, fl); n++; | |
1270 XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++; | |
1271 beval->balloonLabel = XtCreateManagedWidget("balloonLabel", | |
1272 xmLabelWidgetClass, beval->balloonShell, args, n); | |
1273 } | |
1274 #else /* FEAT_GUI_ATHENA */ | |
1275 XtSetArg(args[n], XtNforeground, gui.tooltip_fg_pixel); n++; | |
1276 XtSetArg(args[n], XtNbackground, gui.tooltip_bg_pixel); n++; | |
1277 XtSetArg(args[n], XtNinternational, True); n++; | |
1278 XtSetArg(args[n], XtNfontSet, gui.tooltip_fontset); n++; | |
1279 beval->balloonLabel = XtCreateManagedWidget("balloonLabel", | |
1280 labelWidgetClass, beval->balloonShell, args, n); | |
1281 #endif | |
1282 } | |
1283 | |
1284 #endif /* !FEAT_GUI_GTK */ | |
1285 #endif /* !FEAT_GUI_W32 */ | |
1286 | |
12871
1a450ce6980c
patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
1287 #endif /* FEAT_BEVAL_GUI */ |