hw/xwin: Improve XWinrc loading and error recovery

If $HOME/.XWinrc is present but badly formed, ignore it and try
system.XWinrc instead.  If neither file is present or both are badly
formed, provide a built-in default which gives the user the chance to
load their new or fixed configuration without restarting.

Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: Colin Harrison <colin.harrison@virgin.net>
This commit is contained in:
Yaakov Selkowitz 2010-02-20 23:40:53 -06:00 committed by Jon TURNEY
parent 47c7b6d3e6
commit 0659437f5e
2 changed files with 65 additions and 19 deletions

View File

@ -51,8 +51,8 @@
extern const char *winGetBaseDir(void);
/* From winmultiwindowflex.l, the real parser */
extern void parse_file (FILE *fp);
/* From winprefslex.l, the real parser */
extern int parse_file (FILE *fp);
/* Currently in use command ID, incremented each new menu item created */
@ -709,6 +709,54 @@ winIconIsOverride(unsigned hiconIn)
/*
* Open and parse the XWinrc config file @path.
* If @path is NULL, use the built-in default.
*/
static int
winPrefsLoadPreferences (char *path)
{
FILE *prefFile = NULL;
if (path)
prefFile = fopen (path, "r");
else
{
char defaultPrefs[] =
"MENU rmenu {\n"
" \"How to customize this menu\" EXEC \"xterm +tb -e man XWinrc\"\n"
" \"Launch xterm\" EXEC xterm\n"
" \"Load .XWinrc\" RELOAD\n"
" SEPARATOR\n"
"}\n"
"\n"
"ROOTMENU rmenu\n";
path = "built-in default";
prefFile = fmemopen(defaultPrefs, strlen(defaultPrefs), "r");
}
if (!prefFile)
{
ErrorF ("LoadPreferences: %s not found\n", path);
return FALSE;
}
ErrorF ("LoadPreferences: Loading %s\n", path);
if((parse_file (prefFile)) != 0)
{
ErrorF ("LoadPreferences: %s is badly formed!\n", path);
fclose (prefFile);
return FALSE;
}
fclose (prefFile);
return TRUE;
}
/*
* Try and open ~/.XWinrc and system.XWinrc
* Load it into prefs structure for use by other functions
@ -718,16 +766,15 @@ LoadPreferences (void)
{
char *home;
char fname[PATH_MAX+NAME_MAX+2];
FILE *prefFile;
char szDisplay[512];
char *szEnvDisplay;
int i, j;
char param[PARAM_MAX+1];
char *srcParam, *dstParam;
int parsed = FALSE;
/* First, clear all preference settings */
memset (&pref, 0, sizeof(pref));
prefFile = NULL;
/* Now try and find a ~/.xwinrc file */
home = getenv ("HOME");
@ -737,14 +784,11 @@ LoadPreferences (void)
if (fname[strlen(fname)-1]!='/')
strcat (fname, "/");
strcat (fname, ".XWinrc");
prefFile = fopen (fname, "r");
if (prefFile)
ErrorF ("winPrefsLoadPreferences: %s\n", fname);
parsed = winPrefsLoadPreferences(fname);
}
/* No home file found, check system default */
if (!prefFile)
if (!parsed)
{
char buffer[MAX_PATH];
#ifdef RELOCATE_PROJECTROOT
@ -753,16 +797,14 @@ LoadPreferences (void)
strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
#endif
buffer[sizeof(buffer)-1] = 0;
prefFile = fopen (buffer, "r");
if (prefFile)
ErrorF ("winPrefsLoadPreferences: %s\n", buffer);
parsed = winPrefsLoadPreferences(buffer);
}
/* If we could open it, then read the settings and close it */
if (prefFile)
/* Neither user nor system configuration found, or were badly formed */
if (!parsed)
{
parse_file (prefFile);
fclose (prefFile);
ErrorF ("LoadPreferences: See \"man XWinrc\" to customize the XWin menu.\n");
parsed = winPrefsLoadPreferences(NULL);
}
/* Setup a DISPLAY environment variable, need to allocate on heap */

View File

@ -113,14 +113,18 @@ yywrap (void)
/*
* Run a file through the yacc parser
*/
void
int
parse_file (FILE *file)
{
int ret;
if (!file)
return;
return 1;
yylineno = 1;
yyin = file;
yyparse ();
ret = yyparse ();
yylex_destroy ();
return ret;
}