summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0834
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0834')
-rw-r--r--data/vim/patches/8.1.0834688
1 files changed, 0 insertions, 688 deletions
diff --git a/data/vim/patches/8.1.0834 b/data/vim/patches/8.1.0834
deleted file mode 100644
index f5de64ec5..000000000
--- a/data/vim/patches/8.1.0834
+++ /dev/null
@@ -1,688 +0,0 @@
-To: vim_dev@googlegroups.com
-Subject: Patch 8.1.0834
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 8.1.0834
-Problem: GUI may wait too long before dealing with messages. Returning
- early may cause a mapping to time out.
-Solution: Use the waiting loop from Unix also for the GUI.
- (closes #3817, closes #3824)
-Files: src/ui.c, src/proto/ui.pro, src/os_unix.c, src/gui.c,
- src/testdir/screendump.vim
-
-
-*** ../vim-8.1.0833/src/ui.c 2019-01-26 17:28:22.236599060 +0100
---- src/ui.c 2019-01-27 16:50:31.054860125 +0100
-***************
-*** 178,183 ****
---- 178,225 ----
- ctrl_c_interrupts = FALSE;
- }
-
-+ /*
-+ * Here we call gui_inchar() or mch_inchar(), the GUI or machine-dependent
-+ * input function. The functionality they implement is like this:
-+ *
-+ * while (not timed out)
-+ * {
-+ * handle-resize;
-+ * parse-queued-messages;
-+ * if (waited for 'updatetime')
-+ * trigger-cursorhold;
-+ * ui_wait_for_chars_or_timer()
-+ * if (character available)
-+ * break;
-+ * }
-+ *
-+ * ui_wait_for_chars_or_timer() does:
-+ *
-+ * while (not timed out)
-+ * {
-+ * if (any-timer-triggered)
-+ * invoke-timer-callback;
-+ * wait-for-character();
-+ * if (character available)
-+ * break;
-+ * }
-+ *
-+ * wait-for-character() does:
-+ * while (not timed out)
-+ * {
-+ * Wait for event;
-+ * if (something on channel)
-+ * read/write channel;
-+ * else if (resized)
-+ * handle_resize();
-+ * else if (system event)
-+ * deal-with-system-event;
-+ * else if (character available)
-+ * break;
-+ * }
-+ *
-+ */
-+
- #ifdef FEAT_GUI
- if (gui.in_use)
- retval = gui_inchar(buf, maxlen, wtime, tb_change_cnt);
-***************
-*** 205,210 ****
---- 247,422 ----
- return retval;
- }
-
-+ #if defined(UNIX) || defined(FEAT_GUI) || defined(PROTO)
-+ /*
-+ * Common code for mch_inchar() and gui_inchar(): Wait for a while or
-+ * indefinitely until characters are available, dealing with timers and
-+ * messages on channels.
-+ *
-+ * "buf" may be NULL if the available characters are not to be returned, only
-+ * check if they are available.
-+ *
-+ * Return the number of characters that are available.
-+ * If "wtime" == 0 do not wait for characters.
-+ * If "wtime" == n wait a short time for characters.
-+ * If "wtime" == -1 wait forever for characters.
-+ */
-+ int
-+ inchar_loop(
-+ char_u *buf,
-+ int maxlen,
-+ long wtime, // don't use "time", MIPS cannot handle it
-+ int tb_change_cnt,
-+ int (*wait_func)(long wtime, int *interrupted, int ignore_input),
-+ int (*resize_func)(int check_only))
-+ {
-+ int len;
-+ int interrupted = FALSE;
-+ int did_start_blocking = FALSE;
-+ long wait_time;
-+ long elapsed_time = 0;
-+ #ifdef ELAPSED_FUNC
-+ elapsed_T start_tv;
-+
-+ ELAPSED_INIT(start_tv);
-+ #endif
-+
-+ /* repeat until we got a character or waited long enough */
-+ for (;;)
-+ {
-+ /* Check if window changed size while we were busy, perhaps the ":set
-+ * columns=99" command was used. */
-+ if (resize_func != NULL)
-+ resize_func(FALSE);
-+
-+ #ifdef MESSAGE_QUEUE
-+ // Only process messages when waiting.
-+ if (wtime != 0)
-+ {
-+ parse_queued_messages();
-+ // If input was put directly in typeahead buffer bail out here.
-+ if (typebuf_changed(tb_change_cnt))
-+ return 0;
-+ }
-+ #endif
-+ if (wtime < 0 && did_start_blocking)
-+ // blocking and already waited for p_ut
-+ wait_time = -1;
-+ else
-+ {
-+ if (wtime >= 0)
-+ wait_time = wtime;
-+ else
-+ // going to block after p_ut
-+ wait_time = p_ut;
-+ #ifdef ELAPSED_FUNC
-+ elapsed_time = ELAPSED_FUNC(start_tv);
-+ #endif
-+ wait_time -= elapsed_time;
-+ if (wait_time <= 0)
-+ {
-+ if (wtime >= 0)
-+ // no character available within "wtime"
-+ return 0;
-+
-+ // No character available within 'updatetime'.
-+ did_start_blocking = TRUE;
-+ if (trigger_cursorhold() && maxlen >= 3
-+ && !typebuf_changed(tb_change_cnt))
-+ {
-+ // Put K_CURSORHOLD in the input buffer or return it.
-+ if (buf == NULL)
-+ {
-+ char_u ibuf[3];
-+
-+ ibuf[0] = CSI;
-+ ibuf[1] = KS_EXTRA;
-+ ibuf[2] = (int)KE_CURSORHOLD;
-+ add_to_input_buf(ibuf, 3);
-+ }
-+ else
-+ {
-+ buf[0] = K_SPECIAL;
-+ buf[1] = KS_EXTRA;
-+ buf[2] = (int)KE_CURSORHOLD;
-+ }
-+ return 3;
-+ }
-+
-+ // There is no character available within 'updatetime' seconds:
-+ // flush all the swap files to disk. Also done when
-+ // interrupted by SIGWINCH.
-+ before_blocking();
-+ continue;
-+ }
-+ }
-+
-+ #ifdef FEAT_JOB_CHANNEL
-+ if (wait_time < 0 || wait_time > 100L)
-+ {
-+ // Checking if a job ended requires polling. Do this at least
-+ // every 100 msec.
-+ if (has_pending_job())
-+ wait_time = 100L;
-+
-+ // If there is readahead then parse_queued_messages() timed out and
-+ // we should call it again soon.
-+ if (channel_any_readahead())
-+ wait_time = 10L;
-+ }
-+ #endif
-+ #ifdef FEAT_BEVAL_GUI
-+ if (p_beval && wait_time > 100L)
-+ // The 'balloonexpr' may indirectly invoke a callback while waiting
-+ // for a character, need to check often.
-+ wait_time = 100L;
-+ #endif
-+
-+ // Wait for a character to be typed or another event, such as the winch
-+ // signal or an event on the monitored file descriptors.
-+ if (wait_func(wait_time, &interrupted, FALSE))
-+ {
-+ // If input was put directly in typeahead buffer bail out here.
-+ if (typebuf_changed(tb_change_cnt))
-+ return 0;
-+
-+ // We might have something to return now.
-+ if (buf == NULL)
-+ // "buf" is NULL, we were just waiting, not actually getting
-+ // input.
-+ return input_available();
-+
-+ len = read_from_input_buf(buf, (long)maxlen);
-+ if (len > 0)
-+ return len;
-+ continue;
-+ }
-+ // Timed out or interrupted with no character available.
-+
-+ #ifndef ELAPSED_FUNC
-+ // estimate the elapsed time
-+ elapsed_time += wait_time;
-+ #endif
-+
-+ if ((resize_func != NULL && resize_func(TRUE))
-+ #ifdef FEAT_CLIENTSERVER
-+ || server_waiting()
-+ #endif
-+ #ifdef MESSAGE_QUEUE
-+ || interrupted
-+ #endif
-+ || wait_time > 0
-+ || (wtime < 0 && !did_start_blocking))
-+ // no character available, but something to be done, keep going
-+ continue;
-+
-+ // no character available or interrupted, return zero
-+ break;
-+ }
-+ return 0;
-+ }
-+ #endif
-+
- #if defined(FEAT_TIMERS) || defined(PROTO)
- /*
- * Wait for a timer to fire or "wait_func" to return non-zero.
-*** ../vim-8.1.0833/src/proto/ui.pro 2018-05-17 13:52:54.000000000 +0200
---- src/proto/ui.pro 2019-01-26 22:35:56.703647735 +0100
-***************
-*** 2,7 ****
---- 2,8 ----
- void ui_write(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 inchar_loop(char_u *buf, int maxlen, long wtime, int tb_change_cnt, int (*wait_func)(long wtime, int *interrupted, int ignore_input), int (*resize_func)(int check_only));
- 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);
- void ui_delay(long msec, int ignoreinput);
-*** ../vim-8.1.0833/src/os_unix.c 2019-01-26 15:12:52.558260916 +0100
---- src/os_unix.c 2019-01-26 22:36:20.799486197 +0100
-***************
-*** 356,361 ****
---- 356,376 ----
- }
-
- /*
-+ * Function passed to inchar_loop() to handle window resizing.
-+ * If "check_only" is TRUE: Return whether there was a resize.
-+ * If "check_only" is FALSE: Deal with the window resized.
-+ */
-+ static int
-+ resize_func(int check_only)
-+ {
-+ if (check_only)
-+ return do_resize;
-+ while (do_resize)
-+ handle_resize();
-+ return FALSE;
-+ }
-+
-+ /*
- * mch_inchar(): low level input function.
- * Get a characters from the keyboard.
- * Return the number of characters that are available.
-***************
-*** 370,507 ****
- long wtime, /* don't use "time", MIPS cannot handle it */
- int tb_change_cnt)
- {
-! int len;
-! int interrupted = FALSE;
-! int did_start_blocking = FALSE;
-! long wait_time;
-! long elapsed_time = 0;
-! #ifdef ELAPSED_FUNC
-! elapsed_T start_tv;
-!
-! ELAPSED_INIT(start_tv);
-! #endif
-!
-! /* repeat until we got a character or waited long enough */
-! for (;;)
-! {
-! /* Check if window changed size while we were busy, perhaps the ":set
-! * columns=99" command was used. */
-! while (do_resize)
-! handle_resize();
-!
-! #ifdef MESSAGE_QUEUE
-! // Only process messages when waiting.
-! if (wtime != 0)
-! {
-! parse_queued_messages();
-! // If input was put directly in typeahead buffer bail out here.
-! if (typebuf_changed(tb_change_cnt))
-! return 0;
-! }
-! #endif
-! if (wtime < 0 && did_start_blocking)
-! /* blocking and already waited for p_ut */
-! wait_time = -1;
-! else
-! {
-! if (wtime >= 0)
-! wait_time = wtime;
-! else
-! /* going to block after p_ut */
-! wait_time = p_ut;
-! #ifdef ELAPSED_FUNC
-! elapsed_time = ELAPSED_FUNC(start_tv);
-! #endif
-! wait_time -= elapsed_time;
-! if (wait_time < 0)
-! {
-! if (wtime >= 0)
-! /* no character available within "wtime" */
-! return 0;
-!
-! else
-! {
-! /* no character available within 'updatetime' */
-! did_start_blocking = TRUE;
-! if (trigger_cursorhold() && maxlen >= 3
-! && !typebuf_changed(tb_change_cnt))
-! {
-! buf[0] = K_SPECIAL;
-! buf[1] = KS_EXTRA;
-! buf[2] = (int)KE_CURSORHOLD;
-! return 3;
-! }
-! /*
-! * If there is no character available within 'updatetime'
-! * seconds flush all the swap files to disk.
-! * Also done when interrupted by SIGWINCH.
-! */
-! before_blocking();
-! continue;
-! }
-! }
-! }
-!
-! #ifdef FEAT_JOB_CHANNEL
-! /* Checking if a job ended requires polling. Do this every 100 msec. */
-! if (has_pending_job() && (wait_time < 0 || wait_time > 100L))
-! wait_time = 100L;
-! /* If there is readahead then parse_queued_messages() timed out and we
-! * should call it again soon. */
-! if ((wait_time < 0 || wait_time > 100L) && channel_any_readahead())
-! wait_time = 10L;
-! #endif
-! #ifdef FEAT_BEVAL_GUI
-! if (p_beval && wait_time > 100L)
-! /* The 'balloonexpr' may indirectly invoke a callback while waiting
-! * for a character, need to check often. */
-! wait_time = 100L;
-! #endif
-!
-! /*
-! * We want to be interrupted by the winch signal
-! * or by an event on the monitored file descriptors.
-! */
-! if (WaitForChar(wait_time, &interrupted, FALSE))
-! {
-! /* If input was put directly in typeahead buffer bail out here. */
-! if (typebuf_changed(tb_change_cnt))
-! return 0;
-!
-! /*
-! * For some terminals we only get one character at a time.
-! * We want the get all available characters, so we could keep on
-! * trying until none is available
-! * For some other terminals this is quite slow, that's why we don't
-! * do it.
-! */
-! len = read_from_input_buf(buf, (long)maxlen);
-! if (len > 0)
-! return len;
-! continue;
-! }
-!
-! /* no character available */
-! #ifndef ELAPSED_FUNC
-! /* estimate the elapsed time */
-! elapsed_time += wait_time;
-! #endif
-!
-! if (do_resize /* interrupted by SIGWINCH signal */
-! #ifdef FEAT_CLIENTSERVER
-! || server_waiting()
-! #endif
-! #ifdef MESSAGE_QUEUE
-! || interrupted
-! #endif
-! || wait_time > 0
-! || (wtime < 0 && !did_start_blocking))
-! continue;
-!
-! /* no character available or interrupted */
-! break;
-! }
-! return 0;
- }
-
- static void
---- 385,392 ----
- long wtime, /* don't use "time", MIPS cannot handle it */
- int tb_change_cnt)
- {
-! return inchar_loop(buf, maxlen, wtime, tb_change_cnt,
-! WaitForChar, resize_func);
- }
-
- static void
-*** ../vim-8.1.0833/src/gui.c 2019-01-26 17:28:22.224599141 +0100
---- src/gui.c 2019-01-26 23:17:38.097634554 +0100
-***************
-*** 2896,2905 ****
- * or FAIL otherwise.
- */
- static int
-! gui_wait_for_chars_or_timer(long wtime)
- {
- #ifdef FEAT_TIMERS
-! return ui_wait_for_chars_or_timer(wtime, gui_wait_for_chars_3, NULL, 0);
- #else
- return gui_mch_wait_for_chars(wtime);
- #endif
---- 2896,2909 ----
- * or FAIL otherwise.
- */
- static int
-! gui_wait_for_chars_or_timer(
-! long wtime,
-! int *interrupted UNUSED,
-! int ignore_input UNUSED)
- {
- #ifdef FEAT_TIMERS
-! return ui_wait_for_chars_or_timer(wtime, gui_wait_for_chars_3,
-! interrupted, ignore_input);
- #else
- return gui_mch_wait_for_chars(wtime);
- #endif
-***************
-*** 2907,3000 ****
-
- /*
- * The main GUI input routine. Waits for a character from the keyboard.
-! * wtime == -1 Wait forever.
-! * wtime == 0 Don't wait.
-! * wtime > 0 Wait wtime milliseconds for a character.
-! * Returns OK if a character was found to be available within the given time,
-! * or FAIL otherwise.
- */
-! int
-! gui_wait_for_chars(long wtime, int tb_change_cnt)
- {
-! int retval;
-! #if defined(ELAPSED_FUNC)
-! elapsed_T start_tv;
-! #endif
-
- #ifdef FEAT_MENU
-! /*
-! * If we're going to wait a bit, update the menus and mouse shape for the
-! * current State.
-! */
- if (wtime != 0)
- gui_update_menus(0);
- #endif
-
- gui_mch_update();
-! if (input_available()) /* Got char, return immediately */
-! return OK;
-! if (wtime == 0) /* Don't wait for char */
-! return FAIL;
-!
-! /* Before waiting, flush any output to the screen. */
-! gui_mch_flush();
-!
-! if (wtime > 0)
- {
-! /* Blink when waiting for a character. Probably only does something
-! * for showmatch() */
-! gui_mch_start_blink();
-! retval = gui_wait_for_chars_or_timer(wtime);
-! gui_mch_stop_blink(TRUE);
-! return retval;
- }
-
-! #if defined(ELAPSED_FUNC)
-! ELAPSED_INIT(start_tv);
-! #endif
-
-! /*
-! * While we are waiting indefinitely for a character, blink the cursor.
-! */
- gui_mch_start_blink();
-
-! retval = FAIL;
-! /*
-! * We may want to trigger the CursorHold event. First wait for
-! * 'updatetime' and if nothing is typed within that time, and feedkeys()
-! * wasn't used, put the K_CURSORHOLD key in the input buffer.
-! */
-! if (gui_wait_for_chars_or_timer(p_ut) == OK)
-! retval = OK;
-! else if (trigger_cursorhold()
-! #if defined(ELAPSED_FUNC)
-! && ELAPSED_FUNC(start_tv) >= p_ut
-! #endif
-! && typebuf.tb_change_cnt == tb_change_cnt)
-! {
-! char_u buf[3];
-!
-! /* Put K_CURSORHOLD in the input buffer. */
-! buf[0] = CSI;
-! buf[1] = KS_EXTRA;
-! buf[2] = (int)KE_CURSORHOLD;
-! add_to_input_buf(buf, 3);
-!
-! retval = OK;
-! }
-!
-! if (retval == FAIL && typebuf.tb_change_cnt == tb_change_cnt)
-! {
-! /* Blocking wait. */
-! before_blocking();
-! retval = gui_wait_for_chars_or_timer(-1L);
-! }
-
- gui_mch_stop_blink(TRUE);
- return retval;
- }
-
- /*
- * Equivalent of mch_inchar() for the GUI.
- */
- int
---- 2911,2982 ----
-
- /*
- * The main GUI input routine. Waits for a character from the keyboard.
-! * "wtime" == -1 Wait forever.
-! * "wtime" == 0 Don't wait.
-! * "wtime" > 0 Wait wtime milliseconds for a character.
-! *
-! * Returns the number of characters read or zero when timed out or interrupted.
-! * "buf" may be NULL, in which case a non-zero number is returned if characters
-! * are available.
- */
-! static int
-! gui_wait_for_chars_buf(
-! char_u *buf,
-! int maxlen,
-! long wtime, // don't use "time", MIPS cannot handle it
-! int tb_change_cnt)
- {
-! int retval;
-
- #ifdef FEAT_MENU
-! // If we're going to wait a bit, update the menus and mouse shape for the
-! // current State.
- if (wtime != 0)
- gui_update_menus(0);
- #endif
-
- gui_mch_update();
-! if (input_available()) // Got char, return immediately
- {
-! if (buf != NULL && !typebuf_changed(tb_change_cnt))
-! return read_from_input_buf(buf, (long)maxlen);
-! return 0;
- }
-+ if (wtime == 0) // Don't wait for char
-+ return FAIL;
-
-! // Before waiting, flush any output to the screen.
-! gui_mch_flush();
-
-! // Blink while waiting for a character.
- gui_mch_start_blink();
-
-! // Common function to loop until "wtime" is met, while handling timers and
-! // other callbacks.
-! retval = inchar_loop(buf, maxlen, wtime, tb_change_cnt,
-! gui_wait_for_chars_or_timer, NULL);
-
- gui_mch_stop_blink(TRUE);
-+
- return retval;
- }
-
- /*
-+ * Wait for a character from the keyboard without actually reading it.
-+ * Also deals with timers.
-+ * wtime == -1 Wait forever.
-+ * wtime == 0 Don't wait.
-+ * wtime > 0 Wait wtime milliseconds for a character.
-+ * Returns OK if a character was found to be available within the given time,
-+ * or FAIL otherwise.
-+ */
-+ int
-+ gui_wait_for_chars(long wtime, int tb_change_cnt)
-+ {
-+ return gui_wait_for_chars_buf(NULL, 0, wtime, tb_change_cnt);
-+ }
-+
-+ /*
- * Equivalent of mch_inchar() for the GUI.
- */
- int
-***************
-*** 3004,3013 ****
- 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;
- }
-
- /*
---- 2986,2992 ----
- long wtime, /* milli seconds */
- int tb_change_cnt)
- {
-! return gui_wait_for_chars_buf(buf, maxlen, wtime, tb_change_cnt);
- }
-
- /*
-*** ../vim-8.1.0833/src/testdir/screendump.vim 2018-12-04 22:24:12.193693584 +0100
---- src/testdir/screendump.vim 2019-01-27 16:20:34.371242071 +0100
-***************
-*** 58,63 ****
---- 58,67 ----
- let cmd .= ' -v ' . a:arguments
- let buf = term_start(cmd, {'curwin': 1, 'term_rows': rows, 'term_cols': cols})
- if &termwinsize == ''
-+ " in the GUI we may end up with a different size, try to set it.
-+ if term_getsize(buf) != [rows, cols]
-+ call term_setsize(buf, rows, cols)
-+ endif
- call assert_equal([rows, cols], term_getsize(buf))
- else
- let rows = term_getsize(buf)[0]
-*** ../vim-8.1.0833/src/version.c 2019-01-27 15:07:35.161741346 +0100
---- src/version.c 2019-01-27 16:36:02.924759049 +0100
-***************
-*** 785,786 ****
---- 785,788 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 834,
- /**/
-
---
-We do not stumble over mountains, but over molehills.
- Confucius
-
- /// 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 ///