Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(546)

Side by Side Diff: chrome/browser/ui/gtk/browser_titlebar.cc

Issue 9500003: Add a button to exit managed mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/gtk/browser_titlebar.h" 5 #include "chrome/browser/ui/gtk/browser_titlebar.h"
6 6
7 #include <gdk/gdkkeysyms.h> 7 #include <gdk/gdkkeysyms.h>
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 9
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/i18n/rtl.h" 14 #include "base/i18n/rtl.h"
15 #include "base/memory/singleton.h" 15 #include "base/memory/singleton.h"
16 #include "base/string_piece.h" 16 #include "base/string_piece.h"
17 #include "base/string_tokenizer.h" 17 #include "base/string_tokenizer.h"
18 #include "base/utf_string_conversions.h" 18 #include "base/utf_string_conversions.h"
19 #include "chrome/app/chrome_command_ids.h" 19 #include "chrome/app/chrome_command_ids.h"
20 #include "chrome/browser/browser_process.h" 20 #include "chrome/browser/browser_process.h"
21 #include "chrome/browser/managed_mode.h"
21 #include "chrome/browser/prefs/pref_service.h" 22 #include "chrome/browser/prefs/pref_service.h"
23 #include "chrome/browser/profiles/avatar_menu_model.h"
22 #include "chrome/browser/profiles/profile.h" 24 #include "chrome/browser/profiles/profile.h"
23 #include "chrome/browser/profiles/profile_info_cache.h" 25 #include "chrome/browser/profiles/profile_info_cache.h"
24 #include "chrome/browser/profiles/profile_manager.h" 26 #include "chrome/browser/profiles/profile_manager.h"
25 #include "chrome/browser/ui/browser.h" 27 #include "chrome/browser/ui/browser.h"
26 #include "chrome/browser/ui/gtk/accelerators_gtk.h" 28 #include "chrome/browser/ui/gtk/accelerators_gtk.h"
27 #include "chrome/browser/ui/gtk/avatar_menu_button_gtk.h" 29 #include "chrome/browser/ui/gtk/avatar_menu_button_gtk.h"
28 #include "chrome/browser/ui/gtk/browser_window_gtk.h" 30 #include "chrome/browser/ui/gtk/browser_window_gtk.h"
29 #include "chrome/browser/ui/gtk/custom_button.h" 31 #include "chrome/browser/ui/gtk/custom_button.h"
30 #if defined(USE_GCONF) 32 #if defined(USE_GCONF)
31 #include "chrome/browser/ui/gtk/gconf_titlebar_listener.h" 33 #include "chrome/browser/ui/gtk/gconf_titlebar_listener.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 // maximized). 107 // maximized).
106 const int kMaximizedTabstripPadding = 16; 108 const int kMaximizedTabstripPadding = 16;
107 109
108 gboolean OnMouseMoveEvent(GtkWidget* widget, GdkEventMotion* event, 110 gboolean OnMouseMoveEvent(GtkWidget* widget, GdkEventMotion* event,
109 BrowserWindowGtk* browser_window) { 111 BrowserWindowGtk* browser_window) {
110 // Reset to the default mouse cursor. 112 // Reset to the default mouse cursor.
111 browser_window->ResetCustomFrameCursor(); 113 browser_window->ResetCustomFrameCursor();
112 return TRUE; 114 return TRUE;
113 } 115 }
114 116
115 GdkPixbuf* GetOTRAvatar() {
116 static GdkPixbuf* otr_avatar = NULL;
117 if (!otr_avatar) {
118 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
119 otr_avatar = rb.GetNativeImageNamed(
120 IDR_OTR_ICON, ui::ResourceBundle::RTL_ENABLED).ToGdkPixbuf();
121 }
122 return otr_avatar;
123 }
124
125 // Converts a GdkColor to a color_utils::HSL. 117 // Converts a GdkColor to a color_utils::HSL.
126 color_utils::HSL GdkColorToHSL(const GdkColor* color) { 118 color_utils::HSL GdkColorToHSL(const GdkColor* color) {
127 color_utils::HSL hsl; 119 color_utils::HSL hsl;
128 color_utils::SkColorToHSL(SkColorSetRGB(color->red >> 8, 120 color_utils::SkColorToHSL(SkColorSetRGB(color->red >> 8,
129 color->green >> 8, 121 color->green >> 8,
130 color->blue >> 8), &hsl); 122 color->blue >> 8), &hsl);
131 return hsl; 123 return hsl;
132 } 124 }
133 125
134 // Returns either |one| or |two| based on which has a greater difference in 126 // Returns either |one| or |two| based on which has a greater difference in
135 // luminosity. 127 // luminosity.
136 GdkColor PickLuminosityContrastingColor(const GdkColor* base, 128 GdkColor PickLuminosityContrastingColor(const GdkColor* base,
137 const GdkColor* one, 129 const GdkColor* one,
138 const GdkColor* two) { 130 const GdkColor* two) {
139 // Convert all GdkColors to color_utils::HSLs. 131 // Convert all GdkColors to color_utils::HSLs.
140 color_utils::HSL baseHSL = GdkColorToHSL(base); 132 color_utils::HSL baseHSL = GdkColorToHSL(base);
141 color_utils::HSL oneHSL = GdkColorToHSL(one); 133 color_utils::HSL oneHSL = GdkColorToHSL(one);
142 color_utils::HSL twoHSL = GdkColorToHSL(two); 134 color_utils::HSL twoHSL = GdkColorToHSL(two);
143 double one_difference = fabs(baseHSL.l - oneHSL.l); 135 double one_difference = fabs(baseHSL.l - oneHSL.l);
144 double two_difference = fabs(baseHSL.l - twoHSL.l); 136 double two_difference = fabs(baseHSL.l - twoHSL.l);
145 137
146 // Be biased towards the first color presented. 138 // Be biased towards the first color presented.
147 if (two_difference > one_difference + 0.1) 139 if (two_difference > one_difference + 0.1)
148 return *two; 140 return *two;
149 else 141 else
150 return *one; 142 return *one;
151 } 143 }
152 144
153 // Returns true if there are multiple profiles created. This is used to
154 // determine whether to display the avatar image.
155 bool HasMultipleProfiles() {
156 ProfileInfoCache& cache =
157 g_browser_process->profile_manager()->GetProfileInfoCache();
158 return ProfileManager::IsMultipleProfilesEnabled() &&
159 cache.GetNumberOfProfiles() > 1;
160 }
161
162 } // namespace 145 } // namespace
163 146
164 //////////////////////////////////////////////////////////////////////////////// 147 ////////////////////////////////////////////////////////////////////////////////
165 // PopupPageMenuModel 148 // PopupPageMenuModel
166 149
167 // A menu model that builds the contents of the menu shown for popups (when the 150 // A menu model that builds the contents of the menu shown for popups (when the
168 // user clicks on the favicon) and all of its submenus. 151 // user clicks on the favicon) and all of its submenus.
169 class PopupPageMenuModel : public ui::SimpleMenuModel { 152 class PopupPageMenuModel : public ui::SimpleMenuModel {
170 public: 153 public:
171 PopupPageMenuModel(ui::SimpleMenuModel::Delegate* delegate, Browser* browser); 154 PopupPageMenuModel(ui::SimpleMenuModel::Delegate* delegate, Browser* browser);
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 void BrowserTitlebar::UpdateAvatar() { 779 void BrowserTitlebar::UpdateAvatar() {
797 // Remove previous state. 780 // Remove previous state.
798 gtk_util::RemoveAllChildren(titlebar_left_avatar_frame_); 781 gtk_util::RemoveAllChildren(titlebar_left_avatar_frame_);
799 gtk_util::RemoveAllChildren(titlebar_right_avatar_frame_); 782 gtk_util::RemoveAllChildren(titlebar_right_avatar_frame_);
800 783
801 if (!ShouldDisplayAvatar()) 784 if (!ShouldDisplayAvatar())
802 return; 785 return;
803 786
804 if (!avatar_) { 787 if (!avatar_) {
805 if (IsOffTheRecord()) { 788 if (IsOffTheRecord()) {
806 avatar_ = gtk_image_new_from_pixbuf(GetOTRAvatar()); 789 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
790 gfx::Image avatar_image =
791 rb.GetNativeImageNamed(IDR_OTR_ICON, ui::ResourceBundle::RTL_ENABLED);
792 avatar_ = gtk_image_new_from_pixbuf(avatar_image.ToGdkPixbuf());
807 gtk_misc_set_alignment(GTK_MISC(avatar_), 0.0, 1.0); 793 gtk_misc_set_alignment(GTK_MISC(avatar_), 0.0, 1.0);
808 gtk_widget_set_size_request(avatar_, -1, 0); 794 gtk_widget_set_size_request(avatar_, -1, 0);
809 } else { 795 } else {
810 // Is using multi-profile avatar. 796 // Use a clickable avatar.
811 avatar_ = avatar_button_->widget(); 797 avatar_ = avatar_button_->widget();
812 } 798 }
813 } 799 }
814 800
815 gtk_widget_show_all(avatar_); 801 gtk_widget_show_all(avatar_);
816 802
817 if (display_avatar_on_left_) { 803 if (display_avatar_on_left_) {
818 gtk_container_add(GTK_CONTAINER(titlebar_left_avatar_frame_), avatar_); 804 gtk_container_add(GTK_CONTAINER(titlebar_left_avatar_frame_), avatar_);
819 gtk_widget_show(titlebar_left_avatar_frame_); 805 gtk_widget_show(titlebar_left_avatar_frame_);
820 gtk_widget_hide(titlebar_right_avatar_frame_); 806 gtk_widget_hide(titlebar_right_avatar_frame_);
821 } else { 807 } else {
822 gtk_container_add(GTK_CONTAINER(titlebar_right_avatar_frame_), avatar_); 808 gtk_container_add(GTK_CONTAINER(titlebar_right_avatar_frame_), avatar_);
823 gtk_widget_show(titlebar_right_avatar_frame_); 809 gtk_widget_show(titlebar_right_avatar_frame_);
824 gtk_widget_hide(titlebar_left_avatar_frame_); 810 gtk_widget_hide(titlebar_left_avatar_frame_);
825 } 811 }
826 812
827 if (IsOffTheRecord()) 813 if (IsOffTheRecord())
828 return; 814 return;
829 815
830 ProfileInfoCache& cache = 816 bool is_gaia_picture = false;
831 g_browser_process->profile_manager()->GetProfileInfoCache(); 817 gfx::Image avatar;
832 Profile* profile = browser_window_->browser()->profile(); 818 if (ManagedMode::IsInManagedMode()) {
833 size_t index = cache.GetIndexOfProfileWithPath(profile->GetPath()); 819 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
834 if (index != std::string::npos) { 820 avatar = rb.GetNativeImageNamed(IDR_MANAGED_MODE_AVATAR,
835 bool is_gaia_picture = 821 ui::ResourceBundle::RTL_ENABLED);
822 } else {
823 ProfileInfoCache& cache =
824 g_browser_process->profile_manager()->GetProfileInfoCache();
825 Profile* profile = browser_window_->browser()->profile();
826 size_t index = cache.GetIndexOfProfileWithPath(profile->GetPath());
827 if (index == std::string::npos)
828 return;
829
830 is_gaia_picture =
836 cache.IsUsingGAIAPictureOfProfileAtIndex(index) && 831 cache.IsUsingGAIAPictureOfProfileAtIndex(index) &&
837 cache.GetGAIAPictureOfProfileAtIndex(index); 832 cache.GetGAIAPictureOfProfileAtIndex(index);
838 avatar_button_->SetIcon( 833 avatar = cache.GetAvatarIconOfProfileAtIndex(index);
839 cache.GetAvatarIconOfProfileAtIndex(index), is_gaia_picture); 834 }
835 avatar_button_->SetIcon(avatar, is_gaia_picture);
840 836
841 BubbleGtk::ArrowLocationGtk arrow_location = 837 BubbleGtk::ArrowLocationGtk arrow_location =
842 display_avatar_on_left_ ^ base::i18n::IsRTL() ? 838 display_avatar_on_left_ ^ base::i18n::IsRTL() ?
843 BubbleGtk::ARROW_LOCATION_TOP_LEFT : 839 BubbleGtk::ARROW_LOCATION_TOP_LEFT :
844 BubbleGtk::ARROW_LOCATION_TOP_RIGHT; 840 BubbleGtk::ARROW_LOCATION_TOP_RIGHT;
845 avatar_button_->set_menu_arrow_location(arrow_location); 841 avatar_button_->set_menu_arrow_location(arrow_location);
846 }
847 } 842 }
848 843
849 void BrowserTitlebar::ShowFaviconMenu(GdkEventButton* event) { 844 void BrowserTitlebar::ShowFaviconMenu(GdkEventButton* event) {
850 if (!favicon_menu_model_.get()) { 845 if (!favicon_menu_model_.get()) {
851 favicon_menu_model_.reset( 846 favicon_menu_model_.reset(
852 new PopupPageMenuModel(this, browser_window_->browser())); 847 new PopupPageMenuModel(this, browser_window_->browser()));
853 848
854 favicon_menu_.reset(new MenuGtk(NULL, favicon_menu_model_.get())); 849 favicon_menu_.reset(new MenuGtk(NULL, favicon_menu_model_.get()));
855 } 850 }
856 851
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 // to NULL during that time. 1081 // to NULL during that time.
1087 if (!window_) 1082 if (!window_)
1088 return; 1083 return;
1089 1084
1090 window_has_focus_ = 1085 window_has_focus_ =
1091 gtk_widget_get_window(GTK_WIDGET(window_)) == active_window; 1086 gtk_widget_get_window(GTK_WIDGET(window_)) == active_window;
1092 UpdateTextColor(); 1087 UpdateTextColor();
1093 } 1088 }
1094 1089
1095 bool BrowserTitlebar::ShouldDisplayAvatar() { 1090 bool BrowserTitlebar::ShouldDisplayAvatar() {
1096 return (IsOffTheRecord() || HasMultipleProfiles()) && 1091 if (IsOffTheRecord() || ManagedMode::IsInManagedMode())
1097 browser_window_->browser()->is_type_tabbed(); 1092 return true;
1093
1094 if (!browser_window_->browser()->is_type_tabbed())
1095 return false;
1096
1097 return AvatarMenuModel::ShouldShowAvatarMenu();
1098 } 1098 }
1099 1099
1100 bool BrowserTitlebar::IsOffTheRecord() { 1100 bool BrowserTitlebar::IsOffTheRecord() {
1101 return browser_window_->browser()->profile()->IsOffTheRecord(); 1101 return browser_window_->browser()->profile()->IsOffTheRecord();
1102 } 1102 }
1103 1103
1104 /////////////////////////////////////////////////////////////////////////////// 1104 ///////////////////////////////////////////////////////////////////////////////
1105 // BrowserTitlebar::Throbber implementation 1105 // BrowserTitlebar::Throbber implementation
1106 // TODO(tc): Handle anti-clockwise spinning when waiting for a connection. 1106 // TODO(tc): Handle anti-clockwise spinning when waiting for a connection.
1107 1107
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 ui::SimpleMenuModel::Delegate* delegate) 1161 ui::SimpleMenuModel::Delegate* delegate)
1162 : SimpleMenuModel(delegate) { 1162 : SimpleMenuModel(delegate) {
1163 AddItemWithStringId(IDC_NEW_TAB, IDS_TAB_CXMENU_NEWTAB); 1163 AddItemWithStringId(IDC_NEW_TAB, IDS_TAB_CXMENU_NEWTAB);
1164 AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB); 1164 AddItemWithStringId(IDC_RESTORE_TAB, IDS_RESTORE_TAB);
1165 AddSeparator(); 1165 AddSeparator();
1166 AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); 1166 AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER);
1167 AddSeparator(); 1167 AddSeparator();
1168 AddCheckItemWithStringId(kShowWindowDecorationsCommand, 1168 AddCheckItemWithStringId(kShowWindowDecorationsCommand,
1169 IDS_SHOW_WINDOW_DECORATIONS_MENU); 1169 IDS_SHOW_WINDOW_DECORATIONS_MENU);
1170 } 1170 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698