diff options
Diffstat (limited to 'src/nvim/decoration.h')
-rw-r--r-- | src/nvim/decoration.h | 125 |
1 files changed, 43 insertions, 82 deletions
diff --git a/src/nvim/decoration.h b/src/nvim/decoration.h index c9ec8ede7f..f5448c051b 100644 --- a/src/nvim/decoration.h +++ b/src/nvim/decoration.h @@ -1,120 +1,81 @@ -#ifndef NVIM_DECORATION_H -#define NVIM_DECORATION_H +#pragma once #include <stdbool.h> -#include <stddef.h> +#include <stddef.h> // IWYU pragma: keep #include <stdint.h> #include "klib/kvec.h" #include "nvim/buffer_defs.h" -#include "nvim/extmark_defs.h" -#include "nvim/macros.h" +#include "nvim/decoration_defs.h" // IWYU pragma: export +#include "nvim/macros_defs.h" #include "nvim/marktree.h" -#include "nvim/pos.h" -#include "nvim/types.h" +#include "nvim/pos_defs.h" // IWYU pragma: keep +#include "nvim/types_defs.h" -// actual Decoration data is in extmark_defs.h +// actual Decor* data is in decoration_defs.h -typedef uint16_t DecorPriority; -#define DECOR_PRIORITY_BASE 0x1000 +EXTERN const char *const virt_text_pos_str[] INIT( = { "eol", "overlay", "win_col", "right_align", + "inline" }); -typedef enum { - kVTEndOfLine, - kVTOverlay, - kVTWinCol, - kVTRightAlign, -} VirtTextPos; - -EXTERN const char *const virt_text_pos_str[] INIT(= { "eol", "overlay", "win_col", "right_align" }); +EXTERN const char *const hl_mode_str[] INIT( = { "", "replace", "combine", "blend" }); typedef enum { - kHlModeUnknown, - kHlModeReplace, - kHlModeCombine, - kHlModeBlend, -} HlMode; - -EXTERN const char *const hl_mode_str[] INIT(= { "", "replace", "combine", "blend" }); - -#define VIRTTEXT_EMPTY ((VirtText)KV_INITIAL_VALUE) - -typedef kvec_t(struct virt_line { VirtText line; bool left_col; }) VirtLines; - -struct Decoration { - VirtText virt_text; - VirtLines virt_lines; - - int hl_id; // highlight group - VirtTextPos virt_text_pos; - HlMode hl_mode; - - // TODO(bfredl): at some point turn this into FLAGS - bool virt_text_hide; - bool hl_eol; - bool virt_lines_above; - bool conceal; - TriState spell; - // TODO(bfredl): style, etc - DecorPriority priority; - int col; // fixed col value, like win_col - int virt_text_width; // width of virt_text - char *sign_text; - int sign_hl_id; - int number_hl_id; - int line_hl_id; - int cursorline_hl_id; - // TODO(bfredl): in principle this should be a schar_T, but we - // probably want some kind of glyph cache for that.. - int conceal_char; - bool ui_watched; // watched for win_extmark -}; -#define DECORATION_INIT { KV_INITIAL_VALUE, KV_INITIAL_VALUE, 0, kVTEndOfLine, \ - kHlModeUnknown, false, false, false, false, kNone, \ - DECOR_PRIORITY_BASE, 0, 0, NULL, 0, 0, 0, 0, 0, false } + kDecorKindHighlight, + kDecorKindSign, + kDecorKindVirtText, + kDecorKindVirtLines, + kDecorKindUIWatched, +} DecorRangeKind; typedef struct { int start_row; int start_col; int end_row; int end_col; - Decoration decor; - int attr_id; // cached lookup of decor.hl_id - bool virt_text_owned; - int win_col; - uint64_t ns_id; - uint64_t mark_id; + // next pointers MUST NOT be used, these are separate ranges + // vt->next could be pointing to freelist memory at this point + union { + DecorSignHighlight sh; + DecorVirtText *vt; + struct { + uint32_t ns_id; + uint32_t mark_id; + VirtTextPos pos; + } ui; + } data; + int attr_id; // cached lookup of inl.hl_id if it was a highlight + bool owned; // ephemeral decoration, free memory immediately + DecorPriority priority; + DecorRangeKind kind; + /// Screen column to draw the virtual text. + /// When -1, the virtual text may be drawn after deciding where. + /// When -3, the virtual text should be drawn on the next screen line. + /// When -10, the virtual text has just been added. + /// When INT_MIN, the virtual text should no longer be drawn. + int draw_col; } DecorRange; typedef struct { MarkTreeIter itr[1]; kvec_t(DecorRange) active; - buf_T *buf; + win_T *win; int top_row; int row; int col_until; int current; int eol_col; - bool conceal; - int conceal_char; + int conceal; + schar_T conceal_char; int conceal_attr; TriState spell; -} DecorState; -EXTERN DecorState decor_state INIT(= { 0 }); + bool running_decor_provider; +} DecorState; -static inline bool decor_has_sign(Decoration *decor) -{ - return decor->sign_text - || decor->sign_hl_id - || decor->number_hl_id - || decor->line_hl_id - || decor->cursorline_hl_id; -} +EXTERN DecorState decor_state INIT( = { 0 }); #ifdef INCLUDE_GENERATED_DECLARATIONS # include "decoration.h.generated.h" #endif - -#endif // NVIM_DECORATION_H |