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 {