wmail: added command-line option to specify a different config-file.

This commit is contained in:
Jeremy Sowden 2019-06-12 21:37:21 +01:00 committed by Carlos R. Mafra
parent 7590c32f82
commit 6e48b4a431
4 changed files with 219 additions and 195 deletions

View file

@ -132,6 +132,11 @@ Description:
rc-file statement: Colors.NonShapedFrame = "<string>"
default value : <unset, this color is translucent>
item : rc-file location
cmd-line option : -rc <path>
rc-file statement: <none>
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:

View file

@ -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();

View file

@ -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 );

View file

@ -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