view audacious/playlist_slider.c @ 1447:7ca5bef8d9ee trunk

[svn] - fix invalid frees
author nenolod
date Fri, 28 Jul 2006 02:27:19 -0700
parents 5c457dac866a
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 "playlist_slider.h"

#include <glib.h>

#include "playlist.h"
#include "ui_playlist.h"
#include "skin.h"
#include "widget.h"

void
playlistslider_draw(Widget * w)
{
    PlaylistSlider *ps = (PlaylistSlider *) w;
    GdkPixmap *obj;
    gint y, skinx;

    g_return_if_fail(ps != NULL);
    g_return_if_fail(ps->ps_list != NULL);

    if (playlist_get_length() > ps->ps_list->pl_num_visible)
        y = (ps->ps_list->pl_first * (ps->ps_widget.height - 19)) /
            (playlist_get_length() - ps->ps_list->pl_num_visible);
    else
        y = 0;

    obj = ps->ps_widget.parent;

    if (ps->ps_back_image) {
        if (skin_get_id() != ps->ps_skin_id)
            ps->ps_skin_id = skin_get_id();
        else if (ps->ps_widget.height == ps->ps_prev_height)
            gdk_draw_image(obj, ps->ps_widget.gc,
                           ps->ps_back_image, 0, 0,
                           ps->ps_widget.x,
                           ps->ps_widget.y + ps->ps_prev_y, 8, 18);
        gdk_image_destroy(ps->ps_back_image);
    }

    ps->ps_prev_y = y;
    ps->ps_prev_height = ps->ps_widget.height;
    ps->ps_back_image = gdk_drawable_get_image(obj, ps->ps_widget.x,
                                               ps->ps_widget.y + y, 8, 18);
    if (ps->ps_is_draging)
        skinx = 61;
    else
        skinx = 52;

    skin_draw_pixmap(bmp_active_skin, obj, ps->ps_widget.gc, SKIN_PLEDIT,
                     skinx, 53, ps->ps_widget.x, ps->ps_widget.y + y, 8, 18);
}

static void
playlistslider_set_pos(PlaylistSlider * ps, gint y)
{
    gint pos;

    y = CLAMP(y, 0, ps->ps_widget.height - 19);

    pos = (y * (playlist_get_length() - ps->ps_list->pl_num_visible)) /
        (ps->ps_widget.height - 19);
    playlistwin_set_toprow(pos);
}


void
playlistslider_button_press_cb(GtkWidget * widget,
                               GdkEventButton * event, PlaylistSlider * ps)
{
    gint y = event->y - ps->ps_widget.y;

    if (!widget_contains(&ps->ps_widget, event->x, event->y))
        return;

    if (event->button != 1 && event->button != 2)
        return;

    if ((y >= ps->ps_prev_y && y < ps->ps_prev_y + 18)) {
        ps->ps_is_draging |= event->button;
        ps->ps_drag_y = y - ps->ps_prev_y;
        widget_draw(WIDGET(ps));
    }
    else if (event->button == 2) {
        playlistslider_set_pos(ps, y);
        ps->ps_is_draging |= event->button;
        ps->ps_drag_y = 0;
        widget_draw(WIDGET(ps));
    }
    else {
        gint n = ps->ps_list->pl_num_visible / 2;
        if (y < ps->ps_prev_y)
            n *= -1;
        playlistwin_scroll(n);
    }
}

void
playlistslider_button_release_cb(GtkWidget * widget,
                                 GdkEventButton * event,
                                 PlaylistSlider * ps)
{
    if (ps->ps_is_draging) {
        ps->ps_is_draging &= ~event->button;
        widget_draw(WIDGET(ps));
    }
}

void
playlistslider_motion_cb(GtkWidget * widget, GdkEventMotion * event,
                         PlaylistSlider * ps)
{
    gint y;

    if (!ps->ps_is_draging)
        return;

    y = event->y - ps->ps_widget.y - ps->ps_drag_y;
    playlistslider_set_pos(ps, y);
}

PlaylistSlider *
create_playlistslider(GList ** wlist, GdkPixmap * parent,
                      GdkGC * gc, gint x, gint y, gint h,
                      PlayList_List * list)
{
    PlaylistSlider *ps;

    ps = g_new0(PlaylistSlider, 1);
    widget_init(&ps->ps_widget, parent, gc, x, y, 8, h, 1);

    ps->ps_widget.button_press_cb =
        (void (*)(GtkWidget *, GdkEventButton *, gpointer))
        playlistslider_button_press_cb;

    ps->ps_widget.button_release_cb =
        (void (*)(GtkWidget *, GdkEventButton *, gpointer))
        playlistslider_button_release_cb;

    ps->ps_widget.motion_cb =
        (void (*)(GtkWidget *, GdkEventMotion *, gpointer))
        playlistslider_motion_cb;

    ps->ps_widget.draw = playlistslider_draw;
    ps->ps_list = list;

    widget_list_add(wlist, WIDGET(ps));
    return ps;
}