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

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

Issue 155164: Give page/app menu native menu bar feel.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 5 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
« no previous file with comments | « chrome/browser/gtk/browser_toolbar_gtk.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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/gtk/browser_toolbar_gtk.h" 5 #include "chrome/browser/gtk/browser_toolbar_gtk.h"
6 6
7 #include <gdk/gdkkeysyms.h> 7 #include <gdk/gdkkeysyms.h>
8 #include <X11/XF86keysym.h> 8 #include <X11/XF86keysym.h>
9 9
10 #include "app/l10n_util.h" 10 #include "app/l10n_util.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 gtk_box_pack_start(GTK_BOX(omnibox_hbox_), go_->widget(), FALSE, FALSE, 0); 147 gtk_box_pack_start(GTK_BOX(omnibox_hbox_), go_->widget(), FALSE, FALSE, 0);
148 148
149 gtk_box_pack_start(GTK_BOX(toolbar_), omnibox_hbox_, TRUE, TRUE, 0); 149 gtk_box_pack_start(GTK_BOX(toolbar_), omnibox_hbox_, TRUE, TRUE, 0);
150 150
151 // Group the menu buttons together in an hbox. 151 // Group the menu buttons together in an hbox.
152 GtkWidget* menus_hbox_ = gtk_hbox_new(FALSE, 0); 152 GtkWidget* menus_hbox_ = gtk_hbox_new(FALSE, 0);
153 GtkWidget* page_menu = BuildToolbarMenuButton(IDR_MENU_PAGE, 153 GtkWidget* page_menu = BuildToolbarMenuButton(IDR_MENU_PAGE,
154 l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP), 154 l10n_util::GetStringUTF8(IDS_PAGEMENU_TOOLTIP),
155 &page_menu_button_); 155 &page_menu_button_);
156 page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(), accel_group_)); 156 page_menu_.reset(new MenuGtk(this, GetStandardPageMenu(), accel_group_));
157 g_signal_connect(page_menu_->widget(), "motion-notify-event",
158 G_CALLBACK(OnPageAppMenuMouseMotion), this);
159 g_signal_connect(page_menu_->widget(), "move-current",
160 G_CALLBACK(OnPageAppMenuMoveCurrent), this);
157 gtk_box_pack_start(GTK_BOX(menus_hbox_), page_menu, FALSE, FALSE, 0); 161 gtk_box_pack_start(GTK_BOX(menus_hbox_), page_menu, FALSE, FALSE, 0);
158 162
159 GtkWidget* chrome_menu = BuildToolbarMenuButton(IDR_MENU_CHROME, 163 GtkWidget* chrome_menu = BuildToolbarMenuButton(IDR_MENU_CHROME,
160 l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP, 164 l10n_util::GetStringFUTF8(IDS_APPMENU_TOOLTIP,
161 WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))), 165 WideToUTF16(l10n_util::GetString(IDS_PRODUCT_NAME))),
162 &app_menu_button_); 166 &app_menu_button_);
163 app_menu_.reset(new MenuGtk(this, GetStandardAppMenu(), accel_group_)); 167 app_menu_.reset(new MenuGtk(this, GetStandardAppMenu(), accel_group_));
168 g_signal_connect(app_menu_->widget(), "motion-notify-event",
169 G_CALLBACK(OnPageAppMenuMouseMotion), this);
170 g_signal_connect(app_menu_->widget(), "move-current",
171 G_CALLBACK(OnPageAppMenuMoveCurrent), this);
164 gtk_box_pack_start(GTK_BOX(menus_hbox_), chrome_menu, FALSE, FALSE, 0); 172 gtk_box_pack_start(GTK_BOX(menus_hbox_), chrome_menu, FALSE, FALSE, 0);
165 173
166 gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0); 174 gtk_box_pack_start(GTK_BOX(toolbar_), menus_hbox_, FALSE, FALSE, 0);
167 175
168 // Force all the CustomDrawButtons to load the correct rendering style. 176 // Force all the CustomDrawButtons to load the correct rendering style.
169 UserChangedTheme(); 177 UserChangedTheme();
170 178
171 gtk_widget_show_all(toolbar_); 179 gtk_widget_show_all(toolbar_);
172 180
173 if (show_home_button_.GetValue()) { 181 if (show_home_button_.GetValue()) {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL, 378 gtk_drag_dest_set(home_->widget(), GTK_DEST_DEFAULT_ALL,
371 NULL, 0, GDK_ACTION_COPY); 379 NULL, 0, GDK_ACTION_COPY);
372 GtkDndUtil::SetDestTargetListFromCodeMask(home_->widget(), 380 GtkDndUtil::SetDestTargetListFromCodeMask(home_->widget(),
373 GtkDndUtil::X_CHROME_TEXT_PLAIN | 381 GtkDndUtil::X_CHROME_TEXT_PLAIN |
374 GtkDndUtil::X_CHROME_TEXT_URI_LIST); 382 GtkDndUtil::X_CHROME_TEXT_URI_LIST);
375 383
376 g_signal_connect(home_->widget(), "drag-data-received", 384 g_signal_connect(home_->widget(), "drag-data-received",
377 G_CALLBACK(OnDragDataReceived), this); 385 G_CALLBACK(OnDragDataReceived), this);
378 } 386 }
379 387
388 void BrowserToolbarGtk::ChangeActiveMenu(GtkWidget* active_menu,
389 guint timestamp) {
390 MenuGtk* old_menu;
391 MenuGtk* new_menu;
392 GtkWidget* relevant_button;
393 if (active_menu == app_menu_->widget()) {
394 old_menu = app_menu_.get();
395 new_menu = page_menu_.get();
396 relevant_button = page_menu_button_.get();
397 } else {
398 old_menu = page_menu_.get();
399 new_menu = app_menu_.get();
400 relevant_button = app_menu_button_.get();
401 }
402
403 old_menu->Cancel();
404 gtk_chrome_button_set_paint_state(GTK_CHROME_BUTTON(relevant_button),
405 GTK_STATE_ACTIVE);
406 new_menu->Popup(relevant_button, 0, timestamp);
407 }
408
380 // static 409 // static
381 gboolean BrowserToolbarGtk::OnToolbarExpose(GtkWidget* widget, 410 gboolean BrowserToolbarGtk::OnToolbarExpose(GtkWidget* widget,
382 GdkEventExpose* e, 411 GdkEventExpose* e,
383 BrowserToolbarGtk* toolbar) { 412 BrowserToolbarGtk* toolbar) {
384 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); 413 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(widget->window));
385 cairo_rectangle(cr, e->area.x, e->area.y, e->area.width, e->area.height); 414 cairo_rectangle(cr, e->area.x, e->area.y, e->area.width, e->area.height);
386 cairo_clip(cr); 415 cairo_clip(cr);
387 // The toolbar is supposed to blend in with the active tab, so we have to pass 416 // The toolbar is supposed to blend in with the active tab, so we have to pass
388 // coordinates for the IDR_THEME_TOOLBAR bitmap relative to the top of the 417 // coordinates for the IDR_THEME_TOOLBAR bitmap relative to the top of the
389 // tab strip. 418 // tab strip.
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 483
455 bool url_is_newtab = url.spec() == chrome::kChromeUINewTabURL; 484 bool url_is_newtab = url.spec() == chrome::kChromeUINewTabURL;
456 toolbar->profile_->GetPrefs()->SetBoolean(prefs::kHomePageIsNewTabPage, 485 toolbar->profile_->GetPrefs()->SetBoolean(prefs::kHomePageIsNewTabPage,
457 url_is_newtab); 486 url_is_newtab);
458 if (!url_is_newtab) { 487 if (!url_is_newtab) {
459 toolbar->profile_->GetPrefs()->SetString(prefs::kHomePage, 488 toolbar->profile_->GetPrefs()->SetString(prefs::kHomePage,
460 UTF8ToWide(url.spec())); 489 UTF8ToWide(url.spec()));
461 } 490 }
462 } 491 }
463 492
493 // static
494 gboolean BrowserToolbarGtk::OnPageAppMenuMouseMotion(GtkWidget* menu,
495 GdkEventMotion* event, BrowserToolbarGtk* toolbar) {
496 if (gtk_util::WidgetContainsCursor(menu == toolbar->app_menu_->widget() ?
497 toolbar->page_menu_button_.get() :
498 toolbar->app_menu_button_.get())) {
499 toolbar->ChangeActiveMenu(menu, event->time);
500 return TRUE;
501 }
502
503 return FALSE;
504 }
505
506 // static
507 void BrowserToolbarGtk::OnPageAppMenuMoveCurrent(GtkWidget* menu,
508 GtkMenuDirectionType dir, BrowserToolbarGtk* toolbar) {
509 GtkWidget* active_item = GTK_MENU_SHELL(menu)->active_menu_item;
510
511 switch (dir) {
512 case GTK_MENU_DIR_CHILD:
513 // The move is going to open a submenu; don't override default behavior.
514 if (active_item && gtk_menu_item_get_submenu(GTK_MENU_ITEM(active_item)))
515 break;
516 // Fall through.
517 case GTK_MENU_DIR_PARENT:
518 toolbar->ChangeActiveMenu(menu, gtk_get_current_event_time());
519 // This signal doesn't have a return value; we have to manually stop its
520 // propagation.
521 g_signal_stop_emission_by_name(menu, "move-current");
522 default:
523 break;
524 }
525 }
526
464 void BrowserToolbarGtk::InitNineBox() { 527 void BrowserToolbarGtk::InitNineBox() {
465 // TODO(estade): use |profile_|? 528 // TODO(estade): use |profile_|?
466 background_ninebox_.reset(new NineBox( 529 background_ninebox_.reset(new NineBox(
467 browser_->profile()->GetThemeProvider(), 530 browser_->profile()->GetThemeProvider(),
468 0, IDR_THEME_TOOLBAR, 0, 0, 0, 0, 0, 0, 0)); 531 0, IDR_THEME_TOOLBAR, 0, 0, 0, 0, 0, 0, 0));
469 } 532 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/browser_toolbar_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698