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

patch 8.2.0694: Haiku: channel and terminal do not work

Problem:    Haiku: channel and terminal do not work.
Solution:   Close files when the job has finished. (Ozaki Kiichi,
            closes #6039)
This commit is contained in:
Bram Moolenaar 2020-05-03 22:57:32 +02:00
parent 2fd4cd755c
commit 80a8d3889b
5 changed files with 81 additions and 24 deletions

View File

@ -3940,7 +3940,7 @@ theend:
free_job_options(&opt); free_job_options(&opt);
} }
# if defined(MSWIN) || defined(FEAT_GUI) || defined(PROTO) #if defined(MSWIN) || defined(__HAIKU__) || defined(FEAT_GUI) || defined(PROTO)
/* /*
* Check the channels for anything that is ready to be read. * Check the channels for anything that is ready to be read.
* The data is put in the read queue. * The data is put in the read queue.
@ -3973,9 +3973,23 @@ channel_handle_events(int only_keep_open)
"channel_handle_events"); "channel_handle_events");
} }
} }
# ifdef __HAIKU__
// Workaround for Haiku: Since select/poll cannot detect EOF from tty,
// should close fds when the job has finished if 'channel' connects to
// the pty.
if (channel->ch_job != NULL)
{
job_T *job = channel->ch_job;
if (job->jv_tty_out != NULL && job->jv_status == JOB_FINISHED)
for (part = PART_SOCK; part < PART_COUNT; ++part)
ch_close_part(channel, part);
}
# endif
} }
} }
# endif #endif
# if defined(FEAT_GUI) || defined(PROTO) # if defined(FEAT_GUI) || defined(PROTO)
/* /*
@ -4541,6 +4555,20 @@ channel_select_check(int ret_in, void *rfds_in, void *wfds_in)
channel_write_input(channel); channel_write_input(channel);
--ret; --ret;
} }
# ifdef __HAIKU__
// Workaround for Haiku: Since select/poll cannot detect EOF from tty,
// should close fds when the job has finished if 'channel' connects to
// the pty.
if (channel->ch_job != NULL)
{
job_T *job = channel->ch_job;
if (job->jv_tty_out != NULL && job->jv_status == JOB_FINISHED)
for (part = PART_SOCK; part < PART_COUNT; ++part)
ch_close_part(channel, part);
}
# endif
} }
return ret; return ret;

View File

@ -2147,7 +2147,7 @@ parse_queued_messages(void)
for (i = 0; i < MAX_REPEAT_PARSE; ++i) for (i = 0; i < MAX_REPEAT_PARSE; ++i)
{ {
// For Win32 mch_breakcheck() does not check for input, do it here. // For Win32 mch_breakcheck() does not check for input, do it here.
# if defined(MSWIN) && defined(FEAT_JOB_CHANNEL) # if (defined(MSWIN) || defined(__HAIKU__)) && defined(FEAT_JOB_CHANNEL)
channel_handle_events(FALSE); channel_handle_events(FALSE);
# endif # endif

View File

@ -1145,10 +1145,11 @@ VimFormView::FrameResized(float new_width, float new_height)
VimTextAreaView::VimTextAreaView(BRect frame): VimTextAreaView::VimTextAreaView(BRect frame):
BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES, BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES,
#ifdef FEAT_MBYTE_IME #ifdef FEAT_MBYTE_IME
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_INPUT_METHOD_AWARE), B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_INPUT_METHOD_AWARE
#else #else
B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE), B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE
#endif #endif
),
mouseDragEventCount(0) mouseDragEventCount(0)
{ {
#ifdef FEAT_MBYTE_IME #ifdef FEAT_MBYTE_IME
@ -4440,12 +4441,13 @@ gui_mch_wait_for_chars(
bigtime_t until, timeout; bigtime_t until, timeout;
status_t st; status_t st;
if (wtime >= 0) { if (wtime >= 0)
{
timeout = wtime * 1000; timeout = wtime * 1000;
until = system_time() + timeout; until = system_time() + timeout;
} else {
timeout = B_INFINITE_TIMEOUT;
} }
else
timeout = B_INFINITE_TIMEOUT;
focus = gui.in_focus; focus = gui.in_focus;
for (;;) for (;;)
@ -4461,6 +4463,28 @@ gui_mch_wait_for_chars(
} }
gui_mch_flush(); gui_mch_flush();
#ifdef MESSAGE_QUEUE
# ifdef FEAT_TIMERS
did_add_timer = FALSE;
# endif
parse_queued_messages();
# ifdef FEAT_TIMERS
if (did_add_timer)
// Need to recompute the waiting time.
break;
# endif
# ifdef FEAT_JOB_CHANNEL
if (has_any_channel())
{
if (wtime < 0 || timeout > 20000)
timeout = 20000;
}
else if (wtime < 0)
timeout = B_INFINITE_TIMEOUT;
# endif
#endif
/* /*
* Don't use gui_mch_update() because then we will spin-lock until a * Don't use gui_mch_update() because then we will spin-lock until a
* char arrives, instead we use gui_haiku_process_event() to hang until * char arrives, instead we use gui_haiku_process_event() to hang until
@ -4478,7 +4502,8 @@ gui_mch_wait_for_chars(
* Calculate how much longer we're willing to wait for the * Calculate how much longer we're willing to wait for the
* next event. * next event.
*/ */
if (wtime >= 0) { if (wtime >= 0)
{
timeout = until - system_time(); timeout = until - system_time();
if (timeout < 0) if (timeout < 0)
break; break;

View File

@ -1666,23 +1666,25 @@ vim_getenv(char_u *name, int *mustfree)
if (p != NULL) if (p != NULL)
return p; return p;
# ifdef __HAIKU__
// special handling for user settings directory...
if (STRCMP(name, "BE_USER_SETTINGS") == 0)
{
static char userSettingsPath[MAXPATHL];
if (find_directory(B_USER_SETTINGS_DIRECTORY, 0, false,
userSettingsPath, MAXPATHL) == B_OK)
return (char_u *)userSettingsPath;
else
return NULL;
}
# endif
#endif #endif
// handling $VIMRUNTIME and $VIM is below, bail out if it's another name. // handling $VIMRUNTIME and $VIM is below, bail out if it's another name.
vimruntime = (STRCMP(name, "VIMRUNTIME") == 0); vimruntime = (STRCMP(name, "VIMRUNTIME") == 0);
if (!vimruntime && STRCMP(name, "VIM") != 0) if (!vimruntime && STRCMP(name, "VIM") != 0)
#if defined(__HAIKU__)
// special handling for user settings directory...
if (STRCMP(name, "BE_USER_SETTINGS") == 0)
{
static char userSettingsPath[MAXPATHL] = {0};
if (B_OK == find_directory(B_USER_SETTINGS_DIRECTORY, 0,
false, userSettingsPath, MAXPATHL))
return userSettingsPath;
}
else
#endif
return NULL; return NULL;
/* /*

View File

@ -746,6 +746,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 */
/**/
694,
/**/ /**/
693, 693,
/**/ /**/