blob: cd0918a76020f2c9e5ab459943e8f06bbf1b7a97 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_LIBGTK2UI_GTK2_UI_H_
#define CHROME_BROWSER_UI_LIBGTK2UI_GTK2_UI_H_
#include <map>
#include <vector>
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
#include "chrome/browser/ui/libgtk2ui/gtk2_signal_registrar.h"
#include "chrome/browser/ui/libgtk2ui/libgtk2ui_export.h"
#include "chrome/browser/ui/libgtk2ui/owned_widget_gtk2.h"
#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
#include "ui/gfx/color_utils.h"
#include "ui/views/linux_ui/linux_ui.h"
#include "ui/views/window/frame_buttons.h"
typedef struct _GdkColor GdkColor;
typedef struct _GtkBorder GtkBorder;
typedef struct _GtkStyle GtkStyle;
typedef struct _GtkWidget GtkWidget;
typedef struct _PangoFontDescription PangoFontDescription;
class SkBitmap;
namespace gfx {
class Image;
}
namespace libgtk2ui {
class Gtk2Border;
class Gtk2KeyBindingsHandler;
class Gtk2SignalRegistrar;
class GConfListener;
// Interface to GTK2 desktop features.
//
class Gtk2UI : public views::LinuxUI {
public:
Gtk2UI();
~Gtk2UI() override;
typedef base::Callback<ui::NativeTheme*(aura::Window* window)>
NativeThemeGetter;
// Setters used by GConfListener:
void SetWindowButtonOrdering(
const std::vector<views::FrameButton>& leading_buttons,
const std::vector<views::FrameButton>& trailing_buttons);
void SetNonClientMiddleClickAction(NonClientMiddleClickAction action);
// Draws the GTK button border for state |gtk_state| onto a bitmap.
SkBitmap DrawGtkButtonBorder(int gtk_state,
bool focused,
bool call_to_action,
int width,
int height) const;
// ui::LinuxInputMethodContextFactory:
scoped_ptr<ui::LinuxInputMethodContext> CreateInputMethodContext(
ui::LinuxInputMethodContextDelegate* delegate) const override;
// gfx::LinuxFontDelegate:
gfx::FontRenderParams GetDefaultFontRenderParams() const override;
void GetDefaultFontDescription(
std::string* family_out,
int* size_pixels_out,
int* style_out,
gfx::FontRenderParams* params_out) const override;
// ui::LinuxShellDialog:
ui::SelectFileDialog* CreateSelectFileDialog(
ui::SelectFileDialog::Listener* listener,
ui::SelectFilePolicy* policy) const override;
// ui::LinuxUI:
void Initialize() override;
gfx::Image GetThemeImageNamed(int id) const override;
bool GetColor(int id, SkColor* color) const override;
bool HasCustomImage(int id) const override;
SkColor GetFocusRingColor() const override;
SkColor GetThumbActiveColor() const override;
SkColor GetThumbInactiveColor() const override;
SkColor GetTrackColor() const override;
SkColor GetActiveSelectionBgColor() const override;
SkColor GetActiveSelectionFgColor() const override;
SkColor GetInactiveSelectionBgColor() const override;
SkColor GetInactiveSelectionFgColor() const override;
double GetCursorBlinkInterval() const override;
ui::NativeTheme* GetNativeTheme(aura::Window* window) const override;
void SetNativeThemeOverride(const NativeThemeGetter& callback) override;
bool GetDefaultUsesSystemTheme() const override;
void SetDownloadCount(int count) const override;
void SetProgressFraction(float percentage) const override;
bool IsStatusIconSupported() const override;
scoped_ptr<views::StatusIconLinux> CreateLinuxStatusIcon(
const gfx::ImageSkia& image,
const base::string16& tool_tip) const override;
gfx::Image GetIconForContentType(const std::string& content_type,
int size) const override;
scoped_ptr<views::Border> CreateNativeBorder(
views::LabelButton* owning_button,
scoped_ptr<views::LabelButtonBorder> border) override;
void AddWindowButtonOrderObserver(
views::WindowButtonOrderObserver* observer) override;
void RemoveWindowButtonOrderObserver(
views::WindowButtonOrderObserver* observer) override;
bool UnityIsRunning() override;
NonClientMiddleClickAction GetNonClientMiddleClickAction() override;
void NotifyWindowManagerStartupComplete() override;
// ui::TextEditKeybindingDelegate:
bool MatchEvent(const ui::Event& event,
std::vector<ui::TextEditCommandAuraLinux>* commands) override;
// ui::Views::LinuxUI:
void UpdateDeviceScaleFactor(float device_scale_factor) override;
float GetDeviceScaleFactor() const override;
private:
typedef std::map<int, SkColor> ColorMap;
typedef std::map<int, color_utils::HSL> TintMap;
typedef std::map<int, gfx::Image> ImageCache;
// This method returns the colors webkit will use for the scrollbars. When no
// colors are specified by the GTK+ theme, this function averages of the
// thumb part and of the track colors.
void GetScrollbarColors(GdkColor* thumb_active_color,
GdkColor* thumb_inactive_color,
GdkColor* track_color);
// Extracts colors and tints from the GTK theme, both for the
// ThemeService interface and the colors we send to webkit.
void LoadGtkValues();
// Reads in explicit theme frame colors from the ChromeGtkFrame style class
// or generates them per our fallback algorithm.
GdkColor BuildFrameColors(GtkStyle* frame_style);
// Sets the underlying theme colors/tints from a GTK color.
void SetThemeColorFromGtk(int id, const GdkColor* color);
void SetThemeTintFromGtk(int id, const GdkColor* color);
// Creates and returns a frame color, either using |gtk_base| verbatim if
// non-NULL, or tinting |base| with |tint|. Also sets |color_id| and
// |tint_id| to the returned color.
GdkColor BuildAndSetFrameColor(const GdkColor* base,
const GdkColor* gtk_base,
const color_utils::HSL& tint,
int color_id,
int tint_id);
// Lazily generates each bitmap used in the gtk theme.
SkBitmap GenerateGtkThemeBitmap(int id) const;
// Creates a GTK+ version of IDR_THEME_FRAME. Instead of tinting, this
// creates a theme configurable gradient ending with |color_id| at the
// bottom, and |gradient_name| at the top if that color is specified in the
// theme.
SkBitmap GenerateFrameImage(int color_id,
const char* gradient_name) const;
// Takes the base frame image |base_id| and tints it with |tint_id|.
SkBitmap GenerateTabImage(int base_id) const;
// Tints an icon based on tint.
SkBitmap GenerateTintedIcon(int base_id,
const color_utils::HSL& tint) const;
// Renders a GTK icon as a SkBitmap, with prelight/active border if
// appropriate.
SkBitmap GenerateGTKIcon(int base_id) const;
// Renders a GTK button border the size of the image |sizing_idr| in
// |gtk_state|.
SkBitmap GenerateToolbarBezel(int gtk_state, int sizing_idr) const;
// Returns the tint for buttons that contrasts with the normal window
// background color.
void GetNormalButtonTintHSL(color_utils::HSL* tint) const;
// Returns a tint that's the color of the current normal text in an entry.
void GetNormalEntryForegroundHSL(color_utils::HSL* tint) const;
// Returns a tint that's the color of the current highlighted text in an
// entry.
void GetSelectedEntryForegroundHSL(color_utils::HSL* tint) const;
// Gets a color for the background of the call to action button.
SkColor CallToActionBgColor(int gtk_state) const;
// Frees all calculated images and color data.
void ClearAllThemeData();
// Updates |default_font_*| based on |desc|.
void UpdateDefaultFont(const PangoFontDescription* desc);
// Handles signal from GTK that our theme has been changed.
CHROMEGTK_CALLBACK_1(Gtk2UI, void, OnStyleSet, GtkStyle*);
GtkWidget* fake_window_;
GtkWidget* fake_frame_;
OwnedWidgetGtk fake_label_;
OwnedWidgetGtk fake_entry_;
// Tracks all the signals we have connected to on various widgets.
scoped_ptr<Gtk2SignalRegistrar> signals_;
// Tints and colors calculated by LoadGtkValues() that are given to the
// caller while |use_gtk_| is true.
ColorMap colors_;
TintMap tints_;
// Colors used to tint certain icons.
color_utils::HSL button_tint_;
color_utils::HSL entry_tint_;
color_utils::HSL selected_entry_tint_;
// Colors that we pass to WebKit. These are generated each time the theme
// changes.
SkColor focus_ring_color_;
SkColor thumb_active_color_;
SkColor thumb_inactive_color_;
SkColor track_color_;
SkColor active_selection_bg_color_;
SkColor active_selection_fg_color_;
SkColor inactive_selection_bg_color_;
SkColor inactive_selection_fg_color_;
// Details about the default UI font.
std::string default_font_family_;
int default_font_size_pixels_;
int default_font_style_; // Bitfield of gfx::Font::Style values.
gfx::FontRenderParams default_font_render_params_;
#if defined(USE_GCONF)
// Currently, the only source of window button configuration. This will
// change if we ever have to support XFCE's configuration system or KDE's.
scoped_ptr<GConfListener> gconf_listener_;
#endif // defined(USE_GCONF)
// If either of these vectors are non-empty, they represent the current
// window button configuration.
std::vector<views::FrameButton> leading_buttons_;
std::vector<views::FrameButton> trailing_buttons_;
scoped_ptr<Gtk2KeyBindingsHandler> key_bindings_handler_;
// Objects to notify when the window frame button order changes.
ObserverList<views::WindowButtonOrderObserver> observer_list_;
// Whether we should lower the window on a middle click to the non client
// area.
NonClientMiddleClickAction middle_click_action_;
// Image cache of lazily created images.
mutable ImageCache gtk_images_;
// Used to override the native theme for a window. If no override is provided
// or the callback returns NULL, Gtk2UI will default to a NativeThemeGtk2
// instance.
NativeThemeGetter native_theme_overrider_;
float device_scale_factor_;
DISALLOW_COPY_AND_ASSIGN(Gtk2UI);
};
} // namespace libgtk2ui
// Access point to the GTK2 desktop system. This should be the only symbol that
// is exported in the library; everything else should be used through the
// interface, because eventually this .so will be loaded through dlopen at
// runtime so our main binary can conditionally load GTK2 or GTK3 or EFL or
// QT or whatever.
LIBGTK2UI_EXPORT views::LinuxUI* BuildGtk2UI();
#endif // CHROME_BROWSER_UI_LIBGTK2UI_GTK2_UI_H_