|
|
3.12a Javascript
/* $Id: curs_cio.c,v 1.1.1.1 2018/04/24 16:39:44 root Exp $ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU Lesser General Public License for more details: lgpl.txt or *
* http://www.fsf.org/copyleft/lesser.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to [email protected] *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include <sys/time.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "gen_defs.h" /* xpdev, for BOOL/TRUE/FALSE */
#include "ciolib.h"
#include "curs_cio.h"
#include "keys.h"
#include "mouse.h"
#include "vidmodes.h"
static unsigned char curs_nextgetch=0;
const int curs_tabs[10]={9,17,25,33,41,49,57,65,73,80};
static int lastattr=0;
static long mode;
short curses_color(short color)
{
switch(color)
{
case 0 :
return(COLOR_BLACK);
case 1 :
return(COLOR_BLUE);
case 2 :
return(COLOR_GREEN);
case 3 :
return(COLOR_CYAN);
case 4 :
return(COLOR_RED);
case 5 :
return(COLOR_MAGENTA);
case 6 :
return(COLOR_YELLOW);
case 7 :
return(COLOR_WHITE);
case 8 :
return(COLOR_BLACK);
case 9 :
return(COLOR_BLUE);
case 10 :
return(COLOR_GREEN);
case 11 :
return(COLOR_CYAN);
case 12 :
return(COLOR_RED);
case 13 :
return(COLOR_MAGENTA);
case 14 :
return(COLOR_YELLOW);
case 15 :
return(COLOR_WHITE);
}
return(0);
}
int curs_puttext(int sx, int sy, int ex, int ey, void *fillbuf)
{
int x,y;
int fillpos=0;
unsigned char attr;
unsigned char fill_char;
unsigned char orig_attr;
int oldx, oldy;
struct text_info ti;
unsigned char *fill;
fill=fillbuf;
gettextinfo(&ti);
if( sx < 1
|| sy < 1
|| ex < 1
|| ey < 1
|| sx > ti.screenwidth
|| sy > ti.screenheight
|| sx > ex
|| sy > ey
|| ex > ti.screenwidth
|| ey > ti.screenheight
|| fill==NULL)
return(0);
getyx(stdscr,oldy,oldx);
orig_attr=lastattr;
for(y=sy-1;y<=ey-1;y++)
{
for(x=sx-1;x<=ex-1;x++)
{
fill_char=fill[fillpos++];
attr=fill[fillpos++];
textattr(attr);
move(y, x);
_putch(fill_char,FALSE);
}
}
textattr(orig_attr);
move(oldy, oldx);
refresh();
return(1);
}
int curs_gettext(int sx, int sy, int ex, int ey, void *fillbuf)
{
int x,y;
int fillpos=0;
chtype attr;
unsigned char attrib;
unsigned char colour;
int oldx, oldy;
unsigned char thischar;
int ext_char;
struct text_info ti;
unsigned char *fill;
fill=fillbuf;
gettextinfo(&ti);
if( sx < 1
|| sy < 1
|| ex < 1
|| ey < 1
|| sx > ti.screenwidth
|| sy > ti.screenheight
|| sx > ex
|| sy > ey
|| ex > ti.screenwidth
|| ey > ti.screenheight
|| fill==NULL)
return(0);
getyx(stdscr,oldy,oldx);
for(y=sy-1;y<=ey-1;y++)
{
for(x=sx-1;x<=ex-1;x++)
{
attr=mvinch(y, x);
if(attr&A_REVERSE) {
thischar=attr&255-'A'+1;
}
else if(attr&A_ALTCHARSET) {
if(!(mode==CIOLIB_MODE_CURSES_IBM)){
ext_char=A_ALTCHARSET|(attr&255);
/* likely ones */
if (ext_char == ACS_CKBOARD)
{
thischar=176;
}
else if (ext_char == ACS_BOARD)
{
thischar=177;
}
else if (ext_char == ACS_BSSB)
{
thischar=218;
}
else if (ext_char == ACS_SSBB)
{
thischar=192;
}
else if (ext_char == ACS_BBSS)
{
thischar=191;
}
else if (ext_char == ACS_SBBS)
{
thischar=217;
}
else if (ext_char == ACS_SBSS)
{
thischar=180;
}
else if (ext_char == ACS_SSSB)
{
thischar=195;
}
else if (ext_char == ACS_SSBS)
{
thischar=193;
}
else if (ext_char == ACS_BSSS)
{
thischar=194;
}
else if (ext_char == ACS_BSBS)
{
thischar=196;
}
else if (ext_char == ACS_SBSB)
{
thischar=179;
}
else if (ext_char == ACS_SSSS)
{
thischar=197;
}
else if (ext_char == ACS_BLOCK)
{
thischar=219;
}
else if (ext_char == ACS_UARROW)
{
thischar=30;
}
else if (ext_char == ACS_DARROW)
{
thischar=31;
}
/* unlikely (Not in ncurses) */
else if (ext_char == ACS_SBSD)
{
thischar=181;
}
else if (ext_char == ACS_DBDS)
{
thischar=182;
}
else if (ext_char == ACS_BBDS)
{
thischar=183;
}
else if (ext_char == ACS_BBSD)
{
thischar=184;
}
else if (ext_char == ACS_DBDD)
{
thischar=185;
}
else if (ext_char == ACS_DBDB)
{
thischar=186;
}
else if (ext_char == ACS_BBDD)
{
thischar=187;
}
else if (ext_char == ACS_DBBD)
{
thischar=188;
}
else if (ext_char == ACS_DBBS)
{
thischar=189;
}
else if (ext_char == ACS_SBBD)
{
thischar=190;
}
else if (ext_char == ACS_SDSB)
{
thischar=198;
}
else if (ext_char == ACS_DSDB)
{
thischar=199;
}
else if (ext_char == ACS_DDBB)
{
thischar=200;
}
else if (ext_char == ACS_BDDB)
{
thischar=201;
}
else if (ext_char == ACS_DDBD)
{
thischar=202;
}
else if (ext_char == ACS_BDDD)
{
thischar=203;
}
else if (ext_char == ACS_DDDB)
{
thischar=204;
}
else if (ext_char == ACS_BDBD)
{
thischar=205;
}
else if (ext_char == ACS_DDDD)
{
thischar=206;
}
else if (ext_char == ACS_SDBD)
{
thischar=207;
}
else if (ext_char == ACS_DSBS)
{
thischar=208;
}
else if (ext_char == ACS_BDSD)
{
thischar=209;
}
else if (ext_char == ACS_BSDS)
{
thischar=210;
}
else if (ext_char == ACS_DSBB)
{
thischar=211;
}
else if (ext_char == ACS_SDBB)
{
thischar=212;
}
else if (ext_char == ACS_BDSB)
{
thischar=213;
}
else if (ext_char == ACS_BSDB)
{
thischar=214;
}
else if (ext_char == ACS_DSDS)
{
thischar=215;
}
else if (ext_char == ACS_SDSD)
{
thischar=216;
}
else
{
thischar=attr&255;
}
}
else {
if (ext_char == ACS_UARROW)
{
thischar=30;
}
else if (ext_char == ACS_DARROW)
{
thischar=31;
}
else
{
thischar=attr&255;
}
}
}
else
thischar=attr;
fill[fillpos++]=(unsigned char)(thischar);
attrib=0;
if (attr & A_BOLD)
{
attrib |= 8;
}
if (attr & A_BLINK)
{
attrib |= 128;
}
colour=PAIR_NUMBER(attr&A_COLOR)-1;
colour=((colour&56)<<1)|(colour&7);
fill[fillpos++]=colour|attrib;
}
}
move(oldy, oldx);
return(1);
}
void curs_textattr(int attr)
{
chtype attrs=A_NORMAL;
int colour;
if (lastattr==attr)
return;
lastattr=attr;
if (attr & 8) {
attrs |= A_BOLD;
}
if (attr & 128)
{
attrs |= A_BLINK;
}
colour = COLOR_PAIR( ((attr&7)|((attr>>1)&56))+1 );
#ifdef NCURSES_VERSION_MAJOR
attrset(attrs);
color_set(colour,NULL);
#else
attrset(attrs|colour);
#endif
/* bkgdset(colour); */
bkgdset(colour);
}
int curs_kbhit(void)
{
struct timeval timeout;
fd_set rfds;
if(curs_nextgetch)
return(1);
if(mouse_pending())
return(1);
timeout.tv_sec=0;
timeout.tv_usec=0;
FD_ZERO(&rfds);
FD_SET(fileno(stdin),&rfds);
return(select(fileno(stdin)+1,&rfds,NULL,NULL,&timeout));
}
void curs_delay(long msec)
{
usleep(msec*1000);
}
int curs_wherey(void)
{
int x,y;
getyx(stdscr,y,x);
return(y+1);
}
int curs_wherex(void)
{
int x,y;
getyx(stdscr,y,x);
return(x+1);
}
int _putch(unsigned char ch, BOOL refresh_now)
{
int ret;
chtype cha;
if(!(mode==CIOLIB_MODE_CURSES_IBM))
{
switch(ch)
{
case 30:
cha=ACS_UARROW;
break;
case 31:
cha=ACS_DARROW;
break;
case 176:
cha=ACS_CKBOARD;
break;
case 177:
cha=ACS_BOARD;
break;
case 178:
cha=ACS_BOARD;
break;
case 179:
cha=ACS_SBSB;
break;
case 180:
cha=ACS_SBSS;
break;
case 181:
cha=ACS_SBSD;
break;
case 182:
cha=ACS_DBDS;
break;
case 183:
cha=ACS_BBDS;
break;
case 184:
cha=ACS_BBSD;
break;
case 185:
cha=ACS_DBDD;
break;
case 186:
cha=ACS_DBDB;
break;
case 187:
cha=ACS_BBDD;
break;
case 188:
cha=ACS_DBBD;
break;
case 189:
cha=ACS_DBBS;
break;
case 190:
cha=ACS_SBBD;
break;
case 191:
cha=ACS_BBSS;
break;
case 192:
cha=ACS_SSBB;
break;
case 193:
cha=ACS_SSBS;
break;
case 194:
cha=ACS_BSSS;
break;
case 195:
cha=ACS_SSSB;
break;
case 196:
cha=ACS_BSBS;
break;
case 197:
cha=ACS_SSSS;
break;
case 198:
cha=ACS_SDSB;
break;
case 199:
cha=ACS_DSDB;
break;
case 200:
cha=ACS_DDBB;
break;
case 201:
cha=ACS_BDDB;
break;
case 202:
cha=ACS_DDBD;
break;
case 203:
cha=ACS_BDDD;
break;
case 204:
cha=ACS_DDDB;
break;
case 205:
cha=ACS_BDBD;
break;
case 206:
cha=ACS_DDDD;
break;
case 207:
cha=ACS_SDBD;
break;
case 208:
cha=ACS_DSBS;
break;
case 209:
cha=ACS_BDSD;
break;
case 210:
cha=ACS_BSDS;
break;
case 211:
cha=ACS_DSBB;
break;
case 212:
cha=ACS_SDBB;
break;
case 213:
cha=ACS_BDSB;
break;
case 214:
cha=ACS_BSDB;
break;
case 215:
cha=ACS_DSDS;
break;
case 216:
cha=ACS_SDSD;
break;
case 217:
cha=ACS_SBBS;
break;
case 218:
cha=ACS_BSSB;
break;
case 219:
cha=ACS_BLOCK;
break;
default:
cha=ch;
}
}
else
cha=ch;
if(!cha)
cha=' ';
if(cha == ' ')
ret=addch(A_BOLD|' ');
else if (cha<' ') {
attron(A_REVERSE);
ret=addch(cha+'A'-1);
attroff(A_REVERSE);
}
else
ret=addch(cha);
if(refresh_now)
refresh();
return(ret);
}
void curs_gotoxy(int x, int y)
{
move(y-1,x-1);
refresh();
}
void call_endwin(void)
{
endwin();
}
int curs_initciolib(long inmode)
{
short fg, bg, pair=0;
#ifdef XCURSES
char *argv[2]={"ciolib",NULL};
Xinitscr(1,argv);
#else
char *term;
SCREEN *tst;
term=getenv("TERM");
if(term==NULL)
return(0);
tst=newterm(term,stdout,stdin);
if(tst==NULL)
return(0);
endwin();
initscr();
#endif
start_color();
cbreak();
noecho();
nonl();
keypad(stdscr, TRUE);
scrollok(stdscr,FALSE);
raw();
halfdelay(1);
atexit(call_endwin);
/* Set up color pairs */
for(bg=0;bg<8;bg++) {
for(fg=0;fg<8;fg++) {
init_pair(++pair,curses_color(fg),curses_color(bg));
}
}
mode = inmode;
#ifdef NCURSES_VERSION_MAJOR
if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION) {
mouseinterval(0);
cio_api.mouse=1;
}
else
mousemask(0,NULL);
#endif
return(1);
}
void curs_gettextinfo(struct text_info *info)
{
getmaxyx(stdscr, info->screenheight, info->screenwidth);
if(has_colors())
info->currmode=COLOR_MODE;
else
info->currmode=MONO;
info->curx=wherex();
info->cury=wherey();
info->attribute=lastattr;
}
void curs_setcursortype(int type) {
switch(type) {
case _NOCURSOR:
curs_set(0);
break;
case _SOLIDCURSOR:
curs_set(2);
break;
default: /* Normal cursor */
curs_set(1);
break;
}
refresh();
}
int curs_putch(int c)
{
struct text_info ti;
int ret;
int i;
ret=c;
switch(c) {
case '\r':
gotoxy(1,wherey());
break;
case '\n':
gettextinfo(&ti);
if(wherey()==ti.winbottom-ti.wintop+1) {
wscroll();
}
else {
gotoxy(wherex(),wherey()+1);
}
break;
case 0x07:
beep();
break;
case 0x08:
gotoxy(wherex()-1,wherey());
_putch(' ',FALSE);
gotoxy(wherex()-1,wherey());
break;
case '\t':
for(i=0;i<10;i++) {
if(curs_tabs[i]>wherex()) {
while(wherex()<curs_tabs[i]) {
putch(' ');
}
break;
}
}
if(i==10) {
putch('\r');
putch('\n');
}
break;
default:
gettextinfo(&ti);
if(wherey()==ti.winbottom-ti.wintop+1
&& wherex()==ti.winright-ti.winleft+1) {
if(_putch(c,TRUE)==ERR)
ret=EOF;
else {
wscroll();
gotoxy(ti.winleft,ti.cury);
}
}
else {
if(wherex()==ti.winright-ti.winleft+1) {
if(_putch(c,TRUE)==ERR)
ret=EOF;
else
gotoxy(ti.winleft,ti.cury+1);
}
else {
if(_putch(c,TRUE)==ERR)
ret=EOF;
else
gotoxy(ti.curx+1,ti.cury);
}
}
break;
}
}
int curs_getch(void)
{
int ch;
MEVENT mevnt;
if(curs_nextgetch) {
ch=curs_nextgetch;
curs_nextgetch=0;
}
else {
while((ch=getch())==ERR && !mouse_pending());
if(mouse_pending()) {
curs_nextgetch=CIO_KEY_MOUSE>>8;
ch=CIO_KEY_MOUSE & 0xff;
}
else {
if(ch > 255) {
switch(ch) {
case KEY_DOWN: /* Down-arrow */
curs_nextgetch=0x50;
ch=0;
break;
case KEY_UP: /* Up-arrow */
curs_nextgetch=0x48;
ch=0;
break;
case KEY_LEFT: /* Left-arrow */
curs_nextgetch=0x4b;
ch=0;
break;
case KEY_RIGHT: /* Right-arrow */
curs_nextgetch=0x4d;
ch=0;
break;
case KEY_HOME: /* Home key (upward+left arrow) */
curs_nextgetch=0x47;
ch=0;
break;
case KEY_BACKSPACE: /* Backspace (unreliable) */
ch=8;
break;
case KEY_F(1): /* Function Key */
curs_nextgetch=0x3b;
ch=0;
break;
case KEY_F(2): /* Function Key */
curs_nextgetch=0x3c;
ch=0;
break;
case KEY_F(3): /* Function Key */
curs_nextgetch=0x3d;
ch=0;
break;
case KEY_F(4): /* Function Key */
curs_nextgetch=0x3e;
ch=0;
break;
case KEY_F(5): /* Function Key */
curs_nextgetch=0x3f;
ch=0;
break;
case KEY_F(6): /* Function Key */
curs_nextgetch=0x40;
ch=0;
break;
case KEY_F(7): /* Function Key */
curs_nextgetch=0x41;
ch=0;
break;
case KEY_F(8): /* Function Key */
curs_nextgetch=0x42;
ch=0;
break;
case KEY_F(9): /* Function Key */
curs_nextgetch=0x43;
ch=0;
break;
case KEY_F(10): /* Function Key */
curs_nextgetch=0x44;
ch=0;
break;
case KEY_F(11): /* Function Key */
curs_nextgetch=0x57;
ch=0;
break;
case KEY_F(12): /* Function Key */
curs_nextgetch=0x58;
ch=0;
break;
case KEY_DC: /* Delete character */
curs_nextgetch=0x53;
ch=0;
break;
case KEY_IC: /* Insert char or enter insert mode */
curs_nextgetch=0x52;
ch=0;
break;
case KEY_EIC: /* Exit insert char mode */
curs_nextgetch=0x52;
ch=0;
break;
case KEY_NPAGE: /* Next page */
curs_nextgetch=0x51;
ch=0;
break;
case KEY_PPAGE: /* Previous page */
curs_nextgetch=0x49;
ch=0;
break;
case KEY_ENTER: /* Enter or send (unreliable) */
curs_nextgetch=0x0d;
ch=0;
break;
case KEY_A1: /* Upper left of keypad */
curs_nextgetch=0x47;
ch=0;
break;
case KEY_A3: /* Upper right of keypad */
curs_nextgetch=0x49;
ch=0;
break;
case KEY_B2: /* Center of keypad */
curs_nextgetch=0x4c;
ch=0;
break;
case KEY_C1: /* Lower left of keypad */
curs_nextgetch=0x4f;
ch=0;
break;
case KEY_C3: /* Lower right of keypad */
curs_nextgetch=0x51;
ch=0;
break;
case KEY_BEG: /* Beg (beginning) */
curs_nextgetch=0x47;
ch=0;
break;
case KEY_CANCEL: /* Cancel */
curs_nextgetch=0x03;
ch=0;
break;
case KEY_END: /* End */
curs_nextgetch=0x4f;
ch=0;
break;
case KEY_SELECT: /* Select - Is "End" in X */
curs_nextgetch=0x4f;
ch=0;
break;
case KEY_MOUSE: /* Mouse stuff */
if(getmouse(&mevnt)==OK) {
int evnt=0;
switch(mevnt.bstate) {
case BUTTON1_PRESSED:
evnt=CIOLIB_BUTTON_1_PRESS;
break;
case BUTTON1_RELEASED:
evnt=CIOLIB_BUTTON_1_RELEASE;
break;
case BUTTON2_PRESSED:
evnt=CIOLIB_BUTTON_2_PRESS;
break;
case BUTTON2_RELEASED:
evnt=CIOLIB_BUTTON_2_RELEASE;
break;
case BUTTON3_PRESSED:
evnt=CIOLIB_BUTTON_3_PRESS;
break;
case BUTTON3_RELEASED:
evnt=CIOLIB_BUTTON_3_RELEASE;
break;
case REPORT_MOUSE_POSITION:
evnt=CIOLIB_MOUSE_MOVE;
break;
}
ciomouse_gotevent(evnt, mevnt.x+1, mevnt.y+1);
}
break;
default:
curs_nextgetch=0xff;
ch=0;
break;
}
}
}
}
return(ch);
}
int curs_getche(void)
{
int ch;
if(curs_nextgetch)
return(curs_getch());
ch=curs_getch();
if(ch)
putch(ch);
return(ch);
}
void curs_textmode(int mode)
{
return;
}
int curs_hidemouse(void)
{
/*
#ifdef NCURSES_VERSION_MAJOR
mousemask(0,NULL);
return(0);
#else
return(-1);
#endif
*/
}
int curs_showmouse(void)
{
/*
#ifdef NCURSES_VERSION_MAJOR
if(mousemask(BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION,NULL)==BUTTON1_PRESSED|BUTTON1_RELEASED|BUTTON2_PRESSED|BUTTON2_RELEASED|BUTTON3_PRESSED|BUTTON3_RELEASED|REPORT_MOUSE_POSITION)
return(0);
#endif
return(-1);
*/
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.