Mercurial > vim
comparison src/channel.c @ 8928:e6916e1683bb v7.4.1750
commit https://github.com/vim/vim/commit/7f7c3325d3f1baba32263a3457cfc4d90ecd5ff1
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Apr 18 19:27:24 2016 +0200
patch 7.4.1750
Problem: When a buffer gets updated while in command line mode, the screen
may be messed up.
Solution: Postpone the redraw when the screen is scrolled.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 18 Apr 2016 19:30:05 +0200 |
parents | ed0b39dd7fd6 |
children | 072556995a8e |
comparison
equal
deleted
inserted
replaced
8927:bab6c130bb26 | 8928:e6916e1683bb |
---|---|
1429 buf->b_write_to_channel = FALSE; | 1429 buf->b_write_to_channel = FALSE; |
1430 } | 1430 } |
1431 | 1431 |
1432 /* | 1432 /* |
1433 * Invoke the "callback" on channel "channel". | 1433 * Invoke the "callback" on channel "channel". |
1434 * This does not redraw but sets channel_need_redraw; | |
1434 */ | 1435 */ |
1435 static void | 1436 static void |
1436 invoke_callback(channel_T *channel, char_u *callback, partial_T *partial, | 1437 invoke_callback(channel_T *channel, char_u *callback, partial_T *partial, |
1437 typval_T *argv) | 1438 typval_T *argv) |
1438 { | 1439 { |
1443 argv[0].vval.v_channel = channel; | 1444 argv[0].vval.v_channel = channel; |
1444 | 1445 |
1445 call_func(callback, (int)STRLEN(callback), | 1446 call_func(callback, (int)STRLEN(callback), |
1446 &rettv, 2, argv, 0L, 0L, &dummy, TRUE, partial, NULL); | 1447 &rettv, 2, argv, 0L, 0L, &dummy, TRUE, partial, NULL); |
1447 clear_tv(&rettv); | 1448 clear_tv(&rettv); |
1448 | 1449 channel_need_redraw = TRUE; |
1449 redraw_after_callback(); | |
1450 } | 1450 } |
1451 | 1451 |
1452 /* | 1452 /* |
1453 * Return the first buffer from channel "channel"/"part" and remove it. | 1453 * Return the first buffer from channel "channel"/"part" and remove it. |
1454 * The caller must free it. | 1454 * The caller must free it. |
2007 ch_errors(channel, "Receved unknown command: %s", (char *)cmd); | 2007 ch_errors(channel, "Receved unknown command: %s", (char *)cmd); |
2008 EMSG2("E905: received unknown command: %s", cmd); | 2008 EMSG2("E905: received unknown command: %s", cmd); |
2009 } | 2009 } |
2010 } | 2010 } |
2011 | 2011 |
2012 /* | |
2013 * Invoke the callback at "cbhead". | |
2014 * Does not redraw but sets channel_need_redraw. | |
2015 */ | |
2012 static void | 2016 static void |
2013 invoke_one_time_callback( | 2017 invoke_one_time_callback( |
2014 channel_T *channel, | 2018 channel_T *channel, |
2015 cbq_T *cbhead, | 2019 cbq_T *cbhead, |
2016 cbq_T *item, | 2020 cbq_T *item, |
2097 } | 2101 } |
2098 } | 2102 } |
2099 | 2103 |
2100 /* | 2104 /* |
2101 * Invoke a callback for "channel"/"part" if needed. | 2105 * Invoke a callback for "channel"/"part" if needed. |
2106 * This does not redraw but sets channel_need_redraw when redraw is needed. | |
2102 * Return TRUE when a message was handled, there might be another one. | 2107 * Return TRUE when a message was handled, there might be another one. |
2103 */ | 2108 */ |
2104 static int | 2109 static int |
2105 may_invoke_callback(channel_T *channel, int part) | 2110 may_invoke_callback(channel_T *channel, int part) |
2106 { | 2111 { |
3466 channel = channel->ch_next; | 3471 channel = channel->ch_next; |
3467 part = PART_SOCK; | 3472 part = PART_SOCK; |
3468 } | 3473 } |
3469 } | 3474 } |
3470 | 3475 |
3471 if (channel_need_redraw && must_redraw) | 3476 if (channel_need_redraw) |
3472 { | 3477 { |
3473 channel_need_redraw = FALSE; | 3478 channel_need_redraw = FALSE; |
3474 update_screen(0); | 3479 redraw_after_callback(); |
3475 setcursor(); | |
3476 cursor_on(); | |
3477 out_flush(); | |
3478 } | 3480 } |
3479 | 3481 |
3480 return ret; | 3482 return ret; |
3481 } | 3483 } |
3482 | 3484 |