severall fixes (close button, double entry in skin list, ...) default tip
author"Luc Saillard <luc@saillard.org>"
Sat Apr 26 12:44:54 2008 +0200 (3 weeks ago)
changeset 2509428139a0959
parent 2490ba774ab441b
severall fixes (close button, double entry in skin list, ...)

Now close button send the command "quit" to the daemon, and close the GTK application

Don't accept to add the same skin with the same name

Save the configuration when exiting the program
src/9mcc-config.c
src/9mcc-config.h
src/9mcc-gui.c
--- 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();
}