summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-10 01:05:55 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-10 01:05:55 +0000
commitd550b676e7acb035b1a118d92a9d3b5be12dc9d5 (patch)
treeab102a0d61e8534cd85fdcb161e7c79f2bcd6c5d /chrome/browser/gtk
parentc711a2fb974353e43816626561ab6ec685e5ed31 (diff)
downloadchromium_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.cc30
-rw-r--r--chrome/browser/gtk/browser_actions_toolbar_gtk.h17
-rw-r--r--chrome/browser/gtk/extension_popup_gtk.h18
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;