OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "stdafx.h" | 5 #include "stdafx.h" |
| 6 #include <corewindow.h> |
| 7 |
| 8 #include "base/logging.h" |
6 | 9 |
7 EXTERN_C IMAGE_DOS_HEADER __ImageBase; | 10 EXTERN_C IMAGE_DOS_HEADER __ImageBase; |
8 | 11 |
9 struct Globals { | |
10 LPTHREAD_START_ROUTINE host_main; | |
11 void* host_context; | |
12 HWND core_window; | |
13 HWND host_window; | |
14 HANDLE host_thread; | |
15 DWORD main_thread_id; | |
16 } globals; | |
17 | |
18 | |
19 void ODS(const char* str, LONG_PTR val = 0) { | |
20 char buf[80]; | |
21 size_t len = strlen(str); | |
22 if (len > 50) { | |
23 ::OutputDebugStringA("ODS: buffer too long"); | |
24 return; | |
25 } | |
26 | |
27 if (str[0] == '!') { | |
28 // Fatal error. | |
29 DWORD gle = ::GetLastError(); | |
30 if (::IsDebuggerPresent()) | |
31 __debugbreak(); | |
32 wsprintfA(buf, "ODS:fatal %s (%p) gle=0x%x", str, val, gle); | |
33 ::MessageBoxA(NULL, buf, "!!!", MB_OK); | |
34 ::ExitProcess(gle); | |
35 } else { | |
36 // Just information. | |
37 wsprintfA(buf, "ODS:%s (%p)\n", str, val); | |
38 ::OutputDebugStringA(buf); | |
39 } | |
40 } | |
41 | |
42 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, | 12 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, |
43 WPARAM wparam, LPARAM lparam) { | 13 WPARAM wparam, LPARAM lparam) { |
44 PAINTSTRUCT ps; | 14 PAINTSTRUCT ps; |
45 HDC hdc; | 15 HDC hdc; |
46 switch (message) { | 16 switch (message) { |
47 case WM_PAINT: | 17 case WM_PAINT: |
48 hdc = BeginPaint(hwnd, &ps); | 18 hdc = BeginPaint(hwnd, &ps); |
49 EndPaint(hwnd, &ps); | 19 EndPaint(hwnd, &ps); |
50 break; | 20 break; |
51 case WM_DESTROY: | 21 case WM_DESTROY: |
52 PostQuitMessage(0); | 22 PostQuitMessage(0); |
53 ODS("Metro WM_DESTROY received"); | |
54 break; | 23 break; |
55 default: | 24 default: |
56 return DefWindowProc(hwnd, message, wparam, lparam); | 25 return DefWindowProc(hwnd, message, wparam, lparam); |
57 } | 26 } |
58 return 0; | 27 return 0; |
59 } | 28 } |
60 | 29 |
61 HWND CreateMetroTopLevelWindow() { | 30 HWND CreateMetroTopLevelWindow() { |
62 HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); | 31 HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); |
63 WNDCLASSEXW wcex; | 32 WNDCLASSEXW wcex; |
64 wcex.cbSize = sizeof(wcex); | 33 wcex.cbSize = sizeof(wcex); |
65 wcex.style = CS_HREDRAW | CS_VREDRAW; | 34 wcex.style = CS_HREDRAW | CS_VREDRAW; |
66 wcex.lpfnWndProc = WndProc; | 35 wcex.lpfnWndProc = WndProc; |
67 wcex.cbClsExtra = 0; | 36 wcex.cbClsExtra = 0; |
68 wcex.cbWndExtra = 0; | 37 wcex.cbWndExtra = 0; |
69 wcex.hInstance = hInst; | 38 wcex.hInstance = hInst; |
70 wcex.hIcon = 0; | 39 wcex.hIcon = 0; |
71 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); | 40 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
72 wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); | 41 wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); |
73 wcex.lpszMenuName = 0; | 42 wcex.lpszMenuName = 0; |
74 wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; | 43 wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; |
75 wcex.hIconSm = 0; | 44 wcex.hIconSm = 0; |
76 | 45 |
77 HWND hwnd = ::CreateWindowExW(0, | 46 HWND hwnd = ::CreateWindowExW(0, |
78 MAKEINTATOM(::RegisterClassExW(&wcex)), | 47 MAKEINTATOM(::RegisterClassExW(&wcex)), |
79 L"metro_metro", | 48 L"metro_win7", |
80 WS_POPUP, | 49 WS_POPUP, |
81 0, 0, 0, 0, | 50 0, 0, 0, 0, |
82 NULL, NULL, hInst, NULL); | 51 NULL, NULL, hInst, NULL); |
83 return hwnd; | 52 return hwnd; |
84 } | 53 } |
85 | 54 |
86 DWORD WINAPI HostThread(void*) { | 55 typedef winfoundtn::ITypedEventHandler< |
87 // The sleeps simulates the delay we have in the actual metro code | 56 winapp::Core::CoreApplicationView*, |
88 // which takes in account the corewindow being created and some other | 57 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; |
89 // unknown machinations of metro. | 58 |
90 ODS("Chrome main thread", ::GetCurrentThreadId()); | 59 typedef winfoundtn::ITypedEventHandler< |
91 ::Sleep(30); | 60 winui::Core::CoreWindow*, |
92 return globals.host_main(globals.host_context); | 61 winui::Core::WindowActivatedEventArgs*> WindowActivatedHandler; |
| 62 |
| 63 typedef winfoundtn::ITypedEventHandler< |
| 64 winui::Core::CoreWindow*, |
| 65 winui::Core::AutomationProviderRequestedEventArgs*> |
| 66 AutomationProviderHandler; |
| 67 |
| 68 typedef winfoundtn::ITypedEventHandler< |
| 69 winui::Core::CoreWindow*, |
| 70 winui::Core::CharacterReceivedEventArgs*> CharEventHandler; |
| 71 |
| 72 typedef winfoundtn::ITypedEventHandler< |
| 73 winui::Core::CoreWindow*, |
| 74 winui::Core::CoreWindowEventArgs*> CoreWindowEventHandler; |
| 75 |
| 76 typedef winfoundtn::ITypedEventHandler< |
| 77 winui::Core::CoreWindow*, |
| 78 winui::Core::InputEnabledEventArgs*> InputEnabledEventHandler; |
| 79 |
| 80 typedef winfoundtn::ITypedEventHandler< |
| 81 winui::Core::CoreWindow*, |
| 82 winui::Core::KeyEventArgs*> KeyEventHandler; |
| 83 |
| 84 typedef winfoundtn::ITypedEventHandler< |
| 85 winui::Core::CoreWindow*, |
| 86 winui::Core::PointerEventArgs*> PointerEventHandler; |
| 87 |
| 88 typedef winfoundtn::ITypedEventHandler< |
| 89 winui::Core::CoreWindow*, |
| 90 winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler; |
| 91 |
| 92 typedef winfoundtn::ITypedEventHandler< |
| 93 winui::Core::CoreWindow*, |
| 94 winui::Core::TouchHitTestingEventArgs*> TouchHitTestHandler; |
| 95 |
| 96 typedef winfoundtn::ITypedEventHandler< |
| 97 winui::Core::CoreWindow*, |
| 98 winui::Core::VisibilityChangedEventArgs*> VisibilityChangedHandler; |
| 99 |
| 100 // The following classes are the emulation of the WinRT system as exposed |
| 101 // to metro applications. There is one application (ICoreApplication) which |
| 102 // contains a series of Views (ICoreApplicationView) each one of them |
| 103 // containing a CoreWindow which represents a surface that can drawn to |
| 104 // and that receives events. |
| 105 // |
| 106 // Here is the general dependency hierachy in terms of interfaces: |
| 107 // |
| 108 // IFrameworkViewSource --> IFrameworkView |
| 109 // ^ | |
| 110 // | | metro app |
| 111 // --------------------------------------------------------------------- |
| 112 // | | winRT system |
| 113 // | v |
| 114 // ICoreApplication ICoreApplicationView |
| 115 // | |
| 116 // v |
| 117 // ICoreWindow ----> ICoreWindowInterop |
| 118 // | |
| 119 // | |
| 120 // V |
| 121 // real HWND |
| 122 // |
| 123 |
| 124 class CoreWindowEmulation |
| 125 : public mswr::RuntimeClass< |
| 126 mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>, |
| 127 winui::Core::ICoreWindow, ICoreWindowInterop> { |
| 128 public: |
| 129 // ICoreWindow implementation: |
| 130 virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider( |
| 131 IInspectable **value) { |
| 132 return S_OK; |
| 133 } |
| 134 |
| 135 virtual HRESULT STDMETHODCALLTYPE get_Bounds( |
| 136 winfoundtn::Rect* value) { |
| 137 return S_OK; |
| 138 } |
| 139 |
| 140 virtual HRESULT STDMETHODCALLTYPE get_CustomProperties( |
| 141 winfoundtn::Collections::IPropertySet **value) { |
| 142 return S_OK; |
| 143 } |
| 144 |
| 145 virtual HRESULT STDMETHODCALLTYPE get_Dispatcher( |
| 146 winui::Core::ICoreDispatcher **value) { |
| 147 return S_OK; |
| 148 } |
| 149 |
| 150 virtual HRESULT STDMETHODCALLTYPE get_FlowDirection( |
| 151 winui::Core::CoreWindowFlowDirection* value) { |
| 152 return S_OK; |
| 153 } |
| 154 |
| 155 virtual HRESULT STDMETHODCALLTYPE put_FlowDirection( |
| 156 winui::Core::CoreWindowFlowDirection value) { |
| 157 return S_OK; |
| 158 } |
| 159 |
| 160 virtual HRESULT STDMETHODCALLTYPE get_IsInputEnabled( |
| 161 boolean* value) { |
| 162 return S_OK; |
| 163 } |
| 164 |
| 165 virtual HRESULT STDMETHODCALLTYPE put_IsInputEnabled( |
| 166 boolean value) { |
| 167 return S_OK; |
| 168 } |
| 169 |
| 170 virtual HRESULT STDMETHODCALLTYPE get_PointerCursor( |
| 171 winui::Core::ICoreCursor **value) { |
| 172 return S_OK; |
| 173 } |
| 174 |
| 175 virtual HRESULT STDMETHODCALLTYPE put_PointerCursor( |
| 176 winui::Core::ICoreCursor* value) { |
| 177 return S_OK; |
| 178 } |
| 179 |
| 180 virtual HRESULT STDMETHODCALLTYPE get_PointerPosition( |
| 181 winfoundtn::Point* value) { |
| 182 return S_OK; |
| 183 } |
| 184 |
| 185 virtual HRESULT STDMETHODCALLTYPE get_Visible( |
| 186 boolean* value) { |
| 187 return S_OK; |
| 188 } |
| 189 |
| 190 virtual HRESULT STDMETHODCALLTYPE Activate(void) { |
| 191 return S_OK; |
| 192 } |
| 193 |
| 194 virtual HRESULT STDMETHODCALLTYPE Close(void) { |
| 195 return S_OK; |
| 196 } |
| 197 |
| 198 virtual HRESULT STDMETHODCALLTYPE GetAsyncKeyState( |
| 199 ABI::Windows::System::VirtualKey virtualKey, |
| 200 winui::Core::CoreVirtualKeyStates* KeyState) { |
| 201 return S_OK; |
| 202 } |
| 203 |
| 204 virtual HRESULT STDMETHODCALLTYPE GetKeyState( |
| 205 ABI::Windows::System::VirtualKey virtualKey, |
| 206 winui::Core::CoreVirtualKeyStates* KeyState) { |
| 207 return S_OK; |
| 208 } |
| 209 |
| 210 virtual HRESULT STDMETHODCALLTYPE ReleasePointerCapture(void) { |
| 211 return S_OK; |
| 212 } |
| 213 |
| 214 virtual HRESULT STDMETHODCALLTYPE SetPointerCapture(void) { |
| 215 return S_OK; |
| 216 } |
| 217 |
| 218 virtual HRESULT STDMETHODCALLTYPE add_Activated( |
| 219 WindowActivatedHandler* handler, |
| 220 EventRegistrationToken* pCookie) { |
| 221 return S_OK; |
| 222 } |
| 223 |
| 224 virtual HRESULT STDMETHODCALLTYPE remove_Activated( |
| 225 EventRegistrationToken cookie) { |
| 226 return S_OK; |
| 227 } |
| 228 |
| 229 virtual HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested( |
| 230 AutomationProviderHandler* handler, |
| 231 EventRegistrationToken* cookie) { |
| 232 return S_OK; |
| 233 } |
| 234 |
| 235 virtual HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested( |
| 236 EventRegistrationToken cookie) { |
| 237 return S_OK; |
| 238 } |
| 239 |
| 240 virtual HRESULT STDMETHODCALLTYPE add_CharacterReceived( |
| 241 CharEventHandler* handler, |
| 242 EventRegistrationToken* pCookie) { |
| 243 return S_OK; |
| 244 } |
| 245 |
| 246 virtual HRESULT STDMETHODCALLTYPE remove_CharacterReceived( |
| 247 EventRegistrationToken cookie) { |
| 248 return S_OK; |
| 249 } |
| 250 |
| 251 virtual HRESULT STDMETHODCALLTYPE add_Closed( |
| 252 CoreWindowEventHandler* handler, |
| 253 EventRegistrationToken* pCookie) { |
| 254 return S_OK; |
| 255 } |
| 256 |
| 257 virtual HRESULT STDMETHODCALLTYPE remove_Closed( |
| 258 EventRegistrationToken cookie) { |
| 259 return S_OK; |
| 260 } |
| 261 |
| 262 virtual HRESULT STDMETHODCALLTYPE add_InputEnabled( |
| 263 InputEnabledEventHandler* handler, |
| 264 EventRegistrationToken* pCookie) { |
| 265 return S_OK; |
| 266 } |
| 267 |
| 268 virtual HRESULT STDMETHODCALLTYPE remove_InputEnabled( |
| 269 EventRegistrationToken cookie) { |
| 270 return S_OK; |
| 271 } |
| 272 |
| 273 virtual HRESULT STDMETHODCALLTYPE add_KeyDown( |
| 274 KeyEventHandler* handler, |
| 275 EventRegistrationToken* pCookie) { |
| 276 return S_OK; |
| 277 } |
| 278 |
| 279 virtual HRESULT STDMETHODCALLTYPE remove_KeyDown( |
| 280 EventRegistrationToken cookie) { |
| 281 return S_OK; |
| 282 } |
| 283 |
| 284 virtual HRESULT STDMETHODCALLTYPE add_KeyUp( |
| 285 KeyEventHandler* handler, |
| 286 EventRegistrationToken* pCookie) { |
| 287 return S_OK; |
| 288 } |
| 289 |
| 290 virtual HRESULT STDMETHODCALLTYPE remove_KeyUp( |
| 291 EventRegistrationToken cookie) { |
| 292 return S_OK; |
| 293 } |
| 294 |
| 295 virtual HRESULT STDMETHODCALLTYPE add_PointerCaptureLost( |
| 296 PointerEventHandler* handler, |
| 297 EventRegistrationToken* cookie) { |
| 298 return S_OK; |
| 299 } |
| 300 |
| 301 virtual HRESULT STDMETHODCALLTYPE remove_PointerCaptureLost( |
| 302 EventRegistrationToken cookie) { |
| 303 return S_OK; |
| 304 } |
| 305 |
| 306 virtual HRESULT STDMETHODCALLTYPE add_PointerEntered( |
| 307 PointerEventHandler* handler, |
| 308 EventRegistrationToken* cookie) { |
| 309 return S_OK; |
| 310 } |
| 311 |
| 312 virtual HRESULT STDMETHODCALLTYPE remove_PointerEntered( |
| 313 EventRegistrationToken cookie) { |
| 314 return S_OK; |
| 315 } |
| 316 |
| 317 virtual HRESULT STDMETHODCALLTYPE add_PointerExited( |
| 318 PointerEventHandler* handler, |
| 319 EventRegistrationToken* cookie) { |
| 320 return S_OK; |
| 321 } |
| 322 |
| 323 virtual HRESULT STDMETHODCALLTYPE remove_PointerExited( |
| 324 EventRegistrationToken cookie) { |
| 325 return S_OK; |
| 326 } |
| 327 |
| 328 virtual HRESULT STDMETHODCALLTYPE add_PointerMoved( |
| 329 PointerEventHandler* handler, |
| 330 EventRegistrationToken* cookie) { |
| 331 return S_OK; |
| 332 } |
| 333 |
| 334 virtual HRESULT STDMETHODCALLTYPE remove_PointerMoved( |
| 335 EventRegistrationToken cookie) { |
| 336 return S_OK; |
| 337 } |
| 338 |
| 339 virtual HRESULT STDMETHODCALLTYPE add_PointerPressed( |
| 340 PointerEventHandler* handler, |
| 341 EventRegistrationToken* cookie) { |
| 342 return S_OK; |
| 343 } |
| 344 |
| 345 virtual HRESULT STDMETHODCALLTYPE remove_PointerPressed( |
| 346 EventRegistrationToken cookie) { |
| 347 return S_OK; |
| 348 } |
| 349 |
| 350 virtual HRESULT STDMETHODCALLTYPE add_PointerReleased( |
| 351 PointerEventHandler* handler, |
| 352 EventRegistrationToken* cookie) { |
| 353 return S_OK; |
| 354 } |
| 355 |
| 356 virtual HRESULT STDMETHODCALLTYPE remove_PointerReleased( |
| 357 EventRegistrationToken cookie) { |
| 358 return S_OK; |
| 359 } |
| 360 |
| 361 virtual HRESULT STDMETHODCALLTYPE add_TouchHitTesting( |
| 362 TouchHitTestHandler* handler, |
| 363 EventRegistrationToken* pCookie) { |
| 364 return S_OK; |
| 365 } |
| 366 |
| 367 virtual HRESULT STDMETHODCALLTYPE remove_TouchHitTesting( |
| 368 EventRegistrationToken cookie) { |
| 369 return S_OK; |
| 370 } |
| 371 |
| 372 virtual HRESULT STDMETHODCALLTYPE add_PointerWheelChanged( |
| 373 PointerEventHandler* handler, |
| 374 EventRegistrationToken* cookie) { |
| 375 return S_OK; |
| 376 } |
| 377 |
| 378 virtual HRESULT STDMETHODCALLTYPE remove_PointerWheelChanged( |
| 379 EventRegistrationToken cookie) { |
| 380 return S_OK; |
| 381 } |
| 382 |
| 383 virtual HRESULT STDMETHODCALLTYPE add_SizeChanged( |
| 384 SizeChangedHandler* handler, |
| 385 EventRegistrationToken* pCookie) { |
| 386 return S_OK; |
| 387 } |
| 388 |
| 389 virtual HRESULT STDMETHODCALLTYPE remove_SizeChanged( |
| 390 EventRegistrationToken cookie) { |
| 391 return S_OK; |
| 392 } |
| 393 |
| 394 virtual HRESULT STDMETHODCALLTYPE add_VisibilityChanged( |
| 395 VisibilityChangedHandler* handler, |
| 396 EventRegistrationToken* pCookie) { |
| 397 return S_OK; |
| 398 } |
| 399 |
| 400 virtual HRESULT STDMETHODCALLTYPE remove_VisibilityChanged( |
| 401 EventRegistrationToken cookie) { |
| 402 return S_OK; |
| 403 } |
| 404 |
| 405 // ICoreWindowInterop implementation: |
| 406 virtual HRESULT STDMETHODCALLTYPE get_WindowHandle( |
| 407 HWND *hwnd) { |
| 408 return S_OK; |
| 409 } |
| 410 |
| 411 virtual HRESULT STDMETHODCALLTYPE put_MessageHandled( |
| 412 boolean value) { |
| 413 return S_OK; |
| 414 } |
| 415 |
| 416 }; |
| 417 |
| 418 class CoreApplicationViewEmulation |
| 419 : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> { |
| 420 public: |
| 421 CoreApplicationViewEmulation() { |
| 422 core_window_ = mswr::Make<CoreWindowEmulation>(); |
| 423 } |
| 424 |
| 425 virtual HRESULT STDMETHODCALLTYPE get_CoreWindow( |
| 426 winui::Core::ICoreWindow **value) { |
| 427 if (!core_window_) |
| 428 return E_FAIL; |
| 429 *value = core_window_.Get(); |
| 430 return S_OK; |
| 431 } |
| 432 |
| 433 virtual HRESULT STDMETHODCALLTYPE add_Activated( |
| 434 ActivatedHandler* handler, |
| 435 EventRegistrationToken* token) { |
| 436 return S_OK; |
| 437 } |
| 438 |
| 439 virtual HRESULT STDMETHODCALLTYPE remove_Activated( |
| 440 EventRegistrationToken token) { |
| 441 return S_OK; |
| 442 } |
| 443 |
| 444 virtual HRESULT STDMETHODCALLTYPE get_IsMain( |
| 445 boolean* value) { |
| 446 return S_OK; |
| 447 } |
| 448 |
| 449 virtual HRESULT STDMETHODCALLTYPE get_IsHosted( |
| 450 boolean* value) { |
| 451 return S_OK; |
| 452 } |
| 453 |
| 454 private: |
| 455 mswr::ComPtr<winui::Core::ICoreWindow> core_window_; |
| 456 }; |
| 457 |
| 458 class CoreApplicationWin7Emulation |
| 459 : public mswr::RuntimeClass<winapp::Core::ICoreApplication, |
| 460 winapp::Core::ICoreApplicationExit> { |
| 461 public: |
| 462 // ICoreApplication implementation: |
| 463 |
| 464 virtual HRESULT STDMETHODCALLTYPE get_Id( |
| 465 HSTRING* value) { |
| 466 return S_OK; |
| 467 } |
| 468 |
| 469 virtual HRESULT STDMETHODCALLTYPE add_Suspending( |
| 470 winfoundtn::IEventHandler<winapp::SuspendingEventArgs*>* handler, |
| 471 EventRegistrationToken* token) { |
| 472 return S_OK; |
| 473 } |
| 474 |
| 475 virtual HRESULT STDMETHODCALLTYPE remove_Suspending( |
| 476 EventRegistrationToken token) { |
| 477 return S_OK; |
| 478 } |
| 479 |
| 480 virtual HRESULT STDMETHODCALLTYPE add_Resuming( |
| 481 winfoundtn::IEventHandler<IInspectable*>* handler, |
| 482 EventRegistrationToken* token) { |
| 483 return S_OK; |
| 484 } |
| 485 |
| 486 virtual HRESULT STDMETHODCALLTYPE remove_Resuming( |
| 487 EventRegistrationToken token) { |
| 488 return S_OK; |
| 489 } |
| 490 |
| 491 virtual HRESULT STDMETHODCALLTYPE get_Properties( |
| 492 winfoundtn::Collections::IPropertySet** value) { |
| 493 return S_OK; |
| 494 } |
| 495 |
| 496 virtual HRESULT STDMETHODCALLTYPE GetCurrentView( |
| 497 winapp::Core::ICoreApplicationView** value) { |
| 498 return S_OK; |
| 499 } |
| 500 |
| 501 virtual HRESULT STDMETHODCALLTYPE Run( |
| 502 winapp::Core::IFrameworkViewSource* viewSource) { |
| 503 HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf()); |
| 504 if (FAILED(hr)) |
| 505 return hr; |
| 506 view_emulation_ = mswr::Make<CoreApplicationViewEmulation>(); |
| 507 hr = app_view_->Initialize(view_emulation_.Get()); |
| 508 if (FAILED(hr)) |
| 509 return hr; |
| 510 mswr::ComPtr<winui::Core::ICoreWindow> core_window; |
| 511 hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf()); |
| 512 if (FAILED(hr)) |
| 513 return hr; |
| 514 hr = app_view_->SetWindow(core_window.Get()); |
| 515 return hr; |
| 516 } |
| 517 |
| 518 virtual HRESULT STDMETHODCALLTYPE RunWithActivationFactories( |
| 519 winfoundtn::IGetActivationFactory* activationFactoryCallback) { |
| 520 return S_OK; |
| 521 } |
| 522 |
| 523 // ICoreApplicationExit implementation: |
| 524 |
| 525 virtual HRESULT STDMETHODCALLTYPE Exit(void) { |
| 526 return S_OK; |
| 527 } |
| 528 |
| 529 virtual HRESULT STDMETHODCALLTYPE add_Exiting( |
| 530 winfoundtn::IEventHandler<IInspectable*>* handler, |
| 531 EventRegistrationToken* token) { |
| 532 return S_OK; |
| 533 } |
| 534 |
| 535 virtual HRESULT STDMETHODCALLTYPE remove_Exiting( |
| 536 EventRegistrationToken token) { |
| 537 return S_OK; |
| 538 } |
| 539 |
| 540 private: |
| 541 mswr::ComPtr<winapp::Core::IFrameworkView> app_view_; |
| 542 mswr::ComPtr<winapp::Core::ICoreApplicationView> view_emulation_; |
| 543 }; |
| 544 |
| 545 |
| 546 mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() { |
| 547 HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); |
| 548 if (FAILED(hr)) |
| 549 CHECK(false); |
| 550 return mswr::Make<CoreApplicationWin7Emulation>(); |
93 } | 551 } |
94 | 552 |
95 extern "C" __declspec(dllexport) | |
96 int InitMetro(LPTHREAD_START_ROUTINE thread_proc, void* context) { | |
97 ODS("InitMetro [Win7 emulation]"); | |
98 HWND window = CreateMetroTopLevelWindow(); | |
99 if (!window) | |
100 return 1; | |
101 // This magic incatation tells windows that the window is going fullscreen | |
102 // so the taskbar gets out of the wait automatically. | |
103 ::SetWindowPos(window, | |
104 HWND_TOP, | |
105 0,0, | |
106 GetSystemMetrics(SM_CXSCREEN), | |
107 GetSystemMetrics(SM_CYSCREEN), | |
108 SWP_SHOWWINDOW); | |
109 | |
110 // Ready to start our caller. | |
111 globals.core_window = window; | |
112 globals.host_main = thread_proc; | |
113 globals.host_context = context; | |
114 HANDLE thread = ::CreateThread(NULL, 0, &HostThread, NULL, 0, NULL); | |
115 | |
116 // Main message loop. | |
117 MSG msg = {0}; | |
118 while (GetMessage(&msg, NULL, 0, 0)) { | |
119 TranslateMessage(&msg); | |
120 DispatchMessage(&msg); | |
121 } | |
122 | |
123 return (int) msg.wParam; | |
124 } | |
125 | |
126 extern "C" _declspec(dllexport) HWND GetRootWindow() { | |
127 ODS("GetRootWindow", ULONG_PTR(globals.core_window)); | |
128 return globals.core_window; | |
129 } | |
130 | |
131 extern "C" _declspec(dllexport) void SetFrameWindow(HWND window) { | |
132 ODS("SetFrameWindow", ULONG_PTR(window)); | |
133 globals.host_window = window; | |
134 } | |
135 | |
136 extern "C" __declspec(dllexport) const wchar_t* GetInitialUrl() { | |
137 return L""; | |
138 } | |
139 | |
OLD | NEW |