diff options
Diffstat (limited to 'win8/metro_driver/chrome_app_view.h')
-rw-r--r-- | win8/metro_driver/chrome_app_view.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/win8/metro_driver/chrome_app_view.h b/win8/metro_driver/chrome_app_view.h new file mode 100644 index 0000000..80f309d --- /dev/null +++ b/win8/metro_driver/chrome_app_view.h @@ -0,0 +1,177 @@ +// 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_METRO_DRIVER_CHROME_APP_VIEW_H_ +#define CHROME_BROWSER_UI_METRO_DRIVER_CHROME_APP_VIEW_H_ + +#include <windows.applicationmodel.core.h> +#include <windows.ui.core.h> +#include <windows.ui.input.h> +#include <windows.ui.viewmanagement.h> + +#include <list> +#include <map> +#include <string> +#include <utility> + +#include "base/memory/scoped_ptr.h" +#include "base/message_loop.h" +#include "base/synchronization/lock.h" +#include "win8/metro_driver/chrome_url_launch_handler.h" +#include "win8/metro_driver/devices_handler.h" +#include "win8/metro_driver/metro_dialog_box.h" +#include "win8/metro_driver/settings_handler.h" +#include "win8/metro_driver/toast_notification_handler.h" + +class ChromeAppView + : public mswr::RuntimeClass<winapp::Core::IFrameworkView> { + public: + ChromeAppView(); + ~ChromeAppView(); + + // IViewProvider overrides. + IFACEMETHOD(Initialize)(winapp::Core::ICoreApplicationView* view); + IFACEMETHOD(SetWindow)(winui::Core::ICoreWindow* window); + IFACEMETHOD(Load)(HSTRING entryPoint); + IFACEMETHOD(Run)(); + IFACEMETHOD(Uninitialize)(); + + static LRESULT CALLBACK CoreWindowProc(HWND window, UINT message, WPARAM wp, + LPARAM lp); + + HRESULT TileRequestCreateDone(winfoundtn::IAsyncOperation<bool>* async, + AsyncStatus status); + + bool osk_visible_notification_received() const { + return osk_visible_notification_received_; + } + + // Displays the notification. + void DisplayNotification( + const ToastNotificationHandler::DesktopNotification& notification); + + // Cancels the notification. + void CancelNotification(const std::string& notification); + + // Returns true if the notification passed in is valid. + bool IsValidNotification(const std::string& notification); + + // Displays a dialog box. + void ShowDialogBox(const MetroDialogBox::DialogBoxInfo& dialog_box_info); + // Dismisses the dialog box. + void DismissDialogBox(); + + // Helper function to unsnap the chrome metro app if it is snapped. + // Returns S_OK on success. + static HRESULT Unsnap(); + + // Notification from chrome that a full screen operation is being performed. + void SetFullscreen(bool fullscreen); + + private: + HRESULT OnActivate(winapp::Core::ICoreApplicationView* view, + winapp::Activation::IActivatedEventArgs* args); + + HRESULT OnSizeChanged(winui::Core::ICoreWindow* sender, + winui::Core::IWindowSizeChangedEventArgs* args); + + HRESULT OnEdgeGestureCompleted(winui::Input::IEdgeGesture* gesture, + winui::Input::IEdgeGestureEventArgs* args); + + HRESULT OnShareDataRequested( + winapp::DataTransfer::IDataTransferManager* data_transfer_mgr, + winapp::DataTransfer::IDataRequestedEventArgs* event_args); + + HRESULT OnInputPaneVisible( + winui::ViewManagement::IInputPane* input_pane, + winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args); + + HRESULT OnInputPaneHiding( + winui::ViewManagement::IInputPane* input_pane, + winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args); + + HRESULT OnPositionChanged(int x, int y); + + void CheckForOSKActivation(); + + HRESULT RegisterInputPaneNotifications(); + + void HandleInputPaneVisible(const RECT& osk_rect); + void HandleInputPaneHidden(const RECT& osk_rect); + + mswr::ComPtr<winui::Core::ICoreWindow> window_; + mswr::ComPtr<winapp::Core::ICoreApplicationView> view_; + EventRegistrationToken activated_token_; + EventRegistrationToken edgeevent_token_; + EventRegistrationToken sizechange_token_; + EventRegistrationToken share_data_requested_token_; + EventRegistrationToken input_pane_visible_token_; + EventRegistrationToken input_pane_hiding_token_; + EventRegistrationToken app_exit_token_; + + ChromeUrlLaunchHandler url_launch_handler_; + metro_driver::DevicesHandler devices_handler_; + SettingsHandler settings_handler_; + mswr::ComPtr<winui::ViewManagement::IInputPane> input_pane_; + mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> app_view_; + + bool osk_visible_notification_received_; + + // map of notification id to the ToastNotificationHandler instance. + typedef std::map<std::string, scoped_ptr<ToastNotificationHandler> > + NotificationMap; + NotificationMap notification_map_; + + // Synchronizes access to the notification_map_ member. + base::Lock notification_lock_; + + // If the OSK covers the input area we scroll the window by the height of the + // OSK + an additional offset. This member holds this offset. Set to 0 if the + // window was not scrolled. + int osk_offset_adjustment_; + + MetroDialogBox dialog_box_; +}; + +class ChromeAppViewFactory + : public mswr::RuntimeClass<winapp::Core::IFrameworkViewSource> { + public: + ChromeAppViewFactory(winapp::Core::ICoreApplication* icore_app, + LPTHREAD_START_ROUTINE host_main, + void* host_context); + IFACEMETHOD(CreateView)(winapp::Core::IFrameworkView** view); +}; + +// This function is exported by chrome.exe. +typedef int (__cdecl *BreakpadExceptionHandler)(EXCEPTION_POINTERS* info); + +// Global information used across the metro driver. +struct Globals { + LPTHREAD_START_ROUTINE host_main; + void* host_context; + HWND core_window; + // The pair below contains the HWND and a bool which indicates whether the + // window was displaced to ensure that the focused region is visible when + // the OSK is displayed. + std::list<std::pair<HWND, bool> > host_windows; + HANDLE host_thread; + DWORD main_thread_id; + ChromeAppView* view; + WNDPROC g_core_proc; + string16 navigation_url; + string16 search_string; + winapp::Activation::ApplicationExecutionState previous_state; + winapp::Activation::ActivationKind initial_activation_kind; + bool is_initial_activation; + // This message loop lives in the app view's thread. Some operations have + // to be initiated from that thread, notably spawning file pickers. + base::MessageLoopProxy* appview_msg_loop; + winapp::Core::ICoreApplicationExit* app_exit; + BreakpadExceptionHandler breakpad_exception_handler; + string16 metro_command_line_switches; +}; + +extern Globals globals; + +#endif // CHROME_BROWSER_UI_METRO_DRIVER_CHROME_APP_VIEW_H_ |