(no subject)
"Kazantsev Anatoly" <[email protected]> Tue, 18 Jan 2005 06:14:27 +0300
| Newsgroups | gmane.comp.multimedia.xmms.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi! I've 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 _______________________________________________ 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