| 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 ead0b18edf60f39eacc5e5d487fb8723ffa62271..177eaefd5e39836be70da4fbeaee2258db6dc248 100644
|
| --- a/chrome/browser/gtk/info_bubble_gtk.h
|
| +++ b/chrome/browser/gtk/info_bubble_gtk.h
|
| @@ -1,215 +1,12 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| // 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_
|
| #pragma once
|
|
|
| -#include <gtk/gtk.h>
|
| -#include <vector>
|
| -
|
| -#include "app/gtk_signal.h"
|
| -#include "app/gtk_signal_registrar.h"
|
| -#include "base/basictypes.h"
|
| -#include "chrome/common/notification_observer.h"
|
| -#include "chrome/common/notification_registrar.h"
|
| -#include "gfx/point.h"
|
| -#include "gfx/rect.h"
|
| -
|
| -class GtkThemeProvider;
|
| -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.
|
| -
|
| - protected:
|
| - virtual ~InfoBubbleGtkDelegate() {}
|
| -};
|
| -
|
| -class InfoBubbleGtk : public NotificationObserver {
|
| - public:
|
| - // Where should the arrow be placed relative to the bubble?
|
| - enum ArrowLocationGtk {
|
| - // TODO(derat): Support placing arrows on the bottoms of the bubbles.
|
| - ARROW_LOCATION_TOP_LEFT,
|
| - ARROW_LOCATION_TOP_RIGHT,
|
| - };
|
| -
|
| - // Show an InfoBubble, pointing at the area |rect| (in coordinates relative to
|
| - // |anchor_widget|'s origin). An info bubble will try to fit on the screen,
|
| - // so it can point to any edge of |rect|. If |rect| is NULL, the widget's
|
| - // entire area will be used. The bubble will host the |content|
|
| - // widget. Its arrow will be drawn at |arrow_location| if possible. The
|
| - // |delegate| will be notified when the bubble is closed. The bubble will
|
| - // perform an X grab of the pointer and keyboard, and will close itself if a
|
| - // click is received outside of the bubble.
|
| - static InfoBubbleGtk* Show(GtkWidget* anchor_widget,
|
| - const gfx::Rect* rect,
|
| - GtkWidget* content,
|
| - ArrowLocationGtk arrow_location,
|
| - bool match_system_theme,
|
| - bool grab_input,
|
| - GtkThemeProvider* provider,
|
| - 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();
|
| -
|
| - // NotificationObserver implementation.
|
| - virtual void Observe(NotificationType type,
|
| - const NotificationSource& source,
|
| - const NotificationDetails& details);
|
| -
|
| - // If the content contains widgets that can steal our pointer and keyboard
|
| - // grabs (e.g. GtkComboBox), this method should be called after a widget
|
| - // releases the grabs so we can reacquire them. Note that this causes a race
|
| - // condition; another client could grab them before we do (ideally, GDK would
|
| - // transfer the grabs back to us when the widget releases them). The window
|
| - // is small, though, and the worst-case scenario for this seems to just be
|
| - // that the content's widgets will appear inactive even after the user clicks
|
| - // in them.
|
| - void HandlePointerAndKeyboardUngrabbedByContent();
|
| -
|
| - private:
|
| - enum FrameType {
|
| - FRAME_MASK,
|
| - FRAME_STROKE,
|
| - };
|
| -
|
| - explicit InfoBubbleGtk(GtkThemeProvider* provider, bool match_system_theme);
|
| - virtual ~InfoBubbleGtk();
|
| -
|
| - // Creates the InfoBubble.
|
| - void Init(GtkWidget* anchor_widget,
|
| - const gfx::Rect* rect,
|
| - GtkWidget* content,
|
| - ArrowLocationGtk arrow_location,
|
| - bool grab_input);
|
| -
|
| - // Make the points for our polygon frame, either for fill (the mask), or for
|
| - // when we stroke the border.
|
| - static std::vector<GdkPoint> MakeFramePolygonPoints(
|
| - ArrowLocationGtk arrow_location,
|
| - int width,
|
| - int height,
|
| - FrameType type);
|
| -
|
| - // Get the location where the arrow should be placed (which is a function of
|
| - // the preferred location and of the direction that the bubble should be
|
| - // facing to fit onscreen). |arrow_x| is the X component in screen
|
| - // coordinates of the point at which the bubble's arrow should be aimed, and
|
| - // |width| is the bubble's width.
|
| - static ArrowLocationGtk GetArrowLocation(
|
| - ArrowLocationGtk preferred_location, int arrow_x, int width);
|
| -
|
| - // Updates |arrow_location_| based on the toplevel window's current position
|
| - // and the bubble's size. If the |force_move_and_reshape| is true or the
|
| - // location changes, moves and reshapes the window and returns true.
|
| - bool UpdateArrowLocation(bool force_move_and_reshape);
|
| -
|
| - // Reshapes the window and updates |mask_region_|.
|
| - void UpdateWindowShape();
|
| -
|
| - // Calculate the current screen position for the bubble's window (per
|
| - // |toplevel_window_|'s position as of its most-recent ConfigureNotify event
|
| - // and |rect_|) and move it there.
|
| - void MoveWindow();
|
| -
|
| - // Restack the bubble's window directly above |toplevel_window_|.
|
| - void StackWindow();
|
| -
|
| - // Sets the delegate.
|
| - void set_delegate(InfoBubbleGtkDelegate* delegate) { delegate_ = delegate; }
|
| -
|
| - // Grab (in the X sense) the pointer and keyboard. This is needed to make
|
| - // sure that we have the input focus.
|
| - void GrabPointerAndKeyboard();
|
| -
|
| - CHROMEG_CALLBACK_3(InfoBubbleGtk, gboolean, OnGtkAccelerator, GtkAccelGroup*,
|
| - GObject*, guint, GdkModifierType);
|
| -
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, gboolean, OnExpose, GdkEventExpose*);
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, void, OnSizeAllocate, GtkAllocation*);
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, gboolean, OnButtonPress, GdkEventButton*);
|
| - CHROMEGTK_CALLBACK_0(InfoBubbleGtk, gboolean, OnDestroy);
|
| - CHROMEGTK_CALLBACK_0(InfoBubbleGtk, void, OnHide);
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, gboolean, OnToplevelConfigure,
|
| - GdkEventConfigure*);
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, gboolean, OnToplevelUnmap, GdkEvent*);
|
| - CHROMEGTK_CALLBACK_1(InfoBubbleGtk, void, OnAnchorAllocate, GtkAllocation*);
|
| -
|
| - // 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_;
|
| -
|
| - // Provides colors and stuff.
|
| - GtkThemeProvider* theme_provider_;
|
| -
|
| - // The accel group attached to |window_|, to handle closing with escape.
|
| - GtkAccelGroup* accel_group_;
|
| -
|
| - // The window for which we're being shown (and to which |rect_| is relative).
|
| - // Note that it's possible for |toplevel_window_| to be NULL if the
|
| - // window is destroyed before this object is destroyed, so it's important
|
| - // to check for that case.
|
| - GtkWindow* toplevel_window_;
|
| -
|
| - // The widget that we use to relatively position the popup window.
|
| - GtkWidget* anchor_widget_;
|
| -
|
| - // Provides an offset from |anchor_widget_|'s origin for MoveWindow() to
|
| - // use.
|
| - gfx::Rect rect_;
|
| -
|
| - // The current shape of |window_| (used to test whether clicks fall in it or
|
| - // not).
|
| - GdkRegion* mask_region_;
|
| -
|
| - // Where would we prefer for the arrow be drawn relative to the bubble, and
|
| - // where is it currently drawn?
|
| - ArrowLocationGtk preferred_arrow_location_;
|
| - ArrowLocationGtk current_arrow_location_;
|
| -
|
| - // Whether the background should match the system theme, when the system theme
|
| - // is being used. For example, the bookmark bubble does, but extension popups
|
| - // do not.
|
| - bool match_system_theme_;
|
| -
|
| - // If true, the popup owns all X input for the duration of its existence.
|
| - // This will usually be true, the exception being when inspecting extension
|
| - // popups with dev tools.
|
| - bool grab_input_;
|
| -
|
| - bool closed_by_escape_;
|
| -
|
| - NotificationRegistrar registrar_;
|
| -
|
| - GtkSignalRegistrar signals_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(InfoBubbleGtk);
|
| -};
|
| +#include "chrome/browser/ui/gtk/info_bubble_gtk.h"
|
| +// TODO(msw): remove this file once all includes have been updated.
|
|
|
| #endif // CHROME_BROWSER_GTK_INFO_BUBBLE_GTK_H_
|
|
|