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

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

Issue 12039058: content: convert zoom notifications to observer usage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 10 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_toolbar_gtk.h" 5 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h"
6 6
7 #include <gdk/gdkkeysyms.h> 7 #include <gdk/gdkkeysyms.h>
8 #include <gtk/gtk.h> 8 #include <gtk/gtk.h>
9 #include <X11/XF86keysym.h> 9 #include <X11/XF86keysym.h>
10 10
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 } // namespace 92 } // namespace
93 93
94 // BrowserToolbarGtk, public --------------------------------------------------- 94 // BrowserToolbarGtk, public ---------------------------------------------------
95 95
96 BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window) 96 BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
97 : toolbar_(NULL), 97 : toolbar_(NULL),
98 location_bar_(new LocationBarViewGtk(browser)), 98 location_bar_(new LocationBarViewGtk(browser)),
99 model_(browser->toolbar_model()), 99 model_(browser->toolbar_model()),
100 is_wrench_menu_model_valid_(true), 100 is_wrench_menu_model_valid_(true),
101 browser_(browser), 101 browser_(browser),
102 window_(window) { 102 window_(window),
103 zoom_callback_(base::Bind(&BrowserToolbarGtk::OnZoomLevelChanged,
104 base::Unretained(this))) {
103 wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false, false)); 105 wrench_menu_model_.reset(new WrenchMenuModel(this, browser_, false, false));
104 106
105 chrome::AddCommandObserver(browser_, IDC_BACK, this); 107 chrome::AddCommandObserver(browser_, IDC_BACK, this);
106 chrome::AddCommandObserver(browser_, IDC_FORWARD, this); 108 chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
107 chrome::AddCommandObserver(browser_, IDC_HOME, this); 109 chrome::AddCommandObserver(browser_, IDC_HOME, this);
108 chrome::AddCommandObserver(browser_, IDC_BOOKMARK_PAGE, this); 110 chrome::AddCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
109 111
110 registrar_.Add(this, 112 registrar_.Add(this,
111 chrome::NOTIFICATION_UPGRADE_RECOMMENDED, 113 chrome::NOTIFICATION_UPGRADE_RECOMMENDED,
112 content::NotificationService::AllSources()); 114 content::NotificationService::AllSources());
113 registrar_.Add(this, 115 registrar_.Add(this,
114 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED, 116 chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
115 content::Source<Profile>(browser_->profile())); 117 content::Source<Profile>(browser_->profile()));
116 } 118 }
117 119
118 BrowserToolbarGtk::~BrowserToolbarGtk() { 120 BrowserToolbarGtk::~BrowserToolbarGtk() {
119 chrome::RemoveCommandObserver(browser_, IDC_BACK, this); 121 chrome::RemoveCommandObserver(browser_, IDC_BACK, this);
120 chrome::RemoveCommandObserver(browser_, IDC_FORWARD, this); 122 chrome::RemoveCommandObserver(browser_, IDC_FORWARD, this);
121 chrome::RemoveCommandObserver(browser_, IDC_HOME, this); 123 chrome::RemoveCommandObserver(browser_, IDC_HOME, this);
122 chrome::RemoveCommandObserver(browser_, IDC_BOOKMARK_PAGE, this); 124 chrome::RemoveCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
123 125
124 offscreen_entry_.Destroy(); 126 offscreen_entry_.Destroy();
125 127
126 wrench_menu_.reset(); 128 wrench_menu_.reset();
129
130 HostZoomMap::GetForBrowserContext(
131 browser()->profile())->RemoveZoomLevelChangedCallback(zoom_callback_);
127 } 132 }
128 133
129 void BrowserToolbarGtk::Init(GtkWindow* top_level_window) { 134 void BrowserToolbarGtk::Init(GtkWindow* top_level_window) {
130 Profile* profile = browser_->profile(); 135 Profile* profile = browser_->profile();
131 theme_service_ = GtkThemeService::GetFrom(profile); 136 theme_service_ = GtkThemeService::GetFrom(profile);
132 registrar_.Add(this, 137 registrar_.Add(this,
133 chrome::NOTIFICATION_BROWSER_THEME_CHANGED, 138 chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
134 content::Source<ThemeService>(theme_service_)); 139 content::Source<ThemeService>(theme_service_));
135 140
136 offscreen_entry_.Own(gtk_entry_new()); 141 offscreen_entry_.Own(gtk_entry_new());
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 GtkWidget* wrench_box = gtk_alignment_new(0, 0, 1, 1); 239 GtkWidget* wrench_box = gtk_alignment_new(0, 0, 1, 1);
235 g_signal_connect_after(wrench_box, "expose-event", 240 g_signal_connect_after(wrench_box, "expose-event",
236 G_CALLBACK(OnWrenchMenuButtonExposeThunk), this); 241 G_CALLBACK(OnWrenchMenuButtonExposeThunk), this);
237 gtk_container_add(GTK_CONTAINER(wrench_box), wrench_button); 242 gtk_container_add(GTK_CONTAINER(wrench_box), wrench_button);
238 gtk_box_pack_start(GTK_BOX(toolbar_), wrench_box, FALSE, FALSE, 4); 243 gtk_box_pack_start(GTK_BOX(toolbar_), wrench_box, FALSE, FALSE, 4);
239 244
240 wrench_menu_.reset(new MenuGtk(this, wrench_menu_model_.get())); 245 wrench_menu_.reset(new MenuGtk(this, wrench_menu_model_.get()));
241 // The bookmark menu model needs to be able to force the wrench menu to close. 246 // The bookmark menu model needs to be able to force the wrench menu to close.
242 wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get()); 247 wrench_menu_model_->bookmark_sub_menu_model()->SetMenuGtk(wrench_menu_.get());
243 248
244 registrar_.Add(this, content::NOTIFICATION_ZOOM_LEVEL_CHANGED, 249 HostZoomMap::GetForBrowserContext(
245 content::Source<HostZoomMap>( 250 browser()->profile())->AddZoomLevelChangedCallback(zoom_callback_);
246 HostZoomMap::GetForBrowserContext(profile)));
247 251
248 if (ShouldOnlyShowLocation()) { 252 if (ShouldOnlyShowLocation()) {
249 gtk_widget_show(event_box_); 253 gtk_widget_show(event_box_);
250 gtk_widget_show(alignment_); 254 gtk_widget_show(alignment_);
251 gtk_widget_show(toolbar_); 255 gtk_widget_show(toolbar_);
252 gtk_widget_show_all(location_hbox_); 256 gtk_widget_show_all(location_hbox_);
253 gtk_widget_hide(reload_->widget()); 257 gtk_widget_hide(reload_->widget());
254 } else { 258 } else {
255 gtk_widget_show_all(event_box_); 259 gtk_widget_show_all(event_box_);
256 if (actions_toolbar_->button_count() == 0) 260 if (actions_toolbar_->button_count() == 0)
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 theme_service_->GetRTLEnabledPixbufNamed(IDR_TOOLS)); 413 theme_service_->GetRTLEnabledPixbufNamed(IDR_TOOLS));
410 } 414 }
411 415
412 UpdateRoundedness(); 416 UpdateRoundedness();
413 } else if (type == chrome::NOTIFICATION_UPGRADE_RECOMMENDED) { 417 } else if (type == chrome::NOTIFICATION_UPGRADE_RECOMMENDED) {
414 // Redraw the wrench menu to update the badge. 418 // Redraw the wrench menu to update the badge.
415 gtk_widget_queue_draw(wrench_menu_button_->widget()); 419 gtk_widget_queue_draw(wrench_menu_button_->widget());
416 } else if (type == chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED) { 420 } else if (type == chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED) {
417 is_wrench_menu_model_valid_ = false; 421 is_wrench_menu_model_valid_ = false;
418 gtk_widget_queue_draw(wrench_menu_button_->widget()); 422 gtk_widget_queue_draw(wrench_menu_button_->widget());
419 } else if (type == content::NOTIFICATION_ZOOM_LEVEL_CHANGED) {
420 // Since BrowserToolbarGtk create a new |wrench_menu_model_| in
421 // RebuildWrenchMenu(), the ordering of the observers of
422 // NOTIFICATION_ZOOM_LEVEL_CHANGED can change, and result in subtle bugs
423 // like http://crbug.com/118823. Rather than depending on the ordering
424 // of the notification observers, always update the WrenchMenuModel before
425 // updating the WrenchMenu.
426 wrench_menu_model_->UpdateZoomControls();
427
428 // If our zoom level changed, we need to tell the menu to update its state,
429 // since the menu could still be open.
430 wrench_menu_->UpdateMenu();
431 } else { 423 } else {
432 NOTREACHED(); 424 NOTREACHED();
433 } 425 }
434 } 426 }
435 427
436 // BrowserToolbarGtk, public --------------------------------------------------- 428 // BrowserToolbarGtk, public ---------------------------------------------------
437 429
438 void BrowserToolbarGtk::UpdateWebContents(WebContents* contents, 430 void BrowserToolbarGtk::UpdateWebContents(WebContents* contents,
439 bool should_restore_state) { 431 bool should_restore_state) {
440 location_bar_->Update(should_restore_state ? contents : NULL); 432 location_bar_->Update(should_restore_state ? contents : NULL);
441 433
442 if (actions_toolbar_.get()) 434 if (actions_toolbar_.get())
443 actions_toolbar_->Update(); 435 actions_toolbar_->Update();
444 } 436 }
445 437
446 bool BrowserToolbarGtk::IsWrenchMenuShowing() const { 438 bool BrowserToolbarGtk::IsWrenchMenuShowing() const {
447 return wrench_menu_.get() && gtk_widget_get_visible(wrench_menu_->widget()); 439 return wrench_menu_.get() && gtk_widget_get_visible(wrench_menu_->widget());
448 } 440 }
449 441
450 // BrowserToolbarGtk, private -------------------------------------------------- 442 // BrowserToolbarGtk, private --------------------------------------------------
451 443
444 void BrowserToolbarGtk::OnZoomLevelChanged(const std::string& host) {
445 // Since BrowserToolbarGtk create a new |wrench_menu_model_| in
446 // RebuildWrenchMenu(), the ordering of the observers of HostZoomMap
447 // can change, and result in subtle bugs like http://crbug.com/118823.
448 // Rather than depending on the ordering of the observers, always update
449 // the WrenchMenuModel before updating the WrenchMenu.
450 wrench_menu_model_->UpdateZoomControls();
451
452 // If our zoom level changed, we need to tell the menu to update its state,
453 // since the menu could still be open.
454 wrench_menu_->UpdateMenu();
455 }
456
457
452 void BrowserToolbarGtk::SetUpDragForHomeButton() { 458 void BrowserToolbarGtk::SetUpDragForHomeButton() {
453 if (!home_page_.IsManaged() && !home_page_is_new_tab_page_.IsManaged()) { 459 if (!home_page_.IsManaged() && !home_page_is_new_tab_page_.IsManaged()) {
454 gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL, 460 gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL,
455 NULL, 0, GDK_ACTION_COPY); 461 NULL, 0, GDK_ACTION_COPY);
456 static const int targets[] = { ui::TEXT_PLAIN, ui::TEXT_URI_LIST, -1 }; 462 static const int targets[] = { ui::TEXT_PLAIN, ui::TEXT_URI_LIST, -1 };
457 ui::SetDestTargetList(home_->widget(), targets); 463 ui::SetDestTargetList(home_->widget(), targets);
458 464
459 drop_handler_.reset(new ui::GtkSignalRegistrar()); 465 drop_handler_.reset(new ui::GtkSignalRegistrar());
460 drop_handler_->Connect(home_->widget(), "drag-data-received", 466 drop_handler_->Connect(home_->widget(), "drag-data-received",
461 G_CALLBACK(OnDragDataReceivedThunk), this); 467 G_CALLBACK(OnDragDataReceivedThunk), this);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 allocation.x + x_offset, 703 allocation.x + x_offset,
698 allocation.y + y_offset); 704 allocation.y + y_offset);
699 705
700 return FALSE; 706 return FALSE;
701 } 707 }
702 708
703 void BrowserToolbarGtk::UpdateShowHomeButton() { 709 void BrowserToolbarGtk::UpdateShowHomeButton() {
704 bool visible = show_home_button_.GetValue() && !ShouldOnlyShowLocation(); 710 bool visible = show_home_button_.GetValue() && !ShouldOnlyShowLocation();
705 gtk_widget_set_visible(home_->widget(), visible); 711 gtk_widget_set_visible(home_->widget(), visible);
706 } 712 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/gtk/browser_toolbar_gtk.h ('k') | chrome/browser/ui/gtk/location_bar_view_gtk_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698