blob: 7bcbfa3538a9d50e7a9f390063e9f39c48fa35b1 [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
Bram Moolenaar9bf703d2019-11-30 19:44:38 +010015# ifdef VMS // undef MIN and MAX because Intrinsic.h redefines them anyway
Bram Moolenaarf193fff2006-04-27 00:02:13 +000016# ifdef MAX
17# undef MAX
18# endif
19# ifdef MIN
20# undef MIN
21# endif
Bram Moolenaar467676d2020-12-30 13:14:45 +010022# include "gui_gtk_vms.h"
23# endif // VMS
Bram Moolenaar071d4272004-06-13 20:20:40 +000024# include <X11/Intrinsic.h>
Yee Cheng Chinf7f746b2023-09-30 12:28:50 +020025# pragma GCC diagnostic push
26# pragma GCC diagnostic ignored "-Wstrict-prototypes"
Bram Moolenaar071d4272004-06-13 20:20:40 +000027# include <gtk/gtk.h>
Yee Cheng Chinf7f746b2023-09-30 12:28:50 +020028# pragma GCC diagnostic pop
Bram Moolenaar071d4272004-06-13 20:20:40 +000029#endif
30
Bram Moolenaarb3f74062020-02-26 16:16:53 +010031#ifdef FEAT_GUI_HAIKU
32# include "gui_haiku.h"
33#endif
34
Bram Moolenaarb7ed8392019-07-04 21:24:34 +020035// Needed when generating prototypes, since FEAT_GUI is always defined then.
36#if defined(FEAT_XCLIPBOARD) && !defined(FEAT_GUI_MOTIF) \
Bram Moolenaar0b962e52022-04-03 18:02:37 +010037 && !defined(FEAT_GUI_GTK)
Bram Moolenaarb7ed8392019-07-04 21:24:34 +020038# include <X11/Intrinsic.h>
39#endif
40
Bram Moolenaar071d4272004-06-13 20:20:40 +000041#ifdef FEAT_GUI_PHOTON
42# include <Ph.h>
43# include <Pt.h>
44# include "photon/PxProto.h"
45#endif
46
47/*
Bram Moolenaarb5dd4242007-05-06 12:28:24 +000048 * On some systems scrolling needs to be done right away instead of in the
49 * main loop.
50 */
Bram Moolenaar097148e2020-08-11 21:58:20 +020051#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +000052# define USE_ON_FLY_SCROLL
53#endif
54
55/*
56 * GUIs that support dropping files on a running Vim.
57 */
Bram Moolenaar92d147b2018-07-29 17:35:23 +020058#if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
59 || defined(FEAT_GUI_MSWIN) \
Bram Moolenaarb3f74062020-02-26 16:16:53 +010060 || defined(FEAT_GUI_HAIKU)
Bram Moolenaar071d4272004-06-13 20:20:40 +000061# define HAVE_DROP_FILE
62#endif
63
64/*
65 * This define makes menus always use a fontset.
66 * We're not sure if this code always works, thus it can be disabled.
67 */
68#ifdef FEAT_XFONTSET
69# define FONTSET_ALWAYS
70#endif
71
72/*
73 * These macros convert between character row/column and pixel coordinates.
74 * TEXT_X - Convert character column into X pixel coord for drawing strings.
75 * TEXT_Y - Convert character row into Y pixel coord for drawing strings.
76 * FILL_X - Convert character column into X pixel coord for filling the area
77 * under the character.
78 * FILL_Y - Convert character row into Y pixel coord for filling the area
79 * under the character.
80 * X_2_COL - Convert X pixel coord into character column.
81 * Y_2_ROW - Convert Y pixel coord into character row.
82 */
Bram Moolenaar4f974752019-02-17 17:44:42 +010083#ifdef FEAT_GUI_MSWIN
Bram Moolenaar071d4272004-06-13 20:20:40 +000084# define TEXT_X(col) ((col) * gui.char_width)
85# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent)
86# define FILL_X(col) ((col) * gui.char_width)
87# define FILL_Y(row) ((row) * gui.char_height)
88# define X_2_COL(x) ((x) / gui.char_width)
89# define Y_2_ROW(y) ((y) / gui.char_height)
90#else
91# define TEXT_X(col) ((col) * gui.char_width + gui.border_offset)
92# define FILL_X(col) ((col) * gui.char_width + gui.border_offset)
93# define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width)
94# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \
95 + gui.border_offset)
96# define FILL_Y(row) ((row) * gui.char_height + gui.border_offset)
97# define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height)
98#endif
99
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100100// Indices for arrays of scrollbars
kylo2529dac9b12022-03-27 20:05:17 +0100101#define SBAR_NONE (-1)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102#define SBAR_LEFT 0
103#define SBAR_RIGHT 1
104#define SBAR_BOTTOM 2
105
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100106// Orientations for scrollbars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000107#define SBAR_VERT 0
108#define SBAR_HORIZ 1
109
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100110// Default size of scrollbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111#define SB_DEFAULT_WIDTH 16
112
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100113// Default height of the menu bar
114#define MENU_DEFAULT_HEIGHT 1 // figure it out at runtime
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100116// Flags for gui_mch_outstr_nowrap()
117#define GUI_MON_WRAP_CURSOR 0x01 // wrap cursor at end of line
118#define GUI_MON_INVERT 0x02 // invert the characters
119#define GUI_MON_IS_CURSOR 0x04 // drawing cursor
120#define GUI_MON_TRS_CURSOR 0x08 // drawing transparent cursor
121#define GUI_MON_NOCLEAR 0x10 // don't clear selection
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100123// Flags for gui_mch_draw_string()
124#define DRAW_TRANSP 0x01 // draw with transparent bg
125#define DRAW_BOLD 0x02 // draw bold text
126#define DRAW_UNDERL 0x04 // draw underline text
127#define DRAW_UNDERC 0x08 // draw undercurl text
Bram Moolenaare60acc12011-05-10 16:41:25 +0200128#if defined(FEAT_GUI_GTK)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100129# define DRAW_ITALIC 0x10 // draw italic text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100131#define DRAW_CURSOR 0x20 // drawing block cursor (win32)
132#define DRAW_STRIKE 0x40 // strikethrough
Bram Moolenaar071d4272004-06-13 20:20:40 +0000133
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100134// For our own tearoff menu item
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135#define TEAR_STRING "-->Detach"
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100136#define TEAR_LEN (9) // length of above string
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100138// for the toolbar
Bram Moolenaare89ff042016-02-20 22:17:05 +0100139#define TOOLBAR_BUTTON_HEIGHT 18
140#define TOOLBAR_BUTTON_WIDTH 18
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100141#define TOOLBAR_BORDER_HEIGHT 12 // room above+below buttons for MSWindows
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000143#ifdef FEAT_GUI_MSWIN
Bram Moolenaar2e2a2812006-03-27 20:55:21 +0000144# define TABLINE_HEIGHT 22
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000145#endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000146#ifdef FEAT_GUI_MOTIF
147# define TABLINE_HEIGHT 30
148#endif
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000149
Bram Moolenaar9372a112005-12-06 19:59:18 +0000150#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100151# define NO_CONSOLE_INPUT // use no_console_input() to check if there
152 // is no console input possible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153#endif
154
155typedef struct GuiScrollbar
156{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100157 long ident; // Unique identifier for each scrollbar
158 win_T *wp; // Scrollbar's window, NULL for bottom
159 int type; // one of SBAR_{LEFT,RIGHT,BOTTOM}
160 long value; // Represents top line number visible
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100161 long size; // Size of scrollbar thumb
162 long max; // Number of lines in buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100164 // Values measured in characters:
165 int top; // Top of scroll bar (chars from row 0)
166 int height; // Current height of scroll bar in rows
167 int width; // Current width of scroll bar in cols
168 int status_height; // Height of status line
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100170 Widget id; // Id of real scroll bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000171#endif
172#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100173 GtkWidget *id; // Id of real scroll bar
174 unsigned long handler_id; // Id of "value_changed" signal handler
Bram Moolenaar071d4272004-06-13 20:20:40 +0000175#endif
176
177#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100178 HWND id; // Id of real scroll bar
179 int scroll_shift; // The scrollbar stuff can handle only up to
180 // 32767 lines. When the file is longer,
181 // scroll_shift is set to the number of shifts
182 // to reduce the count.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183#endif
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100184
185#if FEAT_GUI_HAIKU
186 VimScrollBar *id; // Pointer to real scroll bar
187#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000188#ifdef FEAT_GUI_PHOTON
189 PtWidget_t *id;
190#endif
191} scrollbar_T;
192
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100193typedef long guicolor_T; // handle for a GUI color; for X11 this should
194 // be "Pixel", but that's an unsigned and we
195 // need a signed value
kylo2529dac9b12022-03-27 20:05:17 +0100196#define INVALCOLOR ((guicolor_T)-11111) // number for invalid color; on 32 bit
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100197 // displays there is a tiny chance this is an
198 // actual color
kylo2529dac9b12022-03-27 20:05:17 +0100199#define CTERMCOLOR ((guicolor_T)-11110) // only used for cterm.bg_rgb and
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100200 // cterm.fg_rgb: use cterm color
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201
202#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100203 typedef PangoFontDescription *GuiFont; // handle for a GUI font
204 typedef PangoFontDescription *GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205# define NOFONT (GuiFont)NULL
206# define NOFONTSET (GuiFontset)NULL
207#else
208# ifdef FEAT_GUI_PHOTON
209 typedef char *GuiFont;
210 typedef char *GuiFontset;
211# define NOFONT (GuiFont)NULL
212# define NOFONTSET (GuiFontset)NULL
213# else
214# ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100215 typedef XFontStruct *GuiFont; // handle for a GUI font
216 typedef XFontSet GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217# define NOFONT (GuiFont)0
218# define NOFONTSET (GuiFontset)0
219# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100220 typedef long_u GuiFont; // handle for a GUI font
221 typedef long_u GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222# define NOFONT (GuiFont)0
223# define NOFONTSET (GuiFontset)0
224# endif
225# endif
226#endif
227
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200228#ifdef VIMDLL
229// Use spawn when GUI is starting.
230# define GUI_MAY_SPAWN
231
232// Uncomment the next definition if you want to use the `:gui` command on
233// Windows. It uses `:mksession` to inherit the session from vim.exe to
234// gvim.exe. So, it doesn't work perfectly. (EXPERIMENTAL)
235//# define EXPERIMENTAL_GUI_CMD
236#endif
237
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238typedef struct Gui
239{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100240 int in_focus; // Vim has input focus
241 int in_use; // Is the GUI being used?
242 int starting; // GUI will start in a little while
243 int shell_created; // Has the shell been created yet?
244 int dying; // Is vim dying? Then output to terminal
245 int dofork; // Use fork() when GUI is starting
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200246#ifdef GUI_MAY_SPAWN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100247 int dospawn; // Use spawn() when GUI is starting
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200248#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100249 int dragged_sb; // Which scrollbar being dragged, if any?
250 win_T *dragged_wp; // Which WIN's sb being dragged, if any?
251 int pointer_hidden; // Is the mouse pointer hidden?
252 int col; // Current cursor column in GUI display
253 int row; // Current cursor row in GUI display
254 int cursor_col; // Physical cursor column in GUI display
255 int cursor_row; // Physical cursor row in GUI display
256 char cursor_is_valid; // There is a cursor at cursor_row/col
257 int num_cols; // Number of columns
258 int num_rows; // Number of rows
259 int scroll_region_top; // Top (first) line of scroll region
260 int scroll_region_bot; // Bottom (last) line of scroll region
261 int scroll_region_left; // Left (first) column of scroll region
262 int scroll_region_right; // Right (last) col. of scroll region
263 int highlight_mask; // Highlight attribute mask
264 int scrollbar_width; // Width of vertical scrollbars
265 int scrollbar_height; // Height of horizontal scrollbar
266 int left_sbar_x; // Calculated x coord for left scrollbar
267 int right_sbar_x; // Calculated x coord for right scrollbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
269#ifdef FEAT_MENU
270# ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100271 int menu_height; // Height of the menu bar
272 int menu_width; // Width of the menu bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100274 char menu_is_active; // TRUE if menu is present
Bram Moolenaar071d4272004-06-13 20:20:40 +0000275#endif
276
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100277 scrollbar_T bottom_sbar; // Bottom scrollbar
278 int which_scrollbars[3];// Which scrollbar boxes are active?
279 int prev_wrap; // For updating the horizontal scrollbar
280 int char_width; // Width of char cell in pixels
281 int char_height; // Height of char cell in pixels, includes
282 // 'linespace'
283 int char_ascent; // Ascent of char in pixels
284 int border_width; // Width of our border around text area
285 int border_offset; // Total pixel offset for all borders
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100287 GuiFont norm_font; // Normal font
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200288#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100289 GuiFont bold_font; // Bold font
290 GuiFont ital_font; // Italic font
291 GuiFont boldital_font; // Bold-Italic font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292#else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100293 int font_can_bold; // Whether norm_font supports bold weight.
294 // The styled font variants are not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295#endif
296
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200297#if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298# ifdef FONTSET_ALWAYS
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100299 GuiFontset menu_fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100301 GuiFont menu_font; // menu item font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302# endif
303#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100304 GuiFont wide_font; // Normal 'guifontwide' font
Bram Moolenaar264b74f2019-01-24 17:18:42 +0100305#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100306 GuiFont wide_bold_font; // Bold 'guifontwide' font
307 GuiFont wide_ital_font; // Italic 'guifontwide' font
308 GuiFont wide_boldital_font; // Bold-Italic 'guifontwide' font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309#endif
310#ifdef FEAT_XFONTSET
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100311 GuiFontset fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100313 guicolor_T back_pixel; // Color of background
314 guicolor_T norm_pixel; // Color of normal text
315 guicolor_T def_back_pixel; // default Color of background
316 guicolor_T def_norm_pixel; // default Color of normal text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000317
318#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100319 char *rsrc_menu_fg_name; // Color of menu & dialog foreground
320 guicolor_T menu_fg_pixel; // Same in Pixel format
321 char *rsrc_menu_bg_name; // Color of menu & dialog background
322 guicolor_T menu_bg_pixel; // Same in Pixel format
323 char *rsrc_scroll_fg_name; // Color of scrollbar foreground
324 guicolor_T scroll_fg_pixel; // Same in Pixel format
325 char *rsrc_scroll_bg_name; // Color of scrollbar background
326 guicolor_T scroll_bg_pixel; // Same in Pixel format
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100328 Display *dpy; // X display
329 Window wid; // Window id of text area
330 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331 GC text_gc;
332 GC back_gc;
333 GC invert_gc;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100334 Cursor blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100336 // X Resources
337 char_u *rsrc_font_name; // Resource font name, used if 'guifont'
338 // not set
339 char_u *rsrc_bold_font_name; // Resource bold font name
340 char_u *rsrc_ital_font_name; // Resource italic font name
341 char_u *rsrc_boldital_font_name; // Resource bold-italic font name
342 char_u *rsrc_menu_font_name; // Resource menu Font name
343 Bool rsrc_rev_video; // Use reverse video?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000344
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100345 char_u *geom; // Geometry, eg "80x24"
346 Bool color_approx; // Some color was approximated
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347#endif
348
349#ifdef FEAT_GUI_GTK
Bram Moolenaar98921892016-02-23 17:14:37 +0100350# ifndef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100351 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar98921892016-02-23 17:14:37 +0100352# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100353 GdkCursor *blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100355 // X Resources
356 char_u *geom; // Geometry, eg "80x24"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100358 GtkWidget *mainwin; // top level GTK window
359 GtkWidget *formwin; // manages all the windows below
360 GtkWidget *drawarea; // the "text" area
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361# ifdef FEAT_MENU
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100362 GtkWidget *menubar; // menubar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363# endif
364# ifdef FEAT_TOOLBAR
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100365 GtkWidget *toolbar; // toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366# endif
367# ifdef FEAT_GUI_GNOME
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100368 GtkWidget *menubar_h; // menubar handle
369 GtkWidget *toolbar_h; // toolbar handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370# endif
Bram Moolenaar36edf062016-07-21 22:10:12 +0200371# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100372 GdkRGBA *fgcolor; // GDK-styled foreground color
373 GdkRGBA *bgcolor; // GDK-styled background color
374 GdkRGBA *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200375# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100376 GdkColor *fgcolor; // GDK-styled foreground color
377 GdkColor *bgcolor; // GDK-styled background color
378 GdkColor *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200379# endif
Bram Moolenaar98921892016-02-23 17:14:37 +0100380# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100381 cairo_surface_t *surface; // drawarea surface
Bram Moolenaar98921892016-02-23 17:14:37 +0100382# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100383 GdkGC *text_gc; // cached GC for normal text
Bram Moolenaar98921892016-02-23 17:14:37 +0100384# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100385 PangoContext *text_context; // the context used for all text
386 PangoFont *ascii_font; // cached font for ASCII strings
387 PangoGlyphString *ascii_glyphs; // cached code point -> glyph map
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000388# ifdef FEAT_GUI_TABLINE
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100389 GtkWidget *tabline; // tab pages line handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390# endif
391
392 GtkAccelGroup *accel_group;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100393 GtkWidget *filedlg; // file selection dialog
394 char_u *browse_fname; // file name from filedlg
Bram Moolenaar20892c12011-06-26 04:49:00 +0200395
396 guint32 event_time;
Dusan Popovic4eeedc02021-10-16 20:52:05 +0100397
398 char_u ligatures_map[256]; // ascii map for characters 0-255, value is
399 // 1 if in 'guiligatures'
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100400#endif // FEAT_GUI_GTK
Bram Moolenaar071d4272004-06-13 20:20:40 +0000401
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000402#if defined(FEAT_GUI_TABLINE) \
Bram Moolenaar4f974752019-02-17 17:44:42 +0100403 && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
Bram Moolenaar097148e2020-08-11 21:58:20 +0200404 || defined(FEAT_GUI_HAIKU))
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000405 int tabline_height;
406#endif
407
Bram Moolenaar071d4272004-06-13 20:20:40 +0000408#if defined(FEAT_TOOLBAR) \
Bram Moolenaar0b962e52022-04-03 18:02:37 +0100409 && (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU) || defined(FEAT_GUI_MSWIN))
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100410 int toolbar_height; // height of the toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000411#endif
412
413#ifdef FEAT_BEVAL_TIP
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100414 // Tooltip properties; also used for balloon evaluation
415 char_u *rsrc_tooltip_font_name; // tooltip font name
416 char *rsrc_tooltip_fg_name; // tooltip foreground color name
417 char *rsrc_tooltip_bg_name; // tooltip background color name
418 guicolor_T tooltip_fg_pixel; // tooltip foreground color
419 guicolor_T tooltip_bg_pixel; // tooltip background color
420 XFontSet tooltip_fontset; // tooltip fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000421#endif
422
423#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100424 GuiFont currFont; // Current font
425 guicolor_T currFgColor; // Current foreground text color
426 guicolor_T currBgColor; // Current background text color
427 guicolor_T currSpColor; // Current special text color
Bram Moolenaar071d4272004-06-13 20:20:40 +0000428#endif
429
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100430#ifdef FEAT_GUI_HAIKU
431 VimApp *vimApp;
432 VimWindow *vimWindow;
433 VimFormView *vimForm;
434 VimTextAreaView *vimTextArea;
435 int vdcmp; // Vim Direct Communication Message Port
436#endif
437
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438#ifdef FEAT_GUI_PHOTON
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100439 PtWidget_t *vimWindow; // PtWindow
440 PtWidget_t *vimTextArea; // PtRaw
441 PtWidget_t *vimContainer; // PtPanel
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442# if defined(FEAT_MENU) || defined(FEAT_TOOLBAR)
443 PtWidget_t *vimToolBarGroup;
444# endif
445# ifdef FEAT_MENU
446 PtWidget_t *vimMenuBar;
447# endif
448# ifdef FEAT_TOOLBAR
449 PtWidget_t *vimToolBar;
450 int toolbar_height;
451# endif
452 PhEvent_t *event_buffer;
453#endif
454
455#ifdef FEAT_XIM
456 char *rsrc_input_method;
457 char *rsrc_preedit_type_name;
458#endif
459} gui_T;
460
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100461extern gui_T gui; // this is defined in gui.c
Bram Moolenaar071d4272004-06-13 20:20:40 +0000462
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100463// definitions of available window positionings for gui_*_position_in_parent()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464typedef enum
465{
466 VW_POS_MOUSE,
467 VW_POS_CENTER,
468 VW_POS_TOP_CENTER
Bram Moolenaar8348ea62005-06-14 22:05:40 +0000469} gui_win_pos_T;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470
Bram Moolenaar7171abe2004-10-11 10:06:20 +0000471#ifdef FIND_REPLACE_DIALOG
Bram Moolenaar071d4272004-06-13 20:20:40 +0000472/*
473 * Flags used to distinguish the different contexts in which the
474 * find/replace callback may be called.
475 */
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100476# define FRD_FINDNEXT 1 // Find next in find dialog
477# define FRD_R_FINDNEXT 2 // Find next in repl dialog
478# define FRD_REPLACE 3 // Replace once
479# define FRD_REPLACEALL 4 // Replace remaining matches
480# define FRD_UNDO 5 // Undo replaced text
481# define FRD_TYPE_MASK 7 // Mask for the callback type
482// Flags which change the way searching is done.
483# define FRD_WHOLE_WORD 0x08 // match whole word only
484# define FRD_MATCH_CASE 0x10 // match case
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485#endif
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000486
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200487#ifdef FEAT_GUI_GTK
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000488/*
489 * Convenience macros to convert from 'encoding' to 'termencoding' and
490 * vice versa. If no conversion is necessary the passed-in pointer is
491 * returned as is, without allocating any memory. Thus additional _FREE()
492 * macros are provided. The _FREE() macros also set the pointer to NULL,
493 * in order to avoid bugs due to illegal memory access only happening if
494 * 'encoding' != utf-8...
495 *
496 * Defining these macros as pure expressions looks a bit tricky but
497 * avoids depending on the context of the macro expansion. One of the
498 * rare occasions where the comma operator comes in handy :)
499 *
500 * Note: Do NOT keep the result around when handling control back to
501 * the main Vim! The user could change 'encoding' at any time.
502 */
503# define CONVERT_TO_UTF8(String) \
504 ((output_conv.vc_type == CONV_NONE || (String) == NULL) \
505 ? (String) \
506 : string_convert(&output_conv, (String), NULL))
507
508# define CONVERT_TO_UTF8_FREE(String) \
509 ((String) = ((output_conv.vc_type == CONV_NONE) \
510 ? (char_u *)NULL \
511 : (vim_free(String), (char_u *)NULL)))
512
513# define CONVERT_FROM_UTF8(String) \
514 ((input_conv.vc_type == CONV_NONE || (String) == NULL) \
515 ? (String) \
516 : string_convert(&input_conv, (String), NULL))
517
518# define CONVERT_FROM_UTF8_FREE(String) \
519 ((String) = ((input_conv.vc_type == CONV_NONE) \
520 ? (char_u *)NULL \
521 : (vim_free(String), (char_u *)NULL)))
522
523#else
524# define CONVERT_TO_UTF8(String) (String)
525# define CONVERT_TO_UTF8_FREE(String) ((String) = (char_u *)NULL)
526# define CONVERT_FROM_UTF8(String) (String)
527# define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100528#endif // FEAT_GUI_GTK
Bram Moolenaard47d8372016-09-09 22:13:24 +0200529
530#ifdef FEAT_GUI_GTK
531/*
532 * The second parameter of g_signal_handlers_disconnect_by_func() is supposed
533 * to be a function pointer which was passed to g_signal_connect_*() somewhere
534 * previously, and hence it must be of type GCallback, i.e., void (*)(void).
535 *
536 * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling
537 * g_signal_handlers_disconnect_matched(), and the second parameter of the
538 * former is to be passed to the sixth parameter of the latter the type of
539 * which, however, is declared as void * in the function signature.
540 *
541 * While the ISO C Standard does not require that function pointers be
542 * interconvertible to void *, widely-used compilers such as gcc and clang
543 * do such conversion implicitly and automatically on some platforms without
544 * issuing any warning.
545 *
546 * For Solaris Studio, that is not the case. An explicit type cast is needed
547 * to suppress warnings on that particular conversion.
548 */
549# if defined(__SUNPRO_C) && defined(USE_GTK3)
550# define FUNC2GENERIC(func) (void *)(func)
551# else
552# define FUNC2GENERIC(func) G_CALLBACK(func)
553# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100554#endif // FEAT_GUI_GTK
Bram Moolenaarb0b98d52018-05-05 21:01:00 +0200555
Bram Moolenaar097148e2020-08-11 21:58:20 +0200556#if defined(UNIX)
Bram Moolenaarb0b98d52018-05-05 21:01:00 +0200557# define GUI_MAY_FORK
558#endif