From 16fb7fa960ad7ed794a1105d164e1f9d3c6abb87 Mon Sep 17 00:00:00 2001 From: André Twupack Date: Sat, 13 Sep 2014 19:57:57 +0200 Subject: vim-patch:7.4.365 Problem: Crash when using ":botright split" when there isn't much space. Solution: Add a check for the minimum width/height. (Yukihiro Nakadaira) https://code.google.com/p/vim/source/detail?r=v7-4-365 --- src/nvim/version.c | 2 +- src/nvim/window.c | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/version.c b/src/nvim/version.c index fa96b27341..7d4b4a4ea2 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -230,7 +230,7 @@ static int included_patches[] = { 368, 367, //366, - //365, + 365, //364, //363, 362, diff --git a/src/nvim/window.c b/src/nvim/window.c index 27fb160035..4d94e7353a 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -542,6 +542,8 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) int layout; frame_T *frp, *curfrp; int before; + int minwidth; + int minheight; if (flags & WSP_TOP) oldwin = firstwin; @@ -571,10 +573,13 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & WSP_ROOM) needed += p_wiw - p_wmw; if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { + minwidth = frame_minwidth(topframe, NULL); available = topframe->fr_width; - needed += frame_minwidth(topframe, NULL); - } else + needed += minwidth; + } else { + minwidth = frame_minwidth(oldwin->w_frame, NULL); available = oldwin->w_width; + } if (available < needed && new_wp == NULL) { EMSG(_(e_noroom)); return FAIL; @@ -583,6 +588,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) new_size = oldwin->w_width / 2; if (new_size > oldwin->w_width - p_wmw - 1) new_size = oldwin->w_width - p_wmw - 1; + if (new_size > available - minwidth - 1) { + new_size = available - minwidth - 1; + } if (new_size < p_wmw) new_size = p_wmw; @@ -623,9 +631,11 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & WSP_ROOM) needed += p_wh - p_wmh; if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { + minheight = frame_minheight(topframe, NULL); available = topframe->fr_height; - needed += frame_minheight(topframe, NULL); + needed += minheight; } else { + minheight = frame_minheight(oldwin->w_frame, NULL); available = oldwin->w_height; needed += p_wmh; } @@ -643,6 +653,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (new_size > oldwin_height - p_wmh - STATUS_HEIGHT) new_size = oldwin_height - p_wmh - STATUS_HEIGHT; + if (new_size > available - minheight - STATUS_HEIGHT) { + new_size = available - minheight - STATUS_HEIGHT; + } if (new_size < p_wmh) new_size = p_wmh; -- cgit From 781d129445dbd1ded68788413aefa226eb60d382 Mon Sep 17 00:00:00 2001 From: André Twupack Date: Mon, 15 Sep 2014 22:59:52 +0200 Subject: vim-patch:7.4.372 Problem: When 'winminheight' is zero there might not be one line for the current window. Solution: Change the size computations. (Yukihiro Nakadaira) https://code.google.com/p/vim/source/detail?r=v7-4-372 --- src/nvim/version.c | 2 +- src/nvim/window.c | 49 ++++++++++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/nvim/version.c b/src/nvim/version.c index 7d4b4a4ea2..27f9e99dcf 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -223,7 +223,7 @@ static int included_patches[] = { //375, //374, //373 NA - //372, + 372, 371, 370, 369, diff --git a/src/nvim/window.c b/src/nvim/window.c index 4d94e7353a..c96884f69a 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -544,6 +544,8 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) int before; int minwidth; int minheight; + int wmw1; + int wmh1; if (flags & WSP_TOP) oldwin = firstwin; @@ -569,16 +571,20 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) * Check if we are able to split the current window and compute its * width. */ - needed = p_wmw + 1; - if (flags & WSP_ROOM) - needed += p_wiw - p_wmw; + // Current window requires at least 1 space. + wmw1 = (p_wmw == 0 ? 1 : p_wmw); + needed = wmw1 + 1; + if (flags & WSP_ROOM) { + needed += p_wiw - wmw1; + } if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { - minwidth = frame_minwidth(topframe, NULL); + minwidth = frame_minwidth(topframe, NOWIN); available = topframe->fr_width; needed += minwidth; } else { - minwidth = frame_minwidth(oldwin->w_frame, NULL); - available = oldwin->w_width; + minwidth = frame_minwidth(oldwin->w_frame, NOWIN); + available = oldwin->w_frame->fr_width; + needed += minwidth; } if (available < needed && new_wp == NULL) { EMSG(_(e_noroom)); @@ -586,13 +592,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) } if (new_size == 0) new_size = oldwin->w_width / 2; - if (new_size > oldwin->w_width - p_wmw - 1) - new_size = oldwin->w_width - p_wmw - 1; if (new_size > available - minwidth - 1) { new_size = available - minwidth - 1; } - if (new_size < p_wmw) - new_size = p_wmw; + if (new_size < wmw1) { + new_size = wmw1; + } /* if it doesn't fit in the current window, need win_equal() */ if (oldwin->w_width - new_size - 1 < p_wmw) @@ -627,17 +632,20 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) * Check if we are able to split the current window and compute its * height. */ - needed = p_wmh + STATUS_HEIGHT + need_status; - if (flags & WSP_ROOM) - needed += p_wh - p_wmh; + // Current window requires at least 1 space. + wmh1 = (p_wmh == 0 ? 1 : p_wmh); + needed = wmh1 + STATUS_HEIGHT; + if (flags & WSP_ROOM) { + needed += p_wh - wmh1; + } if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { - minheight = frame_minheight(topframe, NULL); + minheight = frame_minheight(topframe, NOWIN) + need_status; available = topframe->fr_height; needed += minheight; } else { - minheight = frame_minheight(oldwin->w_frame, NULL); - available = oldwin->w_height; - needed += p_wmh; + minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; + available = oldwin->w_frame->fr_height; + needed += minheight; } if (available < needed && new_wp == NULL) { EMSG(_(e_noroom)); @@ -651,13 +659,12 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (new_size == 0) new_size = oldwin_height / 2; - if (new_size > oldwin_height - p_wmh - STATUS_HEIGHT) - new_size = oldwin_height - p_wmh - STATUS_HEIGHT; if (new_size > available - minheight - STATUS_HEIGHT) { new_size = available - minheight - STATUS_HEIGHT; } - if (new_size < p_wmh) - new_size = p_wmh; + if (new_size < wmh1) { + new_size = wmh1; + } /* if it doesn't fit in the current window, need win_equal() */ if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) -- cgit From ab4feeac8227386428196445aa9036b9f5523ae6 Mon Sep 17 00:00:00 2001 From: André Twupack Date: Mon, 15 Sep 2014 23:35:13 +0200 Subject: vim-patch:7.4.373 Problem: Compiler warning for unused argument and unused variable. Solution: Add UNUSED. Move variable inside #ifdef. https://code.google.com/p/vim/source/detail?r=v7-4-373 --- src/nvim/version.c | 2 +- src/nvim/window.c | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/version.c b/src/nvim/version.c index 27f9e99dcf..57634f49c1 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -222,7 +222,7 @@ static int included_patches[] = { 376, //375, //374, - //373 NA + 373, 372, 371, 370, diff --git a/src/nvim/window.c b/src/nvim/window.c index c96884f69a..38f61ee45e 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -542,9 +542,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) int layout; frame_T *frp, *curfrp; int before; - int minwidth; int minheight; - int wmw1; int wmh1; if (flags & WSP_TOP) @@ -565,6 +563,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & WSP_VERT) { + int wmw1; + int minwidth; + layout = FR_ROW; /* -- cgit From f379b4474713d481dafde23a7f00d9fda3314598 Mon Sep 17 00:00:00 2001 From: André Twupack Date: Tue, 16 Sep 2014 20:59:10 +0200 Subject: vim-patch:7.4.377 Problem: When 'equalalways' is set a split may report "no room" even though there is plenty of room. Solution: Compute the available room properly. (Yukihiro Nakadaira) https://code.google.com/p/vim/source/detail?r=v7-4-377 --- src/nvim/version.c | 2 +- src/nvim/window.c | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/nvim/version.c b/src/nvim/version.c index 57634f49c1..81a018470a 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -218,7 +218,7 @@ static int included_patches[] = { //380 NA //379, //378, - //377, + 377, 376, //375, //374, diff --git a/src/nvim/window.c b/src/nvim/window.c index 38f61ee45e..f5d8edc751 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -540,7 +540,7 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) int available; int oldwin_height = 0; int layout; - frame_T *frp, *curfrp; + frame_T *frp, *curfrp, *frp2, *prevfrp; int before; int minheight; int wmh1; @@ -578,10 +578,26 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & WSP_ROOM) { needed += p_wiw - wmw1; } - if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { + if (flags & (WSP_BOT | WSP_TOP)) { minwidth = frame_minwidth(topframe, NOWIN); available = topframe->fr_width; needed += minwidth; + } else if (p_ea) { + minwidth = frame_minwidth(oldwin->w_frame, NOWIN); + prevfrp = oldwin->w_frame; + for (frp = oldwin->w_frame->fr_parent; frp != NULL; + frp = frp->fr_parent) { + if (frp->fr_layout == FR_ROW) { + for (frp2 = frp->fr_child; frp2 != NULL; frp2 = frp2->fr_next) { + if (frp2 != prevfrp) { + minwidth += frame_minwidth(frp2, NOWIN); + } + } + } + prevfrp = frp; + } + available = topframe->fr_width; + needed += minwidth; } else { minwidth = frame_minwidth(oldwin->w_frame, NOWIN); available = oldwin->w_frame->fr_width; @@ -639,10 +655,26 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & WSP_ROOM) { needed += p_wh - wmh1; } - if (p_ea || (flags & (WSP_BOT | WSP_TOP))) { + if (flags & (WSP_BOT | WSP_TOP)) { minheight = frame_minheight(topframe, NOWIN) + need_status; available = topframe->fr_height; needed += minheight; + } else if (p_ea) { + minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; + prevfrp = oldwin->w_frame; + for (frp = oldwin->w_frame->fr_parent; frp != NULL; + frp = frp->fr_parent) { + if (frp->fr_layout == FR_COL) { + for (frp2 = frp->fr_child; frp2 != NULL; frp2 = frp2->fr_next) { + if (frp2 != prevfrp) { + minheight += frame_minheight(frp2, NOWIN); + } + } + } + prevfrp = frp; + } + available = topframe->fr_height; + needed += minheight; } else { minheight = frame_minheight(oldwin->w_frame, NOWIN) + need_status; available = oldwin->w_frame->fr_height; -- cgit