| To: vim-dev@vim.org |
| Subject: patch 7.1.095 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.1.095 |
| Problem: The FocusLost and FocusGained autocommands are triggered |
| asynchronously in the GUI. This may cause arbitrary problems. |
| Solution: Put the focus event in the input buffer and handle it when ready |
| for it. |
| Files: src/eval.c, src/getchar.c, src/gui.c, src/gui_gtk_x11.c, |
| src/keymap.h |
| |
| |
| |
| |
| |
| *** 9912,9929 **** |
| |
| ++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(); |
| --no_mapping; |
| --allow_keys; |
| |
| --- 9912,9935 ---- |
| |
| ++no_mapping; |
| ++allow_keys; |
| ! 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; |
| |
| |
| |
| |
| *** 1596,1603 **** |
| continue; |
| } |
| #endif |
| - |
| #ifdef FEAT_GUI |
| /* 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) |
| --- 1596,1610 ---- |
| 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) |
| |
| |
| |
| *** 4519,4525 **** |
| xim_set_focus(in_focus); |
| # endif |
| |
| ! ui_focus_change(in_focus); |
| #endif |
| } |
| |
| --- 4519,4536 ---- |
| xim_set_focus(in_focus); |
| # endif |
| |
| ! /* 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 |
| } |
| |
| |
| |
| |
| *** 813,822 **** |
| 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) */ |
| if (widget != gui.drawarea) |
| gtk_widget_grab_focus(gui.drawarea); |
| |
| return TRUE; |
| } |
| |
| --- 813,827 ---- |
| 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) */ |
| 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; |
| } |
| |
| |
| *** 828,833 **** |
| --- 833,842 ---- |
| |
| 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; |
| } |
| |
| |
| |
| *** 254,259 **** |
| --- 254,261 ---- |
| , 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,450 **** |
| --- 447,454 ---- |
| #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) |
| |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 95, |
| /**/ |
| |
| -- |
| ARTHUR: Who are you? |
| TALL KNIGHT: We are the Knights Who Say "Ni"! |
| BEDEVERE: No! Not the Knights Who Say "Ni"! |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |