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 |
deleted file mode 100644 |
index 62662f5918f1fb7036419d863034a11d8839034c..0000000000000000000000000000000000000000 |
--- a/win8/metro_driver/metro_driver_win7.cc |
+++ /dev/null |
@@ -1,1229 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "stdafx.h" |
-#include <corewindow.h> |
-#include <shobjidl.h> |
-#include <stdint.h> |
- |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "ui/gfx/geometry/safe_integer_conversions.h" |
-#include "ui/gfx/win/msg_util.h" |
- |
-#pragma comment(lib, "shell32.lib") |
- |
-EXTERN_C IMAGE_DOS_HEADER __ImageBase; |
-// Even though we only create a single window, we need to keep this |
-// count because of the hidden window used by the UI message loop of |
-// the metro viewer. |
-int g_window_count = 0; |
- |
-const wchar_t kAshWin7AppId[] = L"Google.Chrome.AshWin7.1"; |
-const wchar_t kAshWin7CoreWindowHandler[] = L"CoreWindowHandler"; |
-extern float GetModernUIScale(); |
-LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, |
- LPARAM lparam); |
- |
-HWND CreateMetroTopLevelWindow(const RECT& work_area) { |
- HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); |
- WNDCLASSEXW wcex; |
- wcex.cbSize = sizeof(wcex); |
- wcex.style = CS_HREDRAW | CS_VREDRAW; |
- wcex.lpfnWndProc = WndProc; |
- wcex.cbClsExtra = 0; |
- wcex.cbWndExtra = 0; |
- wcex.hInstance = hInst; |
- wcex.hIcon = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME"); |
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
- wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); |
- wcex.lpszMenuName = 0; |
- wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; |
- wcex.hIconSm = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME"); |
- |
- HWND hwnd = ::CreateWindowExW(0, |
- MAKEINTATOM(::RegisterClassExW(&wcex)), |
- L"metro_win7", |
- WS_POPUP | WS_VISIBLE | WS_MINIMIZEBOX, |
- work_area.top, work_area.left, |
- work_area.right, work_area.bottom, |
- NULL, NULL, hInst, NULL); |
- return hwnd; |
-} |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winapp::Core::CoreApplicationView*, |
- winapp::Activation::IActivatedEventArgs*> ActivatedHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::WindowActivatedEventArgs*> WindowActivatedHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::AutomationProviderRequestedEventArgs*> |
- AutomationProviderHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::CharacterReceivedEventArgs*> CharEventHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::CoreWindowEventArgs*> CoreWindowEventHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::InputEnabledEventArgs*> InputEnabledEventHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::KeyEventArgs*> KeyEventHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::PointerEventArgs*> PointerEventHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::TouchHitTestingEventArgs*> TouchHitTestHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreWindow*, |
- winui::Core::VisibilityChangedEventArgs*> VisibilityChangedHandler; |
- |
-typedef winfoundtn::ITypedEventHandler< |
- winui::Core::CoreDispatcher*, |
- winui::Core::AcceleratorKeyEventArgs*> AcceleratorKeyEventHandler; |
- |
-// This interface is implemented by classes which handle mouse and keyboard |
-// input. |
-class InputHandler { |
- public: |
- InputHandler() {} |
- virtual ~InputHandler() {} |
- |
- virtual bool HandleKeyboardMessage(const MSG& msg) = 0; |
- virtual bool HandleMouseMessage(const MSG& msg) = 0; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(InputHandler); |
-}; |
- |
-// This class implements the winrt interfaces corresponding to mouse input. |
-class MouseEvent : public mswr::RuntimeClass< |
- winui::Core::IPointerEventArgs, |
- winui::Input::IPointerPoint, |
- winui::Input::IPointerPointProperties, |
- windevs::Input::IPointerDevice> { |
- public: |
- MouseEvent(const MSG& msg) |
- : msg_(msg) { |
- } |
- |
- // IPointerEventArgs implementation. |
- HRESULT STDMETHODCALLTYPE |
- get_CurrentPoint(winui::Input::IPointerPoint** point) override { |
- return QueryInterface(winui::Input::IID_IPointerPoint, |
- reinterpret_cast<void**>(point)); |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_KeyModifiers(winsys::VirtualKeyModifiers* modifiers) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE GetIntermediatePoints( |
- winfoundtn::Collections::IVector<winui::Input::PointerPoint*>** points) |
- override { |
- return E_NOTIMPL; |
- } |
- |
- // IPointerPoint implementation. |
- HRESULT STDMETHODCALLTYPE |
- get_PointerDevice(windevs::Input::IPointerDevice** pointer_device) override { |
- return QueryInterface(windevs::Input::IID_IPointerDevice, |
- reinterpret_cast<void**>(pointer_device)); |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Position(winfoundtn::Point* position) override { |
- static float scale = GetModernUIScale(); |
- // Scale down the points here as they are scaled up on the other side. |
- position->X = gfx::ToRoundedInt(CR_GET_X_LPARAM(msg_.lParam) / scale); |
- position->Y = gfx::ToRoundedInt(CR_GET_Y_LPARAM(msg_.lParam) / scale); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_PointerId(uint32_t* pointer_id) override { |
- // TODO(ananta) |
- // Implement this properly. |
- *pointer_id = 1; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Timestamp(uint64_t* timestamp) override { |
- *timestamp = msg_.time; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_Properties(winui::Input::IPointerPointProperties** properties) override { |
- return QueryInterface(winui::Input::IID_IPointerPointProperties, |
- reinterpret_cast<void**>(properties)); |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_RawPosition(winfoundtn::Point* position) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_FrameId(uint32_t* frame_id) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsInContact(boolean* in_contact) override { |
- return E_NOTIMPL; |
- } |
- |
- // IPointerPointProperties implementation. |
- HRESULT STDMETHODCALLTYPE |
- get_PointerUpdateKind(winui::Input::PointerUpdateKind* update_kind) override { |
- // TODO(ananta) |
- // There is no WM_POINTERUPDATE equivalent on Windows 7. Look into |
- // equivalents. |
- if (msg_.message == WM_LBUTTONDOWN) { |
- *update_kind = winui::Input::PointerUpdateKind_LeftButtonPressed; |
- } else if (msg_.message == WM_RBUTTONDOWN) { |
- *update_kind = winui::Input::PointerUpdateKind_RightButtonPressed; |
- } else if (msg_.message == WM_MBUTTONDOWN) { |
- *update_kind = winui::Input::PointerUpdateKind_MiddleButtonPressed; |
- } else if (msg_.message == WM_LBUTTONUP) { |
- *update_kind = winui::Input::PointerUpdateKind_LeftButtonReleased; |
- } else if (msg_.message == WM_RBUTTONUP) { |
- *update_kind = winui::Input::PointerUpdateKind_RightButtonReleased; |
- } else if (msg_.message == WM_MBUTTONUP) { |
- *update_kind = winui::Input::PointerUpdateKind_MiddleButtonReleased; |
- } |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsLeftButtonPressed(boolean* left_button_pressed) override { |
- *left_button_pressed = msg_.wParam & MK_LBUTTON ? true : false; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsRightButtonPressed(boolean* right_button_pressed) override { |
- *right_button_pressed = msg_.wParam & MK_RBUTTON ? true : false; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsMiddleButtonPressed(boolean* middle_button_pressed) override { |
- *middle_button_pressed = msg_.wParam & MK_MBUTTON ? true : false; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsHorizontalMouseWheel(boolean* is_horizontal_mouse_wheel) override { |
- *is_horizontal_mouse_wheel = |
- (msg_.message == WM_MOUSEHWHEEL) ? true : false; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_MouseWheelDelta(int* delta) override { |
- if (msg_.message == WM_MOUSEWHEEL || msg_.message == WM_MOUSEHWHEEL) { |
- *delta = GET_WHEEL_DELTA_WPARAM(msg_.wParam); |
- return S_OK; |
- } else { |
- return S_FALSE; |
- } |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Pressure(float* pressure) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsInverted(boolean* inverted) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsEraser(boolean* is_eraser) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Orientation(float* orientation) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_XTilt(float* x_tilt) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_YTilt(float* y_tilt) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Twist(float* twist) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_ContactRect(winfoundtn::Rect* rect) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_ContactRectRaw(winfoundtn::Rect* rect) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_TouchConfidence(boolean* confidence) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsPrimary(boolean* is_primary) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsInRange(boolean* is_in_range) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsCanceled(boolean* is_canceled) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsBarrelButtonPressed(boolean* is_barrel_button_pressed) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsXButton1Pressed(boolean* is_xbutton1_pressed) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_IsXButton2Pressed(boolean* is_xbutton2_pressed) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE HasUsage(uint32_t usage_page, |
- uint32_t usage_id, |
- boolean* has_usage) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE GetUsageValue(uint32_t usage_page, |
- uint32_t usage_id, |
- int32_t* usage_value) override { |
- return E_NOTIMPL; |
- } |
- |
- // IPointerDevice implementation. |
- HRESULT STDMETHODCALLTYPE get_PointerDeviceType( |
- windevs::Input::PointerDeviceType* device_type) override { |
- if (msg_.message == WM_TOUCH) { |
- *device_type = windevs::Input::PointerDeviceType_Touch; |
- } else { |
- *device_type = windevs::Input::PointerDeviceType_Mouse; |
- } |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsIntegrated(boolean* is_integrated) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_MaxContacts(uint32_t* contacts) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_PhysicalDeviceRect(winfoundtn::Rect* rect) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_ScreenRect(winfoundtn::Rect* rect) override { |
- return E_NOTIMPL; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_SupportedUsages( |
- winfoundtn::Collections::IVectorView<windevs::Input::PointerDeviceUsage>** |
- usages) override { |
- return E_NOTIMPL; |
- } |
- |
- private: |
- MSG msg_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MouseEvent); |
-}; |
- |
-// This class implements the winrt interfaces needed to support keyboard |
-// character and system character messages. |
-class KeyEvent : public mswr::RuntimeClass< |
- winui::Core::IKeyEventArgs, |
- winui::Core::ICharacterReceivedEventArgs, |
- winui::Core::IAcceleratorKeyEventArgs> { |
- public: |
- KeyEvent(const MSG& msg) |
- : msg_(msg) {} |
- |
- // IKeyEventArgs implementation. |
- HRESULT STDMETHODCALLTYPE |
- get_VirtualKey(winsys::VirtualKey* virtual_key) override { |
- *virtual_key = static_cast<winsys::VirtualKey>(msg_.wParam); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_KeyStatus(winui::Core::CorePhysicalKeyStatus* key_status) override { |
- // As per msdn documentation for the keyboard messages. |
- key_status->RepeatCount = msg_.lParam & 0x0000FFFF; |
- key_status->ScanCode = (msg_.lParam >> 16) & 0x00FF; |
- key_status->IsExtendedKey = (msg_.lParam & (1 << 24)); |
- key_status->IsMenuKeyDown = (msg_.lParam & (1 << 29)); |
- key_status->WasKeyDown = (msg_.lParam & (1 << 30)); |
- key_status->IsKeyReleased = (msg_.lParam & (1 << 31)); |
- return S_OK; |
- } |
- |
- // ICharacterReceivedEventArgs implementation. |
- HRESULT STDMETHODCALLTYPE get_KeyCode(uint32_t* key_code) override { |
- *key_code = msg_.wParam; |
- return S_OK; |
- } |
- |
- // IAcceleratorKeyEventArgs implementation. |
- HRESULT STDMETHODCALLTYPE |
- get_EventType(winui::Core::CoreAcceleratorKeyEventType* event_type) override { |
- if (msg_.message == WM_SYSKEYDOWN) { |
- *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyDown; |
- } else if (msg_.message == WM_SYSKEYUP) { |
- *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemKeyUp; |
- } else if (msg_.message == WM_SYSCHAR) { |
- *event_type = winui::Core::CoreAcceleratorKeyEventType_SystemCharacter; |
- } |
- return S_OK; |
- } |
- |
- private: |
- MSG msg_; |
-}; |
- |
-// 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 |
-// containing a CoreWindow which represents a surface that can drawn to |
-// and that receives events. |
-// |
-// Here is the general dependency hierachy in terms of interfaces: |
-// |
-// IFrameworkViewSource --> IFrameworkView |
-// ^ | |
-// | | metro app |
-// --------------------------------------------------------------------- |
-// | | winRT system |
-// | v |
-// ICoreApplication ICoreApplicationView |
-// | |
-// v |
-// ICoreWindow -----> ICoreWindowInterop |
-// | | |
-// | | |
-// v V |
-// ICoreDispatcher <==> real HWND |
-// |
-class CoreDispatcherEmulation : |
- public mswr::RuntimeClass< |
- winui::Core::ICoreDispatcher, |
- winui::Core::ICoreAcceleratorKeys> { |
- public: |
- CoreDispatcherEmulation(InputHandler* input_handler) |
- : input_handler_(input_handler), |
- accelerator_key_event_handler_(NULL) {} |
- |
- // ICoreDispatcher implementation: |
- HRESULT STDMETHODCALLTYPE get_HasThreadAccess(boolean* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- ProcessEvents(winui::Core::CoreProcessEventsOption options) override { |
- // 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) && g_window_count > 0) { |
- ProcessInputMessage(msg); |
- ::TranslateMessage(&msg); |
- ::DispatchMessage(&msg); |
- } |
- // TODO(cpu): figure what to do with msg.WParam which we would normally |
- // return here. |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- RunAsync(winui::Core::CoreDispatcherPriority priority, |
- winui::Core::IDispatchedHandler* agileCallback, |
- ABI::Windows::Foundation::IAsyncAction** asyncAction) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- RunIdleAsync(winui::Core::IIdleDispatchedHandler* agileCallback, |
- winfoundtn::IAsyncAction** asyncAction) override { |
- return S_OK; |
- } |
- |
- // ICoreAcceleratorKeys implementation: |
- HRESULT STDMETHODCALLTYPE |
- add_AcceleratorKeyActivated(AcceleratorKeyEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- accelerator_key_event_handler_ = handler; |
- accelerator_key_event_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- remove_AcceleratorKeyActivated(EventRegistrationToken cookie) override { |
- accelerator_key_event_handler_->Release(); |
- accelerator_key_event_handler_ = NULL; |
- return S_OK; |
- } |
- |
- private: |
- bool ProcessInputMessage(const MSG& msg) { |
- // Poor man's way of dispatching input events. |
- bool ret = false; |
- if (input_handler_) { |
- if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) { |
- if ((msg.message == WM_SYSKEYDOWN) || (msg.message == WM_SYSKEYUP) || |
- msg.message == WM_SYSCHAR) { |
- ret = HandleSystemKeys(msg); |
- } else { |
- ret = input_handler_->HandleKeyboardMessage(msg); |
- } |
- } else if ((msg.message >= WM_MOUSEFIRST) && |
- (msg.message <= WM_MOUSELAST)) { |
- ret = input_handler_->HandleMouseMessage(msg); |
- } |
- } |
- return ret; |
- } |
- |
- bool HandleSystemKeys(const MSG& msg) { |
- mswr::ComPtr<winui::Core::IAcceleratorKeyEventArgs> event_args; |
- event_args = mswr::Make<KeyEvent>(msg); |
- accelerator_key_event_handler_->Invoke(this, event_args.Get()); |
- return true; |
- } |
- |
- InputHandler* input_handler_; |
- AcceleratorKeyEventHandler* accelerator_key_event_handler_; |
-}; |
- |
-class CoreWindowEmulation |
- : public mswr::RuntimeClass< |
- mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>, |
- winui::Core::ICoreWindow, ICoreWindowInterop>, |
- public InputHandler { |
- public: |
- CoreWindowEmulation(winapp::Core::IFrameworkView* app_view) |
- : mouse_moved_handler_(NULL), |
- mouse_capture_lost_handler_(NULL), |
- mouse_pressed_handler_(NULL), |
- mouse_released_handler_(NULL), |
- mouse_entered_handler_(NULL), |
- mouse_exited_handler_(NULL), |
- mouse_wheel_changed_handler_(NULL), |
- key_down_handler_(NULL), |
- key_up_handler_(NULL), |
- character_received_handler_(NULL), |
- core_hwnd_(NULL), |
- app_view_(app_view), |
- window_activated_handler_(NULL) { |
- dispatcher_ = mswr::Make<CoreDispatcherEmulation>(this); |
- |
- // Unless we select our own AppUserModelID the shell might confuse us |
- // with the app launcher one and we get the wrong taskbar button and icon. |
- ::SetCurrentProcessExplicitAppUserModelID(kAshWin7AppId); |
- |
- RECT work_area = {0}; |
- ::SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); |
- if (::IsDebuggerPresent()) { |
- work_area.top = 0; |
- work_area.left = 0; |
- work_area.right = 1600; |
- work_area.bottom = 900; |
- } |
- |
- core_hwnd_ = CreateMetroTopLevelWindow(work_area); |
- ::SetProp(core_hwnd_, kAshWin7CoreWindowHandler, this); |
- } |
- |
- ~CoreWindowEmulation() override { |
- if (core_hwnd_) { |
- ::RemoveProp(core_hwnd_, kAshWin7CoreWindowHandler); |
- ::DestroyWindow(core_hwnd_); |
- } |
- } |
- |
- // ICoreWindow implementation: |
- HRESULT STDMETHODCALLTYPE |
- get_AutomationHostProvider(IInspectable** value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Bounds(winfoundtn::Rect* value) override { |
- RECT rect; |
- if (!::GetClientRect(core_hwnd_, &rect)) |
- return E_FAIL; |
- value->Width = rect.right; |
- value->Height = rect.bottom; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_CustomProperties(winfoundtn::Collections::IPropertySet** value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_Dispatcher(winui::Core::ICoreDispatcher** value) override { |
- return dispatcher_.CopyTo(value); |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_FlowDirection(winui::Core::CoreWindowFlowDirection* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- put_FlowDirection(winui::Core::CoreWindowFlowDirection value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsInputEnabled(boolean* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE put_IsInputEnabled(boolean value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_PointerCursor(winui::Core::ICoreCursor** value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- put_PointerCursor(winui::Core::ICoreCursor* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_PointerPosition(winfoundtn::Point* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_Visible(boolean* value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE Activate(void) override { |
- // After we fire OnActivate on the View, Chrome calls us back here. |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE Close(void) override { |
- ::PostMessage(core_hwnd_, WM_CLOSE, 0, 0); |
- core_hwnd_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE GetAsyncKeyState( |
- ABI::Windows::System::VirtualKey virtualKey, |
- winui::Core::CoreVirtualKeyStates* KeyState) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE GetKeyState( |
- ABI::Windows::System::VirtualKey virtualKey, |
- winui::Core::CoreVirtualKeyStates* KeyState) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE ReleasePointerCapture(void) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE SetPointerCapture(void) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_Activated( |
- WindowActivatedHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- window_activated_handler_ = handler; |
- handler->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_Activated( |
- EventRegistrationToken cookie) override { |
- window_activated_handler_->Release(); |
- window_activated_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested( |
- AutomationProviderHandler* handler, |
- EventRegistrationToken* cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_CharacterReceived( |
- CharEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- character_received_handler_ = handler; |
- character_received_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_CharacterReceived( |
- EventRegistrationToken cookie) override { |
- character_received_handler_->Release(); |
- character_received_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_Closed( |
- CoreWindowEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_Closed( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_InputEnabled( |
- InputEnabledEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_InputEnabled( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_KeyDown( |
- KeyEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- key_down_handler_ = handler; |
- key_down_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_KeyDown( |
- EventRegistrationToken cookie) override { |
- key_down_handler_->Release(); |
- key_down_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_KeyUp( |
- KeyEventHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- key_up_handler_ = handler; |
- key_up_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_KeyUp( |
- EventRegistrationToken cookie) override { |
- key_up_handler_->Release(); |
- key_up_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerCaptureLost( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_capture_lost_handler_ = handler; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerCaptureLost( |
- EventRegistrationToken cookie) override { |
- mouse_capture_lost_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerEntered( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_entered_handler_ = handler; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerEntered( |
- EventRegistrationToken cookie) override { |
- mouse_entered_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerExited( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_exited_handler_ = handler; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerExited( |
- EventRegistrationToken cookie) override { |
- mouse_exited_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerMoved( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_moved_handler_ = handler; |
- mouse_moved_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerMoved( |
- EventRegistrationToken cookie) override { |
- mouse_moved_handler_->Release(); |
- mouse_moved_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerPressed( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_pressed_handler_ = handler; |
- mouse_pressed_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerPressed( |
- EventRegistrationToken cookie) override { |
- mouse_pressed_handler_->Release(); |
- mouse_pressed_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerReleased( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_released_handler_ = handler; |
- mouse_released_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerReleased( |
- EventRegistrationToken cookie) override { |
- mouse_released_handler_->Release(); |
- mouse_released_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_TouchHitTesting( |
- TouchHitTestHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_TouchHitTesting( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_PointerWheelChanged( |
- PointerEventHandler* handler, |
- EventRegistrationToken* cookie) override { |
- mouse_wheel_changed_handler_ = handler; |
- mouse_wheel_changed_handler_->AddRef(); |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_PointerWheelChanged( |
- EventRegistrationToken cookie) override { |
- mouse_wheel_changed_handler_->Release(); |
- mouse_wheel_changed_handler_ = NULL; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_SizeChanged( |
- SizeChangedHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- // TODO(cpu): implement this. |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_SizeChanged( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE add_VisibilityChanged( |
- VisibilityChangedHandler* handler, |
- EventRegistrationToken* pCookie) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE remove_VisibilityChanged( |
- EventRegistrationToken cookie) override { |
- return S_OK; |
- } |
- |
- // ICoreWindowInterop implementation: |
- HRESULT STDMETHODCALLTYPE get_WindowHandle(HWND* hwnd) override { |
- if (!core_hwnd_) |
- return E_FAIL; |
- *hwnd = core_hwnd_; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE put_MessageHandled(boolean value) override { |
- return S_OK; |
- } |
- |
- // InputHandler |
- bool HandleKeyboardMessage(const MSG& msg) override { |
- switch (msg.message) { |
- case WM_KEYDOWN: |
- case WM_KEYUP: { |
- mswr::ComPtr<winui::Core::IKeyEventArgs> event_args; |
- event_args = mswr::Make<KeyEvent>(msg); |
- KeyEventHandler* handler = NULL; |
- if (msg.message == WM_KEYDOWN) { |
- handler = key_down_handler_; |
- } else { |
- handler = key_up_handler_; |
- } |
- handler->Invoke(this, event_args.Get()); |
- break; |
- } |
- |
- case WM_CHAR: |
- case WM_DEADCHAR: |
- case WM_UNICHAR: { |
- mswr::ComPtr<winui::Core::ICharacterReceivedEventArgs> event_args; |
- event_args = mswr::Make<KeyEvent>(msg); |
- character_received_handler_->Invoke(this, event_args.Get()); |
- break; |
- } |
- |
- default: |
- return false; |
- } |
- return true; |
- } |
- |
- bool HandleMouseMessage(const MSG& msg) override { |
- PointerEventHandler* handler = NULL; |
- mswr::ComPtr<winui::Core::IPointerEventArgs> event_args; |
- event_args = mswr::Make<MouseEvent>(msg); |
- switch (msg.message) { |
- case WM_MOUSEMOVE: { |
- handler = mouse_moved_handler_; |
- break; |
- } |
- case WM_LBUTTONDOWN: { |
- case WM_RBUTTONDOWN: |
- case WM_MBUTTONDOWN: |
- handler = mouse_pressed_handler_; |
- break; |
- } |
- |
- case WM_LBUTTONUP: { |
- case WM_RBUTTONUP: |
- case WM_MBUTTONUP: |
- handler = mouse_released_handler_; |
- break; |
- } |
- |
- case WM_MOUSEWHEEL: { |
- case WM_MOUSEHWHEEL: |
- handler = mouse_wheel_changed_handler_; |
- break; |
- } |
- |
- default: |
- return false; |
- } |
- DCHECK(handler); |
- handler->Invoke(this, event_args.Get()); |
- return true; |
- } |
- |
- void OnWindowActivated() { |
- if (window_activated_handler_) |
- window_activated_handler_->Invoke(this, NULL); |
- } |
- |
- private: |
- PointerEventHandler* mouse_moved_handler_; |
- PointerEventHandler* mouse_capture_lost_handler_; |
- PointerEventHandler* mouse_pressed_handler_; |
- PointerEventHandler* mouse_released_handler_; |
- PointerEventHandler* mouse_entered_handler_; |
- PointerEventHandler* mouse_exited_handler_; |
- PointerEventHandler* mouse_wheel_changed_handler_; |
- KeyEventHandler* key_down_handler_; |
- KeyEventHandler* key_up_handler_; |
- CharEventHandler* character_received_handler_; |
- HWND core_hwnd_; |
- mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_; |
- mswr::ComPtr<winapp::Core::IFrameworkView> app_view_; |
- WindowActivatedHandler* window_activated_handler_; |
-}; |
- |
-LRESULT CALLBACK WndProc(HWND hwnd, UINT message, |
- WPARAM wparam, LPARAM lparam) { |
- PAINTSTRUCT ps; |
- HDC hdc; |
- switch (message) { |
- case WM_ACTIVATE: { |
- // HIWORD(wparam) is 1 if the window is minimized. |
- bool active = (LOWORD(wparam) != WA_INACTIVE) && !HIWORD(wparam); |
- if (active) { |
- CoreWindowEmulation* core_window_handler = |
- reinterpret_cast<CoreWindowEmulation*>( |
- ::GetProp(hwnd, kAshWin7CoreWindowHandler)); |
- if (core_window_handler) |
- core_window_handler->OnWindowActivated(); |
- } |
- return ::DefWindowProc(hwnd, message, wparam, lparam); |
- } |
- case WM_CREATE: |
- ++g_window_count; |
- break; |
- case WM_PAINT: |
- hdc = ::BeginPaint(hwnd, &ps); |
- ::EndPaint(hwnd, &ps); |
- break; |
- case WM_CLOSE: |
- ::DestroyWindow(hwnd); |
- break; |
- case WM_DESTROY: |
- --g_window_count; |
- if (!g_window_count) |
- ::PostQuitMessage(0); |
- break; |
- // Always allow Chrome to set the cursor. |
- case WM_SETCURSOR: |
- return 1; |
- default: |
- return ::DefWindowProc(hwnd, message, wparam, lparam); |
- } |
- return 0; |
-} |
- |
-class ActivatedEvent |
- : public mswr::RuntimeClass<winapp::Activation::IActivatedEventArgs> { |
- public: |
- ActivatedEvent(winapp::Activation::ActivationKind activation_kind) |
- : activation_kind_(activation_kind) { |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_Kind(winapp::Activation::ActivationKind* value) override { |
- *value = activation_kind_; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_PreviousExecutionState( |
- winapp::Activation::ApplicationExecutionState* value) override { |
- *value = winapp::Activation::ApplicationExecutionState_ClosedByUser; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_SplashScreen(winapp::Activation::ISplashScreen** value) override { |
- return E_FAIL; |
- } |
- |
- private: |
- winapp::Activation::ActivationKind activation_kind_; |
-}; |
- |
-class CoreApplicationViewEmulation |
- : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> { |
- public: |
- CoreApplicationViewEmulation(winapp::Core::IFrameworkView* app_view) { |
- core_window_ = mswr::Make<CoreWindowEmulation>(app_view); |
- } |
- |
- 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; |
- } |
- } |
- |
- HRESULT Close() { |
- return core_window_->Close(); |
- } |
- |
- // ICoreApplicationView implementation: |
- HRESULT STDMETHODCALLTYPE |
- get_CoreWindow(winui::Core::ICoreWindow** value) override { |
- if (!core_window_) |
- return E_FAIL; |
- return core_window_.CopyTo(value); |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- add_Activated(ActivatedHandler* handler, |
- EventRegistrationToken* token) override { |
- // The real component supports multiple handles but we don't yet. |
- if (activated_handler_) |
- return E_FAIL; |
- activated_handler_ = handler; |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- remove_Activated(EventRegistrationToken token) override { |
- // Chrome never unregisters handlers, so we don't care about it. |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE get_IsMain(boolean* value) override { return S_OK; } |
- |
- HRESULT STDMETHODCALLTYPE get_IsHosted(boolean* value) override { |
- return S_OK; |
- } |
- |
- private: |
- mswr::ComPtr<CoreWindowEmulation> core_window_; |
- mswr::ComPtr<ActivatedHandler> activated_handler_; |
-}; |
- |
-class CoreApplicationWin7Emulation |
- : public mswr::RuntimeClass<winapp::Core::ICoreApplication, |
- winapp::Core::ICoreApplicationExit> { |
- public: |
- // ICoreApplication implementation: |
- |
- HRESULT STDMETHODCALLTYPE get_Id(HSTRING* value) override { return S_OK; } |
- |
- HRESULT STDMETHODCALLTYPE add_Suspending( |
- winfoundtn::IEventHandler<winapp::SuspendingEventArgs*>* handler, |
- EventRegistrationToken* token) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- remove_Suspending(EventRegistrationToken token) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- add_Resuming(winfoundtn::IEventHandler<IInspectable*>* handler, |
- EventRegistrationToken* token) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- remove_Resuming(EventRegistrationToken token) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- get_Properties(winfoundtn::Collections::IPropertySet** value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- GetCurrentView(winapp::Core::ICoreApplicationView** value) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- Run(winapp::Core::IFrameworkViewSource* viewSource) override { |
- HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf()); |
- if (FAILED(hr)) |
- return hr; |
- view_emulation_ = mswr::Make<CoreApplicationViewEmulation>( |
- app_view_.Get()); |
- hr = app_view_->Initialize(view_emulation_.Get()); |
- if (FAILED(hr)) |
- return hr; |
- mswr::ComPtr<winui::Core::ICoreWindow> core_window; |
- hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf()); |
- if (FAILED(hr)) |
- return hr; |
- hr = app_view_->SetWindow(core_window.Get()); |
- 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(); |
- } |
- |
- HRESULT STDMETHODCALLTYPE RunWithActivationFactories( |
- winfoundtn::IGetActivationFactory* activationFactoryCallback) override { |
- return S_OK; |
- } |
- |
- // ICoreApplicationExit implementation: |
- |
- HRESULT STDMETHODCALLTYPE Exit(void) override { |
- return view_emulation_->Close(); |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- add_Exiting(winfoundtn::IEventHandler<IInspectable*>* handler, |
- EventRegistrationToken* token) override { |
- return S_OK; |
- } |
- |
- HRESULT STDMETHODCALLTYPE |
- remove_Exiting(EventRegistrationToken token) override { |
- return S_OK; |
- } |
- |
- private: |
- mswr::ComPtr<winapp::Core::IFrameworkView> app_view_; |
- mswr::ComPtr<CoreApplicationViewEmulation> view_emulation_; |
-}; |
- |
- |
-mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() { |
- HRESULT hr = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); |
- if (FAILED(hr)) |
- CHECK(false); |
- return mswr::Make<CoreApplicationWin7Emulation>(); |
-} |
- |