diff options
Diffstat (limited to 'Source/WebCore/platform/gtk/MainFrameScrollbarGtk.cpp')
-rw-r--r-- | Source/WebCore/platform/gtk/MainFrameScrollbarGtk.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/Source/WebCore/platform/gtk/MainFrameScrollbarGtk.cpp b/Source/WebCore/platform/gtk/MainFrameScrollbarGtk.cpp new file mode 100644 index 0000000..c2e24e0 --- /dev/null +++ b/Source/WebCore/platform/gtk/MainFrameScrollbarGtk.cpp @@ -0,0 +1,118 @@ +/* + * 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; +} |