aboutsummaryrefslogtreecommitdiffhomepage
path: root/fish_pager.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2007-01-08 02:43:36 +1000
committerGravatar axel <axel@liljencrantz.se>2007-01-08 02:43:36 +1000
commit4a2a47666f1e3a92646284b4c921cd47b8e8c5b1 (patch)
tree1195b4ed26b8a3fe5545afdf7ebf8067cb354fb6 /fish_pager.c
parent94fbbb76691f35159bbc6039bb43aa846e1c4743 (diff)
Fix indentation and add a few comments to fish_pager
darcs-hash:20070107164336-ac50b-d3cfa100a499d3f0996aac16288c4c892a65c1fe.gz
Diffstat (limited to 'fish_pager.c')
-rw-r--r--fish_pager.c325
1 files changed, 173 insertions, 152 deletions
diff --git a/fish_pager.c b/fish_pager.c
index 2fb9c308..13720f17 100644
--- a/fish_pager.c
+++ b/fish_pager.c
@@ -98,7 +98,7 @@ enum
;
/**
- The minimum number of columns the terminal may have for fish_pager to not refuse showing the completions
+ The minimum width (in characters) the terminal may have for fish_pager to not refuse showing the completions
*/
#define PAGER_MIN_WIDTH 16
@@ -112,13 +112,15 @@ enum
*/
#define GETOPT_STRING "c:hr:qvp:"
+/**
+ Error to use when given an invalid file descriptor for reading completions or writing output
+*/
#define ERR_NOT_FD _( L"%ls: Argument '%s' is not a valid file descriptor\n" )
/**
This struct should be continually updated by signals as the term
resizes, and as such always contain the correct current size.
*/
-
static struct winsize termsize;
/**
@@ -616,8 +618,22 @@ static int completion_try_print( int cols,
( pref_tot_width-termsize.ws_col< 4 && cols < 3 ) ) )
{
/*
- Terminal almost wide enough, or squeezing makes the whole list fit on-screen
+ Terminal almost wide enough, or squeezing makes the
+ whole list fit on-screen.
+
+ This part of the code is really important. People hate
+ having to scroll through the completion list. In cases
+ where there are a huge number of completions, it can't
+ be helped, but it is not uncommon for the completions to
+ _almost_ fit on one screen. In those cases, it is almost
+ always desirable to 'squeeze' the completions into a
+ single page.
+
+ If we are using N columns and can get everything to
+ fit using squeezing, but everything would also fit
+ using N-1 columns, don't try.
*/
+
int tot_width = min_tot_width;
width = min_width;
@@ -1205,142 +1221,147 @@ int main( int argc, char **argv )
Third mode
*/
- int completion_fd = -1;
- FILE *completion_file;
+ int completion_fd = -1;
+ FILE *completion_file;
- while( 1 )
- {
- static struct option
- long_options[] =
- {
- {
- "result-fd", required_argument, 0, 'r'
- }
- ,
- {
- "completion-fd", required_argument, 0, 'c'
- }
- ,
- {
- "prefix", required_argument, 0, 'p'
- }
- ,
- {
- "is-quoted", no_argument, 0, 'q'
- }
- ,
- {
- "help", no_argument, 0, 'h'
- }
- ,
- {
- "version", no_argument, 0, 'v'
- }
- ,
- {
- 0, 0, 0, 0
- }
- }
- ;
-
- int opt_index = 0;
-
- int opt = getopt_long( argc,
- argv,
- GETOPT_STRING,
- long_options,
- &opt_index );
-
- if( opt == -1 )
- break;
-
- switch( opt )
+ while( 1 )
+ {
+ static struct option
+ long_options[] =
{
- case 0:
{
- break;
+ "result-fd", required_argument, 0, 'r'
}
-
- case 'r':
+ ,
{
- result_fd = get_fd( optarg );
- break;
+ "completion-fd", required_argument, 0, 'c'
}
-
- case 'c':
+ ,
{
- completion_fd = get_fd( optarg );
- break;
+ "prefix", required_argument, 0, 'p'
}
-
- case 'p':
+ ,
{
- prefix = str2wcs(optarg);
- break;
+ "is-quoted", no_argument, 0, 'q'
}
-
- case 'h':
+ ,
{
- print_help( argv[0], 1 );
- exit(0);
+ "help", no_argument, 0, 'h'
}
-
- case 'v':
+ ,
{
- debug( 0, L"%ls, version %s\n", program_name, PACKAGE_VERSION );
- exit( 0 );
+ "version", no_argument, 0, 'v'
}
-
- case 'q':
- {
- is_quoted = 1;
+ ,
+ {
+ 0, 0, 0, 0
}
+ }
+ ;
+
+ int opt_index = 0;
+
+ int opt = getopt_long( argc,
+ argv,
+ GETOPT_STRING,
+ long_options,
+ &opt_index );
+
+ if( opt == -1 )
+ break;
+
+ switch( opt )
+ {
+ case 0:
+ {
+ break;
+ }
+
+ case 'r':
+ {
+ result_fd = get_fd( optarg );
+ break;
+ }
+ case 'c':
+ {
+ completion_fd = get_fd( optarg );
+ break;
}
- }
- if( completion_fd == -1 || result_fd == -1 )
- {
- debug( 0, _(L"Unspecified file descriptors") );
- exit( 1 );
+ case 'p':
+ {
+ prefix = str2wcs(optarg);
+ break;
+ }
+
+ case 'h':
+ {
+ print_help( argv[0], 1 );
+ exit(0);
+ }
+
+ case 'v':
+ {
+ debug( 0, L"%ls, version %s\n", program_name, PACKAGE_VERSION );
+ exit( 0 );
+ }
+
+ case 'q':
+ {
+ is_quoted = 1;
+ }
+
}
+ }
+
+ if( completion_fd == -1 || result_fd == -1 )
+ {
+ debug( 0, _(L"Unspecified file descriptors") );
+ exit( 1 );
+ }
- if( (completion_file = fdopen( completion_fd, "r" ) ) )
- {
- read_array( completion_file, comp );
- fclose( completion_file );
- }
- else
- {
- debug( 0, _(L"Could not read completions") );
- wperror( L"fdopen" );
- exit( 1 );
- }
+ if( (completion_file = fdopen( completion_fd, "r" ) ) )
+ {
+ read_array( completion_file, comp );
+ fclose( completion_file );
+ }
+ else
+ {
+ debug( 0, _(L"Could not read completions") );
+ wperror( L"fdopen" );
+ exit( 1 );
+ }
- if( !prefix )
- {
- prefix = wcsdup( L"" );
- }
+ if( !prefix )
+ {
+ prefix = wcsdup( L"" );
+ }
+ }
+ else
+ {
+ /*
+ Second or first mode. These suck, but we need to support
+ them for backwards compatibility. At least for some
+ time.
+
+ Third mode was implemented in January 2007, and previous
+ modes should be considered deprecated from that point
+ forward. A reasonable time frame for removal of the code
+ below has yet to be determined.
+ */
+
+ if( argc < 3 )
+ {
+ print_help( argv[0], 1 );
+ exit( 0 );
}
else
{
- /*
- Second or first mode. These suck, but we need to support
- them for backwards compatibility. At least for some
- time.
- */
-
- if( argc < 3 )
- {
- print_help( argv[0], 1 );
- exit( 0 );
- }
- else
- {
- mangle_descriptors = 1;
+ mangle_descriptors = 1;
prefix = str2wcs( argv[2] );
is_quoted = strcmp( "1", argv[1] )==0;
@@ -1366,61 +1387,61 @@ int main( int argc, char **argv )
*/
read_array( stdin, comp );
}
- }
-
}
+
+ }
// debug( 3, L"prefix is '%ls'", prefix );
- init( mangle_descriptors, result_fd );
+ init( mangle_descriptors, result_fd );
- mangle_descriptions( comp );
+ mangle_descriptions( comp );
- if( wcscmp( prefix, L"-" ) == 0 )
- join_completions( comp );
+ if( wcscmp( prefix, L"-" ) == 0 )
+ join_completions( comp );
- mangle_completions( comp, prefix );
+ mangle_completions( comp, prefix );
- /**
- Try to print the completions. Start by trying to print the
- list in PAGER_MAX_COLS columns, if the completions won't
- fit, reduce the number of columns by one. Printing a single
- column never fails.
- */
- for( i = PAGER_MAX_COLS; i>0; i-- )
+ /**
+ Try to print the completions. Start by trying to print the
+ list in PAGER_MAX_COLS columns, if the completions won't
+ fit, reduce the number of columns by one. Printing a single
+ column never fails.
+ */
+ for( i = PAGER_MAX_COLS; i>0; i-- )
+ {
+ switch( completion_try_print( i, prefix, is_quoted, comp ) )
{
- switch( completion_try_print( i, prefix, is_quoted, comp ) )
- {
- case PAGER_RETRY:
- break;
+ case PAGER_RETRY:
+ break;
- case PAGER_DONE:
- i=0;
- break;
+ case PAGER_DONE:
+ i=0;
+ break;
- case PAGER_RESIZE:
- /*
- This means we got a resize event, so we start
- over from the beginning. Since it the screen got
- bigger, we might be able to fit all completions
- on-screen.
- */
- i=PAGER_MAX_COLS+1;
- break;
+ case PAGER_RESIZE:
+ /*
+ This means we got a resize event, so we start
+ over from the beginning. Since it the screen got
+ bigger, we might be able to fit all completions
+ on-screen.
+ */
+ i=PAGER_MAX_COLS+1;
+ break;
- }
- }
+ }
+ }
- free(prefix );
+ free(prefix );
- fwprintf( out_file, L"%ls", (wchar_t *)out_buff.buff );
- if( is_ca_mode )
- {
- writembs(exit_ca_mode);
- pager_flush();
- }
- destroy();
+ fwprintf( out_file, L"%ls", (wchar_t *)out_buff.buff );
+ if( is_ca_mode )
+ {
+ writembs(exit_ca_mode);
+ pager_flush();
+ }
+ destroy();
halloc_util_destroy();