diff options
| author | Björn Linse <bjorn.linse@gmail.com> | 2020-01-16 15:31:05 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-16 15:31:05 +0100 | 
| commit | 6e78b2162382718b638c4532a155e5c3f9ed7515 (patch) | |
| tree | 5868096a30a61deed1765e1c9ec93072a4d0c34b /src/nvim/screen.c | |
| parent | 8ba3354d74a8f90ded0997100bdbe845a8c5382f (diff) | |
| parent | ca1a00edd6d6345b848a28d077d6a192528f811e (diff) | |
| download | rneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.tar.gz rneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.tar.bz2 rneovim-6e78b2162382718b638c4532a155e5c3f9ed7515.zip  | |
Merge pull request #11563 from bfredl/mark_madness
extmarks: mark sanity/madness
Diffstat (limited to 'src/nvim/screen.c')
| -rw-r--r-- | src/nvim/screen.c | 59 | 
1 files changed, 37 insertions, 22 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c index 0612575e67..24ad012201 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -87,6 +87,7 @@  #include "nvim/highlight.h"  #include "nvim/main.h"  #include "nvim/mark.h" +#include "nvim/mark_extended.h"  #include "nvim/mbyte.h"  #include "nvim/memline.h"  #include "nvim/memory.h" @@ -622,6 +623,9 @@ bool win_cursorline_standout(const win_T *wp)      || (wp->w_p_cole > 0 && (VIsual_active || !conceal_cursor_line(wp)));  } +static DecorationState decorations; +bool decorations_active = false; +  /*   * Update a single window.   * @@ -1221,6 +1225,7 @@ static void win_update(win_T *wp)                           : (wp->w_topline + wp->w_height_inner));      args.items[0] = WINDOW_OBJ(wp->handle);      args.items[1] = BUFFER_OBJ(buf->handle); +    // TODO(bfredl): we are not using this, but should be first drawn line?      args.items[2] = INTEGER_OBJ(wp->w_topline-1);      args.items[3] = INTEGER_OBJ(knownmax);      // TODO(bfredl): we could allow this callback to change mod_top, mod_bot. @@ -1232,6 +1237,8 @@ static void win_update(win_T *wp)      }    } +  decorations_active = extmark_decorations_reset(buf, &decorations); +    for (;; ) {      /* stop updating when reached the end of the window (check for _past_       * the end of the window is at the end of the loop) */ @@ -2250,8 +2257,7 @@ win_line (    int prev_c1 = 0;                      // first composing char for prev_c    bool search_attr_from_match = false;  // if search_attr is from :match -  BufhlLineInfo bufhl_info;             // bufhl data for this line -  bool has_bufhl = false;               // this buffer has highlight matches +  bool has_decorations = false;         // this buffer has decorations    bool do_virttext = false;             // draw virtual text for this line    /* draw_state: items that are drawn in sequence: */ @@ -2315,14 +2321,12 @@ win_line (        }      } -    if (bufhl_start_line(wp->w_buffer, lnum, &bufhl_info)) { -      if (kv_size(bufhl_info.line->items)) { -        has_bufhl = true; +    if (decorations_active) { +      has_decorations = extmark_decorations_line(wp->w_buffer, lnum-1, +                                                 &decorations); +      if (has_decorations) {          extra_check = true;        } -      if (kv_size(bufhl_info.line->virt_text)) { -        do_virttext = true; -      }      }      // Check for columns to display for 'colorcolumn'. @@ -3515,19 +3519,25 @@ win_line (              char_attr = hl_combine_attr(spell_attr, char_attr);          } -        if (has_bufhl && v > 0) { -          int bufhl_attr = bufhl_get_attr(&bufhl_info, (colnr_T)v); -          if (bufhl_attr != 0) { +        if (has_decorations && v > 0) { +          int extmark_attr = extmark_decorations_col(wp->w_buffer, (colnr_T)v-1, +                                                     &decorations); +          if (extmark_attr != 0) {              if (!attr_pri) { -              char_attr = hl_combine_attr(char_attr, bufhl_attr); +              char_attr = hl_combine_attr(char_attr, extmark_attr);              } else { -              char_attr = hl_combine_attr(bufhl_attr, char_attr); +              char_attr = hl_combine_attr(extmark_attr, char_attr);              }            }          } +        // TODO(bfredl): luahl should reuse the "active decorations" buffer          if (buf->b_luahl && v > 0 && v < (long)lua_attr_bufsize+1) { -          char_attr = hl_combine_attr(char_attr, lua_attr_buf[v-1]); +          if (!attr_pri) { +            char_attr = hl_combine_attr(char_attr, lua_attr_buf[v-1]); +          } else { +            char_attr = hl_combine_attr(lua_attr_buf[v-1], char_attr); +          }          }          if (wp->w_buffer->terminal) { @@ -4008,6 +4018,19 @@ win_line (        if (draw_color_col)          draw_color_col = advance_color_col(VCOL_HLC, &color_cols); +      VirtText virt_text = KV_INITIAL_VALUE; +      if (luatext) { +        kv_push(virt_text, ((VirtTextChunk){ .text = luatext, .hl_id = 0 })); +        do_virttext = true; +      } else if (has_decorations) { +        VirtText *vp = extmark_decorations_virt_text(wp->w_buffer, +                                                     &decorations); +        if (vp) { +          virt_text = *vp; +          do_virttext = true; +        } +      } +        if (((wp->w_p_cuc              && (int)wp->w_virtcol >= VCOL_HLC - eol_hl_off              && (int)wp->w_virtcol < @@ -4018,14 +4041,6 @@ win_line (          int rightmost_vcol = 0;          int i; -        VirtText virt_text; -        if (luatext) { -          virt_text = (VirtText)KV_INITIAL_VALUE; -          kv_push(virt_text, ((VirtTextChunk){ .text = luatext, .hl_id = 0 })); -        } else { -          virt_text = do_virttext ? bufhl_info.line->virt_text -                                  : (VirtText)KV_INITIAL_VALUE; -        }          size_t virt_pos = 0;          LineState s = LINE_STATE((char_u *)"");          int virt_attr = 0;  | 
