Chromium Code Reviews| 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 3a490579886269eff9cfcd61fbc238be2a24c508..121b08e05d626218822ac07997b8a30039fc42ca 100644 |
| --- a/win8/metro_driver/metro_driver_win7.cc |
| +++ b/win8/metro_driver/metro_driver_win7.cc |
| @@ -19,37 +19,10 @@ EXTERN_C IMAGE_DOS_HEADER __ImageBase; |
| 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) { |
| - PAINTSTRUCT ps; |
| - HDC hdc; |
| - switch (message) { |
| - 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; |
| -} |
| +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, |
| + LPARAM lparam); |
| HWND CreateMetroTopLevelWindow(const RECT& work_area) { |
| HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); |
| @@ -67,8 +40,6 @@ HWND CreateMetroTopLevelWindow(const RECT& work_area) { |
| 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", |
| @@ -564,7 +535,7 @@ class CoreWindowEmulation |
| winui::Core::ICoreWindow, ICoreWindowInterop>, |
| public InputHandler { |
| public: |
| - CoreWindowEmulation() |
| + CoreWindowEmulation(winapp::Core::IFrameworkView* app_view) |
| : core_hwnd_(NULL), |
| mouse_moved_handler_(NULL), |
| mouse_capture_lost_handler_(NULL), |
| @@ -575,7 +546,9 @@ class CoreWindowEmulation |
| mouse_wheel_changed_handler_(NULL), |
| key_down_handler_(NULL), |
| key_up_handler_(NULL), |
| - character_received_handler_(NULL) { |
| + character_received_handler_(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 |
| @@ -592,11 +565,15 @@ class CoreWindowEmulation |
| } |
| core_hwnd_ = CreateMetroTopLevelWindow(work_area); |
| + ::SetProp(core_hwnd_, kAshWin7CoreWindowHandler, this); |
| } |
| ~CoreWindowEmulation() { |
| - if (core_hwnd_) |
| + app_view_ = NULL; |
| + if (core_hwnd_) { |
| + ::RemoveProp(core_hwnd_, kAshWin7CoreWindowHandler); |
| ::DestroyWindow(core_hwnd_); |
| + } |
| } |
| // ICoreWindow implementation: |
| @@ -699,12 +676,15 @@ class CoreWindowEmulation |
| virtual HRESULT STDMETHODCALLTYPE add_Activated( |
| WindowActivatedHandler* handler, |
| EventRegistrationToken* pCookie) { |
| - // TODO(cpu) implement this. |
| + window_activated_handler_ = handler; |
| + handler->AddRef(); |
| return S_OK; |
| } |
| virtual HRESULT STDMETHODCALLTYPE remove_Activated( |
| EventRegistrationToken cookie) { |
| + window_activated_handler_->Release(); |
| + window_activated_handler_ = NULL; |
| return S_OK; |
| } |
| @@ -1001,6 +981,11 @@ class CoreWindowEmulation |
| return true; |
| } |
| + void OnWindowActivated() { |
| + if (window_activated_handler_) |
| + window_activated_handler_->Invoke(this, NULL); |
| + } |
| + |
| private: |
| PointerEventHandler* mouse_moved_handler_; |
| PointerEventHandler* mouse_capture_lost_handler_; |
| @@ -1014,8 +999,51 @@ class CoreWindowEmulation |
| CharEventHandler* character_received_handler_; |
| HWND core_hwnd_; |
| mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_; |
| + winapp::Core::IFrameworkView* app_view_; |
|
cpu_(ooo_6.6-7.5)
2014/09/04 19:13:21
CoreWindowEmulation is refcounted, it could outliv
ananta
2014/09/04 19:27:07
Made app_view a ComPtr.
|
| + 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: |
| @@ -1047,8 +1075,8 @@ class ActivatedEvent |
| class CoreApplicationViewEmulation |
| : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> { |
| public: |
| - CoreApplicationViewEmulation() { |
| - core_window_ = mswr::Make<CoreWindowEmulation>(); |
| + CoreApplicationViewEmulation(winapp::Core::IFrameworkView* app_view) { |
| + core_window_ = mswr::Make<CoreWindowEmulation>(app_view); |
| } |
| HRESULT Activate() { |
| @@ -1152,7 +1180,8 @@ class CoreApplicationWin7Emulation |
| HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf()); |
| if (FAILED(hr)) |
| return hr; |
| - view_emulation_ = mswr::Make<CoreApplicationViewEmulation>(); |
| + view_emulation_ = mswr::Make<CoreApplicationViewEmulation>( |
| + app_view_.Get()); |
| hr = app_view_->Initialize(view_emulation_.Get()); |
| if (FAILED(hr)) |
| return hr; |