1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "webkit/glue/webthemeengine_impl_linux.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "skia/ext/platform_canvas.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/gfx/native_theme.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebCanvas; 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebColor; 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing WebKit::WebRect; 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace webkit_glue { 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic gfx::Rect WebRectToRect(const WebRect& rect) { 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return gfx::Rect(rect.x, rect.y, rect.width, rect.height); 20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic gfx::NativeTheme::Part NativeThemePart( 23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::Part part) { 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (part) { 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarDownArrow: 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarDownArrow; 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarLeftArrow: 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarLeftArrow; 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarRightArrow: 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarRightArrow; 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarUpArrow: 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarUpArrow; 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarHorizontalThumb: 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarHorizontalThumb; 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarVerticalThumb: 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarVerticalThumb; 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack: 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarHorizontalTrack; 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::PartScrollbarVerticalTrack: 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarVerticalTrack; 4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartCheckbox: 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kCheckbox; 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartRadio: 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kRadio; 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartButton: 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kPushButton; 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartTextField: 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kTextField; 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartMenuList: 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kMenuList; 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartSliderTrack: 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kSliderTrack; 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartSliderThumb: 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kSliderThumb; 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartInnerSpinButton: 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kInnerSpinButton; 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartProgressBar: 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kProgressBar; 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kScrollbarDownArrow; 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstatic gfx::NativeTheme::State NativeThemeState( 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::State state) { 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (state) { 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::StateDisabled: 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kDisabled; 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::StateHover: 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kHovered; 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::StateNormal: 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kNormal; 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case WebKit::WebThemeEngine::StatePressed: 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kPressed; 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::kDisabled; 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic void GetNativeThemeExtraParams( 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::Part part, 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::State state, 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const WebKit::WebThemeEngine::ExtraParams* extra_params, 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeTheme::ExtraParams* native_theme_extra_params) { 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (part) { 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack: 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartScrollbarVerticalTrack: 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->scrollbar_track.track_x = 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->scrollbarTrack.trackX; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->scrollbar_track.track_y = 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->scrollbarTrack.trackY; 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->scrollbar_track.track_width = 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->scrollbarTrack.trackWidth; 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->scrollbar_track.track_height = 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->scrollbarTrack.trackHeight; 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartCheckbox: 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->button.checked = extra_params->button.checked; 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->button.indeterminate = 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->button.indeterminate; 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartRadio: 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->button.checked = extra_params->button.checked; 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartButton: 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->button.is_default = 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->button.isDefault; 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen native_theme_extra_params->button.has_border = 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extra_params->button.hasBorder; 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->button.background_color = 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->button.backgroundColor; 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartTextField: 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->text_field.is_text_area = 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->textField.isTextArea; 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->text_field.is_listbox = 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->textField.isListbox; 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->text_field.background_color = 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->textField.backgroundColor; 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartMenuList: 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen native_theme_extra_params->menu_list.has_border = 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extra_params->menuList.hasBorder; 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen native_theme_extra_params->menu_list.has_border_radius = 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen extra_params->menuList.hasBorderRadius; 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->menu_list.arrow_x = 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->menuList.arrowX; 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->menu_list.arrow_y = 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->menuList.arrowY; 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->menu_list.background_color = 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->menuList.backgroundColor; 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartSliderTrack: 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartSliderThumb: 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->slider.vertical = 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->slider.vertical; 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag; 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartInnerSpinButton: 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->inner_spin.spin_up = 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->innerSpin.spinUp; 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->inner_spin.read_only = 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->innerSpin.readOnly; 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebKit::WebThemeEngine::PartProgressBar: 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->progress_bar.determinate = 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->progressBar.determinate; 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->progress_bar.value_rect_x = 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->progressBar.valueRectX; 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->progress_bar.value_rect_y = 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->progressBar.valueRectY; 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->progress_bar.value_rect_width = 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->progressBar.valueRectWidth; 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen native_theme_extra_params->progress_bar.value_rect_height = 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extra_params->progressBar.valueRectHeight; 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default: 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; // Parts that have no extra params get here. 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 162731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickWebKit::WebSize WebThemeEngineImpl::getSize(WebKit::WebThemeEngine::Part part) { 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return gfx::NativeTheme::instance()->GetPartSize(NativeThemePart(part)); 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid WebThemeEngineImpl::paint( 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebCanvas* canvas, 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::Part part, 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebKit::WebThemeEngine::State state, 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const WebKit::WebRect& rect, 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const WebKit::WebThemeEngine::ExtraParams* extra_params) { 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeTheme::ExtraParams native_theme_extra_params; 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetNativeThemeExtraParams( 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick part, state, extra_params, &native_theme_extra_params); 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen gfx::NativeTheme::instance()->Paint( 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick canvas, 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NativeThemePart(part), 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NativeThemeState(state), 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebRectToRect(rect), 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick native_theme_extra_params); 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace webkit_glue 183