wmbutton: fail early on missing config

wmbutton will happily start and display what otherwise looks like a
functioning display even if none of the possible configuration files
exist. However, the application promptly exits as soon as it has to show
a tooltip. This isn't nice. It looks like a crash to an unsuspecting
user. Terminal output is shown, of course, leading to a decently quick
diagnostic, but the fail isn't early enough to be useable.

The trivial fix is to check if the local configuration file (specified
as a command line argument or defaulting to ~/.wmbutton) or the global
configuration file can be open. If neither can be open, we bail out
early.

This *still* has the problem of only really being functional in a
terminal. A graphical error box would definitely be preferable and is a
possible improvement.

Signed-off-by: Weland Treebark <weland@blinkenshell.org>
This commit is contained in:
Weland Treebark 2014-05-28 21:34:14 +03:00 committed by Carlos R. Mafra
parent 145662ff35
commit 9f5ea8c8d7
3 changed files with 26 additions and 0 deletions

View file

@ -191,6 +191,23 @@ void RunAppN(int app)
} }
/***********************************************************************/ /***********************************************************************/
/***********************************************************************
* canOpenFile(const char *path)
*
* Check if the file at a given path can be opened.
***********************************************************************/
int canOpenFile(const char *path)
{
FILE *fp;
if ((fp = fopen(path, "r")) == NULL)
return 0;
else {
fclose(fp);
return 1;
}
}
/*********************************************************************** /***********************************************************************
* Parse(int app) * Parse(int app)
* *

View file

@ -111,6 +111,14 @@ int main(int argc, char **argv)
/* Parse Command Line Arguments */ /* Parse Command Line Arguments */
parseargs(argc, argv); parseargs(argc, argv);
/* Catch fire if no configuration file exists */
if (!canOpenFile(Config.configfile)) {
if(!canOpenFile(CONFIGGLOBAL)) {
err_mess(FAILCONF, Config.configfile);
return (1);
}
}
/* Open Display */ /* Open Display */
if ((display = XOpenDisplay(Config.Display_str)) == NULL) if ((display = XOpenDisplay(Config.Display_str)) == NULL)
err_mess(FAILDISP, Config.Display_str); err_mess(FAILDISP, Config.Display_str);

View file

@ -84,6 +84,7 @@ void parseargs(int argc, char **argv);
char *readln(FILE *fp); /* read line from file, return pointer to it */ char *readln(FILE *fp); /* read line from file, return pointer to it */
void err_mess(int err, char *str); /* Error Handling Routine */ void err_mess(int err, char *str); /* Error Handling Routine */
void show_usage(void); /* show usage message to stderr */ void show_usage(void); /* show usage message to stderr */
int canOpenFile(const char *path);
int flush_expose(Window w); int flush_expose(Window w);