Index: chrome/browser/gtk/info_bubble_gtk.h |
diff --git a/chrome/browser/gtk/info_bubble_gtk.h b/chrome/browser/gtk/info_bubble_gtk.h |
index d5a3b7b8d4d02172b433352d3661c47b674ef31d..e88946c6ceec81119e7624d784953732f51d405f 100644 |
--- a/chrome/browser/gtk/info_bubble_gtk.h |
+++ b/chrome/browser/gtk/info_bubble_gtk.h |
@@ -2,34 +2,62 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+// This is the GTK implementation of InfoBubbles. InfoBubbles are like |
+// dialogs, but they point to a given element on the screen. You should call |
+// InfoBubbleGtk::Show, which will create and display a bubble. The object is |
+// self deleting, when the bubble is closed, you will be notified via |
+// InfoBubbleGtkDelegate::InfoBubbleClosing(). Then the widgets and the |
+// underlying object will be destroyed. You can also close and destroy the |
+// bubble by calling Close(). |
+ |
#ifndef CHROME_BROWSER_GTK_INFO_BUBBLE_GTK_H_ |
#define CHROME_BROWSER_GTK_INFO_BUBBLE_GTK_H_ |
-#include "base/basictypes.h" |
- |
#include <gtk/gtk.h> |
+#include "base/basictypes.h" |
+ |
+class InfoBubbleGtk; |
namespace gfx { |
class Rect; |
} |
+class InfoBubbleGtkDelegate { |
+ public: |
+ // Called when the InfoBubble is closing and is about to be deleted. |
+ // |closed_by_escape| is true if the close is the result of pressing escape. |
+ virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble, |
+ bool closed_by_escape) = 0; |
+ |
+ // NOTE: The Views interface has CloseOnEscape, except I can't find a place |
+ // where it ever returns false, so we always allow you to close via escape. |
+}; |
+ |
class InfoBubbleGtk { |
public: |
// Show an InfoBubble, pointing at the area |rect| (in screen coordinates). |
// An infobubble will try to fit on the screen, so it can point to any edge |
- // of |rect|. The bubble will host |widget| as the content. |
- static InfoBubbleGtk* Show(const gfx::Rect& rect, GtkWidget* content); |
+ // of |rect|. The bubble will host the |content| widget. The |delegate| |
+ // will be notified when things like closing are happening. |
+ static InfoBubbleGtk* Show(const gfx::Rect& rect, |
+ GtkWidget* content, |
+ InfoBubbleGtkDelegate* delegate); |
+ |
+ // Close the bubble if it's open. This will delete the widgets and object, |
+ // so you shouldn't hold a InfoBubbleGtk pointer after calling Close(). |
+ void Close() { Close(false); } |
+ private: |
InfoBubbleGtk(); |
virtual ~InfoBubbleGtk(); |
- void Close(); |
- |
- private: |
// Creates the InfoBubble. |
void Init(const gfx::Rect& rect, GtkWidget* content); |
- // Closes the window notifying the delegate. |closed_by_escape| is true if |
+ // Sets the delegate. |
+ void set_delegate(InfoBubbleGtkDelegate* delegate) { delegate_ = delegate; } |
+ |
+ // Closes the window and notifies the delegate. |closed_by_escape| is true if |
// the close is the result of pressing escape. |
void Close(bool closed_by_escape); |
@@ -56,16 +84,24 @@ class InfoBubbleGtk { |
} |
gboolean HandleButtonRelease(GdkEventButton* event); |
- // Our GtkWindow popup window. |
+ static gboolean HandleDestroyThunk(GtkWidget* widget, |
+ gpointer userdata) { |
+ return reinterpret_cast<InfoBubbleGtk*>(userdata)-> |
+ HandleDestroy(); |
+ } |
+ gboolean HandleDestroy(); |
+ |
+ // The caller supplied delegate, can be NULL. |
+ InfoBubbleGtkDelegate* delegate_; |
+ |
+ // Our GtkWindow popup window, we don't technically "own" the widget, since |
+ // it deletes us when it is destroyed. |
GtkWidget* window_; |
// Where we want our window to be positioned on the screen. |
int screen_x_; |
int screen_y_; |
- // Have we been closed? |
- bool closed_; |
- |
DISALLOW_COPY_AND_ASSIGN(InfoBubbleGtk); |
}; |