diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-10 01:05:55 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-10 01:05:55 +0000 |
commit | d550b676e7acb035b1a118d92a9d3b5be12dc9d5 (patch) | |
tree | ab102a0d61e8534cd85fdcb161e7c79f2bcd6c5d /chrome/browser/gtk | |
parent | c711a2fb974353e43816626561ab6ec685e5ed31 (diff) | |
download | chromium_src-d550b676e7acb035b1a118d92a9d3b5be12dc9d5.zip chromium_src-d550b676e7acb035b1a118d92a9d3b5be12dc9d5.tar.gz chromium_src-d550b676e7acb035b1a118d92a9d3b5be12dc9d5.tar.bz2 |
GTK: Close extension popup when its browser window changes the focus widget.
BUG=29375
TEST=see bug
Review URL: http://codereview.chromium.org/594020
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38559 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/browser_actions_toolbar_gtk.cc | 30 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_actions_toolbar_gtk.h | 17 | ||||
-rw-r--r-- | chrome/browser/gtk/extension_popup_gtk.h | 18 |
3 files changed, 57 insertions, 8 deletions
diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc index 70034e8..ef115be 100644 --- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc @@ -277,9 +277,20 @@ BrowserActionsToolbarGtk::BrowserActionsToolbarGtk(Browser* browser) model_->AddObserver(this); SetupDrags(); CreateAllButtons(); + + // We want to connect to "set-focus" on the toplevel window; we have to wait + // until we are added to a toplevel window to do so. + g_signal_connect(widget(), "hierarchy-changed", + G_CALLBACK(OnHierarchyChangedThunk), this); } BrowserActionsToolbarGtk::~BrowserActionsToolbarGtk() { + GtkWidget* toplevel = gtk_widget_get_toplevel(widget()); + if (toplevel) { + g_signal_handlers_disconnect_by_func( + toplevel, reinterpret_cast<gpointer>(OnSetFocusThunk), this); + } + if (model_) model_->RemoveObserver(this); hbox_.Destroy(); @@ -363,6 +374,12 @@ void BrowserActionsToolbarGtk::UpdateVisibility() { gtk_widget_show(widget()); } +void BrowserActionsToolbarGtk::HidePopup() { + ExtensionPopupGtk* popup = ExtensionPopupGtk::get_current_extension_popup(); + if (popup) + popup->DestroyPopup(); +} + void BrowserActionsToolbarGtk::BrowserActionAdded(Extension* extension, int index) { CreateButtonForExtension(extension, index); @@ -439,3 +456,16 @@ gboolean BrowserActionsToolbarGtk::OnDragFailed(GtkWidget* widget, // several seconds later. return TRUE; } + +void BrowserActionsToolbarGtk::OnHierarchyChanged() { + GtkWidget* toplevel = gtk_widget_get_toplevel(widget()); + if (!GTK_WIDGET_TOPLEVEL(toplevel)) + return; + + g_signal_connect(toplevel, "set-focus", G_CALLBACK(OnSetFocusThunk), this); +} + +void BrowserActionsToolbarGtk::OnSetFocus() { + // The focus of the parent window has changed. Close the popup. + HidePopup(); +} diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.h b/chrome/browser/gtk/browser_actions_toolbar_gtk.h index 8b96d58d..39daf78 100644 --- a/chrome/browser/gtk/browser_actions_toolbar_gtk.h +++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.h @@ -66,6 +66,9 @@ class BrowserActionsToolbarGtk : public ExtensionToolbarModel::Observer { // to show. void UpdateVisibility(); + // Hide the extension popup, if any. + void HidePopup(); + // ExtensionToolbarModel::Observer implementation. virtual void BrowserActionAdded(Extension* extension, int index); virtual void BrowserActionRemoved(Extension* extension); @@ -101,6 +104,20 @@ class BrowserActionsToolbarGtk : public ExtensionToolbarModel::Observer { GdkDragContext* drag_context, GtkDragResult result); + static void OnHierarchyChangedThunk(GtkWidget* widget, + GtkWidget* previous_toplevel, + BrowserActionsToolbarGtk* toolbar) { + toolbar->OnHierarchyChanged(); + } + void OnHierarchyChanged(); + + static void OnSetFocusThunk(GtkWindow* window, + GtkWidget* widget, + BrowserActionsToolbarGtk* toolbar) { + toolbar->OnSetFocus(); + } + void OnSetFocus(); + Browser* browser_; Profile* profile_; diff --git a/chrome/browser/gtk/extension_popup_gtk.h b/chrome/browser/gtk/extension_popup_gtk.h index 69e8780..206feb3 100644 --- a/chrome/browser/gtk/extension_popup_gtk.h +++ b/chrome/browser/gtk/extension_popup_gtk.h @@ -36,15 +36,20 @@ class ExtensionPopupGtk : public NotificationObserver, virtual void InfoBubbleClosing(InfoBubbleGtk* bubble, bool closed_by_escape); - private: - // Shows the popup widget. Called after loading completes. - void ShowPopup(); - // Destroys the popup widget. This will in turn destroy us since we delete // ourselves when the info bubble closes. Returns true if we successfully // closed the bubble. bool DestroyPopup(); + // Get the currently showing extension popup, or NULL. + static ExtensionPopupGtk* get_current_extension_popup() { + return current_extension_popup_; + } + + private: + // Shows the popup widget. Called after loading completes. + void ShowPopup(); + Browser* browser_; InfoBubbleGtk* bubble_; @@ -58,12 +63,9 @@ class ExtensionPopupGtk : public NotificationObserver, NotificationRegistrar registrar_; - // Used for testing. --------------------------------------------------------- - static ExtensionPopupGtk* get_current_extension_popup() { - return current_extension_popup_; - } static ExtensionPopupGtk* current_extension_popup_; + // Used for testing. --------------------------------------------------------- gfx::Rect GetViewBounds(); friend class BrowserActionTestUtil; |