aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2016-09-23 12:31:05 +0200
committerGitHub <noreply@github.com>2016-09-23 12:31:05 +0200
commit3c53371b0ccbfa03260b5d58eef3994a656fc1a5 (patch)
tree560d4ad0ad3eee4490c2c937676f71f8df6e694b
parent7307096c5ef5f54e49f2f49fb049fe40f8417f7e (diff)
parentb94891421af5b3e7ba9629baaa9b181e27b3ca2f (diff)
downloadrneovim-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.c8
-rw-r--r--src/nvim/ui.c24
-rw-r--r--test/functional/helpers.lua14
-rw-r--r--test/functional/terminal/api_spec.lua60
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)
+