Mercurial > vim
view src/gui.h @ 26634:c75f70257cf5 v8.2.3846
patch 8.2.3846: no error when using control character for 'lcs' or 'fcs'
Commit: https://github.com/vim/vim/commit/60618c8f1a7ea55452837a446525272142286471
Author: zeertzjq <zeertzjq@outlook.com>
Date: Sat Dec 18 15:32:46 2021 +0000
patch 8.2.3846: no error when using control character for 'lcs' or 'fcs'
Problem: No error when using control character for 'lcs' or 'fcs'.
Solution: Use char2cells() to check the width. (closes https://github.com/vim/vim/issues/9369)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 18 Dec 2021 16:45:03 +0100 |
parents | 5a1850512676 |
children | 4482dd5f8869 |
line wrap: on
line source
/* 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 # include "gui_gtk_vms.h" # endif // VMS # include <X11/Intrinsic.h> # include <gtk/gtk.h> #endif #ifdef FEAT_GUI_HAIKU # include "gui_haiku.h" #endif // Needed when generating prototypes, since FEAT_GUI is always defined then. #if defined(FEAT_XCLIPBOARD) && !defined(FEAT_GUI_MOTIF) \ && !defined(FEAT_GUI_ATHENA) && !defined(FEAT_GUI_GTK) # include <X11/Intrinsic.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_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_HAIKU) # 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_MSWIN # 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 #if FEAT_GUI_HAIKU VimScrollBar *id; // Pointer to real scroll bar #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 #ifdef VIMDLL // Use spawn when GUI is starting. # define GUI_MAY_SPAWN // Uncomment the next definition if you want to use the `:gui` command on // Windows. It uses `:mksession` to inherit the session from vim.exe to // gvim.exe. So, it doesn't work perfectly. (EXPERIMENTAL) //# define EXPERIMENTAL_GUI_CMD #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 #ifdef GUI_MAY_SPAWN int dospawn; // Use spawn() when GUI is starting #endif 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 # 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; char_u ligatures_map[256]; // ascii map for characters 0-255, value is // 1 if in 'guiligatures' #endif // FEAT_GUI_GTK #if defined(FEAT_GUI_TABLINE) \ && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_HAIKU)) 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) || defined(FEAT_GUI_HAIKU)) 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_HAIKU VimApp *vimApp; VimWindow *vimWindow; VimFormView *vimForm; VimTextAreaView *vimTextArea; int vdcmp; // Vim Direct Communication Message Port #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) # define GUI_MAY_FORK #endif