OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_BROWSER_UI_GTK_EXTENSIONS_NATIVE_APP_WINDOW_GTK_H_ | |
6 #define CHROME_BROWSER_UI_GTK_EXTENSIONS_NATIVE_APP_WINDOW_GTK_H_ | |
7 | |
8 #include <gtk/gtk.h> | |
9 | |
10 #include "apps/shell_window.h" | |
11 #include "base/observer_list.h" | |
12 #include "base/timer/timer.h" | |
13 #include "chrome/browser/ui/extensions/native_app_window.h" | |
14 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h" | |
15 #include "third_party/skia/include/core/SkRegion.h" | |
16 #include "ui/base/gtk/gtk_signal.h" | |
17 #include "ui/base/x/active_window_watcher_x_observer.h" | |
18 #include "ui/base/x/x11_atom_cache.h" | |
19 #include "ui/gfx/rect.h" | |
20 | |
21 class ExtensionKeybindingRegistryGtk; | |
22 class Profile; | |
23 | |
24 namespace extensions { | |
25 class Extension; | |
26 } | |
27 | |
28 class NativeAppWindowGtk : public NativeAppWindow, | |
29 public ExtensionViewGtk::Container, | |
30 public ui::ActiveWindowWatcherXObserver { | |
31 public: | |
32 NativeAppWindowGtk(apps::ShellWindow* shell_window, | |
33 const apps::ShellWindow::CreateParams& params); | |
34 | |
35 // ui::BaseWindow implementation. | |
36 virtual bool IsActive() const OVERRIDE; | |
37 virtual bool IsMaximized() const OVERRIDE; | |
38 virtual bool IsMinimized() const OVERRIDE; | |
39 virtual bool IsFullscreen() const OVERRIDE; | |
40 virtual bool IsDetached() const OVERRIDE; | |
41 virtual gfx::NativeWindow GetNativeWindow() OVERRIDE; | |
42 virtual gfx::Rect GetRestoredBounds() const OVERRIDE; | |
43 virtual ui::WindowShowState GetRestoredState() const OVERRIDE; | |
44 virtual gfx::Rect GetBounds() const OVERRIDE; | |
45 virtual void Show() OVERRIDE; | |
46 virtual void ShowInactive() OVERRIDE; | |
47 virtual void Hide() OVERRIDE; | |
48 virtual void Close() OVERRIDE; | |
49 virtual void Activate() OVERRIDE; | |
50 virtual void Deactivate() OVERRIDE; | |
51 virtual void Maximize() OVERRIDE; | |
52 virtual void Minimize() OVERRIDE; | |
53 virtual void Restore() OVERRIDE; | |
54 virtual void SetBounds(const gfx::Rect& bounds) OVERRIDE; | |
55 virtual void FlashFrame(bool flash) OVERRIDE; | |
56 virtual bool IsAlwaysOnTop() const OVERRIDE; | |
57 | |
58 // ActiveWindowWatcherXObserver implementation. | |
59 virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE; | |
60 | |
61 private: | |
62 // NativeAppWindow implementation. | |
63 virtual void SetFullscreen(bool fullscreen) OVERRIDE; | |
64 virtual bool IsFullscreenOrPending() const OVERRIDE; | |
65 virtual void UpdateWindowIcon() OVERRIDE; | |
66 virtual void UpdateWindowTitle() OVERRIDE; | |
67 virtual void HandleKeyboardEvent( | |
68 const content::NativeWebKeyboardEvent& event) OVERRIDE; | |
69 virtual void UpdateDraggableRegions( | |
70 const std::vector<extensions::DraggableRegion>& regions) OVERRIDE; | |
71 virtual void RenderViewHostChanged() OVERRIDE; | |
72 virtual gfx::Insets GetFrameInsets() const OVERRIDE; | |
73 | |
74 // web_modal::WebContentsModalDialogHost implementation. | |
75 virtual gfx::NativeView GetHostView() const OVERRIDE; | |
76 virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE; | |
77 virtual void AddObserver( | |
78 web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE; | |
79 virtual void RemoveObserver( | |
80 web_modal::WebContentsModalDialogHostObserver* observer) OVERRIDE; | |
81 | |
82 content::WebContents* web_contents() const { | |
83 return shell_window_->web_contents(); | |
84 } | |
85 const extensions::Extension* extension() const { | |
86 return shell_window_->extension(); | |
87 } | |
88 | |
89 virtual ~NativeAppWindowGtk(); | |
90 | |
91 // If the point (|x|, |y|) is within the resize border area of the window, | |
92 // returns true and sets |edge| to the appropriate GdkWindowEdge value. | |
93 // Otherwise, returns false. | |
94 bool GetWindowEdge(int x, int y, GdkWindowEdge* edge); | |
95 | |
96 CHROMEGTK_CALLBACK_1(NativeAppWindowGtk, gboolean, OnMainWindowDeleteEvent, | |
97 GdkEvent*); | |
98 CHROMEGTK_CALLBACK_1(NativeAppWindowGtk, gboolean, OnConfigure, | |
99 GdkEventConfigure*); | |
100 CHROMEGTK_CALLBACK_1(NativeAppWindowGtk, gboolean, OnWindowState, | |
101 GdkEventWindowState*); | |
102 CHROMEGTK_CALLBACK_1(NativeAppWindowGtk, gboolean, OnMouseMoveEvent, | |
103 GdkEventMotion*); | |
104 CHROMEGTK_CALLBACK_1(NativeAppWindowGtk, gboolean, OnButtonPress, | |
105 GdkEventButton*); | |
106 // Callback for PropertyChange XEvents. | |
107 CHROMEG_CALLBACK_1(NativeAppWindowGtk, GdkFilterReturn, | |
108 OnXEvent, GdkXEvent*, GdkEvent*); | |
109 | |
110 void OnConfigureDebounced(); | |
111 | |
112 apps::ShellWindow* shell_window_; // weak - ShellWindow owns NativeAppWindow. | |
113 | |
114 GtkWindow* window_; | |
115 GdkWindowState state_; | |
116 | |
117 // True if the window manager thinks the window is active. Not all window | |
118 // managers keep track of this state (_NET_ACTIVE_WINDOW), in which case | |
119 // this will always be true. | |
120 bool is_active_; | |
121 | |
122 // The position and size of the current window. | |
123 gfx::Rect bounds_; | |
124 | |
125 // The position and size of the non-maximized, non-fullscreen window. | |
126 gfx::Rect restored_bounds_; | |
127 | |
128 // True if the RVH is in fullscreen mode. The window may not actually be in | |
129 // fullscreen, however: some WMs don't support fullscreen. | |
130 bool content_thinks_its_fullscreen_; | |
131 | |
132 // The region is treated as title bar, can be dragged to move | |
133 // and double clicked to maximize. | |
134 scoped_ptr<SkRegion> draggable_region_; | |
135 | |
136 // If true, don't call gdk_window_raise() when we get a click in the title | |
137 // bar or window border. This is to work around a compiz bug. | |
138 bool suppress_window_raise_; | |
139 | |
140 // True if the window shows without frame. | |
141 bool frameless_; | |
142 | |
143 // True if the window should be resizable by the user. | |
144 bool resizable_; | |
145 | |
146 // The current window cursor. We set it to a resize cursor when over the | |
147 // custom frame border. We set it to NULL if we want the default cursor. | |
148 GdkCursor* frame_cursor_; | |
149 | |
150 // The timer used to save the window position for session restore. | |
151 base::OneShotTimer<NativeAppWindowGtk> window_configure_debounce_timer_; | |
152 | |
153 // The Extension Keybinding Registry responsible for registering listeners for | |
154 // accelerators that are sent to the window, that are destined to be turned | |
155 // into events and sent to the extension. | |
156 scoped_ptr<ExtensionKeybindingRegistryGtk> extension_keybinding_registry_; | |
157 | |
158 // Observers to be notified when any web contents modal dialog requires | |
159 // updating its dimensions. | |
160 ObserverList<web_modal::WebContentsModalDialogHostObserver> observer_list_; | |
161 | |
162 ui::X11AtomCache atom_cache_; | |
163 | |
164 // True if we listen for the XEvent. | |
165 bool is_x_event_listened_; | |
166 | |
167 DISALLOW_COPY_AND_ASSIGN(NativeAppWindowGtk); | |
168 }; | |
169 | |
170 #endif // CHROME_BROWSER_UI_GTK_EXTENSIONS_NATIVE_APP_WINDOW_GTK_H_ | |
OLD | NEW |