| version 1.1, 2005/11/25 22:41:24 |
version 1.2, 2005/11/27 20:14:50 |
|
|
| // Copyright (c) 2005 Michal Sudolsky |
/* |
| // modified by Juraj Kolesár <koli@koli.sk> |
Name: lc_term.c |
| #include "cuchar.h" |
Author: Michal Sudolsky |
| |
Date: 22.09.2005 15:45 |
| |
*/ |
| |
// modified by Juraj Kolesar <koli@koli.sk> |
| |
|
| |
#include "cc.h" |
| |
|
| bool hascolors; |
bool hascolors; |
| long screenx, |
long screenx, |
| screeny; |
screeny; |
| bool uglycharset=false;
|
bool uglycharset=false; |
| char *mapsymbol="lmkjtwuvqxna,+-.",
|
char *mapsymbol="lmkjtwuvqxna,+-.", |
| *ugmsymbol="++++++++-|+ <>AV";
|
*ugmsymbol="++++++++-|+ <>AV"; |
| short keymap[]={ |
short keymap[]={ |
| KEY_LEFT,4,END_SEQ,KK_LEFT, |
KEY_LEFT,4,END_SEQ,KK_LEFT, |
| KEY_SLEFT,4,END_SEQ,KK_LEFT|MD_SHIFT, |
KEY_SLEFT,4,END_SEQ,KK_LEFT|MD_SHIFT, |
| Line 323 short keymap[]={ |
|
| Line 328 short keymap[]={ |
|
| 100,LAST_KEY,END_SEQ,KK_LEFT|MD_SHIFT |
100,LAST_KEY,END_SEQ,KK_LEFT|MD_SHIFT |
| }; |
}; |
| |
|
| void fillback(WIN *win,attr_t ch)
|
void fillback(WIN *win,attr_t ch) |
| {
|
{ |
| long i;
|
long i; |
| for(i=0;i<win->vx*win->vy;i++)win->windata[i]=ch;
|
for(i=0;i<win->vx*win->vy;i++)win->windata[i]=ch; |
| }
|
} |
|
|
|
| void addsymbol(WIN *win,long x,long y,unsigned char sym)
|
void addsymbol(WIN *win,long x,long y,unsigned char sym) |
| {
|
{ |
| if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy)) |
if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy)) |
| win->windata[x+y*win->vx]=win->attr+(!uglycharset?A_ALTCHARSET:A_NORMAL)+sym;
|
win->windata[x+y*win->vx]=win->attr+(!uglycharset?A_ALTCHARSET:A_NORMAL)+sym; |
| }
|
} |
|
|
|
| void addchar(WIN *win,long y,long x,unsigned char c)
|
void addchar(WIN *win,long y,long x,unsigned char c) |
| {
|
{ |
| if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))win->windata[x+y*win->vx]=win->attr+c;
|
if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))win->windata[x+y*win->vx]=win->attr+c; |
| }
|
} |
|
|
|
| attr_t minch(WIN *win,long y,long x)
|
attr_t minch(WIN *win,long y,long x) |
| {
|
{ |
| if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))return win->windata[x+y*win->vx];
|
if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))return win->windata[x+y*win->vx]; |
| else return -1;
|
else return -1; |
| }
|
} |
|
|
|
| void maddch(WIN *win,long y,long x,attr_t ch)
|
void maddch(WIN *win,long y,long x,attr_t ch) |
| {
|
{ |
| if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))win->windata[x+y*win->vx]=ch;
|
if((x>=0)&&(x<win->vx)&&(y>=0)&&(y<win->vy))win->windata[x+y*win->vx]=ch; |
| }
|
} |
|
|
|
| void mhline(WIN *win,long x,long y,long n)
|
void mhline(WIN *win,long x,long y,long n) |
| {
|
{ |
| long i;
|
long i; |
| for(i=x;i<x+n;i++)addsymbol(win,i,y,mapsymbol[HLINE]);
|
for(i=x;i<x+n;i++)addsymbol(win,i,y,mapsymbol[HLINE]); |
| }
|
} |
|
|
|
| void mvline(WIN *win,long x,long y,long n)
|
void mvline(WIN *win,long x,long y,long n) |
| {
|
{ |
| long i;
|
long i; |
| for(i=y;i<y+n;i++)addsymbol(win,x,i,mapsymbol[VLINE]);
|
for(i=y;i<y+n;i++)addsymbol(win,x,i,mapsymbol[VLINE]); |
| }
|
} |
|
|
|
| void mbox(WIN *win,long x,long y,long vx,long vy)
|
void mbox(WIN *win,long x,long y,long vx,long vy) |
| {
|
{ |
| long i;
|
long i; |
| addsymbol(win,x,y,mapsymbol[LUCORN]);
|
addsymbol(win,x,y,mapsymbol[LUCORN]); |
| addsymbol(win,x+vx-1,y,mapsymbol[RUCORN]);
|
addsymbol(win,x+vx-1,y,mapsymbol[RUCORN]); |
| addsymbol(win,x+vx-1,y+vy-1,mapsymbol[RDCORN]);
|
addsymbol(win,x+vx-1,y+vy-1,mapsymbol[RDCORN]); |
| addsymbol(win,x,y+vy-1,mapsymbol[LDCORN]);
|
addsymbol(win,x,y+vy-1,mapsymbol[LDCORN]); |
| mhline(win,x+1,y,vx-2);
|
mhline(win,x+1,y,vx-2); |
| mvline(win,x+vx-1,y+1,vy-2);
|
mvline(win,x+vx-1,y+1,vy-2); |
| mhline(win,x+1,y+vy-1,vx-2);
|
mhline(win,x+1,y+vy-1,vx-2); |
| mvline(win,x,y+1,vy-2);
|
mvline(win,x,y+1,vy-2); |
| }
|
} |
|
|
|
| void mprintwmenu(WIN *win,long y,long x,long cb,long cf,long cfu,attr_t attr,const char *fmt,...)
|
void mprintwmenu(WIN *win,long y,long x,long cb,long cf,long cfu,attr_t attr,const char *fmt,...) |
| {
|
{ |
| va_list args;
|
va_list args; |
| unsigned char *buffer;
|
unsigned char *buffer; |
| long size;
|
long size; |
| va_start(args,fmt);
|
va_start(args,fmt); |
| size=vsnprintf(buffer,0,fmt,args)+1;
|
size=vsnprintf(buffer,0,fmt,args)+1; |
| if(size<0)return;
|
if(size<0)return; |
| buffer=malloc(size);
|
buffer=malloc(size); |
| if(buffer==NULL)return;
|
if(buffer==NULL)return; |
| vsnprintf(buffer,size,fmt,args);
|
vsnprintf(buffer,size,fmt,args); |
| va_end(args);
|
va_end(args); |
| long i,p,l=strlen(buffer);
|
long i,p,l=strlen(buffer); |
| bool ch=true; |
bool ch=true; |
| windowinitdraw(win,cf,cb,false); |
windowinitdraw(win,cf,cb,false); |
| win->attr|=attr; |
win->attr|=attr; |
| Line 411 void mprintwmenu(WIN *win,long y,long x, |
|
| Line 416 void mprintwmenu(WIN *win,long y,long x, |
|
| win->attr&=~A_UNDERLINE; |
win->attr&=~A_UNDERLINE; |
| } |
} |
| addchar(win,y,x+i,buffer[p]); |
addchar(win,y,x+i,buffer[p]); |
| }
|
} |
| win->attr=oldattr; |
win->attr=oldattr; |
| free(buffer);
|
free(buffer); |
| }
|
} |
| |
|
| |
void mprintw(WIN *win,long y,long x,const char *fmt,...) |
| |
{ |
| |
va_list args; |
| |
unsigned char *buffer; |
| |
long size; |
| |
va_start(args,fmt); |
| |
size=vsnprintf(buffer,0,fmt,args)+1; |
| |
if(size<0)return; |
| |
buffer=malloc(size); |
| |
if(buffer==NULL)return; |
| |
vsnprintf(buffer,size,fmt,args); |
| |
va_end(args); |
| |
long i,l=strlen(buffer); |
| |
for(i=0;i<l;i++)addchar(win,y,x+i,buffer[i]); |
| |
free(buffer); |
| |
} |
| |
|
| void mprintw(WIN *win,long y,long x,const char *fmt,...)
|
void windowinitdraw(WIN *win,char cf,char cb,char back) |
| {
|
{ |
| va_list args;
|
long attr; |
| unsigned char *buffer;
|
short pair=cb&0x7; |
| long size;
|
pair<<=3; |
| va_start(args,fmt);
|
|
| size=vsnprintf(buffer,0,fmt,args)+1;
|
|
| if(size<0)return;
|
|
| buffer=malloc(size);
|
|
| if(buffer==NULL)return;
|
|
| vsnprintf(buffer,size,fmt,args);
|
|
| va_end(args);
|
|
| long i,l=strlen(buffer);
|
|
| for(i=0;i<l;i++)addchar(win,y,x+i,buffer[i]);
|
|
| free(buffer);
|
|
| }
|
|
| |
|
| void windowinitdraw(WIN *win,char cf,char cb,char back)
|
|
| {
|
|
| long attr;
|
|
| short pair=cb&0x7;
|
|
| pair<<=3;
|
|
| pair+=cf&0x7; |
pair+=cf&0x7; |
| if(pair==7)pair=0;else if(pair==0)pair=7;
|
if(pair==7)pair=0;else if(pair==0)pair=7; |
| init_pair(pair,cf&0x7,cb&0x7);
|
init_pair(pair,cf&0x7,cb&0x7); |
| if((cf&0x8)==0x8)attr=A_BOLD;else attr=A_NORMAL;
|
if((cf&0x8)==0x8)attr=A_BOLD;else attr=A_NORMAL; |
| if(back==2)attr|=A_UNDERLINE;
|
if(back==2)attr|=A_UNDERLINE; |
| if(back==3)attr|=A_REVERSE;
|
if(back==3)attr|=A_REVERSE; |
| if((back==4)&&(!uglycharset))attr|=A_ALTCHARSET+'a';
|
if((back==4)&&(!uglycharset))attr|=A_ALTCHARSET+'a'; |
| win->attr=COLOR_PAIR(pair)+attr;
|
win->attr=COLOR_PAIR(pair)+attr; |
| if(back)fillback(win,COLOR_PAIR(pair)+attr+(!(attr&A_CHARTEXT)?' ':0));
|
if(back)fillback(win,COLOR_PAIR(pair)+attr+(!(attr&A_CHARTEXT)?' ':0)); |
| }
|
} |
|
|
|
| void mrefresh(WIN *win)
|
void mrefresh(WIN *win) |
| {
|
{ |
| long i,j,c,s,k;
|
long i,j,c,s,k; |
| if(win!=&mainwin)
|
if(win!=&mainwin) |
| {
|
{ |
| long x,y,vx,vy,ox,oy;
|
long x,y,vx,vy,ox,oy; |
| x=0;
|
x=0; |
| y=0;
|
y=0; |
| client_to_screen(win,&x,&y);
|
client_to_screen(win,&x,&y); |
| vx=win->vx;
|
vx=win->vx; |
| vy=win->vy;
|
vy=win->vy; |
| if(x<0){vx+=x;ox=-x;x=0;}else ox=0;
|
if(x<0){vx+=x;ox=-x;x=0;}else ox=0; |
| if(y<0){vy+=y;oy=-y;y=0;}else oy=0;
|
if(y<0){vy+=y;oy=-y;y=0;}else oy=0; |
| if(vx>mainwin.vx-x)vx=mainwin.vx-x;
|
if(vx>mainwin.vx-x)vx=mainwin.vx-x; |
| if(vy>mainwin.vy-y)vy=mainwin.vy-y;
|
if(vy>mainwin.vy-y)vy=mainwin.vy-y; |
| for(j=y;j<y+vy;j++)
|
for(j=y;j<y+vy;j++) |
| {
|
{ |
| s=x+j*mainwin.vx;
|
s=x+j*mainwin.vx; |
| c=s+vx;
|
c=s+vx; |
| k=ox+(j-y+oy)*win->vx;
|
k=ox+(j-y+oy)*win->vx; |
| for(i=s;i<c;i++,k++)mainwin.windata[i]=win->windata[k];
|
for(i=s;i<c;i++,k++)mainwin.windata[i]=win->windata[k]; |
| }
|
} |
| }
|
} |
| else
|
else |
| {
|
{ |
| wredrawln(stdscr,0,mainwin.vy);
|
wredrawln(stdscr,0,mainwin.vy); |
| for(j=0;j<mainwin.vy;j++)
|
for(j=0;j<mainwin.vy;j++) |
| mvaddchnstr(j,0,mainwin.windata+j*mainwin.vx,mainwin.vx*mainwin.vy);
|
mvaddchnstr(j,0,mainwin.windata+j*mainwin.vx,mainwin.vx*mainwin.vy); |
| }
|
} |
| }
|
} |
| |
|
| long getcharfrom(long x,long y)
|
long getcharfrom(long x,long y) |
| {
|
{ |
| long px,py,ox,oy;
|
long px,py,ox,oy; |
| WIN *win;
|
WIN *win; |
| WINDOW *window;
|
WINDOW *window; |
| win=findwinonlypaint(x,y);
|
win=findwinonlypaint(x,y); |
| if(win==NULL)return -1;
|
if(win==NULL)return -1; |
| px=0;
|
px=0; |
| py=0;
|
py=0; |
| client_to_screen(win,&px,&py);
|
client_to_screen(win,&px,&py); |
| if(px<0)ox=px;else ox=0;
|
if(px<0)ox=px;else ox=0; |
| if(py<0)oy=py;else oy=0;
|
if(py<0)oy=py;else oy=0; |
| px=x;
|
px=x; |
| py=y;
|
py=y; |
| screen_to_client(win,&px,&py);
|
screen_to_client(win,&px,&py); |
| return minch(win,py+oy,px+ox);
|
return minch(win,py+oy,px+ox); |
| }
|
} |
|
|
|
| void checksymbol(WIN *win,long x,long y)
|
void checksymbol(WIN *win,long x,long y) |
| {
|
{ |
| long c;
|
long c; |
| char ch,cl,cd,cu,cr;
|
char ch,cl,cd,cu,cr; |
| c=getcharfrom(x,y);
|
c=getcharfrom(x,y); |
| if(c==-1)return;
|
if(c==-1)return; |
| ch=c&A_CHARTEXT;
|
ch=c&A_CHARTEXT; |
| c=c&A_ATTRIBUTES;
|
c=c&A_ATTRIBUTES; |
| cl=getcharfrom(x-1,y)&A_CHARTEXT;
|
cl=getcharfrom(x-1,y)&A_CHARTEXT; |
| cr=getcharfrom(x+1,y)&A_CHARTEXT;
|
cr=getcharfrom(x+1,y)&A_CHARTEXT; |
| cu=getcharfrom(x,y-1)&A_CHARTEXT;
|
cu=getcharfrom(x,y-1)&A_CHARTEXT; |
| cd=getcharfrom(x,y+1)&A_CHARTEXT;
|
cd=getcharfrom(x,y+1)&A_CHARTEXT; |
| if((cl==mapsymbol[HLINE])||(cl==mapsymbol[LUCORN])||(cl==mapsymbol[LDCORN])||
|
if((cl==mapsymbol[HLINE])||(cl==mapsymbol[LUCORN])||(cl==mapsymbol[LDCORN])|| |
| (cl==mapsymbol[LTEE])||(cl==mapsymbol[UTEE])||(cl==mapsymbol[DTEE])||(cl==mapsymbol[CROSS]))cl=true;else cl=false;
|
(cl==mapsymbol[LTEE])||(cl==mapsymbol[UTEE])||(cl==mapsymbol[DTEE])||(cl==mapsymbol[CROSS]))cl=true;else cl=false; |
| if((cr==mapsymbol[HLINE])||(cr==mapsymbol[RDCORN])||(cr==mapsymbol[RUCORN])||
|
if((cr==mapsymbol[HLINE])||(cr==mapsymbol[RDCORN])||(cr==mapsymbol[RUCORN])|| |
| (cr==mapsymbol[RTEE])||(cr==mapsymbol[UTEE])||(cr==mapsymbol[DTEE])||(cr==mapsymbol[CROSS]))cr=true;else cr=false;
|
(cr==mapsymbol[RTEE])||(cr==mapsymbol[UTEE])||(cr==mapsymbol[DTEE])||(cr==mapsymbol[CROSS]))cr=true;else cr=false; |
| if((cu==mapsymbol[VLINE])||(cu==mapsymbol[RUCORN])||(cu==mapsymbol[LUCORN])||
|
if((cu==mapsymbol[VLINE])||(cu==mapsymbol[RUCORN])||(cu==mapsymbol[LUCORN])|| |
| (cu==mapsymbol[UTEE])||(cu==mapsymbol[LTEE])||(cu==mapsymbol[RTEE])||(cu==mapsymbol[CROSS]))cu=true;else cu=false;
|
(cu==mapsymbol[UTEE])||(cu==mapsymbol[LTEE])||(cu==mapsymbol[RTEE])||(cu==mapsymbol[CROSS]))cu=true;else cu=false; |
| if((cd==mapsymbol[VLINE])||(cd==mapsymbol[LDCORN])||(cd==mapsymbol[RDCORN])||
|
if((cd==mapsymbol[VLINE])||(cd==mapsymbol[LDCORN])||(cd==mapsymbol[RDCORN])|| |
| (cd==mapsymbol[DTEE])||(cd==mapsymbol[LTEE])||(cd==mapsymbol[RTEE])||(cd==mapsymbol[CROSS]))cd=true;else cd=false;
|
(cd==mapsymbol[DTEE])||(cd==mapsymbol[LTEE])||(cd==mapsymbol[RTEE])||(cd==mapsymbol[CROSS]))cd=true;else cd=false; |
| if((cl||cr)&&!cu&&!cd)ch=mapsymbol[HLINE];
|
if((cl||cr)&&!cu&&!cd)ch=mapsymbol[HLINE]; |
| else if((!cl)&&(!cr)&&(cu||cd))ch=mapsymbol[VLINE];
|
else if((!cl)&&(!cr)&&(cu||cd))ch=mapsymbol[VLINE]; |
| else if(cl&&cr&&cu&&!cd)ch=mapsymbol[DTEE];
|
else if(cl&&cr&&cu&&!cd)ch=mapsymbol[DTEE]; |
| else if(cl&&cr&&!cu&&cd)ch=mapsymbol[UTEE];
|
else if(cl&&cr&&!cu&&cd)ch=mapsymbol[UTEE]; |
| else if(cl&&!cr&&cu&&cd)ch=mapsymbol[RTEE];
|
else if(cl&&!cr&&cu&&cd)ch=mapsymbol[RTEE]; |
| else if(!cl&&cr&&cu&&cd)ch=mapsymbol[LTEE];
|
else if(!cl&&cr&&cu&&cd)ch=mapsymbol[LTEE]; |
| else if(cl&&!cr&&cu&&!cd)ch=mapsymbol[RDCORN];
|
else if(cl&&!cr&&cu&&!cd)ch=mapsymbol[RDCORN]; |
| else if(!cl&&cr&&cu&&!cd)ch=mapsymbol[LDCORN];
|
else if(!cl&&cr&&cu&&!cd)ch=mapsymbol[LDCORN]; |
| else if(cl&&!cr&&!cu&&cd)ch=mapsymbol[RUCORN];
|
else if(cl&&!cr&&!cu&&cd)ch=mapsymbol[RUCORN]; |
| else if(!cl&&cr&&!cu&&cd)ch=mapsymbol[LUCORN];
|
else if(!cl&&cr&&!cu&&cd)ch=mapsymbol[LUCORN]; |
| else if(cl&&cr&&cu&&cd)ch=mapsymbol[CROSS];
|
else if(cl&&cr&&cu&&cd)ch=mapsymbol[CROSS]; |
| screen_to_client(win,&x,&y);
|
screen_to_client(win,&x,&y); |
| maddch(win,y,x,c|ch);
|
maddch(win,y,x,c|ch); |
| }
|
} |
|
|
|
| void checkbars(WIN *win,bool dorefresh)
|
void checkbars(WIN *win,bool dorefresh) |
| {
|
{ |
| if((win->extra->type==TP_PAINT)&&(win->extra->paint.style==PA_BORDER))
|
if((win->extra->type==TP_PAINT)&&(win->extra->paint.style==PA_BORDER)&& |
| {
|
isvisible(win)) |
| long i,x,y;
|
{ |
| x=0;
|
long i,x,y; |
| y=0;
|
x=0; |
| client_to_screen(win,&x,&y);
|
y=0; |
| if((win->vx==1)&&(win->vy>1))
|
client_to_screen(win,&x,&y); |
| {
|
if((win->vx==1)&&(win->vy>1)) |
| for(i=y;i<y+win->vy;i++)checksymbol(win,x,i);
|
{ |
| }
|
for(i=y;i<y+win->vy;i++)checksymbol(win,x,i); |
| else if((win->vx>1)&&(win->vy==1))
|
} |
| {
|
else if((win->vx>1)&&(win->vy==1)) |
| for(i=x;i<x+win->vx;i++)checksymbol(win,i,y);
|
{ |
| }
|
for(i=x;i<x+win->vx;i++)checksymbol(win,i,y); |
| else if((win->vx>1)&&(win->vy>1))
|
} |
| {
|
else if((win->vx>1)&&(win->vy>1)) |
| for(i=x;i<x+win->vx-1;i++)checksymbol(win,i,y);
|
{ |
| for(i=y;i<y+win->vy-1;i++)checksymbol(win,x+win->vx-1,i);
|
for(i=x;i<x+win->vx-1;i++)checksymbol(win,i,y); |
| for(i=x+win->vx-1;i>x;i--)checksymbol(win,i,y+win->vy-1);
|
for(i=y;i<y+win->vy-1;i++)checksymbol(win,x+win->vx-1,i); |
| for(i=y+win->vy-1;i>y;i--)checksymbol(win,x,i);
|
for(i=x+win->vx-1;i>x;i--)checksymbol(win,i,y+win->vy-1); |
| }
|
for(i=y+win->vy-1;i>y;i--)checksymbol(win,x,i); |
| if(dorefresh)mrefresh(win);
|
} |
| }
|
if(dorefresh)mrefresh(win); |
| }
|
} |
| |
} |
| |
|
| void dokey(short key,unsigned short mod) |
void dokey(short key,unsigned short mod) |
| { |
{ |
| MEVENT event; |
MEVENT event; |
| if(key==KEY_MOUSE) |
if(key==KEY_MOUSE) |
| { |
{ |
| if((mouseactive==MOUSE_XTERM)&&(getmouse(&event)==OK))
|
if((mouseactive==MOUSE_XTERM)&&(getmouse(&event)==OK)) |
| {
|
{ |
| domouseevent(&event);
|
domouseevent(&event); |
| } |
} |
| } |
} |
| else |
else |
| Line 584 void dokey(short key,unsigned short mod) |
|
| Line 590 void dokey(short key,unsigned short mod) |
|
| pos+=keymap[pos+1]; |
pos+=keymap[pos+1]; |
| else |
else |
| { |
{ |
| if((oldkey>=32)&&(oldkey<256))sendkeymessage(oldkey|mod);
|
if((oldkey>=32)&&(oldkey<256))sendkeymessage(oldkey|mod); |
| else if(oldkey==0)sendkeymessage(mod|MD_CTRL|' ');
|
else if(oldkey==0)sendkeymessage(mod|MD_CTRL|' '); |
| else if(((oldkey<9)&&(oldkey>0))||((oldkey>9)&&(oldkey<27)))sendkeymessage(mod|MD_CTRL|('A'+oldkey-1));
|
else if(((oldkey<9)&&(oldkey>0))||((oldkey>9)&&(oldkey<27)))sendkeymessage(mod|MD_CTRL|('A'+oldkey-1)); |
| else if(oldkey>27)sendkeymessage(mod|MD_CTRL|('3'+oldkey-27)); |
else if(oldkey>27)sendkeymessage(mod|MD_CTRL|('3'+oldkey-27)); |
| break; |
break; |
| } |
} |
| Line 604 void dokey(short key,unsigned short mod) |
|
| Line 610 void dokey(short key,unsigned short mod) |
|
| break; |
break; |
| } |
} |
| } |
} |
| }
|
} |
| } |
} |