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