patch 8.2.3699: the +title feature adds a lot of #ifdef but little code

Problem:    The +title feature adds a lot of #ifdef but little code.
Solution:   Graduate the +title feature.
diff --git a/src/alloc.c b/src/alloc.c
index d0901f4..42caa41 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -421,9 +421,7 @@
 # endif
     }
 
-# ifdef FEAT_TITLE
     free_titles();
-# endif
 # if defined(FEAT_SEARCHPATH)
     free_findfile();
 # endif
diff --git a/src/arglist.c b/src/arglist.c
index 244dd06..24b0a87 100644
--- a/src/arglist.c
+++ b/src/arglist.c
@@ -770,9 +770,7 @@
 
     if (do_arglist(eap->arg, AL_ADD, i, TRUE) == FAIL)
 	return;
-#ifdef FEAT_TITLE
     maketitle();
-#endif
 
     if (curwin->w_arg_idx == 0
 	    && (curbuf->b_ml.ml_flags & ML_EMPTY)
@@ -792,9 +790,7 @@
     do_arglist(eap->arg, AL_ADD,
 	       eap->addr_count > 0 ? (int)eap->line2 : curwin->w_arg_idx + 1,
 	       FALSE);
-#ifdef FEAT_TITLE
     maketitle();
-#endif
 }
 
 /*
@@ -853,9 +849,7 @@
     }
     else
 	do_arglist(eap->arg, AL_DEL, 0, FALSE);
-#ifdef FEAT_TITLE
     maketitle();
-#endif
 }
 
 /*
diff --git a/src/autocmd.c b/src/autocmd.c
index ac21196..5ec911a 100644
--- a/src/autocmd.c
+++ b/src/autocmd.c
@@ -2253,10 +2253,8 @@
 		|| event == EVENT_VIMLEAVE
 		|| event == EVENT_VIMLEAVEPRE))
     {
-#ifdef FEAT_TITLE
 	if (curbuf->b_changed != save_changed)
 	    need_maketitle = TRUE;
-#endif
 	curbuf->b_changed = save_changed;
     }
 
diff --git a/src/buffer.c b/src/buffer.c
index e2732de..20a0d66 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -44,9 +44,7 @@
 #else
 static int	otherfile_buf(buf_T *buf, char_u *ffname);
 #endif
-#ifdef FEAT_TITLE
 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 *);
 static void	free_buffer_stuff(buf_T *buf, int free_options);
@@ -1856,9 +1854,7 @@
 	buflist_getfpos();
 
     check_arg_idx(curwin);		// check for valid arg_idx
-#ifdef FEAT_TITLE
     maketitle();
-#endif
 	// when autocmds didn't change it
     if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
 	scroll_cursor_halfway(FALSE);	// redisplay at correct position
@@ -3461,9 +3457,7 @@
 
     if (curwin->w_buffer == buf)
 	check_arg_idx(curwin);	// check file name for arg list
-#ifdef FEAT_TITLE
     maketitle();		// set window title
-#endif
     status_redraw_all();	// status lines need to be redrawn
     fmarks_check_names(buf);	// check named file marks
     ml_timestamp(buf);		// reset timestamp
@@ -3780,7 +3774,6 @@
 	vim_snprintf((char *)buf, buflen, "%d-%d", col, vcol);
 }
 
-#if defined(FEAT_TITLE) || defined(PROTO)
 static char_u *lasttitle = NULL;
 static char_u *lasticon = NULL;
 
@@ -4045,7 +4038,6 @@
 }
 # endif
 
-#endif // FEAT_TITLE
 
 #if defined(FEAT_STL_OPT) || defined(FEAT_GUI_TABLINE) || defined(PROTO)
 
diff --git a/src/bufwrite.c b/src/bufwrite.c
index 0313e0c..76c36e1 100644
--- a/src/bufwrite.c
+++ b/src/bufwrite.c
@@ -1630,9 +1630,7 @@
     if (forceit && overwriting && vim_strchr(p_cpo, CPO_KEEPRO) == NULL)
     {
 	buf->b_p_ro = FALSE;
-#ifdef FEAT_TITLE
 	need_maketitle = TRUE;	    // set window title later
-#endif
 	status_redraw_all();	    // redraw status lines later
     }
 
diff --git a/src/change.c b/src/change.c
index e171956..308cc18 100644
--- a/src/change.c
+++ b/src/change.c
@@ -146,9 +146,7 @@
     ml_setflags(curbuf);
     check_status(curbuf);
     redraw_tabline = TRUE;
-#ifdef FEAT_TITLE
     need_maketitle = TRUE;	    // set window title later
-#endif
 }
 
 #ifdef FEAT_EVAL
@@ -892,9 +890,7 @@
 	    save_file_ff(buf);
 	check_status(buf);
 	redraw_tabline = TRUE;
-#ifdef FEAT_TITLE
 	need_maketitle = TRUE;	    // set window title later
-#endif
 	++CHANGEDTICK(buf);
     }
     else if (always_inc_changedtick)
diff --git a/src/drawscreen.c b/src/drawscreen.c
index 52f6273..f56ef91 100644
--- a/src/drawscreen.c
+++ b/src/drawscreen.c
@@ -610,15 +610,14 @@
 	win_redr_ruler(curwin, always, FALSE);
 #endif
 
-#ifdef FEAT_TITLE
     if (need_maketitle
-# ifdef FEAT_STL_OPT
+#ifdef FEAT_STL_OPT
 	    || (p_icon && (stl_syntax & STL_IN_ICON))
 	    || (p_title && (stl_syntax & STL_IN_TITLE))
-# endif
+#endif
        )
 	maketitle();
-#endif
+
     // Redraw the tab pages line if needed.
     if (redraw_tabline)
 	draw_tabline();
diff --git a/src/evalfunc.c b/src/evalfunc.c
index ad9691e..e04052b 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5787,13 +5787,7 @@
 		0
 #endif
 		},
-	{"title",
-#ifdef FEAT_TITLE
-		1
-#else
-		0
-#endif
-		},
+	{"title", 1},
 	{"toolbar",
 #ifdef FEAT_TOOLBAR
 		1
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 079dcf1..10c8e61 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3082,9 +3082,7 @@
 	// Even when cursor didn't move we need to recompute topline.
 	changed_line_abv_curs();
 
-#ifdef FEAT_TITLE
 	maketitle();
-#endif
 #if defined(FEAT_PROP_POPUP) && defined(FEAT_QUICKFIX)
 	if (WIN_IS_POPUP(curwin) && curwin->w_p_pvw && retval != FAIL)
 	    popup_set_title(curwin);
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 523d8af..d486311 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -6205,14 +6205,10 @@
 	out_flush();
 	stoptermcap();
 	out_flush();		// needed for SUN to restore xterm buffer
-#ifdef FEAT_TITLE
 	mch_restore_title(SAVE_RESTORE_BOTH);	// restore window titles
-#endif
 	ui_suspend();		// call machine specific function
-#ifdef FEAT_TITLE
 	maketitle();
 	resettitle();		// force updating the title
-#endif
 	starttermcap();
 	scroll_start();		// scroll screen before redrawing
 	redraw_later_clear();
@@ -7047,14 +7043,10 @@
     {
 	if (eap->do_ecmd_cmd != NULL)
 	    do_cmd_argument(eap->do_ecmd_cmd);
-#ifdef FEAT_TITLE
 	n = curwin->w_arg_idx_invalid;
-#endif
 	check_arg_idx(curwin);
-#ifdef FEAT_TITLE
 	if (n != curwin->w_arg_idx_invalid)
 	    maketitle();
-#endif
     }
 
     /*
@@ -8178,10 +8170,8 @@
     validate_cursor();
     update_topline();
     update_screen(eap->forceit ? CLEAR : VIsual_active ? INVERTED : 0);
-#ifdef FEAT_TITLE
     if (need_maketitle)
 	maketitle();
-#endif
 #if defined(MSWIN) && (!defined(FEAT_GUI_MSWIN) || defined(VIMDLL))
 # ifdef VIMDLL
     if (!gui.in_use)
diff --git a/src/feature.h b/src/feature.h
index 2ae739a..36761ca 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -109,6 +109,7 @@
  * +insert_expand	CTRL-N/CTRL-P/CTRL-X in insert mode.
  * +modify_fname	modifiers for file name.  E.g., "%:p:h".
  * +comments		'comments' option.
+ * +title		'title' and 'icon' options
  *
  * Obsolete:
  * +tag_old_static	Old style static tags: "file:tag  file  ..".
@@ -360,17 +361,9 @@
 #endif
 
 /*
- * +title		'title' and 'icon' options
  * +statusline		'statusline', 'rulerformat' and special format of
  *			'titlestring' and 'iconstring' options.
- * +byte_offset		'%o' in 'statusline' and builtin functions line2byte()
- *			and byte2line().
- *			Note: Required for Macintosh.
  */
-#if defined(FEAT_NORMAL)
-# define FEAT_TITLE
-#endif
-
 #ifdef FEAT_NORMAL
 # define FEAT_STL_OPT
 # ifndef FEAT_CMDL_INFO
@@ -378,6 +371,11 @@
 # endif
 #endif
 
+/*
+ * +byte_offset		'%o' in 'statusline' and builtin functions line2byte()
+ *			and byte2line().
+ *			Note: Required for Macintosh.
+ */
 #ifdef FEAT_NORMAL
 # define FEAT_BYTEOFF
 #endif
diff --git a/src/globals.h b/src/globals.h
index 8f4f5a5..f90dea2 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -252,9 +252,7 @@
 EXTERN int	need_wait_return INIT(= 0); // need to wait for return later
 EXTERN int	did_wait_return INIT(= FALSE);	// wait_return() was used and
 						// nothing written since then
-#ifdef FEAT_TITLE
 EXTERN int	need_maketitle INIT(= TRUE); // call maketitle() soon
-#endif
 
 EXTERN int	quit_more INIT(= FALSE);    // 'q' hit at "--more--" msg
 #if defined(UNIX) || defined(VMS) || defined(MACOS_X)
@@ -1037,17 +1035,26 @@
  */
 // length of char in bytes, including following composing chars
 EXTERN int (*mb_ptr2len)(char_u *p) INIT(= latin_ptr2len);
+
 // idem, with limit on string length
 EXTERN int (*mb_ptr2len_len)(char_u *p, int size) INIT(= latin_ptr2len_len);
+
 // byte length of char
 EXTERN int (*mb_char2len)(int c) INIT(= latin_char2len);
-// convert char to bytes, return the length
+
+// Convert char "c" to bytes in "buf", return the length.  "buf" must have room
+// for at least 6 bytes.
 EXTERN int (*mb_char2bytes)(int c, char_u *buf) INIT(= latin_char2bytes);
+
 EXTERN int (*mb_ptr2cells)(char_u *p) INIT(= latin_ptr2cells);
 EXTERN int (*mb_ptr2cells_len)(char_u *p, int size) INIT(= latin_ptr2cells_len);
 EXTERN int (*mb_char2cells)(int c) INIT(= latin_char2cells);
 EXTERN int (*mb_off2cells)(unsigned off, unsigned max_off) INIT(= latin_off2cells);
 EXTERN int (*mb_ptr2char)(char_u *p) INIT(= latin_ptr2char);
+
+// Byte offset from "p" to the start of a character, including any composing
+// characters. "base" must be the start of the string, which must be NUL
+// terminated.
 EXTERN int (*mb_head_off)(char_u *base, char_u *p) INIT(= latin_head_off);
 
 # if defined(USE_ICONV) && defined(DYNAMIC_ICONV)
@@ -1402,7 +1409,7 @@
 // table to store parsed 'wildmode'
 EXTERN char_u	wim_flags[4];
 
-#if defined(FEAT_TITLE) && defined(FEAT_STL_OPT)
+#if defined(FEAT_STL_OPT)
 // whether titlestring and iconstring contains statusline syntax
 # define STL_IN_ICON	1
 # define STL_IN_TITLE	2
diff --git a/src/gui.c b/src/gui.c
index 616f602..74d681e 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -138,7 +138,7 @@
 	// Back to old term settings
 	//
 	// FIXME: If we got here because a child process failed and flagged to
-	// the parent to resume, and X11 is enabled with FEAT_TITLE, this will
+	// the parent to resume, and X11 is enabled, this will
 	// hit an X11 I/O error and do a longjmp(), leaving recursive
 	// permanently set to 1. This is probably not as big a problem as it
 	// sounds, because gui_mch_init() in both gui_x11.c and gui_gtk_x11.c
@@ -146,9 +146,7 @@
 	// actually hit this case.
 	termcapinit(old_term);
 	settmode(TMODE_RAW);		// restart RAW mode
-#ifdef FEAT_TITLE
 	set_title_defaults();		// set 'title' and 'icon' again
-#endif
 #if defined(GUI_MAY_SPAWN) && defined(EXPERIMENTAL_GUI_CMD)
 	if (msg)
 	    emsg(msg);
@@ -741,10 +739,9 @@
      */
     if (gui_mch_open() != FAIL)
     {
-#ifdef FEAT_TITLE
 	maketitle();
 	resettitle();
-#endif
+
 	init_gui_options();
 #ifdef FEAT_ARABIC
 	// Our GUI can't do bidi.
@@ -4413,10 +4410,8 @@
 	}
     }
 
-#ifdef FEAT_TITLE
     // update the title, it may show the scroll position
     maketitle();
-#endif
 
     prev_curwin = curwin;
     --hold_gui_events;
@@ -5558,9 +5553,7 @@
 # ifdef FEAT_MENU
     gui_update_menus(0);
 # endif
-#ifdef FEAT_TITLE
     maketitle();
-#endif
     setcursor();
     out_flush_cursor(FALSE, FALSE);
 }
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 6381a95..2d313f7 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -4540,7 +4540,6 @@
     gui_mch_update();
 }
 
-#if defined(FEAT_TITLE) || defined(PROTO)
     void
 gui_mch_settitle(char_u *title, char_u *icon UNUSED)
 {
@@ -4552,7 +4551,6 @@
     if (output_conv.vc_type != CONV_NONE)
 	vim_free(title);
 }
-#endif // FEAT_TITLE
 
 #if defined(FEAT_MENU) || defined(PROTO)
     void
diff --git a/src/if_xcmdsrv.c b/src/if_xcmdsrv.c
index 73f2c9e..901afc4 100644
--- a/src/if_xcmdsrv.c
+++ b/src/if_xcmdsrv.c
@@ -314,9 +314,7 @@
 	set_vim_var_string(VV_SEND_SERVER, name, -1);
 #endif
 	serverName = vim_strsave(name);
-#ifdef FEAT_TITLE
 	need_maketitle = TRUE;
-#endif
 	return 0;
     }
     return -2;
diff --git a/src/locale.c b/src/locale.c
index 7fad9d9..54f4161 100644
--- a/src/locale.c
+++ b/src/locale.c
@@ -390,9 +390,7 @@
 	    // Set v:lang, v:lc_time, v:collate and v:ctype to the final result.
 	    set_lang_var();
 # endif
-# ifdef FEAT_TITLE
 	    maketitle();
-# endif
 	}
     }
 }
diff --git a/src/main.c b/src/main.c
index 50047d5..268209e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -668,7 +668,7 @@
 	scroll_region_reset();		// In case Rows changed
     scroll_start();	// may scroll the screen to the right position
 
-#if defined(FEAT_TITLE) && (defined(UNIX) || defined(VMS) || defined(MACOS_X))
+#if defined(UNIX) || defined(VMS) || defined(MACOS_X)
     term_push_title(SAVE_RESTORE_BOTH);
 #endif
 
@@ -1395,10 +1395,8 @@
 	    else if (redraw_cmdline || clear_cmdline)
 		showmode();
 	    redraw_statuslines();
-#ifdef FEAT_TITLE
 	    if (need_maketitle)
 		maketitle();
-#endif
 #ifdef FEAT_VIMINFO
 	    curbuf->b_last_used = vim_time();
 #endif
diff --git a/src/misc2.c b/src/misc2.c
index 8e01434..9407087 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1735,9 +1735,7 @@
     // This may cause the buffer to become (un)modified.
     check_status(curbuf);
     redraw_tabline = TRUE;
-#ifdef FEAT_TITLE
     need_maketitle = TRUE;	    // set window title later
-#endif
 }
 
 /*
diff --git a/src/netbeans.c b/src/netbeans.c
index 003cc53..00be244 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -1669,9 +1669,7 @@
 	    buf->bufp = curbuf;
 	    buf->initDone = TRUE;
 	    do_update = 1;
-#if defined(FEAT_TITLE)
 	    maketitle();
-#endif
 #if defined(FEAT_MENU) && defined(FEAT_GUI)
 	    if (gui.in_use)
 		gui_update_menus(0);
@@ -1748,9 +1746,7 @@
 	    {
 		check_status(buf->bufp);
 		redraw_tabline = TRUE;
-#ifdef FEAT_TITLE
 		maketitle();
-#endif
 		update_screen(0);
 	    }
 // =====================================================================
diff --git a/src/option.c b/src/option.c
index 4422634..fd1910c 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1102,9 +1102,7 @@
 	    set_fileformat(default_fileformat(), OPT_LOCAL);
     }
 
-#ifdef FEAT_TITLE
     set_title_defaults();
-#endif
 }
 
 #if defined(FEAT_MULTI_LANG) || defined(PROTO)
@@ -1148,7 +1146,6 @@
 }
 #endif
 
-#ifdef FEAT_TITLE
 /*
  * 'title' and 'icon' only default to true if they have not been set or reset
  * in .vimrc and we can read the old value.
@@ -1192,7 +1189,6 @@
 	p_icon = val;
     }
 }
-#endif
 
     void
 ex_set(exarg_T *eap)
@@ -2272,7 +2268,6 @@
     return *arg;
 }
 
-#ifdef FEAT_TITLE
 /*
  * When changing 'title', 'titlestring', 'icon' or 'iconstring', call
  * maketitle() to create and display it.
@@ -2289,7 +2284,6 @@
 				)
 	maketitle();
 }
-#endif
 
 /*
  * set_options_bin -  called when 'bin' changes value.
@@ -2558,7 +2552,6 @@
 }
 #endif
 
-#if defined(FEAT_TITLE) || defined(PROTO)
 /*
  * Redraw the window title and/or tab page text later.
  */
@@ -2567,7 +2560,6 @@
     need_maketitle = TRUE;
     redraw_tabline = TRUE;
 }
-#endif
 
 /*
  * Return TRUE if "val" is a valid name: only consists of alphanumeric ASCII
@@ -2809,9 +2801,7 @@
 	if (curbuf->b_p_ro)
 	    curbuf->b_did_warn = FALSE;
 
-#ifdef FEAT_TITLE
 	redraw_titles();
-#endif
     }
 
 #ifdef FEAT_GUI
@@ -2834,11 +2824,8 @@
 	    return N_("E946: Cannot make a terminal with running job modifiable");
 	}
 # endif
-# ifdef FEAT_TITLE
 	redraw_titles();
-# endif
     }
-#ifdef FEAT_TITLE
     // when 'endofline' is changed, redraw the window title
     else if ((int *)varp == &curbuf->b_p_eol)
     {
@@ -2854,15 +2841,12 @@
     {
 	redraw_titles();
     }
-#endif
 
     // when 'bin' is set also set some other options
     else if ((int *)varp == &curbuf->b_p_bin)
     {
 	set_options_bin(old_value, curbuf->b_p_bin, opt_flags);
-#ifdef FEAT_TITLE
 	redraw_titles();
-#endif
     }
 
     // when 'buflisted' changes, trigger autocommands
@@ -2996,21 +2980,17 @@
     }
 #endif
 
-#ifdef FEAT_TITLE
     // when 'title' changed, may need to change the title; same for 'icon'
     else if ((int *)varp == &p_title || (int *)varp == &p_icon)
     {
 	did_set_title();
     }
-#endif
 
     else if ((int *)varp == &curbuf->b_changed)
     {
 	if (!value)
 	    save_file_ff(curbuf);	// Buffer is unchanged
-#ifdef FEAT_TITLE
 	redraw_titles();
-#endif
 	modified_was_set = value;
     }
 
@@ -3566,7 +3546,6 @@
 	p_imsearch = curbuf->b_p_imsearch;
     }
 
-#ifdef FEAT_TITLE
     // if 'titlelen' has changed, redraw the title
     else if (pp == &p_titlelen)
     {
@@ -3578,7 +3557,6 @@
 	if (starting != NO_SCREEN && old_value != p_titlelen)
 	    need_maketitle = TRUE;
     }
-#endif
 
     // if p_ch changed value, change the command line height
     else if (pp == &p_ch)
@@ -4971,9 +4949,7 @@
      * screen will be cleared later, so this is OK.
      */
     mch_setmouse(FALSE);	    // switch mouse off
-#ifdef FEAT_TITLE
     mch_restore_title(SAVE_RESTORE_BOTH);    // restore window titles
-#endif
 #if defined(FEAT_XCLIPBOARD) && defined(FEAT_GUI)
     // When starting the GUI close the display opened for the clipboard.
     // After restoring the title, because that will need the display.
diff --git a/src/option.h b/src/option.h
index 21ee569..080d90d 100644
--- a/src/option.h
+++ b/src/option.h
@@ -657,10 +657,8 @@
 EXTERN int	p_arshape;	// 'arabicshape'
 # endif
 #endif
-#ifdef FEAT_TITLE
 EXTERN int	p_icon;		// 'icon'
 EXTERN char_u	*p_iconstring;	// 'iconstring'
-#endif
 EXTERN int	p_ic;		// 'ignorecase'
 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
 EXTERN char_u	*p_imak;	// 'imactivatekey'
@@ -986,12 +984,10 @@
 EXTERN int	p_to;		// 'tildeop'
 EXTERN int	p_timeout;	// 'timeout'
 EXTERN long	p_tm;		// 'timeoutlen'
-#ifdef FEAT_TITLE
 EXTERN int	p_title;	// 'title'
 EXTERN long	p_titlelen;	// 'titlelen'
 EXTERN char_u	*p_titleold;	// 'titleold'
 EXTERN char_u	*p_titlestring;	// 'titlestring'
-#endif
 EXTERN char_u	*p_tsr;		// 'thesaurus'
 EXTERN int	p_ttimeout;	// 'ttimeout'
 EXTERN long	p_ttm;		// 'ttimeoutlen'
diff --git a/src/optiondefs.h b/src/optiondefs.h
index d46cfad..5a9a674 100644
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -1313,18 +1313,10 @@
 			    (char_u *)&p_hls, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"icon",	    NULL,   P_BOOL|P_VI_DEF,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_icon, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"iconstring",  NULL,   P_STRING|P_VI_DEF|P_MLE,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_iconstring, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
 			    (char_u *)&p_ic, PV_NONE,
@@ -2651,35 +2643,18 @@
 			    (char_u *)&p_tm, PV_NONE,
 			    {(char_u *)1000L, (char_u *)0L} SCTX_INIT},
     {"title",	    NULL,   P_BOOL|P_VI_DEF,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_title, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
     {"titlelen",    NULL,   P_NUM|P_VI_DEF,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_titlelen, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)85L, (char_u *)0L} SCTX_INIT},
     {"titleold",    NULL,   P_STRING|P_VI_DEF|P_GETTEXT|P_SECURE|P_NO_MKRC,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_titleold, PV_NONE,
 			    {(char_u *)N_("Thanks for flying Vim"),
 							       (char_u *)0L}
-#else
-			    (char_u *)NULL, PV_NONE,
-			    {(char_u *)0L, (char_u *)0L}
-#endif
 			    SCTX_INIT},
     {"titlestring", NULL,   P_STRING|P_VI_DEF|P_MLE,
-#ifdef FEAT_TITLE
 			    (char_u *)&p_titlestring, PV_NONE,
-#else
-			    (char_u *)NULL, PV_NONE,
-#endif
 			    {(char_u *)"", (char_u *)0L} SCTX_INIT},
     {"toolbar",     "tb",   P_STRING|P_ONECOMMA|P_VI_DEF|P_NODUP,
 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
diff --git a/src/optionstr.c b/src/optionstr.c
index 8948830..1b0d8a1 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -979,10 +979,8 @@
 		errmsg = e_invarg;
 	    else
 	    {
-#ifdef FEAT_TITLE
 		// May show a "+" in the title now.
 		redraw_titles();
-#endif
 		// Add 'fileencoding' to the swap file.
 		ml_setflags(curbuf);
 	    }
@@ -999,9 +997,7 @@
 	    if (varp == &p_enc)
 	    {
 		errmsg = mb_init();
-#ifdef FEAT_TITLE
 		redraw_titles();
-#endif
 	    }
 	}
 
@@ -1141,9 +1137,7 @@
 		curbuf->b_p_tx = TRUE;
 	    else
 		curbuf->b_p_tx = FALSE;
-#ifdef FEAT_TITLE
 	    redraw_titles();
-#endif
 	    // update flag in swap file
 	    ml_setflags(curbuf);
 	    // Redraw needed when switching to/from "mac": a CR in the text
@@ -1603,11 +1597,10 @@
 	fill_breakat_flags();
 #endif
 
-#ifdef FEAT_TITLE
     // 'titlestring' and 'iconstring'
     else if (varp == &p_titlestring || varp == &p_iconstring)
     {
-# ifdef FEAT_STL_OPT
+#ifdef FEAT_STL_OPT
 	int	flagval = (varp == &p_titlestring) ? STL_IN_TITLE : STL_IN_ICON;
 
 	// NULL => statusline syntax
@@ -1615,10 +1608,9 @@
 	    stl_syntax |= flagval;
 	else
 	    stl_syntax &= ~flagval;
-# endif
+#endif
 	did_set_title();
     }
-#endif
 
 #ifdef FEAT_GUI
     // 'guioptions'
@@ -1805,9 +1797,7 @@
 		redraw_later(VALID);
 	    }
 	    curbuf->b_help = (curbuf->b_p_bt[0] == 'h');
-#ifdef FEAT_TITLE
 	    redraw_titles();
-#endif
 	}
     }
 
diff --git a/src/os_amiga.c b/src/os_amiga.c
index f157c0b..18f0192 100644
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -623,7 +623,6 @@
     return fib;
 }
 
-#ifdef FEAT_TITLE
 /*
  * set the title of our window
  * icon name is not set
@@ -660,7 +659,6 @@
 {
     return FALSE;
 }
-#endif
 
     void
 mch_setmouse(int on UNUSED)
@@ -940,9 +938,7 @@
 	out_flush();
     }
 
-#ifdef FEAT_TITLE
     mch_restore_title(SAVE_RESTORE_BOTH);    // restore window title
-#endif
 
     ml_close_all(TRUE);		    // remove all memfiles
 
@@ -1442,9 +1438,7 @@
 	cur_tmode = TMODE_UNKNOWN;
 	settmode(TMODE_RAW);		// set to raw mode
     }
-#ifdef FEAT_TITLE
     resettitle();
-#endif
     if (term_console)
 	win_resize_on();		// window resize events activated
     return retval;
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 096ac1b..360c456 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -32,7 +32,7 @@
 #endif
 
 #ifndef PROTO
-# if defined(FEAT_TITLE) && !defined(FEAT_GUI_MSWIN)
+# if !defined(FEAT_GUI_MSWIN)
 #  include <shellapi.h>
 # endif
 
@@ -265,7 +265,6 @@
 #endif
 }
 
-#ifdef FEAT_TITLE
 /*
  * mch_settitle(): set titlebar of our window
  */
@@ -274,16 +273,16 @@
     char_u *title,
     char_u *icon UNUSED)
 {
-# ifdef FEAT_GUI_MSWIN
-#  ifdef VIMDLL
+#ifdef FEAT_GUI_MSWIN
+# ifdef VIMDLL
     if (gui.in_use)
-#  endif
+# endif
     {
 	gui_mch_settitle(title, icon);
 	return;
     }
-# endif
-# if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
+#endif
+#if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
     if (title != NULL)
     {
 	WCHAR	*wp = enc_to_utf16(title, NULL);
@@ -295,7 +294,7 @@
 	vim_free(wp);
 	return;
     }
-# endif
+#endif
 }
 
 
@@ -309,12 +308,12 @@
     void
 mch_restore_title(int which UNUSED)
 {
-# if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
-#  ifdef VIMDLL
+#if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL)
+# ifdef VIMDLL
     if (!gui.in_use)
-#  endif
-	SetConsoleTitle(g_szOrigTitle);
 # endif
+	SetConsoleTitle(g_szOrigTitle);
+#endif
 }
 
 
@@ -336,7 +335,6 @@
 {
     return FALSE;
 }
-#endif // FEAT_TITLE
 
 
 /*
@@ -937,9 +935,7 @@
 #endif //_DEBUG
 
 #if !defined(FEAT_GUI) || defined(VIMDLL) || defined(PROTO)
-# ifdef FEAT_TITLE
 extern HWND g_hWnd;	// This is in os_win32.c.
-# endif
 
 /*
  * Showing the printer dialog is tricky since we have no GUI
@@ -953,14 +949,12 @@
     if (s_hwnd != 0)
 	return;
 
-# ifdef FEAT_TITLE
     // Window handle may have been found by init code (Windows NT only)
     if (g_hWnd != 0)
     {
 	s_hwnd = g_hWnd;
 	return;
     }
-# endif
 
     s_hwnd = GetConsoleWindow();
 }
@@ -2301,9 +2295,7 @@
     {
 	// Remember the name
 	serverName = ok_name;
-# ifdef FEAT_TITLE
 	need_maketitle = TRUE;	// update Vim window title later
-# endif
 
 	// Update the message window title
 	SetWindowText(message_window, (LPCSTR)ok_name);
diff --git a/src/os_unix.c b/src/os_unix.c
index fa9c5f3..ef5533c 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -118,15 +118,12 @@
 static void xterm_update(void);
 # endif
 
-# if defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE)
 Window	    x11_window = 0;
-# endif
 Display	    *x11_display = NULL;
 #endif
 
 static int ignore_sigtstp = FALSE;
 
-#ifdef FEAT_TITLE
 static int get_x11_title(int);
 
 static char_u	*oldtitle = NULL;
@@ -134,7 +131,6 @@
 static int	unix_did_set_title = FALSE;
 static char_u	*oldicon = NULL;
 static int	did_set_icon = FALSE;
-#endif
 
 static void may_core_dump(void);
 
@@ -170,8 +166,7 @@
 #if defined(SIGPWR)
 static RETSIGTYPE catch_sigpwr SIGPROTOARG;
 #endif
-#if defined(SIGALRM) && defined(FEAT_X11) \
-	&& defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
+#if defined(SIGALRM) && defined(FEAT_X11) && !defined(FEAT_GUI_GTK)
 # define SET_SIG_ALARM
 static RETSIGTYPE sig_alarm SIGPROTOARG;
 // volatile because it is used in signal handler sig_alarm().
@@ -1152,11 +1147,10 @@
     static void
 after_sigcont(void)
 {
-# ifdef FEAT_TITLE
     // Don't change "oldtitle" in a signal handler, set a flag to obtain it
     // again later.
     oldtitle_outdated = TRUE;
-# endif
+
     settmode(TMODE_RAW);
     need_check_timestamps = TRUE;
     did_check_timestamps = FALSE;
@@ -1579,8 +1573,7 @@
 
 #ifdef FEAT_X11
 
-# if defined(ELAPSED_TIMEVAL) \
-	&& (defined(FEAT_XCLIPBOARD) || defined(FEAT_TITLE))
+# if defined(ELAPSED_TIMEVAL)
 
 /*
  * Give a message about the elapsed time for opening the X window.
@@ -1593,7 +1586,7 @@
 # endif
 #endif
 
-#if defined(FEAT_X11) && (defined(FEAT_TITLE) || defined(FEAT_XCLIPBOARD))
+#if defined(FEAT_X11)
 /*
  * A few functions shared by X11 title and clipboard code.
  */
@@ -1776,7 +1769,6 @@
 }
 #endif
 
-#ifdef FEAT_TITLE
 
 #ifdef FEAT_X11
 
@@ -2316,7 +2308,6 @@
     }
 }
 
-#endif // FEAT_TITLE
 
 /*
  * Return TRUE if "name" looks like some xterm name.
@@ -3349,10 +3340,8 @@
 # if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
     VIM_CLEAR(signal_stack);
 # endif
-# ifdef FEAT_TITLE
     vim_free(oldtitle);
     vim_free(oldicon);
-# endif
 }
 #endif
 
@@ -3403,14 +3392,13 @@
 #endif
     {
 	settmode(TMODE_COOK);
-#ifdef FEAT_TITLE
 	if (!is_not_a_term())
 	{
 	    // restore xterm title and icon name
 	    mch_restore_title(SAVE_RESTORE_BOTH);
 	    term_pop_title(SAVE_RESTORE_BOTH);
 	}
-#endif
+
 	/*
 	 * When t_ti is not empty but it doesn't cause swapping terminal
 	 * pages, need to output a newline when msg_didout is set.  But when
@@ -4600,9 +4588,7 @@
 	cur_tmode = TMODE_UNKNOWN;
 	settmode(TMODE_RAW);	// set to raw mode
     }
-# ifdef FEAT_TITLE
     resettitle();
-# endif
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
     restore_clipboard();
 # endif
@@ -5441,9 +5427,7 @@
     if (!did_settmode)
 	if (tmode == TMODE_RAW)
 	    settmode(TMODE_RAW);	// set to raw mode
-# ifdef FEAT_TITLE
     resettitle();
-# endif
     vim_free(argv);
     vim_free(tofree1);
     vim_free(tofree2);
diff --git a/src/os_win32.c b/src/os_win32.c
index a8062a8..7234fe8 100644
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -46,7 +46,7 @@
 #endif
 
 #ifndef PROTO
-# if defined(FEAT_TITLE) && !defined(FEAT_GUI_MSWIN)
+# if !defined(FEAT_GUI_MSWIN)
 #  include <shellapi.h>
 # endif
 #endif
@@ -2683,7 +2683,6 @@
 static ConsoleBuffer g_cbNonTermcap = { 0 };
 static ConsoleBuffer g_cbTermcap = { 0 };
 
-# ifdef FEAT_TITLE
 char g_szOrigTitle[256] = { 0 };
 HWND g_hWnd = NULL;	// also used in os_mswin.c
 static HICON g_hOrigIconSmall = NULL;
@@ -2692,12 +2691,12 @@
 static BOOL g_fCanChangeIcon = FALSE;
 
 // ICON* are not defined in VC++ 4.0
-#  ifndef ICON_SMALL
-#   define ICON_SMALL 0
-#  endif
-#  ifndef ICON_BIG
-#   define ICON_BIG 1
-#  endif
+# ifndef ICON_SMALL
+#  define ICON_SMALL 0
+# endif
+# ifndef ICON_BIG
+#  define ICON_BIG 1
+# endif
 /*
  * GetConsoleIcon()
  * Description:
@@ -2789,7 +2788,6 @@
     if (g_hVimIcon != NULL)
 	g_fCanChangeIcon = TRUE;
 }
-# endif
 
 static int g_fWindInitCalled = FALSE;
 static int g_fTermcapMode = FALSE;
@@ -2850,7 +2848,6 @@
     GetConsoleMode(g_hConIn,  &g_cmodein);
     GetConsoleMode(g_hConOut, &g_cmodeout);
 
-# ifdef FEAT_TITLE
     SaveConsoleTitleAndIcon();
     /*
      * Set both the small and big icons of the console window to Vim's icon.
@@ -2859,7 +2856,6 @@
      */
     if (g_fCanChangeIcon)
 	SetConsoleIcon(g_hWnd, g_hVimIcon, g_hVimIcon);
-# endif
 
     ui_get_shellsize();
 
@@ -2909,7 +2905,6 @@
 
     if (g_fWindInitCalled)
     {
-# ifdef FEAT_TITLE
 	mch_restore_title(SAVE_RESTORE_BOTH);
 	/*
 	 * Restore both the small and big icons of the console window to
@@ -2918,7 +2913,6 @@
 	 */
 	if (g_fCanChangeIcon && !g_fForceExit)
 	    SetConsoleIcon(g_hWnd, g_hOrigIconSmall, g_hOrigIcon);
-# endif
 
 # ifdef MCH_WRITE_DUMP
 	if (fdDump)
@@ -4757,7 +4751,6 @@
 {
     int		x = 0;
     int		tmode = cur_tmode;
-#ifdef FEAT_TITLE
     WCHAR	szShellTitle[512];
 
     // Change the title to reflect that we are in a subshell.
@@ -4780,7 +4773,6 @@
 	    }
 	}
     }
-#endif
 
     out_flush();
 
@@ -4813,9 +4805,7 @@
 	{
 	    // Use a terminal window to run the command in.
 	    x = mch_call_shell_terminal(cmd, options);
-# ifdef FEAT_TITLE
 	    resettitle();
-# endif
 	    return x;
 	}
     }
@@ -5062,9 +5052,7 @@
 	smsg(_("shell returned %d"), x);
 	msg_putchar('\n');
     }
-#ifdef FEAT_TITLE
     resettitle();
-#endif
 
     signal(SIGINT, SIG_DFL);
 #if defined(__GNUC__) && !defined(__MINGW32__)
@@ -5631,9 +5619,7 @@
 	ResizeConBufAndWindow(g_hConOut, Columns, Rows);
     }
 
-# ifdef FEAT_TITLE
     resettitle();
-# endif
 
     GetConsoleMode(g_hConIn, &cmodein);
     if (g_fMouseActive)
diff --git a/src/regexp.c b/src/regexp.c
index 4b14745..45485f4 100644
--- a/src/regexp.c
+++ b/src/regexp.c
@@ -2746,8 +2746,7 @@
 }
 #endif
 
-#if (defined(FEAT_X11) && (defined(FEAT_TITLE) || defined(FEAT_XCLIPBOARD))) \
-	|| defined(PROTO)
+#if defined(FEAT_X11) || defined(PROTO)
 /*
  * Return whether "prog" is currently being executed.
  */
diff --git a/src/term.c b/src/term.c
index 52533e9..eb4dffa 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2123,9 +2123,7 @@
     {
 	starttermcap();		// may change terminal mode
 	setmouse();		// may start using the mouse
-#ifdef FEAT_TITLE
 	maketitle();		// may display window title
-#endif
     }
 
 	// display initial screen after ttest() checking. jw.
@@ -3091,8 +3089,7 @@
 }
 #endif
 
-#if (defined(FEAT_TITLE) && (defined(UNIX) || defined(VMS) \
-	|| defined(MACOS_X))) || defined(PROTO)
+#if (defined(UNIX) || defined(VMS) || defined(MACOS_X)) || defined(PROTO)
 /*
  * Generic function to set window title, using t_ts and t_fs.
  */
@@ -3505,9 +3502,8 @@
 
     if (starting != NO_SCREEN)
     {
-#ifdef FEAT_TITLE
 	maketitle();
-#endif
+
 	changed_line_abv_curs();
 	invalidate_botline();
 
diff --git a/src/ui.c b/src/ui.c
index b3d125c..524eb82 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -1175,11 +1175,10 @@
 	    gui_update_scrollbars(FALSE);
 # endif
     }
-#ifdef FEAT_TITLE
+
     // File may have been changed from 'readonly' to 'noreadonly'
     if (need_maketitle)
 	maketitle();
-#endif
 }
 
 #if defined(HAVE_INPUT_METHOD) || defined(PROTO)
diff --git a/src/version.c b/src/version.c
index c032ee8..f5f13a0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -652,11 +652,7 @@
 #else
 	"-timers",
 #endif
-#ifdef FEAT_TITLE
 	"+title",
-#else
-	"-title",
-#endif
 #ifdef FEAT_TOOLBAR
 	"+toolbar",
 #else
@@ -758,6 +754,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3699,
+/**/
     3698,
 /**/
     3697,
diff --git a/src/window.c b/src/window.c
index 4fbf944..c14abe4 100644
--- a/src/window.c
+++ b/src/window.c
@@ -4818,9 +4818,7 @@
 	    apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
     }
 
-#ifdef FEAT_TITLE
     maketitle();
-#endif
     curwin->w_redr_status = TRUE;
 #ifdef FEAT_TERMINAL
     if (bt_terminal(curwin->w_buffer))