# HG changeset patch # User Christian Brabandt # Date 1529182808 -7200 # Node ID 1d25a3e8e03ce6cdb3f66b0fa8bf5b18c20d04df # Parent 56f44a087b091d70d7bb01cd5906525a5114222b patch 8.1.0061: window title is wrong after resetting and setting 'title' commit https://github.com/vim/vim/commit/84a9308511871d9ff94c91a1c6badb92300ded98 Author: Bram Moolenaar Date: Sat Jun 16 22:58:15 2018 +0200 patch 8.1.0061: window title is wrong after resetting and setting 'title' Problem: Window title is wrong after resetting and setting 'title'. Solution: Move resetting the title into maketitle(). (Jason Franklin) diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -38,7 +38,7 @@ static int buf_same_ino(buf_T *buf, stat static int otherfile_buf(buf_T *buf, char_u *ffname); #endif #ifdef FEAT_TITLE -static int ti_change(char_u *str, char_u **last); +static int value_changed(char_u *str, char_u **last); #endif static int append_arg_number(win_T *wp, char_u *buf, int buflen, int add_file); static void free_buffer(buf_T *); @@ -3545,20 +3545,18 @@ col_print( } #if defined(FEAT_TITLE) || defined(PROTO) -/* - * put file name in title bar of window and in icon title - */ - static char_u *lasttitle = NULL; static char_u *lasticon = NULL; +/* + * Put the file name in the title bar and icon of the window. + */ void maketitle(void) { char_u *p; - char_u *t_str = NULL; - char_u *i_name; - char_u *i_str = NULL; + char_u *title_str = NULL; + char_u *icon_str = NULL; int maxlen = 0; int len; int mustset; @@ -3574,7 +3572,7 @@ maketitle(void) need_maketitle = FALSE; if (!p_title && !p_icon && lasttitle == NULL && lasticon == NULL) - return; + return; // nothing to do if (p_title) { @@ -3585,7 +3583,7 @@ maketitle(void) maxlen = 10; } - t_str = buf; + title_str = buf; if (*p_titlestring != NUL) { #ifdef FEAT_STL_OPT @@ -3598,7 +3596,7 @@ maketitle(void) use_sandbox = was_set_insecurely((char_u *)"titlestring", 0); # endif called_emsg = FALSE; - build_stl_str_hl(curwin, t_str, sizeof(buf), + build_stl_str_hl(curwin, title_str, sizeof(buf), p_titlestring, use_sandbox, 0, maxlen, NULL, NULL); if (called_emsg) @@ -3608,7 +3606,7 @@ maketitle(void) } else #endif - t_str = p_titlestring; + title_str = p_titlestring; } else { @@ -3714,11 +3712,11 @@ maketitle(void) } } } - mustset = ti_change(t_str, &lasttitle); + mustset = value_changed(title_str, &lasttitle); if (p_icon) { - i_str = buf; + icon_str = buf; if (*p_iconstring != NUL) { #ifdef FEAT_STL_OPT @@ -3731,7 +3729,7 @@ maketitle(void) use_sandbox = was_set_insecurely((char_u *)"iconstring", 0); # endif called_emsg = FALSE; - build_stl_str_hl(curwin, i_str, sizeof(buf), + build_stl_str_hl(curwin, icon_str, sizeof(buf), p_iconstring, use_sandbox, 0, 0, NULL, NULL); if (called_emsg) @@ -3741,32 +3739,32 @@ maketitle(void) } else #endif - i_str = p_iconstring; + icon_str = p_iconstring; } else { if (buf_spname(curbuf) != NULL) - i_name = buf_spname(curbuf); + p = buf_spname(curbuf); else /* use file name only in icon */ - i_name = gettail(curbuf->b_ffname); - *i_str = NUL; + p = gettail(curbuf->b_ffname); + *icon_str = NUL; /* Truncate name at 100 bytes. */ - len = (int)STRLEN(i_name); + len = (int)STRLEN(p); if (len > 100) { len -= 100; #ifdef FEAT_MBYTE if (has_mbyte) - len += (*mb_tail_off)(i_name, i_name + len) + 1; -#endif - i_name += len; + len += (*mb_tail_off)(p, p + len) + 1; +#endif + p += len; } - STRCPY(i_str, i_name); - trans_characters(i_str, IOSIZE); + STRCPY(icon_str, p); + trans_characters(icon_str, IOSIZE); } } - mustset |= ti_change(i_str, &lasticon); + mustset |= value_changed(icon_str, &lasticon); if (mustset) resettitle(); @@ -3775,20 +3773,25 @@ maketitle(void) /* * Used for title and icon: Check if "str" differs from "*last". Set "*last" * from "str" if it does. - * Return TRUE when "*last" changed. + * Return TRUE if resettitle() is to be called. */ static int -ti_change(char_u *str, char_u **last) +value_changed(char_u *str, char_u **last) { if ((str == NULL) != (*last == NULL) || (str != NULL && *last != NULL && STRCMP(str, *last) != 0)) { vim_free(*last); if (str == NULL) + { *last = NULL; + mch_restore_title(last == &lasttitle ? 1 : 2); + } else + { *last = vim_strsave(str); - return TRUE; + return TRUE; + } } return FALSE; } diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -3256,9 +3256,6 @@ static char_u *illegal_char(char_u *, in #ifdef FEAT_CMDWIN static char_u *check_cedit(void); #endif -#ifdef FEAT_TITLE -static void did_set_title(int icon); -#endif static char_u *option_expand(int opt_idx, char_u *val); static void didset_options(void); static void didset_options2(void); @@ -5374,27 +5371,14 @@ check_cedit(void) * the old value back. */ static void -did_set_title( - int icon) /* Did set icon instead of title */ +did_set_title(void) { if (starting != NO_SCREEN #ifdef FEAT_GUI && !gui.starting #endif ) - { maketitle(); - if (icon) - { - if (!p_icon) - mch_restore_title(2); - } - else - { - if (!p_title) - mch_restore_title(1); - } - } } #endif @@ -6949,8 +6933,7 @@ did_set_string_option( else stl_syntax &= ~flagval; # endif - did_set_title(varp == &p_iconstring); - + did_set_title(); } #endif @@ -8401,14 +8384,9 @@ set_bool_option( #ifdef FEAT_TITLE /* when 'title' changed, may need to change the title; same for 'icon' */ - else if ((int *)varp == &p_title) - { - did_set_title(FALSE); - } - - else if ((int *)varp == &p_icon) - { - did_set_title(TRUE); + else if ((int *)varp == &p_title || (int *)varp == &p_icon) + { + did_set_title(); } #endif diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 61, +/**/ 60, /**/ 59,