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