diff options
author | Scott Prager <splinterofchaos@gmail.com> | 2015-04-03 18:44:26 -0400 |
---|---|---|
committer | Scott Prager <splinterofchaos@gmail.com> | 2015-04-05 13:39:55 -0400 |
commit | b6296f4e84217adaa3326c715d4e2c82a105bc39 (patch) | |
tree | df9775942fd195a36fdd1c309dbaf5b1b89a89e4 /test | |
parent | a69e464f70f1f26c352b713f70b627ea07232e79 (diff) | |
download | rneovim-b6296f4e84217adaa3326c715d4e2c82a105bc39.tar.gz rneovim-b6296f4e84217adaa3326c715d4e2c82a105bc39.tar.bz2 rneovim-b6296f4e84217adaa3326c715d4e2c82a105bc39.zip |
terminal: Handle loss of focus in event loop.
While in a terminal and insert mode, if an event caused loss of focus,
nvim would stay in the terminal event loop causing an inconsistent view
of internal state and/or segfault.
Remove the "term" argument from terminal_enter() as it only makes sense
to call it with curbuf->terminal. Terminate the loop when switched to a
different buffer.
fixes #2301
Diffstat (limited to 'test')
-rw-r--r-- | test/functional/terminal/buffer_spec.lua | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua index 857679c4b3..0756508a4c 100644 --- a/test/functional/terminal/buffer_spec.lua +++ b/test/functional/terminal/buffer_spec.lua @@ -2,7 +2,9 @@ local helpers = require('test.functional.helpers') local Screen = require('test.functional.ui.screen') local thelpers = require('test.functional.terminal.helpers') local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim -local wait, execute, eq = helpers.wait, helpers.execute, helpers.eq +local wait = helpers.wait +local eval, execute, source = helpers.eval, helpers.execute, helpers.source +local eq, neq = helpers.eq, helpers.neq describe('terminal buffer', function() @@ -155,5 +157,41 @@ describe('terminal buffer', function() :bnext | ]]) end) + + it('handles loss of focus gracefully', function() + -- Temporarily change the statusline to avoid printing the file name, which + -- varies be where the test is run. + nvim('set_option', 'statusline', '==========') + execute('set laststatus=0') + + -- Save the buffer number of the terminal for later testing. + local tbuf = eval('bufnr("%")') + + source([[ + function! SplitWindow() + new + endfunction + + startinsert + call jobstart(['sh', '-c', 'exit'], {'on_exit': function("SplitWindow")}) + ]]) + + -- We should be in a new buffer now. + screen:expect([[ + ^ | + ~ | + ========== | + rows: 2, cols: 50 | + {2: } | + {1:========== }| + | + ]]) + + neq(tbuf, eval('bufnr("%")')) + execute('quit') -- Should exit the new window, not the terminal. + eq(tbuf, eval('bufnr("%")')) + + execute('set laststatus=1') -- Restore laststatus to the default. + end) end) |