diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-07-10 14:56:45 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-07-10 14:56:45 +0200 |
commit | 773c1ef81b2d29e40592cd2743a7d7a6e554e06f (patch) | |
tree | e58937742765ccfd57fd88869d6145bd9d731713 /src/if_xcmdsrv.c | |
parent | 52bf469f6f959808b5889da148e70f0b965e4b29 (diff) |
updated for version 7.3.595v7.3.595
Problem: The X command server responds slowly
Solution: Change the loop that waits for replies. (Brian Burns)
Diffstat (limited to 'src/if_xcmdsrv.c')
-rw-r--r-- | src/if_xcmdsrv.c | 64 |
1 files changed, 29 insertions, 35 deletions
diff --git a/src/if_xcmdsrv.c b/src/if_xcmdsrv.c index dd2071db24..44526d70bf 100644 --- a/src/if_xcmdsrv.c +++ b/src/if_xcmdsrv.c @@ -572,61 +572,55 @@ ServerWait(dpy, w, endCond, endData, localLoop, seconds) { time_t start; time_t now; - time_t lastChk = 0; XEvent event; - XPropertyEvent *e = (XPropertyEvent *)&event; -# define SEND_MSEC_POLL 50 + +#define UI_MSEC_DELAY 50 +#define SEND_MSEC_POLL 500 +#ifndef HAVE_SELECT + struct pollfd fds; + + fds.fd = ConnectionNumber(dpy); + fds.events = POLLIN; +#else + fd_set fds; + struct timeval tv; + + tv.tv_sec = 0; + tv.tv_usec = SEND_MSEC_POLL * 1000; + FD_ZERO(&fds); + FD_SET(ConnectionNumber(dpy), &fds); +#endif time(&start); - while (endCond(endData) == 0) + while (TRUE) { + while (XCheckWindowEvent(dpy, commWindow, PropertyChangeMask, &event)) + serverEventProc(dpy, &event); + + if (endCond(endData) != 0) + break; + if (!WindowValid(dpy, w)) + break; time(&now); if (seconds >= 0 && (now - start) >= seconds) break; - if (now != lastChk) - { - lastChk = now; - if (!WindowValid(dpy, w)) - break; - /* - * Sometimes the PropertyChange event doesn't come. - * This can be seen in eg: vim -c 'echo remote_expr("gvim", "3+2")' - */ - serverEventProc(dpy, NULL); - } + + /* Just look out for the answer without calling back into Vim */ if (localLoop) { - /* Just look out for the answer without calling back into Vim */ #ifndef HAVE_SELECT - struct pollfd fds; - - fds.fd = ConnectionNumber(dpy); - fds.events = POLLIN; if (poll(&fds, 1, SEND_MSEC_POLL) < 0) break; #else - fd_set fds; - struct timeval tv; - - tv.tv_sec = 0; - tv.tv_usec = SEND_MSEC_POLL * 1000; - FD_ZERO(&fds); - FD_SET(ConnectionNumber(dpy), &fds); - if (select(ConnectionNumber(dpy) + 1, &fds, NULL, NULL, &tv) < 0) + if (select(FD_SETSIZE, &fds, NULL, NULL, &tv) < 0) break; #endif - while (XEventsQueued(dpy, QueuedAfterReading) > 0) - { - XNextEvent(dpy, &event); - if (event.type == PropertyNotify && e->window == commWindow) - serverEventProc(dpy, &event); - } } else { if (got_int) break; - ui_delay((long)SEND_MSEC_POLL, TRUE); + ui_delay((long)UI_MSEC_DELAY, TRUE); ui_breakcheck(); } } |