Index: chrome/browser/gtk/status_bubble_gtk.h |
diff --git a/chrome/browser/gtk/status_bubble_gtk.h b/chrome/browser/gtk/status_bubble_gtk.h |
index 83488f216ddcb55fa02150acf3df2c7929f21fee..db8044cbea87d6ff1485927ce4455226e1f81990 100644 |
--- a/chrome/browser/gtk/status_bubble_gtk.h |
+++ b/chrome/browser/gtk/status_bubble_gtk.h |
@@ -5,17 +5,23 @@ |
#ifndef CHROME_BROWSER_GTK_STATUS_BUBBLE_GTK_H_ |
#define CHROME_BROWSER_GTK_STATUS_BUBBLE_GTK_H_ |
-#include <string> |
- |
#include <gtk/gtk.h> |
+#include <string> |
+ |
+#include "base/scoped_ptr.h" |
#include "chrome/browser/status_bubble.h" |
+#include "chrome/common/owned_widget_gtk.h" |
class GURL; |
+// GTK implementation of StatusBubble. Unlike Windows, our status bubble |
+// doesn't have the nice leave-the-window effect since we can't rely on the |
+// window manager to not try to be "helpful" and center our popups, etc. |
+// We therefore position it absolutely in a GtkFixed, that we don't own. |
class StatusBubbleGtk : public StatusBubble { |
public: |
- StatusBubbleGtk(GtkWindow* parent); |
+ StatusBubbleGtk(); |
virtual ~StatusBubbleGtk(); |
// StatusBubble implementation. |
@@ -26,22 +32,42 @@ class StatusBubbleGtk : public StatusBubble { |
void SetStatus(const std::string& status_utf8); |
+ // Notification from our parent GtkFixed about its size. |allocation| is the |
+ // size of our |parent| GtkFixed, and we use it to position our status bubble |
+ // directly on top of the current render view. |
+ void SetParentAllocation(GtkWidget* parent, GtkAllocation* allocation); |
+ |
+ // Top of the widget hierarchy for a StatusBubble. This top level widget is |
+ // guarenteed to have its gtk_widget_name set to "status-bubble" for |
+ // identification. |
+ GtkWidget* widget() { return container_.get(); } |
+ |
private: |
- // Construct the window/widget. |
- void Create(); |
+ // Sets the status bubble's location in the parent GtkFixed, shows the widget |
+ // and makes sure that the status bubble has the highest z-order. |
+ void Show(); |
- // Reposition ourselves atop our parent window. |
- void Reposition(); |
+ // Builds the widgets, containers, etc. |
+ void InitWidgets(); |
- // The window we display on top of. |
- GtkWindow* parent_; |
+ // An ad hoc, informally-specified, bug-ridden, slow implementation of half |
+ // of GTK's requisition/allocation system. We use this to position the status |
+ // bubble on top of our parent GtkFixed. |
+ void SetStatusBubbleSize(); |
- // The top-level (popup) window we own. |
- // NULL when we're not showing. |
- GtkWidget* window_; |
+ // A GtkAlignment that is the child of |slide_widget_|. |
+ OwnedWidgetGtk container_; |
- // The GtkLabel holding the text./ |
+ // The GtkLabel holding the text. |
GtkWidget* label_; |
+ |
+ // Our parent GtkFixed. (We don't own this; we only keep a reference as we |
+ // set our own size by notifying |parent_| of our desired size.) |
+ GtkWidget* parent_; |
+ |
+ // |parent_|'s GtkAllocation. We make sure that |container_| lives along the |
+ // bottom of this and doesn't protrude. |
+ GtkAllocation parent_allocation_; |
}; |
-#endif // #ifndef CHROME_BROWSER_GTK_STATUS_BUBBLE_GTK_H_ |
+#endif // CHROME_BROWSER_GTK_STATUS_BUBBLE_GTK_H_ |