diff options
-rw-r--r-- | common.c | 6 | ||||
-rw-r--r-- | common.h | 7 | ||||
-rw-r--r-- | input.c | 1 | ||||
-rw-r--r-- | output.c | 70 | ||||
-rw-r--r-- | output.h | 24 | ||||
-rw-r--r-- | reader.c | 25 |
6 files changed, 84 insertions, 49 deletions
@@ -641,12 +641,6 @@ int read_blocked(int fd, void *buf, size_t count) return res; } -int writeb( tputs_arg_t b ) -{ - write( 1, &b, 1 ); -// putc( b, stdout ); - return 0; -} void die_mem() { @@ -224,13 +224,6 @@ int contains_str( const wchar_t *needle, ... ); int read_blocked(int fd, void *buf, size_t count); /** - This is for writing process notification messages. Has to write to - stdout, so clr_eol and such functions will work correctly. Not an - issue since this function is only used in interactive mode anyway. -*/ -int writeb( tputs_arg_t b ); - -/** Exit program at once, leaving an error message about running out of memory */ void die_mem(); @@ -57,6 +57,7 @@ implementation in fish is as of yet incomplete. #include "event.h" #include "signal.h" #include "translate.h" +#include "output.h" static void input_read_inputrc( wchar_t *fn ); @@ -102,11 +102,22 @@ static size_t writestr_buff_sz=0; */ static char *writestr_buff = 0; +/** + The function used for output +*/ + +static int (*out)(char *str) = &writembs; + static void output_destroy() { free( writestr_buff ); } +void output_set_writer( int (*writer)(char *) ) +{ + out = writer; +} + void set_color( int c, int c2 ) { @@ -130,8 +141,8 @@ void set_color( int c, int c2 ) { c = c2 = FISH_COLOR_NORMAL; if( fg ) - writembs( tparm( fg, 0 ) ); - writembs( exit_attribute_mode ); + out( tparm( fg, 0 ) ); + out( exit_attribute_mode ); return; } @@ -164,7 +175,7 @@ void set_color( int c, int c2 ) Background color changed and is set, so we enter bold mode to make reading easier */ - writembs( enter_bold_mode ); + out( enter_bold_mode ); } if(!bg_set && last_bg_set) { @@ -172,14 +183,14 @@ void set_color( int c, int c2 ) Background color changed and is no longer set, so we exit bold mode */ - writembs( exit_attribute_mode ); + out( exit_attribute_mode ); /* We don't know if exit_attribute_mode resets colors, so we set it to something known. */ if( fg ) { - writembs( tparm( fg, 0 ) ); + out( tparm( fg, 0 ) ); last_color=0; } } @@ -190,8 +201,8 @@ void set_color( int c, int c2 ) if( c==FISH_COLOR_NORMAL ) { if( fg ) - writembs( tparm( fg, 0 ) ); - writembs( exit_attribute_mode ); + out( tparm( fg, 0 ) ); + out( exit_attribute_mode ); last_color2 = FISH_COLOR_NORMAL; } @@ -199,7 +210,7 @@ void set_color( int c, int c2 ) { if( fg ) { - writembs( tparm( fg, c ) ); + out( tparm( fg, c ) ); } } } @@ -212,13 +223,13 @@ void set_color( int c, int c2 ) { if( bg ) { - writembs( tparm( bg, 0 ) ); + out( tparm( bg, 0 ) ); } - writembs(exit_attribute_mode); + out(exit_attribute_mode); if(( last_color != FISH_COLOR_NORMAL ) && fg ) { - writembs(tparm( fg, last_color )); + out(tparm( fg, last_color )); } last_color2 = c2; @@ -227,13 +238,46 @@ void set_color( int c, int c2 ) { if( bg ) { - writembs( tparm( bg, c2 ) ); + out( tparm( bg, c2 ) ); } last_color2 = c2; } } } +/** + perm_left_cursor and parm_right_cursor don't seem to be properly + emulated by many terminal emulators, so we only use plain + curor_left, curor_right... +*/ +void move_cursor( int steps ) +{ + int i; + + if( !steps ) + return; + + if( steps < 0 ){ + for( i=0; i>steps; i--) + { + out(cursor_left); + } + } + else + { + for( i=0; i<steps; i++) + { + out(cursor_right); + } + } +} + +int writeb( tputs_arg_t b ) +{ + write( 1, &b, 1 ); + return 0; +} + int writembs( char *str ) { #ifdef TPUTS_KLUDGE @@ -385,7 +429,7 @@ int writespace( int c ) { if( repeat_char && strlen(repeat_char) ) { - writembs( tparm( repeat_char, ' ', c ) ); + out( tparm( repeat_char, ' ', c ) ); } else { @@ -80,7 +80,9 @@ void set_color( int c, int c2 ); /** Write a char * narrow string to FD 1, needed for the terminfo - strings. + strings. This is usually just a wrapper aound tputs, using writeb + as the sending function. But a weird bug on PPC Linux means that on + this platform, write is instead used directly. */ int writembs( char *str ); @@ -116,4 +118,24 @@ int writespace( int c ); */ int output_color_code( const wchar_t *val ); +/** + perm_left_cursor and parm_right_cursor don't seem to be defined + very often so we use cursor_left and cursor_right as a fallback. +*/ +void move_cursor( int steps ); + +/** + This is for writing process notification messages. Has to write to + stdout, so clr_eol and such functions will work correctly. Not an + issue since this function is only used in interactive mode anyway. +*/ +int writeb( tputs_arg_t b ); + +/** + Set the function used for writing in move_cursor, writespace and + set_color. By default, writembs is used. +*/ +void output_set_writer( int (*writer)(char *) ); + + #endif @@ -834,25 +834,6 @@ static void write_cmdline() } } -/** - perm_left_cursor and parm_right_cursor don't seem to be defined as - often as cursor_left and cursor_right, so we use this workalike. -*/ -static void move_cursor( int steps ) -{ - int i; - - if( steps < 0 ){ - for( i=0; i>steps; i--) - { - writembs(cursor_left); - } - } - else - for( i=0; i<steps; i++) - writembs(cursor_right); -} - void reader_init() { @@ -1462,7 +1443,7 @@ static void run_pager( wchar_t *prefix, int is_quoted, array_list_t *comp ) /** Handle the list of completions. This means the following: - + - If the list is empty, flash the terminal. - If the list contains one element, write the whole element, and if the element does not end on a '/', '@', ':', or a '=', also write a trailing @@ -2792,8 +2773,8 @@ wchar_t *reader_readline() case R_CLEAR_SCREEN: { - writembs( clear_screen ); - + if( clear_screen ) + writembs( clear_screen ); repaint(); break; } |