| Index: chrome/browser/ui/panels/panel_gtk.h
|
| diff --git a/chrome/browser/ui/panels/panel_gtk.h b/chrome/browser/ui/panels/panel_gtk.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aa806667db92fa574aad8a2bff755896f4609508
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/panels/panel_gtk.h
|
| @@ -0,0 +1,235 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#ifndef CHROME_BROWSER_UI_PANELS_PANEL_GTK_H_
|
| +#define CHROME_BROWSER_UI_PANELS_PANEL_GTK_H_
|
| +
|
| +#include <gtk/gtk.h>
|
| +#include <map>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/timer.h"
|
| +#include "chrome/browser/ui/panels/native_panel.h"
|
| +#include "ui/base/animation/animation_delegate.h"
|
| +#include "ui/base/gtk/gtk_signal.h"
|
| +#include "ui/base/x/active_window_watcher_x_observer.h"
|
| +#include "ui/gfx/rect.h"
|
| +
|
| +class Panel;
|
| +class PanelBoundsAnimation;
|
| +class PanelTitlebarGtk;
|
| +class PanelDragGtk;
|
| +class GtkNativePanelTesting;
|
| +
|
| +namespace gfx {
|
| +class Image;
|
| +}
|
| +
|
| +// An implementation of the native panel in GTK.
|
| +class PanelGtk : public NativePanel,
|
| + public ui::ActiveWindowWatcherXObserver,
|
| + public ui::AnimationDelegate {
|
| + public:
|
| + enum PaintState {
|
| + PAINT_AS_ACTIVE,
|
| + PAINT_AS_INACTIVE,
|
| + PAINT_AS_MINIMIZED,
|
| + PAINT_FOR_ATTENTION
|
| + };
|
| +
|
| + PanelGtk(Panel* panel, const gfx::Rect& bounds);
|
| + virtual ~PanelGtk();
|
| +
|
| + void Init();
|
| +
|
| + // Overridden from NativePanel.
|
| + virtual void ShowPanel() OVERRIDE;
|
| + virtual void ShowPanelInactive() OVERRIDE;
|
| + virtual gfx::Rect GetPanelBounds() const OVERRIDE;
|
| + virtual void SetPanelBounds(const gfx::Rect& bounds) OVERRIDE;
|
| + virtual void SetPanelBoundsInstantly(const gfx::Rect& bounds) OVERRIDE;
|
| + virtual void ClosePanel() OVERRIDE;
|
| + virtual void ActivatePanel() OVERRIDE;
|
| + virtual void DeactivatePanel() OVERRIDE;
|
| + virtual bool IsPanelActive() const OVERRIDE;
|
| + virtual void PreventActivationByOS(bool prevent_activation) OVERRIDE;
|
| + virtual gfx::NativeWindow GetNativePanelHandle() OVERRIDE;
|
| + virtual void UpdatePanelTitleBar() OVERRIDE;
|
| + virtual void UpdatePanelLoadingAnimations(bool should_animate) OVERRIDE;
|
| + virtual FindBar* CreatePanelFindBar() OVERRIDE;
|
| + virtual void NotifyPanelOnUserChangedTheme() OVERRIDE;
|
| + virtual void PanelCut() OVERRIDE;
|
| + virtual void PanelCopy() OVERRIDE;
|
| + virtual void PanelPaste() OVERRIDE;
|
| + virtual void DrawAttention(bool draw_attention) OVERRIDE;
|
| + virtual bool IsDrawingAttention() const OVERRIDE;
|
| + virtual bool PreHandlePanelKeyboardEvent(
|
| + const content::NativeWebKeyboardEvent& event,
|
| + bool* is_keyboard_shortcut) OVERRIDE;
|
| + virtual void HandlePanelKeyboardEvent(
|
| + const content::NativeWebKeyboardEvent& event) OVERRIDE;
|
| + virtual void FullScreenModeChanged(bool is_full_screen) OVERRIDE;
|
| + virtual void PanelExpansionStateChanging(
|
| + Panel::ExpansionState old_state,
|
| + Panel::ExpansionState new_state) OVERRIDE;
|
| + virtual void AttachWebContents(content::WebContents* contents) OVERRIDE;
|
| + virtual void DetachWebContents(content::WebContents* contents) OVERRIDE;
|
| + virtual Browser* GetPanelBrowser() const OVERRIDE;
|
| + // These sizes are in screen coordinates.
|
| + virtual gfx::Size WindowSizeFromContentSize(
|
| + const gfx::Size& content_size) const OVERRIDE;
|
| + virtual gfx::Size ContentSizeFromWindowSize(
|
| + const gfx::Size& window_size) const OVERRIDE;
|
| + virtual int TitleOnlyHeight() const OVERRIDE;
|
| + virtual void EnsurePanelFullyVisible() OVERRIDE;
|
| + virtual void SetPanelAlwaysOnTop(bool on_top) OVERRIDE;
|
| + virtual void EnableResizeByMouse(bool enable) OVERRIDE;
|
| + virtual void UpdatePanelMinimizeRestoreButtonVisibility() OVERRIDE;
|
| +
|
| + virtual NativePanelTesting* CreateNativePanelTesting() OVERRIDE;
|
| +
|
| + // Overridden from ActiveWindowWatcherXObserver.
|
| + virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
|
| +
|
| + bool UsingDefaultTheme() const;
|
| +
|
| + Panel* panel() const { return panel_.get(); }
|
| + PaintState paint_state() const { return paint_state_; }
|
| + PanelTitlebarGtk* titlebar() const { return titlebar_.get(); }
|
| +
|
| + private:
|
| + friend class GtkNativePanelTesting;
|
| +
|
| + // Applies our custom window shape with rounded top corners.
|
| + void UpdateWindowShape(int width, int height);
|
| +
|
| + // Checks to see if the mouse pointer at |x|, |y| is over the border of the
|
| + // custom frame (a spot that should trigger a window resize). Returns true if
|
| + // it should and sets |edge|.
|
| + bool GetWindowEdge(int x, int y, GdkWindowEdge* edge) const;
|
| +
|
| + // Connect/disconnect accelerators for keyboard shortcut support.
|
| + void ConnectAccelerators();
|
| + void DisconnectAccelerators();
|
| +
|
| + // Returns the image to paint the frame.
|
| + const gfx::Image* GetFrameBackground() const;
|
| + const gfx::Image* GetDefaultFrameBackground() const;
|
| + const gfx::Image* GetThemedFrameBackground() const;
|
| +
|
| + // Animation when panel is first shown.
|
| + void RevealPanel();
|
| +
|
| + void StartBoundsAnimation(const gfx::Rect& from_bounds,
|
| + const gfx::Rect& to_bounds);
|
| + bool IsAnimatingBounds() const;
|
| +
|
| + // Overridden from AnimationDelegate:
|
| + virtual void AnimationEnded(const ui::Animation* animation) OVERRIDE;
|
| + virtual void AnimationProgressed(const ui::Animation* animation) OVERRIDE;
|
| +
|
| + // Creates helper for handling drags if not already created.
|
| + void EnsureDragHelperCreated();
|
| +
|
| + void SetBoundsInternal(const gfx::Rect& bounds, bool animate);
|
| +
|
| + void LoadingAnimationCallback();
|
| +
|
| + // Returns the size of the window frame around the client content area.
|
| + gfx::Size GetNonClientFrameSize() const;
|
| +
|
| + // Invalidate window to force repaint.
|
| + void InvalidateWindow();
|
| +
|
| + // Callback for accelerator activation. |user_data| stores the command id
|
| + // of the matched accelerator.
|
| + static gboolean OnGtkAccelerator(GtkAccelGroup* accel_group,
|
| + GObject* acceleratable,
|
| + guint keyval,
|
| + GdkModifierType modifier,
|
| + void* user_data);
|
| +
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnMainWindowDeleteEvent,
|
| + GdkEvent*);
|
| + CHROMEGTK_CALLBACK_0(PanelGtk, void, OnMainWindowDestroy);
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnConfigure, GdkEventConfigure*);
|
| + // Callback for when the custom frame alignment needs to be redrawn.
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnCustomFrameExpose,
|
| + GdkEventExpose*);
|
| + // Key press event callback.
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnKeyPress, GdkEventKey*);
|
| + // Mouse move and button press callbacks. If mouse hits titlebar,
|
| + // the titlebar gets the event, else the window gets the button press.
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnMouseMoveEvent,
|
| + GdkEventMotion*);
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean, OnButtonPressEvent,
|
| + GdkEventButton*);
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean,
|
| + OnTitlebarButtonPressEvent, GdkEventButton*);
|
| + CHROMEGTK_CALLBACK_1(PanelGtk, gboolean,
|
| + OnTitlebarButtonReleaseEvent, GdkEventButton*);
|
| +
|
| + scoped_ptr<Panel> panel_;
|
| + gfx::Rect bounds_;
|
| +
|
| + // True after panel has been shown.
|
| + bool is_shown_;
|
| +
|
| + scoped_ptr<PanelDragGtk> drag_helper_;
|
| +
|
| + // The configure size of the current window, used to figure out whether to
|
| + // ignore later configure events. See OnConfigure() for more information.
|
| + gfx::Size configure_size_;
|
| +
|
| + // Indicates different painting state, active, drawing attention or else.
|
| + PaintState paint_state_;
|
| +
|
| + // Indicates that the panel is currently drawing attention.
|
| + bool is_drawing_attention_;
|
| +
|
| + // Used to animate the bounds change.
|
| + scoped_ptr<PanelBoundsAnimation> bounds_animator_;
|
| + gfx::Rect animation_start_bounds_;
|
| +
|
| + // This records the bounds set on the last animation progress notification.
|
| + // We need this for the case where a new bounds animation starts before the
|
| + // current one completes. In this case, we want to start the new animation
|
| + // from where the last one left.
|
| + gfx::Rect last_animation_progressed_bounds_;
|
| +
|
| + // The timer used to update frames for the Loading Animation.
|
| + base::RepeatingTimer<PanelGtk> loading_animation_timer_;
|
| +
|
| + // The current window cursor. We set it to a resize cursor when over the
|
| + // custom frame border. We set it to NULL if we want the default cursor.
|
| + GdkCursor* frame_cursor_;
|
| +
|
| + // True if the window manager thinks the window is active. Not all window
|
| + // managers keep track of this state (_NET_ACTIVE_WINDOW), in which case
|
| + // this will always be true.
|
| + bool is_active_;
|
| +
|
| + // Top level window.
|
| + GtkWindow* window_;
|
| + // GtkAlignment that holds the interior components of the chromium window.
|
| + // This is used to draw the custom frame border and content shadow.
|
| + GtkWidget* window_container_;
|
| + // VBox that holds everything (titlebar, web contents).
|
| + GtkWidget* window_vbox_;
|
| + // EventBox that holds web contents.
|
| + GtkWidget* render_area_event_box_;
|
| + // We insert and remove WebContents GtkWidgets into this expanded.
|
| + GtkWidget* contents_expanded_;
|
| +
|
| + // The accelerator group used to handle accelerators, owned by this object.
|
| + GtkAccelGroup* accel_group_;
|
| +
|
| + // The container for the titlebar.
|
| + scoped_ptr<PanelTitlebarGtk> titlebar_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PanelGtk);
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_UI_PANELS_PANEL_GTK_H_
|
|
|