diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-09-23 12:31:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-23 12:31:05 +0200 |
commit | 3c53371b0ccbfa03260b5d58eef3994a656fc1a5 (patch) | |
tree | 560d4ad0ad3eee4490c2c937676f71f8df6e694b | |
parent | 7307096c5ef5f54e49f2f49fb049fe40f8417f7e (diff) | |
parent | b94891421af5b3e7ba9629baaa9b181e27b3ca2f (diff) | |
download | rneovim-3c53371b0ccbfa03260b5d58eef3994a656fc1a5.tar.gz rneovim-3c53371b0ccbfa03260b5d58eef3994a656fc1a5.tar.bz2 rneovim-3c53371b0ccbfa03260b5d58eef3994a656fc1a5.zip |
Merge #4972 from justinmk/schedule-ui_refresh
Schedule ui_refresh
-rw-r--r-- | src/nvim/tui/tui.c | 8 | ||||
-rw-r--r-- | src/nvim/ui.c | 24 | ||||
-rw-r--r-- | test/functional/helpers.lua | 14 | ||||
-rw-r--r-- | test/functional/terminal/api_spec.lua | 60 |
4 files changed, 89 insertions, 17 deletions
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c index bfc03dfb81..db06ffe94a 100644 --- a/src/nvim/tui/tui.c +++ b/src/nvim/tui/tui.c @@ -250,11 +250,6 @@ static void tui_scheduler(Event event, void *d) loop_schedule(data->loop, event); } -static void refresh_event(void **argv) -{ - ui_refresh(); -} - static void sigcont_cb(SignalWatcher *watcher, int signum, void *data) { ((TUIData *)data)->cont_received = true; @@ -265,8 +260,7 @@ static void sigwinch_cb(SignalWatcher *watcher, int signum, void *data) got_winch = true; UI *ui = data; update_size(ui); - // run refresh_event in nvim main loop - loop_schedule(&main_loop, event_create(1, refresh_event, 0)); + ui_schedule_refresh(); } static bool attrs_differ(HlAttrs a1, HlAttrs a2) diff --git a/src/nvim/ui.c b/src/nvim/ui.c index dd278893c2..b8d44cbcf8 100644 --- a/src/nvim/ui.c +++ b/src/nvim/ui.c @@ -53,12 +53,10 @@ static bool pending_cursor_update = false; static int busy = 0; static int height, width; -// This set of macros allow us to use UI_CALL to invoke any function on -// registered UI instances. The functions can have 0-5 arguments(configurable -// by SELECT_NTH) +// UI_CALL invokes a function on all registered UI instances. The functions can +// have 0-5 arguments (configurable by SELECT_NTH). // -// See http://stackoverflow.com/a/11172679 for a better explanation of how it -// works. +// See http://stackoverflow.com/a/11172679 for how it works. #ifdef _MSC_VER # define UI_CALL(funname, ...) \ do { \ @@ -169,8 +167,8 @@ void ui_refresh(void) for (size_t i = 0; i < ui_count; i++) { UI *ui = uis[i]; - width = ui->width < width ? ui->width : width; - height = ui->height < height ? ui->height : height; + width = MIN(ui->width, width); + height = MIN(ui->height, height); pum_external &= ui->pum_external; } @@ -179,6 +177,16 @@ void ui_refresh(void) pum_set_external(pum_external); } +static void ui_refresh_handler(void **argv) +{ + ui_refresh(); +} + +void ui_schedule_refresh(void) +{ + loop_schedule(&main_loop, event_create(1, ui_refresh_handler, 0)); +} + void ui_resize(int new_width, int new_height) { width = new_width; @@ -252,7 +260,7 @@ void ui_detach_impl(UI *ui) } if (--ui_count) { - ui_refresh(); + ui_schedule_refresh(); } } diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index d5b7442b57..325f41e506 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -1,6 +1,8 @@ require('coxpcall') local lfs = require('lfs') local ChildProcessStream = require('nvim.child_process_stream') +local SocketStream = require('nvim.socket_stream') +local TcpStream = require('nvim.tcp_stream') local Session = require('nvim.session') local global_helpers = require('test.helpers') @@ -223,6 +225,14 @@ local function spawn(argv, merge, env) return Session.new(child_stream) end +-- Creates a new Session connected by domain socket (named pipe) or TCP. +local function connect(file_or_address) + local addr, port = string.match(file_or_address, "(.*):(%d+)") + local stream = (addr and port) and TcpStream.open(addr, port) or + SocketStream.open(file_or_address) + return Session.new(stream) +end + local function clear(...) local args = {unpack(nvim_argv)} local new_args @@ -291,8 +301,7 @@ local function write_file(name, text, dont_dedent) file:close() end --- Tries to get platform name, from $SYSTEM_NAME, uname, --- fallback is 'Windows' +-- Tries to get platform name from $SYSTEM_NAME, uname; fallback is "Windows". local uname = (function() local platform = nil return (function() @@ -508,6 +517,7 @@ return function(after_each) return { prepend_argv = prepend_argv, clear = clear, + connect = connect, spawn = spawn, dedent = dedent, source = source, diff --git a/test/functional/terminal/api_spec.lua b/test/functional/terminal/api_spec.lua new file mode 100644 index 0000000000..58d6c75940 --- /dev/null +++ b/test/functional/terminal/api_spec.lua @@ -0,0 +1,60 @@ +local helpers = require('test.functional.helpers')(after_each) +local child_session = require('test.functional.terminal.helpers') +local ok = helpers.ok + +if helpers.pending_win32(pending) then return end + +describe('api', function() + local screen + local socket_name = "Xtest_functional_api.sock" + + before_each(function() + helpers.clear() + os.remove(socket_name) + screen = child_session.screen_setup(0, '["'..helpers.nvim_prog + ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]') + end) + after_each(function() + os.remove(socket_name) + end) + + it("qa! RPC request during insert-mode", function() + -- Start the socket from the child nvim. + child_session.feed_data(":echo serverstart('"..socket_name.."')\n") + + -- Wait for socket creation by abusing expect(). + screen:expect([[ + {1: } | + {4:~ }| + {4:~ }| + {4:~ }| + {5:[No Name] }| + ]]..socket_name..[[ | + {3:-- TERMINAL --} | + ]]) + + local socket_session1 = helpers.connect(socket_name) + local socket_session2 = helpers.connect(socket_name) + + child_session.feed_data("i[tui] insert-mode") + + ok(socket_session1:request("nvim_ui_attach", 42, 6, {rgb=true})) + ok(socket_session2:request("nvim_ui_attach", 25, 30, {rgb=true})) + + socket_session1:notify("nvim_input", "\n[socket 1] this is more than 25 columns") + socket_session2:notify("nvim_input", "\n[socket 2] input") + + screen:expect([[ + [tui] insert-mode | + [socket 1] this is more t{4: }| + han 25 columns {4: }| + [socket 2] input{1: } {4: }| + {5:[No Name] [+] }| + {3:-- INSERT --} | + {3:-- TERMINAL --} | + ]]) + + socket_session1:request("nvim_command", "qa!") + end) +end) + |