mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
patch 8.0.1405: duplicated code for getting a typed character
Problem: Duplicated code for getting a typed character. CursorHold is called too often in the GUI. (lilydjwg) Solution: Refactor code to move code up from mch_inchar(). Don't fire CursorHold if feedkeys() was used. (closes #2451)
This commit is contained in:
parent
606d45ccd8
commit
c9e649ae81
64
src/gui.c
64
src/gui.c
@ -2885,6 +2885,18 @@ gui_insert_lines(int row, int count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Passed to ui_wait_for_chars_or_timer(), ignoring extra arguments.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
gui_wait_for_chars_3(
|
||||||
|
long wtime,
|
||||||
|
int *interrupted UNUSED,
|
||||||
|
int ignore_input UNUSED)
|
||||||
|
{
|
||||||
|
return gui_mch_wait_for_chars(wtime);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns OK if a character was found to be available within the given time,
|
* Returns OK if a character was found to be available within the given time,
|
||||||
* or FAIL otherwise.
|
* or FAIL otherwise.
|
||||||
@ -2893,32 +2905,7 @@ gui_insert_lines(int row, int count)
|
|||||||
gui_wait_for_chars_or_timer(long wtime)
|
gui_wait_for_chars_or_timer(long wtime)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_TIMERS
|
#ifdef FEAT_TIMERS
|
||||||
int due_time;
|
return ui_wait_for_chars_or_timer(wtime, gui_wait_for_chars_3, NULL, 0);
|
||||||
long remaining = wtime;
|
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
|
||||||
|
|
||||||
/* When waiting very briefly don't trigger timers. */
|
|
||||||
if (wtime >= 0 && wtime < 10L)
|
|
||||||
return gui_mch_wait_for_chars(wtime);
|
|
||||||
|
|
||||||
while (wtime < 0 || remaining > 0)
|
|
||||||
{
|
|
||||||
/* Trigger timers and then get the time in wtime until the next one is
|
|
||||||
* due. Wait up to that time. */
|
|
||||||
due_time = check_due_timer();
|
|
||||||
if (typebuf.tb_change_cnt != tb_change_cnt)
|
|
||||||
{
|
|
||||||
/* timer may have used feedkeys() */
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
|
|
||||||
due_time = remaining;
|
|
||||||
if (gui_mch_wait_for_chars(due_time))
|
|
||||||
return OK;
|
|
||||||
if (wtime > 0)
|
|
||||||
remaining -= due_time;
|
|
||||||
}
|
|
||||||
return FAIL;
|
|
||||||
#else
|
#else
|
||||||
return gui_mch_wait_for_chars(wtime);
|
return gui_mch_wait_for_chars(wtime);
|
||||||
#endif
|
#endif
|
||||||
@ -2933,10 +2920,9 @@ gui_wait_for_chars_or_timer(long wtime)
|
|||||||
* or FAIL otherwise.
|
* or FAIL otherwise.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
gui_wait_for_chars(long wtime)
|
gui_wait_for_chars(long wtime, int tb_change_cnt)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
|
||||||
|
|
||||||
#ifdef FEAT_MENU
|
#ifdef FEAT_MENU
|
||||||
/*
|
/*
|
||||||
@ -2974,13 +2960,13 @@ gui_wait_for_chars(long wtime)
|
|||||||
retval = FAIL;
|
retval = FAIL;
|
||||||
/*
|
/*
|
||||||
* We may want to trigger the CursorHold event. First wait for
|
* We may want to trigger the CursorHold event. First wait for
|
||||||
* 'updatetime' and if nothing is typed within that time put the
|
* 'updatetime' and if nothing is typed within that time, and feedkeys()
|
||||||
* K_CURSORHOLD key in the input buffer.
|
* wasn't used, put the K_CURSORHOLD key in the input buffer.
|
||||||
*/
|
*/
|
||||||
if (gui_wait_for_chars_or_timer(p_ut) == OK)
|
if (gui_wait_for_chars_or_timer(p_ut) == OK)
|
||||||
retval = OK;
|
retval = OK;
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
else if (trigger_cursorhold())
|
else if (trigger_cursorhold() && typebuf.tb_change_cnt == tb_change_cnt)
|
||||||
{
|
{
|
||||||
char_u buf[3];
|
char_u buf[3];
|
||||||
|
|
||||||
@ -3005,6 +2991,22 @@ gui_wait_for_chars(long wtime)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Equivalent of mch_inchar() for the GUI.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
gui_inchar(
|
||||||
|
char_u *buf,
|
||||||
|
int maxlen,
|
||||||
|
long wtime, /* milli seconds */
|
||||||
|
int tb_change_cnt)
|
||||||
|
{
|
||||||
|
if (gui_wait_for_chars(wtime, tb_change_cnt)
|
||||||
|
&& !typebuf_changed(tb_change_cnt))
|
||||||
|
return read_from_input_buf(buf, (long)maxlen);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fill p[4] with mouse coordinates encoded for check_termcode().
|
* Fill p[4] with mouse coordinates encoded for check_termcode().
|
||||||
*/
|
*/
|
||||||
|
@ -619,7 +619,7 @@ vim_main2(void)
|
|||||||
# ifdef FEAT_SUN_WORKSHOP
|
# ifdef FEAT_SUN_WORKSHOP
|
||||||
if (!usingSunWorkShop)
|
if (!usingSunWorkShop)
|
||||||
# endif
|
# endif
|
||||||
gui_wait_for_chars(50L);
|
gui_wait_for_chars(50L, typebuf.tb_change_cnt);
|
||||||
TIME_MSG("GUI delay");
|
TIME_MSG("GUI delay");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -5790,36 +5790,8 @@ mch_breakcheck(int force)
|
|||||||
WaitForChar(long msec, int *interrupted, int ignore_input)
|
WaitForChar(long msec, int *interrupted, int ignore_input)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_TIMERS
|
#ifdef FEAT_TIMERS
|
||||||
long due_time;
|
return ui_wait_for_chars_or_timer(
|
||||||
long remaining = msec;
|
msec, WaitForCharOrMouse, interrupted, ignore_input) == OK;
|
||||||
int tb_change_cnt = typebuf.tb_change_cnt;
|
|
||||||
|
|
||||||
/* When waiting very briefly don't trigger timers. */
|
|
||||||
if (msec >= 0 && msec < 10L)
|
|
||||||
return WaitForCharOrMouse(msec, NULL, ignore_input);
|
|
||||||
|
|
||||||
while (msec < 0 || remaining > 0)
|
|
||||||
{
|
|
||||||
/* Trigger timers and then get the time in msec until the next one is
|
|
||||||
* due. Wait up to that time. */
|
|
||||||
due_time = check_due_timer();
|
|
||||||
if (typebuf.tb_change_cnt != tb_change_cnt)
|
|
||||||
{
|
|
||||||
/* timer may have used feedkeys() */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (due_time <= 0 || (msec > 0 && due_time > remaining))
|
|
||||||
due_time = remaining;
|
|
||||||
if (WaitForCharOrMouse(due_time, interrupted, ignore_input))
|
|
||||||
return TRUE;
|
|
||||||
if (interrupted != NULL && *interrupted)
|
|
||||||
/* Nothing available, but need to return so that side effects get
|
|
||||||
* handled, such as handling a message on a channel. */
|
|
||||||
return FALSE;
|
|
||||||
if (msec > 0)
|
|
||||||
remaining -= due_time;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
#else
|
#else
|
||||||
return WaitForCharOrMouse(msec, interrupted, ignore_input);
|
return WaitForCharOrMouse(msec, interrupted, ignore_input);
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,7 +29,8 @@ int gui_outstr_nowrap(char_u *s, int len, int flags, guicolor_T fg, guicolor_T b
|
|||||||
void gui_undraw_cursor(void);
|
void gui_undraw_cursor(void);
|
||||||
void gui_redraw(int x, int y, int w, int h);
|
void gui_redraw(int x, int y, int w, int h);
|
||||||
int gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
|
int gui_redraw_block(int row1, int col1, int row2, int col2, int flags);
|
||||||
int gui_wait_for_chars(long wtime);
|
int gui_wait_for_chars(long wtime, int tb_change_cnt);
|
||||||
|
int gui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
||||||
void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);
|
void gui_send_mouse_event(int button, int x, int y, int repeated_click, int_u modifiers);
|
||||||
int gui_xy2colrow(int x, int y, int *colp);
|
int gui_xy2colrow(int x, int y, int *colp);
|
||||||
void gui_menu_cb(vimmenu_T *menu);
|
void gui_menu_cb(vimmenu_T *menu);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
void ui_write(char_u *s, int len);
|
void ui_write(char_u *s, int len);
|
||||||
void ui_inchar_undo(char_u *s, int len);
|
void ui_inchar_undo(char_u *s, int len);
|
||||||
int ui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
int ui_inchar(char_u *buf, int maxlen, long wtime, int tb_change_cnt);
|
||||||
|
int ui_wait_for_chars_or_timer(long wtime, int (*wait_func)(long wtime, int *interrupted, int ignore_input), int *interrupted, int ignore_input);
|
||||||
int ui_char_avail(void);
|
int ui_char_avail(void);
|
||||||
void ui_delay(long msec, int ignoreinput);
|
void ui_delay(long msec, int ignoreinput);
|
||||||
void ui_suspend(void);
|
void ui_suspend(void);
|
||||||
|
57
src/ui.c
57
src/ui.c
@ -32,7 +32,7 @@ ui_write(char_u *s, int len)
|
|||||||
{
|
{
|
||||||
gui_write(s, len);
|
gui_write(s, len);
|
||||||
if (p_wd)
|
if (p_wd)
|
||||||
gui_wait_for_chars(p_wd);
|
gui_wait_for_chars(p_wd, typebuf.tb_change_cnt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -182,18 +182,13 @@ ui_inchar(
|
|||||||
|
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
if (gui.in_use)
|
if (gui.in_use)
|
||||||
{
|
retval = gui_inchar(buf, maxlen, wtime, tb_change_cnt);
|
||||||
if (gui_wait_for_chars(wtime) && !typebuf_changed(tb_change_cnt))
|
|
||||||
retval = read_from_input_buf(buf, (long)maxlen);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#ifndef NO_CONSOLE
|
#ifndef NO_CONSOLE
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
else
|
else
|
||||||
# endif
|
# endif
|
||||||
{
|
|
||||||
retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
|
retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (wtime == -1 || wtime > 100L)
|
if (wtime == -1 || wtime > 100L)
|
||||||
@ -212,6 +207,52 @@ theend:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_TIMERS) || defined(PROT)
|
||||||
|
/*
|
||||||
|
* Wait for a timer to fire or "wait_func" to return non-zero.
|
||||||
|
* Returns OK when something was read.
|
||||||
|
* Returns FAIL when it timed out or was interrupted.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ui_wait_for_chars_or_timer(
|
||||||
|
long wtime,
|
||||||
|
int (*wait_func)(long wtime, int *interrupted, int ignore_input),
|
||||||
|
int *interrupted,
|
||||||
|
int ignore_input)
|
||||||
|
{
|
||||||
|
int due_time;
|
||||||
|
long remaining = wtime;
|
||||||
|
int tb_change_cnt = typebuf.tb_change_cnt;
|
||||||
|
|
||||||
|
/* When waiting very briefly don't trigger timers. */
|
||||||
|
if (wtime >= 0 && wtime < 10L)
|
||||||
|
return wait_func(wtime, NULL, ignore_input);
|
||||||
|
|
||||||
|
while (wtime < 0 || remaining > 0)
|
||||||
|
{
|
||||||
|
/* Trigger timers and then get the time in wtime until the next one is
|
||||||
|
* due. Wait up to that time. */
|
||||||
|
due_time = check_due_timer();
|
||||||
|
if (typebuf.tb_change_cnt != tb_change_cnt)
|
||||||
|
{
|
||||||
|
/* timer may have used feedkeys() */
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
if (due_time <= 0 || (wtime > 0 && due_time > remaining))
|
||||||
|
due_time = remaining;
|
||||||
|
if (wait_func(due_time, interrupted, ignore_input))
|
||||||
|
return OK;
|
||||||
|
if (interrupted != NULL && *interrupted)
|
||||||
|
/* Nothing available, but need to return so that side effects get
|
||||||
|
* handled, such as handling a message on a channel. */
|
||||||
|
return FALSE;
|
||||||
|
if (wtime > 0)
|
||||||
|
remaining -= due_time;
|
||||||
|
}
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return non-zero if a character is available
|
* return non-zero if a character is available
|
||||||
*/
|
*/
|
||||||
@ -245,7 +286,7 @@ ui_delay(long msec, int ignoreinput)
|
|||||||
{
|
{
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
if (gui.in_use && !ignoreinput)
|
if (gui.in_use && !ignoreinput)
|
||||||
gui_wait_for_chars(msec);
|
gui_wait_for_chars(msec, typebuf.tb_change_cnt);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
mch_delay(msec, ignoreinput);
|
mch_delay(msec, ignoreinput);
|
||||||
|
@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1405,
|
||||||
/**/
|
/**/
|
||||||
1404,
|
1404,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user