]> granicus.if.org Git - vim/commitdiff
updated for version 7.1-095 v7.1.095
authorBram Moolenaar <Bram@vim.org>
Wed, 5 Sep 2007 19:47:23 +0000 (19:47 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 5 Sep 2007 19:47:23 +0000 (19:47 +0000)
src/eval.c
src/getchar.c
src/gui.c
src/gui_gtk_x11.c
src/keymap.h
src/version.c

index 419a63b54ed7bda446d75f8de41d8d7221a8a5ba..77d641374ec494ce3b4a0684d366a5ab4b77412e 100644 (file)
@@ -9912,18 +9912,24 @@ f_getchar(argvars, rettv)
 
     ++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;
 
index 23611a118edafdabcc8861477df4260c577f1b63..f77ddc2a8612e49701071fdafe1622c49b0da01e 100644 (file)
@@ -1596,8 +1596,15 @@ vgetc()
                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)
index dcd81df492d398b2a013adb9f4fcb74a9a1f8d27..b2b8e8499d3e772217a0dc379961da8dcb0054a6 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -4519,7 +4519,18 @@ gui_focus_change(in_focus)
     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
 }
 
index 541240de92fbe9799ff6e28770f56272f921c00f..c5b11285638cdc84d4d1daca9f69145553e5c850 100644 (file)
@@ -813,10 +813,15 @@ focus_in_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
     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 @@ focus_out_event(GtkWidget *widget, GdkEventFocus *event, gpointer data)
     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;
 }
 
index 376ac9c0020d1d4cb1345deaff2872c6fbe849e1..39837e554b1fb50f1d31f0efc176c0a7d598ee76 100644 (file)
@@ -254,6 +254,8 @@ enum key_extra
     , 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 @@ enum key_extra
 #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)
 
index 854d9e77bcda6eb8510cf1bca5f2025d21adb179..82371a901a196bc93cb35d8f959c7830d9cb4e32 100644 (file)
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    95,
 /**/
     94,
 /**/