Patch 8.2.2345

33 views
Skip to first unread message

Bram Moolenaar

unread,
Jan 14, 2021, 11:36:05 AM1/14/21
to vim...@googlegroups.com

Patch 8.2.2345
Problem: No focus events in a terminal.
Solution: Add the t_fd and t_fe termcap entries and implement detecting
focus events. (Hayaki Saito, Magnus Groß, closes #7673,
closes #609, closes #5526)
Files: runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.h


*** ../vim-8.2.2344/runtime/doc/term.txt 2020-12-29 20:53:28.299402080 +0100
--- runtime/doc/term.txt 2021-01-14 17:20:23.946278238 +0100
***************
*** 372,377 ****
--- 373,382 ----
t_Ri restore icon text from stack *t_Ri* *'t_Ri'*
t_TE end of "raw" mode *t_TE* *'t_TE'*
t_TI put terminal into "raw" mode *t_TI* *'t_TI'*
+ t_fd disable focus-event tracking *t_TI* *'t_TI'*
+ |xterm-focus-event|
+ t_fe enable focus-event tracking *t_TI* *'t_TI'*
+ |xterm-focus-event|

Some codes have a start, middle and end part. The start and end are defined
by the termcap option, the middle part is text.
***************
*** 545,550 ****
--- 550,565 ----
value with the context menu (right mouse button while CTRL key is pressed),
there should be a tick at allow-window-ops.

+ *xterm-focus-event*
+ Some terminals including xterm support the focus event tracking feature.
+ If this feature is enabled by the 't_fe' sequence, special key sequences are
+ sent from the terminal to Vim every time the terminal gains or loses focus.
+ Vim fires focus events (|FocusGained|/|FocusLost|) by handling them accordingly.
+ Focus event tracking is disabled by a 't_fd' sequence when exiting "raw" mode.
+ If you would like to disable this feature, add the following to your .vimrc:
+ `set t_fd=`
+ `set t_fe=`
+
*termcap-colors*
Note about colors: The 't_Co' option tells Vim the number of colors available.
When it is non-zero, the 't_AB' and 't_AF' options are used to set the color.
*** ../vim-8.2.2344/src/optiondefs.h 2020-08-11 21:58:12.585968185 +0200
--- src/optiondefs.h 2021-01-14 17:20:23.946278238 +0100
***************
*** 2957,2962 ****
--- 2957,2964 ----
p_term("t_EC", T_CEC)
p_term("t_EI", T_CEI)
p_term("t_fs", T_FS)
+ p_term("t_fd", T_FD)
+ p_term("t_fe", T_FE)
p_term("t_GP", T_CGP)
p_term("t_IE", T_CIE)
p_term("t_IS", T_CIS)
*** ../vim-8.2.2344/src/term.c 2020-12-30 14:08:30.908689169 +0100
--- src/term.c 2021-01-14 17:33:48.443716246 +0100
***************
*** 196,201 ****
--- 196,206 ----

static int detected_8bit = FALSE; // detected 8-bit terminal

+ #if (defined(UNIX) || defined(VMS))
+ static int focus_mode = FALSE; // xterm's "focus reporting" availability
+ static int focus_state = FALSE; // TRUE if the terminal window gains focus
+ #endif
+
#ifdef FEAT_TERMRESPONSE
// When the cursor shape was detected these values are used:
// 1: block, 2: underline, 3: vertical bar
***************
*** 908,913 ****
--- 913,922 ----
{(int)KS_CRT, IF_EB("\033[23;2t", ESC_STR "[23;2t")},
{(int)KS_SSI, IF_EB("\033[22;1t", ESC_STR "[22;1t")},
{(int)KS_SRI, IF_EB("\033[23;1t", ESC_STR "[23;1t")},
+ # if (defined(UNIX) || defined(VMS))
+ {(int)KS_FD, IF_EB("\033[?1004l", ESC_STR "[?1004l")},
+ {(int)KS_FE, IF_EB("\033[?1004h", ESC_STR "[?1004h")},
+ # endif

{K_UP, IF_EB("\033O*A", ESC_STR "O*A")},
{K_DOWN, IF_EB("\033O*B", ESC_STR "O*B")},
***************
*** 2044,2049 ****
--- 2053,2079 ----
set_mouse_termcode(KS_MOUSE, (char_u *)"\233M");
#endif

+ #if (defined(UNIX) || defined(VMS))
+ // focus reporting is supported by xterm compatible terminals and tmux.
+ if (use_xterm_like_mouse(term))
+ {
+ char_u name[3];
+ name[0] = (int)KS_EXTRA;
+ name[2] = NUL;
+
+ // handle focus in event
+ name[1] = (int)KE_FOCUSGAINED;
+ add_termcode(name, (char_u *)"\033[I", FALSE);
+
+ // handle focus out event
+ name[1] = (int)KE_FOCUSLOST;
+ add_termcode(name, (char_u *)"\033[O", FALSE);
+
+ focus_mode = TRUE;
+ focus_state = TRUE;
+ }
+ #endif
+
#ifdef USE_TERM_CONSOLE
// DEFAULT_TERM indicates that it is the machine console.
if (STRCMP(term, DEFAULT_TERM) != 0)
***************
*** 2519,2525 ****
if (ch_log_output)
{
out_buf[len] = NUL;
! ch_log(NULL, "raw terminal output: \"%s\"", out_buf);
ch_log_output = FALSE;
}
#endif
--- 2549,2558 ----
if (ch_log_output)
{
out_buf[len] = NUL;
! ch_log(NULL, "raw %s output: \"%s\"",
! (gui.in_use && !gui.dying && !gui.starting)
! ? "GUI" : "terminal",
! out_buf);
ch_log_output = FALSE;
}
#endif
***************
*** 3582,3587 ****
--- 3615,3627 ----
out_str(T_CTI); // start "raw" mode
out_str(T_KS); // start "keypad transmit" mode
out_str(T_BE); // enable bracketed paste mode
+
+ #if (defined(UNIX) || defined(VMS))
+ // enable xterm's focus reporting mode
+ if (focus_mode && *T_FE != NUL)
+ out_str(T_FE);
+ #endif
+
out_flush();
termcap_active = TRUE;
screen_start(); // don't know where cursor is now
***************
*** 3633,3638 ****
--- 3673,3685 ----
#ifdef FEAT_JOB_CHANNEL
ch_log_output = TRUE;
#endif
+
+ #if (defined(UNIX) || defined(VMS))
+ // disable xterm's focus reporting mode
+ if (focus_mode && *T_FD != NUL)
+ out_str(T_FD);
+ #endif
+
out_str(T_BD); // disable bracketed paste mode
out_str(T_KE); // stop "keypad transmit" mode
out_flush();
***************
*** 5647,5652 ****
--- 5694,5738 ----
# endif // !USE_ON_FLY_SCROLL
#endif // FEAT_GUI

+ #if (defined(UNIX) || defined(VMS))
+ /*
+ * Handle FocusIn/FocusOut event sequences reported by XTerm.
+ * (CSI I/CSI O)
+ */
+ if (focus_mode
+ # ifdef FEAT_GUI
+ && !gui.in_use
+ # endif
+ && key_name[0] == KS_EXTRA
+ )
+ {
+ int did_aucmd = FALSE;
+
+ if (key_name[1] == KE_FOCUSGAINED && !focus_state)
+ {
+ did_aucmd = apply_autocmds(EVENT_FOCUSGAINED,
+ NULL, NULL, FALSE, curbuf);
+ did_cursorhold = TRUE;
+ focus_state = TRUE;
+ key_name[1] = (int)KE_IGNORE;
+ }
+ else if (key_name[1] == KE_FOCUSLOST && focus_state)
+ {
+ did_aucmd = apply_autocmds(EVENT_FOCUSLOST,
+ NULL, NULL, FALSE, curbuf);
+ did_cursorhold = TRUE;
+ focus_state = FALSE;
+ key_name[1] = (int)KE_IGNORE;
+ }
+ if (did_aucmd && (State & (NORMAL | INSERT | TERMINAL)))
+ {
+ // in case a message was displayed: reposition the cursor
+ setcursor();
+ out_flush();
+ }
+ }
+ #endif
+
/*
* Change <xHome> to <Home>, <xUp> to <Up>, etc.
*/
*** ../vim-8.2.2344/src/term.h 2020-05-31 16:41:04.646603340 +0200
--- src/term.h 2021-01-14 17:20:23.946278238 +0100
***************
*** 109,118 ****
KS_CST, // save window title
KS_CRT, // restore window title
KS_SSI, // save icon text
! KS_SRI // restore icon text
};

! #define KS_LAST KS_SRI

/*
* the terminal capabilities are stored in this array
--- 109,120 ----
KS_CST, // save window title
KS_CRT, // restore window title
KS_SSI, // save icon text
! KS_SRI, // restore icon text
! KS_FD, // disable focus event tracking
! KS_FE // enable focus event tracking
};

! #define KS_LAST KS_FE

/*
* the terminal capabilities are stored in this array
***************
*** 212,217 ****
--- 214,221 ----
#define T_CRT (TERM_STR(KS_CRT)) // restore window title
#define T_SSI (TERM_STR(KS_SSI)) // save icon text
#define T_SRI (TERM_STR(KS_SRI)) // restore icon text
+ #define T_FD (TERM_STR(KS_FD)) // disable focus event tracking
+ #define T_FE (TERM_STR(KS_FE)) // enable focus event tracking

typedef enum {
TMODE_COOK, // terminal mode for external cmds and Ex mode
*** ../vim-8.2.2344/src/version.c 2021-01-13 21:46:53.832589880 +0100
--- src/version.c 2021-01-14 17:24:31.397508436 +0100
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2345,
/**/

--
hundred-and-one symptoms of being an internet addict:
141. You'd rather go to http://www.weather.com/ than look out your window.

/// Bram Moolenaar -- Br...@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 ///

mckel...@gmail.com

unread,
Jan 14, 2021, 12:31:22 PM1/14/21
to vim_dev
Hi,

Just tried to build and see -

term.c: In function ‘out_flush’:
term.c:2553:5: error: ‘gui’ undeclared (first use in this function)
 2553 |    (gui.in_use && !gui.dying && !gui.starting)
      |     ^~~

Do I need a manual re-configure ?

thx,
-m

mckel...@gmail.com

unread,
Jan 14, 2021, 1:18:40 PM1/14/21
to vim_dev
Hi,

2347 fixes, thanks!

-m

Bram Moolenaar

unread,
Jan 14, 2021, 1:19:53 PM1/14/21
to vim...@googlegroups.com, mckel...@gmail.com

> Just tried to build and see -
>
> term.c: In function ‘out_flush’:
> term.c:2553:5: error: ‘gui’ undeclared (first use in this function)
> 2553 | (gui.in_use && !gui.dying && !gui.starting)
> | ^~~
>
> Do I need a manual re-configure ?

Missing #ifdef. This wasn't supposed to be part of this patch, but
slipt in anyway. I'll send out a patch with the #ifdef.

--
Drink wet cement and get really stoned.

Christ van Willegen

unread,
Jan 14, 2021, 2:40:38 PM1/14/21
to vim...@googlegroups.com
Hi,

Op do 14 jan. 2021 17:36 schreef Bram Moolenaar <Br...@moolenaar.net>:

Patch 8.2.2345
Problem:    No focus events in a terminal.
Solution:   Add the t_fd and t_fe termcap entries and implement detecting
            focus events. (Hayaki Saito, Magnus Groß, closes #7673,
            closes #609, closes #5526)
Files:      runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.h




If the (Un)focus escape sequence happens to be sent twice, the key_name[1] will not be set to KE_IGNORE. Is that a problem?

Christ van Willegen 

Bram Moolenaar

unread,
Jan 14, 2021, 3:58:32 PM1/14/21
to vim...@googlegroups.com, Christ van Willegen

Christ van Willegen wrote:

> Op do 14 jan. 2021 17:36 schreef Bram Moolenaar <Br...@moolenaar.net>:
>
> >
> > Patch 8.2.2345
> > Problem: No focus events in a terminal.
> > Solution: Add the t_fd and t_fe termcap entries and implement detecting
> > focus events. (Hayaki Saito, Magnus Gro=C3=9F, closes #7673,
> > closes #609, closes #5526)
> > Files: runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.=
> h
> >
> >
> >
> > + {
> > + int did_aucmd =3D FALSE;
> > +
> > + if (key_name[1] =3D=3D KE_FOCUSGAINED && !focus_state)
> > + {
> > + did_aucmd =3D apply_autocmds(EVENT_FOCUSGAINED,
> > + NULL, NULL, FALSE,
> > curbuf);
> > + did_cursorhold =3D TRUE;
> > + focus_state =3D TRUE;
> > + key_name[1] =3D (int)KE_IGNORE;
> > + }
> > + else if (key_name[1] =3D=3D KE_FOCUSLOST && focus_state)
> > + {
> > + did_aucmd =3D apply_autocmds(EVENT_FOCUSLOST,
> > + NULL, NULL, FALSE,
> > curbuf);
> > + did_cursorhold =3D TRUE;
> > + focus_state =3D FALSE;
> > + key_name[1] =3D (int)KE_IGNORE;
> > + }
> > + if (did_aucmd && (State & (NORMAL | INSERT | TERMINAL)))
> > + {
> > + // in case a message was displayed: reposition the cursor
> > + setcursor();
> > + out_flush();
> > + }
> > + }
> > + #endif
> >
>
> If the (Un)focus escape sequence happens to be sent twice, the key_name[1]
> will not be set to KE_IGNORE. Is that a problem?

It should not happen, but if it does happen it would be a problem.
It's easy enough to change.

--
hundred-and-one symptoms of being an internet addict:
149. You find your computer sexier than your girlfriend

John Marriott

unread,
Jan 15, 2021, 1:57:21 PM1/15/21
to vim...@googlegroups.com

On 15-Jan-2021 03:35, Bram Moolenaar wrote:
> Patch 8.2.2345
> Problem: No focus events in a terminal.
> Solution: Add the t_fd and t_fe termcap entries and implement detecting
> focus events. (Hayaki Saito, Magnus Groß, closes #7673,
> closes #609, closes #5526)
> Files: runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.h
>
>
After this patch, HP-UX spits out this linker error if FEAT_MOUSE_XTERM
is not defined:
<snip>
 cc   -L/usr/local/lib         -o vim objects/arabic.o 
objects/arglist.o  objects/autocmd.o objects/beval.o  objects/buffer.o 
objects/change.o objects/blob.o  objects/blowfish.o  objects/cindent.o
objects/clientserver.o  objects/clipboard.o  objects/cmdexpand.o
objects/cmdhist.o  objects/crypt.o  objects/crypt_zip.o
objects/debugger.o  objects/dict.o  objects/diff.o objects/digraph.o 
objects/drawline.o  objects/drawscreen.o objects/edit.o  objects/eval.o 
objects/evalbuffer.o objects/evalfunc.o  objects/evalvars.o 
objects/evalwindow.o objects/ex_cmds.o  objects/ex_cmds2.o 
objects/ex_docmd.o objects/ex_eval.o  objects/ex_getln.o 
objects/fileio.o objects/filepath.o  objects/findfile.o  objects/fold.o
objects/getchar.o  objects/gui_xim.o  objects/hardcopy.o
objects/hashtab.o  objects/help.o  objects/highlight.o
objects/if_cscope.o  objects/if_xcmdsrv.o  objects/indent.o
objects/insexpand.o  objects/list.o  objects/locale.o objects/map.o 
objects/mark.o  objects/match.o  objects/mbyte.o objects/memline.o 
objects/menu.o  objects/misc1.o objects/misc2.o  objects/mouse.o 
objects/move.o objects/normal.o  objects/ops.o  objects/option.o
objects/optionstr.o  objects/os_unix.o  objects/pathdef.o
objects/popupmenu.o  objects/popupwin.o  objects/profiler.o
objects/pty.o  objects/quickfix.o  objects/regexp.o objects/register.o 
objects/screen.o  objects/scriptfile.o objects/search.o 
objects/session.o  objects/sha256.o objects/sign.o  objects/sound.o 
objects/spell.o objects/spellfile.o  objects/spellsuggest.o 
objects/syntax.o objects/tag.o  objects/term.o  objects/terminal.o
objects/testing.o  objects/textformat.o  objects/textobject.o
objects/textprop.o  objects/time.o  objects/typval.o objects/ui.o 
objects/undo.o  objects/usercmd.o objects/userfunc.o  objects/version.o 
objects/vim9compile.o objects/vim9execute.o  objects/vim9script.o 
objects/vim9type.o objects/viminfo.o  objects/window.o
objects/bufwrite.o                          objects/xdiffi.o
objects/xemit.o  objects/xprepare.o  objects/xutils.o
objects/xhistogram.o  objects/xpatience.o objects/charset.o
objects/json.o  objects/main.o  objects/memfile.o
objects/message.o               -lm -ltermlib -lelf
/usr/ccs/bin/ld: Unsatisfied symbols:
   use_xterm_like_mouse (first referenced in objects/term.o) (code)
link.sh: Linking doesn't work at all, removing auto/link.sed
*** Error exit code 1

Stop.
*** Error exit code 1

Stop.
</snip>

It looks like a mismatch of #defines.
In term.c, lines 2057-2074 are conditionally included if UNIX or VMS are
defined. However, the function use_xterm_like_mouse() is only included
(in os_unix.c) if FEAT_MOUSE_XTERM or PROTO are also defined (line 2326).

Cheers
John

Bram Moolenaar

unread,
Jan 15, 2021, 4:28:07 PM1/15/21
to vim...@googlegroups.com, John Marriott

John Marriott wrote:

> On 15-Jan-2021 03:35, Bram Moolenaar wrote:
> > Patch 8.2.2345
> > Problem: No focus events in a terminal.
> > Solution: Add the t_fd and t_fe termcap entries and implement detecting
> > focus events. (Hayaki Saito, Magnus Groß, closes #7673,
> > closes #609, closes #5526)
> > Files: runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.h
> >
> >
> After this patch, HP-UX spits out this linker error if FEAT_MOUSE_XTERM
> is not defined:
> <snip>
>  cc   -L/usr/local/lib         -o vim objects/arabic.o 

[...]

> /usr/ccs/bin/ld: Unsatisfied symbols:
>    use_xterm_like_mouse (first referenced in objects/term.o) (code)
> link.sh: Linking doesn't work at all, removing auto/link.sed
> *** Error exit code 1
>
> Stop.
> *** Error exit code 1
>
> Stop.
> </snip>
>
> It looks like a mismatch of #defines.
> In term.c, lines 2057-2074 are conditionally included if UNIX or VMS are
> defined. However, the function use_xterm_like_mouse() is only included
> (in os_unix.c) if FEAT_MOUSE_XTERM or PROTO are also defined (line 2326).

Hmm, I wonder how you got the defines in this state. The feature.h file
contains:

#if defined(UNIX) || defined(VMS)
# define FEAT_MOUSE_XTERM

We can adjust the #ifdef, but I still wonder why it doensn't work for
you currently. Is FEAT_MOUSE_XTERM undefined somehow?

--
hundred-and-one symptoms of being an internet addict:
157. You fum through a magazine, you first check to see if it has a web
address.

John Marriott

unread,
Jan 17, 2021, 3:15:38 PM1/17/21
to vim...@googlegroups.com
Hi Bram,

I manually remove features that I don't need for each of my builds.
My work's HP-UX machine is very old and is lacking in resources so I try
to keep the build as small as workable. Because with this machine I have
no mouse capability I comment out all of the mouse related features in
feature.h, including FEAT_MOUSE_XTERM.

Sorry for any confusion.

Cheers
John
Reply all
Reply to author
Forward
0 new messages