updated for version 7.1-095
diff --git a/src/eval.c b/src/eval.c
index 419a63b..77d6413 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -9912,18 +9912,24 @@
++no_mapping;
++allow_keys;
- if (argvars[0].v_type == VAR_UNKNOWN)
- /* getchar(): blocking wait. */
- n = safe_vgetc();
- else if (get_tv_number_chk(&argvars[0], &error) == 1)
- /* getchar(1): only check if char avail */
- n = vpeekc();
- else if (error || vpeekc() == NUL)
- /* illegal argument or getchar(0) and no char avail: return zero */
- n = 0;
- else
- /* getchar(0) and char avail: return char */
- n = safe_vgetc();
+ for (;;)
+ {
+ if (argvars[0].v_type == VAR_UNKNOWN)
+ /* getchar(): blocking wait. */
+ n = safe_vgetc();
+ else if (get_tv_number_chk(&argvars[0], &error) == 1)
+ /* getchar(1): only check if char avail */
+ n = vpeekc();
+ else if (error || vpeekc() == NUL)
+ /* illegal argument or getchar(0) and no char avail: return zero */
+ n = 0;
+ else
+ /* getchar(0) and char avail: return char */
+ n = safe_vgetc();
+ if (n == K_IGNORE)
+ continue;
+ break;
+ }
--no_mapping;
--allow_keys;
diff --git a/src/getchar.c b/src/getchar.c
index 23611a1..f77ddc2 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1596,8 +1596,15 @@
continue;
}
#endif
-
#ifdef FEAT_GUI
+ /* The caller doesn't need to know that the focus event is delayed
+ * until getting a character. */
+ if (c == K_FOCUSGAINED || c == K_FOCUSLOST)
+ {
+ ui_focus_change(c == K_FOCUSGAINED);
+ continue;
+ }
+
/* Translate K_CSI to CSI. The special key is only used to avoid
* it being recognized as the start of a special key. */
if (c == K_CSI)
diff --git a/src/gui.c b/src/gui.c
index dcd81df..b2b8e84 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -4519,7 +4519,18 @@
xim_set_focus(in_focus);
# endif
- ui_focus_change(in_focus);
+ /* Put events in the input queue only when allowed.
+ * ui_focus_change() isn't called directly, because it invokes
+ * autocommands and that must not happen asynchronously. */
+ if (!hold_gui_events)
+ {
+ char_u bytes[3];
+
+ bytes[0] = CSI;
+ bytes[1] = KS_EXTRA;
+ bytes[2] = in_focus ? (int)KE_FOCUSGAINED : (int)KE_FOCUSLOST;
+ add_to_input_buf(bytes, 3);
+ }
#endif
}
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 541240d..c5b1128 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -813,10 +813,15 @@
if (blink_state == BLINK_NONE)
gui_mch_start_blink();
- /* make sure keyboard input goes to the draw area (if this is focus for a window) */
+ /* make sure keyboard input goes to the draw area (if this is focus for a
+ * window) */
if (widget != gui.drawarea)
gtk_widget_grab_focus(gui.drawarea);
+ /* make sure the input buffer is read */
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+
return TRUE;
}
@@ -829,6 +834,10 @@
if (blink_state != BLINK_NONE)
gui_mch_stop_blink();
+ /* make sure the input buffer is read */
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+
return TRUE;
}
diff --git a/src/keymap.h b/src/keymap.h
index 376ac9c..39837e5 100644
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -254,6 +254,8 @@
, KE_DROP /* DnD data is available */
, KE_CURSORHOLD /* CursorHold event */
, KE_NOP /* doesn't do something */
+ , KE_FOCUSGAINED /* focus gained */
+ , KE_FOCUSLOST /* focus lost */
};
/*
@@ -445,6 +447,8 @@
#define K_CMDWIN TERMCAP2KEY(KS_EXTRA, KE_CMDWIN)
#define K_DROP TERMCAP2KEY(KS_EXTRA, KE_DROP)
+#define K_FOCUSGAINED TERMCAP2KEY(KS_EXTRA, KE_FOCUSGAINED)
+#define K_FOCUSLOST TERMCAP2KEY(KS_EXTRA, KE_FOCUSLOST)
#define K_CURSORHOLD TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD)
diff --git a/src/version.c b/src/version.c
index 854d9e7..82371a9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -667,6 +667,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 95,
+/**/
94,
/**/
93,