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) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <pango/pango.h> 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/debug/leak_annotations.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/environment.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/nix/mime_util_xdg.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/nix/xdg_util.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/stringprintf.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/themes/theme_properties.h" 21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/libgtk2ui/app_indicator_icon.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/chrome_gtk_frame.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_border.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/libgtk2ui/gtk2_event_loop.h" 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/ui/libgtk2ui/gtk2_key_bindings_handler.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_signal_registrar.h" 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_status_icon.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/gtk2_util.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/native_theme_gtk2.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/print_dialog_gtk2.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/printing_gtk2_util.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/select_file_dialog_impl.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/skia_utils_gtk2.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/libgtk2ui/unity_service.h" 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/libgtk2ui/x11_input_method_context_impl_gtk2.h" 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_scaled_resources.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "printing/printing_context_linux.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkShader.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gfx/pango_util.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skbitmap_operations.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h" 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/controls/button/label_button.h" 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/views/controls/button/label_button_border.h" 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/views/linux_ui/window_button_order_observer.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_GCONF) 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/libgtk2ui/gconf_listener.h" 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A minimized port of GtkThemeService into something that can provide colors 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and images for aura. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erg): There's still a lot that needs ported or done for the first time: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Render and inject the omnibox background. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Make sure to test with a light on dark theme, too. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Work around a header bug: 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// linux/debian_wheezy_i386-sysroot/usr/include/linux/stddef.h redefines NULL 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// to 0, which breaks -Wsentinel. Get back the normal definition of NULL. 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(thakis): Remove this once we update sysroots. 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define __need_NULL 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <stddef.h> 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace libgtk2ui { 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct GObjectDeleter { 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void operator()(void* ptr) { 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g_object_unref(ptr); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct GtkIconInfoDeleter { 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void operator()(GtkIconInfo* ptr) { 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gtk_icon_info_free(ptr); 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef scoped_ptr<GIcon, GObjectDeleter> ScopedGIcon; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef scoped_ptr<GtkIconInfo, GtkIconInfoDeleter> ScopedGtkIconInfo; 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef scoped_ptr<GdkPixbuf, GObjectDeleter> ScopedGdkPixbuf; 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Prefix for app indicator ids 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kAppIndicatorIdPrefix[] = "chrome_app_indicator_"; 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Number of app indicators used (used as part of app-indicator id). 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint indicators_count; 98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The unknown content type. 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char* kUnknownContentType = "application/octet-stream"; 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The size of the rendered toolbar image. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kToolbarImageWidth = 64; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kToolbarImageHeight = 128; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How much to tint the GTK+ color lighter at the top of the window. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kGtkFrameShift = { -1, -1, 0.58 }; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How much to tint the GTK+ color when an explicit frame color hasn't been 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specified. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultFrameShift = { -1, -1, 0.4 }; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Values used as the new luminance and saturation values in the inactive tab 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// text color. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kDarkInactiveLuminance = 0.85; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kLightInactiveLuminance = 0.15; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kHeavyInactiveSaturation = 0.7; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kLightInactiveSaturation = 0.3; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default color for links on the NTP when the GTK+ theme doesn't define a 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// link color. Constant taken from gtklinkbutton.c. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GdkColor kDefaultLinkColor = { 0, 0, 0, 0xeeee }; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSkiaToGDKMultiplier = 257; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erg): ThemeService has a whole interface just for reading default 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constants. Figure out what to do with that more long term; for now, just 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copy the constants themselves here. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default tints. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintButtons = { -1, -1, -1 }; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrame = { -1, -1, -1 }; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameInactive = { -1, -1, 0.75f }; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameIncognito = { -1, 0.2f, 0.35f }; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintFrameIncognitoInactive = { -1, 0.3f, 0.6f }; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const color_utils::HSL kDefaultTintBackgroundTab = { -1, 0.5, 0.75 }; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of images that we provide while in gtk mode. 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// TODO(erg): We list both the normal and *_DESKTOP versions of some of these 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// images because in some contexts, we don't go through the 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// chrome::MapThemeImage interface. That should be fixed, but tracking that 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// down is Hard. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kThemeImages[] = { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TOOLBAR, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND, 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND_DESKTOP, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND_INCOGNITO, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) IDR_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP, 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDR_FRAME, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IDR_FRAME_INACTIVE, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INACTIVE, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INCOGNITO, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_THEME_FRAME_INCOGNITO_INACTIVE, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of icons used in the autocomplete view that should be tinted to the 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current gtk theme selection color so they stand out against the GtkEntry's 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base color. 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(erg): Decide what to do about other icons that appear in the omnibox, 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// e.g. content settings icons. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kAutocompleteImages[] = { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_EXTENSION_APP, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_HTTP, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_HTTP_DARK, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_SEARCH, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_SEARCH_DARK, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_STAR, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_STAR_DARK, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_TTS, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_OMNIBOX_TTS_DARK, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This table converts button ids into a pair of gtk-stock id and state. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IDRGtkMapping { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idr; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* stock_id; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStateType gtk_state; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} const kGtkIcons[] = { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK, GTK_STOCK_GO_BACK, GTK_STATE_NORMAL }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_BACK_D, GTK_STOCK_GO_BACK, GTK_STATE_INSENSITIVE }, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD, GTK_STOCK_GO_FORWARD, GTK_STATE_NORMAL }, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_FORWARD_D, GTK_STOCK_GO_FORWARD, GTK_STATE_INSENSITIVE }, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_HOME, GTK_STOCK_HOME, GTK_STATE_NORMAL }, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_RELOAD, GTK_STOCK_REFRESH, GTK_STATE_NORMAL }, 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { IDR_RELOAD_D, GTK_STOCK_REFRESH, GTK_STATE_INSENSITIVE }, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP, GTK_STOCK_STOP, GTK_STATE_NORMAL }, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { IDR_STOP_D, GTK_STOCK_STOP, GTK_STATE_INSENSITIVE }, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The image resources that will be tinted by the 'button' tint value. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kOtherToolbarButtonIDs[] = { 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_TOOLBAR_BEZEL_HOVER, 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDR_TOOLBAR_BEZEL_PRESSED, 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_BROWSER_ACTIONS_OVERFLOW, 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER, 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER_WAITING, 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_THROBBER_LIGHT, 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(erg): The dropdown arrow should be tinted because we're injecting 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // various background GTK colors, but the code that accesses them needs to be 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // modified so that they ask their ui::ThemeProvider instead of the 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // ResourceBundle. (i.e. in a light on dark theme, the dropdown arrow will be 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // dark on dark) 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IDR_MENU_DROPARROW 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsOverridableImage(int id) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(std::set<int>, images, ()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (images.empty()) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kThemeImages, kThemeImages + arraysize(kThemeImages)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kAutocompleteImages, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAutocompleteImages + arraysize(kAutocompleteImages)); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < arraysize(kGtkIcons); ++i) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kGtkIcons[i].idr); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) images.insert(kOtherToolbarButtonIDs, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOtherToolbarButtonIDs + arraysize(kOtherToolbarButtonIDs)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return images.count(id) > 0; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Picks a button tint from a set of background colors. While 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |accent_gdk_color| will usually be the same color through a theme, this 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function will get called with the normal GtkLabel |text_color|/GtkWindow 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |background_color| pair and the GtkEntry |text_color|/|background_color| 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pair. While 3/4 of the time the resulting tint will be the same, themes that 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have a dark window background (with light text) and a light text entry (with 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dark text) will get better icons with this separated out. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PickButtonTintFromColors(const GdkColor& accent_gdk_color, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor& text_color, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor& background_color, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL* tint) { 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SkColor accent_color = GdkColorToSkColor(accent_gdk_color); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL accent_tint; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(accent_color, &accent_tint); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL text_tint; 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch color_utils::SkColorToHSL(GdkColorToSkColor(text_color), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text_tint); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL background_tint; 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch color_utils::SkColorToHSL(GdkColorToSkColor(background_color), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &background_tint); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the accent color is gray, then our normal HSL tomfoolery will bring out 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whatever color is oddly dominant (for example, in rgb space [125, 128, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 125] will tint green instead of gray). Slight differences (+/-10 (4%) to 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all color components) should be interpreted as this color being gray and 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we should switch into a special grayscale mode. 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int rb_diff = abs(static_cast<int>(SkColorGetR(accent_color)) - 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<int>(SkColorGetB(accent_color))); 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int rg_diff = abs(static_cast<int>(SkColorGetR(accent_color)) - 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<int>(SkColorGetG(accent_color))); 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int bg_diff = abs(static_cast<int>(SkColorGetB(accent_color)) - 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<int>(SkColorGetG(accent_color))); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rb_diff < 10 && rg_diff < 10 && bg_diff < 10) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our accent is white/gray/black. Only the luminance of the accent color 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matters. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->h = -1; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the saturation of the text. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->s = text_tint.s; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use the luminance of the accent color UNLESS there isn't enough 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // luminance contrast between the accent color and the base color. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fabs(accent_tint.l - background_tint.l) > 0.3) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = accent_tint.l; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = text_tint.l; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our accent is a color. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->h = accent_tint.h; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't modify the saturation; the amount of color doesn't matter. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->s = -1; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the text wants us to darken the icon, don't change the luminance (the 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // icons are already dark enough). Otherwise, lighten the icon by no more 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than 0.9 since we don't want a pure-white icon even if the text is pure 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // white. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text_tint.l < 0.5) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = -1; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (text_tint.l <= 0.9) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = text_tint.l; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tint->l = 0.9; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Applies an HSL shift to a GdkColor (instead of an SkColor) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GdkColorHSLShift(const color_utils::HSL& shift, GdkColor* frame_color) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor shifted = color_utils::HSLShift( 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GdkColorToSkColor(*frame_color), shift); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->pixel = 0; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->red = SkColorGetR(shifted) * kSkiaToGDKMultiplier; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->green = SkColorGetG(shifted) * kSkiaToGDKMultiplier; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_color->blue = SkColorGetB(shifted) * kSkiaToGDKMultiplier; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copied Default blah sections from ThemeService. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)color_utils::HSL GetDefaultTint(int id) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME: 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrame; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INACTIVE: 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameInactive; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INCOGNITO: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameIncognito; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintFrameIncognitoInactive; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_BUTTONS: 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintButtons; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ThemeProperties::TINT_BACKGROUND_TAB: 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kDefaultTintBackgroundTab; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL result = {-1, -1, -1}; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Returns a FontRenderParams corresponding to GTK's configuration. 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::FontRenderParams GetGtkFontRenderParams() { 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GtkSettings* gtk_settings = gtk_settings_get_default(); 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK(gtk_settings); 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gint antialias = 0; 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gint hinting = 0; 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gchar* hint_style = NULL; 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gchar* rgba = NULL; 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_object_get(gtk_settings, 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "gtk-xft-antialias", &antialias, 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "gtk-xft-hinting", &hinting, 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "gtk-xft-hintstyle", &hint_style, 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "gtk-xft-rgba", &rgba, 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gfx::FontRenderParams params; 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.antialiasing = antialias != 0; 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (hinting == 0 || !hint_style || strcmp(hint_style, "hintnone") == 0) { 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.hinting = gfx::FontRenderParams::HINTING_NONE; 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(hint_style, "hintslight") == 0) { 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.hinting = gfx::FontRenderParams::HINTING_SLIGHT; 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(hint_style, "hintmedium") == 0) { 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.hinting = gfx::FontRenderParams::HINTING_MEDIUM; 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(hint_style, "hintfull") == 0) { 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.hinting = gfx::FontRenderParams::HINTING_FULL; 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LOG(WARNING) << "Unexpected gtk-xft-hintstyle \"" << hint_style << "\""; 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.hinting = gfx::FontRenderParams::HINTING_NONE; 3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!rgba || strcmp(rgba, "none") == 0) { 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE; 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(rgba, "rgb") == 0) { 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB; 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(rgba, "bgr") == 0) { 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR; 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(rgba, "vrgb") == 0) { 3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB; 3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (strcmp(rgba, "vbgr") == 0) { 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR; 3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LOG(WARNING) << "Unexpected gtk-xft-rgba \"" << rgba << "\""; 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) params.subpixel_rendering = gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE; 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_free(hint_style); 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_free(rgba); 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return params; 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciviews::LinuxUI::NonClientMiddleClickAction GetDefaultMiddleClickAction() { 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::Environment> env(base::Environment::Create()); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (base::nix::GetDesktopEnvironment(env.get())) { 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case base::nix::DESKTOP_ENVIRONMENT_KDE4: 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Starting with KDE 4.4, windows' titlebars can be dragged with the 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // middle mouse button to create tab groups. We don't support that in 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Chrome, but at least avoid lowering windows in response to middle 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // clicks to avoid surprising users who expect the KDE behavior. 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return views::LinuxUI::MIDDLE_CLICK_ACTION_NONE; 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return views::LinuxUI::MIDDLE_CLICK_ACTION_LOWER; 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGtk2UI::Gtk2UI() : middle_click_action_(GetDefaultMiddleClickAction()) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); 4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void Gtk2UI::Initialize() { 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signals_.reset(new Gtk2SignalRegistrar); 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create our fake widgets. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_frame_ = chrome_gtk_frame_new(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_label_.Own(gtk_label_new("")); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_entry_.Own(gtk_entry_new()); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only realized widgets receive style-set notifications, which we need to 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // broadcast new theme images and colors. Only realized widgets have style 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properties, too, which we query for some colors. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(fake_frame_); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(fake_window_); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) signals_->Connect(fake_frame_, "style-set", 418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) G_CALLBACK(&OnStyleSetThunk), this); 419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadGtkValues(); 421ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printing::PrintingContextLinux::SetCreatePrintDialogFunction( 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &PrintDialogGtk2::CreatePrintDialog); 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) printing::PrintingContextLinux::SetPdfPaperSizeFunction( 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &GetPdfPaperSizeDeviceUnitsGtk); 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_GCONF) 428d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // We must build this after GTK gets initialized. 429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gconf_listener_.reset(new GConfListener(this)); 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // defined(USE_GCONF) 431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 432ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch indicators_count = 0; 433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Instantiate the singleton instance of Gtk2EventLoop. 435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Gtk2EventLoop::GetInstance(); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Gtk2UI::~Gtk2UI() { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(fake_window_); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(fake_frame_); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_label_.Destroy(); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_entry_.Destroy(); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearAllThemeData(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Image Gtk2UI::GetThemeImageNamed(int id) const { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to get our cached version: 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageCache::const_iterator it = gtk_images_.find(id); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != gtk_images_.end()) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it->second; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (IsOverridableImage(id)) { 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image = gfx::Image( 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia::CreateFrom1xBitmap(GenerateGtkThemeBitmap(id))); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_images_[id] = image; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return image; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return gfx::Image(); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Gtk2UI::GetColor(int id, SkColor* color) const { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorMap::const_iterator it = colors_.find(id); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != colors_.end()) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *color = it->second; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Gtk2UI::HasCustomImage(int id) const { 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return IsOverridableImage(id); 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetFocusRingColor() const { 47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return focus_ring_color_; 47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetThumbActiveColor() const { 48268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return thumb_active_color_; 48368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 48468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 48568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetThumbInactiveColor() const { 48668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return thumb_inactive_color_; 48768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 48868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 48968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetTrackColor() const { 49068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return track_color_; 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 49368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetActiveSelectionBgColor() const { 49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return active_selection_bg_color_; 49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 49768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetActiveSelectionFgColor() const { 49868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return active_selection_fg_color_; 49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetInactiveSelectionBgColor() const { 50268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return inactive_selection_bg_color_; 50368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 50468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)SkColor Gtk2UI::GetInactiveSelectionFgColor() const { 50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return inactive_selection_fg_color_; 50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 50868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 50968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)double Gtk2UI::GetCursorBlinkInterval() const { 51068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // From http://library.gnome.org/devel/gtk/unstable/GtkSettings.html, this is 51168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the default value for gtk-cursor-blink-time. 51268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static const gint kGtkDefaultCursorBlinkTime = 1200; 51368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 51468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Dividing GTK's cursor blink cycle time (in milliseconds) by this value 51568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // yields an appropriate value for 51668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // content::RendererPreferences::caret_blink_interval. This matches the 51768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // logic in the WebKit GTK port. 51868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static const double kGtkCursorBlinkCycleFactor = 2000.0; 51968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 52068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gint cursor_blink_time = kGtkDefaultCursorBlinkTime; 52168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gboolean cursor_blink = TRUE; 52268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_object_get(gtk_settings_get_default(), 52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "gtk-cursor-blink-time", &cursor_blink_time, 52468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) "gtk-cursor-blink", &cursor_blink, 52568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NULL); 52668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return cursor_blink ? (cursor_blink_time / kGtkCursorBlinkCycleFactor) : 0.0; 52768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 52868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuui::NativeTheme* Gtk2UI::GetNativeTheme(aura::Window* window) const { 5305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui::NativeTheme* native_theme_override = NULL; 5315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!native_theme_overrider_.is_null()) 5325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_theme_override = native_theme_overrider_.Run(window); 5335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (native_theme_override) 5355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return native_theme_override; 5365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return NativeThemeGtk2::instance(); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid Gtk2UI::SetNativeThemeOverride(const NativeThemeGetter& callback) { 5415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_theme_overrider_ = callback; 5425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 5435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochbool Gtk2UI::GetDefaultUsesSystemTheme() const { 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<base::Environment> env(base::Environment::Create()); 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switch (base::nix::GetDesktopEnvironment(env.get())) { 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_GNOME: 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_UNITY: 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_XFCE: 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return true; 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_KDE3: 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_KDE4: 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch case base::nix::DESKTOP_ENVIRONMENT_OTHER: 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Unless GetDesktopEnvironment() badly misbehaves, this should never happen. 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Gtk2UI::SetDownloadCount(int count) const { 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (unity::IsRunning()) 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unity::SetDownloadCount(count); 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Gtk2UI::SetProgressFraction(float percentage) const { 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (unity::IsRunning()) 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch unity::SetProgressFraction(percentage); 570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 572ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool Gtk2UI::IsStatusIconSupported() const { 57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 574ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 575ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<views::StatusIconLinux> Gtk2UI::CreateLinuxStatusIcon( 577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const gfx::ImageSkia& image, 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& tool_tip) const { 579ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (AppIndicatorIcon::CouldOpen()) { 580ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ++indicators_count; 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return scoped_ptr<views::StatusIconLinux>(new AppIndicatorIcon( 582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringPrintf("%s%d", kAppIndicatorIdPrefix, indicators_count), 583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) image, 584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) tool_tip)); 585ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } else { 58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return scoped_ptr<views::StatusIconLinux>(new Gtk2StatusIcon( 58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) image, tool_tip)); 588ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 589ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Image Gtk2UI::GetIconForContentType( 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& content_type, 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int size) const { 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This call doesn't take a reference. 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GtkIconTheme* theme = gtk_icon_theme_get_default(); 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 597effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string content_types[] = { 598effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch content_type, kUnknownContentType 599effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch }; 600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch for (size_t i = 0; i < arraysize(content_types); ++i) { 602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ScopedGIcon icon(g_content_type_get_icon(content_types[i].c_str())); 603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ScopedGtkIconInfo icon_info( 604effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gtk_icon_theme_lookup_by_gicon( 605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch theme, icon.get(), size, 606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch static_cast<GtkIconLookupFlags>(GTK_ICON_LOOKUP_FORCE_SIZE))); 607effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!icon_info) 608effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch continue; 609effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ScopedGdkPixbuf pixbuf(gtk_icon_info_load_icon(icon_info.get(), NULL)); 610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!pixbuf) 611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch continue; 612effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 613effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SkBitmap bitmap = GdkPixbufToImageSkia(pixbuf.get()); 614effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_EQ(size, bitmap.width()); 615effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK_EQ(size, bitmap.height()); 616effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); 617effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch image_skia.MakeThreadSafe(); 618effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return gfx::Image(image_skia); 619effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 620effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return gfx::Image(); 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<views::Border> Gtk2UI::CreateNativeBorder( 6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) views::LabelButton* owning_button, 625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<views::LabelButtonBorder> border) { 6265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (owning_button->GetNativeTheme() != NativeThemeGtk2::instance()) 627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return border.PassAs<views::Border>(); 6285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<views::Border>( 630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new Gtk2Border(this, owning_button, border.Pass())); 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 633d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void Gtk2UI::AddWindowButtonOrderObserver( 634d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::WindowButtonOrderObserver* observer) { 635d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!leading_buttons_.empty() || !trailing_buttons_.empty()) { 636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observer->OnWindowButtonOrderingChange(leading_buttons_, 637d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trailing_buttons_); 638d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 639d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 640d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observer_list_.AddObserver(observer); 641d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 642d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void Gtk2UI::RemoveWindowButtonOrderObserver( 644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) views::WindowButtonOrderObserver* observer) { 645d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) observer_list_.RemoveObserver(observer); 646d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 647d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 648d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void Gtk2UI::SetWindowButtonOrdering( 649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<views::FrameButton>& leading_buttons, 650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::vector<views::FrameButton>& trailing_buttons) { 651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) leading_buttons_ = leading_buttons; 652d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trailing_buttons_ = trailing_buttons; 653d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 654d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FOR_EACH_OBSERVER(views::WindowButtonOrderObserver, observer_list_, 655d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) OnWindowButtonOrderingChange(leading_buttons_, 656d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) trailing_buttons_)); 657d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 659c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid Gtk2UI::SetNonClientMiddleClickAction(NonClientMiddleClickAction action) { 660c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch middle_click_action_ = action; 661c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 662c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 6631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)scoped_ptr<ui::LinuxInputMethodContext> Gtk2UI::CreateInputMethodContext( 6641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ui::LinuxInputMethodContextDelegate* delegate) const { 6651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return scoped_ptr<ui::LinuxInputMethodContext>( 6661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new X11InputMethodContextImplGtk2(delegate)); 6671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 6681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 6695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)gfx::FontRenderParams Gtk2UI::GetDefaultFontRenderParams() const { 6705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static gfx::FontRenderParams params = GetGtkFontRenderParams(); 6715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return params; 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<gfx::ScopedPangoFontDescription> 6755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Gtk2UI::GetDefaultPangoFontDescription() const { 6765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scoped_ptr<gfx::ScopedPangoFontDescription>( 6775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new gfx::ScopedPangoFontDescription( 6785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pango_font_description_copy(default_font_description_->get()))); 6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)double Gtk2UI::GetFontDPI() const { 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GtkSettings* gtk_settings = gtk_settings_get_default(); 6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CHECK(gtk_settings); 6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) gint dpi = -1; 6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_object_get(gtk_settings, "gtk-xft-dpi", &dpi, NULL); 6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // GTK multiplies the DPI by 1024 before storing it. 6885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return (dpi > 0) ? dpi / 1024.0 : dpi; 6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SelectFileDialog* Gtk2UI::CreateSelectFileDialog( 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFileDialog::Listener* listener, 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::SelectFilePolicy* policy) const { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SelectFileDialogImpl::Create(listener, policy); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool Gtk2UI::UnityIsRunning() { 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return unity::IsRunning(); 699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 701c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochviews::LinuxUI::NonClientMiddleClickAction 702c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochGtk2UI::GetNonClientMiddleClickAction() { 703c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return middle_click_action_; 704c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 705c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Gtk2UI::NotifyWindowManagerStartupComplete() { 7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(port) Implement this using _NET_STARTUP_INFO_BEGIN/_NET_STARTUP_INFO 7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // from http://standards.freedesktop.org/startup-notification-spec/ instead. 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gdk_notify_startup_complete(); 7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 712e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool Gtk2UI::MatchEvent(const ui::Event& event, 713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::vector<ui::TextEditCommandAuraLinux>* commands) { 714e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Ensure that we have a keyboard handler. 715e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!key_bindings_handler_) 716e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch key_bindings_handler_.reset(new Gtk2KeyBindingsHandler); 717e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 718e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return key_bindings_handler_->MatchEvent(event, commands); 719e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 720e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetScrollbarColors(GdkColor* thumb_active_color, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* thumb_inactive_color, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* track_color) { 724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GdkColor* theme_thumb_active = NULL; 725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GdkColor* theme_thumb_inactive = NULL; 726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GdkColor* theme_trough_color = NULL; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-slider-prelight-color", &theme_thumb_active, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-slider-normal-color", &theme_thumb_inactive, 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "scrollbar-trough-color", &theme_trough_color, 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask the theme if the theme specifies all the scrollbar colors and short 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // circuit the expensive painting/compositing if we have all of them. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_thumb_active && theme_thumb_inactive && theme_trough_color) { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_active_color = *theme_thumb_active; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_inactive_color = *theme_thumb_inactive; 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *track_color = *theme_trough_color; 739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_thumb_active); 741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_thumb_inactive); 742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_trough_color); 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create window containing scrollbar elements 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* fixed = gtk_fixed_new(); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* scrollbar = gtk_hscrollbar_new(NULL); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(window), fixed); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(fixed), scrollbar); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(window); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(scrollbar); 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw scrollbar thumb part and track into offscreen image 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kWidth = 100; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kHeight = 20; 758f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(scrollbar); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkWindow* gdk_window = gtk_widget_get_window(window); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixmap* pm = gdk_pixmap_new(gdk_window, kWidth, kHeight, -1); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkRectangle rect = { 0, 0, kWidth, kHeight }; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char data[3 * kWidth * kHeight]; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 3; ++i) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i < 2) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thumb part 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_paint_slider(style, pm, 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i == 0 ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_SHADOW_OUT, &rect, scrollbar, "slider", 0, 0, 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWidth, kHeight, GTK_ORIENTATION_HORIZONTAL); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Track 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_paint_box(style, pm, GTK_STATE_ACTIVE, GTK_SHADOW_IN, &rect, 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scrollbar, "trough-upper", 0, 0, kWidth, kHeight); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* pb = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FALSE, 8, kWidth, kHeight, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3 * kWidth, 0, 0); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_pixbuf_get_from_drawable(pb, pm, NULL, 0, 0, 0, 0, kWidth, kHeight); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample pixels 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int components[3] = { 0 }; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int y = 2; y < kHeight - 2; ++y) { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int c = 0; c < 3; ++c) { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample a vertical slice of pixels at about one-thirds from the 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // left edge. This allows us to avoid any fixed graphics that might be 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // located at the edges or in the center of the scrollbar. 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each pixel is made up of a red, green, and blue component; taking up 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a total of three bytes. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) components[c] += data[3 * (kWidth / 3 + y * kWidth) + c]; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* color = i == 0 ? thumb_active_color : 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i == 1 ? thumb_inactive_color : 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_color; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->pixel = 0; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We sampled pixels across the full height of the image, ignoring a two 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pixel border. In some themes, the border has a completely different 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // color which we do not want to factor into our average color computation. 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We now need to scale the colors from the 0..255 range, to the wider 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0..65535 range, and we need to actually compute the average color; so, 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we divide by the total number of pixels in the sample. 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->red = components[0] * 65535 / (255 * (kHeight - 4)); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->green = components[1] * 65535 / (255 * (kHeight - 4)); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color->blue = components[2] * 65535 / (255 * (kHeight - 4)); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pb); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pm); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(window); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override any of the default colors with ones that were specified by the 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // theme. 815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (theme_thumb_active) { 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_active_color = *theme_thumb_active; 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_thumb_active); 818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (theme_thumb_inactive) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *thumb_inactive_color = *theme_thumb_inactive; 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_thumb_inactive); 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (theme_trough_color) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *track_color = *theme_trough_color; 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gdk_color_free(theme_trough_color); 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::LoadGtkValues() { 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(erg): GtkThemeService had a comment here about having to muck with 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the raw Prefs object to remove prefs::kCurrentThemeImages or else we'd 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // regress startup time. Figure out how to do that when we can't access the 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prefs system from here. 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* frame_style = gtk_rc_get_style(fake_frame_); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_CONTROL_BACKGROUND, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &window_style->bg[GTK_STATE_NORMAL]); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor toolbar_color = window_style->bg[GTK_STATE_NORMAL]; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_TOOLBAR, &toolbar_color); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor button_color = window_style->bg[GTK_STATE_SELECTED]; 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeTintFromGtk(ThemeProperties::TINT_BUTTONS, &button_color); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* label_style = gtk_rc_get_style(fake_label_.get()); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor label_color = label_style->fg[GTK_STATE_NORMAL]; 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_TAB_TEXT, &label_color); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_BOOKMARK_TEXT, &label_color); 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_STATUS_BAR_TEXT, &label_color); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) default_font_description_.reset(new gfx::ScopedPangoFontDescription( 8565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pango_font_description_copy(label_style->font_desc))); 857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Build the various icon tints. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNormalButtonTintHSL(&button_tint_); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNormalEntryForegroundHSL(&entry_tint_); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetSelectedEntryForegroundHSL(&selected_entry_tint_); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor frame_color = BuildFrameColors(frame_style); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The inactive frame color never occurs naturally in the theme, as it is a 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tinted version of |frame_color|. We generate another color based on the 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // background tab color, with the lightness and saturation moved in the 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // opposite direction. (We don't touch the hue, since there should be subtle 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hints of the color in the text.) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL inactive_tab_text_hsl = 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tints_[ThemeProperties::TINT_BACKGROUND_TAB]; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inactive_tab_text_hsl.l < 0.5) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.l = kDarkInactiveLuminance; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.l = kLightInactiveLuminance; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inactive_tab_text_hsl.s < 0.5) 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.s = kHeavyInactiveSaturation; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_tab_text_hsl.s = kLightInactiveSaturation; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) colors_[ThemeProperties::COLOR_BACKGROUND_TAB_TEXT] = 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSLToSkColor(inactive_tab_text_hsl, 255); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We pick the text and background colors for the NTP out of the colors for a 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GtkEntry. We do this because GtkEntries background color is never the same 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as |toolbar_color|, is usually a white, and when it isn't a white, 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provides sufficient contrast to |toolbar_color|. Try this out with 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Darklooks, HighContrastInverse or ThinIce. 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* entry_style = gtk_rc_get_style(fake_entry_.get()); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor ntp_background = entry_style->base[GTK_STATE_NORMAL]; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor ntp_foreground = entry_style->text[GTK_STATE_NORMAL]; 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_BACKGROUND, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ntp_background); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_TEXT, 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ntp_foreground); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The NTP header is the color that surrounds the current active thumbnail on 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the NTP, and acts as the border of the "Recent Links" box. It would be 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // awesome if they were separated so we could use GetBorderColor() for the 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // border around the "Recent Links" section, but matching the frame color is 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // more important. 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_HEADER, 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION, 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &toolbar_color); 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_TEXT, 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &label_color); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override the link color if the theme provides it. 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* link_color = NULL; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_window_), 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "link-color", &link_color, NULL); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_default_link_color = false; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!link_color) { 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color = &kDefaultLinkColor; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_default_link_color = true; 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_LINK, 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_LINK_UNDERLINE, 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_LINK, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeColorFromGtk(ThemeProperties::COLOR_NTP_SECTION_LINK_UNDERLINE, 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link_color); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_default_link_color) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(const_cast<GdkColor*>(link_color)); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Generate the colors that we pass to WebKit. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_ring_color_ = GdkColorToSkColor(frame_color); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor thumb_active_color, thumb_inactive_color, track_color; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Gtk2UI::GetScrollbarColors(&thumb_active_color, 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &thumb_inactive_color, 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &track_color); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumb_active_color_ = GdkColorToSkColor(thumb_active_color); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) thumb_inactive_color_ = GdkColorToSkColor(thumb_inactive_color); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) track_color_ = GdkColorToSkColor(track_color); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Some GTK themes only define the text selection colors on the GtkEntry 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // class, so we need to use that for getting selection colors. 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_selection_bg_color_ = 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->base[GTK_STATE_SELECTED]); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_selection_fg_color_ = 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->text[GTK_STATE_SELECTED]); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_selection_bg_color_ = 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->base[GTK_STATE_ACTIVE]); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inactive_selection_fg_color_ = 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(entry_style->text[GTK_STATE_ACTIVE]); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GdkColor Gtk2UI::BuildFrameColors(GtkStyle* frame_style) { 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_frame = NULL; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_inactive_frame = NULL; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_incognito_frame = NULL; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* theme_incognito_inactive_frame = NULL; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-color", &theme_frame, 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "inactive-frame-color", &theme_inactive_frame, 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-frame-color", &theme_incognito_frame, 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-inactive-frame-color", 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &theme_incognito_inactive_frame, 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor frame_color = BuildAndSetFrameColor( 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_style->bg[GTK_STATE_SELECTED], 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_frame, 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultFrameShift, 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME, 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_frame) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_frame); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetThemeTintFromGtk(ThemeProperties::TINT_BACKGROUND_TAB, &frame_color); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_style->bg[GTK_STATE_INSENSITIVE], 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_inactive_frame, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDefaultFrameShift, 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INACTIVE, 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INACTIVE); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_inactive_frame) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_inactive_frame); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color, 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_incognito_frame, 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO), 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO, 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_incognito_frame) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_incognito_frame); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildAndSetFrameColor( 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &frame_color, 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) theme_incognito_inactive_frame, 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultTint(ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE), 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE, 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::TINT_FRAME_INCOGNITO_INACTIVE); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (theme_incognito_inactive_frame) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(theme_incognito_inactive_frame); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_color; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::SetThemeColorFromGtk(int id, const GdkColor* color) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colors_[id] = GdkColorToSkColor(*color); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::SetThemeTintFromGtk(int id, const GdkColor* color) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL default_tint = GetDefaultTint(id); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSL hsl; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(GdkColorToSkColor(*color), &hsl); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_tint.s != -1) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.s = default_tint.s; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (default_tint.l != -1) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hsl.l = default_tint.l; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tints_[id] = hsl; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GdkColor Gtk2UI::BuildAndSetFrameColor(const GdkColor* base, 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor* gtk_base, 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& tint, 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int color_id, 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tint_id) { 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor out_color = *base; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gtk_base) { 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The theme author specified a color to use, use it without modification. 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) out_color = *gtk_base; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tint the basic color since this is a heuristic color instead of one 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified by the theme author. 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorHSLShift(tint, &out_color); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetThemeColorFromGtk(color_id, &out_color); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetThemeTintFromGtk(tint_id, &out_color); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out_color; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateGtkThemeBitmap(int id) const { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (id) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TOOLBAR: { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_window_); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* color = &style->bg[GTK_STATE_NORMAL]; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bitmap; 1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bitmap.allocN32Pixels(kToolbarImageWidth, kToolbarImageHeight); 1053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bitmap.eraseARGB(0xff, color->red >> 8, color->green >> 8, 1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) color->blue >> 8); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitmap; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND: 1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND_DESKTOP: 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTabImage(IDR_THEME_FRAME); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND_INCOGNITO: 1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case IDR_THEME_TAB_BACKGROUND_INCOGNITO_DESKTOP: 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTabImage(IDR_THEME_FRAME_INCOGNITO); 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDR_FRAME: 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME: 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME, 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-gradient-color"); 10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDR_FRAME_INACTIVE: 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INACTIVE: 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME_INACTIVE, 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "inactive-frame-gradient-color"); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INCOGNITO: 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GenerateFrameImage(ThemeProperties::COLOR_FRAME_INCOGNITO, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-frame-gradient-color"); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_THEME_FRAME_INCOGNITO_INACTIVE: { 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateFrameImage( 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE, 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "incognito-inactive-frame-gradient-color"); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Icons that sit inside the omnibox shouldn't receive TINT_BUTTONS and 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instead should tint based on the foreground text entry color in GTK+ 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode because some themes that try to be dark *and* light have very 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // different colors between the omnibox and the normal background area. 10837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(erg): Decide what to do about other icons that appear in the 10847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // omnibox, e.g. content settings icons. 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_EXTENSION_APP: 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_HTTP: 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_SEARCH: 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_STAR: 10897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) case IDR_OMNIBOX_TTS: { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, entry_tint_); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In GTK mode, the dark versions of the omnibox icons only ever appear in 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the autocomplete popup and only against the current theme's GtkEntry 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base[GTK_STATE_SELECTED] color, so tint the icons so they won't collide 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the selected color. 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_EXTENSION_APP_DARK: 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_HTTP_DARK: 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_SEARCH_DARK: 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_STAR_DARK: 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_OMNIBOX_TTS_DARK: { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, selected_entry_tint_); 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In GTK mode, we need to manually render several icons. 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK: 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_BACK_D: 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD: 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_FORWARD_D: 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_HOME: 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_RELOAD: 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case IDR_RELOAD_D: 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDR_STOP: 1112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case IDR_STOP_D: { 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateGTKIcon(id); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_TOOLBAR_BEZEL_HOVER: 11167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_PRELIGHT, IDR_TOOLBAR_BEZEL_HOVER); 11177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case IDR_TOOLBAR_BEZEL_PRESSED: 11187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return GenerateToolbarBezel(GTK_STATE_ACTIVE, IDR_TOOLBAR_BEZEL_PRESSED); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateTintedIcon(id, button_tint_); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmap(); 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateFrameImage( 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int color_id, 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* gradient_name) const { 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use two colors: the main color (passed in) and a lightened version of 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that color (which is supposed to match the light gradient at the top of 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // several GTK+ themes, such as Ambiance, Clearlooks or Bluebird). 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorMap::const_iterator it = colors_.find(color_id); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(it != colors_.end()); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor base = it->second; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Canvas canvas(gfx::Size(kToolbarImageWidth, kToolbarImageHeight), 113868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1.0f, true); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int gradient_size; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColor* gradient_top_color = NULL; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_style_get(GTK_WIDGET(fake_frame_), 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "frame-gradient-size", &gradient_size, 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gradient_name, &gradient_top_color, 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gradient_size) { 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor lighter = gradient_top_color ? 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColorToSkColor(*gradient_top_color) : 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::HSLShift(base, kGtkFrameShift); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gradient_top_color) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_color_free(gradient_top_color); 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::RefPtr<SkShader> shader = gfx::CreateGradientShader( 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, gradient_size, lighter, base); 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPaint paint; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setStyle(SkPaint::kFill_Style); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setAntiAlias(true); 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setShader(shader.get()); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.DrawRect(gfx::Rect(0, 0, kToolbarImageWidth, gradient_size), paint); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.FillRect(gfx::Rect(0, gradient_size, kToolbarImageWidth, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kToolbarImageHeight - gradient_size), base); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return canvas.ExtractImageRep().sk_bitmap(); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateTabImage(int base_id) const { 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SkBitmap* base_image = GetThemeImageNamed(base_id).ToSkBitmap(); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap bg_tint = SkBitmapOperations::CreateHSLShiftedBitmap( 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *base_image, GetDefaultTint(ThemeProperties::TINT_BACKGROUND_TAB)); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmapOperations::CreateTiledBitmap( 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bg_tint, 0, 0, bg_tint.width(), bg_tint.height()); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateTintedIcon( 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int base_id, 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const color_utils::HSL& tint) const { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SkBitmapOperations::CreateHSLShiftedBitmap( 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb.GetImageNamed(base_id).AsBitmap(), tint); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::GenerateGTKIcon(int base_id) const { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* stock_id = NULL; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStateType gtk_state = GTK_STATE_NORMAL; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < arraysize(kGtkIcons); ++i) { 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kGtkIcons[i].idr == base_id) { 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stock_id = kGtkIcons[i].stock_id; 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_state = kGtkIcons[i].gtk_state; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(stock_id); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap default_bitmap = rb.GetImageNamed(base_id).AsBitmap(); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_ensure_style(fake_frame_); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_widget_get_style(fake_frame_); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkIconSet* icon_set = gtk_style_lookup_icon_set(style, stock_id); 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!icon_set) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_bitmap; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask GTK to render the icon to a buffer, which we will steal from. 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* gdk_icon = gtk_icon_set_render_icon( 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_set, 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style, 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::IsRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR, 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_state, 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GTK_ICON_SIZE_SMALL_TOOLBAR, 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_frame_, 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gdk_icon) { 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This can theoretically happen if an icon theme doesn't provide a 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific image. This should realistically never happen, but I bet there 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are some theme authors who don't reliably provide all icons. 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return default_bitmap; 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap retval; 1222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch retval.allocN32Pixels(default_bitmap.width(), default_bitmap.height()); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.eraseColor(0); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap icon = GdkPixbufToImageSkia(gdk_icon); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(gdk_icon); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas(retval); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gtk_state == GTK_STATE_ACTIVE || gtk_state == GTK_STATE_PRELIGHT) { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = DrawGtkButtonBorder(gtk_state, 12325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 1233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(border, 0, 0); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(icon, 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (default_bitmap.width() / 2) - (icon.width() / 2), 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (default_bitmap.height() / 2) - (icon.height() / 2)); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12467dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSkBitmap Gtk2UI::GenerateToolbarBezel(int gtk_state, int sizing_idr) const { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 12487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SkBitmap default_bitmap = 12497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch rb.GetImageNamed(sizing_idr).AsBitmap(); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap retval; 1252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch retval.allocN32Pixels(default_bitmap.width(), default_bitmap.height()); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) retval.eraseColor(0); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkCanvas canvas(retval); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = DrawGtkButtonBorder( 12577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch gtk_state, 12585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 1259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch false, 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.width(), 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default_bitmap.height()); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas.drawBitmap(border, 0, 0); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return retval; 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetNormalButtonTintHSL(color_utils::HSL* tint) const { 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor accent_gdk_color = window_style->bg[GTK_STATE_SELECTED]; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor base_color = window_style->base[GTK_STATE_NORMAL]; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* label_style = gtk_rc_get_style(fake_label_.get()); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor text_color = label_style->fg[GTK_STATE_NORMAL]; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickButtonTintFromColors(accent_gdk_color, text_color, base_color, tint); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetNormalEntryForegroundHSL(color_utils::HSL* tint) const { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* window_style = gtk_rc_get_style(fake_window_); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor accent_gdk_color = window_style->bg[GTK_STATE_SELECTED]; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_entry_.get()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor text_color = style->text[GTK_STATE_NORMAL]; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor base_color = style->base[GTK_STATE_NORMAL]; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickButtonTintFromColors(accent_gdk_color, text_color, base_color, tint); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::GetSelectedEntryForegroundHSL(color_utils::HSL* tint) const { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The simplest of all the tints. We just use the selected text in the entry 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since the icons tinted this way will only be displayed against 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base[GTK_STATE_SELECTED]. 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkStyle* style = gtk_rc_get_style(fake_entry_.get()); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GdkColor color = style->text[GTK_STATE_SELECTED]; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color_utils::SkColorToHSL(GdkColorToSkColor(color), tint); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SkBitmap Gtk2UI::DrawGtkButtonBorder(int gtk_state, 12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool focused, 1300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool call_to_action, 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int width, 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int height) const { 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a temporary GTK button to snapshot 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* window = gtk_offscreen_window_new(); 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GtkWidget* button = gtk_button_new(); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_size_request(button, width, height); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_container_add(GTK_CONTAINER(window), button); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(window); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_realize(button); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_show(button); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_show(window); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (call_to_action) 1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GTK_WIDGET_SET_FLAGS(button, GTK_HAS_DEFAULT); 1315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (focused) { 13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We can't just use gtk_widget_grab_focus() here because that sets 13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // gtk_widget_is_focus(), but not gtk_widget_has_focus(), which is what the 13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GtkButton's paint checks. 13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GTK_WIDGET_SET_FLAGS(button, GTK_HAS_FOCUS); 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_set_state(button, static_cast<GtkStateType>(gtk_state)); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GdkPixmap* pixmap; 1326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 1327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // http://crbug.com/346740 1328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ANNOTATE_SCOPED_MEMORY_LEAK; 1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pixmap = gtk_widget_get_snapshot(button, NULL); 1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int w, h; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(w, width); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(h, height); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We render the Pixmap to a Pixbuf. This can be slow, as we're scrapping 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bits from X. 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkColormap* colormap = gdk_drawable_get_colormap(pixmap); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(NULL, 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDK_DRAWABLE(pixmap), 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colormap, 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 0, w, h); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally, we convert our pixbuf into a type we can use. 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap border = GdkPixbufToImageSkia(pixbuf); 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pixbuf); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_object_unref(pixmap); 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gtk_widget_destroy(window); 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return border; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Gtk2UI::ClearAllThemeData() { 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gtk_images_.clear(); 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Gtk2UI::OnStyleSet(GtkWidget* widget, GtkStyle* previous_style) { 1358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ClearAllThemeData(); 1359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LoadGtkValues(); 1360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NativeThemeGtk2::instance()->NotifyObservers(); 1361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace libgtk2ui 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)views::LinuxUI* BuildGtk2UI() { 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new libgtk2ui::Gtk2UI; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1368