blob: cfc4448168ac859a43cbd091de5f1f411151e8ba [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
14#ifdef FEAT_GUI_ATHENA
Bram Moolenaar071d4272004-06-13 20:20:40 +000015# include <X11/Intrinsic.h>
16# include <X11/StringDefs.h>
17#endif
18
Bram Moolenaar071d4272004-06-13 20:20:40 +000019#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +010020# ifdef VMS // undef MIN and MAX because Intrinsic.h redefines them anyway
Bram Moolenaarf193fff2006-04-27 00:02:13 +000021# ifdef MAX
22# undef MAX
23# endif
24# ifdef MIN
25# undef MIN
26# endif
27# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000028# include <X11/Intrinsic.h>
29# include <gtk/gtk.h>
30#endif
31
Bram Moolenaarb3f74062020-02-26 16:16:53 +010032#ifdef FEAT_GUI_HAIKU
33# include "gui_haiku.h"
34#endif
35
Bram Moolenaarb7ed8392019-07-04 21:24:34 +020036// 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000042#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))
Bram Moolenaarcaad4f02014-12-17 14:36:14 +010050# include <Windows.h>
Bram Moolenaar071d4272004-06-13 20:20:40 +000051# 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
Bram Moolenaar071d4272004-06-13 20:20:40 +000061#ifdef FEAT_GUI_PHOTON
62# include <Ph.h>
63# include <Pt.h>
64# include "photon/PxProto.h"
65#endif
66
67/*
Bram Moolenaarb5dd4242007-05-06 12:28:24 +000068 * On some systems scrolling needs to be done right away instead of in the
69 * main loop.
70 */
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +020071#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +000072# define USE_ON_FLY_SCROLL
73#endif
74
75/*
76 * GUIs that support dropping files on a running Vim.
77 */
Bram Moolenaar92d147b2018-07-29 17:35:23 +020078#if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
79 || defined(FEAT_GUI_MSWIN) \
Bram Moolenaarb3f74062020-02-26 16:16:53 +010080 || defined(FEAT_GUI_MAC) \
81 || defined(FEAT_GUI_HAIKU)
Bram Moolenaar071d4272004-06-13 20:20:40 +000082# 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 */
Bram Moolenaar4f974752019-02-17 17:44:42 +0100104#ifdef FEAT_GUI_MSWIN
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105# 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
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100121// Indices for arrays of scrollbars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122#define SBAR_NONE -1
123#define SBAR_LEFT 0
124#define SBAR_RIGHT 1
125#define SBAR_BOTTOM 2
126
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100127// Orientations for scrollbars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128#define SBAR_VERT 0
129#define SBAR_HORIZ 1
130
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100131// Default size of scrollbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132#define SB_DEFAULT_WIDTH 16
133
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100134// Default height of the menu bar
135#define MENU_DEFAULT_HEIGHT 1 // figure it out at runtime
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100137// 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100144// 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
Bram Moolenaare60acc12011-05-10 16:41:25 +0200149#if defined(FEAT_GUI_GTK)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100150# define DRAW_ITALIC 0x10 // draw italic text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100152#define DRAW_CURSOR 0x20 // drawing block cursor (win32)
153#define DRAW_STRIKE 0x40 // strikethrough
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100155// For our own tearoff menu item
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156#define TEAR_STRING "-->Detach"
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100157#define TEAR_LEN (9) // length of above string
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100159// for the toolbar
Bram Moolenaare89ff042016-02-20 22:17:05 +0100160#define TOOLBAR_BUTTON_HEIGHT 18
161#define TOOLBAR_BUTTON_WIDTH 18
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100162#define TOOLBAR_BORDER_HEIGHT 12 // room above+below buttons for MSWindows
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000164#ifdef FEAT_GUI_MSWIN
Bram Moolenaar2e2a2812006-03-27 20:55:21 +0000165# define TABLINE_HEIGHT 22
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000166#endif
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000167#ifdef FEAT_GUI_MOTIF
168# define TABLINE_HEIGHT 30
169#endif
Bram Moolenaar3991dab2006-03-27 17:01:56 +0000170
Bram Moolenaar9372a112005-12-06 19:59:18 +0000171#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100172# define NO_CONSOLE_INPUT // use no_console_input() to check if there
173 // is no console input possible
Bram Moolenaar071d4272004-06-13 20:20:40 +0000174#endif
175
176typedef struct GuiScrollbar
177{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100178 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182#ifdef FEAT_GUI_ATHENA
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100183 int pixval; // pixel count of value
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100185 long size; // Size of scrollbar thumb
186 long max; // Number of lines in buffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100188 // 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100194 Widget id; // Id of real scroll bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195#endif
196#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100197 GtkWidget *id; // Id of real scroll bar
198 unsigned long handler_id; // Id of "value_changed" signal handler
Bram Moolenaar071d4272004-06-13 20:20:40 +0000199#endif
200
201#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100202 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.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207#endif
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100208
209#if FEAT_GUI_HAIKU
210 VimScrollBar *id; // Pointer to real scroll bar
211#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212#ifdef FEAT_GUI_MAC
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100213 ControlHandle id; // A handle to the scrollbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000214#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215#ifdef FEAT_GUI_PHOTON
216 PtWidget_t *id;
217#endif
218} scrollbar_T;
219
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100220typedef 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228
229#ifdef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100230 typedef PangoFontDescription *GuiFont; // handle for a GUI font
231 typedef PangoFontDescription *GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232# 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
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100242 typedef XFontStruct *GuiFont; // handle for a GUI font
243 typedef XFontSet GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000244# define NOFONT (GuiFont)0
245# define NOFONTSET (GuiFontset)0
246# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100247 typedef long_u GuiFont; // handle for a GUI font
248 typedef long_u GuiFontset; // handle for a GUI fontset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249# define NOFONT (GuiFont)0
250# define NOFONTSET (GuiFontset)0
251# endif
252# endif
253#endif
254
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200255#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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265typedef struct Gui
266{
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100267 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
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200273#ifdef GUI_MAY_SPAWN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100274 int dospawn; // Use spawn() when GUI is starting
Bram Moolenaarafde13b2019-04-28 19:46:49 +0200275#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100276 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295
296#ifdef FEAT_MENU
297# ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100298 int menu_height; // Height of the menu bar
299 int menu_width; // Width of the menu bar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100301 char menu_is_active; // TRUE if menu is present
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302# ifdef FEAT_GUI_ATHENA
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100303 char menu_height_fixed; // TRUE if menu height fixed
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304# endif
305#endif
306
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100307 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100317 GuiFont norm_font; // Normal font
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200318#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100319 GuiFont bold_font; // Bold font
320 GuiFont ital_font; // Italic font
321 GuiFont boldital_font; // Bold-Italic font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322#else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100323 int font_can_bold; // Whether norm_font supports bold weight.
324 // The styled font variants are not used.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325#endif
326
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200327#if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328# ifdef FONTSET_ALWAYS
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100329 GuiFontset menu_fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100331 GuiFont menu_font; // menu item font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000332# endif
333#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100334 GuiFont wide_font; // Normal 'guifontwide' font
Bram Moolenaar264b74f2019-01-24 17:18:42 +0100335#ifndef FEAT_GUI_GTK
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100336 GuiFont wide_bold_font; // Bold 'guifontwide' font
337 GuiFont wide_ital_font; // Italic 'guifontwide' font
338 GuiFont wide_boldital_font; // Bold-Italic 'guifontwide' font
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339#endif
340#ifdef FEAT_XFONTSET
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100341 GuiFontset fontset; // set of fonts for multi-byte chars
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342#endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100343 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347
348#ifdef FEAT_GUI_X11
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100349 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357
358# ifdef FEAT_GUI_MOTIF
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100359 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100364 Display *dpy; // X display
365 Window wid; // Window id of text area
366 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367 GC text_gc;
368 GC back_gc;
369 GC invert_gc;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100370 Cursor blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100372 // 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?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100381 char_u *geom; // Geometry, eg "80x24"
382 Bool color_approx; // Some color was approximated
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383#endif
384
385#ifdef FEAT_GUI_GTK
Bram Moolenaar98921892016-02-23 17:14:37 +0100386# ifndef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100387 int visibility; // Is shell partially/fully obscured?
Bram Moolenaar98921892016-02-23 17:14:37 +0100388# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100389 GdkCursor *blank_pointer; // Blank pointer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100391 // X Resources
392 char_u *geom; // Geometry, eg "80x24"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000393
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100394 GtkWidget *mainwin; // top level GTK window
395 GtkWidget *formwin; // manages all the windows below
396 GtkWidget *drawarea; // the "text" area
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397# ifdef FEAT_MENU
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100398 GtkWidget *menubar; // menubar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000399# endif
400# ifdef FEAT_TOOLBAR
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100401 GtkWidget *toolbar; // toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402# endif
403# ifdef FEAT_GUI_GNOME
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100404 GtkWidget *menubar_h; // menubar handle
405 GtkWidget *toolbar_h; // toolbar handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000406# endif
Bram Moolenaar36edf062016-07-21 22:10:12 +0200407# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100408 GdkRGBA *fgcolor; // GDK-styled foreground color
409 GdkRGBA *bgcolor; // GDK-styled background color
410 GdkRGBA *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200411# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100412 GdkColor *fgcolor; // GDK-styled foreground color
413 GdkColor *bgcolor; // GDK-styled background color
414 GdkColor *spcolor; // GDK-styled special color
Bram Moolenaar36edf062016-07-21 22:10:12 +0200415# endif
Bram Moolenaar98921892016-02-23 17:14:37 +0100416# ifdef USE_GTK3
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100417 cairo_surface_t *surface; // drawarea surface
418 gboolean by_signal; // cause of draw operation
Bram Moolenaar98921892016-02-23 17:14:37 +0100419# else
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100420 GdkGC *text_gc; // cached GC for normal text
Bram Moolenaar98921892016-02-23 17:14:37 +0100421# endif
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100422 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
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000425# ifdef FEAT_GUI_TABLINE
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100426 GtkWidget *tabline; // tab pages line handle
Bram Moolenaar071d4272004-06-13 20:20:40 +0000427# endif
428
429 GtkAccelGroup *accel_group;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100430 GtkWidget *filedlg; // file selection dialog
431 char_u *browse_fname; // file name from filedlg
Bram Moolenaar20892c12011-06-26 04:49:00 +0200432
433 guint32 event_time;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100434#endif // FEAT_GUI_GTK
Bram Moolenaar071d4272004-06-13 20:20:40 +0000435
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000436#if defined(FEAT_GUI_TABLINE) \
Bram Moolenaar4f974752019-02-17 17:44:42 +0100437 && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100438 || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_HAIKU))
Bram Moolenaar551dbcc2006-04-25 22:13:59 +0000439 int tabline_height;
440#endif
441
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442#ifdef FEAT_FOOTER
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100443 int footer_height; // height of the message footer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444#endif
445
446#if defined(FEAT_TOOLBAR) \
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100447 && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_HAIKU))
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100448 int toolbar_height; // height of the toolbar
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449#endif
450
451#ifdef FEAT_BEVAL_TIP
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100452 // 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000459#endif
460
461#ifdef FEAT_GUI_MSWIN
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100462 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000466#endif
467
Bram Moolenaarb3f74062020-02-26 16:16:53 +0100468#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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476#ifdef FEAT_GUI_MAC
477 WindowPtr VimWindow;
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100478 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?
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482#endif
483
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484#ifdef FEAT_GUI_PHOTON
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100485 PtWidget_t *vimWindow; // PtWindow
486 PtWidget_t *vimTextArea; // PtRaw
487 PtWidget_t *vimContainer; // PtPanel
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488# 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
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100507extern gui_T gui; // this is defined in gui.c
Bram Moolenaar071d4272004-06-13 20:20:40 +0000508
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100509// definitions of available window positionings for gui_*_position_in_parent()
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510typedef enum
511{
512 VW_POS_MOUSE,
513 VW_POS_CENTER,
514 VW_POS_TOP_CENTER
Bram Moolenaar8348ea62005-06-14 22:05:40 +0000515} gui_win_pos_T;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516
Bram Moolenaar7171abe2004-10-11 10:06:20 +0000517#ifdef FIND_REPLACE_DIALOG
Bram Moolenaar071d4272004-06-13 20:20:40 +0000518/*
519 * Flags used to distinguish the different contexts in which the
520 * find/replace callback may be called.
521 */
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100522# 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
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531#endif
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000532
Bram Moolenaar0eda7ac2010-06-26 05:38:18 +0200533#ifdef FEAT_GUI_GTK
Bram Moolenaarc1e37902006-04-18 21:55:01 +0000534/*
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)
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100574#endif // FEAT_GUI_GTK
Bram Moolenaard47d8372016-09-09 22:13:24 +0200575
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
Bram Moolenaar9bf703d2019-11-30 19:44:38 +0100600#endif // FEAT_GUI_GTK
Bram Moolenaarb0b98d52018-05-05 21:01:00 +0200601
602#if defined(UNIX) && !defined(FEAT_GUI_MAC)
603# define GUI_MAY_FORK
604#endif