summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Cameron <brian.cameron@sun.com>2007-05-08 09:16:40 +0000
committerBrian Cameron <bcameron@src.gnome.org>2007-05-08 09:16:40 +0000
commitb4f7f2df918a61bc2adc0e8a66b3a0c9c98286d4 (patch)
treeef3ce5ae6f821a34d202e8e8bea0be9fc6fe08cb
parent5b46c244c17c2f27807a71cce89b9ee59bede6a6 (diff)
downloadgdm-b4f7f2df918a61bc2adc0e8a66b3a0c9c98286d4.tar.gz
Check for existance of a theme before selecting a random theme. Fixes bug
2007-05-08 Brian Cameron <brian.cameron@sun.com> * gui/greeter/greeter.c: Check for existance of a theme before selecting a random theme. Fixes bug #436800. Patch by Loic Minier <lool+gnome@via.ecp.fr> svn path=/trunk/; revision=4891
-rw-r--r--ChangeLog6
-rw-r--r--gui/greeter/greeter.c38
2 files changed, 37 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 8b473717..7d9e1694 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2007-05-08 Brian Cameron <brian.cameron@sun.com>
+ * gui/greeter/greeter.c: Check for existance of a theme before
+ selecting a random theme. Fixes bug #436800. Patch by Loic
+ Minier <lool+gnome@via.ecp.fr>
+
+2007-05-08 Brian Cameron <brian.cameron@sun.com>
+
* daemon/verify-pam.c: Avoid starting timed login if a username
is already entered. Fixes bug #436797. Patch by Loic Minier
<lool+gnome@via.ecp.fr>
diff --git a/gui/greeter/greeter.c b/gui/greeter/greeter.c
index 44279049..47c26722 100644
--- a/gui/greeter/greeter.c
+++ b/gui/greeter/greeter.c
@@ -98,15 +98,22 @@ greeter_ignore_buttons (gboolean val)
ignore_buttons = val;
}
-/* If in random theme mode then grab a random theme from those selected */
+static char *get_theme_file (const char *in, char **theme_dir);
+
+/* If in random theme mode then grab a random theme from those selected.
+ * If a theme doesn't exist, try the rest of the list from the randomly chosen
+ * position for one that does.
+ */
static char *
get_random_theme ()
{
char **vec;
- char *themes_list;
- char *theme;
+ char *themes_list;
+ char *theme = NULL;
+ char *dir;
int size;
- int i;
+ int chosen;
+ int i;
themes_list = gdm_config_get_string (GDM_KEY_GRAPHICAL_THEMES);
@@ -121,9 +128,26 @@ get_random_theme ()
for (size = 0; vec[size] != NULL; size++) {}
/* Get Random Theme from list */
- srand (time (NULL));
- i = rand () % size;
- theme = g_strdup (vec[i]);
+ srand ( time(NULL) );
+ chosen = rand() % size;
+
+ /* Find a theme that exists */
+ for (i = 0; i < size; i++) {
+ int j;
+ char *file;
+
+ j = (i + chosen >= size) ? i+chosen-size : i+chosen;
+ file = get_theme_file( vec[j], &dir );
+
+ g_free(file);
+ if (g_file_test(dir, G_FILE_TEST_IS_DIR)) {
+ g_free(dir);
+ theme = g_strdup (vec[j]);
+ break;
+ }
+ g_free(dir);
+ }
+
g_strfreev (vec);
return theme;