aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xwin/winprefs.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xwin/winprefs.c')
-rw-r--r--xorg-server/hw/xwin/winprefs.c78
1 files changed, 58 insertions, 20 deletions
diff --git a/xorg-server/hw/xwin/winprefs.c b/xorg-server/hw/xwin/winprefs.c
index 440cdd2e7..b003f455d 100644
--- a/xorg-server/hw/xwin/winprefs.c
+++ b/xorg-server/hw/xwin/winprefs.c
@@ -53,8 +53,8 @@ extern const char *winGetBaseDir(void);
extern const char *g_pszLogFile;
-/* 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 */
@@ -712,6 +712,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
*/
@@ -720,16 +768,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");
@@ -739,16 +786,11 @@ LoadPreferences (void)
if (fname[strlen(fname)-1]!='/')
strcat (fname, "/");
strcat (fname, ".XWinrc");
-
- prefFile = fopen (fname, "r");
- if (prefFile)
- {
- winDebug ("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
@@ -757,18 +799,14 @@ LoadPreferences (void)
strncpy(buffer, SYSCONFDIR"/X11/system.XWinrc", sizeof(buffer));
#endif
buffer[sizeof(buffer)-1] = 0;
- prefFile = fopen (buffer, "r");
- if (prefFile)
- {
- winDebug ("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 */