/******************************************************************************
* TinTin++ *
* Copyright (C) 2005 (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 Igor van den Hoven 2006 *
******************************************************************************/
#include "tintin.h"
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#include <termios.h>
#include <errno.h>
void init_terminal()
{
struct termios io;
if (tcgetattr(0, >d->old_terminal))
{
perror("tcgetattr");
exit(errno);
}
io = gtd->old_terminal;
/*
Canonical mode off
*/
DEL_BIT(io.c_lflag, ICANON);
io.c_cc[VMIN] = 1;
io.c_cc[VTIME] = 0;
io.c_cc[VSTART] = 255;
io.c_cc[VSTOP] = 255;
/*
Make the terminalal as raw as possible
*/
/*
DEL_BIT(io.c_iflag, IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
DEL_BIT(io.c_oflag, OPOST);
DEL_BIT(io.c_cflag, CSIZE|PARENB);
*/
DEL_BIT(io.c_lflag, ECHO|ECHONL|IEXTEN|ISIG);
SET_BIT(io.c_cflag, CS8);
if (tcsetattr(0, TCSANOW, &io))
{
perror("tcsetattr");
exit(errno);
}
if (tcgetattr(0, >d->new_terminal))
{
perror("tcgetattr");
exit(errno);
}
}
void restore_terminal(void)
{
tcsetattr(0, TCSANOW, >d->old_terminal);
}
void refresh_terminal(void)
{
tcsetattr(0, TCSANOW, >d->new_terminal);
}
void echo_off(struct session *ses)
{
struct termios io;
tcgetattr(STDIN_FILENO, &io);
DEL_BIT(io.c_lflag, ECHO|ECHONL);
tcsetattr(STDIN_FILENO, TCSADRAIN, &io);
}
void echo_on(struct session *ses)
{
struct termios io;
tcgetattr(STDIN_FILENO, &io);
SET_BIT(io.c_lflag, ECHO|ECHONL);
tcsetattr(STDIN_FILENO, TCSADRAIN, &io);
}
void init_screen_size(struct session *ses)
{
int top, bot;
struct winsize screen;
top = ses->top_row == 0 ? 1 : ses->top_row;
bot = ses->bot_row == 0 ? 0 : ses->rows - ses->bot_row;
if (ses == gts)
{
if (ioctl(0, TIOCGWINSZ, &screen) == -1)
{
ses->rows = SCREEN_HEIGHT;
ses->cols = SCREEN_WIDTH;
}
else
{
ses->rows = screen.ws_row;
ses->cols = screen.ws_col;
}
SET_BIT(gtd->flags, TINTIN_FLAG_RESETBUFFER);
}
else
{
ses->rows = gts->rows;
ses->cols = gts->cols;
}
ses->top_row = top;
ses->bot_row = ses->rows - bot;
if (HAS_BIT(ses->flags, SES_FLAG_SPLIT))
{
init_split(ses, ses->top_row, ses->bot_row);
}
check_all_events(ses, 0, 2, "SCREEN RESIZE", ntos(ses->cols), ntos(ses->rows));
}
int get_scroll_size(struct session *ses)
{
return (ses->bot_row - ses->top_row);
}