view audacious/eq_slider.c @ 320:d8889f819081 trunk

[svn] Dereferencing type-punned pointer will break strict-aliasing rules squashed by Mark Loeser <halcy0n@gentoo.org>.
author chainsaw
date Sun, 18 Dec 2005 11:42:07 -0800
parents cb178e5ad177
children f12d7e208b43
line wrap: on
line source

/*  BMP - Cross-platform multimedia player
 *  Copyright (C) 2003-2004  BMP development team.
 *
 *  Based on XMMS:
 *  Copyright (C) 1998-2003  XMMS development team.
 *
 *  This program 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; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program 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 this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "eq_slider.h"

#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>

#include "equalizer.h"
#include "mainwin.h"
#include "skin.h"

void
eqslider_set_position(EqSlider * es,
                      gfloat pos)
{
    es->es_position = 25 - (gint) ((pos * 25.0) / 20.0);

    if (es->es_position < 0)
        es->es_position = 0;

    if (es->es_position > 50)
        es->es_position = 50;

    if (es->es_position >= 24 && es->es_position <= 26)
        es->es_position = 25;

    widget_draw(WIDGET(es));
}

gfloat
eqslider_get_position(EqSlider * es)
{
    return 20.0 - (((gfloat) es->es_position * 20.0) / 25.0);
}

void
eqslider_draw(Widget * w)
{
    EqSlider *es = (EqSlider *) w;
    GdkPixmap *obj;
    SkinPixmapId src;
    gint frame;

    src = SKIN_EQMAIN;
    obj = es->es_widget.parent;

    frame = 27 - ((es->es_position * 27) / 50);
    if (frame < 14)
        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src,
                         (frame * 15) + 13, 164, es->es_widget.x,
                         es->es_widget.y, es->es_widget.width,
                         es->es_widget.height);
    else
        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src,
                         ((frame - 14) * 15) + 13, 229, es->es_widget.x,
                         es->es_widget.y, es->es_widget.width,
                         es->es_widget.height);
    if (es->es_isdragging)
        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src, 0,
                         176, es->es_widget.x + 1,
                         es->es_widget.y + es->es_position, 11, 11);
    else
        skin_draw_pixmap(bmp_active_skin, obj, es->es_widget.gc, src, 0,
                         164, es->es_widget.x + 1,
                         es->es_widget.y + es->es_position, 11, 11);
}

void
eqslider_set_mainwin_text(EqSlider * es)
{
    gint band = 0;
    const gchar *bandname[11] = { N_("PREAMP"), N_("60HZ"), N_("170HZ"),
        N_("310HZ"), N_("600HZ"), N_("1KHZ"),
        N_("3KHZ"), N_("6KHZ"), N_("12KHZ"),
        N_("14KHZ"), N_("16KHZ")
    };
    gchar *tmp;

    if (es->es_widget.x > 21)
        band = ((es->es_widget.x - 78) / 18) + 1;

    tmp =
        g_strdup_printf("EQ: %s: %+.1f DB", _(bandname[band]),
                        eqslider_get_position(es));
    mainwin_lock_info_text(tmp);
    g_free(tmp);
}

void
eqslider_button_press_cb(GtkWidget * w,
                         GdkEventButton * event,
                         gpointer data)
{
    EqSlider *es = EQ_SLIDER(data);
    gint y;

    if (widget_contains(&es->es_widget, event->x, event->y)) {
        if (event->button == 1) {
            y = event->y - es->es_widget.y;
            es->es_isdragging = TRUE;
            if (y >= es->es_position && y < es->es_position + 11)
                es->es_drag_y = y - es->es_position;
            else {
                es->es_position = y - 5;
                es->es_drag_y = 5;
                if (es->es_position < 0)
                    es->es_position = 0;
                if (es->es_position > 50)
                    es->es_position = 50;
                if (es->es_position >= 24 && es->es_position <= 26)
                    es->es_position = 25;
                equalizerwin_eq_changed();
            }

            eqslider_set_mainwin_text(es);
            widget_draw(WIDGET(es));
        }
        if (event->button == 4) {
            es->es_position -= 2;
            if (es->es_position < 0)
                es->es_position = 0;
            equalizerwin_eq_changed();
            widget_draw(WIDGET(es));
        }
    }
}

void
eqslider_mouse_scroll_cb(GtkWidget * w,
                         GdkEventScroll * event,
                         gpointer data)
{
    EqSlider *es = EQ_SLIDER(data);

    if (!widget_contains(&es->es_widget, event->x, event->y))
        return;

    if (event->direction == GDK_SCROLL_UP) {
        es->es_position -= 2;

        if (es->es_position < 0)
            es->es_position = 0;

        equalizerwin_eq_changed();
        widget_draw(WIDGET(es));
    }
    else {
        es->es_position += 2;

        if (es->es_position > 50)
            es->es_position = 50;

        equalizerwin_eq_changed();
        widget_draw(WIDGET(es));
    }
}

void
eqslider_motion_cb(GtkWidget * w,
                   GdkEventMotion * event,
                   gpointer data)
{
    EqSlider *es = EQ_SLIDER(data);
    gint y;

    y = event->y - es->es_widget.y;
    if (es->es_isdragging) {
        es->es_position = y - es->es_drag_y;
        if (es->es_position < 0)
            es->es_position = 0;
        if (es->es_position > 50)
            es->es_position = 50;
        if (es->es_position >= 24 && es->es_position <= 26)
            es->es_position = 25;
        equalizerwin_eq_changed();
        eqslider_set_mainwin_text(es);
        widget_draw(WIDGET(es));
    }
}

void
eqslider_button_release_cb(GtkWidget * w,
                           GdkEventButton * event,
                           gpointer data)
{
    EqSlider *es = EQ_SLIDER(data);

    if (es->es_isdragging) {
        es->es_isdragging = FALSE;
        mainwin_release_info_text();
        widget_draw(WIDGET(es));
    }
}

EqSlider *
create_eqslider(GList ** wlist,
                GdkPixmap * parent,
                GdkGC * gc,
                gint x, gint y)
{
    EqSlider *es;

    es = g_new0(EqSlider, 1);
    widget_init(&es->es_widget, parent, gc, x, y, 14, 63, TRUE);
    es->es_widget.button_press_cb = eqslider_button_press_cb;
    es->es_widget.button_release_cb = eqslider_button_release_cb;
    es->es_widget.motion_cb = eqslider_motion_cb;
    es->es_widget.draw = eqslider_draw;
    es->es_widget.mouse_scroll_cb = eqslider_mouse_scroll_cb;

    widget_list_add(wlist, WIDGET(es));

    return es;
}