• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_H_
6 #define WIN8_METRO_DRIVER_CHROME_APP_VIEW_H_
7 
8 #include <windows.applicationmodel.core.h>
9 #include <windows.ui.core.h>
10 #include <windows.ui.input.h>
11 #include <windows.ui.viewmanagement.h>
12 
13 #include <list>
14 #include <map>
15 #include <string>
16 #include <utility>
17 
18 #include "base/memory/scoped_ptr.h"
19 #include "base/message_loop/message_loop.h"
20 #include "base/synchronization/lock.h"
21 #include "win8/metro_driver/chrome_url_launch_handler.h"
22 #include "win8/metro_driver/devices_handler.h"
23 #include "win8/metro_driver/metro_dialog_box.h"
24 #include "win8/metro_driver/settings_handler.h"
25 #include "win8/metro_driver/toast_notification_handler.h"
26 
27 namespace IPC {
28   class Listener;
29   class ChannelProxy;
30 }
31 
32 class ChromeAppView
33     : public mswr::RuntimeClass<winapp::Core::IFrameworkView> {
34  public:
35   ChromeAppView();
36   ~ChromeAppView();
37 
38   // IViewProvider overrides.
39   IFACEMETHOD(Initialize)(winapp::Core::ICoreApplicationView* view);
40   IFACEMETHOD(SetWindow)(winui::Core::ICoreWindow* window);
41   IFACEMETHOD(Load)(HSTRING entryPoint);
42   IFACEMETHOD(Run)();
43   IFACEMETHOD(Uninitialize)();
44 
45   static LRESULT CALLBACK CoreWindowProc(HWND window, UINT message, WPARAM wp,
46                                          LPARAM lp);
47 
osk_visible_notification_received()48   bool osk_visible_notification_received() const {
49     return osk_visible_notification_received_;
50   }
51 
52   // Displays the notification.
53   void DisplayNotification(
54       const ToastNotificationHandler::DesktopNotification& notification);
55 
56   // Cancels the notification.
57   void CancelNotification(const std::string& notification);
58 
59   // Returns true if the notification passed in is valid.
60   bool IsValidNotification(const std::string& notification);
61 
62   // Displays a dialog box.
63   void ShowDialogBox(const MetroDialogBox::DialogBoxInfo& dialog_box_info);
64   // Dismisses the dialog box.
65   void DismissDialogBox();
66 
67   // Helper function to unsnap the chrome metro app if it is snapped.
68   // Returns S_OK on success.
69   static HRESULT Unsnap();
70 
71   // Notification from chrome that a full screen operation is being performed.
72   void SetFullscreen(bool fullscreen);
73 
74   // Returns the current view state of the chrome window.
75   winui::ViewManagement::ApplicationViewState GetViewState();
76 
core_window_hwnd()77   HWND core_window_hwnd() { return core_window_hwnd_; }
78 
79  private:
80   HRESULT OnActivate(winapp::Core::ICoreApplicationView* view,
81                      winapp::Activation::IActivatedEventArgs* args);
82 
83   HRESULT OnSizeChanged(winui::Core::ICoreWindow* sender,
84                         winui::Core::IWindowSizeChangedEventArgs* args);
85 
86   HRESULT OnEdgeGestureCompleted(winui::Input::IEdgeGesture* gesture,
87                                  winui::Input::IEdgeGestureEventArgs* args);
88 
89   HRESULT OnShareDataRequested(
90       winapp::DataTransfer::IDataTransferManager* data_transfer_mgr,
91       winapp::DataTransfer::IDataRequestedEventArgs* event_args);
92 
93   HRESULT OnInputPaneVisible(
94       winui::ViewManagement::IInputPane* input_pane,
95       winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args);
96 
97   HRESULT OnInputPaneHiding(
98     winui::ViewManagement::IInputPane* input_pane,
99     winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args);
100 
101   HRESULT OnPositionChanged(int x, int y);
102 
103   void CheckForOSKActivation();
104 
105   HRESULT RegisterInputPaneNotifications();
106 
107   void HandleInputPaneVisible(const RECT& osk_rect);
108   void HandleInputPaneHidden(const RECT& osk_rect);
109 
110   mswr::ComPtr<winui::Core::ICoreWindow> window_;
111   mswr::ComPtr<winapp::Core::ICoreApplicationView> view_;
112   EventRegistrationToken activated_token_;
113   EventRegistrationToken edgeevent_token_;
114   EventRegistrationToken sizechange_token_;
115   EventRegistrationToken share_data_requested_token_;
116   EventRegistrationToken input_pane_visible_token_;
117   EventRegistrationToken input_pane_hiding_token_;
118   EventRegistrationToken app_exit_token_;
119 
120   // The actual window behind the view surface.
121   HWND core_window_hwnd_;
122 
123   ChromeUrlLaunchHandler url_launch_handler_;
124   metro_driver::DevicesHandler devices_handler_;
125   SettingsHandler settings_handler_;
126   mswr::ComPtr<winui::ViewManagement::IInputPane> input_pane_;
127   mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> app_view_;
128 
129   bool osk_visible_notification_received_;
130 
131   // map of notification id to the ToastNotificationHandler instance.
132   typedef std::map<std::string, scoped_ptr<ToastNotificationHandler> >
133       NotificationMap;
134   NotificationMap notification_map_;
135 
136   // Synchronizes access to the notification_map_ member.
137   base::Lock notification_lock_;
138 
139   // If the OSK covers the input area we scroll the window by the height of the
140   // OSK + an additional offset. This member holds this offset. Set to 0 if the
141   // window was not scrolled.
142   int osk_offset_adjustment_;
143 
144   MetroDialogBox dialog_box_;
145 };
146 
147 // Global information used across the metro driver.
148 struct Globals {
149   LPTHREAD_START_ROUTINE host_main;
150   void* host_context;
151   // The pair below contains the HWND and a bool which indicates whether the
152   // window was displaced to ensure that the focused region is visible when
153   // the OSK is displayed.
154   std::list<std::pair<HWND, bool> > host_windows;
155   HANDLE host_thread;
156   ChromeAppView* view;
157   WNDPROC g_core_proc;
158   base::string16 navigation_url;
159   base::string16 search_string;
160   winapp::Activation::ApplicationExecutionState previous_state;
161   winapp::Activation::ActivationKind initial_activation_kind;
162   bool is_initial_activation;
163   // This message loop lives in the app view's thread. Some operations have
164   // to be initiated from that thread, notably spawning file pickers.
165   base::MessageLoopProxy* appview_msg_loop;
166   winapp::Core::ICoreApplicationExit* app_exit;
167   base::string16 metro_command_line_switches;
168 };
169 
170 extern Globals globals;
171 
172 #endif  // WIN8_METRO_DRIVER_CHROME_APP_VIEW_H_
173