diff options
-rw-r--r-- | src/channel.c | 6 | ||||
-rw-r--r-- | src/ex_docmd.c | 11 | ||||
-rw-r--r-- | src/os_amiga.c | 2 | ||||
-rw-r--r-- | src/os_unix.c | 5 | ||||
-rw-r--r-- | src/os_win32.c | 4 | ||||
-rw-r--r-- | src/proto/channel.pro | 1 | ||||
-rw-r--r-- | src/proto/os_amiga.pro | 2 | ||||
-rw-r--r-- | src/proto/os_unix.pro | 2 | ||||
-rw-r--r-- | src/proto/os_win32.pro | 2 | ||||
-rw-r--r-- | src/proto/ui.pro | 1 | ||||
-rw-r--r-- | src/ui.c | 12 | ||||
-rw-r--r-- | src/version.c | 2 |
12 files changed, 40 insertions, 10 deletions
diff --git a/src/channel.c b/src/channel.c index 0bab47a62..13fb65302 100644 --- a/src/channel.c +++ b/src/channel.c @@ -341,6 +341,12 @@ add_channel(void) return channel; } + int +has_any_channel(void) +{ + return first_channel != NULL; +} + /* * Called when the refcount of a channel is zero. * Return TRUE if "channel" has a callback and the associated job wasn't diff --git a/src/ex_docmd.c b/src/ex_docmd.c index eef559506..09b901996 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -9065,8 +9065,17 @@ do_sleep(long msec) wait_now = due_time; } #endif +#ifdef FEAT_JOB_CHANNEL + if (has_any_channel() && wait_now > 100L) + wait_now = 100L; +#endif ui_delay(wait_now, TRUE); - ui_breakcheck(); +#ifdef FEAT_JOB_CHANNEL + if (has_any_channel()) + ui_breakcheck_force(TRUE); + else +#endif + ui_breakcheck(); #ifdef MESSAGE_QUEUE /* Process the netbeans and clientserver messages that may have been * received in the call to ui_breakcheck() when the GUI is in use. This diff --git a/src/os_amiga.c b/src/os_amiga.c index 4478093df..9266380d6 100644 --- a/src/os_amiga.c +++ b/src/os_amiga.c @@ -1381,7 +1381,7 @@ mch_call_shell( * trouble with lattice-c programs. */ void -mch_breakcheck(void) +mch_breakcheck(int force) { if (SetSignal(0L, (long)(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F)) & SIGBREAKF_CTRL_C) got_int = TRUE; diff --git a/src/os_unix.c b/src/os_unix.c index 5f1c48764..107a47482 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5364,9 +5364,10 @@ mch_clear_job(job_T *job) * In cooked mode we should get SIGINT, no need to check. */ void -mch_breakcheck(void) +mch_breakcheck(int force) { - if (curr_tmode == TMODE_RAW && RealWaitForChar(read_cmd_fd, 0L, NULL, NULL)) + if ((curr_tmode == TMODE_RAW || force) + && RealWaitForChar(read_cmd_fd, 0L, NULL, NULL)) fill_input_buf(FALSE); } diff --git a/src/os_win32.c b/src/os_win32.c index 0607bd2ef..5eacce635 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -6187,10 +6187,10 @@ mch_remove(char_u *name) /* - * check for an "interrupt signal": CTRL-break or CTRL-C + * Check for an "interrupt signal": CTRL-break or CTRL-C. */ void -mch_breakcheck(void) +mch_breakcheck(int force) { #ifndef FEAT_GUI_W32 /* never used */ if (g_fCtrlCPressed || g_fCBrkPressed) diff --git a/src/proto/channel.pro b/src/proto/channel.pro index e056d5ffe..53c5dab94 100644 --- a/src/proto/channel.pro +++ b/src/proto/channel.pro @@ -4,6 +4,7 @@ int ch_log_active(void); void ch_log(channel_T *ch, char *msg); void ch_logs(channel_T *ch, char *msg, char *name); channel_T *add_channel(void); +int has_any_channel(void); int channel_unref(channel_T *channel); int free_unused_channels_contents(int copyID, int mask); void free_unused_channels(int copyID, int mask); diff --git a/src/proto/os_amiga.pro b/src/proto/os_amiga.pro index b1d0134b7..b781680a8 100644 --- a/src/proto/os_amiga.pro +++ b/src/proto/os_amiga.pro @@ -36,7 +36,7 @@ int mch_get_shellsize(void); void mch_set_shellsize(void); void mch_new_shellsize(void); int mch_call_shell(char_u *cmd, int options); -void mch_breakcheck(void); +void mch_breakcheck(int force); long Chk_Abort(void); int mch_expandpath(garray_T *gap, char_u *pat, int flags); int mch_has_exp_wildcard(char_u *p); diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro index 1d025e828..b1e9b8e29 100644 --- a/src/proto/os_unix.pro +++ b/src/proto/os_unix.pro @@ -61,7 +61,7 @@ void mch_start_job(char **argv, job_T *job, jobopt_T *options); char *mch_job_status(job_T *job); int mch_stop_job(job_T *job, char_u *how); void mch_clear_job(job_T *job); -void mch_breakcheck(void); +void mch_breakcheck(int force); int mch_expandpath(garray_T *gap, char_u *path, int flags); int mch_expand_wildcards(int num_pat, char_u **pat, int *num_file, char_u ***file, int flags); int mch_has_exp_wildcard(char_u *p); diff --git a/src/proto/os_win32.pro b/src/proto/os_win32.pro index 19c59ec96..4e6af5bd2 100644 --- a/src/proto/os_win32.pro +++ b/src/proto/os_win32.pro @@ -48,7 +48,7 @@ void mch_set_normal_colors(void); void mch_write(char_u *s, int len); void mch_delay(long msec, int ignoreinput); int mch_remove(char_u *name); -void mch_breakcheck(void); +void mch_breakcheck(int force); long_u mch_total_mem(int special); int mch_wrename(WCHAR *wold, WCHAR *wnew); int mch_rename(const char *pszOldFile, const char *pszNewFile); diff --git a/src/proto/ui.pro b/src/proto/ui.pro index 072e0c496..dbb721396 100644 --- a/src/proto/ui.pro +++ b/src/proto/ui.pro @@ -10,6 +10,7 @@ int ui_get_shellsize(void); void ui_set_shellsize(int mustset); void ui_new_shellsize(void); void ui_breakcheck(void); +void ui_breakcheck_force(int force); void clip_init(int can_use); void clip_update_selection(VimClipboard *clip); void clip_own_selection(VimClipboard *cbd); @@ -353,12 +353,22 @@ ui_new_shellsize(void) void ui_breakcheck(void) { + ui_breakcheck_force(FALSE); +} + +/* + * When "force" is true also check when the terminal is not in raw mode. + * This is useful to read input on channels. + */ + void +ui_breakcheck_force(int force) +{ #ifdef FEAT_GUI if (gui.in_use) gui_mch_update(); else #endif - mch_breakcheck(); + mch_breakcheck(force); } /***************************************************************************** diff --git a/src/version.c b/src/version.c index 12c5505ef..eb1c4ab2a 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 18, +/**/ 17, /**/ 16, |