diff options
author | luukvbaal <31730729+luukvbaal@users.noreply.github.com> | 2022-11-07 04:10:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-06 19:10:09 -0800 |
commit | 9f125371e08f4bbb38b84f323608d01d35895a3a (patch) | |
tree | 77d9a26a6812f2e9baf3225d531722de1e994717 | |
parent | ce198102bda11552397181eab044b10c96645dbd (diff) | |
download | rneovim-9f125371e08f4bbb38b84f323608d01d35895a3a.tar.gz rneovim-9f125371e08f4bbb38b84f323608d01d35895a3a.tar.bz2 rneovim-9f125371e08f4bbb38b84f323608d01d35895a3a.zip |
refactor: click definition functions #20923
Need this part of `win_redr_custom()` in `drawline.c` for #20621.
Another refactor is pending in https://github.com/vim/vim/pull/11467
-rw-r--r-- | src/nvim/screen.c | 43 | ||||
-rw-r--r-- | src/nvim/statusline.c | 45 |
2 files changed, 48 insertions, 40 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c index cd1d6553cb..377927ba4d 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -598,6 +598,49 @@ void stl_clear_click_defs(StlClickDefinition *const click_defs, const long click } } +/// Allocate or resize the click definitions array if needed. +StlClickDefinition *stl_alloc_click_defs(StlClickDefinition *cdp, long width, size_t *size) +{ + if (*size < (size_t)width) { + xfree(cdp); + *size = (size_t)width; + cdp = xcalloc(*size, sizeof(StlClickDefinition)); + } + return cdp; +} + +/// Fill the click definitions array if needed. +void stl_fill_click_defs(StlClickDefinition *click_defs, StlClickRecord *click_recs, char *buf, + int width, bool tabline) +{ + if (click_defs == NULL) { + return; + } + + int col = 0; + int len = 0; + + StlClickDefinition cur_click_def = { + .type = kStlClickDisabled, + }; + for (int i = 0; click_recs[i].start != NULL; i++) { + len += vim_strnsize(buf, (int)(click_recs[i].start - buf)); + while (col < len) { + click_defs[col++] = cur_click_def; + } + buf = (char *)click_recs[i].start; + cur_click_def = click_recs[i].def; + if (!tabline && !(cur_click_def.type == kStlClickDisabled + || cur_click_def.type == kStlClickFuncRun)) { + // window bar and status line only support click functions + cur_click_def.type = kStlClickDisabled; + } + } + while (col < width) { + click_defs[col++] = cur_click_def; + } +} + /// Set cursor to its position in the current window. void setcursor(void) { diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c index fb49a1b6a7..71f9bde2e9 100644 --- a/src/nvim/statusline.c +++ b/src/nvim/statusline.c @@ -470,26 +470,16 @@ void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) attr = (wp == curwin) ? win_hl_attr(wp, HLF_WBR) : win_hl_attr(wp, HLF_WBRNC); maxwidth = wp->w_width_inner; use_sandbox = was_set_insecurely(wp, "winbar", 0); - stl_clear_click_defs(wp->w_winbar_click_defs, (long)wp->w_winbar_click_defs_size); - // Allocate / resize the click definitions array for winbar if needed. - if (wp->w_winbar_height && wp->w_winbar_click_defs_size < (size_t)maxwidth) { - xfree(wp->w_winbar_click_defs); - wp->w_winbar_click_defs_size = (size_t)maxwidth; - wp->w_winbar_click_defs = xcalloc(wp->w_winbar_click_defs_size, sizeof(StlClickRecord)); - } + wp->w_winbar_click_defs = stl_alloc_click_defs(wp->w_winbar_click_defs, maxwidth, + &wp->w_winbar_click_defs_size); } else { row = is_stl_global ? (Rows - (int)p_ch - 1) : W_ENDROW(wp); fillchar = fillchar_status(&attr, wp); maxwidth = is_stl_global ? Columns : wp->w_width; - stl_clear_click_defs(wp->w_status_click_defs, (long)wp->w_status_click_defs_size); - // Allocate / resize the click definitions array for statusline if needed. - if (wp->w_status_click_defs_size < (size_t)maxwidth) { - xfree(wp->w_status_click_defs); - wp->w_status_click_defs_size = (size_t)maxwidth; - wp->w_status_click_defs = xcalloc(wp->w_status_click_defs_size, sizeof(StlClickRecord)); - } + wp->w_status_click_defs = stl_alloc_click_defs(wp->w_status_click_defs, maxwidth, + &wp->w_status_click_defs_size); if (draw_ruler) { stl = p_ruf; @@ -597,32 +587,7 @@ void win_redr_custom(win_T *wp, bool draw_winbar, bool draw_ruler) : draw_winbar ? wp->w_winbar_click_defs : wp->w_status_click_defs; - if (click_defs == NULL) { - goto theend; - } - - col = 0; - len = 0; - p = buf; - StlClickDefinition cur_click_def = { - .type = kStlClickDisabled, - }; - for (n = 0; tabtab[n].start != NULL; n++) { - len += vim_strnsize(p, (int)(tabtab[n].start - p)); - while (col < len) { - click_defs[col++] = cur_click_def; - } - p = (char *)tabtab[n].start; - cur_click_def = tabtab[n].def; - if ((wp != NULL) && !(cur_click_def.type == kStlClickDisabled - || cur_click_def.type == kStlClickFuncRun)) { - // window bar and status line only support click functions - cur_click_def.type = kStlClickDisabled; - } - } - while (col < maxwidth) { - click_defs[col++] = cur_click_def; - } + stl_fill_click_defs(click_defs, tabtab, buf, maxwidth, wp == NULL); theend: entered = false; |