Bug 1205643 - Move scrollbar borders to slider to receive button events. r=karlt

This commit is contained in:
Jan Horak 2016-01-06 23:55:00 -05:00
parent 8ffc1938d3
commit 1aea6b3e9f
3 changed files with 38 additions and 4 deletions

View File

@ -1188,13 +1188,21 @@ nsSliderFrame::IsEventOverThumb(WidgetGUIEvent* aEvent)
return false;
}
bool isHorizontal = IsHorizontal();
nsRect thumbRect = thumbFrame->GetRect();
#if defined(MOZ_WIDGET_GTK)
/* Scrollbar track can have padding, so it's better to check that eventPoint
* is inside of actual thumb, not just its one axis. The part of the scrollbar
* track adjacent to thumb can actually receive events in GTK3 */
return eventPoint.x >= thumbRect.x && eventPoint.x < thumbRect.XMost() &&
eventPoint.y >= thumbRect.y && eventPoint.y < thumbRect.YMost();
#else
bool isHorizontal = IsHorizontal();
nscoord eventPos = isHorizontal ? eventPoint.x : eventPoint.y;
nscoord thumbStart = isHorizontal ? thumbRect.x : thumbRect.y;
nscoord thumbEnd = isHorizontal ? thumbRect.XMost() : thumbRect.YMost();
return eventPos >= thumbStart && eventPos < thumbEnd;
#endif
}
NS_IMETHODIMP

View File

@ -1123,7 +1123,21 @@ moz_gtk_scrollbar_button_paint(cairo_t *cr, GdkRectangle* rect,
} else {
gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOP);
}
/* Scrollbar button has to be inset by trough_border because its DOM element
* is filling width of vertical scrollbar's track (or height in case
* of horizontal scrollbars). */
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
if (flags & MOZ_GTK_STEPPER_VERTICAL) {
rect->x += metrics.trough_border;
rect->width = metrics.slider_width;
} else {
rect->y += metrics.trough_border;
rect->height = metrics.slider_width;
}
gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height);
gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height);

View File

@ -1211,11 +1211,21 @@ nsNativeThemeGTK::GetWidgetBorder(nsDeviceContext* aContext, nsIFrame* aFrame,
aResult->top = aResult->left = aResult->right = aResult->bottom = 0;
switch (aWidgetType) {
case NS_THEME_SCROLLBAR_VERTICAL:
case NS_THEME_SCROLLBAR_HORIZONTAL:
case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL:
{
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
aResult->top = aResult->left = aResult->right = aResult->bottom = metrics.trough_border;
/* Top and bottom border for whole vertical scrollbar, top and bottom
* border for horizontal track - to correctly position thumb element */
aResult->top = aResult->bottom = metrics.trough_border;
}
break;
case NS_THEME_SCROLLBAR_HORIZONTAL:
case NS_THEME_SCROLLBAR_TRACK_VERTICAL:
{
MozGtkScrollbarMetrics metrics;
moz_gtk_get_scrollbar_metrics(&metrics);
aResult->left = aResult->right = metrics.trough_border;
}
break;
case NS_THEME_TOOLBOX:
@ -1748,6 +1758,8 @@ nsNativeThemeGTK::ThemeSupportsWidget(nsPresContext* aPresContext,
case NS_THEME_SCROLLBAR_BUTTON_RIGHT:
case NS_THEME_SCROLLBAR_HORIZONTAL:
case NS_THEME_SCROLLBAR_VERTICAL:
case NS_THEME_SCROLLBAR_TRACK_HORIZONTAL:
case NS_THEME_SCROLLBAR_TRACK_VERTICAL:
case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL:
case NS_THEME_SCROLLBAR_THUMB_VERTICAL:
case NS_THEME_NUMBER_INPUT: