To: vim_dev@googlegroups.com Subject: Patch 8.1.0709 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.0709 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) Files: src/sign.c, src/screen.c, src/proto/screen.pro *** ../vim-8.1.0708/src/sign.c 2019-01-07 22:09:54.439460880 +0100 --- src/sign.c 2019-01-09 21:39:13.363740272 +0100 *************** *** 327,334 **** prev = NULL; FOR_ALL_SIGNS_IN_BUF(buf, sign) { ! if (lnum == sign->lnum && id == sign->id && ! sign_in_group(sign, groupname)) { // Update an existing sign sign->typenr = typenr; --- 327,334 ---- prev = NULL; FOR_ALL_SIGNS_IN_BUF(buf, sign) { ! if (lnum == sign->lnum && id == sign->id ! && sign_in_group(sign, groupname)) { // Update an existing sign sign->typenr = typenr; *************** *** 427,435 **** 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)) { *lastp = next; --- 427,435 ---- 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)) { *lastp = next; *************** *** 439,445 **** if (sign->group != NULL) sign_group_unref(sign->group->sg_name); vim_free(sign); ! update_debug_sign(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 --- 439,446 ---- if (sign->group != NULL) sign_group_unref(sign->group->sg_name); vim_free(sign); ! 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,465 **** lastp = &sign->next; } ! // When deleted the last sign need to redraw the windows to remove the ! // sign column. if (buf->b_signlist == NULL) - { - redraw_buf_later(buf, NOT_VALID); changed_cline_bef_curs(); - } return lnum; } --- 454,463 ---- lastp = &sign->next; } ! // When deleting the last sign the cursor position may change, because the ! // sign columns no longer shows. if (buf->b_signlist == NULL) changed_cline_bef_curs(); return lnum; } *************** *** 932,938 **** // ":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); else { EMSG2(_("E885: Not possible to change sign %s"), sign_name); --- 930,936 ---- // ":sign place {id} file={fname}": change sign type lnum = buf_change_sign_type(buf, *sign_id, sign_group, sp->sn_typenr); if (lnum > 0) ! redraw_buf_line_later(buf, lnum); else { EMSG2(_("E885: Not possible to change sign %s"), sign_name); *************** *** 1068,1075 **** // :sign place // :sign place group={group} // :sign place group=* ! if (lnum >= 0 || sign_name != NULL || ! (group != NULL && *group == '\0')) EMSG(_(e_invarg)); else sign_list_placed(buf, group); --- 1066,1073 ---- // :sign place // :sign place group={group} // :sign place group=* ! if (lnum >= 0 || sign_name != NULL ! || (group != NULL && *group == '\0')) EMSG(_(e_invarg)); else sign_list_placed(buf, group); *************** *** 1077,1084 **** else { // Place a new sign ! if (sign_name == NULL || buf == NULL || ! (group != NULL && *group == '\0')) { EMSG(_(e_invarg)); return; --- 1075,1082 ---- else { // Place a new sign ! if (sign_name == NULL || buf == NULL ! || (group != NULL && *group == '\0')) { EMSG(_(e_invarg)); return; *************** *** 1174,1181 **** return; } ! 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. --- 1172,1179 ---- return; } ! 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,1336 **** // 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)) *buf = curwin->w_buffer; return OK; --- 1328,1334 ---- // 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)) *buf = curwin->w_buffer; return OK; *************** *** 1522,1531 **** { 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 ((sdict = sign_get_info(sign)) != NULL) list_append_dict(l, sdict); --- 1520,1529 ---- { 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 ((sdict = sign_get_info(sign)) != NULL) list_append_dict(l, sdict); *************** *** 1864,1871 **** switch (cmd_idx) { case SIGNCMD_DEFINE: ! 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; --- 1862,1869 ---- switch (cmd_idx) { case SIGNCMD_DEFINE: ! 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; *** ../vim-8.1.0708/src/screen.c 2019-01-09 20:51:00.321398815 +0100 --- src/screen.c 2019-01-09 21:47:15.772416499 +0100 *************** *** 264,269 **** --- 264,280 ---- } 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) { win_T *wp; *************** *** 978,1003 **** win_foldinfo.fi_level = 0; # endif ! /* update/delete a specific mark */ 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. --- 989,1001 ---- win_foldinfo.fi_level = 0; # endif ! // 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 (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. *** ../vim-8.1.0708/src/proto/screen.pro 2019-01-09 20:51:00.321398815 +0100 --- src/proto/screen.pro 2019-01-09 21:39:29.319633988 +0100 *************** *** 5,10 **** --- 5,11 ---- 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); *** ../vim-8.1.0708/src/version.c 2019-01-09 20:51:00.321398815 +0100 --- src/version.c 2019-01-09 21:25:07.452472773 +0100 *************** *** 801,802 **** --- 801,804 ---- { /* Add new patch number below this line */ + /**/ + 709, /**/ -- The coffee just wasn't strong enough to defend itself -- Tom Waits /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///