blob: c2e24e0737626bc2f3a34299be797aa6857e0a2c [file] [log] [blame]
/*
* Copyright (C) 2007, 2009 Holger Hans Peter Freyther zecke@selfish.org
* Copyright (C) 2010 Gustavo Noronha Silva <gns@gnome.org>
* Copyright (C) 2010 Collabora Ltd.
* Copyright (C) 2010 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include "MainFrameScrollbarGtk.h"
#include "GraphicsContext.h"
#include "GtkVersioning.h"
#include "IntRect.h"
#include <gtk/gtk.h>
using namespace WebCore;
PassRefPtr<MainFrameScrollbarGtk> MainFrameScrollbarGtk::create(ScrollbarClient* client, ScrollbarOrientation orientation, GtkAdjustment* adj)
{
return adoptRef(new MainFrameScrollbarGtk(client, orientation, adj));
}
// Main frame scrollbars are slaves to a GtkAdjustment. If a main frame
// scrollbar has an m_adjustment, it belongs to the container (a GtkWidget such
// as GtkScrolledWindow). The adjustment may also be null, in which case there
// is no containing view or the parent ScrollView is in some sort of transition
// state. These scrollbars are never painted, as the container takes care of
// that. They exist only to shuttle data from the GtkWidget container into
// WebCore and vice-versa.
MainFrameScrollbarGtk::MainFrameScrollbarGtk(ScrollbarClient* client, ScrollbarOrientation orientation, GtkAdjustment* adjustment)
: Scrollbar(client, orientation, RegularScrollbar)
, m_adjustment(0)
{
attachAdjustment(adjustment);
// We have nothing to show as we are solely operating on the GtkAdjustment.
resize(0, 0);
}
MainFrameScrollbarGtk::~MainFrameScrollbarGtk()
{
if (m_adjustment)
detachAdjustment();
}
void MainFrameScrollbarGtk::attachAdjustment(GtkAdjustment* adjustment)
{
if (m_adjustment)
detachAdjustment();
m_adjustment = adjustment;
if (!m_adjustment)
return;
g_signal_connect(m_adjustment.get(), "value-changed", G_CALLBACK(MainFrameScrollbarGtk::gtkValueChanged), this);
updateThumbProportion();
updateThumbPosition();
}
void MainFrameScrollbarGtk::detachAdjustment()
{
if (!m_adjustment)
return;
g_signal_handlers_disconnect_by_func(G_OBJECT(m_adjustment.get()), (gpointer)MainFrameScrollbarGtk::gtkValueChanged, this);
// For the case where we only operate on the GtkAdjustment it is best to
// reset the values so that the surrounding scrollbar gets updated, or
// e.g. for a GtkScrolledWindow the scrollbar gets hidden.
gtk_adjustment_configure(m_adjustment.get(), 0, 0, 0, 0, 0, 0);
m_adjustment = 0;
}
void MainFrameScrollbarGtk::updateThumbPosition()
{
if (!m_adjustment || gtk_adjustment_get_value(m_adjustment.get()) == m_currentPos)
return;
gtk_adjustment_set_value(m_adjustment.get(), m_currentPos);
}
void MainFrameScrollbarGtk::updateThumbProportion()
{
if (!m_adjustment)
return;
gtk_adjustment_configure(m_adjustment.get(),
gtk_adjustment_get_value(m_adjustment.get()),
gtk_adjustment_get_lower(m_adjustment.get()),
m_totalSize,
m_lineStep,
m_pageStep,
m_visibleSize);
}
void MainFrameScrollbarGtk::gtkValueChanged(GtkAdjustment*, MainFrameScrollbarGtk* that)
{
that->setValue(static_cast<int>(gtk_adjustment_get_value(that->m_adjustment.get())), NotFromScrollAnimator);
}
void MainFrameScrollbarGtk::paint(GraphicsContext* context, const IntRect& rect)
{
// Main frame scrollbars are not painted by WebCore.
return;
}