diff options
| author | Steve Block <steveblock@google.com> | 2011-06-08 08:26:01 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-06-08 08:26:01 -0700 |
| commit | 3742ac093d35d923c81693096ab6671e9b147700 (patch) | |
| tree | c2add9100f789dad45ef1ec5328bddde02c47a4c /Source/WebCore/platform/gtk/RenderThemeGtk2.cpp | |
| parent | 901401d90459bc22580842455d4588b9a697514d (diff) | |
| parent | e5926f4a0d6adc9ad4a75824129f117181953560 (diff) | |
| download | external_webkit-3742ac093d35d923c81693096ab6671e9b147700.zip external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.gz external_webkit-3742ac093d35d923c81693096ab6671e9b147700.tar.bz2 | |
Merge changes I55c6d71a,Ifb3277d4,Ia1b847a2,I7ba9cf3f,Ida2b2a8a,I1280ec90,I72f818d5,I2e3b588b,I9a4e6289,Ia724c78b,Icd8612c8,Ie31b15d7,Ie125edae,I77941a88,I89dae78b,I3516e5ca,I1a4c17b5,I2c4ecc1a,I9c8e6537,Ifac13115,Ie1f80e09,Ia541ed77,I60ce9d78
* changes:
Merge WebKit at r82507: Update ThirdPartyProject.prop
Merge WebKit at r82507: Cherry-pick change r88166 to add INSPECTOR guards to ScriptProfiler
Merge WebKit at r82507: Work around a V8 bug
Merge WebKit at r82507: JNIType renamed to JavaType
Merge WebKit at r82507: IconDatabaseClient interface expanded
Merge WebKit at r82507: Don't use new loss-free code path in HTMLCanvasElement::toDataURL()
Merge WebKit at r82507: IcondDatabaseBase::iconForPageURL() renamed
Merge WebKit at r82507: IconDatabaseBase::Open() signature changed
Merge WebKit at r82507: Node::isContentEditable() renamed
Merge WebKit at r82507: Use icon database through IconDatabaseBase
Merge WebKit at r82507: toInputElement() is now a member of Node
Merge WebKit at r82507: FrameLoaderClient::objectContentType() signature changed
Merge WebKit at r82507: StringImpl::computeHash() removed
Merge WebKit at r82507: Stub out FontPlatformData::setOrientation()
Merge WebKit at r82507: Path::strokeBoundingRect() is now const
Merge WebKit at r82507: Add missing UnusedParam.h include in ApplicationCacheGroup.cpp
Merge WebKit at r82507: Continue to use Android's version of FontPlatformData.h
Merge WebKit at r82507: Update signature of FontCustomPlatformData::fontPlatformData()
Merge WebKit at r82507: Fix conflicts due to JNI refactoring
Merge WebKit at r82507: Fix conflicts due to new StorageTracker
Merge WebKit at r82507: Fix conflicts
Merge WebKit at r82507: Fix makefiles
Merge WebKit at r82507: Initial merge by git
Diffstat (limited to 'Source/WebCore/platform/gtk/RenderThemeGtk2.cpp')
| -rw-r--r-- | Source/WebCore/platform/gtk/RenderThemeGtk2.cpp | 94 |
1 files changed, 91 insertions, 3 deletions
diff --git a/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp b/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp index 534aa97..5149bea 100644 --- a/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp +++ b/Source/WebCore/platform/gtk/RenderThemeGtk2.cpp @@ -46,6 +46,9 @@ 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); @@ -68,6 +71,7 @@ void RenderThemeGtk::platformInit() 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) { @@ -117,6 +121,10 @@ void RenderThemeGtk::adjustRepaintRect(const RenderObject* renderObject, IntRect 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; } @@ -566,13 +574,84 @@ bool RenderThemeGtk::paintProgressBar(RenderObject* renderObject, const PaintInf } #endif -void RenderThemeGtk::adjustInnerSpinButtonStyle(CSSStyleSelector*, RenderStyle*, Element*) const +void RenderThemeGtk::adjustInnerSpinButtonStyle(CSSStyleSelector*, 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 = max(PANGO_PIXELS(fontSize), minSpinButtonArrowSize); + width += -((width % 2) - 1) + gtkStyle->xthickness; + + style->setWidth(Length(width, Fixed)); + style->setMinWidth(Length(width, Fixed)); } -bool RenderThemeGtk::paintInnerSpinButton(RenderObject*, const PaintInfo&, const IntRect&) +bool RenderThemeGtk::paintInnerSpinButton(RenderObject* renderObject, const PaintInfo& paintInfo, const IntRect& rect) { - return true; + // 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> RenderThemeGtk::getStockIcon(GType widgetType, const char* iconName, gint direction, gint state, gint iconSize) @@ -867,6 +946,15 @@ GtkWidget* RenderThemeGtk::gtkVScrollbar() const 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 |
