To: vim_dev@googlegroups.com Subject: Patch 8.2.0694 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.0694 Problem: Haiku: channel and terminal do not work. Solution: Close files when the job has finished. (Ozaki Kiichi, closes #6039) Files: src/channel.c, src/getchar.c, src/gui_haiku.cc, src/misc1.c *** ../vim-8.2.0693/src/channel.c 2020-05-03 17:03:26.193589966 +0200 --- src/channel.c 2020-05-03 22:54:49.037880880 +0200 *************** *** 3940,3946 **** free_job_options(&opt); } ! # if defined(MSWIN) || defined(FEAT_GUI) || defined(PROTO) /* * Check the channels for anything that is ready to be read. * The data is put in the read queue. --- 3940,3946 ---- free_job_options(&opt); } ! #if defined(MSWIN) || defined(__HAIKU__) || defined(FEAT_GUI) || defined(PROTO) /* * Check the channels for anything that is ready to be read. * The data is put in the read queue. *************** *** 3973,3981 **** "channel_handle_events"); } } } } ! # endif # if defined(FEAT_GUI) || defined(PROTO) /* --- 3973,3995 ---- "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 # if defined(FEAT_GUI) || defined(PROTO) /* *************** *** 4541,4546 **** --- 4555,4574 ---- channel_write_input(channel); --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; *** ../vim-8.2.0693/src/getchar.c 2020-05-01 14:26:17.128949276 +0200 --- src/getchar.c 2020-05-03 22:54:49.037880880 +0200 *************** *** 2147,2153 **** for (i = 0; i < MAX_REPEAT_PARSE; ++i) { // For Win32 mch_breakcheck() does not check for input, do it here. ! # if defined(MSWIN) && defined(FEAT_JOB_CHANNEL) channel_handle_events(FALSE); # endif --- 2147,2153 ---- for (i = 0; i < MAX_REPEAT_PARSE; ++i) { // For Win32 mch_breakcheck() does not check for input, do it here. ! # if (defined(MSWIN) || defined(__HAIKU__)) && defined(FEAT_JOB_CHANNEL) channel_handle_events(FALSE); # endif *** ../vim-8.2.0693/src/gui_haiku.cc 2020-04-30 22:50:55.605076816 +0200 --- src/gui_haiku.cc 2020-05-03 22:54:49.037880880 +0200 *************** *** 1145,1154 **** VimTextAreaView::VimTextAreaView(BRect frame): BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES, #ifdef FEAT_MBYTE_IME ! B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_INPUT_METHOD_AWARE), #else ! B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE), #endif mouseDragEventCount(0) { #ifdef FEAT_MBYTE_IME --- 1145,1155 ---- VimTextAreaView::VimTextAreaView(BRect frame): BView(frame, "VimTextAreaView", B_FOLLOW_ALL_SIDES, #ifdef FEAT_MBYTE_IME ! B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_INPUT_METHOD_AWARE #else ! B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE #endif + ), mouseDragEventCount(0) { #ifdef FEAT_MBYTE_IME *************** *** 3093,3099 **** } } #else ! add_to_input_buf_csi(string, len); #endif else add_to_input_buf(string, len); --- 3094,3100 ---- } } #else ! add_to_input_buf_csi(string, len); #endif else add_to_input_buf(string, len); *************** *** 4437,4451 **** int wtime) { int focus; ! bigtime_t until, timeout; ! status_t st; ! if (wtime >= 0) { timeout = wtime * 1000; until = system_time() + timeout; - } else { - timeout = B_INFINITE_TIMEOUT; } focus = gui.in_focus; for (;;) --- 4438,4453 ---- int wtime) { int focus; ! bigtime_t until, timeout; ! status_t st; ! if (wtime >= 0) ! { timeout = wtime * 1000; until = system_time() + timeout; } + else + timeout = B_INFINITE_TIMEOUT; focus = gui.in_focus; for (;;) *************** *** 4461,4466 **** --- 4463,4490 ---- } 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 * char arrives, instead we use gui_haiku_process_event() to hang until *************** *** 4478,4484 **** * Calculate how much longer we're willing to wait for the * next event. */ ! if (wtime >= 0) { timeout = until - system_time(); if (timeout < 0) break; --- 4502,4509 ---- * Calculate how much longer we're willing to wait for the * next event. */ ! if (wtime >= 0) ! { timeout = until - system_time(); if (timeout < 0) break; *** ../vim-8.2.0693/src/misc1.c 2020-04-12 19:37:13.518297259 +0200 --- src/misc1.c 2020-05-03 22:54:49.037880880 +0200 *************** *** 1666,1688 **** if (p != NULL) return p; #endif // handling $VIMRUNTIME and $VIM is below, bail out if it's another name. vimruntime = (STRCMP(name, "VIMRUNTIME") == 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; /* --- 1666,1690 ---- if (p != NULL) 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 // handling $VIMRUNTIME and $VIM is below, bail out if it's another name. vimruntime = (STRCMP(name, "VIMRUNTIME") == 0); if (!vimruntime && STRCMP(name, "VIM") != 0) return NULL; /* *** ../vim-8.2.0693/src/version.c 2020-05-03 22:30:44.038682664 +0200 --- src/version.c 2020-05-03 22:52:59.446180953 +0200 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 694, /**/ -- Microsoft is to software what McDonalds is to gourmet cooking /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///