Patch 8.2.3761
Problem:    Focus change is not passed on to a terminal window.
Solution:   If the current window is a terminal and focus events are enabled
            send a focus event escape sequence to the terminal.
Files:      src/ui.c, src/terminal.c, src/proto/terminal.pro,
            src/testdir/test_terminal.vim,
            src/testdir/dumps/Test_terminal_focus_1.dump,
            src/testdir/dumps/Test_terminal_focus_2.dump


*** ../vim-8.2.3760/src/ui.c    2021-11-29 20:39:06.682101619 +0000
--- src/ui.c    2021-12-08 21:21:17.692095515 +0000
***************
*** 1145,1150 ****
--- 1145,1154 ----
        last_time = time(NULL);
      }
  
+ #ifdef FEAT_TERMINAL
+     term_focus_change(in_focus);
+ #endif
+ 
      /*
       * Fire the focus gained/lost autocommand.
       */
*** ../vim-8.2.3760/src/terminal.c      2021-11-24 19:30:35.074782224 +0000
--- src/terminal.c      2021-12-08 21:54:46.620619618 +0000
***************
*** 1128,1133 ****
--- 1128,1148 ----
  }
  
  /*
+  * Read any vterm output and send it on the channel.
+  */
+     static void
+ term_forward_output(term_T *term)
+ {
+     VTerm *vterm = term->tl_vterm;
+     char   buf[KEY_BUF_LEN];
+     size_t curlen = vterm_output_read(vterm, buf, KEY_BUF_LEN);
+ 
+     if (curlen > 0)
+       channel_send(term->tl_job->jv_channel, get_tty_part(term),
+                                            (char_u *)buf, (int)curlen, NULL);
+ }
+ 
+ /*
   * Write job output "msg[len]" to the vterm.
   */
      static void
***************
*** 1154,1167 ****
  
      // flush vterm buffer when vterm responded to control sequence
      if (prevlen != vterm_output_get_buffer_current(vterm))
!     {
!       char   buf[KEY_BUF_LEN];
!       size_t curlen = vterm_output_read(vterm, buf, KEY_BUF_LEN);
! 
!       if (curlen > 0)
!           channel_send(term->tl_job->jv_channel, get_tty_part(term),
!                                            (char_u *)buf, (int)curlen, NULL);
!     }
  
      // this invokes the damage callbacks
      vterm_screen_flush_damage(vterm_obtain_screen(vterm));
--- 1169,1175 ----
  
      // flush vterm buffer when vterm responded to control sequence
      if (prevlen != vterm_output_get_buffer_current(vterm))
!       term_forward_output(term);
  
      // this invokes the damage callbacks
      vterm_screen_flush_damage(vterm_obtain_screen(vterm));
***************
*** 2490,2495 ****
--- 2498,2520 ----
      }
  }
  
+     void
+ term_focus_change(int in_focus)
+ {
+     term_T *term = curbuf->b_term;
+ 
+     if (term != NULL && term->tl_vterm != NULL)
+     {
+       VTermState      *state = vterm_obtain_state(term->tl_vterm);
+ 
+       if (in_focus)
+           vterm_state_focus_in(state);
+       else
+           vterm_state_focus_out(state);
+       term_forward_output(term);
+     }
+ }
+ 
  /*
   * vgetc() may not include CTRL in the key when modify_other_keys is set.
   * Return the Ctrl-key value in that case.
*** ../vim-8.2.3760/src/proto/terminal.pro      2021-11-21 14:51:09.929191583 
+0000
--- src/proto/terminal.pro      2021-12-08 21:30:30.723515642 +0000
***************
*** 18,23 ****
--- 18,24 ----
  cursorentry_T *term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg);
  int term_use_loop(void);
  void term_win_entered(void);
+ void term_focus_change(int in_focus);
  int terminal_loop(int blocking);
  int may_close_term_popup(void);
  void term_channel_closing(channel_T *ch);
*** ../vim-8.2.3760/src/testdir/test_terminal.vim       2021-11-21 
14:51:09.929191583 +0000
--- src/testdir/test_terminal.vim       2021-12-08 22:11:26.485558683 +0000
***************
*** 1124,1129 ****
--- 1124,1163 ----
    unlet g:job
  endfunc
  
+ func Test_terminal_focus_events()
+   CheckNotGui
+   CheckUnix
+   CheckRunVimInTerminal
+ 
+   let save_term = &term
+   let save_ttymouse = &ttymouse
+   set term=xterm ttymouse=xterm2
+ 
+   let lines =<< trim END
+       set term=xterm ttymouse=xterm2
+       au FocusLost * echo 'I am lost'
+       au FocusGained * echo 'I am back'
+       " FIXME: sometimes this job hangs, exit after a couple of seconds
+       call timer_start(2000, {id -> execute('qall')})
+   END
+   call writefile(lines, 'XtermFocus')
+   let buf = RunVimInTerminal('-S XtermFocus', #{rows: 6})
+ 
+   " Send a focus event to ourselves, it should be forwarded to the terminal
+   call feedkeys("\<Esc>[O", "Lx!")
+   call TermWait(buf)
+   call VerifyScreenDump(buf, 'Test_terminal_focus_1', {})
+ 
+   call feedkeys("\<Esc>[I", "Lx!")
+   call TermWait(buf)
+   call VerifyScreenDump(buf, 'Test_terminal_focus_2', {})
+ 
+   call StopVimInTerminal(buf)
+   call delete('XtermFocus')
+   let &term = save_term
+   let &ttymouse = save_ttymouse
+ endfunc
+ 
  " Run Vim, start a terminal in that Vim with the kill argument,
  " :qall works.
  func Run_terminal_qall_kill(line1, line2)
*** ../vim-8.2.3760/src/testdir/dumps/Test_terminal_focus_1.dump        
2021-12-08 22:12:32.333415553 +0000
--- src/testdir/dumps/Test_terminal_focus_1.dump        2021-12-08 
21:52:52.709193065 +0000
***************
*** 0 ****
--- 1,6 ----
+ > +0&#ffffff0@74
+ |~+0#4040ff13&| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |I+0#0000000&| |a|m| |l|o|s|t| @65
*** ../vim-8.2.3760/src/testdir/dumps/Test_terminal_focus_2.dump        
2021-12-08 22:12:32.337415544 +0000
--- src/testdir/dumps/Test_terminal_focus_2.dump        2021-12-08 
21:52:53.765187357 +0000
***************
*** 0 ****
--- 1,6 ----
+ > +0&#ffffff0@74
+ |~+0#4040ff13&| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |I+0#0000000&| |a|m| |b|a|c|k| @65
*** ../vim-8.2.3760/src/version.c       2021-12-08 21:00:20.985535798 +0000
--- src/version.c       2021-12-08 21:30:43.475501561 +0000
***************
*** 755,756 ****
--- 755,758 ----
  {   /* Add new patch number below this line */
+ /**/
+     3761,
  /**/

-- 
"How is your new girlfriend?"
"90-60-90 man!"
"What, pale purple?"

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20211208221407.ECB221C05A4%40moolenaar.net.

Raspunde prin e-mail lui