xref: /vim-8.2.3635/src/gui.h (revision ea2d8d25)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved		by Bram Moolenaar
4  *				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  */
9 
10 #ifdef FEAT_GUI_MOTIF
11 # include <Xm/Xm.h>
12 #endif
13 
14 #ifdef FEAT_GUI_ATHENA
15 # include <X11/Intrinsic.h>
16 # include <X11/StringDefs.h>
17 #endif
18 
19 #ifdef FEAT_GUI_GTK
20 # ifdef VMS // undef MIN and MAX because Intrinsic.h redefines them anyway
21 #  ifdef MAX
22 #   undef MAX
23 #  endif
24 #  ifdef MIN
25 #   undef MIN
26 #  endif
27 # endif
28 # include <X11/Intrinsic.h>
29 # include <gtk/gtk.h>
30 #endif
31 
32 #ifdef FEAT_GUI_HAIKU
33 # include "gui_haiku.h"
34 #endif
35 
36 // Needed when generating prototypes, since FEAT_GUI is always defined then.
37 #if defined(FEAT_XCLIPBOARD) && !defined(FEAT_GUI_MOTIF) \
38 	&& !defined(FEAT_GUI_ATHENA) && !defined(FEAT_GUI_GTK)
39 # include <X11/Intrinsic.h>
40 #endif
41 
42 #ifdef FEAT_GUI_MAC
43 # include <Types.h>
44 /*# include <Memory.h>*/
45 # include <Quickdraw.h>
46 # include <Fonts.h>
47 # include <Events.h>
48 # include <Menus.h>
49 # if !(defined (TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON))
50 #  include <Windows.h>
51 # endif
52 # include <Controls.h>
53 /*# include <TextEdit.h>*/
54 # include <Dialogs.h>
55 # include <OSUtils.h>
56 /*
57 # include <ToolUtils.h>
58 # include <SegLoad.h>*/
59 #endif
60 
61 #ifdef FEAT_GUI_PHOTON
62 # include <Ph.h>
63 # include <Pt.h>
64 # include "photon/PxProto.h"
65 #endif
66 
67 /*
68  * On some systems scrolling needs to be done right away instead of in the
69  * main loop.
70  */
71 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK)
72 # define USE_ON_FLY_SCROLL
73 #endif
74 
75 /*
76  * GUIs that support dropping files on a running Vim.
77  */
78 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
79 	|| defined(FEAT_GUI_MSWIN) \
80 	|| defined(FEAT_GUI_MAC) \
81 	|| defined(FEAT_GUI_HAIKU)
82 # define HAVE_DROP_FILE
83 #endif
84 
85 /*
86  * This define makes menus always use a fontset.
87  * We're not sure if this code always works, thus it can be disabled.
88  */
89 #ifdef FEAT_XFONTSET
90 # define FONTSET_ALWAYS
91 #endif
92 
93 /*
94  * These macros convert between character row/column and pixel coordinates.
95  * TEXT_X   - Convert character column into X pixel coord for drawing strings.
96  * TEXT_Y   - Convert character row into Y pixel coord for drawing strings.
97  * FILL_X   - Convert character column into X pixel coord for filling the area
98  *		under the character.
99  * FILL_Y   - Convert character row into Y pixel coord for filling the area
100  *		under the character.
101  * X_2_COL  - Convert X pixel coord into character column.
102  * Y_2_ROW  - Convert Y pixel coord into character row.
103  */
104 #ifdef FEAT_GUI_MSWIN
105 # define TEXT_X(col)	((col) * gui.char_width)
106 # define TEXT_Y(row)	((row) * gui.char_height + gui.char_ascent)
107 # define FILL_X(col)	((col) * gui.char_width)
108 # define FILL_Y(row)	((row) * gui.char_height)
109 # define X_2_COL(x)	((x) / gui.char_width)
110 # define Y_2_ROW(y)	((y) / gui.char_height)
111 #else
112 # define TEXT_X(col)	((col) * gui.char_width  + gui.border_offset)
113 # define FILL_X(col)	((col) * gui.char_width  + gui.border_offset)
114 # define X_2_COL(x)	(((x) - gui.border_offset) / gui.char_width)
115 # define TEXT_Y(row)	((row) * gui.char_height + gui.char_ascent \
116 							+ gui.border_offset)
117 # define FILL_Y(row)	((row) * gui.char_height + gui.border_offset)
118 # define Y_2_ROW(y)	(((y) - gui.border_offset) / gui.char_height)
119 #endif
120 
121 // Indices for arrays of scrollbars
122 #define SBAR_NONE	    -1
123 #define SBAR_LEFT	    0
124 #define SBAR_RIGHT	    1
125 #define SBAR_BOTTOM	    2
126 
127 // Orientations for scrollbars
128 #define SBAR_VERT	    0
129 #define SBAR_HORIZ	    1
130 
131 // Default size of scrollbar
132 #define SB_DEFAULT_WIDTH    16
133 
134 // Default height of the menu bar
135 #define MENU_DEFAULT_HEIGHT 1		// figure it out at runtime
136 
137 // Flags for gui_mch_outstr_nowrap()
138 #define GUI_MON_WRAP_CURSOR	0x01	// wrap cursor at end of line
139 #define GUI_MON_INVERT		0x02	// invert the characters
140 #define GUI_MON_IS_CURSOR	0x04	// drawing cursor
141 #define GUI_MON_TRS_CURSOR	0x08	// drawing transparent cursor
142 #define GUI_MON_NOCLEAR		0x10	// don't clear selection
143 
144 // Flags for gui_mch_draw_string()
145 #define DRAW_TRANSP		0x01	// draw with transparent bg
146 #define DRAW_BOLD		0x02	// draw bold text
147 #define DRAW_UNDERL		0x04	// draw underline text
148 #define DRAW_UNDERC		0x08	// draw undercurl text
149 #if defined(FEAT_GUI_GTK)
150 # define DRAW_ITALIC		0x10	// draw italic text
151 #endif
152 #define DRAW_CURSOR		0x20	// drawing block cursor (win32)
153 #define DRAW_STRIKE		0x40	// strikethrough
154 
155 // For our own tearoff menu item
156 #define TEAR_STRING		"-->Detach"
157 #define TEAR_LEN		(9)	// length of above string
158 
159 // for the toolbar
160 #define TOOLBAR_BUTTON_HEIGHT	18
161 #define TOOLBAR_BUTTON_WIDTH	18
162 #define TOOLBAR_BORDER_HEIGHT	12  // room above+below buttons for MSWindows
163 
164 #ifdef FEAT_GUI_MSWIN
165 # define TABLINE_HEIGHT 22
166 #endif
167 #ifdef FEAT_GUI_MOTIF
168 # define TABLINE_HEIGHT 30
169 #endif
170 
171 #if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
172 # define NO_CONSOLE_INPUT	// use no_console_input() to check if there
173 				// is no console input possible
174 #endif
175 
176 typedef struct GuiScrollbar
177 {
178     long	ident;		// Unique identifier for each scrollbar
179     win_T	*wp;		// Scrollbar's window, NULL for bottom
180     int		type;		// one of SBAR_{LEFT,RIGHT,BOTTOM}
181     long	value;		// Represents top line number visible
182 #ifdef FEAT_GUI_ATHENA
183     int		pixval;		// pixel count of value
184 #endif
185     long	size;		// Size of scrollbar thumb
186     long	max;		// Number of lines in buffer
187 
188     // Values measured in characters:
189     int		top;		// Top of scroll bar (chars from row 0)
190     int		height;		// Current height of scroll bar in rows
191     int		width;		// Current width of scroll bar in cols
192     int		status_height;	// Height of status line
193 #ifdef FEAT_GUI_X11
194     Widget	id;		// Id of real scroll bar
195 #endif
196 #ifdef FEAT_GUI_GTK
197     GtkWidget *id;		// Id of real scroll bar
198     unsigned long handler_id;   // Id of "value_changed" signal handler
199 #endif
200 
201 #ifdef FEAT_GUI_MSWIN
202     HWND	id;		// Id of real scroll bar
203     int		scroll_shift;	// The scrollbar stuff can handle only up to
204 				// 32767 lines.  When the file is longer,
205 				// scroll_shift is set to the number of shifts
206 				// to reduce the count.
207 #endif
208 
209 #if FEAT_GUI_HAIKU
210     VimScrollBar *id;		// Pointer to real scroll bar
211 #endif
212 #ifdef FEAT_GUI_MAC
213     ControlHandle id;		// A handle to the scrollbar
214 #endif
215 #ifdef FEAT_GUI_PHOTON
216     PtWidget_t	*id;
217 #endif
218 } scrollbar_T;
219 
220 typedef long	    guicolor_T;	// handle for a GUI color; for X11 this should
221 				// be "Pixel", but that's an unsigned and we
222 				// need a signed value
223 #define INVALCOLOR (guicolor_T)-11111	// number for invalid color; on 32 bit
224 				   // displays there is a tiny chance this is an
225 				   // actual color
226 #define CTERMCOLOR (guicolor_T)-11110	// only used for cterm.bg_rgb and
227 					// cterm.fg_rgb: use cterm color
228 
229 #ifdef FEAT_GUI_GTK
230   typedef PangoFontDescription	*GuiFont;       // handle for a GUI font
231   typedef PangoFontDescription  *GuiFontset;    // handle for a GUI fontset
232 # define NOFONT		(GuiFont)NULL
233 # define NOFONTSET	(GuiFontset)NULL
234 #else
235 # ifdef FEAT_GUI_PHOTON
236   typedef char		*GuiFont;
237   typedef char		*GuiFontset;
238 #  define NOFONT	(GuiFont)NULL
239 #  define NOFONTSET	(GuiFontset)NULL
240 # else
241 #  ifdef FEAT_GUI_X11
242   typedef XFontStruct	*GuiFont;	// handle for a GUI font
243   typedef XFontSet	GuiFontset;	// handle for a GUI fontset
244 #   define NOFONT	(GuiFont)0
245 #   define NOFONTSET	(GuiFontset)0
246 #  else
247   typedef long_u	GuiFont;	// handle for a GUI font
248   typedef long_u	GuiFontset;	// handle for a GUI fontset
249 #   define NOFONT	(GuiFont)0
250 #   define NOFONTSET	(GuiFontset)0
251 #  endif
252 # endif
253 #endif
254 
255 #ifdef VIMDLL
256 // Use spawn when GUI is starting.
257 # define GUI_MAY_SPAWN
258 
259 // Uncomment the next definition if you want to use the `:gui` command on
260 // Windows.  It uses `:mksession` to inherit the session from vim.exe to
261 // gvim.exe.  So, it doesn't work perfectly. (EXPERIMENTAL)
262 //# define EXPERIMENTAL_GUI_CMD
263 #endif
264 
265 typedef struct Gui
266 {
267     int		in_focus;	    // Vim has input focus
268     int		in_use;		    // Is the GUI being used?
269     int		starting;	    // GUI will start in a little while
270     int		shell_created;	    // Has the shell been created yet?
271     int		dying;		    // Is vim dying? Then output to terminal
272     int		dofork;		    // Use fork() when GUI is starting
273 #ifdef GUI_MAY_SPAWN
274     int		dospawn;	    // Use spawn() when GUI is starting
275 #endif
276     int		dragged_sb;	    // Which scrollbar being dragged, if any?
277     win_T	*dragged_wp;	    // Which WIN's sb being dragged, if any?
278     int		pointer_hidden;	    // Is the mouse pointer hidden?
279     int		col;		    // Current cursor column in GUI display
280     int		row;		    // Current cursor row in GUI display
281     int		cursor_col;	    // Physical cursor column in GUI display
282     int		cursor_row;	    // Physical cursor row in GUI display
283     char	cursor_is_valid;    // There is a cursor at cursor_row/col
284     int		num_cols;	    // Number of columns
285     int		num_rows;	    // Number of rows
286     int		scroll_region_top;  // Top (first) line of scroll region
287     int		scroll_region_bot;  // Bottom (last) line of scroll region
288     int		scroll_region_left;  // Left (first) column of scroll region
289     int		scroll_region_right;  // Right (last) col. of scroll region
290     int		highlight_mask;	    // Highlight attribute mask
291     int		scrollbar_width;    // Width of vertical scrollbars
292     int		scrollbar_height;   // Height of horizontal scrollbar
293     int		left_sbar_x;	    // Calculated x coord for left scrollbar
294     int		right_sbar_x;	    // Calculated x coord for right scrollbar
295 
296 #ifdef FEAT_MENU
297 # ifndef FEAT_GUI_GTK
298     int		menu_height;	    // Height of the menu bar
299     int		menu_width;	    // Width of the menu bar
300 # endif
301     char	menu_is_active;	    // TRUE if menu is present
302 # ifdef FEAT_GUI_ATHENA
303     char	menu_height_fixed;  // TRUE if menu height fixed
304 # endif
305 #endif
306 
307     scrollbar_T bottom_sbar;	    // Bottom scrollbar
308     int		which_scrollbars[3];// Which scrollbar boxes are active?
309     int		prev_wrap;	    // For updating the horizontal scrollbar
310     int		char_width;	    // Width of char cell in pixels
311     int		char_height;	    // Height of char cell in pixels, includes
312 				    // 'linespace'
313     int		char_ascent;	    // Ascent of char in pixels
314     int		border_width;	    // Width of our border around text area
315     int		border_offset;	    // Total pixel offset for all borders
316 
317     GuiFont	norm_font;	    // Normal font
318 #ifndef FEAT_GUI_GTK
319     GuiFont	bold_font;	    // Bold font
320     GuiFont	ital_font;	    // Italic font
321     GuiFont	boldital_font;	    // Bold-Italic font
322 #else
323     int		font_can_bold;	    // Whether norm_font supports bold weight.
324 				    // The styled font variants are not used.
325 #endif
326 
327 #if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK)
328 # ifdef FONTSET_ALWAYS
329     GuiFontset	menu_fontset;	    // set of fonts for multi-byte chars
330 # else
331     GuiFont	menu_font;	    // menu item font
332 # endif
333 #endif
334     GuiFont	wide_font;	    // Normal 'guifontwide' font
335 #ifndef FEAT_GUI_GTK
336     GuiFont	wide_bold_font;	    // Bold 'guifontwide' font
337     GuiFont	wide_ital_font;	    // Italic 'guifontwide' font
338     GuiFont	wide_boldital_font; // Bold-Italic 'guifontwide' font
339 #endif
340 #ifdef FEAT_XFONTSET
341     GuiFontset	fontset;	    // set of fonts for multi-byte chars
342 #endif
343     guicolor_T	back_pixel;	    // Color of background
344     guicolor_T	norm_pixel;	    // Color of normal text
345     guicolor_T	def_back_pixel;	    // default Color of background
346     guicolor_T	def_norm_pixel;	    // default Color of normal text
347 
348 #ifdef FEAT_GUI_X11
349     char	*rsrc_menu_fg_name;	// Color of menu & dialog foreground
350     guicolor_T	menu_fg_pixel;		// Same in Pixel format
351     char	*rsrc_menu_bg_name;	// Color of menu & dialog background
352     guicolor_T	menu_bg_pixel;		// Same in Pixel format
353     char	*rsrc_scroll_fg_name;	// Color of scrollbar foreground
354     guicolor_T	scroll_fg_pixel;	// Same in Pixel format
355     char	*rsrc_scroll_bg_name;	// Color of scrollbar background
356     guicolor_T	scroll_bg_pixel;	// Same in Pixel format
357 
358 # ifdef FEAT_GUI_MOTIF
359     guicolor_T	menu_def_fg_pixel;  // Default menu foreground
360     guicolor_T	menu_def_bg_pixel;  // Default menu background
361     guicolor_T	scroll_def_fg_pixel;  // Default scrollbar foreground
362     guicolor_T	scroll_def_bg_pixel;  // Default scrollbar background
363 # endif
364     Display	*dpy;		    // X display
365     Window	wid;		    // Window id of text area
366     int		visibility;	    // Is shell partially/fully obscured?
367     GC		text_gc;
368     GC		back_gc;
369     GC		invert_gc;
370     Cursor	blank_pointer;	    // Blank pointer
371 
372     // X Resources
373     char_u	*rsrc_font_name;    // Resource font name, used if 'guifont'
374 				    // not set
375     char_u	*rsrc_bold_font_name; // Resource bold font name
376     char_u	*rsrc_ital_font_name; // Resource italic font name
377     char_u	*rsrc_boldital_font_name;  // Resource bold-italic font name
378     char_u	*rsrc_menu_font_name;    // Resource menu Font name
379     Bool	rsrc_rev_video;	    // Use reverse video?
380 
381     char_u	*geom;		    // Geometry, eg "80x24"
382     Bool	color_approx;	    // Some color was approximated
383 #endif
384 
385 #ifdef FEAT_GUI_GTK
386 # ifndef USE_GTK3
387     int		visibility;	    // Is shell partially/fully obscured?
388 # endif
389     GdkCursor	*blank_pointer;	    // Blank pointer
390 
391     // X Resources
392     char_u	*geom;		    // Geometry, eg "80x24"
393 
394     GtkWidget	*mainwin;	    // top level GTK window
395     GtkWidget	*formwin;	    // manages all the windows below
396     GtkWidget	*drawarea;	    // the "text" area
397 # ifdef FEAT_MENU
398     GtkWidget	*menubar;	    // menubar
399 # endif
400 # ifdef FEAT_TOOLBAR
401     GtkWidget	*toolbar;	    // toolbar
402 # endif
403 # ifdef FEAT_GUI_GNOME
404     GtkWidget	*menubar_h;	    // menubar handle
405     GtkWidget	*toolbar_h;	    // toolbar handle
406 # endif
407 # ifdef USE_GTK3
408     GdkRGBA	*fgcolor;	    // GDK-styled foreground color
409     GdkRGBA	*bgcolor;	    // GDK-styled background color
410     GdkRGBA	*spcolor;	    // GDK-styled special color
411 # else
412     GdkColor	*fgcolor;	    // GDK-styled foreground color
413     GdkColor	*bgcolor;	    // GDK-styled background color
414     GdkColor	*spcolor;	    // GDK-styled special color
415 # endif
416 # ifdef USE_GTK3
417     cairo_surface_t *surface;       // drawarea surface
418     gboolean	     by_signal;     // cause of draw operation
419 # else
420     GdkGC	*text_gc;	    // cached GC for normal text
421 # endif
422     PangoContext     *text_context; // the context used for all text
423     PangoFont	     *ascii_font;   // cached font for ASCII strings
424     PangoGlyphString *ascii_glyphs; // cached code point -> glyph map
425 # ifdef FEAT_GUI_TABLINE
426     GtkWidget	*tabline;	    // tab pages line handle
427 # endif
428 
429     GtkAccelGroup *accel_group;
430     GtkWidget	*filedlg;	    // file selection dialog
431     char_u	*browse_fname;	    // file name from filedlg
432 
433     guint32	event_time;
434 #endif	// FEAT_GUI_GTK
435 
436 #if defined(FEAT_GUI_TABLINE) \
437 	&& (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
438 		|| defined(FEAT_GUI_MAC) || defined(FEAT_GUI_HAIKU))
439     int		tabline_height;
440 #endif
441 
442 #ifdef FEAT_FOOTER
443     int		footer_height;	    // height of the message footer
444 #endif
445 
446 #if defined(FEAT_TOOLBAR) \
447 	&& (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU))
448     int		toolbar_height;	    // height of the toolbar
449 #endif
450 
451 #ifdef FEAT_BEVAL_TIP
452     // Tooltip properties; also used for balloon evaluation
453     char_u	*rsrc_tooltip_font_name; // tooltip font name
454     char	*rsrc_tooltip_fg_name;	// tooltip foreground color name
455     char	*rsrc_tooltip_bg_name;	// tooltip background color name
456     guicolor_T	tooltip_fg_pixel;	// tooltip foreground color
457     guicolor_T	tooltip_bg_pixel;	// tooltip background color
458     XFontSet	tooltip_fontset;	// tooltip fontset
459 #endif
460 
461 #ifdef FEAT_GUI_MSWIN
462     GuiFont	currFont;	    // Current font
463     guicolor_T	currFgColor;	    // Current foreground text color
464     guicolor_T	currBgColor;	    // Current background text color
465     guicolor_T	currSpColor;	    // Current special text color
466 #endif
467 
468 #ifdef FEAT_GUI_HAIKU
469     VimApp     *vimApp;
470     VimWindow  *vimWindow;
471     VimFormView *vimForm;
472     VimTextAreaView *vimTextArea;
473     int	vdcmp;			    // Vim Direct Communication Message Port
474 #endif
475 
476 #ifdef FEAT_GUI_MAC
477     WindowPtr	VimWindow;
478     MenuHandle	MacOSHelpMenu;	    // Help menu provided by the MacOS
479     int		MacOSHelpItems;	    // Nr of help-items supplied by MacOS
480     WindowPtr	wid;		    // Window id of text area
481     int		visibility;	    // Is window partially/fully obscured?
482 #endif
483 
484 #ifdef FEAT_GUI_PHOTON
485     PtWidget_t	*vimWindow;		// PtWindow
486     PtWidget_t	*vimTextArea;		// PtRaw
487     PtWidget_t	*vimContainer;		// PtPanel
488 # if defined(FEAT_MENU) || defined(FEAT_TOOLBAR)
489     PtWidget_t	*vimToolBarGroup;
490 # endif
491 # ifdef FEAT_MENU
492     PtWidget_t	*vimMenuBar;
493 # endif
494 # ifdef FEAT_TOOLBAR
495     PtWidget_t	*vimToolBar;
496     int		toolbar_height;
497 # endif
498     PhEvent_t	*event_buffer;
499 #endif
500 
501 #ifdef FEAT_XIM
502     char	*rsrc_input_method;
503     char	*rsrc_preedit_type_name;
504 #endif
505 } gui_T;
506 
507 extern gui_T gui;			// this is defined in gui.c
508 
509 // definitions of available window positionings for gui_*_position_in_parent()
510 typedef enum
511 {
512     VW_POS_MOUSE,
513     VW_POS_CENTER,
514     VW_POS_TOP_CENTER
515 } gui_win_pos_T;
516 
517 #ifdef FIND_REPLACE_DIALOG
518 /*
519  * Flags used to distinguish the different contexts in which the
520  * find/replace callback may be called.
521  */
522 # define FRD_FINDNEXT	1	// Find next in find dialog
523 # define FRD_R_FINDNEXT	2	// Find next in repl dialog
524 # define FRD_REPLACE	3	// Replace once
525 # define FRD_REPLACEALL	4	// Replace remaining matches
526 # define FRD_UNDO	5	// Undo replaced text
527 # define FRD_TYPE_MASK   7	// Mask for the callback type
528 // Flags which change the way searching is done.
529 # define FRD_WHOLE_WORD	0x08	// match whole word only
530 # define FRD_MATCH_CASE	0x10	// match case
531 #endif
532 
533 #ifdef FEAT_GUI_GTK
534 /*
535  * Convenience macros to convert from 'encoding' to 'termencoding' and
536  * vice versa.	If no conversion is necessary the passed-in pointer is
537  * returned as is, without allocating any memory.  Thus additional _FREE()
538  * macros are provided.  The _FREE() macros also set the pointer to NULL,
539  * in order to avoid bugs due to illegal memory access only happening if
540  * 'encoding' != utf-8...
541  *
542  * Defining these macros as pure expressions looks a bit tricky but
543  * avoids depending on the context of the macro expansion.  One of the
544  * rare occasions where the comma operator comes in handy :)
545  *
546  * Note: Do NOT keep the result around when handling control back to
547  * the main Vim!  The user could change 'encoding' at any time.
548  */
549 # define CONVERT_TO_UTF8(String)				\
550     ((output_conv.vc_type == CONV_NONE || (String) == NULL)	\
551 	    ? (String)						\
552 	    : string_convert(&output_conv, (String), NULL))
553 
554 # define CONVERT_TO_UTF8_FREE(String)				\
555     ((String) = ((output_conv.vc_type == CONV_NONE)		\
556 			? (char_u *)NULL			\
557 			: (vim_free(String), (char_u *)NULL)))
558 
559 # define CONVERT_FROM_UTF8(String)				\
560     ((input_conv.vc_type == CONV_NONE || (String) == NULL)	\
561 	    ? (String)						\
562 	    : string_convert(&input_conv, (String), NULL))
563 
564 # define CONVERT_FROM_UTF8_FREE(String)				\
565     ((String) = ((input_conv.vc_type == CONV_NONE)		\
566 			? (char_u *)NULL			\
567 			: (vim_free(String), (char_u *)NULL)))
568 
569 #else
570 # define CONVERT_TO_UTF8(String) (String)
571 # define CONVERT_TO_UTF8_FREE(String) ((String) = (char_u *)NULL)
572 # define CONVERT_FROM_UTF8(String) (String)
573 # define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL)
574 #endif // FEAT_GUI_GTK
575 
576 #ifdef FEAT_GUI_GTK
577 /*
578  * The second parameter of g_signal_handlers_disconnect_by_func() is supposed
579  * to be a function pointer which was passed to g_signal_connect_*() somewhere
580  * previously, and hence it must be of type GCallback, i.e., void (*)(void).
581  *
582  * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling
583  * g_signal_handlers_disconnect_matched(), and the second parameter of the
584  * former is to be passed to the sixth parameter of the latter the type of
585  * which, however, is declared as void * in the function signature.
586  *
587  * While the ISO C Standard does not require that function pointers be
588  * interconvertible to void *, widely-used compilers such as gcc and clang
589  * do such conversion implicitly and automatically on some platforms without
590  * issuing any warning.
591  *
592  * For Solaris Studio, that is not the case.  An explicit type cast is needed
593  * to suppress warnings on that particular conversion.
594  */
595 # if defined(__SUNPRO_C) && defined(USE_GTK3)
596 #  define FUNC2GENERIC(func) (void *)(func)
597 # else
598 #  define FUNC2GENERIC(func) G_CALLBACK(func)
599 # endif
600 #endif // FEAT_GUI_GTK
601 
602 #if defined(UNIX) && !defined(FEAT_GUI_MAC)
603 # define GUI_MAY_FORK
604 #endif
605