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 #include "stdafx.h"
6 #include <corewindow.h>
7 #include <shobjidl.h>
8
9 #include "base/logging.h"
10 #include "ui/gfx/geometry/safe_integer_conversions.h"
11 #include "ui/gfx/win/msg_util.h"
12
13 #pragma comment(lib, "shell32.lib")
14
15 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
16 // Even though we only create a single window, we need to keep this
17 // count because of the hidden window used by the UI message loop of
18 // the metro viewer.
19 int g_window_count = 0;
20
21 const wchar_t kAshWin7AppId[] = L"Google.Chrome.AshWin7.1";
22
23 extern float GetModernUIScale();
24
WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)25 LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
26 WPARAM wparam, LPARAM lparam) {
27 PAINTSTRUCT ps;
28 HDC hdc;
29 switch (message) {
30 case WM_CREATE:
31 ++g_window_count;
32 break;
33 case WM_PAINT:
34 hdc = ::BeginPaint(hwnd, &ps);
35 ::EndPaint(hwnd, &ps);
36 break;
37 case WM_CLOSE:
38 ::DestroyWindow(hwnd);
39 break;
40 case WM_DESTROY:
41 --g_window_count;
42 if (!g_window_count)
43 ::PostQuitMessage(0);
44 break;
45 // Always allow Chrome to set the cursor.
46 case WM_SETCURSOR:
47 return 1;
48 default:
49 return ::DefWindowProc(hwnd, message, wparam, lparam);
50 }
51 return 0;
52 }
53
CreateMetroTopLevelWindow(const RECT & work_area)54 HWND CreateMetroTopLevelWindow(const RECT& work_area) {
55 HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase);
56 WNDCLASSEXW wcex;
57 wcex.cbSize = sizeof(wcex);
58 wcex.style = CS_HREDRAW | CS_VREDRAW;
59 wcex.lpfnWndProc = WndProc;
60 wcex.cbClsExtra = 0;
61 wcex.cbWndExtra = 0;
62 wcex.hInstance = hInst;
63 wcex.hIcon = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME");
64 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
65 wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1);
66 wcex.lpszMenuName = 0;
67 wcex.lpszClassName = L"Windows.UI.Core.CoreWindow";
68 wcex.hIconSm = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME");
69
70
71
72 HWND hwnd = ::CreateWindowExW(0,
73 MAKEINTATOM(::RegisterClassExW(&wcex)),
74 L"metro_win7",
75 WS_POPUP | WS_VISIBLE | WS_MINIMIZEBOX,
76 work_area.top, work_area.left,
77 work_area.right, work_area.bottom,
78 NULL, NULL, hInst, NULL);
79 return hwnd;
80 }
81
82 typedef winfoundtn::ITypedEventHandler<
83 winapp::Core::CoreApplicationView*,
84 winapp::Activation::IActivatedEventArgs*> ActivatedHandler;
85
86 typedef winfoundtn::ITypedEventHandler<
87 winui::Core::CoreWindow*,
88 winui::Core::WindowActivatedEventArgs*> WindowActivatedHandler;
89
90 typedef winfoundtn::ITypedEventHandler<
91 winui::Core::CoreWindow*,
92 winui::Core::AutomationProviderRequestedEventArgs*>
93 AutomationProviderHandler;
94
95 typedef winfoundtn::ITypedEventHandler<
96 winui::Core::CoreWindow*,
97 winui::Core::CharacterReceivedEventArgs*> CharEventHandler;
98
99 typedef winfoundtn::ITypedEventHandler<
100 winui::Core::CoreWindow*,
101 winui::Core::CoreWindowEventArgs*> CoreWindowEventHandler;
102
103 typedef winfoundtn::ITypedEventHandler<
104 winui::Core::CoreWindow*,
105 winui::Core::InputEnabledEventArgs*> InputEnabledEventHandler;
106
107 typedef winfoundtn::ITypedEventHandler<
108 winui::Core::CoreWindow*,
109 winui::Core::KeyEventArgs*> KeyEventHandler;
110
111 typedef winfoundtn::ITypedEventHandler<
112 winui::Core::CoreWindow*,
113 winui::Core::PointerEventArgs*> PointerEventHandler;
114
115 typedef winfoundtn::ITypedEventHandler<
116 winui::Core::CoreWindow*,
117 winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler;
118
119 typedef winfoundtn::ITypedEventHandler<
120 winui::Core::CoreWindow*,
121 winui::Core::TouchHitTestingEventArgs*> TouchHitTestHandler;
122
123 typedef winfoundtn::ITypedEventHandler<
124 winui::Core::CoreWindow*,
125 winui::Core::VisibilityChangedEventArgs*> VisibilityChangedHandler;
126
127 typedef winfoundtn::ITypedEventHandler<
128 winui::Core::CoreDispatcher*,
129 winui::Core::AcceleratorKeyEventArgs*> AcceleratorKeyEventHandler;
130
131 // This interface is implemented by classes which handle mouse and keyboard
132 // input.
133 class InputHandler {
134 public:
InputHandler()135 InputHandler() {}
~InputHandler()136 virtual ~InputHandler() {}
137
138 virtual bool HandleKeyboardMessage(const MSG& msg) = 0;
139 virtual bool HandleMouseMessage(const MSG& msg) = 0;
140
141 private:
142 DISALLOW_COPY_AND_ASSIGN(InputHandler);
143 };
144
145 // This class implements the winrt interfaces corresponding to mouse input.
146 class MouseEvent : public mswr::RuntimeClass<
147 winui::Core::IPointerEventArgs,
148 winui::Input::IPointerPoint,
149 winui::Input::IPointerPointProperties,
150 windevs::Input::IPointerDevice> {
151 public:
MouseEvent(const MSG & msg)152 MouseEvent(const MSG& msg)
153 : msg_(msg) {
154 }
155
156 // IPointerEventArgs implementation.
get_CurrentPoint(winui::Input::IPointerPoint ** point)157 virtual HRESULT STDMETHODCALLTYPE get_CurrentPoint(
158 winui::Input::IPointerPoint** point) {
159 return QueryInterface(winui::Input::IID_IPointerPoint,
160 reinterpret_cast<void**>(point));
161 }
162
get_KeyModifiers(winsys::VirtualKeyModifiers * modifiers)163 virtual HRESULT STDMETHODCALLTYPE get_KeyModifiers(
164 winsys::VirtualKeyModifiers* modifiers) {
165 return E_NOTIMPL;
166 }
167
GetIntermediatePoints(winfoundtn::Collections::IVector<winui::Input::PointerPoint * > ** points)168 virtual HRESULT STDMETHODCALLTYPE GetIntermediatePoints(
169 winfoundtn::Collections::IVector<winui::Input::PointerPoint*>** points) {
170 return E_NOTIMPL;
171 }
172
173 // IPointerPoint implementation.
get_PointerDevice(windevs::Input::IPointerDevice ** pointer_device)174 virtual HRESULT STDMETHODCALLTYPE get_PointerDevice(
175 windevs::Input::IPointerDevice** pointer_device) {
176 return QueryInterface(windevs::Input::IID_IPointerDevice,
177 reinterpret_cast<void**>(pointer_device));
178 }
179
get_Position(winfoundtn::Point * position)180 virtual HRESULT STDMETHODCALLTYPE get_Position(winfoundtn::Point* position) {
181 static float scale = GetModernUIScale();
182 // Scale down the points here as they are scaled up on the other side.
183 position->X = gfx::ToRoundedInt(CR_GET_X_LPARAM(msg_.lParam) / scale);
184 position->Y = gfx::ToRoundedInt(CR_GET_Y_LPARAM(msg_.lParam) / scale);
185 return S_OK;
186 }
187
get_PointerId(uint32 * pointer_id)188 virtual HRESULT STDMETHODCALLTYPE get_PointerId(uint32* pointer_id) {
189 // TODO(ananta)
190 // Implement this properly.
191 *pointer_id = 1;
192 return S_OK;
193 }
194
get_Timestamp(uint64 * timestamp)195 virtual HRESULT STDMETHODCALLTYPE get_Timestamp(uint64* timestamp) {
196 *timestamp = msg_.time;
197 return S_OK;
198 }
199
get_Properties(winui::Input::IPointerPointProperties ** properties)200 virtual HRESULT STDMETHODCALLTYPE get_Properties(
201 winui::Input::IPointerPointProperties** properties) {
202 return QueryInterface(winui::Input::IID_IPointerPointProperties,
203 reinterpret_cast<void**>(properties));
204 }
205
get_RawPosition(winfoundtn::Point * position)206 virtual HRESULT STDMETHODCALLTYPE get_RawPosition(
207 winfoundtn::Point* position) {
208 return E_NOTIMPL;
209 }
210
get_FrameId(uint32 * frame_id)211 virtual HRESULT STDMETHODCALLTYPE get_FrameId(uint32* frame_id) {
212 return E_NOTIMPL;
213 }
214
get_IsInContact(boolean * in_contact)215 virtual HRESULT STDMETHODCALLTYPE get_IsInContact(boolean* in_contact) {
216 return E_NOTIMPL;
217 }
218
219 // IPointerPointProperties implementation.
get_PointerUpdateKind(winui::Input::PointerUpdateKind * update_kind)220 virtual HRESULT STDMETHODCALLTYPE get_PointerUpdateKind(
221 winui::Input::PointerUpdateKind* update_kind) {
222 // TODO(ananta)
223 // There is no WM_POINTERUPDATE equivalent on Windows 7. Look into
224 // equivalents.
225 if (msg_.message == WM_LBUTTONDOWN) {
226 *update_kind = winui::Input::PointerUpdateKind_LeftButtonPressed;
227 } else if (msg_.message == WM_RBUTTONDOWN) {
228 *update_kind = winui::Input::PointerUpdateKind_RightButtonPressed;
229 } else if (msg_.message == WM_MBUTTONDOWN) {
230 *update_kind = winui::Input::PointerUpdateKind_MiddleButtonPressed;
231 } else if (msg_.message == WM_LBUTTONUP) {
232 *update_kind = winui::Input::PointerUpdateKind_LeftButtonReleased;
233 } else if (msg_.message == WM_RBUTTONUP) {
234 *update_kind = winui::Input::PointerUpdateKind_RightButtonReleased;
235 } else if (msg_.message == WM_MBUTTONUP) {
236 *update_kind = winui::Input::PointerUpdateKind_MiddleButtonReleased;
237 }
238 return S_OK;
239 }
240
get_IsLeftButtonPressed(boolean * left_button_pressed)241 virtual HRESULT STDMETHODCALLTYPE get_IsLeftButtonPressed(
242 boolean* left_button_pressed) {
243 *left_button_pressed = msg_.wParam & MK_LBUTTON ? true : false;
244 return S_OK;
245 }
246
get_IsRightButtonPressed(boolean * right_button_pressed)247 virtual HRESULT STDMETHODCALLTYPE get_IsRightButtonPressed(
248 boolean* right_button_pressed) {
249 *right_button_pressed = msg_.wParam & MK_RBUTTON ? true : false;
250 return S_OK;
251 }
252
get_IsMiddleButtonPressed(boolean * middle_button_pressed)253 virtual HRESULT STDMETHODCALLTYPE get_IsMiddleButtonPressed(
254 boolean* middle_button_pressed) {
255 *middle_button_pressed = msg_.wParam & MK_MBUTTON ? true : false;
256 return S_OK;
257 }
258
get_IsHorizontalMouseWheel(boolean * is_horizontal_mouse_wheel)259 virtual HRESULT STDMETHODCALLTYPE get_IsHorizontalMouseWheel(
260 boolean* is_horizontal_mouse_wheel) {
261 *is_horizontal_mouse_wheel =
262 (msg_.message == WM_MOUSEHWHEEL) ? true : false;
263 return S_OK;
264 }
265
get_MouseWheelDelta(int * delta)266 virtual HRESULT STDMETHODCALLTYPE get_MouseWheelDelta(int* delta) {
267 if (msg_.message == WM_MOUSEWHEEL || msg_.message == WM_MOUSEHWHEEL) {
268 *delta = GET_WHEEL_DELTA_WPARAM(msg_.wParam);
269 return S_OK;
270 } else {
271 return S_FALSE;
272 }
273 }
274
get_Pressure(float * pressure)275 virtual HRESULT STDMETHODCALLTYPE get_Pressure(float* pressure) {
276 return E_NOTIMPL;
277 }
278
get_IsInverted(boolean * inverted)279 virtual HRESULT STDMETHODCALLTYPE get_IsInverted(boolean* inverted) {
280 return E_NOTIMPL;
281 }
282
get_IsEraser(boolean * is_eraser)283 virtual HRESULT STDMETHODCALLTYPE get_IsEraser(boolean* is_eraser) {
284 return E_NOTIMPL;
285 }
286
get_Orientation(float * orientation)287 virtual HRESULT STDMETHODCALLTYPE get_Orientation(float* orientation) {
288 return E_NOTIMPL;
289 }
290
get_XTilt(float * x_tilt)291 virtual HRESULT STDMETHODCALLTYPE get_XTilt(float* x_tilt) {
292 return E_NOTIMPL;
293 }
294
get_YTilt(float * y_tilt)295 virtual HRESULT STDMETHODCALLTYPE get_YTilt(float* y_tilt) {
296 return E_NOTIMPL;
297 }
298
get_Twist(float * twist)299 virtual HRESULT STDMETHODCALLTYPE get_Twist(float* twist) {
300 return E_NOTIMPL;
301 }
302
get_ContactRect(winfoundtn::Rect * rect)303 virtual HRESULT STDMETHODCALLTYPE get_ContactRect(winfoundtn::Rect* rect) {
304 return E_NOTIMPL;
305 }
306
get_ContactRectRaw(winfoundtn::Rect * rect)307 virtual HRESULT STDMETHODCALLTYPE get_ContactRectRaw(winfoundtn::Rect* rect) {
308 return E_NOTIMPL;
309 }
310
get_TouchConfidence(boolean * confidence)311 virtual HRESULT STDMETHODCALLTYPE get_TouchConfidence(boolean* confidence) {
312 return E_NOTIMPL;
313 }
314
get_IsPrimary(boolean * is_primary)315 virtual HRESULT STDMETHODCALLTYPE get_IsPrimary(boolean* is_primary) {
316 return E_NOTIMPL;
317 }
318
get_IsInRange(boolean * is_in_range)319 virtual HRESULT STDMETHODCALLTYPE get_IsInRange(boolean* is_in_range) {
320 return E_NOTIMPL;
321 }
322
get_IsCanceled(boolean * is_canceled)323 virtual HRESULT STDMETHODCALLTYPE get_IsCanceled(boolean* is_canceled) {
324 return E_NOTIMPL;
325 }
326
get_IsBarrelButtonPressed(boolean * is_barrel_button_pressed)327 virtual HRESULT STDMETHODCALLTYPE get_IsBarrelButtonPressed(
328 boolean* is_barrel_button_pressed) {
329 return E_NOTIMPL;
330 }
331
get_IsXButton1Pressed(boolean * is_xbutton1_pressed)332 virtual HRESULT STDMETHODCALLTYPE get_IsXButton1Pressed(
333 boolean* is_xbutton1_pressed) {
334 return E_NOTIMPL;
335 }
336
get_IsXButton2Pressed(boolean * is_xbutton2_pressed)337 virtual HRESULT STDMETHODCALLTYPE get_IsXButton2Pressed(
338 boolean* is_xbutton2_pressed) {
339 return E_NOTIMPL;
340 }
341
HasUsage(uint32 usage_page,uint32 usage_id,boolean * has_usage)342 virtual HRESULT STDMETHODCALLTYPE HasUsage(uint32 usage_page,
343 uint32 usage_id,
344 boolean* has_usage) {
345 return E_NOTIMPL;
346 }
347
GetUsageValue(uint32 usage_page,uint32 usage_id,int32 * usage_value)348 virtual HRESULT STDMETHODCALLTYPE GetUsageValue(uint32 usage_page,
349 uint32 usage_id,
350 int32* usage_value) {
351 return E_NOTIMPL;
352 }
353
354 // IPointerDevice implementation.
get_PointerDeviceType(windevs::Input::PointerDeviceType * device_type)355 virtual HRESULT STDMETHODCALLTYPE get_PointerDeviceType(
356 windevs::Input::PointerDeviceType* device_type) {
357 if (msg_.message == WM_TOUCH) {
358 *device_type = windevs::Input::PointerDeviceType_Touch;
359 } else {
360 *device_type = windevs::Input::PointerDeviceType_Mouse;
361 }
362 return S_OK;
363 }
364
get_IsIntegrated(boolean * is_integrated)365 virtual HRESULT STDMETHODCALLTYPE get_IsIntegrated(boolean* is_integrated) {
366 return E_NOTIMPL;
367 }
368
get_MaxContacts(uint32 * contacts)369 virtual HRESULT STDMETHODCALLTYPE get_MaxContacts(uint32* contacts) {
370 return E_NOTIMPL;
371 }
372
get_PhysicalDeviceRect(winfoundtn::Rect * rect)373 virtual HRESULT STDMETHODCALLTYPE get_PhysicalDeviceRect(
374 winfoundtn::Rect* rect) {
375 return E_NOTIMPL;
376 }
377
get_ScreenRect(winfoundtn::Rect * rect)378 virtual HRESULT STDMETHODCALLTYPE get_ScreenRect(winfoundtn::Rect* rect) {
379 return E_NOTIMPL;
380 }
381
get_SupportedUsages(winfoundtn::Collections::IVectorView<windevs::Input::PointerDeviceUsage> ** usages)382 virtual HRESULT STDMETHODCALLTYPE get_SupportedUsages(
383 winfoundtn::Collections::IVectorView<
384 windevs::Input::PointerDeviceUsage>** usages) {
385 return E_NOTIMPL;
386 }
387
388 private:
389 MSG msg_;
390
391 DISALLOW_COPY_AND_ASSIGN(MouseEvent);
392 };
393
394 // This class implements the winrt interfaces needed to support keyboard
395 // character and system character messages.
396 class KeyEvent : public mswr::RuntimeClass<
397 winui::Core::IKeyEventArgs,
398 winui::Core::ICharacterReceivedEventArgs,
399 winui::Core::IAcceleratorKeyEventArgs> {
400 public:
KeyEvent(const MSG & msg)401 KeyEvent(const MSG& msg)
402 : msg_(msg) {}
403
404 // IKeyEventArgs implementation.
get_VirtualKey(winsys::VirtualKey * virtual_key)405 virtual HRESULT STDMETHODCALLTYPE get_VirtualKey(
406 winsys::VirtualKey* virtual_key) {
407 *virtual_key = static_cast<winsys::VirtualKey>(msg_.wParam);
408 return S_OK;
409 }
410
get_KeyStatus(winui::Core::CorePhysicalKeyStatus * key_status)411 virtual HRESULT STDMETHODCALLTYPE get_KeyStatus(
412 winui::Core::CorePhysicalKeyStatus* key_status) {
413 // As per msdn documentation for the keyboard messages.
414 key_status->RepeatCount = msg_.lParam & 0x0000FFFF;
415 key_status->ScanCode = (msg_.lParam >> 16) & 0x00FF;
416 key_status->IsExtendedKey = (msg_.lParam & (1 << 24));
417 key_status->IsMenuKeyDown = (msg_.lParam & (1 << 29));
418 key_status->WasKeyDown = (msg_.lParam & (1 << 30));
419 key_status->IsKeyReleased = (msg_.lParam & (1 << 31));
420 return S_OK;
421 }
422
423 // ICharacterReceivedEventArgs implementation.
get_KeyCode(uint32 * key_code)424 virtual HRESULT STDMETHODCALLTYPE get_KeyCode(uint32* key_code) {
425 *key_code = msg_.wParam;
426 return S_OK;
427 }
428
429 // IAcceleratorKeyEventArgs implementation.
get_EventType(winui::Core::CoreAcceleratorKeyEventType * event_type)430 virtual HRESULT STDMETHODCALLTYPE get_EventType(
431 winui::Core::CoreAcceleratorKeyEventType* event_type) {
432 if (msg_.message == WM_SYSKEYDOWN) {
433 *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyDown;
434 } else if (msg_.message == WM_SYSKEYUP) {
435 *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyUp;
436 } else if (msg_.message == WM_SYSCHAR) {
437 *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemCharacter;
438 }
439 return S_OK;
440 }
441
442 private:
443 MSG msg_;
444 };
445
446 // The following classes are the emulation of the WinRT system as exposed
447 // to metro applications. There is one application (ICoreApplication) which
448 // contains a series of Views (ICoreApplicationView) each one of them
449 // containing a CoreWindow which represents a surface that can drawn to
450 // and that receives events.
451 //
452 // Here is the general dependency hierachy in terms of interfaces:
453 //
454 // IFrameworkViewSource --> IFrameworkView
455 // ^ |
456 // | | metro app
457 // ---------------------------------------------------------------------
458 // | | winRT system
459 // | v
460 // ICoreApplication ICoreApplicationView
461 // |
462 // v
463 // ICoreWindow -----> ICoreWindowInterop
464 // | |
465 // | |
466 // v V
467 // ICoreDispatcher <==> real HWND
468 //
469 class CoreDispatcherEmulation :
470 public mswr::RuntimeClass<
471 winui::Core::ICoreDispatcher,
472 winui::Core::ICoreAcceleratorKeys> {
473 public:
CoreDispatcherEmulation(InputHandler * input_handler)474 CoreDispatcherEmulation(InputHandler* input_handler)
475 : input_handler_(input_handler),
476 accelerator_key_event_handler_(NULL) {}
477
478 // ICoreDispatcher implementation:
get_HasThreadAccess(boolean * value)479 virtual HRESULT STDMETHODCALLTYPE get_HasThreadAccess(boolean* value) {
480 return S_OK;
481 }
482
ProcessEvents(winui::Core::CoreProcessEventsOption options)483 virtual HRESULT STDMETHODCALLTYPE ProcessEvents(
484 winui::Core::CoreProcessEventsOption options) {
485 // We don't support the other message pump modes. So we basically enter a
486 // traditional message loop that we only exit a teardown.
487 if (options != winui::Core::CoreProcessEventsOption_ProcessUntilQuit)
488 return E_FAIL;
489
490 MSG msg = {0};
491 while((::GetMessage(&msg, NULL, 0, 0) != 0) && g_window_count > 0) {
492 ProcessInputMessage(msg);
493 ::TranslateMessage(&msg);
494 ::DispatchMessage(&msg);
495 }
496 // TODO(cpu): figure what to do with msg.WParam which we would normally
497 // return here.
498 return S_OK;
499 }
500
RunAsync(winui::Core::CoreDispatcherPriority priority,winui::Core::IDispatchedHandler * agileCallback,ABI::Windows::Foundation::IAsyncAction ** asyncAction)501 virtual HRESULT STDMETHODCALLTYPE RunAsync(
502 winui::Core::CoreDispatcherPriority priority,
503 winui::Core::IDispatchedHandler *agileCallback,
504 ABI::Windows::Foundation::IAsyncAction** asyncAction) {
505 return S_OK;
506 }
507
RunIdleAsync(winui::Core::IIdleDispatchedHandler * agileCallback,winfoundtn::IAsyncAction ** asyncAction)508 virtual HRESULT STDMETHODCALLTYPE RunIdleAsync(
509 winui::Core::IIdleDispatchedHandler *agileCallback,
510 winfoundtn::IAsyncAction** asyncAction) {
511 return S_OK;
512 }
513
514 // ICoreAcceleratorKeys implementation:
add_AcceleratorKeyActivated(AcceleratorKeyEventHandler * handler,EventRegistrationToken * pCookie)515 virtual HRESULT STDMETHODCALLTYPE add_AcceleratorKeyActivated(
516 AcceleratorKeyEventHandler* handler,
517 EventRegistrationToken *pCookie) {
518 accelerator_key_event_handler_ = handler;
519 accelerator_key_event_handler_->AddRef();
520 return S_OK;
521 }
522
remove_AcceleratorKeyActivated(EventRegistrationToken cookie)523 virtual HRESULT STDMETHODCALLTYPE remove_AcceleratorKeyActivated(
524 EventRegistrationToken cookie) {
525 accelerator_key_event_handler_->Release();
526 accelerator_key_event_handler_ = NULL;
527 return S_OK;
528 }
529
530 private:
ProcessInputMessage(const MSG & msg)531 bool ProcessInputMessage(const MSG& msg) {
532 // Poor man's way of dispatching input events.
533 bool ret = false;
534 if (input_handler_) {
535 if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) {
536 if ((msg.message == WM_SYSKEYDOWN) || (msg.message == WM_SYSKEYUP) ||
537 msg.message == WM_SYSCHAR) {
538 ret = HandleSystemKeys(msg);
539 } else {
540 ret = input_handler_->HandleKeyboardMessage(msg);
541 }
542 } else if ((msg.message >= WM_MOUSEFIRST) &&
543 (msg.message <= WM_MOUSELAST)) {
544 ret = input_handler_->HandleMouseMessage(msg);
545 }
546 }
547 return ret;
548 }
549
HandleSystemKeys(const MSG & msg)550 bool HandleSystemKeys(const MSG& msg) {
551 mswr::ComPtr<winui::Core::IAcceleratorKeyEventArgs> event_args;
552 event_args = mswr::Make<KeyEvent>(msg);
553 accelerator_key_event_handler_->Invoke(this, event_args.Get());
554 return true;
555 }
556
557 InputHandler* input_handler_;
558 AcceleratorKeyEventHandler* accelerator_key_event_handler_;
559 };
560
561 class CoreWindowEmulation
562 : public mswr::RuntimeClass<
563 mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>,
564 winui::Core::ICoreWindow, ICoreWindowInterop>,
565 public InputHandler {
566 public:
CoreWindowEmulation()567 CoreWindowEmulation()
568 : core_hwnd_(NULL),
569 mouse_moved_handler_(NULL),
570 mouse_capture_lost_handler_(NULL),
571 mouse_pressed_handler_(NULL),
572 mouse_released_handler_(NULL),
573 mouse_entered_handler_(NULL),
574 mouse_exited_handler_(NULL),
575 mouse_wheel_changed_handler_(NULL),
576 key_down_handler_(NULL),
577 key_up_handler_(NULL),
578 character_received_handler_(NULL) {
579 dispatcher_ = mswr::Make<CoreDispatcherEmulation>(this);
580
581 // Unless we select our own AppUserModelID the shell might confuse us
582 // with the app launcher one and we get the wrong taskbar button and icon.
583 ::SetCurrentProcessExplicitAppUserModelID(kAshWin7AppId);
584
585 RECT work_area = {0};
586 ::SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
587 if (::IsDebuggerPresent()) {
588 work_area.top = 0;
589 work_area.left = 0;
590 work_area.right = 1600;
591 work_area.bottom = 900;
592 }
593
594 core_hwnd_ = CreateMetroTopLevelWindow(work_area);
595 }
596
~CoreWindowEmulation()597 ~CoreWindowEmulation() {
598 if (core_hwnd_)
599 ::DestroyWindow(core_hwnd_);
600 }
601
602 // ICoreWindow implementation:
get_AutomationHostProvider(IInspectable ** value)603 virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider(
604 IInspectable** value) {
605 return S_OK;
606 }
607
get_Bounds(winfoundtn::Rect * value)608 virtual HRESULT STDMETHODCALLTYPE get_Bounds(
609 winfoundtn::Rect* value) {
610 RECT rect;
611 if (!::GetClientRect(core_hwnd_, &rect))
612 return E_FAIL;
613 value->Width = rect.right;
614 value->Height = rect.bottom;
615 return S_OK;
616 }
617
get_CustomProperties(winfoundtn::Collections::IPropertySet ** value)618 virtual HRESULT STDMETHODCALLTYPE get_CustomProperties(
619 winfoundtn::Collections::IPropertySet** value) {
620 return S_OK;
621 }
622
get_Dispatcher(winui::Core::ICoreDispatcher ** value)623 virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
624 winui::Core::ICoreDispatcher** value) {
625 return dispatcher_.CopyTo(value);
626 }
627
get_FlowDirection(winui::Core::CoreWindowFlowDirection * value)628 virtual HRESULT STDMETHODCALLTYPE get_FlowDirection(
629 winui::Core::CoreWindowFlowDirection* value) {
630 return S_OK;
631 }
632
put_FlowDirection(winui::Core::CoreWindowFlowDirection value)633 virtual HRESULT STDMETHODCALLTYPE put_FlowDirection(
634 winui::Core::CoreWindowFlowDirection value) {
635 return S_OK;
636 }
637
get_IsInputEnabled(boolean * value)638 virtual HRESULT STDMETHODCALLTYPE get_IsInputEnabled(
639 boolean* value) {
640 return S_OK;
641 }
642
put_IsInputEnabled(boolean value)643 virtual HRESULT STDMETHODCALLTYPE put_IsInputEnabled(
644 boolean value) {
645 return S_OK;
646 }
647
get_PointerCursor(winui::Core::ICoreCursor ** value)648 virtual HRESULT STDMETHODCALLTYPE get_PointerCursor(
649 winui::Core::ICoreCursor** value) {
650 return S_OK;
651 }
652
put_PointerCursor(winui::Core::ICoreCursor * value)653 virtual HRESULT STDMETHODCALLTYPE put_PointerCursor(
654 winui::Core::ICoreCursor* value) {
655 return S_OK;
656 }
657
get_PointerPosition(winfoundtn::Point * value)658 virtual HRESULT STDMETHODCALLTYPE get_PointerPosition(
659 winfoundtn::Point* value) {
660 return S_OK;
661 }
662
get_Visible(boolean * value)663 virtual HRESULT STDMETHODCALLTYPE get_Visible(
664 boolean* value) {
665 return S_OK;
666 }
667
Activate(void)668 virtual HRESULT STDMETHODCALLTYPE Activate(void) {
669 // After we fire OnActivate on the View, Chrome calls us back here.
670 return S_OK;
671 }
672
Close(void)673 virtual HRESULT STDMETHODCALLTYPE Close(void) {
674 ::PostMessage(core_hwnd_, WM_CLOSE, 0, 0);
675 core_hwnd_ = NULL;
676 return S_OK;
677 }
678
GetAsyncKeyState(ABI::Windows::System::VirtualKey virtualKey,winui::Core::CoreVirtualKeyStates * KeyState)679 virtual HRESULT STDMETHODCALLTYPE GetAsyncKeyState(
680 ABI::Windows::System::VirtualKey virtualKey,
681 winui::Core::CoreVirtualKeyStates* KeyState) {
682 return S_OK;
683 }
684
GetKeyState(ABI::Windows::System::VirtualKey virtualKey,winui::Core::CoreVirtualKeyStates * KeyState)685 virtual HRESULT STDMETHODCALLTYPE GetKeyState(
686 ABI::Windows::System::VirtualKey virtualKey,
687 winui::Core::CoreVirtualKeyStates* KeyState) {
688 return S_OK;
689 }
690
ReleasePointerCapture(void)691 virtual HRESULT STDMETHODCALLTYPE ReleasePointerCapture(void) {
692 return S_OK;
693 }
694
SetPointerCapture(void)695 virtual HRESULT STDMETHODCALLTYPE SetPointerCapture(void) {
696 return S_OK;
697 }
698
add_Activated(WindowActivatedHandler * handler,EventRegistrationToken * pCookie)699 virtual HRESULT STDMETHODCALLTYPE add_Activated(
700 WindowActivatedHandler* handler,
701 EventRegistrationToken* pCookie) {
702 // TODO(cpu) implement this.
703 return S_OK;
704 }
705
remove_Activated(EventRegistrationToken cookie)706 virtual HRESULT STDMETHODCALLTYPE remove_Activated(
707 EventRegistrationToken cookie) {
708 return S_OK;
709 }
710
add_AutomationProviderRequested(AutomationProviderHandler * handler,EventRegistrationToken * cookie)711 virtual HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested(
712 AutomationProviderHandler* handler,
713 EventRegistrationToken* cookie) {
714 return S_OK;
715 }
716
remove_AutomationProviderRequested(EventRegistrationToken cookie)717 virtual HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested(
718 EventRegistrationToken cookie) {
719 return S_OK;
720 }
721
add_CharacterReceived(CharEventHandler * handler,EventRegistrationToken * pCookie)722 virtual HRESULT STDMETHODCALLTYPE add_CharacterReceived(
723 CharEventHandler* handler,
724 EventRegistrationToken* pCookie) {
725 character_received_handler_ = handler;
726 character_received_handler_->AddRef();
727 return S_OK;
728 }
729
remove_CharacterReceived(EventRegistrationToken cookie)730 virtual HRESULT STDMETHODCALLTYPE remove_CharacterReceived(
731 EventRegistrationToken cookie) {
732 character_received_handler_->Release();
733 character_received_handler_ = NULL;
734 return S_OK;
735 }
736
add_Closed(CoreWindowEventHandler * handler,EventRegistrationToken * pCookie)737 virtual HRESULT STDMETHODCALLTYPE add_Closed(
738 CoreWindowEventHandler* handler,
739 EventRegistrationToken* pCookie) {
740 return S_OK;
741 }
742
remove_Closed(EventRegistrationToken cookie)743 virtual HRESULT STDMETHODCALLTYPE remove_Closed(
744 EventRegistrationToken cookie) {
745 return S_OK;
746 }
747
add_InputEnabled(InputEnabledEventHandler * handler,EventRegistrationToken * pCookie)748 virtual HRESULT STDMETHODCALLTYPE add_InputEnabled(
749 InputEnabledEventHandler* handler,
750 EventRegistrationToken* pCookie) {
751 return S_OK;
752 }
753
remove_InputEnabled(EventRegistrationToken cookie)754 virtual HRESULT STDMETHODCALLTYPE remove_InputEnabled(
755 EventRegistrationToken cookie) {
756 return S_OK;
757 }
758
add_KeyDown(KeyEventHandler * handler,EventRegistrationToken * pCookie)759 virtual HRESULT STDMETHODCALLTYPE add_KeyDown(
760 KeyEventHandler* handler,
761 EventRegistrationToken* pCookie) {
762 key_down_handler_ = handler;
763 key_down_handler_->AddRef();
764 return S_OK;
765 }
766
remove_KeyDown(EventRegistrationToken cookie)767 virtual HRESULT STDMETHODCALLTYPE remove_KeyDown(
768 EventRegistrationToken cookie) {
769 key_down_handler_->Release();
770 key_down_handler_ = NULL;
771 return S_OK;
772 }
773
add_KeyUp(KeyEventHandler * handler,EventRegistrationToken * pCookie)774 virtual HRESULT STDMETHODCALLTYPE add_KeyUp(
775 KeyEventHandler* handler,
776 EventRegistrationToken* pCookie) {
777 key_up_handler_ = handler;
778 key_up_handler_->AddRef();
779 return S_OK;
780 }
781
remove_KeyUp(EventRegistrationToken cookie)782 virtual HRESULT STDMETHODCALLTYPE remove_KeyUp(
783 EventRegistrationToken cookie) {
784 key_up_handler_->Release();
785 key_up_handler_ = NULL;
786 return S_OK;
787 }
788
add_PointerCaptureLost(PointerEventHandler * handler,EventRegistrationToken * cookie)789 virtual HRESULT STDMETHODCALLTYPE add_PointerCaptureLost(
790 PointerEventHandler* handler,
791 EventRegistrationToken* cookie) {
792 mouse_capture_lost_handler_ = handler;
793 return S_OK;
794 }
795
remove_PointerCaptureLost(EventRegistrationToken cookie)796 virtual HRESULT STDMETHODCALLTYPE remove_PointerCaptureLost(
797 EventRegistrationToken cookie) {
798 mouse_capture_lost_handler_ = NULL;
799 return S_OK;
800 }
801
add_PointerEntered(PointerEventHandler * handler,EventRegistrationToken * cookie)802 virtual HRESULT STDMETHODCALLTYPE add_PointerEntered(
803 PointerEventHandler* handler,
804 EventRegistrationToken* cookie) {
805 mouse_entered_handler_ = handler;
806 return S_OK;
807 }
808
remove_PointerEntered(EventRegistrationToken cookie)809 virtual HRESULT STDMETHODCALLTYPE remove_PointerEntered(
810 EventRegistrationToken cookie) {
811 mouse_entered_handler_ = NULL;
812 return S_OK;
813 }
814
add_PointerExited(PointerEventHandler * handler,EventRegistrationToken * cookie)815 virtual HRESULT STDMETHODCALLTYPE add_PointerExited(
816 PointerEventHandler* handler,
817 EventRegistrationToken* cookie) {
818 mouse_exited_handler_ = handler;
819 return S_OK;
820 }
821
remove_PointerExited(EventRegistrationToken cookie)822 virtual HRESULT STDMETHODCALLTYPE remove_PointerExited(
823 EventRegistrationToken cookie) {
824 mouse_exited_handler_ = NULL;
825 return S_OK;
826 }
827
add_PointerMoved(PointerEventHandler * handler,EventRegistrationToken * cookie)828 virtual HRESULT STDMETHODCALLTYPE add_PointerMoved(
829 PointerEventHandler* handler,
830 EventRegistrationToken* cookie) {
831 mouse_moved_handler_ = handler;
832 mouse_moved_handler_->AddRef();
833 return S_OK;
834 }
835
remove_PointerMoved(EventRegistrationToken cookie)836 virtual HRESULT STDMETHODCALLTYPE remove_PointerMoved(
837 EventRegistrationToken cookie) {
838 mouse_moved_handler_->Release();
839 mouse_moved_handler_ = NULL;
840 return S_OK;
841 }
842
add_PointerPressed(PointerEventHandler * handler,EventRegistrationToken * cookie)843 virtual HRESULT STDMETHODCALLTYPE add_PointerPressed(
844 PointerEventHandler* handler,
845 EventRegistrationToken* cookie) {
846 mouse_pressed_handler_ = handler;
847 mouse_pressed_handler_->AddRef();
848 return S_OK;
849 }
850
remove_PointerPressed(EventRegistrationToken cookie)851 virtual HRESULT STDMETHODCALLTYPE remove_PointerPressed(
852 EventRegistrationToken cookie) {
853 mouse_pressed_handler_->Release();
854 mouse_pressed_handler_ = NULL;
855 return S_OK;
856 }
857
add_PointerReleased(PointerEventHandler * handler,EventRegistrationToken * cookie)858 virtual HRESULT STDMETHODCALLTYPE add_PointerReleased(
859 PointerEventHandler* handler,
860 EventRegistrationToken* cookie) {
861 mouse_released_handler_ = handler;
862 mouse_released_handler_->AddRef();
863 return S_OK;
864 }
865
remove_PointerReleased(EventRegistrationToken cookie)866 virtual HRESULT STDMETHODCALLTYPE remove_PointerReleased(
867 EventRegistrationToken cookie) {
868 mouse_released_handler_->Release();
869 mouse_released_handler_ = NULL;
870 return S_OK;
871 }
872
add_TouchHitTesting(TouchHitTestHandler * handler,EventRegistrationToken * pCookie)873 virtual HRESULT STDMETHODCALLTYPE add_TouchHitTesting(
874 TouchHitTestHandler* handler,
875 EventRegistrationToken* pCookie) {
876 return S_OK;
877 }
878
remove_TouchHitTesting(EventRegistrationToken cookie)879 virtual HRESULT STDMETHODCALLTYPE remove_TouchHitTesting(
880 EventRegistrationToken cookie) {
881 return S_OK;
882 }
883
add_PointerWheelChanged(PointerEventHandler * handler,EventRegistrationToken * cookie)884 virtual HRESULT STDMETHODCALLTYPE add_PointerWheelChanged(
885 PointerEventHandler* handler,
886 EventRegistrationToken* cookie) {
887 mouse_wheel_changed_handler_ = handler;
888 mouse_wheel_changed_handler_->AddRef();
889 return S_OK;
890 }
891
remove_PointerWheelChanged(EventRegistrationToken cookie)892 virtual HRESULT STDMETHODCALLTYPE remove_PointerWheelChanged(
893 EventRegistrationToken cookie) {
894 mouse_wheel_changed_handler_->Release();
895 mouse_wheel_changed_handler_ = NULL;
896 return S_OK;
897 }
898
add_SizeChanged(SizeChangedHandler * handler,EventRegistrationToken * pCookie)899 virtual HRESULT STDMETHODCALLTYPE add_SizeChanged(
900 SizeChangedHandler* handler,
901 EventRegistrationToken* pCookie) {
902 // TODO(cpu): implement this.
903 return S_OK;
904 }
905
remove_SizeChanged(EventRegistrationToken cookie)906 virtual HRESULT STDMETHODCALLTYPE remove_SizeChanged(
907 EventRegistrationToken cookie) {
908 return S_OK;
909 }
910
add_VisibilityChanged(VisibilityChangedHandler * handler,EventRegistrationToken * pCookie)911 virtual HRESULT STDMETHODCALLTYPE add_VisibilityChanged(
912 VisibilityChangedHandler* handler,
913 EventRegistrationToken* pCookie) {
914 return S_OK;
915 }
916
remove_VisibilityChanged(EventRegistrationToken cookie)917 virtual HRESULT STDMETHODCALLTYPE remove_VisibilityChanged(
918 EventRegistrationToken cookie) {
919 return S_OK;
920 }
921
922 // ICoreWindowInterop implementation:
get_WindowHandle(HWND * hwnd)923 virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(HWND* hwnd) {
924 if (!core_hwnd_)
925 return E_FAIL;
926 *hwnd = core_hwnd_;
927 return S_OK;
928 }
929
put_MessageHandled(boolean value)930 virtual HRESULT STDMETHODCALLTYPE put_MessageHandled(
931 boolean value) {
932 return S_OK;
933 }
934
935 // InputHandler
HandleKeyboardMessage(const MSG & msg)936 virtual bool HandleKeyboardMessage(const MSG& msg) OVERRIDE {
937 switch (msg.message) {
938 case WM_KEYDOWN:
939 case WM_KEYUP: {
940 mswr::ComPtr<winui::Core::IKeyEventArgs> event_args;
941 event_args = mswr::Make<KeyEvent>(msg);
942 KeyEventHandler* handler = NULL;
943 if (msg.message == WM_KEYDOWN) {
944 handler = key_down_handler_;
945 } else {
946 handler = key_up_handler_;
947 }
948 handler->Invoke(this, event_args.Get());
949 break;
950 }
951
952 case WM_CHAR:
953 case WM_DEADCHAR:
954 case WM_UNICHAR: {
955 mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> event_args;
956 event_args = mswr::Make<KeyEvent>(msg);
957 character_received_handler_->Invoke(this, event_args.Get());
958 break;
959 }
960
961 default:
962 return false;
963 }
964 return true;
965 }
966
HandleMouseMessage(const MSG & msg)967 virtual bool HandleMouseMessage(const MSG& msg) OVERRIDE {
968 PointerEventHandler* handler = NULL;
969 mswr::ComPtr<winui::Core::IPointerEventArgs> event_args;
970 event_args = mswr::Make<MouseEvent>(msg);
971 switch (msg.message) {
972 case WM_MOUSEMOVE: {
973 handler = mouse_moved_handler_;
974 break;
975 }
976 case WM_LBUTTONDOWN: {
977 case WM_RBUTTONDOWN:
978 case WM_MBUTTONDOWN:
979 handler = mouse_pressed_handler_;
980 break;
981 }
982
983 case WM_LBUTTONUP: {
984 case WM_RBUTTONUP:
985 case WM_MBUTTONUP:
986 handler = mouse_released_handler_;
987 break;
988 }
989
990 case WM_MOUSEWHEEL: {
991 case WM_MOUSEHWHEEL:
992 handler = mouse_wheel_changed_handler_;
993 break;
994 }
995
996 default:
997 return false;
998 }
999 DCHECK(handler);
1000 handler->Invoke(this, event_args.Get());
1001 return true;
1002 }
1003
1004 private:
1005 PointerEventHandler* mouse_moved_handler_;
1006 PointerEventHandler* mouse_capture_lost_handler_;
1007 PointerEventHandler* mouse_pressed_handler_;
1008 PointerEventHandler* mouse_released_handler_;
1009 PointerEventHandler* mouse_entered_handler_;
1010 PointerEventHandler* mouse_exited_handler_;
1011 PointerEventHandler* mouse_wheel_changed_handler_;
1012 KeyEventHandler* key_down_handler_;
1013 KeyEventHandler* key_up_handler_;
1014 CharEventHandler* character_received_handler_;
1015 HWND core_hwnd_;
1016 mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_;
1017 };
1018
1019 class ActivatedEvent
1020 : public mswr::RuntimeClass<winapp::Activation::IActivatedEventArgs> {
1021 public:
ActivatedEvent(winapp::Activation::ActivationKind activation_kind)1022 ActivatedEvent(winapp::Activation::ActivationKind activation_kind)
1023 : activation_kind_(activation_kind) {
1024 }
1025
get_Kind(winapp::Activation::ActivationKind * value)1026 virtual HRESULT STDMETHODCALLTYPE get_Kind(
1027 winapp::Activation::ActivationKind *value) {
1028 *value = activation_kind_;
1029 return S_OK;
1030 }
1031
get_PreviousExecutionState(winapp::Activation::ApplicationExecutionState * value)1032 virtual HRESULT STDMETHODCALLTYPE get_PreviousExecutionState(
1033 winapp::Activation::ApplicationExecutionState *value) {
1034 *value = winapp::Activation::ApplicationExecutionState_ClosedByUser;
1035 return S_OK;
1036 }
1037
get_SplashScreen(winapp::Activation::ISplashScreen ** value)1038 virtual HRESULT STDMETHODCALLTYPE get_SplashScreen(
1039 winapp::Activation::ISplashScreen **value) {
1040 return E_FAIL;
1041 }
1042
1043 private:
1044 winapp::Activation::ActivationKind activation_kind_;
1045 };
1046
1047 class CoreApplicationViewEmulation
1048 : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> {
1049 public:
CoreApplicationViewEmulation()1050 CoreApplicationViewEmulation() {
1051 core_window_ = mswr::Make<CoreWindowEmulation>();
1052 }
1053
Activate()1054 HRESULT Activate() {
1055 if (activated_handler_) {
1056 auto ae = mswr::Make<ActivatedEvent>(
1057 winapp::Activation::ActivationKind_File);
1058 return activated_handler_->Invoke(this, ae.Get());
1059 } else {
1060 return S_OK;
1061 }
1062 }
1063
Close()1064 HRESULT Close() {
1065 return core_window_->Close();
1066 }
1067
1068 // ICoreApplicationView implementation:
get_CoreWindow(winui::Core::ICoreWindow ** value)1069 virtual HRESULT STDMETHODCALLTYPE get_CoreWindow(
1070 winui::Core::ICoreWindow** value) {
1071 if (!core_window_)
1072 return E_FAIL;
1073 return core_window_.CopyTo(value);
1074 }
1075
add_Activated(ActivatedHandler * handler,EventRegistrationToken * token)1076 virtual HRESULT STDMETHODCALLTYPE add_Activated(
1077 ActivatedHandler* handler,
1078 EventRegistrationToken* token) {
1079 // The real component supports multiple handles but we don't yet.
1080 if (activated_handler_)
1081 return E_FAIL;
1082 activated_handler_ = handler;
1083 return S_OK;
1084 }
1085
remove_Activated(EventRegistrationToken token)1086 virtual HRESULT STDMETHODCALLTYPE remove_Activated(
1087 EventRegistrationToken token) {
1088 // Chrome never unregisters handlers, so we don't care about it.
1089 return S_OK;
1090 }
1091
get_IsMain(boolean * value)1092 virtual HRESULT STDMETHODCALLTYPE get_IsMain(
1093 boolean* value) {
1094 return S_OK;
1095 }
1096
get_IsHosted(boolean * value)1097 virtual HRESULT STDMETHODCALLTYPE get_IsHosted(
1098 boolean* value) {
1099 return S_OK;
1100 }
1101
1102 private:
1103 mswr::ComPtr<CoreWindowEmulation> core_window_;
1104 mswr::ComPtr<ActivatedHandler> activated_handler_;
1105 };
1106
1107 class CoreApplicationWin7Emulation
1108 : public mswr::RuntimeClass<winapp::Core::ICoreApplication,
1109 winapp::Core::ICoreApplicationExit> {
1110 public:
1111 // ICoreApplication implementation:
1112
get_Id(HSTRING * value)1113 virtual HRESULT STDMETHODCALLTYPE get_Id(
1114 HSTRING* value) {
1115 return S_OK;
1116 }
1117
add_Suspending(winfoundtn::IEventHandler<winapp::SuspendingEventArgs * > * handler,EventRegistrationToken * token)1118 virtual HRESULT STDMETHODCALLTYPE add_Suspending(
1119 winfoundtn::IEventHandler<winapp::SuspendingEventArgs*>* handler,
1120 EventRegistrationToken* token) {
1121 return S_OK;
1122 }
1123
remove_Suspending(EventRegistrationToken token)1124 virtual HRESULT STDMETHODCALLTYPE remove_Suspending(
1125 EventRegistrationToken token) {
1126 return S_OK;
1127 }
1128
add_Resuming(winfoundtn::IEventHandler<IInspectable * > * handler,EventRegistrationToken * token)1129 virtual HRESULT STDMETHODCALLTYPE add_Resuming(
1130 winfoundtn::IEventHandler<IInspectable*>* handler,
1131 EventRegistrationToken* token) {
1132 return S_OK;
1133 }
1134
remove_Resuming(EventRegistrationToken token)1135 virtual HRESULT STDMETHODCALLTYPE remove_Resuming(
1136 EventRegistrationToken token) {
1137 return S_OK;
1138 }
1139
get_Properties(winfoundtn::Collections::IPropertySet ** value)1140 virtual HRESULT STDMETHODCALLTYPE get_Properties(
1141 winfoundtn::Collections::IPropertySet** value) {
1142 return S_OK;
1143 }
1144
GetCurrentView(winapp::Core::ICoreApplicationView ** value)1145 virtual HRESULT STDMETHODCALLTYPE GetCurrentView(
1146 winapp::Core::ICoreApplicationView** value) {
1147 return S_OK;
1148 }
1149
Run(winapp::Core::IFrameworkViewSource * viewSource)1150 virtual HRESULT STDMETHODCALLTYPE Run(
1151 winapp::Core::IFrameworkViewSource* viewSource) {
1152 HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf());
1153 if (FAILED(hr))
1154 return hr;
1155 view_emulation_ = mswr::Make<CoreApplicationViewEmulation>();
1156 hr = app_view_->Initialize(view_emulation_.Get());
1157 if (FAILED(hr))
1158 return hr;
1159 mswr::ComPtr<winui::Core::ICoreWindow> core_window;
1160 hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf());
1161 if (FAILED(hr))
1162 return hr;
1163 hr = app_view_->SetWindow(core_window.Get());
1164 if (FAILED(hr))
1165 return hr;
1166 hr = app_view_->Load(NULL);
1167 if (FAILED(hr))
1168 return hr;
1169 hr = view_emulation_->Activate();
1170 if (FAILED(hr))
1171 return hr;
1172 return app_view_->Run();
1173 }
1174
RunWithActivationFactories(winfoundtn::IGetActivationFactory * activationFactoryCallback)1175 virtual HRESULT STDMETHODCALLTYPE RunWithActivationFactories(
1176 winfoundtn::IGetActivationFactory* activationFactoryCallback) {
1177 return S_OK;
1178 }
1179
1180 // ICoreApplicationExit implementation:
1181
Exit(void)1182 virtual HRESULT STDMETHODCALLTYPE Exit(void) {
1183 return view_emulation_->Close();
1184 }
1185
add_Exiting(winfoundtn::IEventHandler<IInspectable * > * handler,EventRegistrationToken * token)1186 virtual HRESULT STDMETHODCALLTYPE add_Exiting(
1187 winfoundtn::IEventHandler<IInspectable*>* handler,
1188 EventRegistrationToken* token) {
1189 return S_OK;
1190 }
1191
remove_Exiting(EventRegistrationToken token)1192 virtual HRESULT STDMETHODCALLTYPE remove_Exiting(
1193 EventRegistrationToken token) {
1194 return S_OK;
1195 }
1196
1197 private:
1198 mswr::ComPtr<winapp::Core::IFrameworkView> app_view_;
1199 mswr::ComPtr<CoreApplicationViewEmulation> view_emulation_;
1200 };
1201
1202
InitWindows7()1203 mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() {
1204 HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
1205 if (FAILED(hr))
1206 CHECK(false);
1207 return mswr::Make<CoreApplicationWin7Emulation>();
1208 }
1209
1210