diff options
Diffstat (limited to 'src/nvim/plines.h')
-rw-r--r-- | src/nvim/plines.h | 101 |
1 files changed, 86 insertions, 15 deletions
diff --git a/src/nvim/plines.h b/src/nvim/plines.h index 6aede88c8b..658206e1be 100644 --- a/src/nvim/plines.h +++ b/src/nvim/plines.h @@ -3,26 +3,97 @@ #include <stdbool.h> #include <stdint.h> -#include "nvim/buffer_defs.h" -#include "nvim/marktree.h" -#include "nvim/pos_defs.h" // IWYU pragma: keep +#include "nvim/func_attr.h" +#include "nvim/marktree_defs.h" +#include "nvim/pos_defs.h" +#include "nvim/types_defs.h" -/// Argument for lbr_chartabsize(). +typedef bool CSType; + +enum { + kCharsizeRegular, + kCharsizeFast, +}; + +/// Argument for char size functions. typedef struct { - win_T *cts_win; - char *cts_line; ///< start of the line - char *cts_ptr; ///< current position in line - int cts_row; + win_T *win; + char *line; ///< Start of the line. + + bool use_tabstop; ///< Use 'tabstop' instead of char2cells() for a TAB. + int indent_width; ///< Width of 'showbreak' and 'breakindent' on wrapped + ///< parts of lines, INT_MIN if not yet calculated. - bool cts_has_virt_text; ///< true if if there is inline virtual text - int cts_cur_text_width_left; ///< width of virtual text left of cursor - int cts_cur_text_width_right; ///< width of virtual text right of cursor - MarkTreeIter cts_iter[1]; + int virt_row; ///< Row for virtual text, -1 if no virtual text. + int cur_text_width_left; ///< Width of virtual text left of cursor. + int cur_text_width_right; ///< Width of virtual text right of cursor. - int cts_vcol; ///< virtual column at current position - int cts_max_head_vcol; ///< see win_lbr_chartabsize() -} chartabsize_T; + int max_head_vcol; ///< See charsize_regular(). + MarkTreeIter iter[1]; +} CharsizeArg; + +typedef struct { + int width; + int head; ///< Size of 'breakindent' etc. before the character (included in width). +} CharSize; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "plines.h.generated.h" #endif + +static inline CharSize win_charsize(CSType cstype, int vcol, char *ptr, int32_t chr, + CharsizeArg *csarg) + REAL_FATTR_NONNULL_ALL REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_ALWAYS_INLINE; + +/// Get the number of cells taken up on the screen by the given character at vcol. +/// "csarg->cur_text_width_left" and "csarg->cur_text_width_right" are set +/// to the extra size for inline virtual text. +/// +/// When "csarg->max_head_vcol" is positive, only count in "head" the size +/// of 'showbreak'/'breakindent' before "csarg->max_head_vcol". +/// When "csarg->max_head_vcol" is negative, only count in "head" the size +/// of 'showbreak'/'breakindent' before where cursor should be placed. +static inline CharSize win_charsize(CSType cstype, int vcol, char *ptr, int32_t chr, + CharsizeArg *csarg) +{ + if (cstype == kCharsizeFast) { + return charsize_fast(csarg, vcol, chr); + } else { + return charsize_regular(csarg, ptr, vcol, chr); + } +} + +static inline int linetabsize_str(char *s) + REAL_FATTR_NONNULL_ALL REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_ALWAYS_INLINE; + +/// Return the number of cells the string "s" will take on the screen, +/// taking into account the size of a tab. +/// +/// @param s +/// +/// @return Number of cells the string will take on the screen. +static inline int linetabsize_str(char *s) +{ + return linetabsize_col(0, s); +} + +static inline int win_linetabsize(win_T *wp, linenr_T lnum, char *line, colnr_T len) + REAL_FATTR_NONNULL_ALL REAL_FATTR_WARN_UNUSED_RESULT REAL_FATTR_ALWAYS_INLINE; + +/// Like linetabsize_str(), but for a given window instead of the current one. +/// +/// @param wp +/// @param line +/// @param len +/// +/// @return Number of cells the string will take on the screen. +static inline int win_linetabsize(win_T *wp, linenr_T lnum, char *line, colnr_T len) +{ + CharsizeArg csarg; + CSType const cstype = init_charsize_arg(&csarg, wp, lnum, line); + if (cstype == kCharsizeFast) { + return linesize_fast(&csarg, 0, len); + } else { + return linesize_regular(&csarg, 0, len); + } +} |