--- a/src/9mcc-config.c Thu Nov 29 17:51:58 2007 +0100
+++ b/src/9mcc-config.c Sat Apr 26 12:44:54 2008 +0200
@@ -67,6 +67,9 @@ static struct info info_default_properti
[INFO_STATUS] = { "state%d.png", "INFO_STATUS" },
};
+static GList *add_skin(char *filename, GList *skins) G_GNUC_WARN_UNUSED_RESULT;
+static GList *load_default_skins(GList *skins) G_GNUC_WARN_UNUSED_RESULT;
+static GList *load_my_skins(GKeyFile *INIfile, GList *skins) G_GNUC_WARN_UNUSED_RESULT;
static gboolean
ini_get_string(GKeyFile *keyFile, const char *section, const char *key, char **value)
@@ -134,77 +137,110 @@ ini_get_boolean(GKeyFile *keyFile, const
return TRUE;
}
-static void
-add_skin(char *filename, GList **skins)
-{
- struct skin_name *skin = g_malloc0(sizeof(struct skin_name));
- GKeyFile *INIfile = NULL;
-
- INIfile = g_key_file_new();
- if (!INIfile) {
- error("Unable to create GKeyFile object for %s !\n", filename);
- return;
- }
- if (g_key_file_load_from_file(INIfile, filename, G_KEY_FILE_NONE, NULL))
- {
- if (!ini_get_string(INIfile, "MAIN", "name", &skin->name))
- skin->name = g_strdup(_("no name"));
-
- skin->filename = g_strdup(filename);
-
- trace("add skin %s (%s)\n", skin->name, skin->filename);
- *skins = g_list_append(*skins, skin);
- }
+static GList *
+add_skin(char *filename, GList *skins)
+{
+ struct skin_name *skin;
+ char *skin_name;
+ GKeyFile *INIfile = NULL;
+ static int skin_index;
+ GList *list;
+
+ INIfile = g_key_file_new();
+ if (INIfile == NULL)
+ {
+ error("Unable to create GKeyFile object for %s !\n", filename);
+ return skins;
+ }
+
+ if (g_key_file_load_from_file(INIfile, filename, G_KEY_FILE_NONE, NULL) == FALSE)
+ {
+ g_key_file_free(INIfile);
+ return skins;
+ }
+
+
+ if (!ini_get_string(INIfile, "MAIN", "name", &skin_name))
+ skin_name = g_strdup_printf(_("no name %d"), ++skin_index);
+
+ /* Find duplicate entry */
+ list = skins;
+ while (list)
+ {
+ struct skin_name *s = list->data;
+
+ if (strcmp(s->name, skin_name) == 0)
+ {
+ trace("Found duplicate entry for %s\n", s->name);
+ g_free(skin_name);
g_key_file_free(INIfile);
-
-}
-
-static void
-load_default_skins(GList **skins)
-{
- GDir *dir;
- const char *name;
- char *filename;
- char *default_skin_path = PIXMAPSDIR;
-
- trace("search skins in %s\n", default_skin_path);
-
- if ((dir = g_dir_open(default_skin_path, 0, NULL)))
- {
- while ((name = g_dir_read_name(dir)))
- {
- filename = g_build_filename(default_skin_path, name, NULL);
- if (g_file_test(filename, G_FILE_TEST_IS_DIR))
- {
- g_free(filename);
- filename = g_build_filename(default_skin_path, name, "skin.desc", NULL);
- if (g_file_test(filename, G_FILE_TEST_EXISTS))
- {
- trace("found skin description in %s/%s\n", default_skin_path, name);
- add_skin(filename, skins);
- }
- g_free(filename);
- }
- else
- g_free(filename);
- }
- g_dir_close(dir);
- }
-}
-
-static void
-load_my_skins(GKeyFile *INIfile, GList **skins)
-{
- int i=1;
- char *filename, key[PATH_MAX] = "skin1";
-
- while (ini_get_string(INIfile, "SKIN", key, &filename))
- {
- trace("skin%d=%s\n", i, filename);
- add_skin(filename, skins);
- i++;
- snprintf(key, sizeof(key)-1, "skin%d", i);
- }
+ return skins;
+ }
+
+ list = list->next;
+ }
+
+ /* No previous theme found, so add it to the list */
+ trace("add skin %s (%s)\n", skin_name, filename);
+
+ skin = g_new0(struct skin_name, 1);
+ skin->name = skin_name;
+ skin->filename = g_strdup(filename);
+
+ skins = g_list_append(skins, skin);
+
+ g_key_file_free(INIfile);
+ return skins;
+}
+
+static GList *
+load_default_skins(GList *skins)
+{
+ GDir *dir;
+ const char *name;
+ char *filename;
+ char *default_skin_path = PIXMAPSDIR;
+
+ trace("search skins in %s\n", default_skin_path);
+
+ dir = g_dir_open(default_skin_path, 0, NULL);
+ if (dir == NULL)
+ return skins;
+
+ while ((name = g_dir_read_name(dir)))
+ {
+ filename = g_build_filename(default_skin_path, name, NULL);
+ if (g_file_test(filename, G_FILE_TEST_IS_DIR))
+ {
+ g_free(filename);
+ filename = g_build_filename(default_skin_path, name, "skin.desc", NULL);
+ if (g_file_test(filename, G_FILE_TEST_EXISTS))
+ {
+ trace("found skin description in %s/%s\n", default_skin_path, name);
+ skins = add_skin(filename, skins);
+ }
+ }
+ g_free(filename);
+ }
+ g_dir_close(dir);
+
+ return skins;
+}
+
+static GList *
+load_my_skins(GKeyFile *INIfile, GList *skins)
+{
+ int i=1;
+ char *filename, key[PATH_MAX] = "skin1";
+
+ while (ini_get_string(INIfile, "SKIN", key, &filename))
+ {
+ trace("skin%d=%s\n", i, filename);
+ skins = add_skin(filename, skins);
+ i++;
+ snprintf(key, sizeof(key), "skin%d", i);
+ }
+ return skins;
}
static gboolean
@@ -356,8 +392,8 @@ load_configuration(config_t *cfg) {
if (!cfg->skin)
cfg->skin = g_strconcat(PIXMAPSDIR, "/default/skin.desc", NULL);
- load_default_skins(&cfg->skins);
- load_my_skins(INIfile, &cfg->skins);
+ cfg->skins = load_default_skins(cfg->skins);
+ cfg->skins = load_my_skins(INIfile, cfg->skins);
g_key_file_free(INIfile);
--- a/src/9mcc-config.h Thu Nov 29 17:51:58 2007 +0100
+++ b/src/9mcc-config.h Sat Apr 26 12:44:54 2008 +0200
@@ -79,7 +79,7 @@ struct button
gboolean present;
GdkPixbuf *pixbuf_states[BUTTON_STATE_MAX];
- GtkWidget *image;
+ GtkWidget *image;
};
--- a/src/9mcc-gui.c Thu Nov 29 17:51:58 2007 +0100
+++ b/src/9mcc-gui.c Sat Apr 26 12:44:54 2008 +0200
@@ -106,6 +106,9 @@ static const char *datadirs[] =
NULL
};
+
+static void command_quit(int argc, char **argv);
+
void
show_main_window(void)
{
@@ -494,7 +497,13 @@ gui_button_release_event(
gui_button_set_state(button, BUTTON_STATE_MOUSE_OVER);
}
- send_master_command(button->command);
+ /* Special case when we are closing the application */
+ trace("button_command = [%s]\n", button->command);
+ if (strcmp(button->command, "quit\n") == 0)
+ command_quit(0, NULL);
+ else
+ send_master_command(button->command);
+
}
return TRUE;
@@ -638,11 +647,13 @@ gui_create_slider(int slider, GdkPixbuf
/*
* Action of contextual menu
*/
+#if ENABLE_TV
static void
on_tv_cb(GtkWidget *menuitem, gpointer userdata)
{
show_menu_television_dialog(NULL);
}
+#endif
static void
on_fullscreen_cb(GtkWidget *menuitem, gpointer userdata)
@@ -686,6 +697,7 @@ static void
static void
on_quit_cb(GtkWidget *menuitem, gpointer userdata)
{
+ save_configuration(&cfg);
send_master_command("stop\nquit\n");
gtk_main_quit();
}
@@ -1506,6 +1518,7 @@ static void command_quit(int argc, char
static void command_quit(int argc, char **argv)
{
save_configuration(&cfg);
+ send_master_command("stop\nquit\n");
gtk_main_quit();
}