=46rom=20955f68e7c67bcc474df05c3d0f993c5387d14f95=20Mon=20Sep=2017=20=
00:00:00=202001=0AFrom:=20Jonathon=20Mah=20<me@JonathonMah.com>=0ADate:=20=
Tue,=206=20Jan=202009=2007:04:54=20+1030=0ASubject:=20[PATCH]=20Keep=20=
scrollbind-bound=20windows=20in=20sync=20when=20unfocussed=20Vim=20=
windows=20are=20scrolled=0A=0AThis=20is=20particularly=20noticeable=20=
when=20using=20the=20scroll=20wheel.=0A---=0A=20src/edit.c=20=20=20=20=20=
=20=20=20=20=20=20|=20=20=20=203=20++=0A=20src/gui.c=20=20=20=20=20=20=20=
=20=20=20=20=20|=20=20=2019=20+++++++------=0A=20src/normal.c=20=20=20=20=
=20=20=20=20=20|=20=20=2067=20=
++++++++++++++++++++++++++++++++-----------------=0A=20=
src/proto/normal.pro=20|=20=20=20=202=20+=0A=204=20files=20changed,=2059=20=
insertions(+),=2032=20deletions(-)=0A=0Adiff=20--git=20a/src/edit.c=20=
b/src/edit.c=0Aindex=20714d320..8fb3224=20100644=0A---=20a/src/edit.c=0A=
+++=20b/src/edit.c=0A@@=20-8731,6=20+8731,9=20@@=20ins_mousescroll(up)=0A=
=20#=20ifdef=20FEAT_INS_EXPAND=0A=20=09did_scroll=20=3D=20TRUE;=0A=20#=20=
endif=0A+#ifdef=20FEAT_SCROLLBIND=0A+=09do_check_scrollbind(TRUE);=0A=
+#endif=0A=20=20=20=20=20}=0A=20=0A=20#=20if=20defined(FEAT_GUI)=20&&=20=
defined(FEAT_WINDOWS)=0Adiff=20--git=20a/src/gui.c=20b/src/gui.c=0Aindex=20=
196a55e..2385722=20100644=0A---=20a/src/gui.c=0A+++=20b/src/gui.c=0A@@=20=
-3766,15=20+3766,16=20@@=20gui_drag_scrollbar(sb,=20value,=20=
still_dragging)=0A=20{=0A=20#ifdef=20FEAT_WINDOWS=0A=20=20=20=20=20win_T=09=
*wp;=0A+=20=20=20=20win_T=09*scrolledwin=20=3D=20(sb->wp=20=3D=3D=20=
NULL)=20?=20curwin=20:=20sb->wp;=0A=20#endif=0A=20=20=20=20=20int=09=09=
sb_num;=0A=20#ifdef=20USE_ON_FLY_SCROLL=0A=20=20=20=20=20colnr_T=09=
old_leftcol=20=3D=20curwin->w_leftcol;=0A=20#=20ifdef=20FEAT_SCROLLBIND=0A=
-=20=20=20=20linenr_T=09old_topline=20=3D=20curwin->w_topline;=0A+=20=20=20=
=20linenr_T=09old_topline=20=3D=20scrolledwin->w_topline;=0A=20#=20endif=0A=
=20#=20ifdef=20FEAT_DIFF=0A-=20=20=20=20int=09=09old_topfill=20=3D=20=
curwin->w_topfill;=0A+=20=20=20=20int=09=09old_topfill=20=3D=20=
scrolledwin->w_topfill;=0A=20#=20endif=0A=20#else=0A=20=20=20=20=20=
char_u=09bytes[sizeof(long_u)];=0A@@=20-3946,15=20+3947,15=20@@=20=
gui_drag_scrollbar(sb,=20value,=20still_dragging)=0A=20=20=20=20=20/*=0A=20=
=20=20=20=20=20*=20synchronize=20other=20windows,=20as=20necessary=20=
according=20to=20'scrollbind'=0A=20=20=20=20=20=20*/=0A-=20=20=20=20if=20=
(curwin->w_p_scb=0A-=09=20=20=20=20&&=20((sb->wp=20=3D=3D=20NULL=20&&=20=
curwin->w_leftcol=20!=3D=20old_leftcol)=0A-=09=09||=20(sb->wp=20=3D=3D=20=
curwin=20&&=20(curwin->w_topline=20!=3D=20old_topline=0A+=20=20=20=20if=20=
((curwin->w_p_scb=20&&=20(sb->wp=20=3D=3D=20NULL=20&&=20=
curwin->w_leftcol=20!=3D=20old_leftcol))=0A+=09=20=20=20=20||=20((sb->wp=20=
!=3D=20NULL)=20&&=20scrolledwin->w_p_scb=0A+=09=09&&=20=
(scrolledwin->w_topline=20!=3D=20old_topline=0A=20#=20=20ifdef=20=
FEAT_DIFF=0A-=09=09=09=09=09=20=20=20||=20curwin->w_topfill=20!=3D=20=
old_topfill=0A+=09=09=20=20=20||=20scrolledwin->w_topfill=20!=3D=20=
old_topfill=0A=20#=20=20endif=0A-=09=09=09))))=0A+=09=09)))=0A=20=20=20=20=
=20{=0A-=09do_check_scrollbind(TRUE);=0A+=09=
do_check_scrollbind_win(TRUE,=20scrolledwin);=0A=20=09/*=20need=20to=20=
update=20the=20window=20right=20here=20*/=0A=20=09for=20(wp=20=3D=20=
firstwin;=20wp=20!=3D=20NULL;=20wp=20=3D=20wp->w_next)=0A=20=09=20=20=20=20=
if=20(wp->w_redr_type=20>=200)=0A@@=20-4295,7=20+4296,7=20@@=20=
gui_do_scroll()=0A=20=09if=20(old_cursor.lnum=20!=3D=20=
wp->w_cursor.lnum)=0A=20=09=20=20=20=20coladvance(wp->w_curswant);=0A=20=
#ifdef=20FEAT_SCROLLBIND=0A-=09wp->w_scbind_pos=20=3D=20wp->w_topline;=0A=
+=09do_check_scrollbind_win(TRUE,=20wp);=0A=20#endif=0A=20=20=20=20=20}=0A=
=20=0Adiff=20--git=20a/src/normal.c=20b/src/normal.c=0Aindex=20=
e9787ab..fcb3153=20100644=0A---=20a/src/normal.c=0A+++=20b/src/normal.c=0A=
@@=20-3923,10=20+3923,11=20@@=20display_showcmd()=0A=20=20*=20scrolled.=20=
=20Called=20from=20normal_cmd()=20and=20edit().=0A=20=20*/=0A=20=20=20=20=
=20void=0A-do_check_scrollbind(check)=0A+do_check_scrollbind_win(check,=20=
wp)=0A=20=20=20=20=20int=09=09check;=0A+=20=20=20=20win_T=09*wp;=0A=20{=0A=
-=20=20=20=20static=20win_T=09*old_curwin=20=3D=20NULL;=0A+=20=20=20=20=
static=20win_T=09*old_wp=20=3D=20NULL;=0A=20=20=20=20=20static=20=
linenr_T=09old_topline=20=3D=200;=0A=20#ifdef=20FEAT_DIFF=0A=20=20=20=20=20=
static=20int=09=09old_topfill=20=3D=200;=0A@@=20-3934,32=20+3935,32=20@@=20=
do_check_scrollbind(check)=0A=20=20=20=20=20static=20buf_T=09*old_buf=20=
=3D=20NULL;=0A=20=20=20=20=20static=20colnr_T=09old_leftcol=20=3D=200;=0A=
=20=0A-=20=20=20=20if=20(check=20&&=20curwin->w_p_scb)=0A+=20=20=20=20if=20=
(check=20&&=20wp->w_p_scb)=0A=20=20=20=20=20{=0A=20=09/*=20If=20a=20=
":syncbind"=20command=20was=20just=20used,=20don't=20scroll,=20only=20=
reset=0A=20=09=20*=20the=20values.=20*/=0A=20=09if=20(did_syncbind)=0A=20=
=09=20=20=20=20did_syncbind=20=3D=20FALSE;=0A-=09else=20if=20(curwin=20=
=3D=3D=20old_curwin)=0A+=09else=20if=20(wp=20=3D=3D=20old_wp)=0A=20=09{=0A=
=20=09=20=20=20=20/*=0A=20=09=20=20=20=20=20*=20Synchronize=20other=20=
windows,=20as=20necessary=20according=20to=0A=20=09=20=20=20=20=20*=20=
'scrollbind'.=20=20Don't=20do=20this=20after=20an=20":edit"=20command,=20=
except=0A=20=09=20=20=20=20=20*=20when=20'diff'=20is=20set.=0A=20=09=20=20=
=20=20=20*/=0A-=09=20=20=20=20if=20((curwin->w_buffer=20=3D=3D=20old_buf=0A=
+=09=20=20=20=20if=20((wp->w_buffer=20=3D=3D=20old_buf=0A=20#ifdef=20=
FEAT_DIFF=0A-=09=09=09||=20curwin->w_p_diff=0A+=09=09=09||=20=
wp->w_p_diff=0A=20#endif=0A=20=09=09)=0A-=09=09&&=20(curwin->w_topline=20=
!=3D=20old_topline=0A+=09=09&&=20(wp->w_topline=20!=3D=20old_topline=0A=20=
#ifdef=20FEAT_DIFF=0A-=09=09=09||=20curwin->w_topfill=20!=3D=20=
old_topfill=0A+=09=09=09||=20wp->w_topfill=20!=3D=20old_topfill=0A=20=
#endif=0A-=09=09=09||=20curwin->w_leftcol=20!=3D=20old_leftcol))=0A+=09=09=
=09||=20wp->w_leftcol=20!=3D=20old_leftcol))=0A=20=09=20=20=20=20{=0A-=09=
=09check_scrollbind(curwin->w_topline=20-=20old_topline,=0A-=09=09=09=
(long)(curwin->w_leftcol=20-=20old_leftcol));=0A+=09=09=
check_scrollbind_win(wp->w_topline=20-=20old_topline,=0A+=09=09=09=
(long)(wp->w_leftcol=20-=20old_leftcol),=20wp);=0A=20=09=20=20=20=20}=0A=20=
=09}=0A=20=09else=20if=20(vim_strchr(p_sbo,=20'j'))=20/*=20jump=20flag=20=
set=20in=20'scrollopt'=20*/=0A@@=20-3974,18=20+3975,25=20@@=20=
do_check_scrollbind(check)=0A=20=09=20=20=20=20=20*=20need=20to=20jump=20=
so=20that=20the=20current=20window's=20relative=20position=20is=0A=20=09=20=
=20=20=20=20*=20visible=20on-screen.=0A=20=09=20=20=20=20=20*/=0A-=09=20=20=
=20=20check_scrollbind(curwin->w_topline=20-=20curwin->w_scbind_pos,=20=
0L);=0A+=09=20=20=20=20check_scrollbind_win(wp->w_topline=20-=20=
wp->w_scbind_pos,=200L,=20wp);=0A=20=09}=0A-=09curwin->w_scbind_pos=20=3D=20=
curwin->w_topline;=0A+=09wp->w_scbind_pos=20=3D=20wp->w_topline;=0A=20=20=
=20=20=20}=0A=20=0A-=20=20=20=20old_curwin=20=3D=20curwin;=0A-=20=20=20=20=
old_topline=20=3D=20curwin->w_topline;=0A+=20=20=20=20old_wp=20=3D=20wp;=0A=
+=20=20=20=20old_topline=20=3D=20wp->w_topline;=0A=20#ifdef=20FEAT_DIFF=0A=
-=20=20=20=20old_topfill=20=3D=20curwin->w_topfill;=0A+=20=20=20=20=
old_topfill=20=3D=20wp->w_topfill;=0A=20#endif=0A-=20=20=20=20old_buf=20=
=3D=20curwin->w_buffer;=0A-=20=20=20=20old_leftcol=20=3D=20=
curwin->w_leftcol;=0A+=20=20=20=20old_buf=20=3D=20wp->w_buffer;=0A+=20=20=
=20=20old_leftcol=20=3D=20wp->w_leftcol;=0A+}=0A+=0A+=20=20=20=20void=0A=
+do_check_scrollbind(check)=0A+=20=20=20=20int=09=09check;=0A+{=0A+=20=20=
=20=20do_check_scrollbind_win(check,=20curwin);=0A=20}=0A=20=0A=20/*=0A=
@@=20-3994,9=20+4002,10=20@@=20do_check_scrollbind(check)=0A=20=20*=20=
(1998-11-02=2016:21:01=20=20R.=20Edward=20Ralston=20=
<eralston@computer.org>)=0A=20=20*/=0A=20=20=20=20=20void=0A=
-check_scrollbind(topline_diff,=20leftcol_diff)=0A=
+check_scrollbind_win(topline_diff,=20leftcol_diff,=20wp)=0A=20=20=20=20=20=
linenr_T=09topline_diff;=0A=20=20=20=20=20long=09leftcol_diff;=0A+=20=20=20=
=20win_T=09*wp;=0A=20{=0A=20=20=20=20=20int=09=09want_ver;=0A=20=20=20=20=
=20int=09=09want_hor;=0A@@=20-4015,7=20+4024,7=20@@=20=
check_scrollbind(topline_diff,=20leftcol_diff)=0A=20=20=20=20=20=20*/=0A=20=
=20=20=20=20want_ver=20=3D=20(vim_strchr(p_sbo,=20'v')=20&&=20=
topline_diff=20!=3D=200);=0A=20#ifdef=20FEAT_DIFF=0A-=20=20=20=20=
want_ver=20|=3D=20old_curwin->w_p_diff;=0A+=20=20=20=20want_ver=20|=3D=20=
wp->w_p_diff;=0A=20#endif=0A=20=20=20=20=20want_hor=20=3D=20=
(vim_strchr(p_sbo,=20'h')=20&&=20(leftcol_diff=20||=20topline_diff=20!=3D=20=
0));=0A=20=0A@@=20-4029,7=20+4038,7=20@@=20=
check_scrollbind(topline_diff,=20leftcol_diff)=0A=20=20=20=20=20{=0A=20=09=
curbuf=20=3D=20curwin->w_buffer;=0A=20=09/*=20skip=20original=20window=20=
=20and=20windows=20with=20'noscrollbind'=20*/=0A-=09if=20(curwin=20!=3D=20=
old_curwin=20&&=20curwin->w_p_scb)=0A+=09if=20(curwin=20!=3D=20wp=20&&=20=
curwin->w_p_scb)=0A=20=09{=0A=20=09=20=20=20=20/*=0A=20=09=20=20=20=20=20=
*=20do=20the=20vertical=20scroll=0A@@=20-4037,9=20+4046,9=20@@=20=
check_scrollbind(topline_diff,=20leftcol_diff)=0A=20=09=20=20=20=20if=20=
(want_ver)=0A=20=09=20=20=20=20{=0A=20#ifdef=20FEAT_DIFF=0A-=09=09if=20=
(old_curwin->w_p_diff=20&&=20curwin->w_p_diff)=0A+=09=09if=20=
(wp->w_p_diff=20&&=20curwin->w_p_diff)=0A=20=09=09{=0A-=09=09=20=20=20=20=
diff_set_topline(old_curwin,=20curwin);=0A+=09=09=20=20=20=20=
diff_set_topline(wp,=20curwin);=0A=20=09=09}=0A=20=09=09else=0A=20#endif=0A=
@@=20-4086,6=20+4095,14=20@@=20check_scrollbind(topline_diff,=20=
leftcol_diff)=0A=20=20=20=20=20curwin=20=3D=20old_curwin;=0A=20=20=20=20=20=
curbuf=20=3D=20old_curbuf;=0A=20}=0A+=0A+void=0A=
+check_scrollbind(topline_diff,=20leftcol_diff)=0A+=20=20=20=20linenr_T=09=
topline_diff;=0A+=20=20=20=20long=09leftcol_diff;=0A+{=0A+=20=20=20=20=
check_scrollbind_win(topline_diff,=20leftcol_diff,=20curwin);=0A+}=0A=20=
#endif=20/*=20#ifdef=20FEAT_SCROLLBIND=20*/=0A=20=0A=20/*=0A@@=20-4525,6=20=
+4542,10=20@@=20nv_mousescroll(cap)=0A=20=09nv_scroll_line(cap);=0A=20=20=
=20=20=20}=0A=20=0A+#ifdef=20FEAT_SCROLLBIND=0A+=20=20=20=20=
do_check_scrollbind(TRUE);=0A+#endif=0A+=0A=20#=20if=20defined(FEAT_GUI)=20=
&&=20defined(FEAT_WINDOWS)=0A=20=20=20=20=20curwin->w_redr_status=20=3D=20=
TRUE;=0A=20=0Adiff=20--git=20a/src/proto/normal.pro=20=
b/src/proto/normal.pro=0Aindex=2055e8163..0dcd144=20100644=0A---=20=
a/src/proto/normal.pro=0A+++=20b/src/proto/normal.pro=0A@@=20-14,7=20=
+14,9=20@@=20int=20add_to_showcmd=20__ARGS((int=20c));=0A=20void=20=
add_to_showcmd_c=20__ARGS((int=20c));=0A=20void=20push_showcmd=20=
__ARGS((void));=0A=20void=20pop_showcmd=20__ARGS((void));=0A+void=20=
do_check_scrollbind_win=20__ARGS((int=20check,=20win_T=20*wp));=0A=20=
void=20do_check_scrollbind=20__ARGS((int=20check));=0A+void=20=
check_scrollbind_win=20__ARGS((linenr_T=20topline_diff,=20long=20=
leftcol_diff,=20win_T=20*wp));=0A=20void=20check_scrollbind=20=
__ARGS((linenr_T=20topline_diff,=20long=20leftcol_diff));=0A=20int=20=
find_decl=20__ARGS((char_u=20*ptr,=20int=20len,=20int=20locally,=20int=20=
thisblock,=20int=20searchflags));=0A=20void=20scroll_redraw=20=
__ARGS((int=20up,=20long=20count));=0A--=20=0A1.6.0=0A=0A=
