Index: chrome/browser/gtk/browser_titlebar.cc |
=================================================================== |
--- chrome/browser/gtk/browser_titlebar.cc (revision 19151) |
+++ chrome/browser/gtk/browser_titlebar.cc (working copy) |
@@ -6,6 +6,7 @@ |
#include <gtk/gtk.h> |
+#include "app/resource_bundle.h" |
#include "app/l10n_util.h" |
#include "chrome/app/chrome_dll_resource.h" |
#include "chrome/browser/browser.h" |
@@ -28,6 +29,18 @@ |
// A linux specific menu item for toggling window decorations. |
const int kShowWindowDecorationsCommand = 200; |
+// The following OTR constants copied from opaque_browser_frame_view.cc: |
+// In maximized mode, the OTR avatar starts 2 px below the top of the screen, so |
+// that it doesn't extend into the "3D edge" portion of the titlebar. |
+const int kOTRMaximizedTopSpacing = 2; |
+// The OTR avatar ends 2 px above the bottom of the tabstrip (which, given the |
+// way the tabstrip draws its bottom edge, will appear like a 1 px gap to the |
+// user). |
+const int kOTRBottomSpacing = 2; |
+// There are 2 px on each side of the OTR avatar (between the frame border and |
+// it on the left, and between it and the tabstrip on the right). |
+const int kOTRSideSpacing = 2; |
+ |
gboolean OnMouseMoveEvent(GtkWidget* widget, GdkEventMotion* event, |
BrowserWindowGtk* browser_window) { |
// Reset to the default mouse cursor. |
@@ -35,6 +48,15 @@ |
return TRUE; |
} |
+GdkPixbuf* GetOTRAvatar() { |
+ static GdkPixbuf* otr_avatar = NULL; |
+ if (!otr_avatar) { |
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
+ otr_avatar = rb.GetPixbufNamed(IDR_OTR_ICON); |
+ } |
+ return otr_avatar; |
+} |
+ |
} // namespace |
BrowserTitlebar::BrowserTitlebar(BrowserWindowGtk* browser_window, |
@@ -46,20 +68,28 @@ |
void BrowserTitlebar::Init() { |
// The widget hierarchy is shown below. |
// |
- // +- HBox (container_) --------------------------------------------------+ |
- // |+- Alignment (titlebar_alignment_)-++- VBox (titlebar_buttons_box_) -+| |
- // || ||+- HBox -----------------------+|| |
- // || |||+- button -++- button -+ ||| |
- // ||+- TabStripGtk ------------------+|||| minimize || restore | ... ||| |
- // ||| tab tab tab tabclose +|||+----------++----------+ ||| |
- // ||+--------------------------------+||+------------------------------+|| |
- // |+----------------------------------++--------------------------------+| |
- // +----------------------------------------------------------------------+ |
+ // +- HBox (container_) -----------------------------------------------------+ |
+ // |+- Fixed -++- Alignment --------------++- VBox (titlebar_buttons_box_) -+| |
+ // ||(spy_guy)|| (titlebar_alignment_) ||+- HBox -----------------------+|| |
+ // || || |||+- button -++- button -+ ||| |
+ // || ||+- TabStripGtk ---------+|||| minimize || restore | ... ||| |
+ // || )8\ ||| tab tab tabclose ||||+----------++----------+ ||| |
+ // || ||+------------------------+||+------------------------------+|| |
+ // |+---------++--------------------------++--------------------------------+| |
+ // +-------------------------------------------------------------------------+ |
container_ = gtk_hbox_new(FALSE, 0); |
g_signal_connect(window_, "window-state-event", |
G_CALLBACK(OnWindowStateChanged), this); |
+ if (browser_window_->browser()->profile()->IsOffTheRecord()) { |
+ GtkWidget* spy_guy = gtk_fixed_new(); |
+ gtk_widget_set_size_request(spy_guy, gdk_pixbuf_get_width(GetOTRAvatar()) + |
+ 2 * kOTRSideSpacing, -1); |
+ gtk_box_pack_start(GTK_BOX(container_), spy_guy, FALSE, FALSE, 0); |
+ g_signal_connect(spy_guy, "expose-event", G_CALLBACK(OnAvatarExpose), this); |
+ } |
+ |
// We use an alignment to control the titlebar height. |
titlebar_alignment_ = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); |
gtk_box_pack_start(GTK_BOX(container_), titlebar_alignment_, TRUE, |
@@ -218,3 +248,35 @@ |
NOTREACHED(); |
} |
} |
+ |
+// static |
+gboolean BrowserTitlebar::OnAvatarExpose( |
+ GtkWidget* widget, GdkEventExpose* event, BrowserTitlebar* titlebar) { |
+ cairo_t* cairo_context = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
+ cairo_translate(cairo_context, widget->allocation.x, widget->allocation.y); |
+ |
+ if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) { |
+ cairo_translate(cairo_context, widget->allocation.width, 0.0f); |
+ cairo_scale(cairo_context, -1.0f, 1.0f); |
+ } |
+ |
+ // Set up a clip rect. |
+ const int clip_x = kOTRSideSpacing; |
+ const int clip_width = gdk_pixbuf_get_width(GetOTRAvatar()); |
+ const int clip_y = kOTRMaximizedTopSpacing; |
+ const int clip_height = widget->allocation.height - kOTRMaximizedTopSpacing - |
+ kOTRBottomSpacing; |
+ cairo_rectangle(cairo_context, clip_x, clip_y, clip_width, clip_height); |
+ cairo_clip(cairo_context); |
+ |
+ // Drawing origin, which is calculated relative to the bottom. |
+ const int x = clip_x; |
+ const int y = widget->allocation.height - kOTRBottomSpacing - |
+ gdk_pixbuf_get_height(GetOTRAvatar()); |
+ |
+ gdk_cairo_set_source_pixbuf(cairo_context, GetOTRAvatar(), x, y); |
+ cairo_paint(cairo_context); |
+ cairo_destroy(cairo_context); |
+ |
+ return TRUE; |
+} |