mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-11 15:37:29 +02:00
Check the channels of finished-jobs
On High Sierra, it appears that dispatch handler does not notify the EOF event of pty, therefor we need check the channel of job on pty (e.g. terminal) manually.
This commit is contained in:
+21
-1
@@ -24,6 +24,8 @@ int use_gui_macvim_draw_string = 1;
|
||||
|
||||
static int use_graphical_sign = 0;
|
||||
|
||||
static BOOL is_macos_high_sierra_or_later = NO;
|
||||
|
||||
// Max number of files to add to MRU in one go (this matches the maximum that
|
||||
// Cocoa displays in the MRU -- if this changes in Cocoa then update this
|
||||
// number as well).
|
||||
@@ -283,6 +285,15 @@ gui_mch_init(void)
|
||||
[[MMBackend sharedInstance] addToMRU:filenames];
|
||||
}
|
||||
|
||||
#if defined(MAC_OS_X_VERSION_10_10)
|
||||
{
|
||||
NSOperatingSystemVersion version = {10, 13, 0};
|
||||
|
||||
is_macos_high_sierra_or_later =
|
||||
[[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version];
|
||||
}
|
||||
#endif
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -2315,8 +2326,9 @@ static int vimModMaskToEventModifierFlags(int mods)
|
||||
|
||||
|
||||
|
||||
// -- Channel Support ------------------------------------------------------
|
||||
// -- Job and Channel Support ------------------------------------------------------
|
||||
|
||||
#if defined(FEAT_JOB_CHANNEL)
|
||||
void *
|
||||
gui_macvim_add_channel(channel_T *channel, ch_part_T part)
|
||||
{
|
||||
@@ -2340,6 +2352,14 @@ gui_macvim_remove_channel(void *cookie)
|
||||
dispatch_release(s);
|
||||
}
|
||||
|
||||
void
|
||||
gui_macvim_cleanup_job_all(void)
|
||||
{
|
||||
if (is_macos_high_sierra_or_later)
|
||||
job_cleanup_all();
|
||||
}
|
||||
|
||||
#endif // FEAT_JOB_CHANNEL
|
||||
|
||||
|
||||
// -- Graphical Sign Support ------------------------------------------------
|
||||
|
||||
@@ -5686,4 +5686,38 @@ job_stop(job_T *job, typval_T *argvars, char *type)
|
||||
return 1;
|
||||
}
|
||||
|
||||
# ifdef FEAT_GUI_MACVIM
|
||||
void
|
||||
job_cleanup_all(void)
|
||||
{
|
||||
job_T *job;
|
||||
|
||||
for (job = first_job; job != NULL; job = job->jv_next)
|
||||
{
|
||||
channel_T *channel = job->jv_channel;
|
||||
ch_part_T part;
|
||||
|
||||
if (channel == NULL || job->jv_status != JOB_FINISHED)
|
||||
continue;
|
||||
|
||||
/* check the socket and pipes */
|
||||
for (part = PART_SOCK; part < PART_IN; ++part)
|
||||
{
|
||||
sock_T fd = channel->ch_part[part].ch_fd;
|
||||
|
||||
if (fd != INVALID_FD)
|
||||
{
|
||||
int r = channel_wait(channel, fd, 0);
|
||||
|
||||
if (r == CW_READY)
|
||||
channel_read(channel, part, "job_cleanup_all");
|
||||
else if (r == CW_ERROR)
|
||||
ch_close_part_on_error(channel, part, TRUE,
|
||||
"job_cleanup_all");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif /* FEAT_JOB_CHANNEL */
|
||||
|
||||
@@ -6361,6 +6361,11 @@ parse_queued_messages(void)
|
||||
channel_handle_events(FALSE);
|
||||
# endif
|
||||
|
||||
# if defined(FEAT_GUI_MACVIM) && defined(FEAT_JOB_CHANNEL)
|
||||
if (gui.in_use)
|
||||
gui_macvim_cleanup_job_all();
|
||||
# endif
|
||||
|
||||
# ifdef FEAT_NETBEANS_INTG
|
||||
/* Process the queued netbeans messages. */
|
||||
netbeans_parse_messages();
|
||||
|
||||
@@ -71,4 +71,5 @@ job_T *job_start(typval_T *argvars, jobopt_T *opt_arg);
|
||||
char *job_status(job_T *job);
|
||||
void job_info(job_T *job, dict_T *dict);
|
||||
int job_stop(job_T *job, typval_T *argvars, char *type);
|
||||
void job_cleanup_all(void);
|
||||
/* vim: set ft=c : */
|
||||
|
||||
@@ -240,6 +240,8 @@ im_set_control(int enable);
|
||||
gui_macvim_add_channel(channel_T *channel, ch_part_T part);
|
||||
void
|
||||
gui_macvim_remove_channel(void *cookie);
|
||||
void
|
||||
gui_macvim_cleanup_job_all(void);
|
||||
|
||||
void
|
||||
gui_mch_drawsign(int row, int col, int typenr);
|
||||
|
||||
Reference in New Issue
Block a user