Diff
Modified: trunk/Source/WebCore/ChangeLog (173058 => 173059)
--- trunk/Source/WebCore/ChangeLog 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/ChangeLog 2014-08-28 09:13:58 UTC (rev 173059)
@@ -1,3 +1,41 @@
+2014-08-28 Carlos Garcia Campos <cgar...@igalia.com>
+
+ [GTK] Remove support for GTK+2 theme rendering
+ https://bugs.webkit.org/show_bug.cgi?id=136285
+
+ Reviewed by Philippe Normand.
+
+ GTK+2 is only used by the plugin process that doesn't need to
+ render html controls themed. Since the theme files are still
+ built for WebCorePlatformGTK2, we need to provide dummy
+ implementations for the pure virtual methods when
+ GTK_API_VERSION_2 is defined.
+
+ * PlatformGTK.cmake: Remove deleted files from compilation.
+ * platform/gtk/RenderThemeGtk.cpp:
+ (WebCore::RenderThemeGtk::create):
+ (WebCore::RenderTheme::themeForPage):
+ (WebCore::getScreenDPI):
+ (WebCore::RenderThemeGtk::systemFont):
+ (WebCore::RenderThemeGtk::sliderTickSize):
+ (WebCore::RenderThemeGtk::sliderTickOffsetFromTrackCenter):
+ (WebCore::RenderThemeGtk::getScreenDPI): Deleted.
+ * platform/gtk/RenderThemeGtk.h:
+ * platform/gtk/RenderThemeGtk2.cpp: Removed.
+ * platform/gtk/RenderThemeGtk3.cpp:
+ * platform/gtk/ScrollbarThemeGtk.cpp:
+ (WebCore::ScrollbarThemeGtk::hasThumb):
+ (WebCore::ScrollbarThemeGtk::backButtonRect):
+ (WebCore::ScrollbarThemeGtk::forwardButtonRect):
+ (WebCore::ScrollbarThemeGtk::trackRect):
+ (WebCore::ScrollbarThemeGtk::registerScrollbar):
+ (WebCore::ScrollbarThemeGtk::unregisterScrollbar):
+ (WebCore::ScrollbarThemeGtk::updateScrollbarsFrameThickness):
+ * platform/gtk/ScrollbarThemeGtk.h:
+ * platform/gtk/ScrollbarThemeGtk2.cpp: Removed.
+ * platform/gtk/WidgetRenderingContext.cpp: Removed.
+ * platform/gtk/WidgetRenderingContext.h: Removed.
+
2014-08-28 Zan Dobersek <zdober...@igalia.com>
Unreviewed GTK build fix for the Wayland windowing target after r173052.
Modified: trunk/Source/WebCore/PlatformGTK.cmake (173058 => 173059)
--- trunk/Source/WebCore/PlatformGTK.cmake 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/PlatformGTK.cmake 2014-08-28 09:13:58 UTC (rev 173059)
@@ -239,10 +239,8 @@
platform/gtk/PlatformWheelEventGtk.cpp
platform/gtk/RedirectedXCompositeWindow.cpp
platform/gtk/RenderThemeGtk.cpp
- platform/gtk/RenderThemeGtk2.cpp
platform/gtk/RenderThemeGtk3.cpp
platform/gtk/ScrollbarThemeGtk.cpp
- platform/gtk/ScrollbarThemeGtk2.cpp
platform/gtk/ScrollbarThemeGtk3.cpp
platform/gtk/SharedBufferGtk.cpp
platform/gtk/SharedTimerGtk.cpp
@@ -252,7 +250,6 @@
platform/gtk/WebKitAuthenticationWidget.cpp
platform/gtk/WidgetBackingStoreGtkX11.cpp
platform/gtk/WidgetGtk.cpp
- platform/gtk/WidgetRenderingContext.cpp
)
if (WTF_USE_GEOCLUE2)
Modified: trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGtk.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -50,12 +50,82 @@
#include <gdk/gdk.h>
#include <glib.h>
#include <gtk/gtk.h>
+#include <wtf/gobject/GRefPtr.h>
#include <wtf/gobject/GUniquePtr.h>
#include <wtf/text/CString.h>
#include <wtf/text/StringBuilder.h>
namespace WebCore {
+PassRefPtr<RenderTheme> RenderThemeGtk::create()
+{
+ return adoptRef(new RenderThemeGtk());
+}
+
+PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page*)
+{
+ static RenderTheme* rt = RenderThemeGtk::create().leakRef();
+ return rt;
+}
+
+static double getScreenDPI()
+{
+ // FIXME: Really this should be the widget's screen.
+ GdkScreen* screen = gdk_screen_get_default();
+ if (!screen)
+ return 96; // Default to 96 DPI.
+
+ float dpi = gdk_screen_get_resolution(screen);
+ if (dpi <= 0)
+ return 96;
+ return dpi;
+}
+
+void RenderThemeGtk::systemFont(CSSValueID, FontDescription& fontDescription) const
+{
+ GtkSettings* settings = gtk_settings_get_default();
+ if (!settings)
+ return;
+
+ // This will be a font selection string like "Sans 10" so we cannot use it as the family name.
+ GUniqueOutPtr<gchar> fontName;
+ g_object_get(settings, "gtk-font-name", &fontName.outPtr(), NULL);
+
+ PangoFontDescription* pangoDescription = pango_font_description_from_string(fontName.get());
+ if (!pangoDescription)
+ return;
+
+ fontDescription.setOneFamily(pango_font_description_get_family(pangoDescription));
+
+ int size = pango_font_description_get_size(pangoDescription) / PANGO_SCALE;
+ // If the size of the font is in points, we need to convert it to pixels.
+ if (!pango_font_description_get_size_is_absolute(pangoDescription))
+ size = size * (getScreenDPI() / 72.0);
+
+ fontDescription.setSpecifiedSize(size);
+ fontDescription.setIsAbsoluteSize(true);
+ fontDescription.setGenericFamily(FontDescription::NoFamily);
+ fontDescription.setWeight(FontWeightNormal);
+ fontDescription.setItalic(false);
+ pango_font_description_free(pangoDescription);
+}
+
+#if ENABLE(DATALIST_ELEMENT)
+IntSize RenderThemeGtk::sliderTickSize() const
+{
+ // FIXME: We need to set this to the size of one tick mark.
+ return IntSize(0, 0);
+}
+
+int RenderThemeGtk::sliderTickOffsetFromTrackCenter() const
+{
+ // FIXME: We need to set this to the position of the tick marks.
+ return 0;
+}
+#endif
+
+#ifndef GTK_API_VERSION_2
+
// This would be a static method, except that forward declaring GType is tricky, since its
// definition depends on including glib.h, negating the benefit of using a forward declaration.
extern GRefPtr<GdkPixbuf> getStockIconForWidgetType(GType, const char* iconName, gint direction, gint state, gint iconSize);
@@ -121,17 +191,6 @@
return element->classNames().contains(className);
}
-PassRefPtr<RenderTheme> RenderThemeGtk::create()
-{
- return adoptRef(new RenderThemeGtk());
-}
-
-PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page*)
-{
- static RenderTheme* rt = RenderThemeGtk::create().leakRef();
- return rt;
-}
-
RenderThemeGtk::RenderThemeGtk()
: m_panelColor(Color::white)
, m_sliderColor(Color::white)
@@ -190,7 +249,7 @@
return RenderTheme::baselinePosition(o);
}
-// This is used in RenderThemeGtk2 and RenderThemeGtk3. Normally, it would be in
+// This is used in RenderThemeGtk3. Normally, it would be in
// the RenderThemeGtk header (perhaps as a static method), but we want to avoid
// having to include GTK+ headers only for the GtkTextDirection enum.
GtkTextDirection gtkTextDirection(TextDirection direction)
@@ -437,48 +496,6 @@
return time / 2000.;
}
-double RenderThemeGtk::getScreenDPI()
-{
- // FIXME: Really this should be the widget's screen.
- GdkScreen* screen = gdk_screen_get_default();
- if (!screen)
- return 96; // Default to 96 DPI.
-
- float dpi = gdk_screen_get_resolution(screen);
- if (dpi <= 0)
- return 96;
- return dpi;
-}
-
-void RenderThemeGtk::systemFont(CSSValueID, FontDescription& fontDescription) const
-{
- GtkSettings* settings = gtk_settings_get_default();
- if (!settings)
- return;
-
- // This will be a font selection string like "Sans 10" so we cannot use it as the family name.
- GUniqueOutPtr<gchar> fontName;
- g_object_get(settings, "gtk-font-name", &fontName.outPtr(), NULL);
-
- PangoFontDescription* pangoDescription = pango_font_description_from_string(fontName.get());
- if (!pangoDescription)
- return;
-
- fontDescription.setOneFamily(pango_font_description_get_family(pangoDescription));
-
- int size = pango_font_description_get_size(pangoDescription) / PANGO_SCALE;
- // If the size of the font is in points, we need to convert it to pixels.
- if (!pango_font_description_get_size_is_absolute(pangoDescription))
- size = size * (getScreenDPI() / 72.0);
-
- fontDescription.setSpecifiedSize(size);
- fontDescription.setIsAbsoluteSize(true);
- fontDescription.setGenericFamily(FontDescription::NoFamily);
- fontDescription.setWeight(FontWeightNormal);
- fontDescription.setItalic(false);
- pango_font_description_free(pangoDescription);
-}
-
void RenderThemeGtk::platformColorsDidChange()
{
#if ENABLE(VIDEO)
@@ -739,20 +756,6 @@
return StringTruncator::centerTruncate(string, width, font, StringTruncator::EnableRoundingHacks);
}
-#if ENABLE(DATALIST_ELEMENT)
-IntSize RenderThemeGtk::sliderTickSize() const
-{
- // FIXME: We need to set this to the size of one tick mark.
- return IntSize(0, 0);
-}
-
-int RenderThemeGtk::sliderTickOffsetFromTrackCenter() const
-{
- // FIXME: We need to set this to the position of the tick marks.
- return 0;
-}
-#endif
-
String RenderThemeGtk::mediaControlsScript()
{
StringBuilder scriptBuilder;
@@ -761,4 +764,6 @@
scriptBuilder.append(mediaControlsGtkJavaScript, sizeof(mediaControlsGtkJavaScript));
return scriptBuilder.toString();
}
+
+#endif // GTK_API_VERSION_2
}
Modified: trunk/Source/WebCore/platform/gtk/RenderThemeGtk.h (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/RenderThemeGtk.h 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGtk.h 2014-08-28 09:13:58 UTC (rev 173059)
@@ -28,21 +28,27 @@
#ifndef RenderThemeGtk_h
#define RenderThemeGtk_h
-#include <wtf/gobject/GRefPtr.h>
#include "RenderTheme.h"
-typedef struct _GdkColormap GdkColormap;
-
namespace WebCore {
class RenderThemeGtk final : public RenderTheme {
-private:
- RenderThemeGtk();
- virtual ~RenderThemeGtk();
-
public:
static PassRefPtr<RenderTheme> create();
+ // System fonts.
+ virtual void systemFont(CSSValueID, FontDescription&) const override;
+
+#if ENABLE(DATALIST_ELEMENT)
+ // Returns size of one slider tick mark for a horizontal track.
+ // For vertical tracks we rotate it and use it. i.e. Width is always length along the track.
+ virtual IntSize sliderTickSize() const override;
+ // Returns the distance of slider tick origin from the slider track center.
+ virtual int sliderTickOffsetFromTrackCenter() const override;
+#endif
+
+#ifndef GTK_API_VERSION_2
+
// A method asking if the theme's controls actually care about redrawing when hovered.
virtual bool supportsHover(const RenderStyle&) const override { return true; }
@@ -78,8 +84,7 @@
virtual void platformColorsDidChange() override;
- // System fonts and colors.
- virtual void systemFont(CSSValueID, FontDescription&) const override;
+ // System colors.
virtual Color systemColor(CSSValueID) const override;
virtual bool popsMenuBySpaceOrReturn() const override { return true; }
@@ -95,25 +100,12 @@
#endif
#endif
-#if ENABLE(DATALIST_ELEMENT)
- // Returns size of one slider tick mark for a horizontal track.
- // For vertical tracks we rotate it and use it. i.e. Width is always length along the track.
- virtual IntSize sliderTickSize() const override;
- // Returns the distance of slider tick origin from the slider track center.
- virtual int sliderTickOffsetFromTrackCenter() const override;
-#endif
-
-#ifdef GTK_API_VERSION_2
- GtkWidget* gtkContainer() const;
- GtkWidget* gtkEntry() const;
- GtkWidget* gtkVScrollbar() const;
- GtkWidget* gtkHScrollbar() const;
- static void getIndicatorMetrics(ControlPart, int& indicatorSize, int& indicatorSpacing);
-#else
GtkStyleContext* gtkScrollbarStyle();
-#endif
private:
+ RenderThemeGtk();
+ virtual ~RenderThemeGtk();
+
virtual bool paintCheckbox(const RenderObject&, const PaintInfo&, const IntRect&) override;
virtual void setCheckboxSize(RenderStyle&) const override;
@@ -194,7 +186,6 @@
void platformInit();
static void setTextInputBorders(RenderStyle&);
- static double getScreenDPI();
#if ENABLE(VIDEO)
bool paintMediaButton(const RenderObject&, GraphicsContext*, const IntRect&, const char* symbolicIconName, const char* fallbackStockIconName);
@@ -207,48 +198,7 @@
mutable Color m_sliderThumbColor;
const int m_mediaIconSize;
const int m_mediaSliderHeight;
-
-#ifdef GTK_API_VERSION_2
- void setupWidgetAndAddToContainer(GtkWidget*, GtkWidget*) const;
- void refreshComboBoxChildren() const;
- void getComboBoxPadding(RenderStyle&, int& left, int& top, int& right, int& bottom) const;
- int getComboBoxSeparatorWidth() const;
- int comboBoxArrowSize(RenderStyle&) const;
-
- GtkWidget* gtkButton() const;
- GtkWidget* gtkTreeView() const;
- GtkWidget* gtkVScale() const;
- GtkWidget* gtkHScale() const;
- GtkWidget* gtkRadioButton() const;
- GtkWidget* gtkCheckButton() const;
- GtkWidget* gtkProgressBar() const;
- GtkWidget* gtkComboBox() const;
- GtkWidget* gtkComboBoxButton() const;
- GtkWidget* gtkComboBoxArrow() const;
- GtkWidget* gtkComboBoxSeparator() const;
- GtkWidget* gtkSpinButton() const;
-
- GdkColormap* m_colormap;
- mutable GtkWidget* m_gtkWindow;
- mutable GtkWidget* m_gtkContainer;
- mutable GtkWidget* m_gtkButton;
- mutable GtkWidget* m_gtkEntry;
- mutable GtkWidget* m_gtkTreeView;
- mutable GtkWidget* m_gtkVScale;
- mutable GtkWidget* m_gtkHScale;
- mutable GtkWidget* m_gtkRadioButton;
- mutable GtkWidget* m_gtkCheckButton;
- mutable GtkWidget* m_gtkProgressBar;
- mutable GtkWidget* m_gtkComboBox;
- mutable GtkWidget* m_gtkComboBoxButton;
- mutable GtkWidget* m_gtkComboBoxArrow;
- mutable GtkWidget* m_gtkComboBoxSeparator;
- mutable GtkWidget* m_gtkVScrollbar;
- mutable GtkWidget* m_gtkHScrollbar;
- mutable GtkWidget* m_gtkSpinButton;
- bool m_themePartsHaveRGBAColormap;
- friend class WidgetRenderingContext;
-#endif
+#endif // GTK_API_VERSION_2
};
}
Deleted: trunk/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -1,969 +0,0 @@
-/*
- * Copyright (C) 2007 Apple Inc.
- * Copyright (C) 2007 Alp Toker <a...@atoker.com>
- * Copyright (C) 2008 Collabora Ltd.
- * Copyright (C) 2009 Kenneth Rohde Christiansen
- * 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 Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#include "config.h"
-#include "RenderThemeGtk.h"
-
-#ifdef GTK_API_VERSION_2
-
-// We need this to allow building while using GTK_WIDGET_SET_FLAGS. It's deprecated
-// but some theme engines require it to ensure proper rendering of focus indicators.
-#undef GTK_DISABLE_DEPRECATED
-
-#include "CSSValueKeywords.h"
-#include "Font.h"
-#include "GraphicsContext.h"
-#include "GtkVersioning.h"
-#include "HTMLNames.h"
-#include "MediaControlElements.h"
-#include "PaintInfo.h"
-#include "RenderElement.h"
-#include "TextDirection.h"
-#include "UserAgentStyleSheets.h"
-#include "WidgetRenderingContext.h"
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-
-namespace WebCore {
-
-// This is the default value defined by GTK+, where it was defined as MIN_ARROW_WIDTH in gtkspinbutton.c.
-static const int minSpinButtonArrowSize = 6;
-
-// This is not a static method, because we want to avoid having GTK+ headers in RenderThemeGtk.h.
-extern GtkTextDirection gtkTextDirection(TextDirection);
-
-void RenderThemeGtk::platformInit()
-{
- m_themePartsHaveRGBAColormap = true;
- m_gtkWindow = 0;
- m_gtkContainer = 0;
- m_gtkButton = 0;
- m_gtkEntry = 0;
- m_gtkTreeView = 0;
- m_gtkVScale = 0;
- m_gtkHScale = 0;
- m_gtkRadioButton = 0;
- m_gtkCheckButton = 0;
- m_gtkProgressBar = 0;
- m_gtkComboBox = 0;
- m_gtkComboBoxButton = 0;
- m_gtkComboBoxArrow = 0;
- m_gtkComboBoxSeparator = 0;
- m_gtkVScrollbar = 0;
- m_gtkHScrollbar = 0;
- m_gtkSpinButton = 0;
-
- m_colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default());
- if (!m_colormap) {
- m_themePartsHaveRGBAColormap = false;
- m_colormap = gdk_screen_get_default_colormap(gdk_screen_get_default());
- }
-}
-
-RenderThemeGtk::~RenderThemeGtk()
-{
- if (m_gtkWindow)
- gtk_widget_destroy(m_gtkWindow);
-}
-
-#if ENABLE(VIDEO)
-void RenderThemeGtk::initMediaColors()
-{
- GtkStyle* style = gtk_widget_get_style(GTK_WIDGET(gtkContainer()));
- m_panelColor = style->bg[GTK_STATE_NORMAL];
- m_sliderColor = style->bg[GTK_STATE_ACTIVE];
- m_sliderThumbColor = style->bg[GTK_STATE_SELECTED];
-}
-#endif
-
-static void adjustRectForFocus(GtkWidget* widget, FloatRect& rect, bool ignoreInteriorFocusProperty = false)
-{
- gint focusWidth, focusPad;
- gboolean interiorFocus = 0;
- gtk_widget_style_get(widget,
- "interior-focus", &interiorFocus,
- "focus-line-width", &focusWidth,
- "focus-padding", &focusPad, NULL);
- if (!ignoreInteriorFocusProperty && interiorFocus)
- return;
- rect.inflate(focusWidth + focusPad);
-}
-
-void RenderThemeGtk::adjustRepaintRect(const RenderObject& renderObject, FloatRect& rect)
-{
- ControlPart part = renderObject.style().appearance();
- switch (part) {
- case CheckboxPart:
- case RadioPart: {
- // We ignore the interior focus property and always expand the focus rect. In GTK+, the
- // focus indicator is usually on the text next to a checkbox or radio button, but that doesn't
- // happen in WebCore. By expanding the focus rectangle unconditionally we increase its prominence.
- adjustRectForFocus(part == CheckboxPart ? gtkCheckButton() : gtkRadioButton(), rect, true);
- return;
- }
- case InnerSpinButtonPart:
- // See paintInnerSpinButton for an explanation of why we expand the painting rect.
- rect.inflateY(2);
- rect.setWidth(rect.width() + 2);
- default:
- return;
- }
-}
-
-static GtkStateType getGtkStateType(RenderThemeGtk* theme, const RenderObject& object)
-{
- if (!theme->isEnabled(object) || theme->isReadOnlyControl(object))
- return GTK_STATE_INSENSITIVE;
- if (theme->isPressed(object))
- return GTK_STATE_ACTIVE;
- if (theme->isHovered(object))
- return GTK_STATE_PRELIGHT;
- return GTK_STATE_NORMAL;
-}
-
-static void setToggleSize(const RenderThemeGtk*, RenderStyle& style, GtkWidget* widget)
-{
- // The width and height are both specified, so we shouldn't change them.
- if (!style.width().isIntrinsicOrAuto() && !style.height().isAuto())
- return;
-
- gint indicatorSize;
- gtk_widget_style_get(widget, "indicator-size", &indicatorSize, NULL);
- if (style.width().isIntrinsicOrAuto())
- style.setWidth(Length(indicatorSize, Fixed));
- if (style.height().isAuto())
- style.setHeight(Length(indicatorSize, Fixed));
-}
-
-static void paintToggle(RenderThemeGtk* theme, const RenderObject& renderObject, const PaintInfo& info, const IntRect& rect, GtkWidget* widget)
-{
- // We do not call gtk_toggle_button_set_active here, because some themes begin a series of
- // animation frames in a "toggled" signal handler. This puts some checkboxes in a half-way
- // checked state. Every GTK+ theme I tested merely looks at the shadow type (and not the
- // 'active' property) to determine whether or not to draw the check.
- gtk_widget_set_sensitive(widget, theme->isEnabled(renderObject) && !theme->isReadOnlyControl(renderObject));
- gtk_widget_set_direction(widget, gtkTextDirection(renderObject.style().direction()));
-
- bool indeterminate = theme->isIndeterminate(renderObject);
- gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(widget), indeterminate);
-
- GtkShadowType shadowType = GTK_SHADOW_OUT;
- if (indeterminate) // This originates from the Mozilla code.
- shadowType = GTK_SHADOW_ETCHED_IN;
- else if (theme->isChecked(renderObject))
- shadowType = GTK_SHADOW_IN;
-
- WidgetRenderingContext widgetContext(info.context, rect);
- IntRect buttonRect(IntPoint(), rect.size());
- GtkStateType toggleState = getGtkStateType(theme, renderObject);
- const char* detail = 0;
- if (GTK_IS_RADIO_BUTTON(widget)) {
- detail = "radiobutton";
- widgetContext.gtkPaintOption(buttonRect, widget, toggleState, shadowType, detail);
- } else {
- detail = "checkbutton";
- widgetContext.gtkPaintCheck(buttonRect, widget, toggleState, shadowType, detail);
- }
-
- if (theme->isFocused(renderObject)) {
- FloatRect focusRect(buttonRect);
- adjustRectForFocus(widget, focusRect, true);
- // FIXME: adopt device pixel positioned themes.
- widgetContext.gtkPaintFocus(IntRect(focusRect), widget, toggleState, detail);
- }
-}
-
-void RenderThemeGtk::setCheckboxSize(RenderStyle& style) const
-{
- setToggleSize(this, style, gtkCheckButton());
-}
-
-bool RenderThemeGtk::paintCheckbox(const RenderObject& renderObject, const PaintInfo& info, const IntRect& rect)
-{
- paintToggle(this, renderObject, info, rect, gtkCheckButton());
- return false;
-}
-
-void RenderThemeGtk::setRadioSize(RenderStyle& style) const
-{
- setToggleSize(this, style, gtkRadioButton());
-}
-
-bool RenderThemeGtk::paintRadio(const RenderObject& renderObject, const PaintInfo& info, const IntRect& rect)
-{
- paintToggle(this, renderObject, info, rect, gtkRadioButton());
- return false;
-}
-
-static void setWidgetHasFocus(GtkWidget* widget, gboolean hasFocus)
-{
- g_object_set(widget, "has-focus", hasFocus, NULL);
-
- // These functions are deprecated in GTK+ 2.22, yet theme engines still look
- // at these flags when determining if a widget has focus, so we must use them.
- if (hasFocus)
- GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS);
- else
- GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS);
-}
-
-bool RenderThemeGtk::paintButton(const RenderObject& object, const PaintInfo& info, const IntRect& rect)
-{
- if (info.context->paintingDisabled())
- return false;
-
- GtkWidget* widget = gtkButton();
- IntRect buttonRect(IntPoint(), rect.size());
- IntRect focusRect(buttonRect);
-
- GtkStateType state = getGtkStateType(this, object);
- gtk_widget_set_state(widget, state);
- gtk_widget_set_direction(widget, gtkTextDirection(object.style().direction()));
-
- if (isFocused(object)) {
- setWidgetHasFocus(widget, TRUE);
-
- gboolean interiorFocus = 0, focusWidth = 0, focusPadding = 0;
- gtk_widget_style_get(widget,
- "interior-focus", &interiorFocus,
- "focus-line-width", &focusWidth,
- "focus-padding", &focusPadding, NULL);
- // If we are using exterior focus, we shrink the button rect down before
- // drawing. If we are using interior focus we shrink the focus rect. This
- // approach originates from the Mozilla theme drawing code (gtk2drawing.c).
- if (interiorFocus) {
- GtkStyle* style = gtk_widget_get_style(widget);
- focusRect.inflateX(-style->xthickness - focusPadding);
- focusRect.inflateY(-style->ythickness - focusPadding);
- } else {
- buttonRect.inflateX(-focusWidth - focusPadding);
- buttonRect.inflateY(-focusPadding - focusPadding);
- }
- }
-
- WidgetRenderingContext widgetContext(info.context, rect);
- GtkShadowType shadowType = state == GTK_STATE_ACTIVE ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
- widgetContext.gtkPaintBox(buttonRect, widget, state, shadowType, "button");
- if (isFocused(object))
- widgetContext.gtkPaintFocus(focusRect, widget, state, "button");
-
- setWidgetHasFocus(widget, FALSE);
- return false;
-}
-
-int RenderThemeGtk::getComboBoxSeparatorWidth() const
-{
- GtkWidget* separator = gtkComboBoxSeparator();
- if (!separator)
- return 0;
-
- gboolean hasWideSeparators = FALSE;
- gint separatorWidth = 0;
- gtk_widget_style_get(separator,
- "wide-separators", &hasWideSeparators,
- "separator-width", &separatorWidth,
- NULL);
- if (hasWideSeparators)
- return separatorWidth;
- return gtk_widget_get_style(separator)->xthickness;
-}
-
-int RenderThemeGtk::comboBoxArrowSize(RenderStyle& style) const
-{
- // Taking the font size and reversing the DPI conversion seems to match
- // GTK+ rendering as closely as possible.
- return style.font().size() * (72.0 / RenderThemeGtk::getScreenDPI());
-}
-
-static void getButtonInnerBorder(GtkWidget* button, int& left, int& top, int& right, int& bottom)
-{
- GtkStyle* style = gtk_widget_get_style(button);
- int outerBorder = gtk_container_get_border_width(GTK_CONTAINER(button));
- static GtkBorder defaultInnerBorder = {1, 1, 1, 1};
- GtkBorder* innerBorder;
- gtk_widget_style_get(button, "inner-border", &innerBorder, NULL);
- if (!innerBorder)
- innerBorder = &defaultInnerBorder;
-
- left = outerBorder + innerBorder->left + style->xthickness;
- right = outerBorder + innerBorder->right + style->xthickness;
- top = outerBorder + innerBorder->top + style->ythickness;
- bottom = outerBorder + innerBorder->bottom + style->ythickness;
-
- if (innerBorder != &defaultInnerBorder)
- gtk_border_free(innerBorder);
-}
-
-
-void RenderThemeGtk::getComboBoxPadding(RenderStyle& style, int& left, int& top, int& right, int& bottom) const
-{
- // If this menu list button isn't drawn using the native theme, we
- // don't add any extra padding beyond what WebCore already uses.
- if (style.appearance() == NoControlPart)
- return;
-
- // A combo box button is a button with widgets packed into it.
- GtkStyle* buttonWidgetStyle = gtk_widget_get_style(gtkComboBoxButton());
- getButtonInnerBorder(gtkComboBoxButton(), left, top, right, bottom);
-
- // Add xthickness amount of padding for each side of the separator. This ensures
- // that the text does not bump up against the separator.
- int arrowAndSeperatorLength = comboBoxArrowSize(style) +
- getComboBoxSeparatorWidth() + (3 * buttonWidgetStyle->xthickness);
-
- if (style.direction() == RTL)
- left += arrowAndSeperatorLength;
- else
- right += arrowAndSeperatorLength;
-}
-
-int RenderThemeGtk::popupInternalPaddingLeft(RenderStyle& style) const
-{
- int left = 0, top = 0, right = 0, bottom = 0;
- getComboBoxPadding(style, left, top, right, bottom);
- return left;
-}
-
-int RenderThemeGtk::popupInternalPaddingRight(RenderStyle& style) const
-{
- int left = 0, top = 0, right = 0, bottom = 0;
- getComboBoxPadding(style, left, top, right, bottom);
- return right;
-}
-
-int RenderThemeGtk::popupInternalPaddingTop(RenderStyle& style) const
-{
- int left = 0, top = 0, right = 0, bottom = 0;
- getComboBoxPadding(style, left, top, right, bottom);
- return top;
-}
-
-int RenderThemeGtk::popupInternalPaddingBottom(RenderStyle& style) const
-{
- int left = 0, top = 0, right = 0, bottom = 0;
- getComboBoxPadding(style, left, top, right, bottom);
- return bottom;
-}
-
-bool RenderThemeGtk::paintMenuList(const RenderObject& object, const PaintInfo& info, const FloatRect& r)
-{
- // FIXME: adopt subpixel themes.
- IntRect rect = IntRect(r);
- if (paintButton(object, info, rect))
- return true;
-
- // Menu list button painting strategy.
- // For buttons with appears-as-list set to false (having a separator):
- // | left border | Button text | xthickness | vseparator | xthickness | arrow | xthickness | right border |
- // For buttons with appears-as-list set to true (not having a separator):
- // | left border | Button text | arrow | xthickness | right border |
-
- int leftBorder = 0, rightBorder = 0, bottomBorder = 0, topBorder = 0;
- getButtonInnerBorder(gtkComboBoxButton(), leftBorder, topBorder, rightBorder, bottomBorder);
- RenderStyle& style = object.style();
- int arrowSize = comboBoxArrowSize(style);
- GtkStyle* buttonStyle = gtk_widget_get_style(gtkComboBoxButton());
-
- IntRect arrowRect(0, (rect.height() - arrowSize) / 2, arrowSize, arrowSize);
- if (style.direction() == RTL)
- arrowRect.setX(leftBorder + buttonStyle->xthickness);
- else
- arrowRect.setX(rect.width() - rightBorder - buttonStyle->xthickness - arrowSize);
- GtkShadowType shadowType = isPressed(object) ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
-
- WidgetRenderingContext widgetContext(info.context, rect);
- GtkStateType stateType = getGtkStateType(this, object);
- widgetContext.gtkPaintArrow(arrowRect, gtkComboBoxArrow(), stateType, shadowType, GTK_ARROW_DOWN, "arrow");
-
- // Some combo boxes do not have a separator.
- GtkWidget* separator = gtkComboBoxSeparator();
- if (!separator)
- return false;
-
- // We want to decrease the height of the separator based on the focus padding of the button.
- gint focusPadding = 0, focusWidth = 0;
- gtk_widget_style_get(gtkComboBoxButton(),
- "focus-line-width", &focusWidth,
- "focus-padding", &focusPadding, NULL);
- topBorder += focusPadding + focusWidth;
- bottomBorder += focusPadding + focusWidth;
- int separatorWidth = getComboBoxSeparatorWidth();
- IntRect separatorRect(0, topBorder, separatorWidth, rect.height() - topBorder - bottomBorder);
- if (style.direction() == RTL)
- separatorRect.setX(arrowRect.x() + arrowRect.width() + buttonStyle->xthickness + separatorWidth);
- else
- separatorRect.setX(arrowRect.x() - buttonStyle->xthickness - separatorWidth);
-
- gboolean hasWideSeparators = FALSE;
- gtk_widget_style_get(separator, "wide-separators", &hasWideSeparators, NULL);
- if (hasWideSeparators)
- widgetContext.gtkPaintBox(separatorRect, separator, GTK_STATE_NORMAL, GTK_SHADOW_ETCHED_OUT, "vseparator");
- else
- widgetContext.gtkPaintVLine(separatorRect, separator, GTK_STATE_NORMAL, "vseparator");
-
- return false;
-}
-
-bool RenderThemeGtk::paintTextField(const RenderObject& renderObject, const PaintInfo& info, const FloatRect& rect)
-{
- GtkWidget* widget = gtkEntry();
-
- bool enabled = isEnabled(renderObject) && !isReadOnlyControl(renderObject);
- GtkStateType backgroundState = enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE;
- gtk_widget_set_sensitive(widget, enabled);
- gtk_widget_set_direction(widget, gtkTextDirection(renderObject.style().direction()));
- setWidgetHasFocus(widget, isFocused(renderObject));
-
- WidgetRenderingContext widgetContext(info.context, IntRect(rect));
- IntRect textFieldRect(IntPoint(), IntSize(rect.size()));
-
- // The entry background is only painted over the interior part of the GTK+ entry, not
- // the entire frame. This happens in the Mozilla theme drawing code as well.
- IntRect interiorRect(textFieldRect);
- GtkStyle* style = gtk_widget_get_style(widget);
- interiorRect.inflateX(-style->xthickness);
- interiorRect.inflateY(-style->ythickness);
- widgetContext.gtkPaintFlatBox(interiorRect, widget, backgroundState, GTK_SHADOW_NONE, "entry_bg");
-
- // This is responsible for drawing the actual frame.
- widgetContext.gtkPaintShadow(textFieldRect, widget, GTK_STATE_NORMAL, GTK_SHADOW_IN, "entry");
-
- gboolean interiorFocus;
- gint focusWidth;
- gtk_widget_style_get(widget,
- "interior-focus", &interiorFocus,
- "focus-line-width", &focusWidth, NULL);
- if (isFocused(renderObject) && !interiorFocus) {
- // When GTK+ paints a text entry with focus, it shrinks the size of the frame area by the
- // focus width and paints over the previously unfocused text entry. We need to emulate that
- // by drawing both the unfocused frame above and the focused frame here.
- IntRect shadowRect(textFieldRect);
- shadowRect.inflate(-focusWidth);
- widgetContext.gtkPaintShadow(shadowRect, widget, GTK_STATE_NORMAL, GTK_SHADOW_IN, "entry");
-
- widgetContext.gtkPaintFocus(textFieldRect, widget, GTK_STATE_NORMAL, "entry");
- }
-
- return false;
-}
-
-bool RenderThemeGtk::paintSliderTrack(const RenderObject& object, const PaintInfo& info, const IntRect& rect)
-{
- if (info.context->paintingDisabled())
- return false;
-
- ControlPart part = object.style().appearance();
- ASSERT(part == SliderHorizontalPart || part == SliderVerticalPart || part == MediaVolumeSliderPart);
-
- // We shrink the trough rect slightly to make room for the focus indicator.
- IntRect troughRect(IntPoint(), rect.size()); // This is relative to rect.
- GtkWidget* widget = 0;
- if (part == SliderHorizontalPart) {
- widget = gtkHScale();
- troughRect.inflateX(-gtk_widget_get_style(widget)->xthickness);
- } else {
- widget = gtkVScale();
- troughRect.inflateY(-gtk_widget_get_style(widget)->ythickness);
- }
- gtk_widget_set_direction(widget, gtkTextDirection(object.style().direction()));
-
- WidgetRenderingContext widgetContext(info.context, rect);
- widgetContext.gtkPaintBox(troughRect, widget, GTK_STATE_ACTIVE, GTK_SHADOW_OUT, "trough");
- if (isFocused(object))
- widgetContext.gtkPaintFocus(IntRect(IntPoint(), rect.size()), widget, getGtkStateType(this, object), "trough");
-
- return false;
-}
-
-bool RenderThemeGtk::paintSliderThumb(const RenderObject& object, const PaintInfo& info, const IntRect& rect)
-{
- if (info.context->paintingDisabled())
- return false;
-
- ControlPart part = object.style().appearance();
- ASSERT(part == SliderThumbHorizontalPart || part == SliderThumbVerticalPart || part == MediaVolumeSliderThumbPart);
-
- GtkWidget* widget = 0;
- const char* detail = 0;
- GtkOrientation orientation;
- if (part == SliderThumbHorizontalPart) {
- widget = gtkHScale();
- detail = "hscale";
- orientation = GTK_ORIENTATION_HORIZONTAL;
- } else {
- widget = gtkVScale();
- detail = "vscale";
- orientation = GTK_ORIENTATION_VERTICAL;
- }
- gtk_widget_set_direction(widget, gtkTextDirection(object.style().direction()));
-
- // Only some themes have slider thumbs respond to clicks and some don't. This information is
- // gathered via the 'activate-slider' property, but it's deprecated in GTK+ 2.22 and removed in
- // GTK+ 3.x. The drawback of not honoring it is that slider thumbs change color when you click
- // on them.
- IntRect thumbRect(IntPoint(), rect.size());
- WidgetRenderingContext widgetContext(info.context, rect);
- widgetContext.gtkPaintSlider(thumbRect, widget, getGtkStateType(this, object), GTK_SHADOW_OUT, detail, orientation);
- return false;
-}
-
-void RenderThemeGtk::adjustSliderThumbSize(RenderStyle& style, Element&) const
-{
- ControlPart part = style.appearance();
- if (part != SliderThumbHorizontalPart && part != SliderThumbVerticalPart)
- return;
-
- GtkWidget* widget = part == SliderThumbHorizontalPart ? gtkHScale() : gtkVScale();
- int length = 0, width = 0;
- gtk_widget_style_get(widget,
- "slider_length", &length,
- "slider_width", &width,
- NULL);
-
- if (part == SliderThumbHorizontalPart) {
- style.setWidth(Length(length, Fixed));
- style.setHeight(Length(width, Fixed));
- return;
- }
- ASSERT(part == SliderThumbVerticalPart || part == MediaVolumeSliderThumbPart);
- style.setWidth(Length(width, Fixed));
- style.setHeight(Length(length, Fixed));
-}
-
-bool RenderThemeGtk::paintProgressBar(const RenderObject& renderObject, const PaintInfo& paintInfo, const IntRect& rect)
-{
- GtkWidget* widget = gtkProgressBar();
- gtk_widget_set_direction(widget, gtkTextDirection(renderObject.style().direction()));
-
- WidgetRenderingContext widgetContext(paintInfo.context, rect);
- IntRect fullProgressBarRect(IntPoint(), rect.size());
- widgetContext.gtkPaintBox(fullProgressBarRect, widget, GTK_STATE_NORMAL, GTK_SHADOW_IN, "trough");
-
- GtkStyle* style = gtk_widget_get_style(widget);
- IntRect progressRect(fullProgressBarRect);
- progressRect.inflateX(-style->xthickness);
- progressRect.inflateY(-style->ythickness);
- progressRect = RenderThemeGtk::calculateProgressRect(renderObject, progressRect);
-
- if (!progressRect.isEmpty())
- widgetContext.gtkPaintBox(progressRect, widget, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, "bar");
-
- return false;
-}
-
-void RenderThemeGtk::adjustInnerSpinButtonStyle(StyleResolver&, RenderStyle& style, Element&) const
-{
- GtkStyle* gtkStyle = gtk_widget_get_style(gtkSpinButton());
- const PangoFontDescription* fontDescription = gtkStyle->font_desc;
- gint fontSize = pango_font_description_get_size(fontDescription);
-
- // Force an odd arrow size here. GTK+ 3.x forces even in this case, but
- // Nodoka-based themes look incorrect with an even arrow size.
- int width = std::max(PANGO_PIXELS(fontSize), minSpinButtonArrowSize);
- width += -((width % 2) - 1) + gtkStyle->xthickness;
-
- style.setWidth(Length(width, Fixed));
- style.setMinWidth(Length(width, Fixed));
-}
-
-bool RenderThemeGtk::paintInnerSpinButton(const RenderObject& renderObject, const PaintInfo& paintInfo, const IntRect& rect)
-{
- // We expand the painted area by 2 pixels on the top and bottom and 2 pixels on the right. This
- // is because GTK+ themes want to draw over the text box borders, but WebCore renders the inner
- // spin button inside the text box.
- IntRect expandedRect(rect);
- expandedRect.inflateY(2);
- expandedRect.setWidth(rect.width() + 2);
-
- WidgetRenderingContext widgetContext(paintInfo.context, expandedRect);
- GtkWidget* widget = gtkSpinButton();
- gtk_widget_set_direction(widget, gtkTextDirection(renderObject.style().direction()));
-
- IntRect fullSpinButtonRect(IntPoint(), expandedRect.size());
- widgetContext.gtkPaintBox(fullSpinButtonRect, widget, GTK_STATE_NORMAL, GTK_SHADOW_IN, "spinbutton");
-
- bool upPressed = isSpinUpButtonPartPressed(renderObject);
- bool upHovered = isSpinUpButtonPartHovered(renderObject);
- bool controlActive = isEnabled(renderObject) && !isReadOnlyControl(renderObject);
- GtkShadowType shadowType = upPressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
-
- GtkStateType stateType = GTK_STATE_INSENSITIVE;
- if (controlActive) {
- if (isPressed(renderObject) && upPressed)
- stateType = GTK_STATE_ACTIVE;
- else if (isHovered(renderObject) && upHovered)
- stateType = GTK_STATE_PRELIGHT;
- else
- stateType = GTK_STATE_NORMAL;
- }
- IntRect topRect(IntPoint(), expandedRect.size());
- topRect.setHeight(expandedRect.height() / 2);
- widgetContext.gtkPaintBox(topRect, widget, stateType, shadowType, "spinbutton_up");
-
- // The arrow size/position calculation here is based on the arbitrary gymnastics that happen
- // in gtkspinbutton.c. It isn't pretty there and it isn't pretty here. This manages to make
- // the button look native for many themes though.
- IntRect arrowRect;
- int arrowSize = (expandedRect.width() - 3) / 2;
- arrowSize -= (arrowSize % 2) - 1; // Force odd.
- arrowRect.setWidth(arrowSize);
- arrowRect.setHeight(arrowSize);
- arrowRect.move((expandedRect.width() - arrowRect.width()) / 2,
- (topRect.height() - arrowRect.height()) / 2 + 1);
- widgetContext.gtkPaintArrow(arrowRect, widget, stateType, shadowType, GTK_ARROW_UP, "spinbutton");
-
- shadowType = isPressed(renderObject) && !upPressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
- if (controlActive) {
- if (isPressed(renderObject) && !upPressed)
- stateType = GTK_STATE_ACTIVE;
- else if (isHovered(renderObject) && !upHovered)
- stateType = GTK_STATE_PRELIGHT;
- else
- stateType = GTK_STATE_NORMAL;
- }
- IntRect bottomRect(IntPoint(0, expandedRect.height() / 2), expandedRect.size());
- bottomRect.setHeight(expandedRect.height() - bottomRect.y());
- widgetContext.gtkPaintBox(bottomRect, widget, stateType, shadowType, "spinbutton_down");
-
- arrowRect.setY(arrowRect.y() + bottomRect.y() - 1);
- widgetContext.gtkPaintArrow(arrowRect, widget, stateType, shadowType, GTK_ARROW_DOWN, "spinbutton");
-
- return false;
-}
-
-GRefPtr<GdkPixbuf> getStockIconForWidgetType(GType widgetType, const char* iconName, gint direction, gint state, gint iconSize)
-{
- ASSERT(widgetType == GTK_TYPE_CONTAINER || widgetType == GTK_TYPE_ENTRY);
- ASSERT(iconName);
-
- RenderThemeGtk* theme = static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get());
- GtkWidget* widget = widgetType == GTK_TYPE_CONTAINER ? GTK_WIDGET(theme->gtkContainer()) : theme->gtkEntry();
-
- GtkStyle* style = gtk_widget_get_style(widget);
- GtkIconSet* iconSet = gtk_style_lookup_icon_set(style, iconName);
- return adoptGRef(gtk_icon_set_render_icon(iconSet, style,
- static_cast<GtkTextDirection>(direction),
- static_cast<GtkStateType>(state),
- static_cast<GtkIconSize>(iconSize), 0, 0));
-}
-
-GRefPtr<GdkPixbuf> getStockSymbolicIconForWidgetType(GType widgetType, const char* /* symbolicIconName */, const char* fallbackStockIconName, gint direction, gint state, gint iconSize)
-{
- if (!fallbackStockIconName)
- return nullptr;
-
- return getStockIconForWidgetType(widgetType, fallbackStockIconName, direction, state, iconSize);
-}
-
-Color RenderThemeGtk::platformActiveSelectionBackgroundColor() const
-{
- GtkWidget* widget = gtkEntry();
- return gtk_widget_get_style(widget)->base[GTK_STATE_SELECTED];
-}
-
-Color RenderThemeGtk::platformInactiveSelectionBackgroundColor() const
-{
- GtkWidget* widget = gtkEntry();
- return gtk_widget_get_style(widget)->base[GTK_STATE_ACTIVE];
-}
-
-Color RenderThemeGtk::platformActiveSelectionForegroundColor() const
-{
- GtkWidget* widget = gtkEntry();
- return gtk_widget_get_style(widget)->text[GTK_STATE_SELECTED];
-}
-
-Color RenderThemeGtk::platformInactiveSelectionForegroundColor() const
-{
- GtkWidget* widget = gtkEntry();
- return gtk_widget_get_style(widget)->text[GTK_STATE_ACTIVE];
-}
-
-Color RenderThemeGtk::platformActiveListBoxSelectionBackgroundColor() const
-{
- GtkWidget* widget = gtkTreeView();
- return gtk_widget_get_style(widget)->base[GTK_STATE_SELECTED];
-}
-
-Color RenderThemeGtk::platformInactiveListBoxSelectionBackgroundColor() const
-{
- GtkWidget* widget = gtkTreeView();
- return gtk_widget_get_style(widget)->base[GTK_STATE_ACTIVE];
-}
-
-Color RenderThemeGtk::platformActiveListBoxSelectionForegroundColor() const
-{
- GtkWidget* widget = gtkTreeView();
- return gtk_widget_get_style(widget)->text[GTK_STATE_SELECTED];
-}
-
-Color RenderThemeGtk::platformInactiveListBoxSelectionForegroundColor() const
-{
- GtkWidget* widget = gtkTreeView();
- return gtk_widget_get_style(widget)->text[GTK_STATE_ACTIVE];
-}
-
-Color RenderThemeGtk::systemColor(CSSValueID cssValueId) const
-{
- switch (cssValueId) {
- case CSSValueButtontext:
- return Color(gtk_widget_get_style(gtkButton())->fg[GTK_STATE_NORMAL]);
- case CSSValueCaptiontext:
- return Color(gtk_widget_get_style(gtkEntry())->fg[GTK_STATE_NORMAL]);
- default:
- return RenderTheme::systemColor(cssValueId);
- }
-}
-
-static void gtkStyleSetCallback(GtkWidget*, GtkStyle*, RenderTheme* renderTheme)
-{
- // FIXME: Make sure this function doesn't get called many times for a single GTK+ style change signal.
- renderTheme->platformColorsDidChange();
-}
-
-static void setupWidget(GtkWidget* widget)
-{
- gtk_widget_realize(widget);
- g_object_set_data(G_OBJECT(widget), "transparent-bg-hint", GINT_TO_POINTER(TRUE));
-}
-
-void RenderThemeGtk::setupWidgetAndAddToContainer(GtkWidget* widget, GtkWidget* window) const
-{
- gtk_container_add(GTK_CONTAINER(window), widget);
- setupWidget(widget);
-
- // FIXME: Perhaps this should only be called for the containing window or parent container.
- g_signal_connect(widget, "style-set", G_CALLBACK(gtkStyleSetCallback), const_cast<RenderThemeGtk*>(this));
-}
-
-GtkWidget* RenderThemeGtk::gtkContainer() const
-{
- if (m_gtkContainer)
- return m_gtkContainer;
-
- m_gtkWindow = gtk_window_new(GTK_WINDOW_POPUP);
- gtk_widget_set_colormap(m_gtkWindow, m_colormap);
- setupWidget(m_gtkWindow);
- gtk_widget_set_name(m_gtkWindow, "MozillaGtkWidget");
-
- m_gtkContainer = gtk_fixed_new();
- setupWidgetAndAddToContainer(m_gtkContainer, m_gtkWindow);
- return m_gtkContainer;
-}
-
-GtkWidget* RenderThemeGtk::gtkButton() const
-{
- if (m_gtkButton)
- return m_gtkButton;
- m_gtkButton = gtk_button_new();
- setupWidgetAndAddToContainer(m_gtkButton, gtkContainer());
- return m_gtkButton;
-}
-
-GtkWidget* RenderThemeGtk::gtkEntry() const
-{
- if (m_gtkEntry)
- return m_gtkEntry;
- m_gtkEntry = gtk_entry_new();
- setupWidgetAndAddToContainer(m_gtkEntry, gtkContainer());
- return m_gtkEntry;
-}
-
-GtkWidget* RenderThemeGtk::gtkTreeView() const
-{
- if (m_gtkTreeView)
- return m_gtkTreeView;
- m_gtkTreeView = gtk_tree_view_new();
- setupWidgetAndAddToContainer(m_gtkTreeView, gtkContainer());
- return m_gtkTreeView;
-}
-
-GtkWidget* RenderThemeGtk::gtkVScale() const
-{
- if (m_gtkVScale)
- return m_gtkVScale;
- m_gtkVScale = gtk_vscale_new(0);
- setupWidgetAndAddToContainer(m_gtkVScale, gtkContainer());
- return m_gtkVScale;
-}
-
-GtkWidget* RenderThemeGtk::gtkHScale() const
-{
- if (m_gtkHScale)
- return m_gtkHScale;
- m_gtkHScale = gtk_hscale_new(0);
- setupWidgetAndAddToContainer(m_gtkHScale, gtkContainer());
- return m_gtkHScale;
-}
-
-GtkWidget* RenderThemeGtk::gtkRadioButton() const
-{
- if (m_gtkRadioButton)
- return m_gtkRadioButton;
- m_gtkRadioButton = gtk_radio_button_new(0);
- setupWidgetAndAddToContainer(m_gtkRadioButton, gtkContainer());
- return m_gtkRadioButton;
-}
-
-GtkWidget* RenderThemeGtk::gtkCheckButton() const
-{
- if (m_gtkCheckButton)
- return m_gtkCheckButton;
- m_gtkCheckButton = gtk_check_button_new();
- setupWidgetAndAddToContainer(m_gtkCheckButton, gtkContainer());
- return m_gtkCheckButton;
-}
-
-GtkWidget* RenderThemeGtk::gtkProgressBar() const
-{
- if (m_gtkProgressBar)
- return m_gtkProgressBar;
- m_gtkProgressBar = gtk_progress_bar_new();
- setupWidgetAndAddToContainer(m_gtkProgressBar, gtkContainer());
- return m_gtkProgressBar;
-}
-
-static void getGtkComboBoxButton(GtkWidget* widget, gpointer target)
-{
- if (!GTK_IS_TOGGLE_BUTTON(widget))
- return;
- GtkWidget** widgetTarget = static_cast<GtkWidget**>(target);
- *widgetTarget = widget;
-}
-
-typedef struct {
- GtkWidget* arrow;
- GtkWidget* separator;
-} ComboBoxWidgetPieces;
-
-static void getGtkComboBoxPieces(GtkWidget* widget, gpointer data)
-{
- if (GTK_IS_ARROW(widget)) {
- static_cast<ComboBoxWidgetPieces*>(data)->arrow = widget;
- return;
- }
- if (GTK_IS_SEPARATOR(widget))
- static_cast<ComboBoxWidgetPieces*>(data)->separator = widget;
-}
-
-GtkWidget* RenderThemeGtk::gtkComboBox() const
-{
- if (m_gtkComboBox)
- return m_gtkComboBox;
- m_gtkComboBox = gtk_combo_box_new();
- setupWidgetAndAddToContainer(m_gtkComboBox, gtkContainer());
- return m_gtkComboBox;
-}
-
-void RenderThemeGtk::refreshComboBoxChildren() const
-{
- gtkComboBox(); // Ensure that we've initialized the combo box.
-
- // Some themes look at widget ancestry to determine how to render widgets, so
- // get the GtkButton that is the actual child of the combo box.
- gtk_container_forall(GTK_CONTAINER(m_gtkComboBox), getGtkComboBoxButton, &m_gtkComboBoxButton);
- ASSERT(m_gtkComboBoxButton);
- setupWidget(m_gtkComboBoxButton);
- g_object_add_weak_pointer(G_OBJECT(m_gtkComboBoxButton), reinterpret_cast<gpointer*>(&m_gtkComboBoxButton));
-
- ComboBoxWidgetPieces pieces = { 0, 0 };
- GtkWidget* buttonChild = gtk_bin_get_child(GTK_BIN(gtkComboBoxButton()));
- if (GTK_IS_HBOX(buttonChild))
- gtk_container_forall(GTK_CONTAINER(buttonChild), getGtkComboBoxPieces, &pieces);
- else if (GTK_IS_ARROW(buttonChild))
- pieces.arrow = buttonChild;
-
- ASSERT(pieces.arrow);
- m_gtkComboBoxArrow = pieces.arrow;
- setupWidget(m_gtkComboBoxArrow);
- // When the style changes, the combo box may destroy its children.
- g_object_add_weak_pointer(G_OBJECT(m_gtkComboBoxArrow), reinterpret_cast<gpointer*>(&m_gtkComboBoxArrow));
-
- m_gtkComboBoxSeparator = pieces.separator;
- if (m_gtkComboBoxSeparator) {
- setupWidget(m_gtkComboBoxSeparator);
- // When the style changes, the combo box may destroy its children.
- g_object_add_weak_pointer(G_OBJECT(m_gtkComboBoxSeparator), reinterpret_cast<gpointer*>(&m_gtkComboBoxSeparator));
- }
-}
-
-GtkWidget* RenderThemeGtk::gtkComboBoxButton() const
-{
- if (m_gtkComboBoxButton)
- return m_gtkComboBoxButton;
- refreshComboBoxChildren();
- ASSERT(m_gtkComboBoxButton);
- return m_gtkComboBoxButton;
-}
-
-GtkWidget* RenderThemeGtk::gtkComboBoxArrow() const
-{
- if (m_gtkComboBoxArrow)
- return m_gtkComboBoxArrow;
- refreshComboBoxChildren();
- ASSERT(m_gtkComboBoxArrow);
- return m_gtkComboBoxArrow;
-}
-
-GtkWidget* RenderThemeGtk::gtkComboBoxSeparator() const
-{
- // m_gtkComboBoxSeparator may be null either because we haven't initialized the combo box
- // or because the combo boxes in this theme don't have separators. If m_gtkComboBoxArrow
- // arrow isn't null, we definitely have initialized the combo box.
- if (m_gtkComboBoxArrow || m_gtkComboBoxButton)
- return m_gtkComboBoxSeparator;
- refreshComboBoxChildren();
- return m_gtkComboBoxSeparator;
-}
-
-GtkWidget* RenderThemeGtk::gtkHScrollbar() const
-{
- if (m_gtkHScrollbar)
- return m_gtkHScrollbar;
- m_gtkHScrollbar = gtk_hscrollbar_new(0);
- setupWidgetAndAddToContainer(m_gtkHScrollbar, gtkContainer());
- return m_gtkHScrollbar;
-}
-
-GtkWidget* RenderThemeGtk::gtkVScrollbar() const
-{
- if (m_gtkVScrollbar)
- return m_gtkVScrollbar;
- m_gtkVScrollbar = gtk_vscrollbar_new(0);
- setupWidgetAndAddToContainer(m_gtkVScrollbar, gtkContainer());
- return m_gtkVScrollbar;
-}
-
-GtkWidget* RenderThemeGtk::gtkSpinButton() const
-{
- if (m_gtkSpinButton)
- return m_gtkSpinButton;
- m_gtkSpinButton = gtk_spin_button_new_with_range(0, 10, 1);
- setupWidgetAndAddToContainer(m_gtkSpinButton, gtkContainer());
- return m_gtkSpinButton;
-}
-
-} // namespace WebCore
-
-#endif // GTK_API_VERSION_2
Modified: trunk/Source/WebCore/platform/gtk/RenderThemeGtk3.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/RenderThemeGtk3.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGtk3.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -41,6 +41,7 @@
#include <cmath>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
+#include <wtf/gobject/GRefPtr.h>
namespace WebCore {
Modified: trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -33,8 +33,6 @@
namespace WebCore {
-static HashSet<ScrollbarThemeClient*>* gScrollbars;
-
ScrollbarTheme* ScrollbarTheme::nativeTheme()
{
static ScrollbarThemeGtk theme;
@@ -45,56 +43,20 @@
{
}
-void ScrollbarThemeGtk::registerScrollbar(ScrollbarThemeClient* scrollbar)
-{
- if (!gScrollbars)
- gScrollbars = new HashSet<ScrollbarThemeClient*>;
- gScrollbars->add(scrollbar);
-}
-
-void ScrollbarThemeGtk::unregisterScrollbar(ScrollbarThemeClient* scrollbar)
-{
- gScrollbars->remove(scrollbar);
- if (gScrollbars->isEmpty()) {
- delete gScrollbars;
- gScrollbars = 0;
- }
-}
-
-void ScrollbarThemeGtk::updateScrollbarsFrameThickness()
-{
- if (!gScrollbars)
- return;
-
- // Update the thickness of every interior frame scrollbar widget. The
- // platform-independent scrollbar them code isn't yet smart enough to get
- // this information when it paints.
- HashSet<ScrollbarThemeClient*>::iterator end = gScrollbars->end();
- for (HashSet<ScrollbarThemeClient*>::iterator it = gScrollbars->begin(); it != end; ++it) {
- ScrollbarThemeClient* scrollbar = (*it);
-
- // Top-level scrollbar i.e. scrollbars who have a parent ScrollView
- // with no parent are native, and thus do not need to be resized.
- if (!scrollbar->parent() || !scrollbar->parent()->parent())
- return;
-
- int thickness = scrollbarThickness(scrollbar->controlSize());
- if (scrollbar->orientation() == HorizontalScrollbar)
- scrollbar->setFrameRect(IntRect(0, scrollbar->parent()->height() - thickness, scrollbar->width(), thickness));
- else
- scrollbar->setFrameRect(IntRect(scrollbar->parent()->width() - thickness, 0, thickness, scrollbar->height()));
- }
-}
-
bool ScrollbarThemeGtk::hasThumb(ScrollbarThemeClient* scrollbar)
{
+#ifndef GTK_API_VERSION_2
// This method is just called as a paint-time optimization to see if
// painting the thumb can be skipped. We don't have to be exact here.
return thumbLength(scrollbar) > 0;
+#else
+ return false;
+#endif
}
IntRect ScrollbarThemeGtk::backButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
{
+#ifndef GTK_API_VERSION_2
if (part == BackButtonEndPart && !m_hasBackButtonEndPart)
return IntRect();
if (part == BackButtonStartPart && !m_hasBackButtonStartPart)
@@ -112,10 +74,14 @@
// VerticalScrollbar alternate button
return IntRect(x, scrollbar->y() + scrollbar->height() - m_troughBorderWidth - (2 * size.height()), size.width(), size.height());
+#else
+ return IntRect();
+#endif
}
IntRect ScrollbarThemeGtk::forwardButtonRect(ScrollbarThemeClient* scrollbar, ScrollbarPart part, bool)
{
+#ifndef GTK_API_VERSION_2
if (part == ForwardButtonStartPart && !m_hasForwardButtonStartPart)
return IntRect();
if (part == ForwardButtonEndPart && !m_hasForwardButtonEndPart)
@@ -138,10 +104,14 @@
// ForwardButtonStartPart (alternate button)
return IntRect(x, scrollbar->y() + m_troughBorderWidth + size.height(), size.width(), size.height());
+#else
+ return IntRect();
+#endif
}
IntRect ScrollbarThemeGtk::trackRect(ScrollbarThemeClient* scrollbar, bool)
{
+#ifndef GTK_API_VERSION_2
// The padding along the thumb movement axis includes the trough border
// plus the size of stepper spacing (the space between the stepper and
// the place where the thumb stops). There is often no stepper spacing.
@@ -178,8 +148,55 @@
return IntRect();
return IntRect(scrollbar->x(), scrollbar->y() + movementAxisPadding + startButtonsOffset,
thickness, scrollbar->height() - (2 * movementAxisPadding) - buttonsWidth);
+#else
+ return IntRect();
+#endif
}
+#ifndef GTK_API_VERSION_2
+static HashSet<ScrollbarThemeClient*>* gScrollbars;
+
+void ScrollbarThemeGtk::registerScrollbar(ScrollbarThemeClient* scrollbar)
+{
+ if (!gScrollbars)
+ gScrollbars = new HashSet<ScrollbarThemeClient*>;
+ gScrollbars->add(scrollbar);
+}
+
+void ScrollbarThemeGtk::unregisterScrollbar(ScrollbarThemeClient* scrollbar)
+{
+ gScrollbars->remove(scrollbar);
+ if (gScrollbars->isEmpty()) {
+ delete gScrollbars;
+ gScrollbars = 0;
+ }
+}
+
+void ScrollbarThemeGtk::updateScrollbarsFrameThickness()
+{
+ if (!gScrollbars)
+ return;
+
+ // Update the thickness of every interior frame scrollbar widget. The
+ // platform-independent scrollbar them code isn't yet smart enough to get
+ // this information when it paints.
+ HashSet<ScrollbarThemeClient*>::iterator end = gScrollbars->end();
+ for (HashSet<ScrollbarThemeClient*>::iterator it = gScrollbars->begin(); it != end; ++it) {
+ ScrollbarThemeClient* scrollbar = (*it);
+
+ // Top-level scrollbar i.e. scrollbars who have a parent ScrollView
+ // with no parent are native, and thus do not need to be resized.
+ if (!scrollbar->parent() || !scrollbar->parent()->parent())
+ return;
+
+ int thickness = scrollbarThickness(scrollbar->controlSize());
+ if (scrollbar->orientation() == HorizontalScrollbar)
+ scrollbar->setFrameRect(IntRect(0, scrollbar->parent()->height() - thickness, scrollbar->width(), thickness));
+ else
+ scrollbar->setFrameRect(IntRect(scrollbar->parent()->width() - thickness, 0, thickness, scrollbar->height()));
+ }
+}
+
IntRect ScrollbarThemeGtk::thumbRect(ScrollbarThemeClient* scrollbar, const IntRect& unconstrainedTrackRect)
{
IntRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrainedTrackRect);
@@ -283,6 +300,6 @@
{
return m_minThumbLength;
}
+#endif // GTK_API_VERSION_2
}
-
Modified: trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk.h 2014-08-28 09:13:58 UTC (rev 173059)
@@ -34,7 +34,6 @@
class ScrollbarThemeGtk : public ScrollbarThemeComposite {
public:
- ScrollbarThemeGtk();
virtual ~ScrollbarThemeGtk();
virtual bool hasButtons(ScrollbarThemeClient*) { return true; }
@@ -42,6 +41,10 @@
virtual IntRect backButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool);
virtual IntRect forwardButtonRect(ScrollbarThemeClient*, ScrollbarPart, bool);
virtual IntRect trackRect(ScrollbarThemeClient*, bool);
+
+#ifndef GTK_API_VERSION_2
+ ScrollbarThemeGtk();
+
IntRect thumbRect(ScrollbarThemeClient*, const IntRect& unconstrainedTrackRect);
bool paint(ScrollbarThemeClient*, GraphicsContext*, const IntRect& damageRect);
void paintScrollbarBackground(GraphicsContext*, ScrollbarThemeClient*);
@@ -62,9 +65,8 @@
void unregisterScrollbar(ScrollbarThemeClient*);
protected:
-#ifndef GTK_API_VERSION_2
GtkStyleContext* m_context;
-#endif
+
int m_thumbFatness;
int m_troughBorderWidth;
int m_stepperSize;
@@ -75,7 +77,9 @@
gboolean m_hasForwardButtonEndPart;
gboolean m_hasBackButtonStartPart;
gboolean m_hasBackButtonEndPart;
+#endif // GTK_API_VERSION_2
};
}
+
#endif
Deleted: trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk2.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk2.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/ScrollbarThemeGtk2.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -1,218 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "ScrollbarThemeGtk.h"
-
-#ifdef GTK_API_VERSION_2
-
-#include "GtkVersioning.h"
-#include "PlatformMouseEvent.h"
-#include "RenderThemeGtk.h"
-#include "ScrollView.h"
-#include "Scrollbar.h"
-#include "WidgetRenderingContext.h"
-#include <gtk/gtk.h>
-
-namespace WebCore {
-
-static void gtkStyleSetCallback(GtkWidget*, GtkStyle*, ScrollbarThemeGtk* scrollbarTheme)
-{
- scrollbarTheme->updateThemeProperties();
-}
-
-ScrollbarThemeGtk::ScrollbarThemeGtk()
-{
- updateThemeProperties();
- g_signal_connect(static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get())->gtkHScrollbar(),
- "style-set", G_CALLBACK(gtkStyleSetCallback), this);
-}
-
-void ScrollbarThemeGtk::updateThemeProperties()
-{
- GtkWidget* scrollbar = static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get())->gtkHScrollbar();
- gtk_widget_style_get(scrollbar,
- "slider_width", &m_thumbFatness,
- "trough_border", &m_troughBorderWidth,
- "stepper-size", &m_stepperSize,
- "trough-under-steppers", &m_troughUnderSteppers,
- "has-backward-stepper", &m_hasBackButtonStartPart,
- "has-forward-stepper", &m_hasForwardButtonEndPart,
- "has-secondary-forward-stepper", &m_hasForwardButtonStartPart,
- "has-secondary-backward-stepper", &m_hasBackButtonEndPart, NULL);
- m_minThumbLength = gtk_range_get_min_slider_size(GTK_RANGE(scrollbar));
- updateScrollbarsFrameThickness();
-}
-
-static GtkWidget* getWidgetForScrollbar(ScrollbarThemeClient* scrollbar)
-{
- RenderThemeGtk* theme = static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get());
- return scrollbar->orientation() == VerticalScrollbar ? theme->gtkVScrollbar() : theme->gtkHScrollbar();
-}
-
-void ScrollbarThemeGtk::paintTrackBackground(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
-{
- // Paint the track background. If the trough-under-steppers property is true, this
- // should be the full size of the scrollbar, but if is false, it should only be the
- // track rect.
- IntRect fullScrollbarRect(rect);
- if (m_troughUnderSteppers)
- fullScrollbarRect = IntRect(scrollbar->x(), scrollbar->y(), scrollbar->width(), scrollbar->height());
-
- WidgetRenderingContext widgetContext(context, fullScrollbarRect);
- IntRect paintRect(IntPoint(), fullScrollbarRect.size());
- widgetContext.gtkPaintBox(paintRect, getWidgetForScrollbar(scrollbar),
- GTK_STATE_ACTIVE, GTK_SHADOW_IN, "trough");
-}
-
-void ScrollbarThemeGtk::paintScrollbarBackground(GraphicsContext* context, ScrollbarThemeClient* scrollbar)
-{
- IntRect fullScrollbarRect = IntRect(scrollbar->x(), scrollbar->y(), scrollbar->width(), scrollbar->height());
-
- WidgetRenderingContext widgetContext(context, fullScrollbarRect);
- widgetContext.gtkPaintBox(fullScrollbarRect, getWidgetForScrollbar(scrollbar),
- GTK_STATE_NORMAL, GTK_SHADOW_IN, "scrolled_window");
-}
-
-void ScrollbarThemeGtk::paintThumb(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
-{
- GtkWidget* widget = getWidgetForScrollbar(scrollbar);
- gboolean activateSlider;
- gtk_widget_style_get(widget, "activate-slider", &activateSlider, NULL);
-
- GtkStateType stateType = GTK_STATE_NORMAL;
- GtkShadowType shadowType = GTK_SHADOW_OUT;
- if (activateSlider && scrollbar->pressedPart() == ThumbPart) {
- stateType = GTK_STATE_ACTIVE;
- shadowType = GTK_SHADOW_IN;
- } else if (scrollbar->pressedPart() == ThumbPart || scrollbar->hoveredPart() == ThumbPart)
- stateType = GTK_STATE_PRELIGHT;
-
- // The adjustment controls the rendering of the scrollbar thumb. If it's not set
- // properly the theme may not draw the thumb borders properly.
- GtkAdjustment* adjustment = gtk_range_get_adjustment(GTK_RANGE(widget));
- gtk_adjustment_set_value(adjustment, scrollbar->currentPos());
- gtk_adjustment_set_lower(adjustment, 0);
- gtk_adjustment_set_upper(adjustment, scrollbar->maximum());
-
- GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL;
- if (scrollbar->orientation() == VerticalScrollbar) {
- gtk_adjustment_set_page_size(adjustment, rect.height());
- orientation = GTK_ORIENTATION_VERTICAL;
- } else
- gtk_adjustment_set_page_size(adjustment, rect.width());
-
- WidgetRenderingContext widgetContext(context, rect);
- IntRect sliderRect(IntPoint(), rect.size());
- widgetContext.gtkPaintSlider(sliderRect, widget, stateType, shadowType, "slider", orientation);
-}
-
-void ScrollbarThemeGtk::paintButton(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect, ScrollbarPart part)
-{
- // The buttons will be disabled if the thumb is as the appropriate extreme.
- GtkShadowType shadowType = GTK_SHADOW_OUT;
- GtkStateType stateType = GTK_STATE_INSENSITIVE;
- bool pressed = (part == scrollbar->pressedPart());
-
- if ((BackButtonStartPart == part && scrollbar->currentPos())
- || (BackButtonEndPart == part && scrollbar->currentPos())
- || (ForwardButtonEndPart == part && scrollbar->currentPos() != scrollbar->maximum())
- || (ForwardButtonStartPart == part && scrollbar->currentPos() != scrollbar->maximum())) {
- stateType = GTK_STATE_NORMAL;
- if (pressed) {
- stateType = GTK_STATE_ACTIVE;
- shadowType = GTK_SHADOW_IN;
- } else if (part == scrollbar->hoveredPart())
- stateType = GTK_STATE_PRELIGHT;
- }
-
- // Themes determine how to draw the button (which button to draw) based on the allocation
- // of the widget. Where the target rect is in relation to the total widget allocation
- // determines the button.
- ScrollbarOrientation orientation = scrollbar->orientation();
- int buttonSize = (orientation == VerticalScrollbar) ? rect.height() : rect.width();
- int totalAllocation = buttonSize * 5; // One space for each button and one extra.
- int buttonOffset = 0;
- if (ForwardButtonStartPart == part)
- buttonOffset = buttonSize;
- else if (BackButtonEndPart == part)
- buttonOffset = 3 * buttonSize;
- else if (ForwardButtonEndPart == part)
- buttonOffset = 4 * buttonSize;
-
- // Now we want the allocation to be relative to the origin of the painted rect.
- GtkWidget* widget = getWidgetForScrollbar(scrollbar);
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
- allocation.x = allocation.y = 0;
- allocation.width = rect.width();
- allocation.height = rect.height();
-
- if (orientation == VerticalScrollbar) {
- allocation.height = totalAllocation;
- allocation.y -= buttonOffset;
- } else {
- allocation.width = totalAllocation;
- allocation.x -= buttonOffset;
- }
- gtk_widget_set_allocation(widget, &allocation);
-
- const char* detail = orientation == VerticalScrollbar ? "vscrollbar" : "hscrollbar";
- WidgetRenderingContext widgetContext(context, rect);
-
- IntRect buttonRect(IntPoint(), rect.size());
- widgetContext.gtkPaintBox(buttonRect, widget, stateType, shadowType, detail);
-
- float arrowScaling;
- gtk_widget_style_get(widget, "arrow-scaling", &arrowScaling, NULL);
- IntSize arrowSize = rect.size();
- arrowSize.scale(arrowScaling);
- IntRect arrowRect(IntPoint(buttonRect.x() + (buttonRect.width() - arrowSize.width()) / 2,
- buttonRect.y() + (buttonRect.height() - arrowSize.height()) / 2),
- arrowSize);
- if (pressed) {
- int arrowDisplacementX, arrowDisplacementY;
- gtk_widget_style_get(widget,
- "arrow-displacement-x", &arrowDisplacementX,
- "arrow-displacement-y", &arrowDisplacementY,
- NULL);
- arrowRect.move(arrowDisplacementX, arrowDisplacementY);
- }
-
- GtkArrowType arrowType = GTK_ARROW_DOWN;
- if (orientation == VerticalScrollbar) {
- if (part == BackButtonEndPart || part == BackButtonStartPart)
- arrowType = GTK_ARROW_UP;
- } else if (orientation == HorizontalScrollbar) {
- arrowType = GTK_ARROW_RIGHT;
- if (part == BackButtonEndPart || part == BackButtonStartPart)
- arrowType = GTK_ARROW_LEFT;
- }
- widgetContext.gtkPaintArrow(arrowRect, widget, stateType, shadowType, arrowType, detail);
-}
-
-} // namespace WebCore
-
-#endif // GTK_API_VERSION_2
Deleted: trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.cpp (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.cpp 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.cpp 2014-08-28 09:13:58 UTC (rev 173059)
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2010 Sencha, Inc.
- * Copyright (C) 2010 Igalia S.L.
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "WidgetRenderingContext.h"
-
-#ifdef GTK_API_VERSION_2
-
-#include "GraphicsContext.h"
-#include "GtkVersioning.h"
-#include "PlatformContextCairo.h"
-#include "RefPtrCairo.h"
-#include "RenderThemeGtk.h"
-#include "Timer.h"
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-#include <wtf/StdLibExtras.h>
-
-namespace WebCore {
-
-static GdkPixmap* gScratchBuffer = 0;
-static void purgeScratchBuffer()
-{
- if (gScratchBuffer)
- g_object_unref(gScratchBuffer);
- gScratchBuffer = 0;
-}
-
-// Widget rendering needs a scratch image as the buffer for the intermediate
-// render. Instead of creating and destroying the buffer for every operation,
-// we create a buffer which will be automatically purged via a timer.
-class PurgeScratchBufferTimer : public TimerBase {
-private:
- virtual void fired() { purgeScratchBuffer(); }
-};
-
-static void scheduleScratchBufferPurge()
-{
- DEPRECATED_DEFINE_STATIC_LOCAL(PurgeScratchBufferTimer, purgeScratchBufferTimer, ());
- if (purgeScratchBufferTimer.isActive())
- purgeScratchBufferTimer.stop();
- purgeScratchBufferTimer.startOneShot(2);
-}
-
-WidgetRenderingContext::WidgetRenderingContext(GraphicsContext* graphicsContext, const IntRect& targetRect)
- : m_graphicsContext(graphicsContext)
- , m_targetRect(targetRect)
- , m_hadError(false)
-{
- RenderThemeGtk* theme = static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get());
-
- // Fallback: We failed to create an RGBA colormap earlier, so we cannot properly paint
- // to a temporary surface and preserve transparency. To ensure decent widget rendering, just
- // paint directly to the target drawable. This will not render CSS rotational transforms properly.
- if (!theme->m_themePartsHaveRGBAColormap && graphicsContext->gdkWindow()) {
- m_target = graphicsContext->gdkWindow();
- return;
- }
-
- // We never want to create a scratch buffer larger than the size of our target GdkDrawable.
- // This prevents giant pixmap allocations for very large widgets in smaller views.
- // FIXME: We need to implement this check for WebKit2 as well.
- if (GdkDrawable* drawable = graphicsContext->gdkWindow()) {
- int maxWidth = 0, maxHeight = 0;
-
- if (GDK_IS_PIXMAP(drawable))
- gdk_pixmap_get_size(GDK_PIXMAP(drawable), &maxWidth, &maxHeight);
- else if (GDK_IS_WINDOW(drawable)) {
- maxWidth = gdk_window_get_width(GDK_WINDOW(drawable));
- maxHeight = gdk_window_get_height(GDK_WINDOW(drawable));
- }
- m_targetRect.setSize(m_targetRect.size().shrunkTo(IntSize(maxWidth, maxHeight)));
- }
-
- // Widgets sometimes need to draw outside their boundaries for things such as
- // exterior focus. We want to allocate a some extra pixels in our surface for this.
- static int extraSpace = 15;
- m_targetRect.inflate(extraSpace);
-
- // This offset will map a point in the coordinate system of the widget to the coordinate system of the painting buffer.
- m_paintOffset = targetRect.location() - m_targetRect.location();
-
- int width = m_targetRect.width() + (extraSpace * 2);
- int height = m_targetRect.height() + (extraSpace * 2);
- int scratchWidth = 0;
- int scratchHeight = 0;
- if (gScratchBuffer)
- gdk_pixmap_get_size(gScratchBuffer, &scratchWidth, &scratchHeight);
-
- // We do not need to recreate the buffer if the current buffer is large enough.
- if (!gScratchBuffer || scratchWidth < width || scratchHeight < height) {
- purgeScratchBuffer();
- // Round to the nearest 32 pixels so we do not grow the buffer for similar sized requests.
- width = (1 + (width >> 5)) << 5;
- height = (1 + (height >> 5)) << 5;
-
- gScratchBuffer = gdk_pixmap_new(0, width, height, gdk_colormap_get_visual(theme->m_colormap)->depth);
- gdk_drawable_set_colormap(gScratchBuffer, theme->m_colormap);
- }
- m_target = gScratchBuffer;
-
- // Clear the scratch buffer.
- RefPtr<cairo_t> scratchBufferContext = adoptRef(gdk_cairo_create(gScratchBuffer));
- cairo_set_operator(scratchBufferContext.get(), CAIRO_OPERATOR_CLEAR);
- cairo_paint(scratchBufferContext.get());
-}
-
-WidgetRenderingContext::~WidgetRenderingContext()
-{
- // We do not need to blit back to the target in the fallback case. See above.
- RenderThemeGtk* theme = static_cast<RenderThemeGtk*>(RenderTheme::defaultTheme().get());
- if (!theme->m_themePartsHaveRGBAColormap && m_graphicsContext->gdkWindow())
- return;
-
- // Don't paint the results back if there was an error.
- if (m_hadError) {
- scheduleScratchBufferPurge();
- return;
- }
-
- // FIXME: It's unclear if it is necessary to preserve the current source here.
- cairo_t* cairoContext = m_graphicsContext->platformContext()->cr();
- RefPtr<cairo_pattern_t> previousSource(cairo_get_source(cairoContext));
-
- gdk_cairo_set_source_pixmap(cairoContext, gScratchBuffer, m_targetRect.x(), m_targetRect.y());
- cairo_rectangle(cairoContext, m_targetRect.x(), m_targetRect.y(), m_targetRect.width(), m_targetRect.height());
- cairo_fill(cairoContext);
- cairo_set_source(cairoContext, previousSource.get());
- scheduleScratchBufferPurge();
-}
-
-void WidgetRenderingContext::calculateClipRect(const IntRect& rect, GdkRectangle* clipRect)
-{
- clipRect->x = m_paintOffset.width() + rect.x();
- clipRect->y = m_paintOffset.height() + rect.y();
- clipRect->width = m_targetRect.width();
- clipRect->height = m_targetRect.height();
-}
-
-void WidgetRenderingContext::gtkPaintBox(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
-
- // Some widgets also need their allocation adjusted to account for extra space.
- // Right now only scrollbar buttons have significant allocations.
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
- allocation.x += clipRect.x;
- allocation.y += clipRect.y;
- gtk_widget_set_allocation(widget, &allocation);
-
- gtk_paint_box(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect,
- widget, detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintFlatBox(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_flat_box(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect,
- widget, detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintFocus(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_focus(gtk_widget_get_style(widget), m_target, stateType, &clipRect, widget,
- detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintSlider(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail, GtkOrientation orientation)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_slider(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect, widget,
- detail, clipRect.x, clipRect.y, rect.width(), rect.height(), orientation);
-}
-
-void WidgetRenderingContext::gtkPaintCheck(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_check(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect, widget,
- detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintOption(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_option(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect, widget,
- detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintShadow(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_shadow(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect, widget,
- detail, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintArrow(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, GtkShadowType shadowType, int arrowDirection, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_arrow(gtk_widget_get_style(widget), m_target, stateType, shadowType, &clipRect, widget, detail,
- static_cast<GtkArrowType>(arrowDirection), TRUE, clipRect.x, clipRect.y, rect.width(), rect.height());
-}
-
-void WidgetRenderingContext::gtkPaintVLine(const IntRect& rect, GtkWidget* widget, GtkStateType stateType, const gchar* detail)
-{
- GdkRectangle clipRect;
- calculateClipRect(rect, &clipRect);
- gtk_paint_vline(gtk_widget_get_style(widget), m_target, stateType, &clipRect, widget, detail,
- clipRect.y, clipRect.y + rect.height(), clipRect.x);
-
-}
-
-}
-
-#endif // GTK_API_VERSION_2
Deleted: trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.h (173058 => 173059)
--- trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.h 2014-08-28 08:02:46 UTC (rev 173058)
+++ trunk/Source/WebCore/platform/gtk/WidgetRenderingContext.h 2014-08-28 09:13:58 UTC (rev 173059)
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2010 Igalia S.L.
- * All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- */
-
-#ifndef WidgetRenderingContext_h
-#define WidgetRenderingContext_h
-
-#ifdef GTK_API_VERSION_2
-
-#include "IntRect.h"
-
-// Usually this is too expensive to have in headers, but GtkStateType GtkShadowType are
-// enums and cannot be forward declared. WidgetRenderingContext.h is currently only
-// included in RenderThemeGtk2.cpp and ScrollbarThemeGtk2.cpp.
-#include <gtk/gtk.h>
-
-namespace WebCore {
-
-class GraphicsContext;
-class RenderThemeGtk;
-
-class WidgetRenderingContext {
-public:
- WidgetRenderingContext(GraphicsContext*, const IntRect&);
- ~WidgetRenderingContext();
-
- void gtkPaintBox(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*);
- void gtkPaintFlatBox(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*);
- void gtkPaintFocus(const IntRect&, GtkWidget*, GtkStateType, const gchar*);
- void gtkPaintSlider(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*, GtkOrientation);
- void gtkPaintCheck(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*);
- void gtkPaintOption(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*);
- void gtkPaintShadow(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, const gchar*);
- void gtkPaintArrow(const IntRect&, GtkWidget*, GtkStateType, GtkShadowType, int arrowDirection, const gchar*);
- void gtkPaintVLine(const IntRect&, GtkWidget*, GtkStateType, const gchar*);
-
-private:
- void calculateClipRect(const IntRect&, GdkRectangle*);
-
- GraphicsContext* m_graphicsContext;
- IntRect m_targetRect;
- IntSize m_paintOffset;
- bool m_hadError;
- GdkDrawable* m_target;
-
-};
-
-}
-
-#endif // GTK_API_VERSION_2
-#endif // WidgetRenderingContext_h