/******************************************************************************
*   TinTin++                                                                  *
*   Copyright (C) 2004 (See CREDITS file)                                     *
*                                                                             *
*   This program is protected under the GNU GPL (See COPYING)                 *
*                                                                             *
*   This program is free software; you can redistribute it and/or modify      *
*   it under the terms of the GNU General Public License as published by      *
*   the Free Software Foundation; either version 2 of the License, or         *
*   (at your option) any later version.                                       *
*                                                                             *
*   This program is distributed in the hope that it will be useful,           *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of            *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
*   GNU General Public License for more details.                              *
*                                                                             *
*   You should have received a copy of the GNU General Public License         *
*   along with this program; if not, write to the Free Software               *
*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *
*******************************************************************************/

/******************************************************************************
*                (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t                 *
*                                                                             *
*                          coded by Bill Reiss 1993                           *
******************************************************************************/

#include "tintin.h"


DO_COMMAND(do_split)
{
	char left[BUFFER_SIZE], right[BUFFER_SIZE];

	arg = get_arg_in_braces(arg, left,  FALSE);
	substitute(ses, left, left, SUB_VAR|SUB_FUN);

	arg = get_arg_in_braces(arg, right, FALSE);
	substitute(ses, right, right, SUB_VAR|SUB_FUN);

	if (*left == 0 && *right == 0)
	{
		init_split(ses, 1, ses->rows - 2);
	}
	else if (*right == 0)
	{
		init_split(ses, 1 + atoi(left), ses->rows - 2);
	}
	else
	{
		init_split(ses, 1 + atoi(left), ses->rows - 1 - atoi(right));
	}
	return ses;
}


DO_COMMAND(do_unsplit)
{
	clean_screen(ses);

	if (HAS_BIT(ses->flags, SES_FLAG_SPLIT))
	{
		if (HAS_BIT(ses->telopts, TELOPT_FLAG_NAWS))
		{
			send_sb_naws(ses, 0, NULL);
		}
		DEL_BIT(ses->flags, SES_FLAG_SPLIT);
	}
	return ses;
}

/*
	turn on split mode
*/

void init_split(struct session *ses, int top, int bot)
{
	if (top < 1)
	{
		top = 1;
	}

	if (bot > ses->rows)
	{
		bot = ses->rows;
	}

	scroll_region(ses, top, bot);

	SET_BIT(ses->flags, SES_FLAG_SPLIT);

	for (bot = 1 ; ses->rows - bot > ses->bot_row ; bot++)
	{
		do_one_prompt(ses, "", +bot);
	}

	for (top = 1 ; top < ses->top_row ; top++)
	{
		do_one_prompt(ses, "", -top);
	}

	goto_rowcol(ses, ses->rows, 1);

	if (HAS_BIT(ses->telopts, TELOPT_FLAG_NAWS))
	{
		send_sb_naws(ses, 0, NULL);
	}

	if (ses->map && HAS_BIT(ses->map->flags, MAP_FLAG_VTMAP))
	{
		SET_BIT(ses->flags, SES_FLAG_UPDATEVTMAP);
	}
}


/*
	get a clean screen, useful for ^Z, quitting, etc
*/

void clean_screen(struct session *ses)
{
	reset_scroll_region(ses);

	if (ses == gtd->ses)
	{
		goto_rowcol(ses, ses->rows, 1);
	}
}


/*
	undo clean_screen(); useful after ^Z
*/

void dirty_screen(struct session *ses)
{
	printf("\033=");

	if (HAS_BIT(ses->flags, SES_FLAG_SPLIT))
	{
		init_split(ses, ses->top_row, ses->bot_row);
	}
	else if (IS_SPLIT(ses))
	{
		scroll_region(ses, ses->top_row, ses->bot_row);
	}
	else
	{
		clean_screen(ses);
	}

	if (IS_SPLIT(ses) && ses == gtd->ses)
	{
		goto_rowcol(ses, ses->rows, 1);
	}
}