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:
parent
47c7b6d3e6
commit
0659437f5e
|
@ -51,8 +51,8 @@
|
||||||
|
|
||||||
extern const char *winGetBaseDir(void);
|
extern const char *winGetBaseDir(void);
|
||||||
|
|
||||||
/* From winmultiwindowflex.l, the real parser */
|
/* From winprefslex.l, the real parser */
|
||||||
extern void parse_file (FILE *fp);
|
extern int parse_file (FILE *fp);
|
||||||
|
|
||||||
|
|
||||||
/* Currently in use command ID, incremented each new menu item created */
|
/* 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
|
* Try and open ~/.XWinrc and system.XWinrc
|
||||||
* Load it into prefs structure for use by other functions
|
* Load it into prefs structure for use by other functions
|
||||||
|
@ -718,16 +766,15 @@ LoadPreferences (void)
|
||||||
{
|
{
|
||||||
char *home;
|
char *home;
|
||||||
char fname[PATH_MAX+NAME_MAX+2];
|
char fname[PATH_MAX+NAME_MAX+2];
|
||||||
FILE *prefFile;
|
|
||||||
char szDisplay[512];
|
char szDisplay[512];
|
||||||
char *szEnvDisplay;
|
char *szEnvDisplay;
|
||||||
int i, j;
|
int i, j;
|
||||||
char param[PARAM_MAX+1];
|
char param[PARAM_MAX+1];
|
||||||
char *srcParam, *dstParam;
|
char *srcParam, *dstParam;
|
||||||
|
int parsed = FALSE;
|
||||||
|
|
||||||
/* First, clear all preference settings */
|
/* First, clear all preference settings */
|
||||||
memset (&pref, 0, sizeof(pref));
|
memset (&pref, 0, sizeof(pref));
|
||||||
prefFile = NULL;
|
|
||||||
|
|
||||||
/* Now try and find a ~/.xwinrc file */
|
/* Now try and find a ~/.xwinrc file */
|
||||||
home = getenv ("HOME");
|
home = getenv ("HOME");
|
||||||
|
@ -737,14 +784,11 @@ LoadPreferences (void)
|
||||||
if (fname[strlen(fname)-1]!='/')
|
if (fname[strlen(fname)-1]!='/')
|
||||||
strcat (fname, "/");
|
strcat (fname, "/");
|
||||||
strcat (fname, ".XWinrc");
|
strcat (fname, ".XWinrc");
|
||||||
|
parsed = winPrefsLoadPreferences(fname);
|
||||||
prefFile = fopen (fname, "r");
|
|
||||||
if (prefFile)
|
|
||||||
ErrorF ("winPrefsLoadPreferences: %s\n", fname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No home file found, check system default */
|
/* No home file found, check system default */
|
||||||
if (!prefFile)
|
if (!parsed)
|
||||||
{
|
{
|
||||||
char buffer[MAX_PATH];
|
char buffer[MAX_PATH];
|
||||||
#ifdef RELOCATE_PROJECTROOT
|
#ifdef RELOCATE_PROJECTROOT
|
||||||
|
@ -753,16 +797,14 @@ LoadPreferences (void)
|
||||||
strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
|
strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
|
||||||
#endif
|
#endif
|
||||||
buffer[sizeof(buffer)-1] = 0;
|
buffer[sizeof(buffer)-1] = 0;
|
||||||
prefFile = fopen (buffer, "r");
|
parsed = winPrefsLoadPreferences(buffer);
|
||||||
if (prefFile)
|
|
||||||
ErrorF ("winPrefsLoadPreferences: %s\n", buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we could open it, then read the settings and close it */
|
/* Neither user nor system configuration found, or were badly formed */
|
||||||
if (prefFile)
|
if (!parsed)
|
||||||
{
|
{
|
||||||
parse_file (prefFile);
|
ErrorF ("LoadPreferences: See \"man XWinrc\" to customize the XWin menu.\n");
|
||||||
fclose (prefFile);
|
parsed = winPrefsLoadPreferences(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Setup a DISPLAY environment variable, need to allocate on heap */
|
/* Setup a DISPLAY environment variable, need to allocate on heap */
|
||||||
|
|
|
@ -113,14 +113,18 @@ yywrap (void)
|
||||||
/*
|
/*
|
||||||
* Run a file through the yacc parser
|
* Run a file through the yacc parser
|
||||||
*/
|
*/
|
||||||
void
|
int
|
||||||
parse_file (FILE *file)
|
parse_file (FILE *file)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return;
|
return 1;
|
||||||
|
|
||||||
yylineno = 1;
|
yylineno = 1;
|
||||||
yyin = file;
|
yyin = file;
|
||||||
yyparse ();
|
ret = yyparse ();
|
||||||
|
yylex_destroy ();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user