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

Unified Diff: chrome/browser/gtk/browser_toolbar_view_gtk.cc

Issue 20245: Port the Menu class to GTK. (Closed)
Patch Set: Fixes for evanm Created 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/gtk/browser_toolbar_view_gtk.cc
diff --git a/chrome/browser/gtk/browser_toolbar_view_gtk.cc b/chrome/browser/gtk/browser_toolbar_view_gtk.cc
index 57f481a2221ebf8f373860e4ced1caae35663890..67840c7127fd9d5fd53de1a9375662933060d882 100644
--- a/chrome/browser/gtk/browser_toolbar_view_gtk.cc
+++ b/chrome/browser/gtk/browser_toolbar_view_gtk.cc
@@ -9,6 +9,8 @@
#include "base/path_service.h"
#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/browser.h"
+#include "chrome/browser/gtk/menu_gtk.h"
+#include "chrome/browser/gtk/standard_menus.h"
#include "chrome/common/l10n_util.h"
#include "chromium_strings.h"
@@ -21,7 +23,7 @@ class BrowserToolbarGtk::CustomDrawButton {
// The constructor takes a filename, which is used as the base filename
// in loading the theme graphics pngs. This will be replaced by the
// ResourceBundle graphics soon.
- CustomDrawButton(const std::string& filename);
+ explicit CustomDrawButton(const std::string& filename);
~CustomDrawButton();
GtkWidget* widget() const { return widget_; }
@@ -140,36 +142,41 @@ void BrowserToolbarGtk::Init(Profile* profile) {
toolbar_tooltips_ = gtk_tooltips_new();
back_.reset(BuildToolbarButton("back",
- l10n_util::GetString(IDS_TOOLTIP_BACK)));
+ l10n_util::GetString(IDS_TOOLTIP_BACK),
+ false));
forward_.reset(BuildToolbarButton("forward",
- l10n_util::GetString(IDS_TOOLTIP_FORWARD)));
+ l10n_util::GetString(IDS_TOOLTIP_FORWARD),
+ false));
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
reload_.reset(BuildToolbarButton("reload",
- l10n_util::GetString(IDS_TOOLTIP_RELOAD)));
+ l10n_util::GetString(IDS_TOOLTIP_RELOAD),
+ false));
home_.reset(BuildToolbarButton("home",
- l10n_util::GetString(IDS_TOOLTIP_HOME)));
+ l10n_util::GetString(IDS_TOOLTIP_HOME),
+ false));
gtk_box_pack_start(GTK_BOX(toolbar_), gtk_label_new(" "), FALSE, FALSE, 0);
star_.reset(BuildToolbarButton("star",
- l10n_util::GetString(IDS_TOOLTIP_STAR)));
+ l10n_util::GetString(IDS_TOOLTIP_STAR),
+ false));
GtkWidget* entry = gtk_entry_new();
gtk_widget_set_size_request(entry, 0, 27);
gtk_box_pack_start(GTK_BOX(toolbar_), entry, TRUE, TRUE, 0);
- go_.reset(BuildToolbarButton("go", L""));
+ go_.reset(BuildToolbarButton("go", L"", false));
// TODO(port): these buttons need even stranger drawing than the others.
- page_menu_.reset(BuildToolbarButton("menu_page",
- l10n_util::GetString(IDS_PAGEMENU_TOOLTIP)));
+ page_menu_button_.reset(BuildToolbarButton("menu_page",
+ l10n_util::GetString(IDS_PAGEMENU_TOOLTIP), true));
// TODO(port): Need to get l10n_util::GetStringF working under linux to get
// the correct string here.
- app_menu_.reset(BuildToolbarButton("menu_chrome",
- l10n_util::GetString(IDS_APPMENU_TOOLTIP)));
+ app_menu_button_.reset(BuildToolbarButton("menu_chrome",
+ l10n_util::GetString(IDS_APPMENU_TOOLTIP), true));
// TODO(erg): wchar_t mismatch on linux. Fix later.
// show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(), this);
@@ -204,6 +211,23 @@ void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) {
gtk_widget_set_sensitive(widget, enabled);
}
+bool BrowserToolbarGtk::IsCommandEnabled(int command_id) const {
+ return browser_->command_updater()->IsCommandEnabled(command_id);
+}
+
+bool BrowserToolbarGtk::IsItemChecked(int id) const {
+ if (!profile_)
+ return false;
+ if (id == IDC_SHOW_BOOKMARK_BAR)
+ return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
+ // TODO(port): Fix this when we get some items that want checking!
+ return false;
+}
+
+void BrowserToolbarGtk::ExecuteCommand(int id) {
+ browser_->ExecuteCommand(id);
+}
+
void BrowserToolbarGtk::SetProfile(Profile* profile) {
if (profile == profile_)
return;
@@ -217,23 +241,29 @@ void BrowserToolbarGtk::SetProfile(Profile* profile) {
// TODO(port): This needs to deal with our styled pixmaps.
BrowserToolbarGtk::CustomDrawButton* BrowserToolbarGtk::BuildToolbarButton(
const std::string& filename,
- const std::wstring& localized_tooltip) {
+ const std::wstring& localized_tooltip,
+ bool menu_button) {
CustomDrawButton* button = new CustomDrawButton(filename);
// TODO(erg): Mismatch between wstring and string.
// gtk_tooltips_set_tip(GTK_TOOLTIPS(toolbar_tooltips_),
// GTK_WIDGET(back_),
// localized_tooltip, localized_tooltip);
- g_signal_connect(G_OBJECT(button->widget()), "clicked",
- G_CALLBACK(ButtonClickCallback), this);
- gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0);
+ if (menu_button) {
+ g_signal_connect(G_OBJECT(button->widget()), "button_press_event",
+ G_CALLBACK(OnMenuButtonPressEvent), this);
+ } else {
+ g_signal_connect(G_OBJECT(button->widget()), "clicked",
+ G_CALLBACK(OnButtonClick), this);
+ }
+ gtk_box_pack_start(GTK_BOX(toolbar_), button->widget(), FALSE, FALSE, 0);
return button;
}
/* static */
-void BrowserToolbarGtk::ButtonClickCallback(GtkWidget* button,
- BrowserToolbarGtk* toolbar) {
+void BrowserToolbarGtk::OnButtonClick(GtkWidget* button,
+ BrowserToolbarGtk* toolbar) {
int tag = -1;
if (button == toolbar->back_->widget())
tag = IDC_BACK;
@@ -246,9 +276,43 @@ void BrowserToolbarGtk::ButtonClickCallback(GtkWidget* button,
else if (button == toolbar->star_->widget())
tag = IDC_STAR;
- if (tag != -1) {
- toolbar->browser_->ExecuteCommand(tag);
- } else {
- // TODO(erg): The menu buttons are special; they need to spawn menus.
+ DCHECK(tag != -1) << "Impossible button click callback";
+ toolbar->browser_->ExecuteCommand(tag);
+}
+
+/* static */
+gint BrowserToolbarGtk::OnMenuButtonPressEvent(GtkWidget* button,
+ GdkEvent* event,
+ BrowserToolbarGtk* toolbar) {
+ if (event->type == GDK_BUTTON_PRESS) {
+ GdkEventButton* event_button = reinterpret_cast<GdkEventButton*>(event);
+ if (event_button->button == 1) {
+ // We have a button press we should respond to.
+ if (button == toolbar->page_menu_button_->widget()) {
+ toolbar->RunPageMenu(event);
+ return TRUE;
+ } else if (button == toolbar->app_menu_button_->widget()) {
+ toolbar->RunAppMenu(event);
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+void BrowserToolbarGtk::RunPageMenu(GdkEvent* button_press_event) {
+ if (page_menu_ == NULL) {
+ page_menu_.reset(new MenuGtk(this, GetStandardPageMenu()));
}
+
+ page_menu_->Popup(page_menu_button_->widget(), button_press_event);
+}
+
+void BrowserToolbarGtk::RunAppMenu(GdkEvent* button_press_event) {
+ if (app_menu_ == NULL) {
+ app_menu_.reset(new MenuGtk(this, GetStandardAppMenu()));
+ }
+
+ app_menu_->Popup(app_menu_button_->widget(), button_press_event);
}

Powered by Google App Engine
This is Rietveld 408576698