time_t mtime;
gchar *name;
gchar *canonical_name;
+ gchar *directory;
guint reload;
};
#define GTK_RC_MAX_DEFAULT_FILES 128
static gchar *gtk_rc_default_files[GTK_RC_MAX_DEFAULT_FILES];
-/* A stack of directories for RC files we are parsing currently.
- * these are implicitely added to the end of PIXMAP_PATHS
+/* A stack of information of RC files we are parsing currently.
+ * The directories for these files are implicitely added to the end of
+ * PIXMAP_PATHS.
*/
-static GSList *rc_dir_stack = NULL;
+static GSList *current_files_stack = NULL;
/* RC files and strings that are parsed for every context
*/
rc_file->is_string = TRUE;
rc_file->name = g_strdup (rc_string);
rc_file->canonical_name = NULL;
+ rc_file->directory = NULL;
rc_file->mtime = 0;
rc_file->reload = TRUE;
-
+
global_rc_files = g_slist_append (global_rc_files, rc_file);
for (tmp_list = rc_contexts; tmp_list; tmp_list = tmp_list->next)
rc_file->is_string = FALSE;
rc_file->name = g_strdup (filename);
rc_file->canonical_name = NULL;
+ rc_file->directory = NULL;
rc_file->mtime = 0;
rc_file->reload = reload;
context->default_priority = priority;
rc_file = add_to_rc_file_list (&context->rc_files, filename, reload);
-
+
if (!rc_file->canonical_name)
{
/* Get the absolute pathname */
rc_file->canonical_name = g_build_filename (cwd, rc_file->name, NULL);
g_free (cwd);
}
+
+ rc_file->directory = g_path_get_dirname (rc_file->canonical_name);
}
+ /* If the file is already being parsed (recursion), do nothing
+ */
+ if (g_slist_find (current_files_stack, rc_file))
+ return;
+
if (!lstat (rc_file->canonical_name, &statbuf))
{
gint fd;
- GSList *tmp_list;
-
+
rc_file->mtime = statbuf.st_mtime;
fd = open (rc_file->canonical_name, O_RDONLY);
if (fd < 0)
goto out;
- /* Temporarily push directory name for this file on
- * a stack of directory names while parsing it
+ /* Temporarily push information for this file on
+ * a stack of current files while parsing it.
*/
- rc_dir_stack =
- g_slist_prepend (rc_dir_stack,
- g_path_get_dirname (rc_file->canonical_name));
+ current_files_stack = g_slist_prepend (current_files_stack, rc_file);
gtk_rc_parse_any (context, filename, fd, NULL);
-
- tmp_list = rc_dir_stack;
- rc_dir_stack = rc_dir_stack->next;
-
- g_free (tmp_list->data);
- g_slist_free_1 (tmp_list);
+ current_files_stack = g_slist_delete_link (current_files_stack,
+ current_files_stack);
close (fd);
}
gchar *locale_suffixes[2];
gint n_locale_suffixes = 0;
gchar *p;
- const gchar *locale;
+ gchar *locale;
gint length, j;
gboolean found = FALSE;
-#ifdef G_OS_WIN32
- locale = g_win32_getlocale ();
-#else
- locale = setlocale (LC_CTYPE, NULL);
-#endif
+ locale = _gtk_get_lc_ctype ();
if (strcmp (locale, "C") && strcmp (locale, "POSIX"))
{
locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length);
}
}
+
+ g_free (locale);
gtk_rc_context_parse_one_file (context, filename, priority, reload);
for (j = 0; j < n_locale_suffixes; j++)
if (rc_file->canonical_name != rc_file->name)
g_free (rc_file->canonical_name);
+ g_free (rc_file->directory);
g_free (rc_file->name);
g_free (rc_file);
* so we can give meaningful error messages, and because on reparsing
* non-absolute paths don't make sense.
*/
- GSList *tmp_list = rc_dir_stack;
+ GSList *tmp_list = current_files_stack;
while (tmp_list)
{
- gchar *tmpname = g_build_filename (tmp_list->data, filename, NULL);
+ GtkRcFile *curfile = tmp_list->data;
+ gchar *tmpname = g_build_filename (curfile->directory, filename, NULL);
if (g_file_test (tmpname, G_FILE_TEST_EXISTS))
{
return filename;
}
- tmp_list = rc_dir_stack;
+ tmp_list = current_files_stack;
while (tmp_list)
{
- filename = gtk_rc_check_pixmap_dir (tmp_list->data, pixmap_file);
+ GtkRcFile *curfile = tmp_list->data;
+ filename = gtk_rc_check_pixmap_dir (curfile->directory, pixmap_file);
if (filename)
return filename;