| 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);
|
| };
|
|
|
|
|