| Index: win8/metro_driver/metro_driver_win7.cc
|
| diff --git a/win8/metro_driver/metro_driver_win7.cc b/win8/metro_driver/metro_driver_win7.cc
|
| index 56d6c05b423ae714acb8fe867887c9ccbed83fb0..157abd4437600a515a3cc8d89c3e5db9eb0b7eb6 100644
|
| --- a/win8/metro_driver/metro_driver_win7.cc
|
| +++ b/win8/metro_driver/metro_driver_win7.cc
|
| @@ -15,14 +15,18 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
| HDC hdc;
|
| switch (message) {
|
| case WM_PAINT:
|
| - hdc = BeginPaint(hwnd, &ps);
|
| + hdc = ::BeginPaint(hwnd, &ps);
|
| EndPaint(hwnd, &ps);
|
| break;
|
| + case WM_LBUTTONUP:
|
| + // TODO(cpu): Remove this test code.
|
| + ::InvalidateRect(hwnd, NULL, TRUE);
|
| + break;
|
| case WM_DESTROY:
|
| PostQuitMessage(0);
|
| break;
|
| default:
|
| - return DefWindowProc(hwnd, message, wparam, lparam);
|
| + return ::DefWindowProc(hwnd, message, wparam, lparam);
|
| }
|
| return 0;
|
| }
|
| @@ -46,8 +50,8 @@ HWND CreateMetroTopLevelWindow() {
|
| HWND hwnd = ::CreateWindowExW(0,
|
| MAKEINTATOM(::RegisterClassExW(&wcex)),
|
| L"metro_win7",
|
| - WS_POPUP,
|
| - 0, 0, 0, 0,
|
| + WS_POPUP | WS_VISIBLE,
|
| + 0, 0, 1024, 1024,
|
| NULL, NULL, hInst, NULL);
|
| return hwnd;
|
| }
|
| @@ -97,6 +101,10 @@ typedef winfoundtn::ITypedEventHandler<
|
| winui::Core::CoreWindow*,
|
| winui::Core::VisibilityChangedEventArgs*> VisibilityChangedHandler;
|
|
|
| +typedef winfoundtn::ITypedEventHandler<
|
| + winui::Core::CoreDispatcher*,
|
| + winui::Core::AcceleratorKeyEventArgs*> AcceleratorKeyEventHandler;
|
| +
|
| // The following classes are the emulation of the WinRT system as exposed
|
| // to metro applications. There is one application (ICoreApplication) which
|
| // contains a series of Views (ICoreApplicationView) each one of them
|
| @@ -114,37 +122,105 @@ typedef winfoundtn::ITypedEventHandler<
|
| // ICoreApplication ICoreApplicationView
|
| // |
|
| // v
|
| -// ICoreWindow ----> ICoreWindowInterop
|
| -// |
|
| -// |
|
| -// V
|
| -// real HWND
|
| +// ICoreWindow -----> ICoreWindowInterop
|
| +// | |
|
| +// | |
|
| +// v V
|
| +// ICoreDispatcher <==> real HWND
|
| //
|
| +class CoreDispacherEmulation :
|
| + public mswr::RuntimeClass<
|
| + winui::Core::ICoreDispatcher,
|
| + winui::Core::ICoreAcceleratorKeys> {
|
| + public:
|
| + // ICoreDispatcher implementation:
|
| + virtual HRESULT STDMETHODCALLTYPE get_HasThreadAccess(boolean* value) {
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE ProcessEvents(
|
| + winui::Core::CoreProcessEventsOption options) {
|
| + // We don't support the other message pump modes. So we basically enter a
|
| + // traditional message loop that we only exit a teardown.
|
| + if (options != winui::Core::CoreProcessEventsOption_ProcessUntilQuit)
|
| + return E_FAIL;
|
| +
|
| + MSG msg = {0};
|
| + while(::GetMessage(&msg, NULL, 0, 0) != 0) {
|
| + ::TranslateMessage(&msg);
|
| + ::DispatchMessage(&msg);
|
| + }
|
| + // TODO(cpu): figure what to do with msg.WParam which we would normally
|
| + // return here.
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE RunAsync(
|
| + winui::Core::CoreDispatcherPriority priority,
|
| + winui::Core::IDispatchedHandler *agileCallback,
|
| + ABI::Windows::Foundation::IAsyncAction** asyncAction) {
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE RunIdleAsync(
|
| + winui::Core::IIdleDispatchedHandler *agileCallback,
|
| + winfoundtn::IAsyncAction** asyncAction) {
|
| + return S_OK;
|
| + }
|
| +
|
| + // ICoreAcceleratorKeys implementation:
|
| + virtual HRESULT STDMETHODCALLTYPE add_AcceleratorKeyActivated(
|
| + AcceleratorKeyEventHandler* handler,
|
| + EventRegistrationToken *pCookie) {
|
| + // TODO(cpu): implement this.
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE remove_AcceleratorKeyActivated(
|
| + EventRegistrationToken cookie) {
|
| + return S_OK;
|
| + }
|
| +
|
| +};
|
|
|
| class CoreWindowEmulation
|
| : public mswr::RuntimeClass<
|
| mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>,
|
| winui::Core::ICoreWindow, ICoreWindowInterop> {
|
| public:
|
| + CoreWindowEmulation() : core_hwnd_(NULL) {
|
| + dispatcher_ = mswr::Make<CoreDispacherEmulation>();
|
| + core_hwnd_ = CreateMetroTopLevelWindow();
|
| + }
|
| +
|
| + ~CoreWindowEmulation() {
|
| + ::DestroyWindow(core_hwnd_);
|
| + }
|
| +
|
| // ICoreWindow implementation:
|
| virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider(
|
| - IInspectable **value) {
|
| + IInspectable** value) {
|
| return S_OK;
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE get_Bounds(
|
| winfoundtn::Rect* value) {
|
| + RECT rect;
|
| + if (!::GetClientRect(core_hwnd_, &rect))
|
| + return E_FAIL;
|
| + value->Width = rect.right;
|
| + value->Height = rect.bottom;
|
| return S_OK;
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE get_CustomProperties(
|
| - winfoundtn::Collections::IPropertySet **value) {
|
| + winfoundtn::Collections::IPropertySet** value) {
|
| return S_OK;
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
|
| - winui::Core::ICoreDispatcher **value) {
|
| - return S_OK;
|
| + winui::Core::ICoreDispatcher** value) {
|
| + return dispatcher_.CopyTo(value);
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE get_FlowDirection(
|
| @@ -168,7 +244,7 @@ class CoreWindowEmulation
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE get_PointerCursor(
|
| - winui::Core::ICoreCursor **value) {
|
| + winui::Core::ICoreCursor** value) {
|
| return S_OK;
|
| }
|
|
|
| @@ -188,6 +264,7 @@ class CoreWindowEmulation
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE Activate(void) {
|
| + // After we fire OnActivate on the View, Chrome calls us back here.
|
| return S_OK;
|
| }
|
|
|
| @@ -218,6 +295,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_Activated(
|
| WindowActivatedHandler* handler,
|
| EventRegistrationToken* pCookie) {
|
| + // TODO(cpu) implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -240,6 +318,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_CharacterReceived(
|
| CharEventHandler* handler,
|
| EventRegistrationToken* pCookie) {
|
| + // TODO(cpu) : implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -273,6 +352,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_KeyDown(
|
| KeyEventHandler* handler,
|
| EventRegistrationToken* pCookie) {
|
| + // TODO(cpu): implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -284,6 +364,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_KeyUp(
|
| KeyEventHandler* handler,
|
| EventRegistrationToken* pCookie) {
|
| + // TODO(cpu): implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -328,6 +409,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_PointerMoved(
|
| PointerEventHandler* handler,
|
| EventRegistrationToken* cookie) {
|
| + // TODO(cpu) : implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -339,6 +421,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_PointerPressed(
|
| PointerEventHandler* handler,
|
| EventRegistrationToken* cookie) {
|
| + // TODO(cpu): implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -350,6 +433,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_PointerReleased(
|
| PointerEventHandler* handler,
|
| EventRegistrationToken* cookie) {
|
| + // TODO(cpu): implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -383,6 +467,7 @@ class CoreWindowEmulation
|
| virtual HRESULT STDMETHODCALLTYPE add_SizeChanged(
|
| SizeChangedHandler* handler,
|
| EventRegistrationToken* pCookie) {
|
| + // TODO(cpu): implement this.
|
| return S_OK;
|
| }
|
|
|
| @@ -403,8 +488,10 @@ class CoreWindowEmulation
|
| }
|
|
|
| // ICoreWindowInterop implementation:
|
| - virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(
|
| - HWND *hwnd) {
|
| + virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(HWND* hwnd) {
|
| + if (!core_hwnd_)
|
| + return E_FAIL;
|
| + *hwnd = core_hwnd_;
|
| return S_OK;
|
| }
|
|
|
| @@ -413,6 +500,37 @@ class CoreWindowEmulation
|
| return S_OK;
|
| }
|
|
|
| + private:
|
| + HWND core_hwnd_;
|
| + mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_;
|
| +};
|
| +
|
| +class ActivatedEvent
|
| + : public mswr::RuntimeClass<winapp::Activation::IActivatedEventArgs> {
|
| + public:
|
| + ActivatedEvent(winapp::Activation::ActivationKind activation_kind)
|
| + : activation_kind_(activation_kind) {
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE get_Kind(
|
| + winapp::Activation::ActivationKind *value) {
|
| + *value = activation_kind_;
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE get_PreviousExecutionState(
|
| + winapp::Activation::ApplicationExecutionState *value) {
|
| + *value = winapp::Activation::ApplicationExecutionState_ClosedByUser;
|
| + return S_OK;
|
| + }
|
| +
|
| + virtual HRESULT STDMETHODCALLTYPE get_SplashScreen(
|
| + winapp::Activation::ISplashScreen **value) {
|
| + return E_FAIL;
|
| + }
|
| +
|
| + private:
|
| + winapp::Activation::ActivationKind activation_kind_;
|
| };
|
|
|
| class CoreApplicationViewEmulation
|
| @@ -422,22 +540,37 @@ class CoreApplicationViewEmulation
|
| core_window_ = mswr::Make<CoreWindowEmulation>();
|
| }
|
|
|
| - virtual HRESULT STDMETHODCALLTYPE get_CoreWindow(
|
| - winui::Core::ICoreWindow **value) {
|
| - if (!core_window_)
|
| - return E_FAIL;
|
| - *value = core_window_.Get();
|
| - return S_OK;
|
| - }
|
| + HRESULT Activate() {
|
| + if (activated_handler_) {
|
| + auto ae = mswr::Make<ActivatedEvent>(
|
| + winapp::Activation::ActivationKind_File);
|
| + return activated_handler_->Invoke(this, ae.Get());
|
| + } else {
|
| + return S_OK;
|
| + }
|
| + }
|
| +
|
| + // ICoreApplicationView implementation:
|
| + virtual HRESULT STDMETHODCALLTYPE get_CoreWindow(
|
| + winui::Core::ICoreWindow** value) {
|
| + if (!core_window_)
|
| + return E_FAIL;
|
| + return core_window_.CopyTo(value);
|
| + }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE add_Activated(
|
| ActivatedHandler* handler,
|
| EventRegistrationToken* token) {
|
| + // The real component supports multiple handles but we don't yet.
|
| + if (activated_handler_)
|
| + return E_FAIL;
|
| + activated_handler_ = handler;
|
| return S_OK;
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE remove_Activated(
|
| EventRegistrationToken token) {
|
| + // Chrome never unregisters handlers, so we don't care about it.
|
| return S_OK;
|
| }
|
|
|
| @@ -453,6 +586,7 @@ class CoreApplicationViewEmulation
|
|
|
| private:
|
| mswr::ComPtr<winui::Core::ICoreWindow> core_window_;
|
| + mswr::ComPtr<ActivatedHandler> activated_handler_;
|
| };
|
|
|
| class CoreApplicationWin7Emulation
|
| @@ -512,7 +646,15 @@ class CoreApplicationWin7Emulation
|
| if (FAILED(hr))
|
| return hr;
|
| hr = app_view_->SetWindow(core_window.Get());
|
| - return hr;
|
| + if (FAILED(hr))
|
| + return hr;
|
| + hr = app_view_->Load(NULL);
|
| + if (FAILED(hr))
|
| + return hr;
|
| + hr = view_emulation_->Activate();
|
| + if (FAILED(hr))
|
| + return hr;
|
| + return app_view_->Run();
|
| }
|
|
|
| virtual HRESULT STDMETHODCALLTYPE RunWithActivationFactories(
|
| @@ -539,7 +681,7 @@ class CoreApplicationWin7Emulation
|
|
|
| private:
|
| mswr::ComPtr<winapp::Core::IFrameworkView> app_view_;
|
| - mswr::ComPtr<winapp::Core::ICoreApplicationView> view_emulation_;
|
| + mswr::ComPtr<CoreApplicationViewEmulation> view_emulation_;
|
| };
|
|
|
|
|
|
|