aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/mouse.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-12-04 17:44:51 +0800
committerGitHub <noreply@github.com>2022-12-04 17:44:51 +0800
commit9263f17d0d741f52e9fafae9779ddaa4e3441fcc (patch)
tree68312420dadcf7a1e47ceb2eb7d90ca6cb7b77de /src/nvim/mouse.c
parent823247a0407df806de0bd3ecd8bd151791e0951a (diff)
downloadrneovim-9263f17d0d741f52e9fafae9779ddaa4e3441fcc.tar.gz
rneovim-9263f17d0d741f52e9fafae9779ddaa4e3441fcc.tar.bz2
rneovim-9263f17d0d741f52e9fafae9779ddaa4e3441fcc.zip
vim-patch:9.0.0259: crash with mouse click when not initialized (#21282)
Problem: Crash with mouse click when not initialized. Solution: Check TabPageIdxs[] is not NULL. https://github.com/vim/vim/commit/80525751c5ce9ed82c41d83faf9ef38667bf61b1 Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src/nvim/mouse.c')
-rw-r--r--src/nvim/mouse.c102
1 files changed, 52 insertions, 50 deletions
diff --git a/src/nvim/mouse.c b/src/nvim/mouse.c
index 479ffde705..b4d6a533f1 100644
--- a/src/nvim/mouse.c
+++ b/src/nvim/mouse.c
@@ -467,66 +467,68 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent)
start_visual.lnum = 0;
- // Check for clicking in the tab page line.
- if (mouse_grid <= 1 && mouse_row == 0 && firstwin->w_winrow > 0) {
- if (is_drag) {
- if (in_tab_line) {
- move_tab_to_mouse();
+ if (tab_page_click_defs != NULL) { // only when initialized
+ // Check for clicking in the tab page line.
+ if (mouse_grid <= 1 && mouse_row == 0 && firstwin->w_winrow > 0) {
+ if (is_drag) {
+ if (in_tab_line) {
+ move_tab_to_mouse();
+ }
+ return false;
}
- return false;
- }
- // click in a tab selects that tab page
- if (is_click && cmdwin_type == 0 && mouse_col < Columns) {
- in_tab_line = true;
- c1 = tab_page_click_defs[mouse_col].tabnr;
- switch (tab_page_click_defs[mouse_col].type) {
- case kStlClickDisabled:
- break;
- case kStlClickTabClose: {
- tabpage_T *tp;
+ // click in a tab selects that tab page
+ if (is_click && cmdwin_type == 0 && mouse_col < Columns) {
+ in_tab_line = true;
+ c1 = tab_page_click_defs[mouse_col].tabnr;
+ switch (tab_page_click_defs[mouse_col].type) {
+ case kStlClickDisabled:
+ break;
+ case kStlClickTabClose: {
+ tabpage_T *tp;
- // Close the current or specified tab page.
- if (c1 == 999) {
- tp = curtab;
- } else {
- tp = find_tabpage(c1);
- }
- if (tp == curtab) {
- if (first_tabpage->tp_next != NULL) {
- tabpage_close(false);
+ // Close the current or specified tab page.
+ if (c1 == 999) {
+ tp = curtab;
+ } else {
+ tp = find_tabpage(c1);
}
- } else if (tp != NULL) {
- tabpage_close_other(tp, false);
+ if (tp == curtab) {
+ if (first_tabpage->tp_next != NULL) {
+ tabpage_close(false);
+ }
+ } else if (tp != NULL) {
+ tabpage_close_other(tp, false);
+ }
+ break;
}
- break;
- }
- case kStlClickTabSwitch:
- if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK) {
- // double click opens new page
- end_visual_mode();
- tabpage_new();
- tabpage_move(c1 == 0 ? 9999 : c1 - 1);
- } else {
- // Go to specified tab page, or next one if not clicking
- // on a label.
- goto_tabpage(c1);
-
- // It's like clicking on the status line of a window.
- if (curwin != old_curwin) {
+ case kStlClickTabSwitch:
+ if ((mod_mask & MOD_MASK_MULTI_CLICK) == MOD_MASK_2CLICK) {
+ // double click opens new page
end_visual_mode();
+ tabpage_new();
+ tabpage_move(c1 == 0 ? 9999 : c1 - 1);
+ } else {
+ // Go to specified tab page, or next one if not clicking
+ // on a label.
+ goto_tabpage(c1);
+
+ // It's like clicking on the status line of a window.
+ if (curwin != old_curwin) {
+ end_visual_mode();
+ }
}
+ break;
+ case kStlClickFuncRun:
+ call_click_def_func(tab_page_click_defs, mouse_col, which_button);
+ break;
}
- break;
- case kStlClickFuncRun:
- call_click_def_func(tab_page_click_defs, mouse_col, which_button);
- break;
}
+ return true;
+ } else if (is_drag && in_tab_line) {
+ move_tab_to_mouse();
+ return false;
}
- return true;
- } else if (is_drag && in_tab_line) {
- move_tab_to_mouse();
- return false;
}
// When 'mousemodel' is "popup" or "popup_setpos", translate mouse events: