0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

updated for version 7.3.862

Problem:    Dragging the status line can be slow.
Solution:   Look ahead and drop the drag event if there is a next one.
This commit is contained in:
Bram Moolenaar
2013-03-16 14:20:51 +01:00
parent 20754027b3
commit 2526ef276b
5 changed files with 63 additions and 45 deletions

View File

@@ -11238,27 +11238,7 @@ f_getchar(argvars, rettv)
rettv->vval.v_string = vim_strsave(temp);
#ifdef FEAT_MOUSE
if (n == K_LEFTMOUSE
|| n == K_LEFTMOUSE_NM
|| n == K_LEFTDRAG
|| n == K_LEFTRELEASE
|| n == K_LEFTRELEASE_NM
|| n == K_MIDDLEMOUSE
|| n == K_MIDDLEDRAG
|| n == K_MIDDLERELEASE
|| n == K_RIGHTMOUSE
|| n == K_RIGHTDRAG
|| n == K_RIGHTRELEASE
|| n == K_X1MOUSE
|| n == K_X1DRAG
|| n == K_X1RELEASE
|| n == K_X2MOUSE
|| n == K_X2DRAG
|| n == K_X2RELEASE
|| n == K_MOUSELEFT
|| n == K_MOUSERIGHT
|| n == K_MOUSEDOWN
|| n == K_MOUSEUP)
if (is_mouse_key(n))
{
int row = mouse_row;
int col = mouse_col;

View File

@@ -3288,6 +3288,38 @@ ask_yesno(str, direct)
return r;
}
#if defined(FEAT_MOUSE) || defined(PROTO)
/*
* Return TRUE if "c" is a mouse key.
*/
int
is_mouse_key(c)
int c;
{
return c == K_LEFTMOUSE
|| c == K_LEFTMOUSE_NM
|| c == K_LEFTDRAG
|| c == K_LEFTRELEASE
|| c == K_LEFTRELEASE_NM
|| c == K_MIDDLEMOUSE
|| c == K_MIDDLEDRAG
|| c == K_MIDDLERELEASE
|| c == K_RIGHTMOUSE
|| c == K_RIGHTDRAG
|| c == K_RIGHTRELEASE
|| c == K_MOUSEDOWN
|| c == K_MOUSEUP
|| c == K_MOUSELEFT
|| c == K_MOUSERIGHT
|| c == K_X1MOUSE
|| c == K_X1DRAG
|| c == K_X1RELEASE
|| c == K_X2MOUSE
|| c == K_X2DRAG
|| c == K_X2RELEASE;
}
#endif
/*
* Get a key stroke directly from the user.
* Ignores mouse clicks and scrollbar events, except a click for the left
@@ -3373,31 +3405,10 @@ get_keystroke()
n = TO_SPECIAL(buf[1], buf[2]);
if (buf[1] == KS_MODIFIER
|| n == K_IGNORE
#ifdef FEAT_MOUSE
|| n == K_LEFTMOUSE_NM
|| n == K_LEFTDRAG
|| n == K_LEFTRELEASE
|| n == K_LEFTRELEASE_NM
|| n == K_MIDDLEMOUSE
|| n == K_MIDDLEDRAG
|| n == K_MIDDLERELEASE
|| n == K_RIGHTMOUSE
|| n == K_RIGHTDRAG
|| n == K_RIGHTRELEASE
|| n == K_MOUSEDOWN
|| n == K_MOUSEUP
|| n == K_MOUSELEFT
|| n == K_MOUSERIGHT
|| n == K_X1MOUSE
|| n == K_X1DRAG
|| n == K_X1RELEASE
|| n == K_X2MOUSE
|| n == K_X2DRAG
|| n == K_X2RELEASE
# ifdef FEAT_GUI
|| (is_mouse_key(n) && n != K_LEFTMOUSE)
#ifdef FEAT_GUI
|| n == K_VER_SCROLLBAR
|| n == K_HOR_SCROLLBAR
# endif
#endif
)
{

View File

@@ -2443,7 +2443,31 @@ do_mouse(oap, c, dir, count, fixindent)
return FALSE;
}
which_button = get_mouse_button(KEY2TERMCAP1(c), &is_click, &is_drag);
for (;;)
{
which_button = get_mouse_button(KEY2TERMCAP1(c), &is_click, &is_drag);
if (is_drag)
{
/* If the next character is the same mouse event then use that
* one. Speeds up dragging the status line. */
if (vpeekc() != NUL)
{
int nc;
int save_mouse_row = mouse_row;
int save_mouse_col = mouse_col;
/* Need to get the character, peeking doesn't get the actual
* one. */
nc = safe_vgetc();
if (c == nc)
continue;
vungetc(nc);
mouse_row = save_mouse_row;
mouse_col = save_mouse_col;
}
}
break;
}
#ifdef FEAT_MOUSESHAPE
/* May have stopped dragging the status or separator line. The pointer is

View File

@@ -42,6 +42,7 @@ void unchanged __ARGS((buf_T *buf, int ff));
void check_status __ARGS((buf_T *buf));
void change_warning __ARGS((int col));
int ask_yesno __ARGS((char_u *str, int direct));
int is_mouse_key __ARGS((int c));
int get_keystroke __ARGS((void));
int get_number __ARGS((int colon, int *mouse_used));
int prompt_for_number __ARGS((int *mouse_used));

View File

@@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
862,
/**/
861,
/**/