| 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 WIN8_METRO_DRIVER_CHROME_APP_VIEW_ASH_H_ | |
| 6 #define WIN8_METRO_DRIVER_CHROME_APP_VIEW_ASH_H_ | |
| 7 | |
| 8 #include <stdint.h> | |
| 9 #include <windows.applicationmodel.core.h> | |
| 10 #include <windows.ui.core.h> | |
| 11 #include <windows.ui.input.h> | |
| 12 #include <windows.ui.viewmanagement.h> | |
| 13 | |
| 14 #include "base/memory/scoped_ptr.h" | |
| 15 #include "base/message_loop/message_loop.h" | |
| 16 #include "base/strings/string16.h" | |
| 17 #include "base/threading/thread.h" | |
| 18 #include "ipc/ipc_listener.h" | |
| 19 #include "ui/events/event_constants.h" | |
| 20 #include "win8/metro_driver/direct3d_helper.h" | |
| 21 #include "win8/metro_driver/ime/ime_popup_observer.h" | |
| 22 #include "win8/metro_driver/ime/input_source_observer.h" | |
| 23 #include "win8/metro_driver/ime/text_service_delegate.h" | |
| 24 | |
| 25 namespace base { | |
| 26 class FilePath; | |
| 27 } | |
| 28 | |
| 29 namespace IPC { | |
| 30 class Listener; | |
| 31 class ChannelProxy; | |
| 32 } | |
| 33 | |
| 34 namespace metro_driver { | |
| 35 class InputSource; | |
| 36 class TextService; | |
| 37 } | |
| 38 | |
| 39 namespace metro_viewer { | |
| 40 struct CharacterBounds; | |
| 41 struct UnderlineInfo; | |
| 42 } | |
| 43 | |
| 44 class OpenFilePickerSession; | |
| 45 class SaveFilePickerSession; | |
| 46 class FolderPickerSession; | |
| 47 class FilePickerSessionBase; | |
| 48 | |
| 49 struct MetroViewerHostMsg_SaveAsDialogParams; | |
| 50 | |
| 51 enum MetroTerminateMethod { | |
| 52 TERMINATE_USING_KEY_SEQUENCE = 1, | |
| 53 TERMINATE_USING_PROCESS_EXIT = 2, | |
| 54 }; | |
| 55 | |
| 56 class ChromeAppViewAsh | |
| 57 : public mswr::RuntimeClass<winapp::Core::IFrameworkView>, | |
| 58 public metro_driver::ImePopupObserver, | |
| 59 public metro_driver::InputSourceObserver, | |
| 60 public metro_driver::TextServiceDelegate { | |
| 61 public: | |
| 62 ChromeAppViewAsh(); | |
| 63 ~ChromeAppViewAsh() override; | |
| 64 | |
| 65 // IViewProvider overrides. | |
| 66 IFACEMETHOD(Initialize)(winapp::Core::ICoreApplicationView* view) override; | |
| 67 IFACEMETHOD(SetWindow)(winui::Core::ICoreWindow* window) override; | |
| 68 IFACEMETHOD(Load)(HSTRING entryPoint) override; | |
| 69 IFACEMETHOD(Run)() override; | |
| 70 IFACEMETHOD(Uninitialize)() override; | |
| 71 | |
| 72 // Helper function to unsnap the chrome metro app if it is snapped. | |
| 73 // Returns S_OK on success. | |
| 74 static HRESULT Unsnap(); | |
| 75 | |
| 76 void OnActivateDesktop(const base::FilePath& file_path, bool ash_exit); | |
| 77 void OnOpenURLOnDesktop(const base::FilePath& shortcut, | |
| 78 const base::string16& url); | |
| 79 void OnSetCursor(HCURSOR cursor); | |
| 80 void OnDisplayFileOpenDialog(const base::string16& title, | |
| 81 const base::string16& filter, | |
| 82 const base::FilePath& default_path, | |
| 83 bool allow_multiple_files); | |
| 84 void OnDisplayFileSaveAsDialog( | |
| 85 const MetroViewerHostMsg_SaveAsDialogParams& params); | |
| 86 void OnDisplayFolderPicker(const base::string16& title); | |
| 87 void OnSetCursorPos(int x, int y); | |
| 88 | |
| 89 // This function is invoked when the open file operation completes. The | |
| 90 // result of the operation is passed in along with the OpenFilePickerSession | |
| 91 // instance which is deleted after we read the required information from | |
| 92 // the OpenFilePickerSession class. | |
| 93 void OnOpenFileCompleted(OpenFilePickerSession* open_file_picker, | |
| 94 bool success); | |
| 95 | |
| 96 // This function is invoked when the save file operation completes. The | |
| 97 // result of the operation is passed in along with the SaveFilePickerSession | |
| 98 // instance which is deleted after we read the required information from | |
| 99 // the SaveFilePickerSession class. | |
| 100 void OnSaveFileCompleted(SaveFilePickerSession* save_file_picker, | |
| 101 bool success); | |
| 102 | |
| 103 // This function is invoked when the folder picker operation completes. The | |
| 104 // result of the operation is passed in along with the FolderPickerSession | |
| 105 // instance which is deleted after we read the required information from | |
| 106 // the FolderPickerSession class. | |
| 107 void OnFolderPickerCompleted(FolderPickerSession* folder_picker, | |
| 108 bool success); | |
| 109 | |
| 110 void OnImeCancelComposition(); | |
| 111 void OnImeUpdateTextInputClient( | |
| 112 const std::vector<int32_t>& input_scopes, | |
| 113 const std::vector<metro_viewer::CharacterBounds>& character_bounds); | |
| 114 | |
| 115 void OnMetroExit(MetroTerminateMethod method); | |
| 116 | |
| 117 HWND core_window_hwnd() const { return core_window_hwnd_; } | |
| 118 | |
| 119 | |
| 120 private: | |
| 121 class PointerInfoHandler; | |
| 122 | |
| 123 // ImePopupObserver overrides. | |
| 124 void OnImePopupChanged(ImePopupObserver::EventType event) override; | |
| 125 | |
| 126 // InputSourceObserver overrides. | |
| 127 void OnInputSourceChanged() override; | |
| 128 | |
| 129 // TextServiceDelegate overrides. | |
| 130 void OnCompositionChanged( | |
| 131 const base::string16& text, | |
| 132 int32_t selection_start, | |
| 133 int32_t selection_end, | |
| 134 const std::vector<metro_viewer::UnderlineInfo>& underlines) override; | |
| 135 void OnTextCommitted(const base::string16& text) override; | |
| 136 | |
| 137 // Convenience for sending a MetroViewerHostMsg_MouseButton with the specified | |
| 138 // parameters. | |
| 139 void SendMouseButton(int x, | |
| 140 int y, | |
| 141 int extra, | |
| 142 ui::EventType event_type, | |
| 143 uint32_t flags, | |
| 144 ui::EventFlags changed_button, | |
| 145 bool is_horizontal_wheel); | |
| 146 | |
| 147 // Win8 only generates a mouse press for the initial button that goes down and | |
| 148 // a release when the last button is released. Any intermediary presses (or | |
| 149 // releases) do not result in a new press/release event. Instead a move is | |
| 150 // generated with the winui::Input::PointerUpdateKind identifying what | |
| 151 // changed. This function generates the necessary intermediary events (as | |
| 152 // necessary). | |
| 153 void GenerateMouseEventFromMoveIfNecessary(const PointerInfoHandler& pointer); | |
| 154 | |
| 155 HRESULT OnActivate(winapp::Core::ICoreApplicationView* view, | |
| 156 winapp::Activation::IActivatedEventArgs* args); | |
| 157 | |
| 158 HRESULT OnPointerMoved(winui::Core::ICoreWindow* sender, | |
| 159 winui::Core::IPointerEventArgs* args); | |
| 160 | |
| 161 HRESULT OnPointerPressed(winui::Core::ICoreWindow* sender, | |
| 162 winui::Core::IPointerEventArgs* args); | |
| 163 | |
| 164 HRESULT OnPointerReleased(winui::Core::ICoreWindow* sender, | |
| 165 winui::Core::IPointerEventArgs* args); | |
| 166 | |
| 167 HRESULT OnWheel(winui::Core::ICoreWindow* sender, | |
| 168 winui::Core::IPointerEventArgs* args); | |
| 169 | |
| 170 HRESULT OnKeyDown(winui::Core::ICoreWindow* sender, | |
| 171 winui::Core::IKeyEventArgs* args); | |
| 172 | |
| 173 HRESULT OnKeyUp(winui::Core::ICoreWindow* sender, | |
| 174 winui::Core::IKeyEventArgs* args); | |
| 175 | |
| 176 // Invoked for system keys like Alt, etc. | |
| 177 HRESULT OnAcceleratorKeyDown(winui::Core::ICoreDispatcher* sender, | |
| 178 winui::Core::IAcceleratorKeyEventArgs* args); | |
| 179 | |
| 180 HRESULT OnCharacterReceived(winui::Core::ICoreWindow* sender, | |
| 181 winui::Core::ICharacterReceivedEventArgs* args); | |
| 182 | |
| 183 HRESULT OnWindowActivated(winui::Core::ICoreWindow* sender, | |
| 184 winui::Core::IWindowActivatedEventArgs* args); | |
| 185 | |
| 186 // Helper to handle search requests received via the search charm in ASH. | |
| 187 HRESULT HandleSearchRequest(winapp::Activation::IActivatedEventArgs* args); | |
| 188 // Helper to handle http/https url requests in ASH. | |
| 189 HRESULT HandleProtocolRequest(winapp::Activation::IActivatedEventArgs* args); | |
| 190 | |
| 191 HRESULT OnEdgeGestureCompleted(winui::Input::IEdgeGesture* gesture, | |
| 192 winui::Input::IEdgeGestureEventArgs* args); | |
| 193 | |
| 194 // Tasks posted to the UI thread to initiate the search/url navigation | |
| 195 // requests. | |
| 196 void OnSearchRequest(const base::string16& search_string); | |
| 197 void OnNavigateToUrl(const base::string16& url); | |
| 198 | |
| 199 HRESULT OnSizeChanged(winui::Core::ICoreWindow* sender, | |
| 200 winui::Core::IWindowSizeChangedEventArgs* args); | |
| 201 | |
| 202 // This function checks if the Chrome browser channel is initialized. If yes | |
| 203 // then it goes ahead and starts up the viewer in Chrome OS mode. If not it | |
| 204 // posts a delayed task and checks again. It does this for a duration of 10 | |
| 205 // seconds and then bails. | |
| 206 void StartChromeOSMode(); | |
| 207 | |
| 208 mswr::ComPtr<winui::Core::ICoreWindow> window_; | |
| 209 mswr::ComPtr<winapp::Core::ICoreApplicationView> view_; | |
| 210 EventRegistrationToken activated_token_; | |
| 211 EventRegistrationToken pointermoved_token_; | |
| 212 EventRegistrationToken pointerpressed_token_; | |
| 213 EventRegistrationToken pointerreleased_token_; | |
| 214 EventRegistrationToken wheel_token_; | |
| 215 EventRegistrationToken keydown_token_; | |
| 216 EventRegistrationToken keyup_token_; | |
| 217 EventRegistrationToken character_received_token_; | |
| 218 EventRegistrationToken accel_keydown_token_; | |
| 219 EventRegistrationToken accel_keyup_token_; | |
| 220 EventRegistrationToken window_activated_token_; | |
| 221 EventRegistrationToken sizechange_token_; | |
| 222 EventRegistrationToken edgeevent_token_; | |
| 223 | |
| 224 // Keep state about which button is currently down, if any, as PointerMoved | |
| 225 // events do not contain that state, but Ash's MouseEvents need it. Value is | |
| 226 // as a bitmask of ui::EventFlags. | |
| 227 uint32_t mouse_down_flags_; | |
| 228 | |
| 229 // Set the D3D swap chain and nothing else. | |
| 230 metro_driver::Direct3DHelper direct3d_helper_; | |
| 231 | |
| 232 // The IPC channel IO thread. | |
| 233 scoped_ptr<base::Thread> io_thread_; | |
| 234 | |
| 235 // The channel to Chrome, in particular to the MetroViewerProcessHost. | |
| 236 scoped_ptr<IPC::ChannelProxy> ui_channel_; | |
| 237 | |
| 238 // The actual window behind the view surface. | |
| 239 HWND core_window_hwnd_; | |
| 240 | |
| 241 // UI message loop to allow message passing into this thread. | |
| 242 base::MessageLoopForUI ui_loop_; | |
| 243 | |
| 244 // For IME support. | |
| 245 scoped_ptr<metro_driver::InputSource> input_source_; | |
| 246 scoped_ptr<metro_driver::TextService> text_service_; | |
| 247 | |
| 248 // The metro device scale factor as reported by the winrt interfaces. | |
| 249 float metro_dpi_scale_; | |
| 250 // The win32 dpi scale which is queried via GetDeviceCaps. Please refer to | |
| 251 // ui/gfx/win/dpi.cc for more information. | |
| 252 float win32_dpi_scale_; | |
| 253 | |
| 254 // The cursor set by the chroem browser process. | |
| 255 HCURSOR last_cursor_; | |
| 256 | |
| 257 // Pointer to the channel listener for the channel between the viewer and | |
| 258 // the browser. | |
| 259 IPC::Listener* channel_listener_; | |
| 260 }; | |
| 261 | |
| 262 #endif // WIN8_METRO_DRIVER_CHROME_APP_VIEW_ASH_H_ | |
| OLD | NEW |