/*******************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // библиотека интерфейса с текстовым терминалом (xterm) // Анисимов Д.В. сегодня /*******************************************************************/ # include # include # include # include # include //# define _SUN_ # define DEFOULT 0 # define XTERM 1 # define NXTERM 2 # define RXVT 3 # define CONSOLE 4 # define SUN 5 long *Symbol ; uchar *Color ; short max_x,max_y ; short size_x,size_y ; char TermName[40] ; char TermType ; char f_Color ; int shift2=0 ; class t_Save_Screen { long *stek ; // запоминание областей экрана long l_stek ; // длинна массива Stek long j_stek ; // указатель последнего свободного байта public: t_Save_Screen( long l ); ~t_Save_Screen( void ); void save ( short y1, short x1, short y2, short x2 ); void save_rame( short y1, short x1, short y2, short x2 ); void restore( void ); } ; # ifndef _SUN_ mmask_t mm ; #endif WINDOW *Win ; short Cur_X=0,Cur_Y=0 ; short n_Line,n_Col ; char Run=0 ; // признак того, что графика запущена static char TextFont[100] ; t_Save_Screen Save( 51200 ) ; void s_rame( short y1, short x1, short y2, short x2, uchar f ); void s_quadro( short y1, short x1, short y2, short x2, uchar f ); /***************************************************************************/ void s_begin_schone( void ) { short i,i1 ; max_x=256 ; max_y=100 ; Symbol=(long *)Calloc( max_x*max_y,sizeof(long) ); Color =(uchar *)Calloc( max_x*max_y,1 ); for( i=0 ; i>1) ,NULL ); // if( (f&0x80)!=0 ) attr_on ( A_BLINK,NULL ); // else attr_off( A_BLINK,NULL ); // if( (f&0x08)!=0 ) attr_on ( A_BOLD ,NULL ); // else attr_off( A_BOLD ,NULL ); # endif if( 256<=Symbol[r+x] ) { addch( Symbol[r+x] ); } else { addch( Symbol[r+x]&0x00ff ); } } } move( Cur_Y,Cur_X ); } /* ----------------------------------------------------------------------- */ void s_goto_xy( short y, short x ) { Cur_X=x ; Cur_Y=y ; } /* ----------------------------------------------------------------------- */ void s_getch( short *key1, short *key2 ) { short key ; getmaxyx( Win, size_y, size_x ); shift2=0 ; n_Line=size_y ; n_Col =size_x ; s_redraw( ); key=wgetch( Win ); if( key== 10 ) { *key1=S_key_Enter ; *key2=0 ; return ; } if( key==127 ) { *key1=0 ; *key2=S_key_Del ; return ; } if( key <256 ) { *key1=key ; *key2=0 ; return ; } *key1=0 ; if( TermType==XTERM && 277<=key && key<=286 ) shift2=S_Ctrl_L ; switch( key ) { case 259 : *key2=S_key_Up ; break ; case 258 : *key2=S_key_Down ; break ; case 260 : *key2=S_key_Left ; break ; case 261 : *key2=S_key_Right; break ; case 265 : *key2=S_key_F1 ; break ; case 266 : *key2=S_key_F2 ; break ; case 267 : *key2=S_key_F3 ; break ; case 268 : *key2=S_key_F4 ; break ; case 269 : *key2=S_key_F5 ; break ; case 270 : *key2=S_key_F6 ; break ; case 271 : *key2=S_key_F7 ; break ; case 272 : *key2=S_key_F8 ; break ; case 273 : *key2=S_key_F9 ; break ; case 274 : *key2=S_key_F10 ; break ; case 331 : *key2=S_key_Ins ; break ; case 339 : *key2=S_key_PgUp ; break ; case 338 : *key2=S_key_PgDn ; break ; case 263 : *key1=S_key_Back ; *key2=0 ; break ; // rxvt case 362 : *key2=S_key_Home ; break ; case 385 : *key2=S_key_End ; break ; case 330 : *key2=S_key_Del ; break ; // linux case 262 : *key2=S_key_Home ; break ; case 360 : *key2=S_key_End ; break ; default: *key2=0 ; } if( TermType==CONSOLE ) { switch( key ) { case 275 : *key2=S_key_F1 ; break ; case 276 : *key2=S_key_F2 ; break ; case 277 : *key2=S_key_F3 ; break ; case 278 : *key2=S_key_F4 ; break ; case 279 : *key2=S_key_F5 ; break ; case 280 : *key2=S_key_F6 ; break ; case 281 : *key2=S_key_F7 ; break ; case 282 : *key2=S_key_F8 ; break ; case 283 : *key2=S_key_F9 ; break ; case 284 : *key2=S_key_F10 ; break ; } } if( TermType==XTERM ) { switch( key ) { case 277 : *key2=S_key_F1 ; break ; case 278 : *key2=S_key_F2 ; break ; case 279 : *key2=S_key_F3 ; break ; case 280 : *key2=S_key_F4 ; break ; case 281 : *key2=S_key_F5 ; break ; case 282 : *key2=S_key_F6 ; break ; case 283 : *key2=S_key_F7 ; break ; case 284 : *key2=S_key_F8 ; break ; case 285 : *key2=S_key_F9 ; break ; case 286 : *key2=S_key_F10 ; break ; case 275 : *key2=S_key_F11 ; break ; case 276 : *key2=S_key_F12 ; break ; } } } /***************************************************************************/ # include int s_shiftstatus( void ) { char shift=6 ; int shift1=0 ; # if !defined(_SUN_) && !defined(__FreeBSD__) if( TermType==CONSOLE ) { ioctl( 0,TIOCLINUX,&shift ); if( shift&0x01 ) shift1|=S_Shift_L ; if( shift&0x04 ) shift1|=S_Ctrl_L ; if( shift&0x08 ) shift1|=S_Alt_L ; } # endif if( TermType==XTERM ) return shift2 ; return shift1 ; } /***************************************************************************/ void s_set_size( short sx, short sy ){ ; } void s_get_size( short &sx, short &sy ){ sx=n_Col ; sy=n_Line ; } short s_get_sx( void ) { return n_Col ; } short s_get_sy( void ) { return n_Line ; } void x_set_fonts( void ){;} void s_set_font( char *F ){ strcpy( TextFont,F ); } char *s_get_font( void ){ return TextFont ; } short s_clear_cursor( void ){ return 0; } void s_refresh( void ){ refresh(); } void s_set_ruskomb( short Komb ){ ; } char s_run( ){ return Run ; } char s_x_version( ){ return 0 ; }