[PATCH] Skin's directory browser
"Kazantsev Anatoly" <[email protected]> Wed, 02 Feb 2005 06:30:24 +0300
| Newsgroups | gmane.comp.multimedia.xmms.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi! I fixed bugs in my previous patch. ---- Kazantsev Anatoly _______________________________________________ xmms-devel mailing list [email protected] http://lists.xmms.org/mailman/listinfo/xmms-devel
skindir_browser-20040202.patch
(text/x-patch, 12.1 KB)
diff -urN xmms-1.2.10-20050113cvs/xmms/main.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.c
--- xmms-1.2.10-20050113cvs/xmms/main.c 2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.c 2005-01-31 14:09:23.000000000 +0000
@@ -477,10 +477,37 @@
cfg.url_history = g_list_append(cfg.url_history, temp);
}
}
+
+ gchar *temp;
+ if (xmms_cfg_read_int(cfgfile, "xmms", "skin_dirs_number", &length))
+ {
+ for(i = 0; i < length; i++)
+ {
+ gchar str[19];
+
+ sprintf(str, "skin_dir%d", i);
+ if (xmms_cfg_read_string(cfgfile, "xmms", str, &temp))
+ {
+ cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+ }
+ }
+ }
+ else
+ {
+ temp = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
+ cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+ }
+
xmms_cfg_read_string(cfgfile, "xmms", "generic_title_format", &cfg.gentitle_format);
xmms_cfg_free(cfgfile);
}
+ else
+ {
+ gchar *temp;
+ temp = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
+ cfg.skin_dirs = g_list_append(cfg.skin_dirs, temp);
+ }
if (cfg.playlist_font && strlen(cfg.playlist_font) == 0)
{
@@ -673,6 +700,20 @@
xmms_cfg_write_string(cfgfile, "xmms", str, node->data);
g_free(str);
}
+ if (g_list_length(cfg.skin_dirs) != 0)
+ {
+ xmms_cfg_write_int(cfgfile, "xmms", "skin_dirs_number", g_list_length(cfg.skin_dirs));
+ for (node = cfg.skin_dirs, i = 0; node; node = g_list_next(node), i++)
+ {
+ str = g_strdup_printf("skin_dir%d", i);
+ xmms_cfg_write_string(cfgfile, "xmms", str, node->data);
+ g_free(str);
+ }
+ }
+ else
+ {
+ xmms_cfg_write_int(cfgfile, "xmms", "skin_dirs_number", 0);
+ }
xmms_cfg_write_string(cfgfile, "xmms", "generic_title_format", cfg.gentitle_format);
xmms_cfg_write_file(cfgfile, filename);
diff -urN xmms-1.2.10-20050113cvs/xmms/main.h xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.h
--- xmms-1.2.10-20050113cvs/xmms/main.h 2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/main.h 2005-01-31 11:15:57.000000000 +0000
@@ -60,6 +60,7 @@
gint mouse_change;
gboolean playlist_transparent;
gchar *gentitle_format;
+ GList *skin_dirs;
}
Config;
diff -urN xmms-1.2.10-20050113cvs/xmms/playlist.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/playlist.c
--- xmms-1.2.10-20050113cvs/xmms/playlist.c 2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/playlist.c 2005-01-31 11:15:57.000000000 +0000
@@ -576,9 +576,8 @@
load_skin(skin->path);
}
}
- /* Call scan_skins() again to make sure skin selector */
- /* is up to date */
- scan_skins();
+ find_current_skindir();
+ update_skindirs_window();
}
if (get_input_playing())
diff -urN xmms-1.2.10-20050113cvs/xmms/skinwin.c xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.c
--- xmms-1.2.10-20050113cvs/xmms/skinwin.c 2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.c 2005-02-02 00:00:34.000000000 +0000
@@ -20,14 +20,71 @@
GtkWidget *skinwin, *skinwin_list, *skinwin_close;
GList *skinlist = NULL;
+GtkWidget *skinwin_adddirbutton;
+GtkWidget *skinwin_deldirbutton;
+GtkWidget *skinwin_dir_browser;
+GtkWidget *skinwin_dirlist;
+gint current_skindir = 0;
-gint skinwin_delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+static void update_skins_window(void);
+
+static gint skinwin_delete_event(GtkWidget * widget, GdkEvent * event, gpointer data)
{
gtk_widget_hide(skinwin);
return (TRUE);
}
-void change_skin_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
+static gint skindirs_compare_func(gconstpointer a, gconstpointer b)
+{
+ return strcasecmp(a, b);
+}
+
+static void skinwin_add_dir_handler(gchar *dir)
+{
+ if(!g_list_find_custom(cfg.skin_dirs, dir, skindirs_compare_func))
+ {
+ cfg.skin_dirs = g_list_append(cfg.skin_dirs, g_strdup(dir));
+ current_skindir = g_list_length(cfg.skin_dirs) - 1;
+ update_skindirs_window();
+ }
+}
+
+static gint skinwin_adddirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+ gchar *path;
+ if (g_list_last(cfg.skin_dirs) != NULL)
+ {
+ path = g_list_last(cfg.skin_dirs)->data;
+ }
+ else
+ {
+ path = NULL;
+ }
+ skinwin_dir_browser = xmms_create_dir_browser(_("Select directory to add:"), path, GTK_SELECTION_SINGLE, skinwin_add_dir_handler);
+ gtk_signal_connect(GTK_OBJECT(skinwin_dir_browser), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &skinwin_dir_browser);
+ gtk_window_set_transient_for(GTK_WINDOW(skinwin_dir_browser), GTK_WINDOW(skinwin));
+ gtk_widget_show(skinwin_dir_browser);
+ return (TRUE);
+}
+
+static gint skinwin_deldirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+ if (g_list_nth(cfg.skin_dirs, current_skindir) != NULL)
+ {
+
+ int length = g_list_length(cfg.skin_dirs);
+ g_free(g_list_nth(cfg.skin_dirs, current_skindir)->data);
+ cfg.skin_dirs = g_list_remove_link(cfg.skin_dirs, g_list_nth(cfg.skin_dirs, current_skindir));
+ if (current_skindir == length - 1)
+ {
+ current_skindir--;
+ }
+ update_skindirs_window();
+ }
+ return (TRUE);
+}
+
+static void change_skin_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
{
if (row == 0)
load_skin(NULL);
@@ -36,6 +93,12 @@
}
+static void change_dir_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
+{
+ current_skindir = row;
+ update_skins_window();
+}
+
static void enable_random_skin_event(GtkWidget * widget, gpointer data)
{
cfg.random_skin_on_play = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
@@ -44,7 +107,7 @@
void create_skin_window(void)
{
char *titles[1];
- GtkWidget *vbox, *hbox, *main_hbox, *separator, *scrolled_win, *checkbox;
+ GtkWidget *vbox, *hbox, *main_hbox, *separator, *scrolled_win, *checkbox, *scrolled_dirwin;
skinwin = gtk_window_new(GTK_WINDOW_DIALOG);
gtk_window_set_title(GTK_WINDOW(skinwin), _("Skin selector"));
@@ -66,7 +129,19 @@
gtk_container_border_width(GTK_CONTAINER(scrolled_win), 5);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(vbox), scrolled_win, TRUE, TRUE, 0);
-
+
+ titles[0] = _("Directories");
+ skinwin_dirlist = gtk_clist_new_with_titles(1, titles);
+ gtk_clist_column_titles_passive(GTK_CLIST(skinwin_dirlist));
+ gtk_clist_set_selection_mode(GTK_CLIST(skinwin_dirlist), GTK_SELECTION_SINGLE);
+ gtk_signal_connect(GTK_OBJECT(skinwin_dirlist), "select_row", GTK_SIGNAL_FUNC(change_dir_event), NULL);
+ gtk_widget_set_usize(skinwin_dirlist, 250, 200);
+ scrolled_dirwin = gtk_scrolled_window_new(NULL, NULL);
+ gtk_container_add(GTK_CONTAINER(scrolled_dirwin), skinwin_dirlist);
+ gtk_container_border_width(GTK_CONTAINER(scrolled_dirwin), 5);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_dirwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_box_pack_start(GTK_BOX(vbox), scrolled_dirwin, TRUE, TRUE, 0);
+
separator = gtk_hseparator_new();
gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, TRUE, 0);
@@ -83,6 +158,17 @@
gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbox), 5);
gtk_box_pack_start(GTK_BOX(main_hbox), hbox, TRUE, TRUE, 0);
+
+ skinwin_adddirbutton = gtk_button_new_with_label(_("Add directory"));
+ GTK_WIDGET_SET_FLAGS(skinwin_adddirbutton, GTK_CAN_DEFAULT);
+ gtk_signal_connect(GTK_OBJECT(skinwin_adddirbutton), "clicked", GTK_SIGNAL_FUNC(skinwin_adddirbutton_event), NULL);
+ gtk_box_pack_start(GTK_BOX(hbox), skinwin_adddirbutton, FALSE, FALSE, 0);
+
+ skinwin_deldirbutton = gtk_button_new_with_label(_("Delete directory"));
+ GTK_WIDGET_SET_FLAGS(skinwin_deldirbutton, GTK_CAN_DEFAULT);
+ gtk_signal_connect(GTK_OBJECT(skinwin_deldirbutton), "clicked", GTK_SIGNAL_FUNC(skinwin_deldirbutton_event), NULL);
+ gtk_box_pack_start(GTK_BOX(hbox), skinwin_deldirbutton, FALSE, FALSE, 0);
+
skinwin_close = gtk_button_new_with_label(_("Close"));
GTK_WIDGET_SET_FLAGS(skinwin_close, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(skinwin_close), "clicked", GTK_SIGNAL_FUNC(skinwin_delete_event), NULL);
@@ -185,56 +271,124 @@
g_free(data);
}
-void scan_skins(void)
+static void free_skinlist(void)
{
- int i;
- GList *entry;
- char *none, *str, *skinsdir;
- gchar **list;
-
- none = _("(none)");
if (skinlist)
{
g_list_foreach(skinlist, skin_free_func, NULL);
g_list_free(skinlist);
}
skinlist = NULL;
- str = g_strconcat(g_get_home_dir(), "/.xmms/Skins", NULL);
- scan_skindir(str);
- g_free(str);
- str = g_strconcat(DATA_DIR, "/Skins", NULL);
- scan_skindir(str);
- g_free(str);
- skinlist = g_list_sort(skinlist, skinlist_compare_func);
- skinsdir = getenv("SKINSDIR");
- if (skinsdir)
- {
- list = g_strsplit(skinsdir, ":", 0);
- i = 0;
- while (list[i])
- scan_skindir(list[i++]);
+}
+
+void update_skindirs_window(void)
+{
+ gint i;
+ gchar *text[1];
+
+ gtk_clist_freeze(GTK_CLIST(skinwin_dirlist));
+ gtk_clist_clear(GTK_CLIST(skinwin_dirlist));
+
+ if (g_list_length(cfg.skin_dirs) != 0)
+ {
+ for(i = 0; i < g_list_length(cfg.skin_dirs); i++)
+ {
+ text[0] = g_list_nth_data(cfg.skin_dirs, i);
+ gtk_clist_append(GTK_CLIST(skinwin_dirlist), text);
+ }
+ gtk_clist_select_row(GTK_CLIST(skinwin_dirlist), current_skindir, 0);
+ }
+ else
+ {
+ update_skins_window();
+ }
+ gtk_clist_thaw(GTK_CLIST(skinwin_dirlist));
+}
+
+void scan_skins(void)
+{
+ gint i;
+
+ free_skinlist();
+
+ for (i = 0; i < g_list_length(cfg.skin_dirs); i++)
+ {
+ scan_skindir(g_list_nth(cfg.skin_dirs, i)->data);
+ }
+}
+
+void find_current_skindir(void)
+{
+ gint i, n;
+ GList *entry;
+
+ if (!skin->path) return;
+
+ free_skinlist();
+
+ for (i = 0; i < g_list_length(cfg.skin_dirs); i++)
+ {
+ scan_skindir(g_list_nth(cfg.skin_dirs, i)->data);
+ for (n = 0; n < g_list_length(skinlist); n++)
+ {
+ entry = g_list_nth(skinlist, n);
+ if (skin->path)
+ if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
+ {
+ current_skindir = i;
+ return;
+ }
+ }
+ }
+}
+
+static void update_skins_window(void)
+{
+ int i;
+ GList *entry;
+ char *none;
+
+ none = _("(none)");
+
+ free_skinlist();
+
+ if (g_list_length(cfg.skin_dirs) != 0)
+ {
+ scan_skindir(g_list_nth(cfg.skin_dirs, current_skindir)->data);
}
gtk_clist_freeze(GTK_CLIST(skinwin_list));
gtk_clist_clear(GTK_CLIST(skinwin_list));
gtk_clist_append(GTK_CLIST(skinwin_list), &none);
- if (!skin->path)
+
+ if (g_list_length(cfg.skin_dirs) == 0)
+ {
gtk_clist_select_row(GTK_CLIST(skinwin_list), 0, 0);
+ }
+ else
+ {
+ if (!skin->path)
+ {
+ gtk_clist_select_row(GTK_CLIST(skinwin_list), 0, 0);
+ }
- for (i = 0; i < g_list_length(skinlist); i++)
- {
- entry = g_list_nth(skinlist, i);
- gtk_clist_append(GTK_CLIST(skinwin_list), (gchar **) & ((struct SkinNode *) entry->data)->name);
- if (skin->path)
- if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
- gtk_clist_select_row(GTK_CLIST(skinwin_list), i + 1, 0);
+ for (i = 0; i < g_list_length(skinlist); i++)
+ {
+ entry = g_list_nth(skinlist, i);
+ gtk_clist_append(GTK_CLIST(skinwin_list), (gchar **) & ((struct SkinNode *) entry->data)->name);
+ if (skin->path)
+ if (!strcmp(((struct SkinNode *) entry->data)->path, skin->path))
+ gtk_clist_select_row(GTK_CLIST(skinwin_list), i + 1, 0);
+ }
}
+
gtk_clist_thaw(GTK_CLIST(skinwin_list));
}
void show_skin_window(void)
{
- scan_skins();
+ find_current_skindir();
+ update_skindirs_window();
gtk_window_set_position(GTK_WINDOW(skinwin), GTK_WIN_POS_MOUSE);
gtk_widget_show_all(skinwin);
gtk_widget_grab_focus(skinwin_list);
diff -urN xmms-1.2.10-20050113cvs/xmms/skinwin.h xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.h
--- xmms-1.2.10-20050113cvs/xmms/skinwin.h 2005-02-02 00:08:07.000000000 +0000
+++ xmms-1.2.10-20050113cvs.skindir-browser/xmms/skinwin.h 2005-01-31 11:15:57.000000000 +0000
@@ -19,6 +19,8 @@
#ifndef SKINWIN_H
#define SKINWIN_H
+#include "libxmms/dirbrowser.h"
+
extern GList *skinlist;
struct SkinNode
@@ -29,5 +31,7 @@
void create_skin_window(void);
void show_skin_window(void);
void scan_skins(void);
+void find_current_skindir(void);
+void update_skindirs_window(void);
#endif