diff options
Diffstat (limited to 'src/libaudgui')
-rw-r--r-- | src/libaudgui/Makefile | 4 | ||||
-rw-r--r-- | src/libaudgui/effects-menu.c | 12 | ||||
-rw-r--r-- | src/libaudgui/equalizer.c | 189 | ||||
-rw-r--r-- | src/libaudgui/infowin.c | 59 | ||||
-rw-r--r-- | src/libaudgui/libaudgui.h | 9 | ||||
-rw-r--r-- | src/libaudgui/ui_gtk.c | 10 | ||||
-rw-r--r-- | src/libaudgui/urilist.c | 149 |
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; +} |