From: Vladimir E. <vo...@vo...> - 2012-11-11 08:28:59
|
Thanks! I'll try the patch, but I still can't understand why the same font draws lines properly without screen/tmux? Vlad. On Sun, 2012-11-11 at 17:17 +0900, Araki Ken wrote: > Hi, > > From: Vladimir Elisseev <vo...@vo...> > Subject: Re: [Mlterm-dev-en] few question regarding mlterm initial configuration > Date: Sat, 10 Nov 2012 09:02:48 +0100 > Message-ID: <135...@vo....home> > > > > > > > - While pseudo graphic characters displayed properly it the plain > > > > > > terminal, they don't work as expected in tmux/screen > > > > > > > > > > Does it work on xterm with tmux/screen ? > > > > > I think tmux doesn't deal with graphic characters correctly. > > > > > > > > > As I mentioned already, I've been using rxvt and pseudo graphics works > > > > fine there with tmux/screen. > > > > > > Will you show me the screenshot of pseudo graphic characters which > > > don't work as expected ? > > > > see https://www.vovan.nl/files/mlterm_tmux.png > > Note the bluish vertical lines, without tmux/screen they are white. > > > > > (Is something like "qqqq" shown ? Or are lines drawn in incorrect positions ?) > > > > > > Then please tell me the version numbers of rxvt/tmux/screen, > > > > screen - 4.00.03 > > tmux - 1.7 > > > > > and what is shown if you start mlterm without any configuration as follows. > > > > > > $ mlterm -type xcore -km utf8 -ac 1 -e tmux -c "dialog --msgbox test 5 10" > > > > the above works fine, but with non-antialiased font Terminus. > > I think this is because the unicode font you use doesn't contain line > drawing characters (U+2500 etc). > > I attached a patch to improve such a situation. > Apply this patch to mlterm-3.1.5 and start mlterm with -Y option. > > Regards, > --- > Araki Ken > ara...@us... > plain text document attachment (mlterm-3.1.5post-fixdecspecial.patch) > diff -r 689d086828ac main/main_loop.c > --- a/main/main_loop.c Tue Nov 06 20:30:18 2012 +0900 > +++ b/main/main_loop.c Sun Nov 11 13:56:28 2012 +0900 > @@ -279,6 +279,7 @@ > { > if( strcmp( value , "true") == 0) > { > + ml_use_dec_special_font() ; > x_compose_dec_special_font() ; > } > } > diff -r 689d086828ac mlterm/ml_vt100_parser.c > --- a/mlterm/ml_vt100_parser.c Tue Nov 06 20:30:18 2012 +0900 > +++ b/mlterm/ml_vt100_parser.c Sun Nov 11 13:56:28 2012 +0900 > @@ -87,9 +87,14 @@ > #endif > > > +/* --- static variables --- */ > + > +static int use_dec_special_font ; > + > + > /* --- static functions --- */ > > -/* XXX This function should be move to kiklib */ > +/* XXX This function should be moved to kiklib */ > static void > str_replace( > char * str , > @@ -108,6 +113,88 @@ > } > } > > +/* XXX This function should be moved to mkf */ > +u_char > +convert_ucs_to_dec_special( > + u_int16_t ucs > + ) > +{ > + static struct > + { > + u_int16_t ucs ; > + u_char decsp ; > + > + } ucs_to_decsp_table[] = > + { > + /* Not line characters */ > + #if 0 > + { 0xa3 , '}' } , > + { 0xb0 , 'f' } , > + { 0xb1 , 'g' } , > + { 0xb7 , '~' } , > + { 0x3c0 , '{' } , > + { 0x2260 , '|' } , > + { 0x2264 , 'y' } , > + { 0x2265 , 'z' } , > + #endif > + > + /* Line characters */ > + { 0x23ba , 'o' } , > + { 0x23bb , 'p' } , > + { 0x23bc , 'r' } , > + { 0x23bd , 's' } , > + { 0x2500 , 'q' } , > + { 0x2502 , 'x' } , > + { 0x250c , 'l' } , > + { 0x2510 , 'k' } , > + { 0x2514 , 'm' } , > + { 0x2518 , 'j' } , > + { 0x251c , 't' } , > + { 0x2524 , 'u' } , > + { 0x252c , 'w' } , > + { 0x2534 , 'v' } , > + { 0x253c , 'n' } , > + > + { 0x2592 , 'a' } , > + { 0x25c6 , '`' } , > + } ; > + int l_idx ; > + int h_idx ; > + int idx ; > + > + l_idx = 0 ; > + h_idx = sizeof(ucs_to_decsp_table) / sizeof(ucs_to_decsp_table[0]) - 1 ; > + > + if( ucs < ucs_to_decsp_table[l_idx].ucs || > + ucs_to_decsp_table[h_idx].ucs < ucs) > + { > + return 0 ; > + } > + > + while( 1) > + { > + idx = (l_idx + h_idx) / 2 ; > + > + if( ucs == ucs_to_decsp_table[idx].ucs) > + { > + return ucs_to_decsp_table[idx].decsp ; > + } > + else if( ucs < ucs_to_decsp_table[idx].ucs) > + { > + h_idx = idx ; > + } > + else > + { > + l_idx = idx + 1 ; > + } > + > + if( l_idx >= h_idx) > + { > + return 0 ; > + } > + } > +} > + > static void > start_vt100_cmd( > ml_vt100_parser_t * vt100_parser , > @@ -3929,6 +4016,8 @@ > */ > if( ch.cs == ISO10646_UCS4_1) > { > + u_char decsp ; > + > if( ch.ch[0] == 0x00 && ch.ch[1] == 0x00 && > ch.ch[2] == 0x00 && ch.ch[3] <= 0x7f > ) > @@ -3938,6 +4027,14 @@ > ch.size = 1 ; > ch.cs = US_ASCII ; > } > + else if( use_dec_special_font && > + ( decsp = convert_ucs_to_dec_special( > + mkf_bytes_to_int( ch.ch , ch.size)))) > + { > + ch.ch[0] = decsp ; > + ch.size = 1 ; > + ch.cs = DEC_SPECIAL ; > + } > else if( vt100_parser->unicode_policy & NOT_USE_UNICODE_FONT) > { > /* convert ucs4 to appropriate charset */ > @@ -4209,6 +4306,14 @@ > > /* --- global functions --- */ > > +int > +ml_use_dec_special_font(void) > +{ > + use_dec_special_font = 1 ; > + > + return 1 ; > +} > + > ml_vt100_parser_t * > ml_vt100_parser_new( > ml_screen_t * screen , |