blob: c677ba1fe47e76e3f2716f72ecf8d86c5c8f2f4e [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
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
Bram Moolenaar071d4272004-06-13 20:20:40 +000010#ifdef FEAT_GUI_MOTIF
Bram Moolenaar071d4272004-06-13 20:20:40 +000011# include <Xm/Xm.h>
12#endif
13
Bram Moolenaar071d4272004-06-13 20:20:40 +000014#ifdef FEAT_GUI_GTK
Zoltan Arpadffy1c8e2332023-12-05 16:04:23 +010015# ifdef VMS
Bram Moolenaar467676d2020-12-30 13:14:45 +010016# include "gui_gtk_vms.h"
Zoltan Arpadffy1c8e2332023-12-05 16:04:23 +010017# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000018# include <X11/Intrinsic.h>
Yee Cheng Chinf7f746b2023-09-30 12:28:50 +020019# pragma GCC diagnostic push
20# pragma GCC diagnostic ignored "-Wstrict-prototypes"
Bram Moolenaar071d4272004-06-13 20:20:40 +000021# include <gtk/gtk.h>
Yee Cheng Chinf7f746b2023-09-30 12:28:50 +020022# pragma GCC diagnostic pop
Bram Moolenaar071d4272004-06-13 20:20:40 +000023#endif
24
Bram Moolenaarb3f74062020-02-26 16:16:53 +010025#ifdef FEAT_GUI_HAIKU
26# include "gui_haiku.h"
27#endif
28
Bram Moolenaarb7ed8392019-07-04 21:24:34 +020029// Needed when generating prototypes, since FEAT_GUI is always defined then.
30#if defined(FEAT_XCLIPBOARD) && !defined(FEAT_GUI_MOTIF) \
Bram Moolenaar0b962e52022-04-03 18:02:37 +010031 && !defined(FEAT_GUI_GTK)
Bram Moolenaarb7ed8392019-07-04 21:24:34 +020032# include <X11/Intrinsic.h>
33#endif
34
Bram Moolenaar071d4272004-06-13 20:20:40 +000035#ifdef FEAT_GUI_PHOTON
36# include <Ph.h>
37# include <Pt.h>
38# include "photon/PxProto.h"
39#endif
40
41/*
Bram Moolenaarb5dd4242007-05-06 12:28:24 +000042 * On some systems scrolling needs to be done right away instead of in the
43 * main loop.
44 */
Bram Moolenaar097148e2020-08-11 21:58:20 +020045#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +000046# define USE_ON_FLY_SCROLL
47#endif
48
49/*
50 * GUIs that support dropping files on a running Vim.
51 */
Bram Moolenaar92d147b2018-07-29 17:35:23 +020052#if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
53 || defined(FEAT_GUI_MSWIN) \
Bram Moolenaarb3f74062020-02-26 16:16:53 +010054 || defined(FEAT_GUI_HAIKU)
Bram Moolenaar071d4272004-06-13 20:20:40 +000055# define HAVE_DROP_FILE
56#endif
57
58/*
59 * This define makes menus always use a fontset.
60 * We're not sure if this code always works, thus it can be disabled.
61 */
62#ifdef FEAT_XFONTSET
63# define FONTSET_ALWAYS
64#endif
65
66/*
67 * These macros convert between character row/column and pixel coordinates.
68 * TEXT_X - Convert character column into X pixel coord for drawing strings.
69 * TEXT_Y - Convert character row into Y pixel coord for drawing strings.
70 * FILL_X - Convert character column into X pixel coord for filling the area
71 * under the character.
72 * FILL_Y - Convert character row into Y pixel coord for filling the area
73 * under the character.
74 * X_2_COL - Convert X pixel coord into character column.
75 * Y_2_ROW - Convert Y pixel coord into character row.
76 */
Bram Moolenaar4f974752019-02-17 17:44:42 +010077#ifdef FEAT_GUI_MSWIN
Bram Moolenaar071d4272004-06-13 20:20:40 +000078# define TEXT_X(col) ((col) * gui.char_width)
79# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent)
80# define FILL_X(col) ((col) * gui.char_width)
81# define FILL_Y(row) ((row) * gui.char_height)
82# define X_2_COL(x) ((x) / gui.char_width)
83# define Y_2_ROW(y) ((y) / gui.char_height)
84#else
85# define TEXT_X(col) ((col) * gui.char_width + gui.border_offset)
86# define FILL_X(col) ((col) * gui.char_width + gui.border_offset)
87# define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width)
88# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \
89 + gui.border_offset)
90# define FILL_Y(row) ((row) * gui.char_height + gui.border_offset)
91# define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height)
92#endif
93
Bram Moolenaar9bf703d2019-11-30 19:44:38 +010094// Indices for arrays of scrollbars
kylo2529dac9b12022-03-27 20:05:17 +010095#define SBAR_NONE (-1)
Bram Moolenaar071d4272004-06-13 20:20:40 +000096#define SBAR_LEFT 0
97#define SBAR_RIGHT 1
98#define SBAR_BOTTOM 2
99
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100100// Orientations for scrollbars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101#define SBAR_VERT 0
102#define SBAR_HORIZ 1
103
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100104// Default size of scrollbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105#define SB_DEFAULT_WIDTH 16
106
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100107// Default height of the menu bar
108#define MENU_DEFAULT_HEIGHT 1 // figure it out at runtime
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100110// Flags for gui_mch_outstr_nowrap()
111#define GUI_MON_WRAP_CURSOR 0x01 // wrap cursor at end of line
112#define GUI_MON_INVERT 0x02 // invert the characters
113#define GUI_MON_IS_CURSOR 0x04 // drawing cursor
114#define GUI_MON_TRS_CURSOR 0x08 // drawing transparent cursor
115#define GUI_MON_NOCLEAR 0x10 // don't clear selection
Bram Moolenaar071d4272004-06-13 20:20:40 +0000116
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100117// Flags for gui_mch_draw_string()
118#define DRAW_TRANSP 0x01 // draw with transparent bg
119#define DRAW_BOLD 0x02 // draw bold text
120#define DRAW_UNDERL 0x04 // draw underline text
121#define DRAW_UNDERC 0x08 // draw undercurl text
Bram Moolenaare60acc12011-05-10 16:41:25 +0200122#if defined(FEAT_GUI_GTK)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100123# define DRAW_ITALIC 0x10 // draw italic text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100125#define DRAW_CURSOR 0x20 // drawing block cursor (win32)
126#define DRAW_STRIKE 0x40 // strikethrough
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100128// For our own tearoff menu item
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129#define TEAR_STRING "-->Detach"
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100130#define TEAR_LEN (9) // length of above string
Bram Moolenaar071d4272004-06-13 20:20:40 +0000131
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100132// for the toolbar
Bram Moolenaare89ff042016-02-20 22:17:05 +0100133#define TOOLBAR_BUTTON_HEIGHT 18
134#define TOOLBAR_BUTTON_WIDTH 18
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100135#define TOOLBAR_BORDER_HEIGHT 12 // room above+below buttons for MSWindows
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000137#ifdef FEAT_GUI_MSWIN
Bram Moolenaar2e2a2812006-03-27 20:55:21 +0000138# define TABLINE_HEIGHT 22
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000139#endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000140#ifdef FEAT_GUI_MOTIF
141# define TABLINE_HEIGHT 30
142#endif
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000143
Bram Moolenaar9372a112005-12-06 19:59:18 +0000144#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100145# define NO_CONSOLE_INPUT // use no_console_input() to check if there
146 // is no console input possible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147#endif
148
149typedef struct GuiScrollbar
150{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100151 long ident; // Unique identifier for each scrollbar
152 win_T *wp; // Scrollbar's window, NULL for bottom
153 int type; // one of SBAR_{LEFT,RIGHT,BOTTOM}
154 long value; // Represents top line number visible
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100155 long size; // Size of scrollbar thumb
156 long max; // Number of lines in buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100158 // Values measured in characters:
159 int top; // Top of scroll bar (chars from row 0)
160 int height; // Current height of scroll bar in rows
161 int width; // Current width of scroll bar in cols
162 int status_height; // Height of status line
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100164 Widget id; // Id of real scroll bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165#endif
166#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100167 GtkWidget *id; // Id of real scroll bar
168 unsigned long handler_id; // Id of "value_changed" signal handler
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169#endif
170
171#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100172 HWND id; // Id of real scroll bar
173 int scroll_shift; // The scrollbar stuff can handle only up to
174 // 32767 lines. When the file is longer,
175 // scroll_shift is set to the number of shifts
176 // to reduce the count.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177#endif
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100178
Ken Takatab52600d2024-01-12 17:31:07 +0100179#ifdef FEAT_GUI_HAIKU
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100180 VimScrollBar *id; // Pointer to real scroll bar
181#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182#ifdef FEAT_GUI_PHOTON
183 PtWidget_t *id;
184#endif
185} scrollbar_T;
186
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100187typedef long guicolor_T; // handle for a GUI color; for X11 this should
188 // be "Pixel", but that's an unsigned and we
189 // need a signed value
kylo2529dac9b12022-03-27 20:05:17 +0100190#define INVALCOLOR ((guicolor_T)-11111) // number for invalid color; on 32 bit
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100191 // displays there is a tiny chance this is an
192 // actual color
kylo2529dac9b12022-03-27 20:05:17 +0100193#define CTERMCOLOR ((guicolor_T)-11110) // only used for cterm.bg_rgb and
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100194 // cterm.fg_rgb: use cterm color
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195
196#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100197 typedef PangoFontDescription *GuiFont; // handle for a GUI font
198 typedef PangoFontDescription *GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000199# define NOFONT (GuiFont)NULL
200# define NOFONTSET (GuiFontset)NULL
201#else
202# ifdef FEAT_GUI_PHOTON
203 typedef char *GuiFont;
204 typedef char *GuiFontset;
205# define NOFONT (GuiFont)NULL
206# define NOFONTSET (GuiFontset)NULL
207# else
208# ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100209 typedef XFontStruct *GuiFont; // handle for a GUI font
210 typedef XFontSet GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211# define NOFONT (GuiFont)0
212# define NOFONTSET (GuiFontset)0
213# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100214 typedef long_u GuiFont; // handle for a GUI font
215 typedef long_u GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216# define NOFONT (GuiFont)0
217# define NOFONTSET (GuiFontset)0
218# endif
219# endif
220#endif
221
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200222#ifdef VIMDLL
223// Use spawn when GUI is starting.
224# define GUI_MAY_SPAWN
225
226// Uncomment the next definition if you want to use the `:gui` command on
227// Windows. It uses `:mksession` to inherit the session from vim.exe to
228// gvim.exe. So, it doesn't work perfectly. (EXPERIMENTAL)
229//# define EXPERIMENTAL_GUI_CMD
230#endif
231
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232typedef struct Gui
233{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100234 int in_focus; // Vim has input focus
235 int in_use; // Is the GUI being used?
236 int starting; // GUI will start in a little while
237 int shell_created; // Has the shell been created yet?
238 int dying; // Is vim dying? Then output to terminal
239 int dofork; // Use fork() when GUI is starting
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200240#ifdef GUI_MAY_SPAWN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100241 int dospawn; // Use spawn() when GUI is starting
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200242#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100243 int dragged_sb; // Which scrollbar being dragged, if any?
244 win_T *dragged_wp; // Which WIN's sb being dragged, if any?
245 int pointer_hidden; // Is the mouse pointer hidden?
246 int col; // Current cursor column in GUI display
247 int row; // Current cursor row in GUI display
248 int cursor_col; // Physical cursor column in GUI display
249 int cursor_row; // Physical cursor row in GUI display
250 char cursor_is_valid; // There is a cursor at cursor_row/col
251 int num_cols; // Number of columns
252 int num_rows; // Number of rows
253 int scroll_region_top; // Top (first) line of scroll region
254 int scroll_region_bot; // Bottom (last) line of scroll region
255 int scroll_region_left; // Left (first) column of scroll region
256 int scroll_region_right; // Right (last) col. of scroll region
257 int highlight_mask; // Highlight attribute mask
258 int scrollbar_width; // Width of vertical scrollbars
259 int scrollbar_height; // Height of horizontal scrollbar
260 int left_sbar_x; // Calculated x coord for left scrollbar
261 int right_sbar_x; // Calculated x coord for right scrollbar
lilydjwg6e0a18f2024-01-29 20:54:28 +0100262 int force_redraw; // Force a redraw even e.g. not resized
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263
264#ifdef FEAT_MENU
265# ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100266 int menu_height; // Height of the menu bar
267 int menu_width; // Width of the menu bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100269 char menu_is_active; // TRUE if menu is present
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270#endif
271
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100272 scrollbar_T bottom_sbar; // Bottom scrollbar
273 int which_scrollbars[3];// Which scrollbar boxes are active?
274 int prev_wrap; // For updating the horizontal scrollbar
275 int char_width; // Width of char cell in pixels
276 int char_height; // Height of char cell in pixels, includes
277 // 'linespace'
278 int char_ascent; // Ascent of char in pixels
279 int border_width; // Width of our border around text area
280 int border_offset; // Total pixel offset for all borders
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100282 GuiFont norm_font; // Normal font
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200283#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100284 GuiFont bold_font; // Bold font
285 GuiFont ital_font; // Italic font
286 GuiFont boldital_font; // Bold-Italic font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000287#else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100288 int font_can_bold; // Whether norm_font supports bold weight.
289 // The styled font variants are not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290#endif
291
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200292#if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293# ifdef FONTSET_ALWAYS
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100294 GuiFontset menu_fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100296 GuiFont menu_font; // menu item font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297# endif
298#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100299 GuiFont wide_font; // Normal 'guifontwide' font
Bram Moolenaar264b74f2019-01-24 17:18:42 +0100300#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100301 GuiFont wide_bold_font; // Bold 'guifontwide' font
302 GuiFont wide_ital_font; // Italic 'guifontwide' font
303 GuiFont wide_boldital_font; // Bold-Italic 'guifontwide' font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304#endif
305#ifdef FEAT_XFONTSET
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100306 GuiFontset fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100308 guicolor_T back_pixel; // Color of background
309 guicolor_T norm_pixel; // Color of normal text
310 guicolor_T def_back_pixel; // default Color of background
311 guicolor_T def_norm_pixel; // default Color of normal text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312
313#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100314 char *rsrc_menu_fg_name; // Color of menu & dialog foreground
315 guicolor_T menu_fg_pixel; // Same in Pixel format
316 char *rsrc_menu_bg_name; // Color of menu & dialog background
317 guicolor_T menu_bg_pixel; // Same in Pixel format
318 char *rsrc_scroll_fg_name; // Color of scrollbar foreground
319 guicolor_T scroll_fg_pixel; // Same in Pixel format
320 char *rsrc_scroll_bg_name; // Color of scrollbar background
321 guicolor_T scroll_bg_pixel; // Same in Pixel format
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100323 Display *dpy; // X display
324 Window wid; // Window id of text area
325 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326 GC text_gc;
327 GC back_gc;
328 GC invert_gc;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100329 Cursor blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100331 // X Resources
332 char_u *rsrc_font_name; // Resource font name, used if 'guifont'
333 // not set
334 char_u *rsrc_bold_font_name; // Resource bold font name
335 char_u *rsrc_ital_font_name; // Resource italic font name
336 char_u *rsrc_boldital_font_name; // Resource bold-italic font name
337 char_u *rsrc_menu_font_name; // Resource menu Font name
338 Bool rsrc_rev_video; // Use reverse video?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100340 char_u *geom; // Geometry, eg "80x24"
341 Bool color_approx; // Some color was approximated
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342#endif
343
344#ifdef FEAT_GUI_GTK
Bram Moolenaar98921892016-02-23 17:14:37 +0100345# ifndef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100346 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar98921892016-02-23 17:14:37 +0100347# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100348 GdkCursor *blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100350 // X Resources
351 char_u *geom; // Geometry, eg "80x24"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100353 GtkWidget *mainwin; // top level GTK window
354 GtkWidget *formwin; // manages all the windows below
355 GtkWidget *drawarea; // the "text" area
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356# ifdef FEAT_MENU
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100357 GtkWidget *menubar; // menubar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358# endif
359# ifdef FEAT_TOOLBAR
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100360 GtkWidget *toolbar; // toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361# endif
362# ifdef FEAT_GUI_GNOME
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100363 GtkWidget *menubar_h; // menubar handle
364 GtkWidget *toolbar_h; // toolbar handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365# endif
Bram Moolenaar36edf062016-07-21 22:10:12 +0200366# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100367 GdkRGBA *fgcolor; // GDK-styled foreground color
368 GdkRGBA *bgcolor; // GDK-styled background color
369 GdkRGBA *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200370# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100371 GdkColor *fgcolor; // GDK-styled foreground color
372 GdkColor *bgcolor; // GDK-styled background color
373 GdkColor *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200374# endif
Bram Moolenaar98921892016-02-23 17:14:37 +0100375# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100376 cairo_surface_t *surface; // drawarea surface
Bram Moolenaar98921892016-02-23 17:14:37 +0100377# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100378 GdkGC *text_gc; // cached GC for normal text
Bram Moolenaar98921892016-02-23 17:14:37 +0100379# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100380 PangoContext *text_context; // the context used for all text
381 PangoFont *ascii_font; // cached font for ASCII strings
382 PangoGlyphString *ascii_glyphs; // cached code point -> glyph map
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000383# ifdef FEAT_GUI_TABLINE
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100384 GtkWidget *tabline; // tab pages line handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385# endif
386
387 GtkAccelGroup *accel_group;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100388 GtkWidget *filedlg; // file selection dialog
389 char_u *browse_fname; // file name from filedlg
Bram Moolenaar20892c12011-06-26 04:49:00 +0200390
391 guint32 event_time;
Dusan Popovic4eeedc02021-10-16 20:52:05 +0100392
393 char_u ligatures_map[256]; // ascii map for characters 0-255, value is
394 // 1 if in 'guiligatures'
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100395#endif // FEAT_GUI_GTK
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000397#if defined(FEAT_GUI_TABLINE) \
Bram Moolenaar4f974752019-02-17 17:44:42 +0100398 && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
Bram Moolenaar097148e2020-08-11 21:58:20 +0200399 || defined(FEAT_GUI_HAIKU))
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000400 int tabline_height;
401#endif
402
Bram Moolenaar071d4272004-06-13 20:20:40 +0000403#if defined(FEAT_TOOLBAR) \
Bram Moolenaar0b962e52022-04-03 18:02:37 +0100404 && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_MSWIN))
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100405 int toolbar_height; // height of the toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000406#endif
407
408#ifdef FEAT_BEVAL_TIP
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100409 // Tooltip properties; also used for balloon evaluation
410 char_u *rsrc_tooltip_font_name; // tooltip font name
411 char *rsrc_tooltip_fg_name; // tooltip foreground color name
412 char *rsrc_tooltip_bg_name; // tooltip background color name
413 guicolor_T tooltip_fg_pixel; // tooltip foreground color
414 guicolor_T tooltip_bg_pixel; // tooltip background color
415 XFontSet tooltip_fontset; // tooltip fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000416#endif
417
418#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100419 GuiFont currFont; // Current font
420 guicolor_T currFgColor; // Current foreground text color
421 guicolor_T currBgColor; // Current background text color
422 guicolor_T currSpColor; // Current special text color
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423#endif
424
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100425#ifdef FEAT_GUI_HAIKU
426 VimApp *vimApp;
427 VimWindow *vimWindow;
428 VimFormView *vimForm;
429 VimTextAreaView *vimTextArea;
430 int vdcmp; // Vim Direct Communication Message Port
431#endif
432
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433#ifdef FEAT_GUI_PHOTON
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100434 PtWidget_t *vimWindow; // PtWindow
435 PtWidget_t *vimTextArea; // PtRaw
436 PtWidget_t *vimContainer; // PtPanel
Bram Moolenaar071d4272004-06-13 20:20:40 +0000437# if defined(FEAT_MENU) || defined(FEAT_TOOLBAR)
438 PtWidget_t *vimToolBarGroup;
439# endif
440# ifdef FEAT_MENU
441 PtWidget_t *vimMenuBar;
442# endif
443# ifdef FEAT_TOOLBAR
444 PtWidget_t *vimToolBar;
445 int toolbar_height;
446# endif
447 PhEvent_t *event_buffer;
448#endif
449
450#ifdef FEAT_XIM
451 char *rsrc_input_method;
452 char *rsrc_preedit_type_name;
453#endif
454} gui_T;
455
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100456extern gui_T gui; // this is defined in gui.c
Bram Moolenaar071d4272004-06-13 20:20:40 +0000457
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100458// definitions of available window positionings for gui_*_position_in_parent()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000459typedef enum
460{
461 VW_POS_MOUSE,
462 VW_POS_CENTER,
463 VW_POS_TOP_CENTER
Bram Moolenaar8348ea62005-06-14 22:05:40 +0000464} gui_win_pos_T;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000465
Bram Moolenaar7171abe2004-10-11 10:06:20 +0000466#ifdef FIND_REPLACE_DIALOG
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467/*
468 * Flags used to distinguish the different contexts in which the
469 * find/replace callback may be called.
470 */
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100471# define FRD_FINDNEXT 1 // Find next in find dialog
472# define FRD_R_FINDNEXT 2 // Find next in repl dialog
473# define FRD_REPLACE 3 // Replace once
474# define FRD_REPLACEALL 4 // Replace remaining matches
475# define FRD_UNDO 5 // Undo replaced text
476# define FRD_TYPE_MASK 7 // Mask for the callback type
477// Flags which change the way searching is done.
478# define FRD_WHOLE_WORD 0x08 // match whole word only
479# define FRD_MATCH_CASE 0x10 // match case
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480#endif
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000481
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200482#ifdef FEAT_GUI_GTK
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000483/*
484 * Convenience macros to convert from 'encoding' to 'termencoding' and
485 * vice versa. If no conversion is necessary the passed-in pointer is
486 * returned as is, without allocating any memory. Thus additional _FREE()
487 * macros are provided. The _FREE() macros also set the pointer to NULL,
488 * in order to avoid bugs due to illegal memory access only happening if
489 * 'encoding' != utf-8...
490 *
491 * Defining these macros as pure expressions looks a bit tricky but
492 * avoids depending on the context of the macro expansion. One of the
493 * rare occasions where the comma operator comes in handy :)
494 *
495 * Note: Do NOT keep the result around when handling control back to
496 * the main Vim! The user could change 'encoding' at any time.
497 */
498# define CONVERT_TO_UTF8(String) \
499 ((output_conv.vc_type == CONV_NONE || (String) == NULL) \
500 ? (String) \
501 : string_convert(&output_conv, (String), NULL))
502
503# define CONVERT_TO_UTF8_FREE(String) \
504 ((String) = ((output_conv.vc_type == CONV_NONE) \
505 ? (char_u *)NULL \
506 : (vim_free(String), (char_u *)NULL)))
507
508# define CONVERT_FROM_UTF8(String) \
509 ((input_conv.vc_type == CONV_NONE || (String) == NULL) \
510 ? (String) \
511 : string_convert(&input_conv, (String), NULL))
512
513# define CONVERT_FROM_UTF8_FREE(String) \
514 ((String) = ((input_conv.vc_type == CONV_NONE) \
515 ? (char_u *)NULL \
516 : (vim_free(String), (char_u *)NULL)))
517
518#else
519# define CONVERT_TO_UTF8(String) (String)
520# define CONVERT_TO_UTF8_FREE(String) ((String) = (char_u *)NULL)
521# define CONVERT_FROM_UTF8(String) (String)
522# define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100523#endif // FEAT_GUI_GTK
Bram Moolenaard47d8372016-09-09 22:13:24 +0200524
525#ifdef FEAT_GUI_GTK
526/*
527 * The second parameter of g_signal_handlers_disconnect_by_func() is supposed
528 * to be a function pointer which was passed to g_signal_connect_*() somewhere
529 * previously, and hence it must be of type GCallback, i.e., void (*)(void).
530 *
531 * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling
532 * g_signal_handlers_disconnect_matched(), and the second parameter of the
533 * former is to be passed to the sixth parameter of the latter the type of
534 * which, however, is declared as void * in the function signature.
535 *
536 * While the ISO C Standard does not require that function pointers be
537 * interconvertible to void *, widely-used compilers such as gcc and clang
538 * do such conversion implicitly and automatically on some platforms without
539 * issuing any warning.
540 *
541 * For Solaris Studio, that is not the case. An explicit type cast is needed
542 * to suppress warnings on that particular conversion.
543 */
544# if defined(__SUNPRO_C) && defined(USE_GTK3)
545# define FUNC2GENERIC(func) (void *)(func)
546# else
547# define FUNC2GENERIC(func) G_CALLBACK(func)
548# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100549#endif // FEAT_GUI_GTK
Bram Moolenaarb0b98d52018-05-05 21:01:00 +0200550
Bram Moolenaar097148e2020-08-11 21:58:20 +0200551#if defined(UNIX)
Bram Moolenaarb0b98d52018-05-05 21:01:00 +0200552# define GUI_MAY_FORK
553#endif