aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/buffer.c
diff options
context:
space:
mode:
authorChristian Clason <c.clason@uni-graz.at>2022-02-12 19:40:44 +0100
committerGitHub <noreply@github.com>2022-02-12 19:40:44 +0100
commit05c3d02380770445983914dae1bf48e6ef37a6f6 (patch)
tree00246caffdcdb17e5318610fe39b317c08080e4f /src/nvim/buffer.c
parent7db0aa027cff8da11a3fe2c26267a059f35297d7 (diff)
parent50250542c346473dd3a91ce63cd989033dae4471 (diff)
downloadrneovim-05c3d02380770445983914dae1bf48e6ef37a6f6.tar.gz
rneovim-05c3d02380770445983914dae1bf48e6ef37a6f6.tar.bz2
rneovim-05c3d02380770445983914dae1bf48e6ef37a6f6.zip
Merge pull request #17383 from lewis6991/sign_eff
refactor(signs): more efficient signcol calc
Diffstat (limited to 'src/nvim/buffer.c')
-rw-r--r--src/nvim/buffer.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index ee704bd1bd..38b045b31c 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -5455,30 +5455,43 @@ bool find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp)
return false;
}
-int buf_signcols(buf_T *buf)
+static int buf_signcols_inner(buf_T *buf, int maximum)
{
- if (!buf->b_signcols_valid) {
- sign_entry_T *sign; // a sign in the sign list
- int signcols = 0;
- int linesum = 0;
- linenr_T curline = 0;
-
- FOR_ALL_SIGNS_IN_BUF(buf, sign) {
- if (sign->se_lnum > curline) {
- if (linesum > signcols) {
- signcols = linesum;
+ sign_entry_T *sign; // a sign in the sign list
+ int signcols = 0;
+ int linesum = 0;
+ linenr_T curline = 0;
+
+ FOR_ALL_SIGNS_IN_BUF(buf, sign) {
+ if (sign->se_lnum > curline) {
+ if (linesum > signcols) {
+ signcols = linesum;
+ if (signcols >= maximum) {
+ return maximum;
}
- curline = sign->se_lnum;
- linesum = 0;
- }
- if (sign->se_has_text_or_icon) {
- linesum++;
}
+ curline = sign->se_lnum;
+ linesum = 0;
+ }
+ if (sign->se_has_text_or_icon) {
+ linesum++;
}
- if (linesum > signcols) {
- signcols = linesum;
+ }
+
+ if (linesum > signcols) {
+ signcols = linesum;
+ if (signcols >= maximum) {
+ return maximum;
}
+ }
+
+ return signcols;
+}
+int buf_signcols(buf_T *buf, int maximum)
+{
+ if (!buf->b_signcols_valid) {
+ int signcols = buf_signcols_inner(buf, maximum);
// Check if we need to redraw
if (signcols != buf->b_signcols) {
buf->b_signcols = signcols;