/******************************************************************************
* 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);
}
}