Skindir browser patch

"Kazantsev Anatoly" <[email protected]>
Newsgroups gmane.comp.multimedia.xmms.devel
Message-ID <[email protected]>
Hi!

My name is Kazantsev Tolya.

I implemented a task from Developers TODO list.
It is a dir browser for skins dialog.

This patch was tested with xmms-1.2.10-20041026cvs.

----
Kazantsev Anatoly
Omsk State University, Russia
jim-crow at rambler dot ru

_______________________________________________
xmms-devel mailing list
[email protected]
http://lists.xmms.org/mailman/listinfo/xmms-devel
dir-browser-patch.diff (application/octet-stream, 10 KB)
diff -urN xmms-1.2.10-20041026cvs/xmms/main.c xmms-1.2.10-20041026cvs-patch/xmms/main.c
--- xmms-1.2.10-20041026cvs/xmms/main.c	2004-05-24 04:45:17.000000000 +0700
+++ xmms-1.2.10-20041026cvs-patch/xmms/main.c	2004-11-07 15:17:46.000000000 +0600
@@ -477,6 +477,27 @@
 					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);
@@ -673,6 +694,13 @@
 		xmms_cfg_write_string(cfgfile, "xmms", str, node->data);
 		g_free(str);
 	}
+	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);
+	}
 	xmms_cfg_write_string(cfgfile, "xmms", "generic_title_format", cfg.gentitle_format);
 	
 	xmms_cfg_write_file(cfgfile, filename);
diff -urN xmms-1.2.10-20041026cvs/xmms/main.h xmms-1.2.10-20041026cvs-patch/xmms/main.h
--- xmms-1.2.10-20041026cvs/xmms/main.h	2004-03-03 04:45:16.000000000 +0600
+++ xmms-1.2.10-20041026cvs-patch/xmms/main.h	2004-11-07 15:16:26.000000000 +0600
@@ -60,6 +60,7 @@
 	gint mouse_change;
 	gboolean playlist_transparent;
         gchar *gentitle_format;
+	GList *skin_dirs;
 }
 Config;
 
diff -urN xmms-1.2.10-20041026cvs/xmms/playlist.c xmms-1.2.10-20041026cvs-patch/xmms/playlist.c
--- xmms-1.2.10-20041026cvs/xmms/playlist.c	2004-07-18 04:45:16.000000000 +0700
+++ xmms-1.2.10-20041026cvs-patch/xmms/playlist.c	2004-11-07 15:16:06.000000000 +0600
@@ -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-20041026cvs/xmms/skinwin.c xmms-1.2.10-20041026cvs-patch/xmms/skinwin.c
--- xmms-1.2.10-20041026cvs/xmms/skinwin.c	2001-06-16 06:03:33.000000000 +0700
+++ xmms-1.2.10-20041026cvs-patch/xmms/skinwin.c	2004-11-07 15:28:42.000000000 +0600
@@ -20,6 +20,11 @@
 
 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)
 {
@@ -27,6 +32,39 @@
 	return (TRUE);
 }
 
+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++;
+		update_skindirs_window();
+	}
+}
+
+gint skinwin_adddirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+	skinwin_dir_browser = xmms_create_dir_browser(_("Select directory to add:"), g_list_last(cfg.skin_dirs)->data, 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);
+}
+
+gint skinwin_deldirbutton_event(GtkWidget * widget, GdkEvent * event, gpointer data)
+{
+	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));
+	current_skindir--;
+	update_skindirs_window();
+	return (TRUE);
+}
+
 void change_skin_event(GtkWidget * widget, gint row, gint column, GdkEventButton * event)
 {
 	if (row == 0)
@@ -36,6 +74,12 @@
 
 }
 
+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 +88,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 +110,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 +139,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,36 +252,81 @@
 	g_free(data);
 }
 
-void scan_skins(void)
+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));
+	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);
+	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;
+				}
+		}
+	}
+}
+
+void update_skins_window(void)
+{
+	int i;
+	GList *entry;
+	char *none;
+
+	none = _("(none)");
+	
+	free_skinlist();
+	
+	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);
@@ -234,7 +346,8 @@
 
 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-20041026cvs/xmms/skinwin.h xmms-1.2.10-20041026cvs-patch/xmms/skinwin.h
--- xmms-1.2.10-20041026cvs/xmms/skinwin.h	2000-02-17 03:05:59.000000000 +0600
+++ xmms-1.2.10-20041026cvs-patch/xmms/skinwin.h	2004-11-07 15:29:19.000000000 +0600
@@ -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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.