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