# HG changeset patch # User vimboss # Date 1220816933 0 # Node ID afb64d9f5b8ee1eb6e787e1d34ef8b80f15d4749 # Parent 501b107b335af7ffcffea060c38f4b34dafe4101 updated for version 7.2-013 diff --git a/src/ui.c b/src/ui.c --- a/src/ui.c +++ b/src/ui.c @@ -2110,6 +2110,8 @@ clip_x11_request_selection(myShell, dpy, int i; int nbytes = 0; char_u *buffer; + time_t start_time; + int timed_out = FALSE; for (i = #ifdef FEAT_MBYTE @@ -2129,6 +2131,7 @@ clip_x11_request_selection(myShell, dpy, case 3: type = text_atom; break; default: type = XA_STRING; } + success = FALSE; XtGetSelectionValue(myShell, cbd->sel_atom, type, clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime); @@ -2141,27 +2144,46 @@ clip_x11_request_selection(myShell, dpy, * characters, then they will appear before the one that requested the * paste! Don't worry, we will catch up with any other events later. */ + start_time = time(NULL); for (;;) { if (XCheckTypedEvent(dpy, SelectionNotify, &event)) + { + /* this is where clip_x11_request_selection_cb() is actually + * called */ + XtDispatchEvent(&event); break; + } if (XCheckTypedEvent(dpy, SelectionRequest, &event)) /* We may get a SelectionRequest here and if we don't handle * it we hang. KDE klipper does this, for example. */ XtDispatchEvent(&event); + /* Time out after 2 to 3 seconds to avoid that we hang when the + * other process doesn't respond. Note that the SelectionNotify + * event may still come later when the selection owner comes back + * to life and the text gets inserted unexpectedly (by xterm). + * Don't know how to avoid that :-(. */ + if (time(NULL) > start_time + 2) + { + timed_out = TRUE; + break; + } + /* Do we need this? Probably not. */ XSync(dpy, False); - /* Bernhard Walle solved a slow paste response in an X terminal by - * adding: usleep(10000); here. */ + /* Wait for 1 msec to avoid that we eat up all CPU time. */ + ui_delay(1L, TRUE); } - /* this is where clip_x11_request_selection_cb() is actually called */ - XtDispatchEvent(&event); - if (success) return; + + /* don't do a retry with another type after timing out, otherwise we + * hang for 15 seconds. */ + if (timed_out) + break; } /* Final fallback position - use the X CUT_BUFFER0 store */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -677,6 +677,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 13, +/**/ 12, /**/ 11,