diff --git a/wmail/README b/wmail/README index 8b51a34..09bcc4b 100644 --- a/wmail/README +++ b/wmail/README @@ -132,6 +132,11 @@ Description: rc-file statement: Colors.NonShapedFrame = "" default value : + item : rc-file location + cmd-line option : -rc + rc-file statement: + default value : "~/.wmailrc" + libdockapp provides the following additional cmd-line options: windowed-mode : -w @@ -206,8 +211,7 @@ Install: your X11 base library directory or let $LD_LIBRARY_PATH point to the lib). If you would like to use rc-based configuration, look into the provided sample-file "wmailrc-sample" and use it as a base for your particular needs - by copying it to ~/.wmailrc. Note: the name of this rc-file is hard-wired and - cannot be customized. + by copying it to ~/.wmailrc. Run: diff --git a/wmail/src/config.c b/wmail/src/config.c index ec1b742..6bc2295 100644 --- a/wmail/src/config.c +++ b/wmail/src/config.c @@ -234,195 +234,179 @@ static void PostProcessConfiguration( void ) } } -void ReadConfigFile( bool resetConfigStrings ) +void ReadConfigFile( const char *configFile, bool resetConfigStrings ) { - char *usersHome; - // free all config strings and reset their pointers if required if( resetConfigStrings ) ResetConfigStrings(); - if(( usersHome = getenv( "HOME" )) != NULL ) + FILE *f = fopen( configFile, "r" ); + if( f != NULL ) { - char *fileName; - if(( fileName = MakePathName( usersHome, WMAIL_RC_FILE )) != NULL ) + char buf[1024]; + int line = 1; + + for( ; !feof( f ); ++line ) { - FILE *f = fopen( fileName, "rt" ); + const char *id, *value; + size_t len; - if( f != NULL ) + if( fgets( buf, sizeof buf, f ) == NULL ) + break; + + // first eliminate the trailing whitespaces + for( len = strlen( buf ); + len > 0 && IsWhiteSpace(buf+(--len)); ) + *(buf+len) = '\0'; + + if( !Tokenize( buf, &id, &value )) + continue; + + if( PREFIX_MATCHES( id, "Window.Display", false )) { - char buf[1024]; - int line = 1; - - for( ; !feof( f ); ++line ) - { - const char *id, *value; - size_t len; - - if( fgets( buf, sizeof buf, f ) == NULL ) - break; - - // first eliminate the trailing whitespaces - for( len = strlen( buf ); - len > 0 && IsWhiteSpace(buf+(--len)); ) - *(buf+len) = '\0'; - - if( !Tokenize( buf, &id, &value )) - continue; - - if( PREFIX_MATCHES( id, "Window.Display", false )) - { - if( !( config.givenOptions & CL_DISPLAY )) - ReadString( value, line, &config.display ); - continue; - } - - if( PREFIX_MATCHES( id, "Window.NonShaped", false )) - { - if( !( config.givenOptions & CL_NOSHAPE )) - ReadBool( value, line, &config.noshape ); - continue; - } - - if( PREFIX_MATCHES( id, "Window.Button.Command", false )) - { - if( !( config.givenOptions & CL_RUNCMD )) - ReadString( value, line, &config.runCmd ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.MailBox", false )) - { - if( !( config.givenOptions & CL_MAILBOX )) - ReadString( value, line, &config.mailBox ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.ChecksumFile", false )) - { - /* - * No corresponding command-line option. - */ - ReadString( value, line, &config.checksumFileName ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.CheckIntervall", false )) - { - if( !( config.givenOptions & CL_CHECKINTERVAL )) - ReadInt( value, line, &config.checkInterval ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.ShowOnlyNew", false )) - { - if( !( config.givenOptions & CL_NEWMAILONLY )) - ReadBool( value, line, &config.newMailsOnly ); - continue; - } - - if( PREFIX_MATCHES( id, "Ticker.Mode", false )) - { - if( !( config.givenOptions & CL_TICKERMODE )) - ReadEnum( value, line, (int *)&config.tickerMode, tickerEnum ); - continue; - } - - if( PREFIX_MATCHES( id, "Ticker.Frames", false )) - { - if( !( config.givenOptions & CL_FPS )) - ReadInt( value, line, &config.fps ); - continue; - } - - if( PREFIX_MATCHES( id, "Colors.Symbols", false )) - { - if( !( config.givenOptions & CL_SYMBOLCOLOR )) - ReadString( value, line, &config.symbolColor ); - continue; - } - - if( PREFIX_MATCHES( id, "Colors.Font", false )) - { - if( !( config.givenOptions & CL_FONTCOLOR )) - ReadString( value, line, &config.fontColor ); - continue; - } - - if( PREFIX_MATCHES( id, "Colors.Backlight", false )) - { - if( !( config.givenOptions & CL_BACKCOLOR )) - ReadString( value, line, &config.backColor ); - continue; - } - - if( PREFIX_MATCHES( id, "Colors.OffLight", false )) - { - if( !( config.givenOptions & CL_OFFLIGHTCOLOR )) - ReadString( value, line, &config.offlightColor ); - continue; - } - - if( PREFIX_MATCHES( id, "Colors.NonShapedFrame", false )) - { - if( !( config.givenOptions & CL_NOSHAPE )) - ReadString( value, line, &config.backgroundColor ); - continue; - } - - if( PREFIX_MATCHES( id, "Ticker.X11Font", false )) - { - if( !( config.givenOptions & CL_USEX11FONT )) - ReadString( value, line, &config.useX11Font ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.SkipSender", false )) - { - /* - * No corresponding command-line option. - */ - char *skip; - if( ReadString( value, line, &skip )) - AddSenderToSkipList( skip ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.OnNew.Command", false )) - { - if( !( config.givenOptions & CL_CMDONMAIL )) - ReadString( value, line, &config.cmdOnMail ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.UseStatusField", false )) - { - if( !( config.givenOptions & CL_CONSIDERSTATUSFIELD )) - ReadBool( value, line, &config.considerStatusField ); - continue; - } - - if( PREFIX_MATCHES( id, "Mail.ReadStatus", false )) - { - if( !( config.givenOptions & CL_READSTATUS )) - ReadString( value, line, &config.readStatus ); - continue; - } - - WARNING( "cfg-file(%i): unrecognized: \"%s\"\n", line, buf ); - } - - fclose( f ); - } else { - TRACE( "unable to open config-file \"%s\"\n", fileName ); + if( !( config.givenOptions & CL_DISPLAY )) + ReadString( value, line, &config.display ); + continue; } - free( fileName ); - } else { - TRACE( "unable to allocate config-file\n" ); + if( PREFIX_MATCHES( id, "Window.NonShaped", false )) + { + if( !( config.givenOptions & CL_NOSHAPE )) + ReadBool( value, line, &config.noshape ); + continue; + } + + if( PREFIX_MATCHES( id, "Window.Button.Command", false )) + { + if( !( config.givenOptions & CL_RUNCMD )) + ReadString( value, line, &config.runCmd ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.MailBox", false )) + { + if( !( config.givenOptions & CL_MAILBOX )) + ReadString( value, line, &config.mailBox ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.ChecksumFile", false )) + { + /* + * No corresponding command-line option. + */ + ReadString( value, line, &config.checksumFileName ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.CheckIntervall", false )) + { + if( !( config.givenOptions & CL_CHECKINTERVAL )) + ReadInt( value, line, &config.checkInterval ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.ShowOnlyNew", false )) + { + if( !( config.givenOptions & CL_NEWMAILONLY )) + ReadBool( value, line, &config.newMailsOnly ); + continue; + } + + if( PREFIX_MATCHES( id, "Ticker.Mode", false )) + { + if( !( config.givenOptions & CL_TICKERMODE )) + ReadEnum( value, line, (int *)&config.tickerMode, tickerEnum ); + continue; + } + + if( PREFIX_MATCHES( id, "Ticker.Frames", false )) + { + if( !( config.givenOptions & CL_FPS )) + ReadInt( value, line, &config.fps ); + continue; + } + + if( PREFIX_MATCHES( id, "Colors.Symbols", false )) + { + if( !( config.givenOptions & CL_SYMBOLCOLOR )) + ReadString( value, line, &config.symbolColor ); + continue; + } + + if( PREFIX_MATCHES( id, "Colors.Font", false )) + { + if( !( config.givenOptions & CL_FONTCOLOR )) + ReadString( value, line, &config.fontColor ); + continue; + } + + if( PREFIX_MATCHES( id, "Colors.Backlight", false )) + { + if( !( config.givenOptions & CL_BACKCOLOR )) + ReadString( value, line, &config.backColor ); + continue; + } + + if( PREFIX_MATCHES( id, "Colors.OffLight", false )) + { + if( !( config.givenOptions & CL_OFFLIGHTCOLOR )) + ReadString( value, line, &config.offlightColor ); + continue; + } + + if( PREFIX_MATCHES( id, "Colors.NonShapedFrame", false )) + { + if( !( config.givenOptions & CL_NOSHAPE )) + ReadString( value, line, &config.backgroundColor ); + continue; + } + + if( PREFIX_MATCHES( id, "Ticker.X11Font", false )) + { + if( !( config.givenOptions & CL_USEX11FONT )) + ReadString( value, line, &config.useX11Font ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.SkipSender", false )) + { + /* + * No corresponding command-line option. + */ + char *skip; + if( ReadString( value, line, &skip )) + AddSenderToSkipList( skip ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.OnNew.Command", false )) + { + if( !( config.givenOptions & CL_CMDONMAIL )) + ReadString( value, line, &config.cmdOnMail ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.UseStatusField", false )) + { + if( !( config.givenOptions & CL_CONSIDERSTATUSFIELD )) + ReadBool( value, line, &config.considerStatusField ); + continue; + } + + if( PREFIX_MATCHES( id, "Mail.ReadStatus", false )) + { + if( !( config.givenOptions & CL_READSTATUS )) + ReadString( value, line, &config.readStatus ); + continue; + } + + WARNING( "cfg-file(%i): unrecognized: \"%s\"\n", line, buf ); } + + fclose( f ); } else { - TRACE( "no $HOME defined - config-file not read\n" ); + TRACE( "unable to open config-file \"%s\"\n", configFile ); } PostProcessConfiguration(); diff --git a/wmail/src/config.h b/wmail/src/config.h index 2e6281b..b8a075c 100644 --- a/wmail/src/config.h +++ b/wmail/src/config.h @@ -67,7 +67,8 @@ enum { CL_CMDONMAIL = 1<<15, CL_CONSIDERSTATUSFIELD = 1<<16, CL_READSTATUS = 1<<17, - CL_USEX11FONT = 1<<18 + CL_USEX11FONT = 1<<18, + CL_CONFIGFILE = 1<<19 }; typedef struct _config_t { @@ -100,7 +101,7 @@ typedef struct _config_t { extern config_t config; // config manipulation functions -void ReadConfigFile( bool resetConfigStrings ); +void ReadConfigFile( const char *configFile, bool resetConfigStrings ); void ResetConfigStrings( void ); diff --git a/wmail/src/wmail.c b/wmail/src/wmail.c index 38405cd..9a579c8 100644 --- a/wmail/src/wmail.c +++ b/wmail/src/wmail.c @@ -115,6 +115,7 @@ typedef enum { /////////////////////////////////////////////////////////////////////////////// // data +static char *configFile; static unsigned long lastTimeOut; static sig_atomic_t caughtSig; static mail_state_t state; @@ -158,7 +159,8 @@ enum OPT_INDEX_EXECUTE, OPT_INDEX_STATUS_FIELD, OPT_INDEX_READ_STATUS, - OPT_INDEX_TICKER_FONT + OPT_INDEX_TICKER_FONT, + OPT_INDEX_CONFIG_FILE, }; static DAProgramOption options[] = { @@ -276,6 +278,13 @@ static DAProgramOption options[] = { .description = "use specified X11 font to draw the ticker", .type = DOString, .value = { .string = &config.useX11Font } + }, + [OPT_INDEX_CONFIG_FILE] = { + .shortForm = "-rc", + .longForm = "--rcfile", + .description = "specify another rc-file ($HOME/.wmailrc is default)", + .type = DOString, + .value = { .string = &configFile } } }; @@ -324,7 +333,7 @@ static bool HasTickerWork( void ); int main( int argc, char **argv ) { - char *usersHome; + char *usersHome = getenv( "HOME" ); struct sigaction sa = { .sa_handler = ExitHandler }; struct stat fileStat; XTextProperty windowName; @@ -383,21 +392,45 @@ int main( int argc, char **argv ) if( options[OPT_INDEX_TICKER_FONT].used ) config.givenOptions |= CL_USEX11FONT; - // read the config file - ReadConfigFile( false ); + if( configFile == NULL) + { + if( usersHome == NULL) + { + WARNING( "HOME environment-variable is not set, looking for %s in current directory!\n", + WMAIL_RC_FILE ); + configFile = strdup( WMAIL_RC_FILE ); + } + else + configFile = MakePathName( usersHome, WMAIL_RC_FILE ); + + if( configFile == NULL ) + { + WARNING( "Cannot allocate config file-name.\n"); + exit( EXIT_FAILURE ); + } - if( config.checksumFileName == NULL ) { - if(( usersHome = getenv( "HOME" )) == NULL ) { - WARNING( "HOME environment-variable is not set, placing %s in current directory!\n", WMAIL_CHECKSUM_FILE ); - config.checksumFileName = strdup( WMAIL_CHECKSUM_FILE ); - } else - config.checksumFileName = MakePathName( usersHome, WMAIL_CHECKSUM_FILE ); } - if( config.checksumFileName == NULL ) - { - WARNING( "Cannot allocate checksum file-name.\n"); - exit( EXIT_FAILURE ); + TRACE( "%s: configFile = %s\n", __func__, configFile ); + + // read the config file + ReadConfigFile( configFile, false ); + + if( config.checksumFileName == NULL ) { + if( usersHome == NULL ) + { + WARNING( "HOME environment-variable is not set, placing %s in current directory!\n", + WMAIL_CHECKSUM_FILE ); + config.checksumFileName = strdup( WMAIL_CHECKSUM_FILE ); + } + else + config.checksumFileName = MakePathName( usersHome, WMAIL_CHECKSUM_FILE ); + + if( config.checksumFileName == NULL ) + { + WARNING( "Cannot allocate checksum file-name.\n"); + exit( EXIT_FAILURE ); + } } TRACE( "using checksum-file \"%s\"\n", config.checksumFileName ); @@ -672,6 +705,8 @@ static void TimedOut( void ) if( caughtSig ) { ClearAllNames(); ResetConfigStrings(); + if( !options[OPT_INDEX_CONFIG_FILE].used ) + free( configFile ); exit( EXIT_SUCCESS ); } @@ -1472,7 +1507,7 @@ static void UpdateConfiguration( void ) TRACE( "reading configuration file...\n" ); - ReadConfigFile( true ); + ReadConfigFile( configFile, true ); // if no path/name to an mbox or maildir inbox directory was given, // use the environment