Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: win8/metro_driver/metro_driver_win7.cc

Issue 546503002: Notify the Chrome browser process about the window being activated from the viewer process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added back a comment which was removed by mistake Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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> 6 #include <corewindow.h>
7 #include <shobjidl.h> 7 #include <shobjidl.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "ui/gfx/geometry/safe_integer_conversions.h" 10 #include "ui/gfx/geometry/safe_integer_conversions.h"
11 #include "ui/gfx/win/msg_util.h" 11 #include "ui/gfx/win/msg_util.h"
12 12
13 #pragma comment(lib, "shell32.lib") 13 #pragma comment(lib, "shell32.lib")
14 14
15 EXTERN_C IMAGE_DOS_HEADER __ImageBase; 15 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
16 // Even though we only create a single window, we need to keep this 16 // Even though we only create a single window, we need to keep this
17 // count because of the hidden window used by the UI message loop of 17 // count because of the hidden window used by the UI message loop of
18 // the metro viewer. 18 // the metro viewer.
19 int g_window_count = 0; 19 int g_window_count = 0;
20 20
21 const wchar_t kAshWin7AppId[] = L"Google.Chrome.AshWin7.1"; 21 const wchar_t kAshWin7AppId[] = L"Google.Chrome.AshWin7.1";
22 22 const wchar_t kAshWin7CoreWindowHandler[] = L"CoreWindowHandler";
23 extern float GetModernUIScale(); 23 extern float GetModernUIScale();
24 24 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam,
25 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, 25 LPARAM lparam);
26 WPARAM wparam, LPARAM lparam) {
27 PAINTSTRUCT ps;
28 HDC hdc;
29 switch (message) {
30 case WM_CREATE:
31 ++g_window_count;
32 break;
33 case WM_PAINT:
34 hdc = ::BeginPaint(hwnd, &ps);
35 ::EndPaint(hwnd, &ps);
36 break;
37 case WM_CLOSE:
38 ::DestroyWindow(hwnd);
39 break;
40 case WM_DESTROY:
41 --g_window_count;
42 if (!g_window_count)
43 ::PostQuitMessage(0);
44 break;
45 // Always allow Chrome to set the cursor.
46 case WM_SETCURSOR:
47 return 1;
48 default:
49 return ::DefWindowProc(hwnd, message, wparam, lparam);
50 }
51 return 0;
52 }
53 26
54 HWND CreateMetroTopLevelWindow(const RECT& work_area) { 27 HWND CreateMetroTopLevelWindow(const RECT& work_area) {
55 HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase); 28 HINSTANCE hInst = reinterpret_cast<HINSTANCE>(&__ImageBase);
56 WNDCLASSEXW wcex; 29 WNDCLASSEXW wcex;
57 wcex.cbSize = sizeof(wcex); 30 wcex.cbSize = sizeof(wcex);
58 wcex.style = CS_HREDRAW | CS_VREDRAW; 31 wcex.style = CS_HREDRAW | CS_VREDRAW;
59 wcex.lpfnWndProc = WndProc; 32 wcex.lpfnWndProc = WndProc;
60 wcex.cbClsExtra = 0; 33 wcex.cbClsExtra = 0;
61 wcex.cbWndExtra = 0; 34 wcex.cbWndExtra = 0;
62 wcex.hInstance = hInst; 35 wcex.hInstance = hInst;
63 wcex.hIcon = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME"); 36 wcex.hIcon = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME");
64 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 37 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
65 wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1); 38 wcex.hbrBackground = (HBRUSH)(COLOR_INACTIVECAPTION+1);
66 wcex.lpszMenuName = 0; 39 wcex.lpszMenuName = 0;
67 wcex.lpszClassName = L"Windows.UI.Core.CoreWindow"; 40 wcex.lpszClassName = L"Windows.UI.Core.CoreWindow";
68 wcex.hIconSm = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME"); 41 wcex.hIconSm = LoadIcon(::GetModuleHandle(NULL), L"IDR_MAINFRAME");
69 42
70
71
72 HWND hwnd = ::CreateWindowExW(0, 43 HWND hwnd = ::CreateWindowExW(0,
73 MAKEINTATOM(::RegisterClassExW(&wcex)), 44 MAKEINTATOM(::RegisterClassExW(&wcex)),
74 L"metro_win7", 45 L"metro_win7",
75 WS_POPUP | WS_VISIBLE | WS_MINIMIZEBOX, 46 WS_POPUP | WS_VISIBLE | WS_MINIMIZEBOX,
76 work_area.top, work_area.left, 47 work_area.top, work_area.left,
77 work_area.right, work_area.bottom, 48 work_area.right, work_area.bottom,
78 NULL, NULL, hInst, NULL); 49 NULL, NULL, hInst, NULL);
79 return hwnd; 50 return hwnd;
80 } 51 }
81 52
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 InputHandler* input_handler_; 528 InputHandler* input_handler_;
558 AcceleratorKeyEventHandler* accelerator_key_event_handler_; 529 AcceleratorKeyEventHandler* accelerator_key_event_handler_;
559 }; 530 };
560 531
561 class CoreWindowEmulation 532 class CoreWindowEmulation
562 : public mswr::RuntimeClass< 533 : public mswr::RuntimeClass<
563 mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>, 534 mswr::RuntimeClassFlags<mswr::WinRtClassicComMix>,
564 winui::Core::ICoreWindow, ICoreWindowInterop>, 535 winui::Core::ICoreWindow, ICoreWindowInterop>,
565 public InputHandler { 536 public InputHandler {
566 public: 537 public:
567 CoreWindowEmulation() 538 CoreWindowEmulation(winapp::Core::IFrameworkView* app_view)
568 : core_hwnd_(NULL), 539 : core_hwnd_(NULL),
569 mouse_moved_handler_(NULL), 540 mouse_moved_handler_(NULL),
570 mouse_capture_lost_handler_(NULL), 541 mouse_capture_lost_handler_(NULL),
571 mouse_pressed_handler_(NULL), 542 mouse_pressed_handler_(NULL),
572 mouse_released_handler_(NULL), 543 mouse_released_handler_(NULL),
573 mouse_entered_handler_(NULL), 544 mouse_entered_handler_(NULL),
574 mouse_exited_handler_(NULL), 545 mouse_exited_handler_(NULL),
575 mouse_wheel_changed_handler_(NULL), 546 mouse_wheel_changed_handler_(NULL),
576 key_down_handler_(NULL), 547 key_down_handler_(NULL),
577 key_up_handler_(NULL), 548 key_up_handler_(NULL),
578 character_received_handler_(NULL) { 549 character_received_handler_(NULL),
550 app_view_(app_view),
551 window_activated_handler_(NULL) {
579 dispatcher_ = mswr::Make<CoreDispatcherEmulation>(this); 552 dispatcher_ = mswr::Make<CoreDispatcherEmulation>(this);
580 553
581 // Unless we select our own AppUserModelID the shell might confuse us 554 // Unless we select our own AppUserModelID the shell might confuse us
582 // with the app launcher one and we get the wrong taskbar button and icon. 555 // with the app launcher one and we get the wrong taskbar button and icon.
583 ::SetCurrentProcessExplicitAppUserModelID(kAshWin7AppId); 556 ::SetCurrentProcessExplicitAppUserModelID(kAshWin7AppId);
584 557
585 RECT work_area = {0}; 558 RECT work_area = {0};
586 ::SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0); 559 ::SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
587 if (::IsDebuggerPresent()) { 560 if (::IsDebuggerPresent()) {
588 work_area.top = 0; 561 work_area.top = 0;
589 work_area.left = 0; 562 work_area.left = 0;
590 work_area.right = 1600; 563 work_area.right = 1600;
591 work_area.bottom = 900; 564 work_area.bottom = 900;
592 } 565 }
593 566
594 core_hwnd_ = CreateMetroTopLevelWindow(work_area); 567 core_hwnd_ = CreateMetroTopLevelWindow(work_area);
568 ::SetProp(core_hwnd_, kAshWin7CoreWindowHandler, this);
595 } 569 }
596 570
597 ~CoreWindowEmulation() { 571 ~CoreWindowEmulation() {
598 if (core_hwnd_) 572 app_view_ = NULL;
573 if (core_hwnd_) {
574 ::RemoveProp(core_hwnd_, kAshWin7CoreWindowHandler);
599 ::DestroyWindow(core_hwnd_); 575 ::DestroyWindow(core_hwnd_);
576 }
600 } 577 }
601 578
602 // ICoreWindow implementation: 579 // ICoreWindow implementation:
603 virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider( 580 virtual HRESULT STDMETHODCALLTYPE get_AutomationHostProvider(
604 IInspectable** value) { 581 IInspectable** value) {
605 return S_OK; 582 return S_OK;
606 } 583 }
607 584
608 virtual HRESULT STDMETHODCALLTYPE get_Bounds( 585 virtual HRESULT STDMETHODCALLTYPE get_Bounds(
609 winfoundtn::Rect* value) { 586 winfoundtn::Rect* value) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 return S_OK; 669 return S_OK;
693 } 670 }
694 671
695 virtual HRESULT STDMETHODCALLTYPE SetPointerCapture(void) { 672 virtual HRESULT STDMETHODCALLTYPE SetPointerCapture(void) {
696 return S_OK; 673 return S_OK;
697 } 674 }
698 675
699 virtual HRESULT STDMETHODCALLTYPE add_Activated( 676 virtual HRESULT STDMETHODCALLTYPE add_Activated(
700 WindowActivatedHandler* handler, 677 WindowActivatedHandler* handler,
701 EventRegistrationToken* pCookie) { 678 EventRegistrationToken* pCookie) {
702 // TODO(cpu) implement this. 679 window_activated_handler_ = handler;
680 handler->AddRef();
703 return S_OK; 681 return S_OK;
704 } 682 }
705 683
706 virtual HRESULT STDMETHODCALLTYPE remove_Activated( 684 virtual HRESULT STDMETHODCALLTYPE remove_Activated(
707 EventRegistrationToken cookie) { 685 EventRegistrationToken cookie) {
686 window_activated_handler_->Release();
687 window_activated_handler_ = NULL;
708 return S_OK; 688 return S_OK;
709 } 689 }
710 690
711 virtual HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested( 691 virtual HRESULT STDMETHODCALLTYPE add_AutomationProviderRequested(
712 AutomationProviderHandler* handler, 692 AutomationProviderHandler* handler,
713 EventRegistrationToken* cookie) { 693 EventRegistrationToken* cookie) {
714 return S_OK; 694 return S_OK;
715 } 695 }
716 696
717 virtual HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested( 697 virtual HRESULT STDMETHODCALLTYPE remove_AutomationProviderRequested(
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 } 974 }
995 975
996 default: 976 default:
997 return false; 977 return false;
998 } 978 }
999 DCHECK(handler); 979 DCHECK(handler);
1000 handler->Invoke(this, event_args.Get()); 980 handler->Invoke(this, event_args.Get());
1001 return true; 981 return true;
1002 } 982 }
1003 983
984 void OnWindowActivated() {
985 if (window_activated_handler_)
986 window_activated_handler_->Invoke(this, NULL);
987 }
988
1004 private: 989 private:
1005 PointerEventHandler* mouse_moved_handler_; 990 PointerEventHandler* mouse_moved_handler_;
1006 PointerEventHandler* mouse_capture_lost_handler_; 991 PointerEventHandler* mouse_capture_lost_handler_;
1007 PointerEventHandler* mouse_pressed_handler_; 992 PointerEventHandler* mouse_pressed_handler_;
1008 PointerEventHandler* mouse_released_handler_; 993 PointerEventHandler* mouse_released_handler_;
1009 PointerEventHandler* mouse_entered_handler_; 994 PointerEventHandler* mouse_entered_handler_;
1010 PointerEventHandler* mouse_exited_handler_; 995 PointerEventHandler* mouse_exited_handler_;
1011 PointerEventHandler* mouse_wheel_changed_handler_; 996 PointerEventHandler* mouse_wheel_changed_handler_;
1012 KeyEventHandler* key_down_handler_; 997 KeyEventHandler* key_down_handler_;
1013 KeyEventHandler* key_up_handler_; 998 KeyEventHandler* key_up_handler_;
1014 CharEventHandler* character_received_handler_; 999 CharEventHandler* character_received_handler_;
1015 HWND core_hwnd_; 1000 HWND core_hwnd_;
1016 mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_; 1001 mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher_;
1002 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.
1003 WindowActivatedHandler* window_activated_handler_;
1017 }; 1004 };
1018 1005
1006 LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
1007 WPARAM wparam, LPARAM lparam) {
1008 PAINTSTRUCT ps;
1009 HDC hdc;
1010 switch (message) {
1011 case WM_ACTIVATE: {
1012 // HIWORD(wparam) is 1 if the window is minimized.
1013 bool active = (LOWORD(wparam) != WA_INACTIVE) && !HIWORD(wparam);
1014 if (active) {
1015 CoreWindowEmulation* core_window_handler =
1016 reinterpret_cast<CoreWindowEmulation*>(
1017 ::GetProp(hwnd, kAshWin7CoreWindowHandler));
1018 if (core_window_handler)
1019 core_window_handler->OnWindowActivated();
1020 }
1021 return ::DefWindowProc(hwnd, message, wparam, lparam);
1022 }
1023 case WM_CREATE:
1024 ++g_window_count;
1025 break;
1026 case WM_PAINT:
1027 hdc = ::BeginPaint(hwnd, &ps);
1028 ::EndPaint(hwnd, &ps);
1029 break;
1030 case WM_CLOSE:
1031 ::DestroyWindow(hwnd);
1032 break;
1033 case WM_DESTROY:
1034 --g_window_count;
1035 if (!g_window_count)
1036 ::PostQuitMessage(0);
1037 break;
1038 // Always allow Chrome to set the cursor.
1039 case WM_SETCURSOR:
1040 return 1;
1041 default:
1042 return ::DefWindowProc(hwnd, message, wparam, lparam);
1043 }
1044 return 0;
1045 }
1046
1019 class ActivatedEvent 1047 class ActivatedEvent
1020 : public mswr::RuntimeClass<winapp::Activation::IActivatedEventArgs> { 1048 : public mswr::RuntimeClass<winapp::Activation::IActivatedEventArgs> {
1021 public: 1049 public:
1022 ActivatedEvent(winapp::Activation::ActivationKind activation_kind) 1050 ActivatedEvent(winapp::Activation::ActivationKind activation_kind)
1023 : activation_kind_(activation_kind) { 1051 : activation_kind_(activation_kind) {
1024 } 1052 }
1025 1053
1026 virtual HRESULT STDMETHODCALLTYPE get_Kind( 1054 virtual HRESULT STDMETHODCALLTYPE get_Kind(
1027 winapp::Activation::ActivationKind *value) { 1055 winapp::Activation::ActivationKind *value) {
1028 *value = activation_kind_; 1056 *value = activation_kind_;
(...skipping 11 matching lines...) Expand all
1040 return E_FAIL; 1068 return E_FAIL;
1041 } 1069 }
1042 1070
1043 private: 1071 private:
1044 winapp::Activation::ActivationKind activation_kind_; 1072 winapp::Activation::ActivationKind activation_kind_;
1045 }; 1073 };
1046 1074
1047 class CoreApplicationViewEmulation 1075 class CoreApplicationViewEmulation
1048 : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> { 1076 : public mswr::RuntimeClass<winapp::Core::ICoreApplicationView> {
1049 public: 1077 public:
1050 CoreApplicationViewEmulation() { 1078 CoreApplicationViewEmulation(winapp::Core::IFrameworkView* app_view) {
1051 core_window_ = mswr::Make<CoreWindowEmulation>(); 1079 core_window_ = mswr::Make<CoreWindowEmulation>(app_view);
1052 } 1080 }
1053 1081
1054 HRESULT Activate() { 1082 HRESULT Activate() {
1055 if (activated_handler_) { 1083 if (activated_handler_) {
1056 auto ae = mswr::Make<ActivatedEvent>( 1084 auto ae = mswr::Make<ActivatedEvent>(
1057 winapp::Activation::ActivationKind_File); 1085 winapp::Activation::ActivationKind_File);
1058 return activated_handler_->Invoke(this, ae.Get()); 1086 return activated_handler_->Invoke(this, ae.Get());
1059 } else { 1087 } else {
1060 return S_OK; 1088 return S_OK;
1061 } 1089 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 virtual HRESULT STDMETHODCALLTYPE GetCurrentView( 1173 virtual HRESULT STDMETHODCALLTYPE GetCurrentView(
1146 winapp::Core::ICoreApplicationView** value) { 1174 winapp::Core::ICoreApplicationView** value) {
1147 return S_OK; 1175 return S_OK;
1148 } 1176 }
1149 1177
1150 virtual HRESULT STDMETHODCALLTYPE Run( 1178 virtual HRESULT STDMETHODCALLTYPE Run(
1151 winapp::Core::IFrameworkViewSource* viewSource) { 1179 winapp::Core::IFrameworkViewSource* viewSource) {
1152 HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf()); 1180 HRESULT hr = viewSource->CreateView(app_view_.GetAddressOf());
1153 if (FAILED(hr)) 1181 if (FAILED(hr))
1154 return hr; 1182 return hr;
1155 view_emulation_ = mswr::Make<CoreApplicationViewEmulation>(); 1183 view_emulation_ = mswr::Make<CoreApplicationViewEmulation>(
1184 app_view_.Get());
1156 hr = app_view_->Initialize(view_emulation_.Get()); 1185 hr = app_view_->Initialize(view_emulation_.Get());
1157 if (FAILED(hr)) 1186 if (FAILED(hr))
1158 return hr; 1187 return hr;
1159 mswr::ComPtr<winui::Core::ICoreWindow> core_window; 1188 mswr::ComPtr<winui::Core::ICoreWindow> core_window;
1160 hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf()); 1189 hr = view_emulation_->get_CoreWindow(core_window.GetAddressOf());
1161 if (FAILED(hr)) 1190 if (FAILED(hr))
1162 return hr; 1191 return hr;
1163 hr = app_view_->SetWindow(core_window.Get()); 1192 hr = app_view_->SetWindow(core_window.Get());
1164 if (FAILED(hr)) 1193 if (FAILED(hr))
1165 return hr; 1194 return hr;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1200 }; 1229 };
1201 1230
1202 1231
1203 mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() { 1232 mswr::ComPtr<winapp::Core::ICoreApplication> InitWindows7() {
1204 HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); 1233 HRESULT hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
1205 if (FAILED(hr)) 1234 if (FAILED(hr))
1206 CHECK(false); 1235 CHECK(false);
1207 return mswr::Make<CoreApplicationWin7Emulation>(); 1236 return mswr::Make<CoreApplicationWin7Emulation>();
1208 } 1237 }
1209 1238
OLDNEW
« win8/metro_driver/chrome_app_view_ash.cc ('K') | « win8/metro_driver/chrome_app_view_ash.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698