changeset 2690:a8328c40a5c1

more work on skins plugin settings
author Tomasz Mon <desowin@gmail.com>
date Fri, 06 Jun 2008 12:52:49 +0200
parents 996281c0a457
children 1d2596522075
files src/skins/plugin.c src/skins/plugin.h src/skins/skins_cfg.c src/skins/skins_cfg.h src/skins/ui_main.c
diffstat 5 files changed, 403 insertions(+), 199 deletions(-) [+]
line wrap: on
line diff
--- a/src/skins/plugin.c	Fri Jun 06 13:41:12 2008 +0300
+++ b/src/skins/plugin.c	Fri Jun 06 12:52:49 2008 +0200
@@ -22,19 +22,13 @@
 #include "plugin.h"
 #include "skins_cfg.h"
 #include "ui_skin.h"
-#include "ui_skinned_window.h"
 #include "ui_manager.h"
 #include "icons-stock.h"
 #include "ui_main_evlisteners.h"
 #include "ui_playlist_evlisteners.h"
-#include "ui_skinned_textbox.h"
-#include "ui_skinned_playlist.h"
-#include "ui_skinselector.h"
 #include <audacious/i18n.h>
 #include <libintl.h>
 
-#define PACKAGE "audacious-plugins"
-
 gchar *skins_paths[SKINS_PATH_COUNT] = {};
 
 GeneralPlugin skins_gp =
@@ -50,10 +44,6 @@
 SIMPLE_GENERAL_PLUGIN(skins, skins_gplist);
 gboolean plugin_is_active = FALSE;
 
-
-GtkWidget *skin_view;
-GtkWidget *skin_refresh_button;
-
 static void skins_free_paths(void) {
     int i;
 
@@ -127,191 +117,6 @@
     return;
 }
 
-static void
-playlist_show_pl_separator_numbers_cb()
-{
-    playlistwin_update_list(aud_playlist_get_active());
-}
-
-static void
-mainwin_font_set_cb()
-{
-    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
-}
-
-static void
-playlist_font_set_cb()
-{
-    AUDDBG("Attempt to set font \"%s\"\n", config.playlist_font);
-    ui_skinned_playlist_set_font(config.playlist_font);
-    playlistwin_set_sinfo_font(config.playlist_font);  /* propagate font setting to playlistwin_sinfo */
-    playlistwin_update_list(aud_playlist_get_active());
-}
-
-static void
-bitmap_fonts_cb()
-{
-    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
-    playlistwin_set_sinfo_font(config.playlist_font);
-
-    if (config.playlist_shaded) {
-        playlistwin_update_list(aud_playlist_get_active());
-        ui_skinned_window_draw_all(playlistwin);
-    }
-}
-
-static void
-show_wm_decorations_cb()
-{
-    gtk_window_set_decorated(GTK_WINDOW(mainwin), config.show_wm_decorations);
-    gtk_window_set_decorated(GTK_WINDOW(playlistwin), config.show_wm_decorations);
-    gtk_window_set_decorated(GTK_WINDOW(equalizerwin), config.show_wm_decorations);
-}
-
-static PreferencesWidget appearance_misc_widgets[] = {
-    {WIDGET_LABEL, N_("<b>_Fonts</b>"), NULL, NULL, NULL, FALSE},
-    {WIDGET_FONT_BTN, N_("_Player:"), &config.mainwin_font, G_CALLBACK(mainwin_font_set_cb), N_("Select main player window font:"), FALSE},
-    {WIDGET_FONT_BTN, N_("_Playlist:"), &config.playlist_font, G_CALLBACK(playlist_font_set_cb), N_("Select playlist font:"), FALSE},
-    {WIDGET_CHK_BTN, N_("Use Bitmap fonts if available"), &config.mainwin_use_bitmapfont, G_CALLBACK(bitmap_fonts_cb), N_("Use bitmap fonts if they are available. Bitmap fonts do not support Unicode strings."), FALSE},
-    {WIDGET_LABEL, N_("<b>_Miscellaneous</b>"), NULL, NULL, NULL, FALSE},
-    {WIDGET_CHK_BTN, N_("Show track numbers in playlist"), &config.show_numbers_in_pl,
-        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
-    {WIDGET_CHK_BTN, N_("Show separators in playlist"), &config.show_separator_in_pl,
-        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
-    {WIDGET_CHK_BTN, N_("Show window manager decoration"), &config.show_wm_decorations, G_CALLBACK(show_wm_decorations_cb),
-        N_("This enables the window manager to show decorations for windows."), FALSE},
-    {WIDGET_CHK_BTN, N_("Use two-way text scroller"), &config.twoway_scroll, NULL,
-        N_("If selected, the file information text in the main window will scroll back and forth. If not selected, the text will only scroll in one direction."), FALSE},
-    {WIDGET_CHK_BTN, N_("Disable inline gtk theme"), &config.disable_inline_gtk, NULL, NULL, FALSE},
-    {WIDGET_CHK_BTN, N_("Allow loading incomplete skins"), &config.allow_broken_skins, NULL,
-        N_("If selected, audacious won't refuse loading broken skins. Use only if your favourite skin doesn't work"), FALSE},
-};
-
-static gboolean
-on_skin_view_realize(GtkTreeView * treeview,
-                     gpointer data)
-{
-    skin_view_realize(treeview);
-    skin_view_update(GTK_TREE_VIEW(skin_view), GTK_WIDGET(skin_refresh_button));
-
-    return TRUE;
-}
-
-void skins_configure(void) {
-    static GtkWidget *cfg_win = NULL;
-    GtkWidget *appearance_page_vbox;
-    GtkWidget *vbox37;
-    GtkWidget *vbox38;
-    GtkWidget *hbox12;
-    GtkWidget *alignment94;
-    GtkWidget *hbox13;
-    GtkWidget *label103;
-    GtkWidget *colorspace_button;
-    GtkWidget *image11;
-    GtkWidget *image12;
-    GtkWidget *alignment95;
-    GtkWidget *skin_view_scrolled_window;
-
-    if (cfg_win != NULL) {
-        gtk_window_present(GTK_WINDOW(cfg_win));
-        return;
-    }
-
-    cfg_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_type_hint(GTK_WINDOW(cfg_win), GDK_WINDOW_TYPE_HINT_DIALOG);
-    gtk_window_set_title(GTK_WINDOW(cfg_win), _("Audacious Skinned GUI Configuration"));
-    gtk_container_set_border_width(GTK_CONTAINER(cfg_win), 10);
-    g_signal_connect(G_OBJECT(cfg_win), "destroy" ,
-                     G_CALLBACK(gtk_widget_destroyed), &cfg_win);
-    gtk_widget_set_size_request(cfg_win, 500, -1);
-
-    appearance_page_vbox = gtk_vbox_new (FALSE, 0);
-    gtk_container_add(GTK_CONTAINER(cfg_win), appearance_page_vbox);
-
-    vbox37 = gtk_vbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (appearance_page_vbox), vbox37, TRUE, TRUE, 0);
-
-    vbox38 = gtk_vbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (vbox37), vbox38, FALSE, TRUE, 0);
-
-    hbox12 = gtk_hbox_new (FALSE, 0);
-    gtk_box_pack_start (GTK_BOX (vbox38), hbox12, TRUE, TRUE, 0);
-
-    alignment94 = gtk_alignment_new (0.5, 0.5, 1, 1);
-    gtk_box_pack_start (GTK_BOX (hbox12), alignment94, TRUE, TRUE, 0);
-    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment94), 0, 4, 0, 0);
-
-    hbox13 = gtk_hbox_new (FALSE, 0);
-    gtk_container_add (GTK_CONTAINER (alignment94), hbox13);
-
-    label103 = gtk_label_new_with_mnemonic (_("<b>_Skin</b>"));
-    gtk_box_pack_start (GTK_BOX (hbox13), label103, TRUE, TRUE, 0);
-    gtk_label_set_use_markup (GTK_LABEL (label103), TRUE);
-    gtk_misc_set_alignment (GTK_MISC (label103), 0, 0);
-
-    colorspace_button = gtk_button_new ();
-    gtk_box_pack_start (GTK_BOX (hbox13), colorspace_button, FALSE, FALSE, 0);
-
-    image11 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_BUTTON);
-    gtk_container_add (GTK_CONTAINER (colorspace_button), image11);
-
-    skin_refresh_button = gtk_button_new ();
-    gtk_box_pack_start (GTK_BOX (hbox13), skin_refresh_button, FALSE, FALSE, 0);
-    GTK_WIDGET_UNSET_FLAGS (skin_refresh_button, GTK_CAN_FOCUS);
-    gtk_button_set_relief (GTK_BUTTON (skin_refresh_button), GTK_RELIEF_HALF);
-    gtk_button_set_focus_on_click (GTK_BUTTON (skin_refresh_button), FALSE);
-
-    image12 = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_BUTTON);
-    gtk_container_add (GTK_CONTAINER (skin_refresh_button), image12);
-
-    alignment95 = gtk_alignment_new (0.5, 0.5, 1, 1);
-    gtk_box_pack_start (GTK_BOX (vbox38), alignment95, TRUE, TRUE, 0);
-    gtk_widget_set_size_request (alignment95, -1, 172);
-    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment95), 0, 0, 12, 0);
-
-    skin_view_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-    gtk_container_add (GTK_CONTAINER (alignment95), skin_view_scrolled_window);
-    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_SHADOW_IN);
-
-    skin_view = gtk_tree_view_new ();
-    gtk_container_add (GTK_CONTAINER (skin_view_scrolled_window), skin_view);
-    gtk_widget_set_size_request (skin_view, -1, 100);
-
-    aud_create_widgets(GTK_BOX(vbox37), appearance_misc_widgets, G_N_ELEMENTS(appearance_misc_widgets));
-    gtk_widget_show_all(appearance_page_vbox);
-
-#if 0
-    g_signal_connect(G_OBJECT(colorspace_button), "clicked",
-                     G_CALLBACK(on_colorize_button_clicked),
-                     NULL);
-
-    g_signal_connect(skin_view, "drag-data-received",
-                     G_CALLBACK(on_skin_view_drag_data_received),
-                     NULL);
-    aud_drag_dest_set(skin_view);
-
-    g_signal_connect(mainwin, "drag-data-received",
-                     G_CALLBACK(mainwin_drag_data_received),
-                     skin_view);
-
-    g_signal_connect(skin_refresh_button, "clicked",
-                     G_CALLBACK(on_skin_refresh_button_clicked),
-                     NULL);
-
-    g_signal_connect_swapped(G_OBJECT(skin_refresh_button), "clicked",
-                             G_CALLBACK(on_skin_refresh_button_clicked),
-                             prefswin);
-#endif
-    g_signal_connect_after(G_OBJECT(skin_view), "realize",
-                           G_CALLBACK(on_skin_view_realize),
-                           NULL);
-
-    gtk_window_present(GTK_WINDOW(cfg_win));
-
-    return;
-}
-
 void skins_about(void) {
     static GtkWidget* about_window = NULL;
 
--- a/src/skins/plugin.h	Fri Jun 06 13:41:12 2008 +0300
+++ b/src/skins/plugin.h	Fri Jun 06 12:52:49 2008 +0200
@@ -29,6 +29,7 @@
 #include "ui_playlist.h"
 #include "ui_skin.h"
 
+#define PACKAGE "audacious-plugins"
 #define PACKAGE_NAME "audacious-plugins"
 
 enum {
@@ -41,7 +42,6 @@
 
 void skins_init(void);
 void skins_cleanup(void);
-void skins_configure(void);
 void skins_about(void);
 
 #endif
--- a/src/skins/skins_cfg.c	Fri Jun 06 13:41:12 2008 +0300
+++ b/src/skins/skins_cfg.c	Fri Jun 06 12:52:49 2008 +0200
@@ -24,12 +24,31 @@
 #include "ui_vis.h"
 #include "ui_main.h"
 #include "ui_playlist.h"
+#include "ui_skinned_window.h"
+#include "ui_skinned_textbox.h"
+#include "ui_skinned_playlist.h"
+#include "ui_skinselector.h"
+#include "plugin.h"
+#include "dnd.h"
+#include "util.h"
 #include <glib.h>
 #include <stdlib.h>
-#include <audacious/plugin.h>
+#include <audacious/i18n.h>
+#include <libintl.h>
 
 skins_cfg_t config;
 
+
+static GtkWidget *cfg_win = NULL;
+GtkWidget *skin_view;
+GtkWidget *skin_refresh_button;
+static GtkWidget *colorize_settings = NULL;
+/* colorize settings scales */
+GtkWidget *green_scale;
+GtkWidget *red_scale;
+GtkWidget *blue_scale;
+
+
 skins_cfg_t skins_default_config = {
     .scaled = FALSE,
     .autoscroll = TRUE,
@@ -263,3 +282,381 @@
 
     aud_cfg_db_close(cfgfile);
 }
+
+
+static void
+playlist_show_pl_separator_numbers_cb()
+{
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+mainwin_font_set_cb()
+{
+    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
+}
+
+static void
+playlist_font_set_cb()
+{
+    AUDDBG("Attempt to set font \"%s\"\n", config.playlist_font);
+    ui_skinned_playlist_set_font(config.playlist_font);
+    playlistwin_set_sinfo_font(config.playlist_font);  /* propagate font setting to playlistwin_sinfo */
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+bitmap_fonts_cb()
+{
+    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
+    playlistwin_set_sinfo_font(config.playlist_font);
+
+    if (config.playlist_shaded) {
+        playlistwin_update_list(aud_playlist_get_active());
+        ui_skinned_window_draw_all(playlistwin);
+    }
+}
+
+static void
+show_wm_decorations_cb()
+{
+    gtk_window_set_decorated(GTK_WINDOW(mainwin), config.show_wm_decorations);
+    gtk_window_set_decorated(GTK_WINDOW(playlistwin), config.show_wm_decorations);
+    gtk_window_set_decorated(GTK_WINDOW(equalizerwin), config.show_wm_decorations);
+}
+
+static PreferencesWidget appearance_misc_widgets[] = {
+    {WIDGET_LABEL, N_("<b>_Fonts</b>"), NULL, NULL, NULL, FALSE},
+    {WIDGET_FONT_BTN, N_("_Player:"), &config.mainwin_font, G_CALLBACK(mainwin_font_set_cb), N_("Select main player window font:"), FALSE},
+    {WIDGET_FONT_BTN, N_("_Playlist:"), &config.playlist_font, G_CALLBACK(playlist_font_set_cb), N_("Select playlist font:"), FALSE},
+    {WIDGET_CHK_BTN, N_("Use Bitmap fonts if available"), &config.mainwin_use_bitmapfont, G_CALLBACK(bitmap_fonts_cb), N_("Use bitmap fonts if they are available. Bitmap fonts do not support Unicode strings."), FALSE},
+    {WIDGET_LABEL, N_("<b>_Miscellaneous</b>"), NULL, NULL, NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show track numbers in playlist"), &config.show_numbers_in_pl,
+        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show separators in playlist"), &config.show_separator_in_pl,
+        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show window manager decoration"), &config.show_wm_decorations, G_CALLBACK(show_wm_decorations_cb),
+        N_("This enables the window manager to show decorations for windows."), FALSE},
+    {WIDGET_CHK_BTN, N_("Use two-way text scroller"), &config.twoway_scroll, NULL,
+        N_("If selected, the file information text in the main window will scroll back and forth. If not selected, the text will only scroll in one direction."), FALSE},
+    {WIDGET_CHK_BTN, N_("Disable inline gtk theme"), &config.disable_inline_gtk, NULL, NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Allow loading incomplete skins"), &config.allow_broken_skins, NULL,
+        N_("If selected, audacious won't refuse loading broken skins. Use only if your favourite skin doesn't work"), FALSE},
+};
+
+static gboolean
+on_skin_view_realize(GtkTreeView * treeview,
+                     gpointer data)
+{
+    skin_view_realize(treeview);
+    skin_view_update(GTK_TREE_VIEW(skin_view), GTK_WIDGET(skin_refresh_button));
+
+    return TRUE;
+}
+
+static void
+reload_skin()
+{
+    /* reload the skin to apply the change */
+    skin_reload_forced();
+    ui_skinned_window_draw_all(mainwin);
+    ui_skinned_window_draw_all(equalizerwin);
+    ui_skinned_window_draw_all(playlistwin);
+}
+
+static void
+on_red_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_r = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_green_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_g = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_blue_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_b = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_colorize_close_clicked(GtkButton *button, gpointer data)
+{
+    gtk_widget_destroy(colorize_settings);
+    colorize_settings = NULL;
+}
+
+void
+create_colorize_settings(void)
+{
+    GtkWidget *vbox;
+    GtkWidget *label;
+    GtkWidget *table;
+    GtkWidget *hbuttonbox;
+    GtkWidget *colorize_close;
+
+    GtkWidget *green_label;
+    GtkWidget *red_label;
+    GtkWidget *blue_label;
+
+    colorize_settings = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_container_set_border_width(GTK_CONTAINER(colorize_settings), 12);
+    gtk_window_set_title(GTK_WINDOW(colorize_settings), _("Color Adjustment"));
+    gtk_window_set_type_hint(GTK_WINDOW(colorize_settings), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_transient_for(GTK_WINDOW(colorize_settings), GTK_WINDOW(cfg_win));
+
+    vbox = gtk_vbox_new(FALSE, 12);
+    gtk_container_add(GTK_CONTAINER(colorize_settings), vbox);
+
+    label = gtk_label_new(_("Audacious allows you to alter the color balance of the skinned UI. The sliders below will allow you to do this."));
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+    gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+
+    table = gtk_table_new(3, 2, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 6);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+
+    blue_label = gtk_label_new(_("Blue"));
+    gtk_table_attach(GTK_TABLE(table), blue_label, 0, 1, 2, 3,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(blue_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(blue_label), 1, 0.5);
+
+    green_label = gtk_label_new(_("Green"));
+    gtk_table_attach(GTK_TABLE(table), green_label, 0, 1, 1, 2,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(green_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(green_label), 1, 0.5);
+
+    red_label = gtk_label_new(_("Red"));
+    gtk_table_attach(GTK_TABLE(table), red_label, 0, 1, 0, 1,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(red_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(red_label), 1, 0.5);
+
+    red_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), red_scale, 1, 2, 0, 1,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(red_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(red_scale), 3);
+
+    green_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), green_scale, 1, 2, 1, 2,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(green_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(green_scale), 3);
+
+    blue_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), blue_scale, 1, 2, 2, 3,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(blue_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(blue_scale), 3);
+
+    hbuttonbox = gtk_hbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
+    gtk_box_set_spacing(GTK_BOX(hbuttonbox), 6);
+
+    colorize_close = gtk_button_new_from_stock("gtk-close");
+    gtk_container_add(GTK_CONTAINER(hbuttonbox), colorize_close);
+    GTK_WIDGET_SET_FLAGS(colorize_close, GTK_CAN_DEFAULT);
+
+    g_signal_connect((gpointer) red_scale, "value_changed",
+                     G_CALLBACK(on_red_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) green_scale, "value_changed",
+                     G_CALLBACK(on_green_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) blue_scale, "value_changed",
+                     G_CALLBACK(on_blue_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) colorize_close, "clicked",
+                     G_CALLBACK(on_colorize_close_clicked),
+                     NULL);
+
+    gtk_range_set_value(GTK_RANGE(red_scale), config.colorize_r);
+    gtk_range_set_value(GTK_RANGE(green_scale), config.colorize_g);
+    gtk_range_set_value(GTK_RANGE(blue_scale), config.colorize_b);
+
+    gtk_widget_grab_default(colorize_close);
+    gtk_widget_show_all(colorize_settings);
+}
+
+static void
+on_colorize_button_clicked(GtkButton *button, gpointer data)
+{
+    if (colorize_settings)
+        gtk_window_present(GTK_WINDOW(colorize_settings));
+    else
+        create_colorize_settings();
+}
+
+void
+on_skin_view_drag_data_received(GtkWidget * widget,
+                                GdkDragContext * context,
+                                gint x, gint y,
+                                GtkSelectionData * selection_data,
+                                guint info, guint time,
+                                gpointer user_data) 
+{
+    mcs_handle_t *db;
+    gchar *path;
+
+    if (!selection_data->data) {
+        g_warning("DND data string is NULL");
+        return;
+    }
+
+    path = (gchar *) selection_data->data;
+
+    /* FIXME: use a real URL validator/parser */
+
+    if (aud_str_has_prefix_nocase(path, "file:///")) {
+        path[strlen(path) - 2] = 0; /* Why the hell a CR&LF? */
+        path += 7;
+    }
+    else if (aud_str_has_prefix_nocase(path, "file:")) {
+        path += 5;
+    }
+
+    if (file_is_archive(path)) {
+        if (!aud_active_skin_load(path))
+            return;
+        skin_install_skin(path);
+        skin_view_update(GTK_TREE_VIEW(widget),
+                         GTK_WIDGET(skin_refresh_button));
+
+        /* Change skin name in the config file */
+        db = aud_cfg_db_open();
+        aud_cfg_db_set_string(db, "skins", "skin", path);
+        aud_cfg_db_close(db);
+    }
+}
+
+void skins_configure(void) {
+    GtkWidget *appearance_page_vbox;
+    GtkWidget *vbox37;
+    GtkWidget *vbox38;
+    GtkWidget *hbox12;
+    GtkWidget *alignment94;
+    GtkWidget *hbox13;
+    GtkWidget *label103;
+    GtkWidget *colorspace_button;
+    GtkWidget *image11;
+    GtkWidget *image12;
+    GtkWidget *alignment95;
+    GtkWidget *skin_view_scrolled_window;
+
+    if (cfg_win != NULL) {
+        gtk_window_present(GTK_WINDOW(cfg_win));
+        return;
+    }
+
+    cfg_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint(GTK_WINDOW(cfg_win), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_title(GTK_WINDOW(cfg_win), _("Audacious Skinned GUI Configuration"));
+    gtk_container_set_border_width(GTK_CONTAINER(cfg_win), 10);
+    g_signal_connect(G_OBJECT(cfg_win), "destroy" ,
+                     G_CALLBACK(gtk_widget_destroyed), &cfg_win);
+    gtk_widget_set_size_request(cfg_win, 500, -1);
+
+    appearance_page_vbox = gtk_vbox_new (FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(cfg_win), appearance_page_vbox);
+
+    vbox37 = gtk_vbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (appearance_page_vbox), vbox37, TRUE, TRUE, 0);
+
+    vbox38 = gtk_vbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (vbox37), vbox38, FALSE, TRUE, 0);
+
+    hbox12 = gtk_hbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (vbox38), hbox12, TRUE, TRUE, 0);
+
+    alignment94 = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_box_pack_start (GTK_BOX (hbox12), alignment94, TRUE, TRUE, 0);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment94), 0, 4, 0, 0);
+
+    hbox13 = gtk_hbox_new (FALSE, 0);
+    gtk_container_add (GTK_CONTAINER (alignment94), hbox13);
+
+    label103 = gtk_label_new_with_mnemonic (_("<b>_Skin</b>"));
+    gtk_box_pack_start (GTK_BOX (hbox13), label103, TRUE, TRUE, 0);
+    gtk_label_set_use_markup (GTK_LABEL (label103), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (label103), 0, 0);
+
+    colorspace_button = gtk_button_new ();
+    gtk_box_pack_start (GTK_BOX (hbox13), colorspace_button, FALSE, FALSE, 0);
+
+    image11 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_BUTTON);
+    gtk_container_add (GTK_CONTAINER (colorspace_button), image11);
+
+    skin_refresh_button = gtk_button_new ();
+    gtk_box_pack_start (GTK_BOX (hbox13), skin_refresh_button, FALSE, FALSE, 0);
+    GTK_WIDGET_UNSET_FLAGS (skin_refresh_button, GTK_CAN_FOCUS);
+    gtk_button_set_relief (GTK_BUTTON (skin_refresh_button), GTK_RELIEF_HALF);
+    gtk_button_set_focus_on_click (GTK_BUTTON (skin_refresh_button), FALSE);
+
+    image12 = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_BUTTON);
+    gtk_container_add (GTK_CONTAINER (skin_refresh_button), image12);
+
+    alignment95 = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_box_pack_start (GTK_BOX (vbox38), alignment95, TRUE, TRUE, 0);
+    gtk_widget_set_size_request (alignment95, -1, 172);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment95), 0, 0, 12, 0);
+
+    skin_view_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_container_add (GTK_CONTAINER (alignment95), skin_view_scrolled_window);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_SHADOW_IN);
+
+    skin_view = gtk_tree_view_new ();
+    gtk_container_add (GTK_CONTAINER (skin_view_scrolled_window), skin_view);
+    gtk_widget_set_size_request (skin_view, -1, 100);
+
+    aud_create_widgets(GTK_BOX(vbox37), appearance_misc_widgets, G_N_ELEMENTS(appearance_misc_widgets));
+    gtk_widget_show_all(appearance_page_vbox);
+
+
+    g_signal_connect(G_OBJECT(colorspace_button), "clicked",
+                     G_CALLBACK(on_colorize_button_clicked),
+                     NULL);
+
+    g_signal_connect(skin_view, "drag-data-received",
+                     G_CALLBACK(on_skin_view_drag_data_received),
+                     NULL);
+    aud_drag_dest_set(skin_view);
+
+    g_signal_connect(mainwin, "drag-data-received",
+                     G_CALLBACK(mainwin_drag_data_received),
+                     skin_view);
+#if 0
+    g_signal_connect(skin_refresh_button, "clicked",
+                     G_CALLBACK(on_skin_refresh_button_clicked),
+                     NULL);
+
+    g_signal_connect_swapped(G_OBJECT(skin_refresh_button), "clicked",
+                             G_CALLBACK(on_skin_refresh_button_clicked),
+                             prefswin);
+#endif
+    g_signal_connect_after(G_OBJECT(skin_view), "realize",
+                           G_CALLBACK(on_skin_view_realize),
+                           NULL);
+
+    gtk_window_present(GTK_WINDOW(cfg_win));
+
+    return;
+}
--- a/src/skins/skins_cfg.h	Fri Jun 06 13:41:12 2008 +0300
+++ b/src/skins/skins_cfg.h	Fri Jun 06 12:52:49 2008 +0200
@@ -86,4 +86,6 @@
 void skins_cfg_load();
 void skins_cfg_save();
 
+void skins_configure(void);
+
 #endif
--- a/src/skins/ui_main.c	Fri Jun 06 13:41:12 2008 +0300
+++ b/src/skins/ui_main.c	Fri Jun 06 12:52:49 2008 +0200
@@ -1062,7 +1062,7 @@
 
     g_return_if_fail(selection_data != NULL);
     g_return_if_fail(selection_data->data != NULL);
-#if 0
+
     if (aud_str_has_prefix_nocase((gchar *) selection_data->data, "fonts:///"))
     {
         gchar *path = (gchar *) selection_data->data;
@@ -1088,7 +1088,7 @@
             return;
         }
     }
-#endif
+
     aud_playlist_clear(playlist);
     aud_playlist_add_url(playlist, (gchar *) selection_data->data);
     audacious_drct_initiate();