summaryrefslogtreecommitdiff
path: root/src/libaudgui
diff options
context:
space:
mode:
authorBenjamin Drung <bdrung@ubuntu.com>2010-06-29 10:01:17 +0200
committerBenjamin Drung <bdrung@ubuntu.com>2010-06-29 10:01:17 +0200
commite8b98d4a2a505405b6380e206cc1e0f553753794 (patch)
tree4f7745e028b087f2d770b39ad20d90adac1af063 /src/libaudgui
parent42318926e1c1585ccc266c4607cb1d6e855bd0b9 (diff)
Imported Upstream version 2.4~alpha2
Diffstat (limited to 'src/libaudgui')
-rw-r--r--src/libaudgui/Makefile4
-rw-r--r--src/libaudgui/effects-menu.c12
-rw-r--r--src/libaudgui/equalizer.c189
-rw-r--r--src/libaudgui/infowin.c59
-rw-r--r--src/libaudgui/libaudgui.h9
-rw-r--r--src/libaudgui/ui_gtk.c10
-rw-r--r--src/libaudgui/urilist.c149
7 files changed, 384 insertions, 48 deletions
diff --git a/src/libaudgui/Makefile b/src/libaudgui/Makefile
index 9c88651..afa654a 100644
--- a/src/libaudgui/Makefile
+++ b/src/libaudgui/Makefile
@@ -4,6 +4,7 @@ LIB_MINOR = 0
SRCS = confirm.c \
effects-menu.c \
+ equalizer.c \
infopopup.c \
infowin.c \
init.c \
@@ -17,6 +18,7 @@ SRCS = confirm.c \
ui_about.c \
ui_credits.c \
ui_playlist_manager.c \
+ urilist.c \
util.c
INCLUDES = libaudgui.h \
@@ -30,4 +32,4 @@ includesubdir = libaudgui
CPPFLAGS += -DHAVE_CONFIG_H ${LIB_CPPFLAGS} -D_AUDACIOUS_CORE -I.. -I../.. -I../libaudcore -I../audacious ${GLIB_CFLASG} ${GTK_CFLAGS} ${DBUS_CFLAGS} ${LIBMCS_CFLAGS} ${AUDACIOUS_DEFINES} ${REGEX_CFLAGS}
CFLAGS += ${LIB_CFLAGS}
LDFLAGS += $(AUDLDFLAGS)
-LIBS += ${GLIB_LIBS} ${MOWGLI_LIBS} ${GTK_LIBS} ${REGEX_LIBS} -L../libaudcore -laudcore
+LIBS += -lm ${GLIB_LIBS} ${MOWGLI_LIBS} ${GTK_LIBS} ${REGEX_LIBS} -L../libaudcore -laudcore
diff --git a/src/libaudgui/effects-menu.c b/src/libaudgui/effects-menu.c
index 86ac6c2..3582c65 100644
--- a/src/libaudgui/effects-menu.c
+++ b/src/libaudgui/effects-menu.c
@@ -26,15 +26,6 @@
#include "libaudgui-gtk.h"
-static GtkWidget * create_title (void)
-{
- GtkWidget * title = gtk_menu_item_new_with_label (_("Effects"));
-
- gtk_widget_set_sensitive (title, FALSE);
- gtk_widget_show (title);
- return title;
-}
-
static void effect_item_toggled (GtkCheckMenuItem * item, void * data)
{
aud_enable_effect (data, gtk_check_menu_item_get_active (item));
@@ -71,9 +62,6 @@ GtkWidget * audgui_create_effects_menu (void)
GList * list = aud_get_effect_list ();
GList * node;
- gtk_menu_shell_append ((GtkMenuShell *) menu, create_title ());
- gtk_menu_shell_append ((GtkMenuShell *) menu, gtk_separator_menu_item_new ());
-
for (node = list; node != NULL; node = node->next)
{
EffectPlugin * effect = node->data;
diff --git a/src/libaudgui/equalizer.c b/src/libaudgui/equalizer.c
new file mode 100644
index 0000000..c3b1f56
--- /dev/null
+++ b/src/libaudgui/equalizer.c
@@ -0,0 +1,189 @@
+/*
+ * libaudgui/equalizer.c
+ * Copyright 2010 John Lindgren
+ *
+ * This file is part of Audacious.
+ *
+ * Audacious is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, version 2 or version 3 of the License.
+ *
+ * Audacious is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Audacious. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The Audacious team does not consider modular code linking to Audacious or
+ * using our public API to be a derived work.
+ */
+
+/*
+ * Note: Because some GTK developer had the bright idea to put the minimum at
+ * the top of a GtkVScale and the maximum at the bottom, we have to reverse the
+ * sign of the values we get.
+ */
+
+#include <math.h>
+
+#include <audacious/i18n.h>
+#include <audacious/plugin.h>
+
+#include "libaudgui-gtk.h"
+
+#define DB_RANGE 12
+
+typedef struct
+{
+ GtkWidget * slider;
+ gfloat * setting;
+}
+SliderPair;
+
+static void on_off_cb (GtkToggleButton * on_off, void * unused)
+{
+ gboolean active = gtk_toggle_button_get_active (on_off);
+
+ if (aud_cfg->equalizer_active != active)
+ {
+ aud_cfg->equalizer_active = active;
+ aud_hook_call ("equalizer changed", NULL);
+ }
+}
+
+static void on_off_update (void * unused, GtkWidget * on_off)
+{
+ gboolean active = gtk_toggle_button_get_active ((GtkToggleButton *) on_off);
+
+ if (active != aud_cfg->equalizer_active)
+ gtk_toggle_button_set_active ((GtkToggleButton *) on_off,
+ aud_cfg->equalizer_active);
+}
+
+static GtkWidget * create_on_off (void)
+{
+ GtkWidget * on_off;
+
+ on_off = gtk_check_button_new_with_mnemonic (_("_Enable"));
+ g_signal_connect ((GObject *) on_off, "toggled", (GCallback) on_off_cb, NULL);
+ aud_hook_associate ("equalizer changed", (HookFunction) on_off_update, on_off);
+
+ on_off_update (NULL, on_off);
+ return on_off;
+}
+
+static void slider_cb (GtkRange * slider, gfloat * setting)
+{
+ gint old = rintf (* setting);
+ gint new = rint (-gtk_range_get_value (slider));
+
+ if (old != new)
+ {
+ * setting = new;
+ aud_hook_call ("equalizer changed", NULL);
+ }
+}
+
+static void slider_update (void * unused, SliderPair * pair)
+{
+ gint old = rint (-gtk_range_get_value ((GtkRange *) pair->slider));
+ gint new = rintf (* pair->setting);
+
+ if (old != new)
+ gtk_range_set_value ((GtkRange *) pair->slider, -new);
+}
+
+static void set_slider_update (GtkWidget * slider, gfloat * setting)
+{
+ SliderPair * pair = g_slice_new (SliderPair);
+
+ pair->slider = slider;
+ pair->setting = setting;
+
+ aud_hook_associate ("equalizer changed", (HookFunction) slider_update, pair);
+ slider_update (NULL, pair);
+}
+
+static gchar * format_value (GtkScale * slider, gdouble value, void * unused)
+{
+ return g_strdup_printf ("%d", (gint) -value);
+}
+
+static GtkWidget * create_slider (const gchar * name, gfloat * setting)
+{
+ GtkWidget * vbox, * slider, * label;
+
+ vbox = gtk_vbox_new (FALSE, 6);
+
+ label = gtk_label_new (name);
+ gtk_label_set_angle ((GtkLabel *) label, 90);
+ gtk_box_pack_start ((GtkBox *) vbox, label, TRUE, FALSE, 0);
+
+ slider = gtk_vscale_new_with_range (-DB_RANGE, DB_RANGE, 1);
+ gtk_scale_set_draw_value ((GtkScale *) slider, TRUE);
+ gtk_scale_set_value_pos ((GtkScale *) slider, GTK_POS_BOTTOM);
+ gtk_widget_set_size_request (slider, -1, 120);
+ g_signal_connect ((GObject *) slider, "format-value", (GCallback)
+ format_value, NULL);
+ g_signal_connect ((GObject *) slider, "value-changed", (GCallback)
+ slider_cb, setting);
+ set_slider_update (slider, setting);
+ gtk_box_pack_start ((GtkBox *) vbox, slider, FALSE, FALSE, 0);
+
+ return vbox;
+}
+
+static GtkWidget * create_window (void)
+{
+ static const gchar * names[AUD_EQUALIZER_NBANDS] = {N_("60 Hz"),
+ N_("170 Hz"), N_("310 Hz"), N_("600 Hz"), N_("1 kHz"), N_("3 kHz"),
+ N_("6 kHz"), N_("12 kHz"), N_("14 kHz"), N_("16 kHz")};
+ GtkWidget * window, * vbox, * hbox;
+ gint i;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title ((GtkWindow *) window, _("Equalizer"));
+ gtk_window_set_type_hint ((GtkWindow *) window, GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_resizable ((GtkWindow *) window, FALSE);
+ gtk_container_set_border_width ((GtkContainer *) window, 6);
+ g_signal_connect ((GObject *) window, "delete-event", (GCallback)
+ gtk_widget_hide_on_delete, NULL);
+ audgui_hide_on_escape (window);
+
+ vbox = gtk_vbox_new (FALSE, 6);
+ gtk_container_add ((GtkContainer *) window, vbox);
+
+ gtk_box_pack_start ((GtkBox *) vbox, create_on_off (), FALSE, FALSE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 6);
+ gtk_box_pack_start ((GtkBox *) vbox, hbox, FALSE, FALSE, 0);
+
+ gtk_box_pack_start ((GtkBox *) hbox, create_slider (_("Preamp"),
+ & aud_cfg->equalizer_preamp), FALSE, FALSE, 0);
+
+ gtk_box_pack_start ((GtkBox *) hbox, gtk_vseparator_new (), FALSE, FALSE, 0);
+
+ for (i = 0; i < AUD_EQUALIZER_NBANDS; i ++)
+ gtk_box_pack_start ((GtkBox *) hbox, create_slider (_(names[i]),
+ & aud_cfg->equalizer_bands[i]), FALSE, FALSE, 0);
+
+ gtk_widget_show_all (vbox);
+ return window;
+}
+
+static GtkWidget * equalizer_window = NULL;
+
+void audgui_show_equalizer_window (void)
+{
+ if (equalizer_window == NULL)
+ equalizer_window = create_window ();
+
+ gtk_window_present ((GtkWindow *) equalizer_window);
+}
+
+void audgui_hide_equalizer_window (void)
+{
+ if (equalizer_window != NULL)
+ gtk_widget_hide (equalizer_window);
+}
diff --git a/src/libaudgui/infowin.c b/src/libaudgui/infowin.c
index ef58480..4dcaf74 100644
--- a/src/libaudgui/infowin.c
+++ b/src/libaudgui/infowin.c
@@ -114,8 +114,6 @@ static const gchar * genre_table[] =
N_("Anime"), N_("JPop"), N_("Synthpop")
};
-static GList * genre_list = NULL;
-
static void set_entry_str_from_field (GtkWidget * widget, Tuple * tuple,
gint fieldn, gboolean editable)
{
@@ -353,6 +351,24 @@ static GdkPixbuf * mime_icon_lookup (gint size, const gchar * mime_type)
return icon;
}
+gboolean genre_fill (GtkWidget * combo)
+{
+ GList * list = NULL;
+ GList * node;
+ gint i;
+
+ for (i = 0; i < G_N_ELEMENTS (genre_table); i ++)
+ list = g_list_prepend (list, _(genre_table[i]));
+
+ list = g_list_sort (list, (GCompareFunc) strcmp);
+
+ for (node = list; node != NULL; node = node->next)
+ gtk_combo_box_append_text ((GtkComboBox *) combo, node->data);
+
+ g_list_free (list);
+ return FALSE;
+}
+
void create_infowin (void)
{
GtkWidget * hbox;
@@ -383,7 +399,6 @@ void create_infowin (void)
GtkWidget * scrolledwindow;
GtkTreeViewColumn * column;
GtkCellRenderer * renderer;
- gint i;
infowin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width ((GtkContainer *) infowin, 6);
@@ -533,21 +548,9 @@ void create_infowin (void)
gtk_alignment_set_padding ((GtkAlignment *) alignment, 0, 6, 0, 0);
entry_genre = gtk_combo_box_entry_new_text ();
- if (genre_list == NULL)
- {
- GList * iter;
-
- for (i = 0; i < G_N_ELEMENTS (genre_table); i ++)
- genre_list = g_list_prepend (genre_list, _(genre_table[i]));
-
- genre_list = g_list_sort (genre_list, (GCompareFunc) g_utf8_collate);
-
- for (iter = genre_list; iter != NULL; iter = iter->next)
- gtk_combo_box_append_text ((GtkComboBox *) entry_genre, iter->data);
- }
-
gtk_container_add ((GtkContainer *) alignment, entry_genre);
g_signal_connect (entry_genre, "changed", (GCallback) entry_changed, NULL);
+ g_idle_add ((GSourceFunc) genre_fill, entry_genre);
alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
gtk_box_pack_start ((GtkBox *) vbox2, alignment, FALSE, FALSE, 0);
@@ -861,7 +864,7 @@ void audgui_infowin_show (gint playlist, gint entry)
{
const gchar * filename = aud_playlist_entry_get_filename (playlist, entry);
InputPlugin * decoder = aud_playlist_entry_get_decoder (playlist, entry);
- Tuple * tuple;
+ Tuple * tuple = (Tuple *) aud_playlist_entry_get_tuple (playlist, entry);
g_return_if_fail (filename != NULL);
@@ -876,23 +879,25 @@ void audgui_infowin_show (gint playlist, gint entry)
if (aud_custom_infowin (filename, decoder))
return;
- tuple = aud_file_read_tuple (filename, decoder);
-
if (tuple == NULL)
{
- gchar * message = g_strdup_printf (_("No info available for %s.\n"),
- filename);
+ tuple = aud_file_read_tuple (filename, decoder);
- aud_hook_call ("interface show error", message);
- g_free (message);
- return;
+ if (tuple == NULL)
+ {
+ gchar * message = g_strdup_printf (_("No info available for %s.\n"),
+ filename);
+
+ aud_hook_call ("interface show error", message);
+ g_free (message);
+ return;
+ }
+
+ aud_playlist_entry_set_tuple (playlist, entry, tuple);
}
infowin_show (filename, tuple, decoder, aud_file_can_write_tuple (filename,
decoder));
-
- aud_playlist_entry_set_tuple (playlist, entry, tuple);
- /* We do not unref the tuple, as the playlist takes ownership. */
}
void audgui_infowin_show_current (void)
diff --git a/src/libaudgui/libaudgui.h b/src/libaudgui/libaudgui.h
index 828fafd..6611a87 100644
--- a/src/libaudgui/libaudgui.h
+++ b/src/libaudgui/libaudgui.h
@@ -46,6 +46,10 @@ void audgui_hide_about_window(void);
/* confirm.c */
void audgui_confirm_playlist_delete (gint playlist);
+/* equalizer.c */
+void audgui_show_equalizer_window (void);
+void audgui_hide_equalizer_window (void);
+
/* infopopup.c */
void audgui_infopopup_show (gint playlist, gint entry);
void audgui_infopopup_show_current (void);
@@ -55,4 +59,9 @@ void audgui_infopopup_hide (void);
void audgui_infowin_show (gint playlist, gint entry);
void audgui_infowin_show_current (void);
+/* urilist.c */
+void audgui_urilist_open (const gchar * list);
+void audgui_urilist_insert (gint playlist, gint position, const gchar * list);
+gchar * audgui_urilist_create_from_selected (gint playlist);
+
#endif /* LIBAUDGUI_H */
diff --git a/src/libaudgui/ui_gtk.c b/src/libaudgui/ui_gtk.c
index 6142eba..fa8d4e8 100644
--- a/src/libaudgui/ui_gtk.c
+++ b/src/libaudgui/ui_gtk.c
@@ -18,15 +18,9 @@
*/
#include <gtk/gtk.h>
-#include "audacious/images/audacious_player.xpm"
-void
-audgui_set_default_icon(void)
+void audgui_set_default_icon (void)
{
- GdkPixbuf *icon;
-
- icon = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_player_xpm);
- gtk_window_set_default_icon(icon);
- g_object_unref(icon);
+ gtk_window_set_default_icon_name ("audacious");
}
diff --git a/src/libaudgui/urilist.c b/src/libaudgui/urilist.c
new file mode 100644
index 0000000..a8197ed
--- /dev/null
+++ b/src/libaudgui/urilist.c
@@ -0,0 +1,149 @@
+/*
+ * libaudgui/urilist.c
+ * Copyright 2010 John Lindgren
+ *
+ * This file is part of Audacious.
+ *
+ * Audacious is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, version 2 or version 3 of the License.
+ *
+ * Audacious is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * Audacious. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The Audacious team does not consider modular code linking to Audacious or
+ * using our public API to be a derived work.
+ */
+
+#include <string.h>
+#include <glib.h>
+#include <audacious/plugin.h>
+#include "util.h"
+
+typedef void (* ForEachFunc) (gchar *, void *);
+
+typedef struct
+{
+ gint playlist, at;
+ struct index * index;
+}
+AddState;
+
+static gchar * check_uri (gchar * name)
+{
+ gchar * new;
+
+ if (strstr (name, "://") || ! (new = g_filename_to_uri (name, NULL, NULL)))
+ return name;
+
+ g_free (name);
+ return new;
+}
+
+static void urilist_for_each (const gchar * list, ForEachFunc func, void * user)
+{
+ const gchar * end, * next;
+
+ while (list[0])
+ {
+ if ((end = strstr (list, "\r\n")))
+ next = end + 2;
+ else if ((end = strchr (list, '\n')))
+ next = end + 1;
+ else
+ next = end = strchr (list, 0);
+
+ func (check_uri (g_strndup (list, end - list)), user);
+ list = next;
+ }
+}
+
+static void add_to_glist (gchar * name, GList * * listp)
+{
+ * listp = g_list_prepend (* listp, name);
+}
+
+void audgui_urilist_open (const gchar * list)
+{
+ GList * glist = NULL;
+
+ urilist_for_each (list, (ForEachFunc) add_to_glist, & glist);
+ glist = g_list_reverse (glist);
+
+ audacious_drct_pl_open_list (glist);
+
+ g_list_foreach (glist, (GFunc) g_free, NULL);
+ g_list_free (glist);
+}
+
+static void add_full (gchar * name, AddState * state)
+{
+ if (aud_vfs_file_test (name, G_FILE_TEST_IS_DIR))
+ {
+ aud_playlist_insert_folder (state->playlist, state->at, name);
+ g_free (name);
+ }
+ else if (aud_filename_is_playlist (name))
+ {
+ gint entries = aud_playlist_entry_count (state->playlist);
+ aud_playlist_insert_playlist (state->playlist, state->at, name);
+ state->at += aud_playlist_entry_count (state->playlist) - entries;
+ }
+ else
+ index_append (state->index, name);
+}
+
+void audgui_urilist_insert (gint playlist, gint at, const gchar * list)
+{
+ AddState state = {playlist, at, index_new ()};
+
+ urilist_for_each (list, (ForEachFunc) add_full, & state);
+ aud_playlist_entry_insert_batch (playlist, state.at, state.index, NULL);
+}
+
+gchar * audgui_urilist_create_from_selected (gint playlist)
+{
+ gint entries = aud_playlist_entry_count (playlist);
+ gint space = 0;
+ gint count, length;
+ const gchar * name;
+ gchar * buffer, * set;
+
+ for (count = 0; count < entries; count ++)
+ {
+ if (! aud_playlist_entry_get_selected (playlist, count))
+ continue;
+
+ name = aud_playlist_entry_get_filename (playlist, count);
+ g_return_val_if_fail (name != NULL, NULL);
+ space += strlen (name) + 1;
+ }
+
+ if (! space)
+ return NULL;
+
+ buffer = g_malloc (space);
+ set = buffer;
+
+ for (count = 0; count < entries; count ++)
+ {
+ if (! aud_playlist_entry_get_selected (playlist, count))
+ continue;
+
+ name = aud_playlist_entry_get_filename (playlist, count);
+ g_return_val_if_fail (name != NULL, NULL);
+ length = strlen (name);
+ g_return_val_if_fail (length + 1 <= space, NULL);
+ memcpy (set, name, length);
+ set += length;
+ * set ++ = '\n';
+ space -= length + 1;
+ }
+
+ * -- set = 0; /* last newline replaced with null */
+ return buffer;
+}