0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 7.4.866

Problem:    Crash when changing the 'tags' option from a remote command.
            (Benjamin Fritz)
Solution:   Instead of executing messages immediately, use a queue, like for
            netbeans. (James Kolb)
This commit is contained in:
Bram Moolenaar
2015-09-15 14:12:05 +02:00
parent ed84b76021
commit 93c88e0f6a
12 changed files with 185 additions and 58 deletions

View File

@@ -388,9 +388,8 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt)
{
int len;
#ifdef FEAT_NETBEANS_INTG
/* Process the queued netbeans messages. */
netbeans_parse_messages();
#ifdef MESSAGE_QUEUE
parse_queued_messages();
#endif
/* Check if window changed size while we were busy, perhaps the ":set
@@ -405,9 +404,8 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt)
if (!do_resize) /* return if not interrupted by resize */
return 0;
handle_resize();
#ifdef FEAT_NETBEANS_INTG
/* Process the queued netbeans messages. */
netbeans_parse_messages();
#ifdef MESSAGE_QUEUE
parse_queued_messages();
#endif
}
}
@@ -439,9 +437,8 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt)
while (do_resize) /* window changed size */
handle_resize();
#ifdef FEAT_NETBEANS_INTG
/* Process the queued netbeans messages. */
netbeans_parse_messages();
#ifdef MESSAGE_QUEUE
parse_queued_messages();
#endif
/*
* We want to be interrupted by the winch signal
@@ -5208,6 +5205,7 @@ WaitForChar(msec)
* When a GUI is being used, this will not be used for input -- webb
* Returns also, when a request from Sniff is waiting -- toni.
* Or when a Linux GPM mouse event is waiting.
* Or when a clientserver message is on the queue.
*/
#if defined(__BEOS__)
int
@@ -5601,6 +5599,11 @@ select_eintr:
if (finished || msec == 0)
break;
# ifdef FEAT_CLIENTSERVER
if (server_waiting())
break;
# endif
/* We're going to loop around again, find out for how long */
if (msec > 0)
{
@@ -7106,31 +7109,31 @@ xterm_update()
for (;;)
{
XtInputMask mask = XtAppPending(app_context);
XtInputMask mask = XtAppPending(app_context);
if (mask == 0 || vim_is_input_buf_full())
if (mask == 0 || vim_is_input_buf_full())
break;
if (mask & XtIMXEvent)
if (mask & XtIMXEvent)
{
/* There is an event to process. */
XtAppNextEvent(app_context, &event);
XtAppNextEvent(app_context, &event);
#ifdef FEAT_CLIENTSERVER
{
XPropertyEvent *e = (XPropertyEvent *)&event;
if (e->type == PropertyNotify && e->window == commWindow
&& e->atom == commProperty && e->state == PropertyNewValue)
serverEventProc(xterm_dpy, &event);
serverEventProc(xterm_dpy, &event, 0);
}
#endif
XtDispatchEvent(&event);
}
XtDispatchEvent(&event);
}
else
{
/* There is something else than an event to process. */
XtAppProcessEvent(app_context, mask);
}
XtAppProcessEvent(app_context, mask);
}
}
}