]> granicus.if.org Git - vim/commitdiff
patch 8.1.0709: windows are updated for every added/deleted sign v8.1.0709
authorBram Moolenaar <Bram@vim.org>
Wed, 9 Jan 2019 20:47:30 +0000 (21:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 9 Jan 2019 20:47:30 +0000 (21:47 +0100)
Problem:    Windows are updated for every added/deleted sign.
Solution:   Do not call update_debug_sign().  Only redraw when the line with
            the sign is visible.  (idea from neovim #9479)

src/proto/screen.pro
src/screen.c
src/sign.c
src/version.c

index 665b772d90c91fbfc2c8f2463173c30dfccca16a..2e5f2e0bec91cbaa2903ea06f49786f78b5617bc 100644 (file)
@@ -5,6 +5,7 @@ void redraw_later_clear(void);
 void redraw_all_later(int type);
 void redraw_curbuf_later(int type);
 void redraw_buf_later(buf_T *buf, int type);
+void redraw_buf_line_later(buf_T *buf, linenr_T lnum);
 void redraw_buf_and_status_later(buf_T *buf, int type);
 int redraw_asap(int type);
 void redraw_after_callback(int call_update_screen);
index 880d78407bd412a63ba6f65f646d2e134299073d..926a09083c1427a2f82ff54dc882c35b78114a07 100644 (file)
@@ -263,6 +263,17 @@ redraw_buf_later(buf_T *buf, int type)
     }
 }
 
+    void
+redraw_buf_line_later(buf_T *buf, linenr_T lnum)
+{
+    win_T      *wp;
+
+    FOR_ALL_WINDOWS(wp)
+       if (wp->w_buffer == buf && lnum >= wp->w_topline
+                                                 && lnum < wp->w_botline)
+           redrawWinline(wp, lnum);
+}
+
     void
 redraw_buf_and_status_later(buf_T *buf, int type)
 {
@@ -978,26 +989,13 @@ update_debug_sign(buf_T *buf, linenr_T lnum)
     win_foldinfo.fi_level = 0;
 # endif
 
-    /* update/delete a specific mark */
+    // update/delete a specific sign
+    redraw_buf_line_later(buf, lnum);
+
+    // check if it resulted in the need to redraw a window
     FOR_ALL_WINDOWS(wp)
-    {
-       if (buf != NULL && lnum > 0)
-       {
-           if (wp->w_buffer == buf && lnum >= wp->w_topline
-                                                     && lnum < wp->w_botline)
-           {
-               if (wp->w_redraw_top == 0 || wp->w_redraw_top > lnum)
-                   wp->w_redraw_top = lnum;
-               if (wp->w_redraw_bot == 0 || wp->w_redraw_bot < lnum)
-                   wp->w_redraw_bot = lnum;
-               redraw_win_later(wp, VALID);
-           }
-       }
-       else
-           redraw_win_later(wp, VALID);
        if (wp->w_redr_type != 0)
            doit = TRUE;
-    }
 
     /* Return when there is nothing to do, screen updating is already
      * happening (recursive call), messages on the screen or still starting up.
index 686a9437473610d3807ee49b0b1d71d0a9170a53..2cb39a5e1f52c5d9a127c5fec9f2adb65d088628 100644 (file)
@@ -327,8 +327,8 @@ buf_addsign(
     prev = NULL;
     FOR_ALL_SIGNS_IN_BUF(buf, sign)
     {
-       if (lnum == sign->lnum && id == sign->id &&
-               sign_in_group(sign, groupname))
+       if (lnum == sign->lnum && id == sign->id
+               && sign_in_group(sign, groupname))
        {
            // Update an existing sign
            sign->typenr = typenr;
@@ -427,9 +427,9 @@ buf_delsign(
     for (sign = buf->b_signlist; sign != NULL; sign = next)
     {
        next = sign->next;
-       if ((id == 0 || sign->id == id) &&
-               (atlnum == 0 || sign->lnum == atlnum) &&
-               sign_in_group(sign, group))
+       if ((id == 0 || sign->id == id)
+               && (atlnum == 0 || sign->lnum == atlnum)
+               && sign_in_group(sign, group))
 
        {
            *lastp = next;
@@ -439,7 +439,8 @@ buf_delsign(
            if (sign->group != NULL)
                sign_group_unref(sign->group->sg_name);
            vim_free(sign);
-           update_debug_sign(buf, lnum);
+           redraw_buf_line_later(buf, lnum);
+
            // Check whether only one sign needs to be deleted
            // If deleting a sign with a specific identifer in a particular
            // group or deleting any sign at a particular line number, delete
@@ -453,13 +454,10 @@ buf_delsign(
            lastp = &sign->next;
     }
 
-    // When deleted the last sign need to redraw the windows to remove the
-    // sign column.
+    // When deleting the last sign the cursor position may change, because the
+    // sign columns no longer shows.
     if (buf->b_signlist == NULL)
-    {
-       redraw_buf_later(buf, NOT_VALID);
        changed_cline_bef_curs();
-    }
 
     return lnum;
 }
@@ -932,7 +930,7 @@ sign_place(
        // ":sign place {id} file={fname}": change sign type
        lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr);
     if (lnum > 0)
-       update_debug_sign(buf, lnum);
+       redraw_buf_line_later(buf, lnum);
     else
     {
        EMSG2(_("E885: Not possible to change sign %s"), sign_name);
@@ -1068,8 +1066,8 @@ sign_place_cmd(
        //   :sign place
        //   :sign place group={group}
        //   :sign place group=*
-       if (lnum >= 0 || sign_name != NULL ||
-               (group != NULL && *group == '\0'))
+       if (lnum >= 0 || sign_name != NULL
+               || (group != NULL && *group == '\0'))
            EMSG(_(e_invarg));
        else
            sign_list_placed(buf, group);
@@ -1077,8 +1075,8 @@ sign_place_cmd(
     else
     {
        // Place a new sign
-       if (sign_name == NULL || buf == NULL ||
-               (group != NULL && *group == '\0'))
+       if (sign_name == NULL || buf == NULL
+               || (group != NULL && *group == '\0'))
        {
            EMSG(_(e_invarg));
            return;
@@ -1174,8 +1172,8 @@ sign_jump_cmd(
        return;
     }
 
-    if (buf == NULL || (group != NULL && *group == '\0') ||
-                                       lnum >= 0 || sign_name != NULL)
+    if (buf == NULL || (group != NULL && *group == '\0')
+                                            || lnum >= 0 || sign_name != NULL)
     {
        // File or buffer is not specified or an empty group is used
        // or a line number or a sign name is specified.
@@ -1330,7 +1328,7 @@ parse_sign_cmd_args(
     // If the filename is not supplied for the sign place or the sign jump
     // command, then use the current buffer.
     if (filename == NULL && ((cmd == SIGNCMD_PLACE && lnum_arg)
-               || cmd == SIGNCMD_JUMP))
+                                                      || cmd == SIGNCMD_JUMP))
        *buf = curwin->w_buffer;
 
     return OK;
@@ -1522,10 +1520,10 @@ sign_get_placed_in_buf(
     {
        if (!sign_in_group(sign, sign_group))
            continue;
-       if ((lnum == 0 && sign_id == 0) ||
-               (sign_id == 0 && lnum == sign->lnum) ||
-               (lnum == 0 && sign_id == sign->id) ||
-               (lnum == sign->lnum && sign_id == sign->id))
+       if ((lnum == 0 && sign_id == 0)
+               || (sign_id == 0 && lnum == sign->lnum)
+               || (lnum == 0 && sign_id == sign->id)
+               || (lnum == sign->lnum && sign_id == sign->id))
        {
            if ((sdict = sign_get_info(sign)) != NULL)
                list_append_dict(l, sdict);
@@ -1864,8 +1862,8 @@ set_context_in_sign_cmd(expand_T *xp, char_u *arg)
        switch (cmd_idx)
        {
            case SIGNCMD_DEFINE:
-               if (STRNCMP(last, "texthl", p - last) == 0 ||
-                   STRNCMP(last, "linehl", p - last) == 0)
+               if (STRNCMP(last, "texthl", p - last) == 0
+                       || STRNCMP(last, "linehl", p - last) == 0)
                    xp->xp_context = EXPAND_HIGHLIGHT;
                else if (STRNCMP(last, "icon", p - last) == 0)
                    xp->xp_context = EXPAND_FILES;
index 3375b1c20b510ec0f45ae88be708ab6b00f519e6..e1ea65e85797f9ae7c7c0a6ee5b11e143e1f1d40 100644 (file)
@@ -799,6 +799,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    709,
 /**/
     708,
 /**/