Mercurial > vim
comparison src/window.c @ 6052:4625fa27ba6f v7.4.365
updated for version 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)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 16 Jul 2014 14:16:46 +0200 |
parents | 79950dae1d7d |
children | 021e16be3c02 |
comparison
equal
deleted
inserted
replaced
6051:0efec12f52ac | 6052:4625fa27ba6f |
---|---|
684 int available; | 684 int available; |
685 int oldwin_height = 0; | 685 int oldwin_height = 0; |
686 int layout; | 686 int layout; |
687 frame_T *frp, *curfrp; | 687 frame_T *frp, *curfrp; |
688 int before; | 688 int before; |
689 int minwidth; | |
690 int minheight; | |
689 | 691 |
690 if (flags & WSP_TOP) | 692 if (flags & WSP_TOP) |
691 oldwin = firstwin; | 693 oldwin = firstwin; |
692 else if (flags & WSP_BOT) | 694 else if (flags & WSP_BOT) |
693 oldwin = lastwin; | 695 oldwin = lastwin; |
723 needed = p_wmw + 1; | 725 needed = p_wmw + 1; |
724 if (flags & WSP_ROOM) | 726 if (flags & WSP_ROOM) |
725 needed += p_wiw - p_wmw; | 727 needed += p_wiw - p_wmw; |
726 if (p_ea || (flags & (WSP_BOT | WSP_TOP))) | 728 if (p_ea || (flags & (WSP_BOT | WSP_TOP))) |
727 { | 729 { |
730 minwidth = frame_minwidth(topframe, NULL); | |
728 available = topframe->fr_width; | 731 available = topframe->fr_width; |
729 needed += frame_minwidth(topframe, NULL); | 732 needed += minwidth; |
730 } | 733 } |
731 else | 734 else |
735 { | |
736 minwidth = frame_minwidth(oldwin->w_frame, NULL); | |
732 available = oldwin->w_width; | 737 available = oldwin->w_width; |
738 } | |
733 if (available < needed && new_wp == NULL) | 739 if (available < needed && new_wp == NULL) |
734 { | 740 { |
735 EMSG(_(e_noroom)); | 741 EMSG(_(e_noroom)); |
736 return FAIL; | 742 return FAIL; |
737 } | 743 } |
738 if (new_size == 0) | 744 if (new_size == 0) |
739 new_size = oldwin->w_width / 2; | 745 new_size = oldwin->w_width / 2; |
740 if (new_size > oldwin->w_width - p_wmw - 1) | 746 if (new_size > oldwin->w_width - p_wmw - 1) |
741 new_size = oldwin->w_width - p_wmw - 1; | 747 new_size = oldwin->w_width - p_wmw - 1; |
748 if (new_size > available - minwidth - 1) | |
749 new_size = available - minwidth - 1; | |
742 if (new_size < p_wmw) | 750 if (new_size < p_wmw) |
743 new_size = p_wmw; | 751 new_size = p_wmw; |
744 | 752 |
745 /* if it doesn't fit in the current window, need win_equal() */ | 753 /* if it doesn't fit in the current window, need win_equal() */ |
746 if (oldwin->w_width - new_size - 1 < p_wmw) | 754 if (oldwin->w_width - new_size - 1 < p_wmw) |
784 needed = p_wmh + STATUS_HEIGHT + need_status; | 792 needed = p_wmh + STATUS_HEIGHT + need_status; |
785 if (flags & WSP_ROOM) | 793 if (flags & WSP_ROOM) |
786 needed += p_wh - p_wmh; | 794 needed += p_wh - p_wmh; |
787 if (p_ea || (flags & (WSP_BOT | WSP_TOP))) | 795 if (p_ea || (flags & (WSP_BOT | WSP_TOP))) |
788 { | 796 { |
797 minheight = frame_minheight(topframe, NULL); | |
789 available = topframe->fr_height; | 798 available = topframe->fr_height; |
790 needed += frame_minheight(topframe, NULL); | 799 needed += minheight; |
791 } | 800 } |
792 else | 801 else |
793 { | 802 { |
803 minheight = frame_minheight(oldwin->w_frame, NULL); | |
794 available = oldwin->w_height; | 804 available = oldwin->w_height; |
795 needed += p_wmh; | 805 needed += p_wmh; |
796 } | 806 } |
797 if (available < needed && new_wp == NULL) | 807 if (available < needed && new_wp == NULL) |
798 { | 808 { |
808 if (new_size == 0) | 818 if (new_size == 0) |
809 new_size = oldwin_height / 2; | 819 new_size = oldwin_height / 2; |
810 | 820 |
811 if (new_size > oldwin_height - p_wmh - STATUS_HEIGHT) | 821 if (new_size > oldwin_height - p_wmh - STATUS_HEIGHT) |
812 new_size = oldwin_height - p_wmh - STATUS_HEIGHT; | 822 new_size = oldwin_height - p_wmh - STATUS_HEIGHT; |
823 if (new_size > available - minheight - STATUS_HEIGHT) | |
824 new_size = available - minheight - STATUS_HEIGHT; | |
813 if (new_size < p_wmh) | 825 if (new_size < p_wmh) |
814 new_size = p_wmh; | 826 new_size = p_wmh; |
815 | 827 |
816 /* if it doesn't fit in the current window, need win_equal() */ | 828 /* if it doesn't fit in the current window, need win_equal() */ |
817 if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) | 829 if (oldwin_height - new_size - STATUS_HEIGHT < p_wmh) |
5730 wp->w_skipcol += W_WIDTH(wp) - win_col_off(wp) | 5742 wp->w_skipcol += W_WIDTH(wp) - win_col_off(wp) |
5731 + win_col_off2(wp); | 5743 + win_col_off2(wp); |
5732 --wp->w_wrow; | 5744 --wp->w_wrow; |
5733 } | 5745 } |
5734 } | 5746 } |
5735 set_topline(wp, lnum); | 5747 set_topline(wp, lnum); |
5736 } | 5748 } |
5737 else if (sline > 0) | 5749 else if (sline > 0) |
5738 { | 5750 { |
5739 while (sline > 0 && lnum > 1) | 5751 while (sline > 0 && lnum > 1) |
5740 { | 5752 { |
5776 /* First line of file reached, use that as topline. */ | 5788 /* First line of file reached, use that as topline. */ |
5777 lnum = 1; | 5789 lnum = 1; |
5778 wp->w_wrow -= sline; | 5790 wp->w_wrow -= sline; |
5779 } | 5791 } |
5780 | 5792 |
5781 set_topline(wp, lnum); | 5793 set_topline(wp, lnum); |
5782 } | 5794 } |
5783 } | 5795 } |
5784 | 5796 |
5785 if (wp == curwin) | 5797 if (wp == curwin) |
5786 { | 5798 { |