Patch 8.0.0860
Problem:    There may be side effects when a channel appends to a buffer that
            is not the current buffer.
Solution:   Properly switch to another buffer before appending. (Yasuhiro
            Matsumoto, closes #1926, closes #1937)
Files:      src/channel.c, src/buffer.c, src/proto/buffer.pro,
            src/if_py_both.h


*** ../vim-8.0.0859/src/channel.c       2017-08-03 17:06:40.977493439 +0200
--- src/channel.c       2017-08-04 21:16:26.542841856 +0200
***************
*** 2284,2290 ****
      static void
  append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T 
part)
  {
!     buf_T     *save_curbuf = curbuf;
      linenr_T    lnum = buffer->b_ml.ml_line_count;
      int               save_write_to = buffer->b_write_to_channel;
      chanpart_T  *ch_part = &channel->ch_part[part];
--- 2284,2292 ----
      static void
  append_to_buffer(buf_T *buffer, char_u *msg, channel_T *channel, ch_part_T 
part)
  {
!     bufref_T  save_curbuf = {NULL, 0, 0};
!     win_T     *save_curwin = NULL;
!     tabpage_T *save_curtab = NULL;
      linenr_T    lnum = buffer->b_ml.ml_line_count;
      int               save_write_to = buffer->b_write_to_channel;
      chanpart_T  *ch_part = &channel->ch_part[part];
***************
*** 2313,2320 ****
      ch_log(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
  
      buffer->b_p_ma = TRUE;
!     curbuf = buffer;
!     curwin->w_buffer = curbuf;
      u_sync(TRUE);
      /* ignore undo failure, undo is not very useful here */
      ignored = u_save(lnum - empty, lnum + 1);
--- 2315,2324 ----
      ch_log(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
  
      buffer->b_p_ma = TRUE;
! 
!     /* Save curbuf/curwin/curtab and make "buffer" the current buffer. */
!     switch_to_win_for_buf(buffer, &save_curwin, &save_curtab, &save_curbuf);
! 
      u_sync(TRUE);
      /* ignore undo failure, undo is not very useful here */
      ignored = u_save(lnum - empty, lnum + 1);
***************
*** 2328,2335 ****
      else
        ml_append(lnum, msg, 0, FALSE);
      appended_lines_mark(lnum, 1L);
!     curbuf = save_curbuf;
!     curwin->w_buffer = curbuf;
      if (ch_part->ch_nomodifiable)
        buffer->b_p_ma = FALSE;
      else
--- 2332,2341 ----
      else
        ml_append(lnum, msg, 0, FALSE);
      appended_lines_mark(lnum, 1L);
! 
!     /* Restore curbuf/curwin/curtab */
!     restore_win_for_buf(save_curwin, save_curtab, &save_curbuf);
! 
      if (ch_part->ch_nomodifiable)
        buffer->b_p_ma = FALSE;
      else
***************
*** 2338,2344 ****
      if (buffer->b_nwindows > 0)
      {
        win_T   *wp;
-       win_T   *save_curwin;
  
        FOR_ALL_WINDOWS(wp)
        {
--- 2344,2349 ----
*** ../vim-8.0.0859/src/buffer.c        2017-08-03 22:44:51.038797722 +0200
--- src/buffer.c        2017-08-04 21:09:42.361921845 +0200
***************
*** 5794,5802 ****
      return NULL;
  }
  
! #if (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \
        || defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) \
        || defined(PROTO)
  /*
   * Find a window for buffer "buf".
   * If found OK is returned and "wp" and "tp" are set to the window and 
tabpage.
--- 5794,5845 ----
      return NULL;
  }
  
! #if defined(FEAT_JOB_CHANNEL) \
        || defined(FEAT_PYTHON) || defined(FEAT_PYTHON3) \
        || defined(PROTO)
+ # define SWITCH_TO_WIN
+ 
+ /*
+  * Find a window that contains "buf" and switch to it.
+  * If there is no such window, use the current window and change "curbuf".
+  * Caller must initialize save_curbuf to NULL.
+  * restore_win_for_buf() MUST be called later!
+  */
+     void
+ switch_to_win_for_buf(
+     buf_T     *buf,
+     win_T     **save_curwinp,
+     tabpage_T **save_curtabp,
+     bufref_T  *save_curbuf)
+ {
+     win_T     *wp;
+     tabpage_T *tp;
+ 
+     if (find_win_for_buf(buf, &wp, &tp) == FAIL)
+       switch_buffer(save_curbuf, buf);
+     else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
+     {
+       restore_win(*save_curwinp, *save_curtabp, TRUE);
+       switch_buffer(save_curbuf, buf);
+     }
+ }
+ 
+     void
+ restore_win_for_buf(
+     win_T     *save_curwin,
+     tabpage_T *save_curtab,
+     bufref_T  *save_curbuf)
+ {
+     if (save_curbuf->br_buf == NULL)
+       restore_win(save_curwin, save_curtab, TRUE);
+     else
+       restore_buffer(save_curbuf);
+ }
+ #endif
+ 
+ #if (defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)) \
+       || defined(SWITCH_TO_WIN) \
+       || defined(PROTO)
  /*
   * Find a window for buffer "buf".
   * If found OK is returned and "wp" and "tp" are set to the window and 
tabpage.
*** ../vim-8.0.0859/src/proto/buffer.pro        2017-07-27 22:03:45.546703088 
+0200
--- src/proto/buffer.pro        2017-08-04 21:15:06.431461122 +0200
***************
*** 61,66 ****
--- 61,68 ----
  int bt_dontwrite_msg(buf_T *buf);
  int buf_hide(buf_T *buf);
  char_u *buf_spname(buf_T *buf);
+ void switch_to_win_for_buf(buf_T *buf, win_T **save_curwinp, tabpage_T 
**save_curtabp, bufref_T *save_curbuf);
+ void restore_win_for_buf(win_T *save_curwin, tabpage_T *save_curtab, bufref_T 
*save_curbuf);
  int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp);
  void buf_addsign(buf_T *buf, int id, linenr_T lnum, int typenr);
  linenr_T buf_change_sign_type(buf_T *buf, int markId, int typenr);
*** ../vim-8.0.0859/src/if_py_both.h    2017-06-04 14:57:57.312461379 +0200
--- src/if_py_both.h    2017-08-04 21:09:25.994043970 +0200
***************
*** 4263,4305 ****
  }
  
  /*
-  * Find a window that contains "buf" and switch to it.
-  * If there is no such window, use the current window and change "curbuf".
-  * Caller must initialize save_curbuf to NULL.
-  * restore_win_for_buf() MUST be called later!
-  */
-     static void
- switch_to_win_for_buf(
-     buf_T     *buf,
-     win_T     **save_curwinp,
-     tabpage_T **save_curtabp,
-     bufref_T  *save_curbuf)
- {
-     win_T     *wp;
-     tabpage_T *tp;
- 
-     if (find_win_for_buf(buf, &wp, &tp) == FAIL)
-       switch_buffer(save_curbuf, buf);
-     else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL)
-     {
-       restore_win(*save_curwinp, *save_curtabp, TRUE);
-       switch_buffer(save_curbuf, buf);
-     }
- }
- 
-     static void
- restore_win_for_buf(
-     win_T     *save_curwin,
-     tabpage_T *save_curtab,
-     bufref_T  *save_curbuf)
- {
-     if (save_curbuf->br_buf == NULL)
-       restore_win(save_curwin, save_curtab, TRUE);
-     else
-       restore_buffer(save_curbuf);
- }
- 
- /*
   * Replace a line in the specified buffer. The line number is
   * in Vim format (1-based). The replacement line is given as
   * a Python string object. The object is checked for validity
--- 4263,4268 ----
*** ../vim-8.0.0859/src/version.c       2017-08-04 20:29:49.052411560 +0200
--- src/version.c       2017-08-04 21:00:20.094336530 +0200
***************
*** 771,772 ****
--- 771,774 ----
  {   /* Add new patch number below this line */
+ /**/
+     860,
  /**/

-- 
FATHER:    You only killed the bride's father - that's all -
LAUNCELOT: Oh dear, I didn't really mean to...
FATHER:    Didn't mean to?  You put your sword right through his head!
LAUNCELOT: Gosh - Is he all right?
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui