++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;
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)
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
}
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;
}
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;
}
, KE_DROP /* DnD data is available */
, KE_CURSORHOLD /* CursorHold event */
, KE_NOP /* doesn't do something */
+ , KE_FOCUSGAINED /* focus gained */
+ , KE_FOCUSLOST /* focus lost */
};
/*
#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)
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 95,
/**/
94,
/**/