diff options
Diffstat (limited to '')
-rw-r--r-- | src/gui.h | 569 |
1 files changed, 569 insertions, 0 deletions
diff --git a/src/gui.h b/src/gui.h new file mode 100644 index 0000000..a57b0a3 --- /dev/null +++ b/src/gui.h @@ -0,0 +1,569 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * Motif support by Robert Webb + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + */ + +#ifdef FEAT_GUI_MOTIF +# include <Xm/Xm.h> +#endif + +#ifdef FEAT_GUI_ATHENA +# include <X11/Intrinsic.h> +# include <X11/StringDefs.h> +#endif + +#ifdef FEAT_GUI_GTK +# ifdef VMS /* undef MIN and MAX because Intrinsic.h redefines them anyway */ +# ifdef MAX +# undef MAX +# endif +# ifdef MIN +# undef MIN +# endif +# endif +# include <X11/Intrinsic.h> +# include <gtk/gtk.h> +#endif + +#ifdef FEAT_GUI_MAC +# include <Types.h> +/*# include <Memory.h>*/ +# include <Quickdraw.h> +# include <Fonts.h> +# include <Events.h> +# include <Menus.h> +# if !(defined (TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON)) +# include <Windows.h> +# endif +# include <Controls.h> +/*# include <TextEdit.h>*/ +# include <Dialogs.h> +# include <OSUtils.h> +/* +# include <ToolUtils.h> +# include <SegLoad.h>*/ +#endif + +#ifdef FEAT_GUI_PHOTON +# include <Ph.h> +# include <Pt.h> +# include "photon/PxProto.h" +#endif + +/* + * On some systems scrolling needs to be done right away instead of in the + * main loop. + */ +#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) +# define USE_ON_FLY_SCROLL +#endif + +/* + * GUIs that support dropping files on a running Vim. + */ +#if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \ + || defined(FEAT_GUI_MSWIN) \ + || defined(FEAT_GUI_MAC) +# define HAVE_DROP_FILE +#endif + +/* + * This define makes menus always use a fontset. + * We're not sure if this code always works, thus it can be disabled. + */ +#ifdef FEAT_XFONTSET +# define FONTSET_ALWAYS +#endif + +/* + * These macros convert between character row/column and pixel coordinates. + * TEXT_X - Convert character column into X pixel coord for drawing strings. + * TEXT_Y - Convert character row into Y pixel coord for drawing strings. + * FILL_X - Convert character column into X pixel coord for filling the area + * under the character. + * FILL_Y - Convert character row into Y pixel coord for filling the area + * under the character. + * X_2_COL - Convert X pixel coord into character column. + * Y_2_ROW - Convert Y pixel coord into character row. + */ +#ifdef FEAT_GUI_W32 +# define TEXT_X(col) ((col) * gui.char_width) +# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent) +# define FILL_X(col) ((col) * gui.char_width) +# define FILL_Y(row) ((row) * gui.char_height) +# define X_2_COL(x) ((x) / gui.char_width) +# define Y_2_ROW(y) ((y) / gui.char_height) +#else +# define TEXT_X(col) ((col) * gui.char_width + gui.border_offset) +# define FILL_X(col) ((col) * gui.char_width + gui.border_offset) +# define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width) +# define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \ + + gui.border_offset) +# define FILL_Y(row) ((row) * gui.char_height + gui.border_offset) +# define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height) +#endif + +/* Indices for arrays of scrollbars */ +#define SBAR_NONE -1 +#define SBAR_LEFT 0 +#define SBAR_RIGHT 1 +#define SBAR_BOTTOM 2 + +/* Orientations for scrollbars */ +#define SBAR_VERT 0 +#define SBAR_HORIZ 1 + +/* Default size of scrollbar */ +#define SB_DEFAULT_WIDTH 16 + +/* Default height of the menu bar */ +#define MENU_DEFAULT_HEIGHT 1 /* figure it out at runtime */ + +/* Flags for gui_mch_outstr_nowrap() */ +#define GUI_MON_WRAP_CURSOR 0x01 /* wrap cursor at end of line */ +#define GUI_MON_INVERT 0x02 /* invert the characters */ +#define GUI_MON_IS_CURSOR 0x04 /* drawing cursor */ +#define GUI_MON_TRS_CURSOR 0x08 /* drawing transparent cursor */ +#define GUI_MON_NOCLEAR 0x10 /* don't clear selection */ + +/* Flags for gui_mch_draw_string() */ +#define DRAW_TRANSP 0x01 /* draw with transparent bg */ +#define DRAW_BOLD 0x02 /* draw bold text */ +#define DRAW_UNDERL 0x04 /* draw underline text */ +#define DRAW_UNDERC 0x08 /* draw undercurl text */ +#if defined(FEAT_GUI_GTK) +# define DRAW_ITALIC 0x10 /* draw italic text */ +#endif +#define DRAW_CURSOR 0x20 /* drawing block cursor (win32) */ +#define DRAW_STRIKE 0x40 /* strikethrough */ + +/* For our own tearoff menu item */ +#define TEAR_STRING "-->Detach" +#define TEAR_LEN (9) /* length of above string */ + +/* for the toolbar */ +#define TOOLBAR_BUTTON_HEIGHT 18 +#define TOOLBAR_BUTTON_WIDTH 18 +#define TOOLBAR_BORDER_HEIGHT 12 /* room above+below buttons for MSWindows */ + +#ifdef FEAT_GUI_MSWIN +# define TABLINE_HEIGHT 22 +#endif +#ifdef FEAT_GUI_MOTIF +# define TABLINE_HEIGHT 30 +#endif + +#if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) +# define NO_CONSOLE_INPUT /* use no_console_input() to check if there + is no console input possible */ +#endif + +typedef struct GuiScrollbar +{ + long ident; /* Unique identifier for each scrollbar */ + win_T *wp; /* Scrollbar's window, NULL for bottom */ + int type; /* one of SBAR_{LEFT,RIGHT,BOTTOM} */ + long value; /* Represents top line number visible */ +#ifdef FEAT_GUI_ATHENA + int pixval; /* pixel count of value */ +#endif + long size; /* Size of scrollbar thumb */ + long max; /* Number of lines in buffer */ + + /* Values measured in characters: */ + int top; /* Top of scroll bar (chars from row 0) */ + int height; /* Current height of scroll bar in rows */ + int width; /* Current width of scroll bar in cols */ + int status_height; /* Height of status line */ +#ifdef FEAT_GUI_X11 + Widget id; /* Id of real scroll bar */ +#endif +#ifdef FEAT_GUI_GTK + GtkWidget *id; /* Id of real scroll bar */ + unsigned long handler_id; /* Id of "value_changed" signal handler */ +#endif + +#ifdef FEAT_GUI_MSWIN + HWND id; /* Id of real scroll bar */ + int scroll_shift; /* The scrollbar stuff can handle only up to + 32767 lines. When the file is longer, + scroll_shift is set to the number of shifts + to reduce the count. */ +#endif +#ifdef FEAT_GUI_MAC + ControlHandle id; /* A handle to the scrollbar */ +#endif +#ifdef FEAT_GUI_PHOTON + PtWidget_t *id; +#endif +} scrollbar_T; + +typedef long guicolor_T; /* handle for a GUI color; for X11 this should + be "Pixel", but that's an unsigned and we + need a signed value */ +#define INVALCOLOR (guicolor_T)-11111 /* number for invalid color; on 32 bit + displays there is a tiny chance this is an + actual color */ +#define CTERMCOLOR (guicolor_T)-11110 /* only used for cterm.bg_rgb and + cterm.fg_rgb: use cterm color */ + +#ifdef FEAT_GUI_GTK + typedef PangoFontDescription *GuiFont; /* handle for a GUI font */ + typedef PangoFontDescription *GuiFontset; /* handle for a GUI fontset */ +# define NOFONT (GuiFont)NULL +# define NOFONTSET (GuiFontset)NULL +#else +# ifdef FEAT_GUI_PHOTON + typedef char *GuiFont; + typedef char *GuiFontset; +# define NOFONT (GuiFont)NULL +# define NOFONTSET (GuiFontset)NULL +# else +# ifdef FEAT_GUI_X11 + typedef XFontStruct *GuiFont; /* handle for a GUI font */ + typedef XFontSet GuiFontset; /* handle for a GUI fontset */ +# define NOFONT (GuiFont)0 +# define NOFONTSET (GuiFontset)0 +# else + typedef long_u GuiFont; /* handle for a GUI font */ + typedef long_u GuiFontset; /* handle for a GUI fontset */ +# define NOFONT (GuiFont)0 +# define NOFONTSET (GuiFontset)0 +# endif +# endif +#endif + +typedef struct Gui +{ + int in_focus; /* Vim has input focus */ + int in_use; /* Is the GUI being used? */ + int starting; /* GUI will start in a little while */ + int shell_created; /* Has the shell been created yet? */ + int dying; /* Is vim dying? Then output to terminal */ + int dofork; /* Use fork() when GUI is starting */ + int dragged_sb; /* Which scrollbar being dragged, if any? */ + win_T *dragged_wp; /* Which WIN's sb being dragged, if any? */ + int pointer_hidden; /* Is the mouse pointer hidden? */ + int col; /* Current cursor column in GUI display */ + int row; /* Current cursor row in GUI display */ + int cursor_col; /* Physical cursor column in GUI display */ + int cursor_row; /* Physical cursor row in GUI display */ + char cursor_is_valid; /* There is a cursor at cursor_row/col */ + int num_cols; /* Number of columns */ + int num_rows; /* Number of rows */ + int scroll_region_top; /* Top (first) line of scroll region */ + int scroll_region_bot; /* Bottom (last) line of scroll region */ + int scroll_region_left; /* Left (first) column of scroll region */ + int scroll_region_right; /* Right (last) col. of scroll region */ + int highlight_mask; /* Highlight attribute mask */ + int scrollbar_width; /* Width of vertical scrollbars */ + int scrollbar_height; /* Height of horizontal scrollbar */ + int left_sbar_x; /* Calculated x coord for left scrollbar */ + int right_sbar_x; /* Calculated x coord for right scrollbar */ + +#ifdef FEAT_MENU +# ifndef FEAT_GUI_GTK + int menu_height; /* Height of the menu bar */ + int menu_width; /* Width of the menu bar */ +# endif + char menu_is_active; /* TRUE if menu is present */ +# ifdef FEAT_GUI_ATHENA + char menu_height_fixed; /* TRUE if menu height fixed */ +# endif +#endif + + scrollbar_T bottom_sbar; /* Bottom scrollbar */ + int which_scrollbars[3];/* Which scrollbar boxes are active? */ + int prev_wrap; /* For updating the horizontal scrollbar */ + int char_width; /* Width of char cell in pixels */ + int char_height; /* Height of char cell in pixels, includes + 'linespace' */ + int char_ascent; /* Ascent of char in pixels */ + int border_width; /* Width of our border around text area */ + int border_offset; /* Total pixel offset for all borders */ + + GuiFont norm_font; /* Normal font */ +#ifndef FEAT_GUI_GTK + GuiFont bold_font; /* Bold font */ + GuiFont ital_font; /* Italic font */ + GuiFont boldital_font; /* Bold-Italic font */ +#else + int font_can_bold; /* Whether norm_font supports bold weight. + * The styled font variants are not used. */ +#endif + +#if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK) +# ifdef FONTSET_ALWAYS + GuiFontset menu_fontset; /* set of fonts for multi-byte chars */ +# else + GuiFont menu_font; /* menu item font */ +# endif +#endif + GuiFont wide_font; /* Normal 'guifontwide' font */ +#ifndef FEAT_GUI_GTK + GuiFont wide_bold_font; /* Bold 'guifontwide' font */ + GuiFont wide_ital_font; /* Italic 'guifontwide' font */ + GuiFont wide_boldital_font; /* Bold-Italic 'guifontwide' font */ +#endif +#ifdef FEAT_XFONTSET + GuiFontset fontset; /* set of fonts for multi-byte chars */ +#endif + guicolor_T back_pixel; /* Color of background */ + guicolor_T norm_pixel; /* Color of normal text */ + guicolor_T def_back_pixel; /* default Color of background */ + guicolor_T def_norm_pixel; /* default Color of normal text */ + +#ifdef FEAT_GUI_X11 + char *rsrc_menu_fg_name; /* Color of menu & dialog foreground */ + guicolor_T menu_fg_pixel; /* Same in Pixel format */ + char *rsrc_menu_bg_name; /* Color of menu & dialog background */ + guicolor_T menu_bg_pixel; /* Same in Pixel format */ + char *rsrc_scroll_fg_name; /* Color of scrollbar foreground */ + guicolor_T scroll_fg_pixel; /* Same in Pixel format */ + char *rsrc_scroll_bg_name; /* Color of scrollbar background */ + guicolor_T scroll_bg_pixel; /* Same in Pixel format */ + +# ifdef FEAT_GUI_MOTIF + guicolor_T menu_def_fg_pixel; /* Default menu foreground */ + guicolor_T menu_def_bg_pixel; /* Default menu background */ + guicolor_T scroll_def_fg_pixel; /* Default scrollbar foreground */ + guicolor_T scroll_def_bg_pixel; /* Default scrollbar background */ +# endif + Display *dpy; /* X display */ + Window wid; /* Window id of text area */ + int visibility; /* Is shell partially/fully obscured? */ + GC text_gc; + GC back_gc; + GC invert_gc; + Cursor blank_pointer; /* Blank pointer */ + + /* X Resources */ + char_u *rsrc_font_name; /* Resource font name, used if 'guifont' + not set */ + char_u *rsrc_bold_font_name; /* Resource bold font name */ + char_u *rsrc_ital_font_name; /* Resource italic font name */ + char_u *rsrc_boldital_font_name; /* Resource bold-italic font name */ + char_u *rsrc_menu_font_name; /* Resource menu Font name */ + Bool rsrc_rev_video; /* Use reverse video? */ + + char_u *geom; /* Geometry, eg "80x24" */ + Bool color_approx; /* Some color was approximated */ +#endif + +#ifdef FEAT_GUI_GTK +# ifndef USE_GTK3 + int visibility; /* Is shell partially/fully obscured? */ +# endif + GdkCursor *blank_pointer; /* Blank pointer */ + + /* X Resources */ + char_u *geom; /* Geometry, eg "80x24" */ + + GtkWidget *mainwin; /* top level GTK window */ + GtkWidget *formwin; /* manages all the windows below */ + GtkWidget *drawarea; /* the "text" area */ +# ifdef FEAT_MENU + GtkWidget *menubar; /* menubar */ +# endif +# ifdef FEAT_TOOLBAR + GtkWidget *toolbar; /* toolbar */ +# endif +# ifdef FEAT_GUI_GNOME + GtkWidget *menubar_h; /* menubar handle */ + GtkWidget *toolbar_h; /* toolbar handle */ +# endif +# ifdef USE_GTK3 + GdkRGBA *fgcolor; /* GDK-styled foreground color */ + GdkRGBA *bgcolor; /* GDK-styled background color */ + GdkRGBA *spcolor; /* GDK-styled special color */ +# else + GdkColor *fgcolor; /* GDK-styled foreground color */ + GdkColor *bgcolor; /* GDK-styled background color */ + GdkColor *spcolor; /* GDK-styled special color */ +# endif +# ifdef USE_GTK3 + cairo_surface_t *surface; /* drawarea surface */ + gboolean by_signal; /* cause of draw operation */ +# else + GdkGC *text_gc; /* cached GC for normal text */ +# endif + PangoContext *text_context; /* the context used for all text */ + PangoFont *ascii_font; /* cached font for ASCII strings */ + PangoGlyphString *ascii_glyphs; /* cached code point -> glyph map */ +# ifdef FEAT_GUI_TABLINE + GtkWidget *tabline; /* tab pages line handle */ +# endif + + GtkAccelGroup *accel_group; + GtkWidget *filedlg; /* file selection dialog */ + char_u *browse_fname; /* file name from filedlg */ + + guint32 event_time; +#endif /* FEAT_GUI_GTK */ + +#if defined(FEAT_GUI_TABLINE) \ + && (defined(FEAT_GUI_W32) || defined(FEAT_GUI_MOTIF) \ + || defined(FEAT_GUI_MAC)) + int tabline_height; +#endif + +#ifdef FEAT_FOOTER + int footer_height; /* height of the message footer */ +#endif + +#if defined(FEAT_TOOLBAR) \ + && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) + int toolbar_height; /* height of the toolbar */ +#endif + +#ifdef FEAT_BEVAL_TIP + /* Tooltip properties; also used for balloon evaluation */ + char_u *rsrc_tooltip_font_name; /* tooltip font name */ + char *rsrc_tooltip_fg_name; /* tooltip foreground color name */ + char *rsrc_tooltip_bg_name; /* tooltip background color name */ + guicolor_T tooltip_fg_pixel; /* tooltip foreground color */ + guicolor_T tooltip_bg_pixel; /* tooltip background color */ + XFontSet tooltip_fontset; /* tooltip fontset */ +#endif + +#ifdef FEAT_GUI_MSWIN + GuiFont currFont; /* Current font */ + guicolor_T currFgColor; /* Current foreground text color */ + guicolor_T currBgColor; /* Current background text color */ + guicolor_T currSpColor; /* Current special text color */ +#endif + +#ifdef FEAT_GUI_MAC + WindowPtr VimWindow; + MenuHandle MacOSHelpMenu; /* Help menu provided by the MacOS */ + int MacOSHelpItems; /* Nr of help-items supplied by MacOS */ + WindowPtr wid; /* Window id of text area */ + int visibility; /* Is window partially/fully obscured? */ +#endif + +#ifdef FEAT_GUI_PHOTON + PtWidget_t *vimWindow; /* PtWindow */ + PtWidget_t *vimTextArea; /* PtRaw */ + PtWidget_t *vimContainer; /* PtPanel */ +# if defined(FEAT_MENU) || defined(FEAT_TOOLBAR) + PtWidget_t *vimToolBarGroup; +# endif +# ifdef FEAT_MENU + PtWidget_t *vimMenuBar; +# endif +# ifdef FEAT_TOOLBAR + PtWidget_t *vimToolBar; + int toolbar_height; +# endif + PhEvent_t *event_buffer; +#endif + +#ifdef FEAT_XIM + char *rsrc_input_method; + char *rsrc_preedit_type_name; +#endif +} gui_T; + +extern gui_T gui; /* this is defined in gui.c */ + +/* definitions of available window positionings for gui_*_position_in_parent() + */ +typedef enum +{ + VW_POS_MOUSE, + VW_POS_CENTER, + VW_POS_TOP_CENTER +} gui_win_pos_T; + +#ifdef FIND_REPLACE_DIALOG +/* + * Flags used to distinguish the different contexts in which the + * find/replace callback may be called. + */ +# define FRD_FINDNEXT 1 /* Find next in find dialog */ +# define FRD_R_FINDNEXT 2 /* Find next in repl dialog */ +# define FRD_REPLACE 3 /* Replace once */ +# define FRD_REPLACEALL 4 /* Replace remaining matches */ +# define FRD_UNDO 5 /* Undo replaced text */ +# define FRD_TYPE_MASK 7 /* Mask for the callback type */ +/* Flags which change the way searching is done. */ +# define FRD_WHOLE_WORD 0x08 /* match whole word only */ +# define FRD_MATCH_CASE 0x10 /* match case */ +#endif + +#ifdef FEAT_GUI_GTK +/* + * Convenience macros to convert from 'encoding' to 'termencoding' and + * vice versa. If no conversion is necessary the passed-in pointer is + * returned as is, without allocating any memory. Thus additional _FREE() + * macros are provided. The _FREE() macros also set the pointer to NULL, + * in order to avoid bugs due to illegal memory access only happening if + * 'encoding' != utf-8... + * + * Defining these macros as pure expressions looks a bit tricky but + * avoids depending on the context of the macro expansion. One of the + * rare occasions where the comma operator comes in handy :) + * + * Note: Do NOT keep the result around when handling control back to + * the main Vim! The user could change 'encoding' at any time. + */ +# define CONVERT_TO_UTF8(String) \ + ((output_conv.vc_type == CONV_NONE || (String) == NULL) \ + ? (String) \ + : string_convert(&output_conv, (String), NULL)) + +# define CONVERT_TO_UTF8_FREE(String) \ + ((String) = ((output_conv.vc_type == CONV_NONE) \ + ? (char_u *)NULL \ + : (vim_free(String), (char_u *)NULL))) + +# define CONVERT_FROM_UTF8(String) \ + ((input_conv.vc_type == CONV_NONE || (String) == NULL) \ + ? (String) \ + : string_convert(&input_conv, (String), NULL)) + +# define CONVERT_FROM_UTF8_FREE(String) \ + ((String) = ((input_conv.vc_type == CONV_NONE) \ + ? (char_u *)NULL \ + : (vim_free(String), (char_u *)NULL))) + +#else +# define CONVERT_TO_UTF8(String) (String) +# define CONVERT_TO_UTF8_FREE(String) ((String) = (char_u *)NULL) +# define CONVERT_FROM_UTF8(String) (String) +# define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL) +#endif /* FEAT_GUI_GTK */ + +#ifdef FEAT_GUI_GTK +/* + * The second parameter of g_signal_handlers_disconnect_by_func() is supposed + * to be a function pointer which was passed to g_signal_connect_*() somewhere + * previously, and hence it must be of type GCallback, i.e., void (*)(void). + * + * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling + * g_signal_handlers_disconnect_matched(), and the second parameter of the + * former is to be passed to the sixth parameter of the latter the type of + * which, however, is declared as void * in the function signature. + * + * While the ISO C Standard does not require that function pointers be + * interconvertible to void *, widely-used compilers such as gcc and clang + * do such conversion implicitly and automatically on some platforms without + * issuing any warning. + * + * For Solaris Studio, that is not the case. An explicit type cast is needed + * to suppress warnings on that particular conversion. + */ +# if defined(__SUNPRO_C) && defined(USE_GTK3) +# define FUNC2GENERIC(func) (void *)(func) +# else +# define FUNC2GENERIC(func) G_CALLBACK(func) +# endif +#endif /* FEAT_GUI_GTK */ + +#if defined(UNIX) && !defined(FEAT_GUI_MAC) +# define GUI_MAY_FORK +#endif |