gtk2_ui.cc revision 58537e28ecd584eab876aee8be7156509866d23a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_ui.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/environment.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/nix/mime_util_xdg.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/stringprintf.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/libgtk2ui/app_indicator_icon.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/chrome_gtk_frame.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_util.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/native_theme_gtk2.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/select_file_dialog_impl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/skia_utils_gtk2.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/libgtk2ui/unity_service.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ui_resources.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkShader.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A minimized port of GtkThemeService into something that can provide colors 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and images for aura. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erg): There's still a lot that needs ported or done for the first time: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Inject default favicon/folder icons into views somehow. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Render and inject the button overlay from the gtk theme. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Render and inject the omnibox background. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Listen for the "style-set" signal on |fake_frame_| and recreate theme 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// colors and images. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Allow not using the theme. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Make sure to test with a light on dark theme, too. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Everything else that we're not doing. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Prefix for app indicator ids 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kAppIndicatorIdPrefix[] = "chrome_app_indicator_"; 56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Number of app indicators used (used as part of app-indicator id). 58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint indicators_count; 59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The size of the rendered toolbar image. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kToolbarImageWidth = 64; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kToolbarImageHeight = 128; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How much to tint the GTK+ color lighter at the top of the window. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kGtkFrameShift = { -1, -1, 0.58 }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How much to tint the GTK+ color when an explicit frame color hasn't been 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultFrameShift = { -1, -1, 0.4 }; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Values used as the new luminance and saturation values in the inactive tab 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// text color. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kDarkInactiveLuminance = 0.85; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kLightInactiveLuminance = 0.15; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kHeavyInactiveSaturation = 0.7; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kLightInactiveSaturation = 0.3; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default color for links on the NTP when the GTK+ theme doesn't define a 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// link color. Constant taken from gtklinkbutton.c. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GdkColor kDefaultLinkColor = { 0, 0, 0, 0xeeee }; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSkiaToGDKMultiplier = 257; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erg): ThemeService has a whole interface just for reading default 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constants. Figure out what to do with that more long term; for now, just 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copy the constants themselves here. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default tints. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintButtons = { -1, -1, -1 }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrame = { -1, -1, -1 }; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameInactive = { -1, -1, 0.75f }; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameIncognito = { -1, 0.2f, 0.35f }; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameIncognitoInactive = { -1, 0.3f, 0.6f }; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintBackgroundTab = { -1, 0.5, 0.75 }; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of images that we provide while in gtk mode. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kThemeImages[] = { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TOOLBAR, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND_INCOGNITO, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INACTIVE, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INCOGNITO, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INCOGNITO_INACTIVE, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of icons used in the autocomplete view that should be tinted to the 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current gtk theme selection color so they stand out against the GtkEntry's 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base color. 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(erg): Decide what to do about other icons that appear in the omnibox, 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// e.g. content settings icons. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kAutocompleteImages[] = { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_EXTENSION_APP, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_HTTP, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_HTTP_DARK, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_SEARCH, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_SEARCH_DARK, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_STAR, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_STAR_DARK, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_TTS, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_TTS_DARK, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This table converts button ids into a pair of gtk-stock id and state. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IDRGtkMapping { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idr; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* stock_id; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStateType gtk_state; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} const kGtkIcons[] = { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK, GTK_STOCK_GO_BACK, GTK_STATE_NORMAL }, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK_D, GTK_STOCK_GO_BACK, GTK_STATE_INSENSITIVE }, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK_H, GTK_STOCK_GO_BACK, GTK_STATE_PRELIGHT }, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK_P, GTK_STOCK_GO_BACK, GTK_STATE_ACTIVE }, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD, GTK_STOCK_GO_FORWARD, GTK_STATE_NORMAL }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD_D, GTK_STOCK_GO_FORWARD, GTK_STATE_INSENSITIVE }, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD_H, GTK_STOCK_GO_FORWARD, GTK_STATE_PRELIGHT }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD_P, GTK_STOCK_GO_FORWARD, GTK_STATE_ACTIVE }, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_HOME, GTK_STOCK_HOME, GTK_STATE_NORMAL }, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_HOME_H, GTK_STOCK_HOME, GTK_STATE_PRELIGHT }, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_HOME_P, GTK_STOCK_HOME, GTK_STATE_ACTIVE }, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_RELOAD, GTK_STOCK_REFRESH, GTK_STATE_NORMAL }, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_RELOAD_H, GTK_STOCK_REFRESH, GTK_STATE_PRELIGHT }, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_RELOAD_P, GTK_STOCK_REFRESH, GTK_STATE_ACTIVE }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP, GTK_STOCK_STOP, GTK_STATE_NORMAL }, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP_D, GTK_STOCK_STOP, GTK_STATE_INSENSITIVE }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP_H, GTK_STOCK_STOP, GTK_STATE_PRELIGHT }, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP_P, GTK_STOCK_STOP, GTK_STATE_ACTIVE }, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The image resources that will be tinted by the 'button' tint value. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kOtherToolbarButtonIDs[] = { 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_TOOLBAR_BEZEL_HOVER, 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_TOOLBAR_BEZEL_PRESSED, 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_BROWSER_ACTION_H, 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_BROWSER_ACTION_P, 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_BROWSER_ACTIONS_OVERFLOW, 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_BROWSER_ACTIONS_OVERFLOW_H, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_BROWSER_ACTIONS_OVERFLOW_P, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER, 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER_WAITING, 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER_LIGHT, 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(erg): The dropdown arrow should be tinted because we're injecting 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // various background GTK colors, but the code that accesses them needs to be 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // modified so that they ask their ui::ThemeProvider instead of the 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ResourceBundle. (i.e. in a light on dark theme, the dropdown arrow will be 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // dark on dark) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_MENU_DROPARROW 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOverridableImage(int id) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(std::set<int>, images, ()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (images.empty()) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kThemeImages, kThemeImages + arraysize(kThemeImages)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kAutocompleteImages, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAutocompleteImages + arraysize(kAutocompleteImages)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < arraysize(kGtkIcons); ++i) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kGtkIcons[i].idr); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kOtherToolbarButtonIDs, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOtherToolbarButtonIDs + arraysize(kOtherToolbarButtonIDs)); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return images.count(id) > 0; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Picks a button tint from a set of background colors. While 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |accent_gdk_color| will usually be the same color through a theme, this 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function will get called with the normal GtkLabel |text_color|/GtkWindow 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |background_color| pair and the GtkEntry |text_color|/|background_color| 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pair. While 3/4 of the time the resulting tint will be the same, themes that 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have a dark window background (with light text) and a light text entry (with 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dark text) will get better icons with this separated out. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PickButtonTintFromColors(const GdkColor& accent_gdk_color, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor& text_color, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor& background_color, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL* tint) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor accent_color = libgtk2ui::GdkColorToSkColor(accent_gdk_color); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL accent_tint; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(accent_color, &accent_tint); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL text_tint; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(text_color), 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text_tint); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL background_tint; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(libgtk2ui::GdkColorToSkColor(background_color), 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &background_tint); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the accent color is gray, then our normal HSL tomfoolery will bring out 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whatever color is oddly dominant (for example, in rgb space [125, 128, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 125] will tint green instead of gray). Slight differences (+/-10 (4%) to 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all color components) should be interpreted as this color being gray and 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we should switch into a special grayscale mode. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rb_diff = abs(SkColorGetR(accent_color) - SkColorGetB(accent_color)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rg_diff = abs(SkColorGetR(accent_color) - SkColorGetG(accent_color)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bg_diff = abs(SkColorGetB(accent_color) - SkColorGetG(accent_color)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rb_diff < 10 && rg_diff < 10 && bg_diff < 10) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our accent is white/gray/black. Only the luminance of the accent color 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matters. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->h = -1; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the saturation of the text. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->s = text_tint.s; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the luminance of the accent color UNLESS there isn't enough 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // luminance contrast between the accent color and the base color. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fabs(accent_tint.l - background_tint.l) > 0.3) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = accent_tint.l; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = text_tint.l; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our accent is a color. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->h = accent_tint.h; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't modify the saturation; the amount of color doesn't matter. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->s = -1; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the text wants us to darken the icon, don't change the luminance (the 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icons are already dark enough). Otherwise, lighten the icon by no more 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than 0.9 since we don't want a pure-white icon even if the text is pure 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // white. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text_tint.l < 0.5) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = -1; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (text_tint.l <= 0.9) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = text_tint.l; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = 0.9; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Applies an HSL shift to a GdkColor (instead of an SkColor) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GdkColorHSLShift(const color_utils::HSL& shift, GdkColor* frame_color) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor shifted = color_utils::HSLShift( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) libgtk2ui::GdkColorToSkColor(*frame_color), shift); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->pixel = 0; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->red = SkColorGetR(shifted) * kSkiaToGDKMultiplier; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->green = SkColorGetG(shifted) * kSkiaToGDKMultiplier; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->blue = SkColorGetB(shifted) * kSkiaToGDKMultiplier; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copied Default blah sections from ThemeService. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)color_utils::HSL GetDefaultTint(int id) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id) { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME: 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrame; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INACTIVE: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameInactive; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INCOGNITO: 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameIncognito; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE: 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameIncognitoInactive; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_BUTTONS: 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintButtons; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_BACKGROUND_TAB: 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintBackgroundTab; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL result = {-1, -1, -1}; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace libgtk2ui { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Gtk2UI::Gtk2UI() { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DLOG(ERROR) << "Activating the gtk2 component"; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create our fake widgets. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_frame_ = chrome_gtk_frame_new(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_label_.Own(gtk_label_new("")); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_entry_.Own(gtk_entry_new()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only realized widgets receive style-set notifications, which we need to 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // broadcast new theme images and colors. Only realized widgets have style 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properties, too, which we query for some colors. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(fake_frame_); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(fake_window_); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: Also listen for "style-set" on the fake frame. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): Be lazy about generating this data and connect it to the 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // style-set signal handler. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadGtkValues(); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetXDGIconTheme(); 315ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 316ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch indicators_count = 0; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Gtk2UI::~Gtk2UI() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(fake_window_); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(fake_frame_); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_label_.Destroy(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_entry_.Destroy(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllThemeData(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Gtk2UI::UseNativeTheme() const { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image Gtk2UI::GetThemeImageNamed(int id) const { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to get our cached version: 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache::const_iterator it = gtk_images_.find(id); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != gtk_images_.end()) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (/*use_gtk_ && */ IsOverridableImage(id)) { 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image = gfx::Image( 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(GenerateGtkThemeBitmap(id))); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_images_[id] = image; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Image(); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Gtk2UI::GetColor(int id, SkColor* color) const { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorMap::const_iterator it = colors_.find(id); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != colors_.end()) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *color = it->second; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Gtk2UI::HasCustomImage(int id) const { 359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsOverridableImage(id); 360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 361eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::NativeTheme* Gtk2UI::GetNativeTheme() const { 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NativeThemeGtk2::instance(); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Gtk2UI::GetDefaultUsesSystemTheme() const { 367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Environment> env(base::Environment::Create()); 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (base::nix::GetDesktopEnvironment(env.get())) { 370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_GNOME: 371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_UNITY: 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_XFCE: 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_KDE3: 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_KDE4: 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_OTHER: 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Unless GetDesktopEnvironment() badly misbehaves, this should never happen. 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Gtk2UI::SetDownloadCount(int count) const { 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (unity::IsRunning()) 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unity::SetDownloadCount(count); 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Gtk2UI::SetProgressFraction(float percentage) const { 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (unity::IsRunning()) 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unity::SetProgressFraction(percentage); 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool Gtk2UI::IsStatusIconSupported() const { 395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return AppIndicatorIcon::CouldOpen(); 396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<views::StatusIconLinux> Gtk2UI::CreateLinuxStatusIcon( 399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::ImageSkia& image, 400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const string16& tool_tip) const { 401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (AppIndicatorIcon::CouldOpen()) { 402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++indicators_count; 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<views::StatusIconLinux>(new AppIndicatorIcon( 404a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringPrintf("%s%d", kAppIndicatorIdPrefix, indicators_count), 405a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) image, 406a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) tool_tip)); 407ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<views::StatusIconLinux>(); 409ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 410ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 411ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SelectFileDialog* Gtk2UI::CreateSelectFileDialog( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::Listener* listener, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFilePolicy* policy) const { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SelectFileDialogImpl::Create(listener, policy); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetScrollbarColors(GdkColor* thumb_active_color, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* thumb_inactive_color, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* track_color) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* theme_thumb_active = NULL; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* theme_thumb_inactive = NULL; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* theme_trough_color = NULL; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-slider-prelight-color", &theme_thumb_active, 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-slider-normal-color", &theme_thumb_inactive, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-trough-color", &theme_trough_color, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask the theme if the theme specifies all the scrollbar colors and short 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // circuit the expensive painting/compositing if we have all of them. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_thumb_active && theme_thumb_inactive && theme_trough_color) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_active_color = *theme_thumb_active; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_inactive_color = *theme_thumb_inactive; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *track_color = *theme_trough_color; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create window containing scrollbar elements 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* fixed = gtk_fixed_new(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* scrollbar = gtk_hscrollbar_new(NULL); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(window), fixed); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(fixed), scrollbar); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(window); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(scrollbar); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw scrollbar thumb part and track into offscreen image 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWidth = 100; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kHeight = 20; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(scrollbar); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkWindow* gdk_window = gtk_widget_get_window(window); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixmap* pm = gdk_pixmap_new(gdk_window, kWidth, kHeight, -1); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkRectangle rect = { 0, 0, kWidth, kHeight }; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char data[3 * kWidth * kHeight]; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < 2) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thumb part 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_paint_slider(style, pm, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i == 0 ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_SHADOW_OUT, &rect, scrollbar, "slider", 0, 0, 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight, GTK_ORIENTATION_HORIZONTAL); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_paint_box(style, pm, GTK_STATE_ACTIVE, GTK_SHADOW_IN, &rect, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scrollbar, "trough-upper", 0, 0, kWidth, kHeight); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* pb = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, 8, kWidth, kHeight, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * kWidth, 0, 0); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_pixbuf_get_from_drawable(pb, pm, NULL, 0, 0, 0, 0, kWidth, kHeight); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample pixels 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int components[3] = { 0 }; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 2; y < kHeight - 2; ++y) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int c = 0; c < 3; ++c) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample a vertical slice of pixels at about one-thirds from the 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // left edge. This allows us to avoid any fixed graphics that might be 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // located at the edges or in the center of the scrollbar. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each pixel is made up of a red, green, and blue component; taking up 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a total of three bytes. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) components[c] += data[3 * (kWidth / 3 + y * kWidth) + c]; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* color = i == 0 ? thumb_active_color : 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i == 1 ? thumb_inactive_color : 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_color; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->pixel = 0; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We sampled pixels across the full height of the image, ignoring a two 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pixel border. In some themes, the border has a completely different 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // color which we do not want to factor into our average color computation. 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We now need to scale the colors from the 0..255 range, to the wider 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0..65535 range, and we need to actually compute the average color; so, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we divide by the total number of pixels in the sample. 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->red = components[0] * 65535 / (255 * (kHeight - 4)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->green = components[1] * 65535 / (255 * (kHeight - 4)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->blue = components[2] * 65535 / (255 * (kHeight - 4)); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pb); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pm); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(window); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override any of the default colors with ones that were specified by the 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // theme. 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_thumb_active) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_active_color = *theme_thumb_active; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_thumb_inactive) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_inactive_color = *theme_thumb_inactive; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_trough_color) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *track_color = *theme_trough_color; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Gtk2UI::SetXDGIconTheme() { 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gchar* gtk_theme_name; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_object_get(gtk_settings_get_default(), 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "gtk-icon-theme-name", 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) >k_theme_name, NULL); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::nix::SetIconThemeName(gtk_theme_name); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_free(gtk_theme_name); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::LoadGtkValues() { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): GtkThemeService had a comment here about having to muck with 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the raw Prefs object to remove prefs::kCurrentThemeImages or else we'd 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regress startup time. Figure out how to do that when we can't access the 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prefs system from here. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* frame_style = gtk_rc_get_style(fake_frame_); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_CONTROL_BACKGROUND, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &window_style->bg[GTK_STATE_NORMAL]); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor toolbar_color = window_style->bg[GTK_STATE_NORMAL]; 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_TOOLBAR, &toolbar_color); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor button_color = window_style->bg[GTK_STATE_SELECTED]; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeTintFromGtk(ThemeProperties::TINT_BUTTONS, &button_color); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* label_style = gtk_rc_get_style(fake_label_.get()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor label_color = label_style->fg[GTK_STATE_NORMAL]; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_TAB_TEXT, &label_color); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_BOOKMARK_TEXT, &label_color); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build the various icon tints. 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNormalButtonTintHSL(&button_tint_); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNormalEntryForegroundHSL(&entry_tint_); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSelectedEntryForegroundHSL(&selected_entry_tint_); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor frame_color = BuildFrameColors(frame_style); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The inactive frame color never occurs naturally in the theme, as it is a 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tinted version of |frame_color|. We generate another color based on the 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background tab color, with the lightness and saturation moved in the 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opposite direction. (We don't touch the hue, since there should be subtle 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hints of the color in the text.) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL inactive_tab_text_hsl = 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tints_[ThemeProperties::TINT_BACKGROUND_TAB]; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inactive_tab_text_hsl.l < 0.5) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.l = kDarkInactiveLuminance; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.l = kLightInactiveLuminance; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inactive_tab_text_hsl.s < 0.5) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.s = kHeavyInactiveSaturation; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.s = kLightInactiveSaturation; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors_[ThemeProperties::COLOR_BACKGROUND_TAB_TEXT] = 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSLToSkColor(inactive_tab_text_hsl, 255); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We pick the text and background colors for the NTP out of the colors for a 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GtkEntry. We do this because GtkEntries background color is never the same 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as |toolbar_color|, is usually a white, and when it isn't a white, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provides sufficient contrast to |toolbar_color|. Try this out with 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Darklooks, HighContrastInverse or ThinIce. 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* entry_style = gtk_rc_get_style(fake_entry_.get()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor ntp_background = entry_style->base[GTK_STATE_NORMAL]; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor ntp_foreground = entry_style->text[GTK_STATE_NORMAL]; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_BACKGROUND, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ntp_background); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_TEXT, 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ntp_foreground); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The NTP header is the color that surrounds the current active thumbnail on 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the NTP, and acts as the border of the "Recent Links" box. It would be 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // awesome if they were separated so we could use GetBorderColor() for the 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // border around the "Recent Links" section, but matching the frame color is 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // more important. 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_HEADER, 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &toolbar_color); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_TEXT, 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &label_color); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the link color if the theme provides it. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* link_color = NULL; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_window_), 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "link-color", &link_color, NULL); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_default_link_color = false; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!link_color) { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color = &kDefaultLinkColor; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_default_link_color = true; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_LINK, 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_LINK_UNDERLINE, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_LINK, 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE, 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_default_link_color) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(const_cast<GdkColor*>(link_color)); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate the colors that we pass to WebKit. 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_ring_color_ = GdkColorToSkColor(frame_color); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor thumb_active_color, thumb_inactive_color, track_color; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Gtk2UI::GetScrollbarColors(&thumb_active_color, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &thumb_inactive_color, 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &track_color); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumb_active_color_ = GdkColorToSkColor(thumb_active_color); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumb_inactive_color_ = GdkColorToSkColor(thumb_inactive_color); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_color_ = GdkColorToSkColor(track_color); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some GTK themes only define the text selection colors on the GtkEntry 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class, so we need to use that for getting selection colors. 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_selection_bg_color_ = 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->base[GTK_STATE_SELECTED]); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_selection_fg_color_ = 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->text[GTK_STATE_SELECTED]); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_selection_bg_color_ = 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->base[GTK_STATE_ACTIVE]); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_selection_fg_color_ = 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->text[GTK_STATE_ACTIVE]); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GdkColor Gtk2UI::BuildFrameColors(GtkStyle* frame_style) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_frame = NULL; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_inactive_frame = NULL; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_incognito_frame = NULL; 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_incognito_inactive_frame = NULL; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-color", &theme_frame, 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "inactive-frame-color", &theme_inactive_frame, 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-frame-color", &theme_incognito_frame, 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-inactive-frame-color", 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &theme_incognito_inactive_frame, 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor frame_color = BuildAndSetFrameColor( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_style->bg[GTK_STATE_SELECTED], 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_frame, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultFrameShift, 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME, 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_frame) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_frame); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeTintFromGtk(ThemeProperties::TINT_BACKGROUND_TAB, &frame_color); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_style->bg[GTK_STATE_INSENSITIVE], 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_inactive_frame, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultFrameShift, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INACTIVE, 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INACTIVE); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_inactive_frame) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_inactive_frame); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color, 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_incognito_frame, 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO), 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO, 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_incognito_frame) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_incognito_frame); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color, 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_incognito_inactive_frame, 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE), 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE, 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_incognito_inactive_frame) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_incognito_inactive_frame); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_color; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::SetThemeColorFromGtk(int id, const GdkColor* color) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[id] = GdkColorToSkColor(*color); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::SetThemeTintFromGtk(int id, const GdkColor* color) { 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL default_tint = GetDefaultTint(id); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL hsl; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(GdkColorToSkColor(*color), &hsl); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_tint.s != -1) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.s = default_tint.s; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_tint.l != -1) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.l = default_tint.l; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[id] = hsl; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GdkColor Gtk2UI::BuildAndSetFrameColor(const GdkColor* base, 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* gtk_base, 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& tint, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int color_id, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tint_id) { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor out_color = *base; 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gtk_base) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The theme author specified a color to use, use it without modification. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_color = *gtk_base; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tint the basic color since this is a heuristic color instead of one 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the theme author. 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorHSLShift(tint, &out_color); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetThemeColorFromGtk(color_id, &out_color); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetThemeTintFromGtk(tint_id, &out_color); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out_color; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateGtkThemeBitmap(int id) const { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id) { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TOOLBAR: { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_window_); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* color = &style->bg[GTK_STATE_NORMAL]; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.setConfig(SkBitmap::kARGB_8888_Config, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kToolbarImageWidth, kToolbarImageHeight); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.allocPixels(); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap.eraseRGB(color->red >> 8, color->green >> 8, color->blue >> 8); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitmap; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND: 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTabImage(IDR_THEME_FRAME); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND_INCOGNITO: 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTabImage(IDR_THEME_FRAME_INCOGNITO); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME: 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-gradient-color"); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INACTIVE: 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME_INACTIVE, 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "inactive-frame-gradient-color"); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INCOGNITO: 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME_INCOGNITO, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-frame-gradient-color"); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INCOGNITO_INACTIVE: { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateFrameImage( 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE, 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-inactive-frame-gradient-color"); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Icons that sit inside the omnibox shouldn't receive TINT_BUTTONS and 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead should tint based on the foreground text entry color in GTK+ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode because some themes that try to be dark *and* light have very 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different colors between the omnibox and the normal background area. 7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(erg): Decide what to do about other icons that appear in the 7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // omnibox, e.g. content settings icons. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_EXTENSION_APP: 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_HTTP: 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_SEARCH: 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_STAR: 7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case IDR_OMNIBOX_TTS: { 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, entry_tint_); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In GTK mode, the dark versions of the omnibox icons only ever appear in 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the autocomplete popup and only against the current theme's GtkEntry 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base[GTK_STATE_SELECTED] color, so tint the icons so they won't collide 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the selected color. 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_EXTENSION_APP_DARK: 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_HTTP_DARK: 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_SEARCH_DARK: 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_STAR_DARK: 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_TTS_DARK: { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, selected_entry_tint_); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In GTK mode, we need to manually render several icons. 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK: 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK_D: 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK_H: 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK_P: 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD: 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD_D: 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD_H: 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD_P: 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_HOME: 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_HOME_H: 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_HOME_P: 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_RELOAD: 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_RELOAD_H: 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_RELOAD_P: 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_STOP: 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_STOP_D: 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_STOP_H: 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_STOP_P: { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateGTKIcon(id); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_TOOLBAR_BEZEL_HOVER: 8147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_PRELIGHT, IDR_TOOLBAR_BEZEL_HOVER); 8157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_TOOLBAR_BEZEL_PRESSED: 8167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_ACTIVE, IDR_TOOLBAR_BEZEL_PRESSED); 8177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_BROWSER_ACTION_H: 8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_PRELIGHT, IDR_BROWSER_ACTION_H); 8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_BROWSER_ACTION_P: 8207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_ACTIVE, IDR_BROWSER_ACTION_P); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, button_tint_); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmap(); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateFrameImage( 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int color_id, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* gradient_name) const { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use two colors: the main color (passed in) and a lightened version of 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that color (which is supposed to match the light gradient at the top of 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // several GTK+ themes, such as Ambiance, Clearlooks or Bluebird). 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorMap::const_iterator it = colors_.find(color_id); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != colors_.end()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor base = it->second; 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Canvas canvas(gfx::Size(kToolbarImageWidth, kToolbarImageHeight), 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SCALE_FACTOR_100P, true); 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int gradient_size; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* gradient_top_color = NULL; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-gradient-size", &gradient_size, 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gradient_name, &gradient_top_color, 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gradient_size) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor lighter = gradient_top_color ? 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(*gradient_top_color) : 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSLShift(base, kGtkFrameShift); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gradient_top_color) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(gradient_top_color); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::RefPtr<SkShader> shader = gfx::CreateGradientShader( 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, gradient_size, lighter, base); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setAntiAlias(true); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setShader(shader.get()); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.DrawRect(gfx::Rect(0, 0, kToolbarImageWidth, gradient_size), paint); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.FillRect(gfx::Rect(0, gradient_size, kToolbarImageWidth, 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kToolbarImageHeight - gradient_size), base); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return canvas.ExtractImageRep().sk_bitmap(); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateTabImage(int base_id) const { 870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SkBitmap* base_image = GetThemeImageNamed(base_id).ToSkBitmap(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bg_tint = SkBitmapOperations::CreateHSLShiftedBitmap( 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base_image, GetDefaultTint(ThemeProperties::TINT_BACKGROUND_TAB)); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmapOperations::CreateTiledBitmap( 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_tint, 0, 0, bg_tint.width(), bg_tint.height()); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateTintedIcon( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int base_id, 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& tint) const { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmapOperations::CreateHSLShiftedBitmap( 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageNamed(base_id).AsBitmap(), tint); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateGTKIcon(int base_id) const { 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* stock_id = NULL; 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStateType gtk_state = GTK_STATE_NORMAL; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < arraysize(kGtkIcons); ++i) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kGtkIcons[i].idr == base_id) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stock_id = kGtkIcons[i].stock_id; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_state = kGtkIcons[i].gtk_state; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stock_id); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap default_bitmap = rb.GetImageNamed(base_id).AsBitmap(); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_ensure_style(fake_frame_); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_widget_get_style(fake_frame_); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkIconSet* icon_set = gtk_style_lookup_icon_set(style, stock_id); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!icon_set) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_bitmap; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask GTK to render the icon to a buffer, which we will steal from. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* gdk_icon = gtk_icon_set_render_icon( 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_set, 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style, 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::IsRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR, 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_state, 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_ICON_SIZE_SMALL_TOOLBAR, 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_frame_, 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gdk_icon) { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This can theoretically happen if an icon theme doesn't provide a 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific image. This should realistically never happen, but I bet there 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are some theme authors who don't reliably provide all icons. 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_bitmap; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap retval; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.setConfig(SkBitmap::kARGB_8888_Config, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.allocPixels(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.eraseColor(0); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap icon = GdkPixbufToImageSkia(gdk_icon); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(gdk_icon); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas(retval); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gtk_state == GTK_STATE_ACTIVE || gtk_state == GTK_STATE_PRELIGHT) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = DrawGtkButtonBorder(gtk_state, 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(border, 0, 0); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(icon, 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (default_bitmap.width() / 2) - (icon.width() / 2), 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (default_bitmap.height() / 2) - (icon.height() / 2)); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSkBitmap Gtk2UI::GenerateToolbarBezel(int gtk_state, int sizing_idr) const { 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 9517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkBitmap default_bitmap = 9527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rb.GetImageNamed(sizing_idr).AsBitmap(); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap retval; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.setConfig(SkBitmap::kARGB_8888_Config, 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.allocPixels(); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.eraseColor(0); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas(retval); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = DrawGtkButtonBorder( 9637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gtk_state, 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(border, 0, 0); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetNormalButtonTintHSL(color_utils::HSL* tint) const { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor accent_gdk_color = window_style->bg[GTK_STATE_SELECTED]; 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor base_color = window_style->base[GTK_STATE_NORMAL]; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* label_style = gtk_rc_get_style(fake_label_.get()); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor text_color = label_style->fg[GTK_STATE_NORMAL]; 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickButtonTintFromColors(accent_gdk_color, text_color, base_color, tint); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetNormalEntryForegroundHSL(color_utils::HSL* tint) const { 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor accent_gdk_color = window_style->bg[GTK_STATE_SELECTED]; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_entry_.get()); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor text_color = style->text[GTK_STATE_NORMAL]; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor base_color = style->base[GTK_STATE_NORMAL]; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickButtonTintFromColors(accent_gdk_color, text_color, base_color, tint); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetSelectedEntryForegroundHSL(color_utils::HSL* tint) const { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The simplest of all the tints. We just use the selected text in the entry 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the icons tinted this way will only be displayed against 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base[GTK_STATE_SELECTED]. 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_entry_.get()); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor color = style->text[GTK_STATE_SELECTED]; 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(GdkColorToSkColor(color), tint); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::DrawGtkButtonBorder(int gtk_state, 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height) const { 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a temporary GTK button to snapshot 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* window = gtk_offscreen_window_new(); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* button = gtk_button_new(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_size_request(button, width, height); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(window), button); 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(window); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(button); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_show(button); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_show(window); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_state(button, static_cast<GtkStateType>(gtk_state)); 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixmap* pixmap = gtk_widget_get_snapshot(button, NULL); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w, h; 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(w, width); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(h, height); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We render the Pixmap to a Pixbuf. This can be slow, as we're scrapping 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bits from X. 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColormap* colormap = gdk_drawable_get_colormap(pixmap); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(NULL, 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDK_DRAWABLE(pixmap), 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colormap, 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, w, h); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally, we convert our pixbuf into a type we can use. 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = GdkPixbufToImageSkia(pixbuf); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pixbuf); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pixmap); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(window); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return border; 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::ClearAllThemeData() { 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_images_.clear(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace libgtk2ui 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 104558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)views::LinuxUI* BuildGtk2UI() { 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new libgtk2ui::Gtk2UI; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1048