Skip to content

Commit

Permalink
gtkui: Allow infoarea visualization to be turned off. Closes: #35.
Browse files Browse the repository at this point in the history
  • Loading branch information
jlindgren90 committed Feb 9, 2012
1 parent 76ae0c1 commit a03e7a6
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 58 deletions.
1 change: 1 addition & 0 deletions src/gtkui/gtkui.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ GtkWidget * make_menu_tab (GtkAccelGroup * accel);
/* ui_gtk.c */
void show_menu (gboolean show);
void show_infoarea (gboolean show);
void show_infoarea_vis (gboolean show);
void show_statusbar (gboolean show);
void popup_menu_rclick (guint button, guint32 time);
void popup_menu_tab (guint button, guint32 time);
Expand Down
6 changes: 4 additions & 2 deletions src/gtkui/menus.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,8 @@ static void volume_down (void)
}

static gboolean menu_bar_get (void) {return aud_get_bool ("gtkui", "menu_visible"); }
static gboolean info_bar_get (void) {return aud_get_bool ("gtkui", "infoarea_visible"); }
static gboolean infoarea_get (void) {return aud_get_bool ("gtkui", "infoarea_visible"); }
static gboolean infoarea_vis_get (void) {return aud_get_bool ("gtkui", "infoarea_show_vis"); }
static gboolean status_bar_get (void) {return aud_get_bool ("gtkui", "statusbar_visible"); }
static gboolean column_headers_get (void) {return aud_get_bool ("gtkui", "playlist_headers"); }
static gboolean autoscroll_get (void) {return aud_get_bool ("gtkui", "autoscroll"); }
Expand Down Expand Up @@ -192,7 +193,8 @@ static const struct MenuItem view_items[] = {
{N_("_Visualizations"), .get_sub = audgui_create_vis_menu},
{.sep = TRUE},
{N_("Show _Menu Bar"), NULL, 'm', SHIFT | CTRL, .get = menu_bar_get, show_menu},
{N_("Show I_nfo Bar"), NULL, 'i', SHIFT | CTRL, .get = info_bar_get, show_infoarea},
{N_("Show I_nfo Bar"), NULL, 'i', SHIFT | CTRL, .get = infoarea_get, show_infoarea},
{N_("Show Info Bar Vis_ualization"), .get = infoarea_vis_get, show_infoarea_vis},
{N_("Show _Status Bar"), NULL, 's', SHIFT | CTRL, .get = status_bar_get, show_statusbar},
{.sep = TRUE},
{N_("Show Column _Headers"), .get = column_headers_get, playlist_show_headers},
Expand Down
14 changes: 9 additions & 5 deletions src/gtkui/ui_gtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "playlist_util.h"

static const gchar * const gtkui_defaults[] = {
"infoarea_show_vis", "TRUE",
"infoarea_visible", "TRUE",
"menu_visible", "TRUE",
"player_visible", "TRUE",
Expand Down Expand Up @@ -768,11 +769,7 @@ static gboolean init (void)
ui_playlist_notebook_new ();
gtk_box_pack_start ((GtkBox *) vbox, (GtkWidget *) UI_PLAYLIST_NOTEBOOK, TRUE, TRUE, 0);

if (aud_get_bool ("gtkui", "infoarea_visible"))
{
infoarea = ui_infoarea_new ();
gtk_box_pack_end (GTK_BOX(vbox), infoarea, FALSE, FALSE, 0);
}
show_infoarea (aud_get_bool ("gtkui", "infoarea_visible"));

if (aud_get_bool ("gtkui", "statusbar_visible"))
{
Expand Down Expand Up @@ -901,6 +898,7 @@ void show_infoarea (gboolean show)
if (show && ! infoarea)
{
infoarea = ui_infoarea_new ();
ui_infoarea_show_vis (aud_get_bool ("gtkui", "infoarea_show_vis"));
gtk_box_pack_end ((GtkBox *) vbox, infoarea, FALSE, FALSE, 0);
gtk_widget_show_all (infoarea);
}
Expand All @@ -912,6 +910,12 @@ void show_infoarea (gboolean show)
}
}

void show_infoarea_vis (gboolean show)
{
aud_set_bool ("gtkui", "infoarea_show_vis", show);
ui_infoarea_show_vis (show);
}

void show_statusbar (gboolean show)
{
aud_set_bool ("gtkui", "statusbar_visible", show);
Expand Down
117 changes: 66 additions & 51 deletions src/gtkui/ui_infoarea.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,28 +42,30 @@
#define VIS_FALLOFF 2 /* falloff in pixels per frame */

typedef struct {
GtkWidget * box, * main, * vis;
GtkWidget * box, * main;

gchar * title, * artist, * album; /* pooled */
gchar * last_title, * last_artist, * last_album; /* pooled */
gfloat alpha, last_alpha;

gboolean stopped;
gint fade_timeout;
gchar bars[VIS_BANDS];
gchar delay[VIS_BANDS];

GdkPixbuf * pb, * last_pb;
} UIInfoArea;

static struct {
GtkWidget * widget;
gchar bars[VIS_BANDS];
gchar delay[VIS_BANDS];
} vis;

/****************************************************************************/

static UIInfoArea * area = NULL;

static void vis_render_cb (const gfloat * freq)
{
g_return_if_fail (area);

const gfloat xscale[VIS_BANDS + 1] = {0.00, 0.59, 1.52, 3.00, 5.36, 9.10,
15.0, 24.5, 39.4, 63.2, 101, 161, 256}; /* logarithmic scale - 1 */

Expand All @@ -86,32 +88,32 @@ static void vis_render_cb (const gfloat * freq)
}

/* 40 dB range */
int x = 20 * log10 (n * 100);
gint x = 20 * log10 (n * 100);
x = CLAMP (x, 0, 40);

area->bars[i] -= MAX (0, VIS_FALLOFF - area->delay[i]);
vis.bars[i] -= MAX (0, VIS_FALLOFF - vis.delay[i]);

if (area->delay[i])
area->delay[i] --;
if (vis.delay[i])
vis.delay[i] --;

if (x > area->bars[i])
if (x > vis.bars[i])
{
area->bars[i] = x;
area->delay[i] = VIS_DELAY;
vis.bars[i] = x;
vis.delay[i] = VIS_DELAY;
}
}

gtk_widget_queue_draw (area->vis);
if (vis.widget)
gtk_widget_queue_draw (vis.widget);
}

static void vis_clear_cb (void)
{
g_return_if_fail (area);

memset (area->bars, 0, sizeof area->bars);
memset (area->delay, 0, sizeof area->delay);
memset (vis.bars, 0, sizeof vis.bars);
memset (vis.delay, 0, sizeof vis.delay);

gtk_widget_queue_draw (area->vis);
if (vis.widget)
gtk_widget_queue_draw (vis.widget);
}

/****************************************************************************/
Expand Down Expand Up @@ -216,7 +218,6 @@ static void get_color (gint i, gfloat * r, gfloat * g, gfloat * b)
{
static GdkRGBA c;
static bool_t valid = FALSE;
gfloat h, s, v, n;

if (! valid)
{
Expand All @@ -232,6 +233,7 @@ static void get_color (gint i, gfloat * r, gfloat * g, gfloat * b)
valid = TRUE;
}

gfloat h, s, v;
rgb_to_hsv (c.red, c.green, c.blue, & h, & s, & v);

if (s < 0.1) /* monochrome theme? use blue instead */
Expand All @@ -240,24 +242,21 @@ static void get_color (gint i, gfloat * r, gfloat * g, gfloat * b)
s = 0.75;
}

n = i / 11.0;
s = 1 - 0.9 * n;
v = 0.75 + 0.25 * n;
s = 1 - 0.9 * i / (VIS_BANDS - 1);
v = 0.75 + 0.25 * i / (VIS_BANDS - 1);

hsv_to_rgb (h, s, v, r, g, b);
}

static gboolean draw_vis_cb (GtkWidget * vis, cairo_t * cr)
static gboolean draw_vis_cb (GtkWidget * widget, cairo_t * cr)
{
g_return_val_if_fail (area, FALSE);

clear (vis, cr);
clear (widget, cr);

for (gint i = 0; i < VIS_BANDS; i++)
{
gint x = SPACING + 8 * i;
gint t = VIS_CENTER - area->bars[i];
gint m = MIN (VIS_CENTER + area->bars[i], HEIGHT);
gint t = VIS_CENTER - vis.bars[i];
gint m = MIN (VIS_CENTER + vis.bars[i], HEIGHT);

gfloat r, g, b;
get_color (i, & r, & g, & b);
Expand Down Expand Up @@ -358,16 +357,7 @@ static gboolean ui_infoarea_do_fade (void)
return ret;
}

static gint strcmp_null (const gchar * a, const gchar * b)
{
if (! a)
return (! b) ? 0 : -1;
if (! b)
return 1;
return strcmp (a, b);
}

void ui_infoarea_set_title (void)
static void ui_infoarea_set_title (void)
{
g_return_if_fail (area);

Expand All @@ -380,8 +370,8 @@ void ui_infoarea_set_title (void)
gchar * title, * artist, * album;
aud_playlist_entry_describe (playlist, entry, & title, & artist, & album, TRUE);

if (! strcmp_null (title, area->title) && ! strcmp_null (artist,
area->artist) && ! strcmp_null (album, area->album))
if (! g_strcmp0 (title, area->title) && ! g_strcmp0 (artist, area->artist)
&& ! g_strcmp0 (album, area->album))
{
str_unref (title);
str_unref (artist);
Expand Down Expand Up @@ -466,19 +456,52 @@ static void ui_infoarea_playback_stop (void)
ui_infoarea_do_fade, area);
}

void ui_infoarea_show_vis (gboolean show)
{
if (! area)
return;

if (show)
{
if (vis.widget)
return;

vis.widget = gtk_drawing_area_new ();
gtk_widget_set_size_request (vis.widget, VIS_WIDTH + 2 * SPACING, HEIGHT);
gtk_box_pack_start ((GtkBox *) area->box, vis.widget, FALSE, FALSE, 0);

g_signal_connect (vis.widget, "draw", (GCallback) draw_vis_cb, NULL);
gtk_widget_show (vis.widget);

aud_vis_func_add (AUD_VIS_TYPE_CLEAR, (VisFunc) vis_clear_cb);
aud_vis_func_add (AUD_VIS_TYPE_FREQ, (VisFunc) vis_render_cb);
}
else
{
if (! vis.widget)
return;

aud_vis_func_remove ((VisFunc) vis_clear_cb);
aud_vis_func_remove ((VisFunc) vis_render_cb);

gtk_widget_destroy (vis.widget);

memset (& vis, 0, sizeof vis);
}
}

static void destroy_cb (GtkWidget * widget)
{
g_return_if_fail (area);

ui_infoarea_show_vis (FALSE);

hook_dissociate ("playlist update", (HookFunction) ui_infoarea_set_title);
hook_dissociate ("playback begin", (HookFunction)
ui_infoarea_playback_start);
hook_dissociate ("playback stop", (HookFunction)
ui_infoarea_playback_stop);

aud_vis_func_remove ((VisFunc) vis_clear_cb);
aud_vis_func_remove ((VisFunc) vis_render_cb);

if (area->fade_timeout)
{
g_source_remove (area->fade_timeout);
Expand Down Expand Up @@ -512,20 +535,12 @@ GtkWidget * ui_infoarea_new (void)
gtk_widget_set_size_request (area->main, ICON_SIZE + 2 * SPACING, HEIGHT);
gtk_box_pack_start ((GtkBox *) area->box, area->main, TRUE, TRUE, 0);

area->vis = gtk_drawing_area_new ();
gtk_widget_set_size_request (area->vis, VIS_WIDTH + 2 * SPACING, HEIGHT);
gtk_box_pack_start ((GtkBox *) area->box, area->vis, FALSE, FALSE, 0);

g_signal_connect (area->main, "draw", (GCallback) draw_cb, NULL);
g_signal_connect (area->vis, "draw", (GCallback) draw_vis_cb, NULL);

hook_associate ("playlist update", (HookFunction) ui_infoarea_set_title, NULL);
hook_associate ("playback begin", (HookFunction) ui_infoarea_playback_start, NULL);
hook_associate ("playback stop", (HookFunction) ui_infoarea_playback_stop, NULL);

aud_vis_func_add (AUD_VIS_TYPE_CLEAR, (VisFunc) vis_clear_cb);
aud_vis_func_add (AUD_VIS_TYPE_FREQ, (VisFunc) vis_render_cb);

g_signal_connect (area->box, "destroy", (GCallback) destroy_cb, NULL);

if (aud_drct_get_playing ())
Expand Down
1 change: 1 addition & 0 deletions src/gtkui/ui_infoarea.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
#include <gtk/gtk.h>

GtkWidget * ui_infoarea_new (void);
void ui_infoarea_show_vis (gboolean show);

#endif

0 comments on commit a03e7a6

Please sign in to comment.