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 "win8/metro_driver/stdafx.h" | 5 #include "win8/metro_driver/stdafx.h" |
6 #include "win8/metro_driver/chrome_app_view_ash.h" | 6 #include "win8/metro_driver/chrome_app_view_ash.h" |
7 | 7 |
8 #include <corewindow.h> | 8 #include <corewindow.h> |
9 #include <shellapi.h> | 9 #include <shellapi.h> |
10 #include <windows.foundation.h> | 10 #include <windows.foundation.h> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
15 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
16 #include "base/path_service.h" | 16 #include "base/path_service.h" |
17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
18 #include "base/win/metro.h" | 18 #include "base/win/metro.h" |
19 #include "base/win/win_util.h" | 19 #include "base/win/win_util.h" |
20 #include "chrome/common/chrome_switches.h" | 20 #include "chrome/common/chrome_switches.h" |
21 #include "ipc/ipc_channel.h" | 21 #include "ipc/ipc_channel.h" |
22 #include "ipc/ipc_channel_proxy.h" | 22 #include "ipc/ipc_channel_proxy.h" |
23 #include "ipc/ipc_sender.h" | 23 #include "ipc/ipc_sender.h" |
24 #include "ui/events/gestures/gesture_sequence.h" | 24 #include "ui/events/gestures/gesture_sequence.h" |
25 #include "ui/metro_viewer/metro_viewer_messages.h" | 25 #include "ui/metro_viewer/metro_viewer_messages.h" |
26 #include "win8/metro_driver/file_picker_ash.h" | 26 #include "win8/metro_driver/file_picker_ash.h" |
| 27 #include "win8/metro_driver/ime/ime_popup_monitor.h" |
| 28 #include "win8/metro_driver/ime/keyevent_filter.h" |
| 29 #include "win8/metro_driver/ime/language_profile_monitor.h" |
| 30 #include "win8/metro_driver/ime/text_service.h" |
27 #include "win8/metro_driver/metro_driver.h" | 31 #include "win8/metro_driver/metro_driver.h" |
28 #include "win8/metro_driver/winrt_utils.h" | 32 #include "win8/metro_driver/winrt_utils.h" |
29 #include "win8/viewer/metro_viewer_constants.h" | 33 #include "win8/viewer/metro_viewer_constants.h" |
30 | 34 |
31 typedef winfoundtn::ITypedEventHandler< | 35 typedef winfoundtn::ITypedEventHandler< |
32 winapp::Core::CoreApplicationView*, | 36 winapp::Core::CoreApplicationView*, |
33 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; | 37 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; |
34 | 38 |
35 typedef winfoundtn::ITypedEventHandler< | 39 typedef winfoundtn::ITypedEventHandler< |
36 winui::Core::CoreWindow*, | 40 winui::Core::CoreWindow*, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_OpenURLOnDesktop, | 161 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_OpenURLOnDesktop, |
158 OnOpenURLOnDesktop) | 162 OnOpenURLOnDesktop) |
159 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursor, OnSetCursor) | 163 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursor, OnSetCursor) |
160 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileOpen, | 164 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileOpen, |
161 OnDisplayFileOpenDialog) | 165 OnDisplayFileOpenDialog) |
162 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileSaveAs, | 166 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplayFileSaveAs, |
163 OnDisplayFileSaveAsDialog) | 167 OnDisplayFileSaveAsDialog) |
164 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplaySelectFolder, | 168 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_DisplaySelectFolder, |
165 OnDisplayFolderPicker) | 169 OnDisplayFolderPicker) |
166 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPos, OnSetCursorPos) | 170 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_SetCursorPos, OnSetCursorPos) |
| 171 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeCancelComposition, |
| 172 OnImeCancelComposition) |
| 173 IPC_MESSAGE_HANDLER(MetroViewerHostMsg_ImeTextInputClientUpdated, |
| 174 OnImeTextInputClientChanged) |
167 IPC_MESSAGE_UNHANDLED(__debugbreak()) | 175 IPC_MESSAGE_UNHANDLED(__debugbreak()) |
168 IPC_END_MESSAGE_MAP() | 176 IPC_END_MESSAGE_MAP() |
169 return true; | 177 return true; |
170 } | 178 } |
171 | 179 |
172 virtual void OnChannelError() OVERRIDE { | 180 virtual void OnChannelError() OVERRIDE { |
173 DVLOG(1) << "Channel error. Exiting."; | 181 DVLOG(1) << "Channel error. Exiting."; |
174 MetroExit(app_view_->core_window_hwnd()); | 182 MetroExit(app_view_->core_window_hwnd()); |
175 // In early Windows 8 versions the code above sometimes fails so we call | 183 // In early Windows 8 versions the code above sometimes fails so we call |
176 // it a second time with a NULL window which just calls Exit(). | 184 // it a second time with a NULL window which just calls Exit(). |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 | 242 |
235 void OnSetCursorPos(int x, int y) { | 243 void OnSetCursorPos(int x, int y) { |
236 VLOG(1) << "In IPC OnSetCursorPos: " << x << ", " << y; | 244 VLOG(1) << "In IPC OnSetCursorPos: " << x << ", " << y; |
237 ui_proxy_->PostTask( | 245 ui_proxy_->PostTask( |
238 FROM_HERE, | 246 FROM_HERE, |
239 base::Bind(&ChromeAppViewAsh::OnSetCursorPos, | 247 base::Bind(&ChromeAppViewAsh::OnSetCursorPos, |
240 base::Unretained(app_view_), | 248 base::Unretained(app_view_), |
241 x, y)); | 249 x, y)); |
242 } | 250 } |
243 | 251 |
| 252 void OnImeCancelComposition() { |
| 253 ui_proxy_->PostTask( |
| 254 FROM_HERE, |
| 255 base::Bind(&ChromeAppViewAsh::OnImeCancelComposition, |
| 256 base::Unretained(app_view_))); |
| 257 } |
| 258 |
| 259 void OnImeTextInputClientChanged( |
| 260 const std::vector<int32>& input_scopes, |
| 261 const std::vector<metro_viewer::CharacterBounds>& character_bounds) { |
| 262 ui_proxy_->PostTask( |
| 263 FROM_HERE, |
| 264 base::Bind(&ChromeAppViewAsh::OnImeUpdateTextInputClient, |
| 265 base::Unretained(app_view_), |
| 266 input_scopes, |
| 267 character_bounds)); |
| 268 } |
244 | 269 |
245 scoped_refptr<base::MessageLoopProxy> ui_proxy_; | 270 scoped_refptr<base::MessageLoopProxy> ui_proxy_; |
246 ChromeAppViewAsh* app_view_; | 271 ChromeAppViewAsh* app_view_; |
247 }; | 272 }; |
248 | 273 |
249 bool WaitForChromeIPCConnection(const std::string& channel_name) { | 274 bool WaitForChromeIPCConnection(const std::string& channel_name) { |
250 int ms_elapsed = 0; | 275 int ms_elapsed = 0; |
251 while (!IPC::Channel::IsNamedServerInitialized(channel_name) && | 276 while (!IPC::Channel::IsNamedServerInitialized(channel_name) && |
252 ms_elapsed < 10000) { | 277 ms_elapsed < 10000) { |
253 ms_elapsed += 500; | 278 ms_elapsed += 500; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 sei.nShow = SW_SHOWNORMAL; | 453 sei.nShow = SW_SHOWNORMAL; |
429 sei.lpFile = chrome_exe_path.value().c_str(); | 454 sei.lpFile = chrome_exe_path.value().c_str(); |
430 sei.lpDirectory = L""; | 455 sei.lpDirectory = L""; |
431 sei.lpParameters = parameters.c_str(); | 456 sei.lpParameters = parameters.c_str(); |
432 ::ShellExecuteEx(&sei); | 457 ::ShellExecuteEx(&sei); |
433 return true; | 458 return true; |
434 } | 459 } |
435 | 460 |
436 } // namespace | 461 } // namespace |
437 | 462 |
| 463 struct ChromeAppViewAsh::TextInputClientState { |
| 464 std::vector<int32> input_scopes; |
| 465 std::vector<metro_viewer::CharacterBounds> composition_character_bounds; |
| 466 }; |
| 467 |
438 ChromeAppViewAsh::ChromeAppViewAsh() | 468 ChromeAppViewAsh::ChromeAppViewAsh() |
439 : mouse_down_flags_(ui::EF_NONE), | 469 : mouse_down_flags_(ui::EF_NONE), |
440 ui_channel_(nullptr), | 470 ui_channel_(nullptr), |
441 core_window_hwnd_(NULL), | 471 core_window_hwnd_(NULL), |
442 ui_loop_(base::MessageLoop::TYPE_UI) { | 472 ui_loop_(base::MessageLoop::TYPE_UI), |
| 473 text_input_client_state_(new TextInputClientState) { |
443 DVLOG(1) << __FUNCTION__; | 474 DVLOG(1) << __FUNCTION__; |
444 globals.previous_state = | 475 globals.previous_state = |
445 winapp::Activation::ApplicationExecutionState_NotRunning; | 476 winapp::Activation::ApplicationExecutionState_NotRunning; |
446 } | 477 } |
447 | 478 |
448 ChromeAppViewAsh::~ChromeAppViewAsh() { | 479 ChromeAppViewAsh::~ChromeAppViewAsh() { |
449 DVLOG(1) << __FUNCTION__; | 480 DVLOG(1) << __FUNCTION__; |
450 } | 481 } |
451 | 482 |
452 IFACEMETHODIMP | 483 IFACEMETHODIMP |
453 ChromeAppViewAsh::Initialize(winapp::Core::ICoreApplicationView* view) { | 484 ChromeAppViewAsh::Initialize(winapp::Core::ICoreApplicationView* view) { |
454 view_ = view; | 485 view_ = view; |
455 DVLOG(1) << __FUNCTION__; | 486 DVLOG(1) << __FUNCTION__; |
456 HRESULT hr = view_->add_Activated(mswr::Callback<ActivatedHandler>( | 487 HRESULT hr = view_->add_Activated(mswr::Callback<ActivatedHandler>( |
457 this, &ChromeAppViewAsh::OnActivate).Get(), | 488 this, &ChromeAppViewAsh::OnActivate).Get(), |
458 &activated_token_); | 489 &activated_token_); |
459 CheckHR(hr); | 490 CheckHR(hr); |
| 491 if (!metro_driver::InstallKeyEventFilter()) |
| 492 return E_FAIL; |
460 return hr; | 493 return hr; |
461 } | 494 } |
462 | 495 |
463 IFACEMETHODIMP | 496 IFACEMETHODIMP |
464 ChromeAppViewAsh::SetWindow(winui::Core::ICoreWindow* window) { | 497 ChromeAppViewAsh::SetWindow(winui::Core::ICoreWindow* window) { |
465 window_ = window; | 498 window_ = window; |
466 DVLOG(1) << __FUNCTION__; | 499 DVLOG(1) << __FUNCTION__; |
467 | 500 |
468 // Retrieve the native window handle via the interop layer. | 501 // Retrieve the native window handle via the interop layer. |
469 mswr::ComPtr<ICoreWindowInterop> interop; | 502 mswr::ComPtr<ICoreWindowInterop> interop; |
470 HRESULT hr = window->QueryInterface(interop.GetAddressOf()); | 503 HRESULT hr = window->QueryInterface(interop.GetAddressOf()); |
471 CheckHR(hr); | 504 CheckHR(hr); |
472 hr = interop->get_WindowHandle(&core_window_hwnd_); | 505 hr = interop->get_WindowHandle(&core_window_hwnd_); |
473 CheckHR(hr); | 506 CheckHR(hr); |
474 | 507 |
| 508 text_service_.reset(new metro_driver::TextService(core_window_hwnd_, this)); |
| 509 metro_driver::AddImePopupObserver(this); |
| 510 metro_driver::AddLanguageProfileObserver(this); |
| 511 |
475 hr = window_->add_SizeChanged(mswr::Callback<SizeChangedHandler>( | 512 hr = window_->add_SizeChanged(mswr::Callback<SizeChangedHandler>( |
476 this, &ChromeAppViewAsh::OnSizeChanged).Get(), | 513 this, &ChromeAppViewAsh::OnSizeChanged).Get(), |
477 &sizechange_token_); | 514 &sizechange_token_); |
478 CheckHR(hr); | 515 CheckHR(hr); |
479 | 516 |
480 // Register for pointer and keyboard notifications. We forward | 517 // Register for pointer and keyboard notifications. We forward |
481 // them to the browser process via IPC. | 518 // them to the browser process via IPC. |
482 hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>( | 519 hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>( |
483 this, &ChromeAppViewAsh::OnPointerMoved).Get(), | 520 this, &ChromeAppViewAsh::OnPointerMoved).Get(), |
484 &pointermoved_token_); | 521 &pointermoved_token_); |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 ui_loop_.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); | 649 ui_loop_.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); |
613 ui_loop_.Run(); | 650 ui_loop_.Run(); |
614 | 651 |
615 DVLOG(0) << "ProcessEvents done, hr=" << hr; | 652 DVLOG(0) << "ProcessEvents done, hr=" << hr; |
616 return hr; | 653 return hr; |
617 } | 654 } |
618 | 655 |
619 IFACEMETHODIMP | 656 IFACEMETHODIMP |
620 ChromeAppViewAsh::Uninitialize() { | 657 ChromeAppViewAsh::Uninitialize() { |
621 DVLOG(1) << __FUNCTION__; | 658 DVLOG(1) << __FUNCTION__; |
| 659 metro_driver::UninstallKeyEventFilter(); |
| 660 metro_driver::RemoveImePopupObserver(this); |
| 661 metro_driver::RemoveLanguageProfileObserver(this); |
622 window_ = nullptr; | 662 window_ = nullptr; |
623 view_ = nullptr; | 663 view_ = nullptr; |
624 core_window_hwnd_ = NULL; | 664 core_window_hwnd_ = NULL; |
625 return S_OK; | 665 return S_OK; |
626 } | 666 } |
627 | 667 |
628 // static | 668 // static |
629 HRESULT ChromeAppViewAsh::Unsnap() { | 669 HRESULT ChromeAppViewAsh::Unsnap() { |
630 mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> view_statics; | 670 mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> view_statics; |
631 HRESULT hr = winrt_utils::CreateActivationFactory( | 671 HRESULT hr = winrt_utils::CreateActivationFactory( |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 DVLOG(1) << __FUNCTION__; | 820 DVLOG(1) << __FUNCTION__; |
781 DVLOG(1) << "Success: " << success; | 821 DVLOG(1) << "Success: " << success; |
782 if (ui_channel_) { | 822 if (ui_channel_) { |
783 ui_channel_->Send(new MetroViewerHostMsg_SelectFolderDone( | 823 ui_channel_->Send(new MetroViewerHostMsg_SelectFolderDone( |
784 success, | 824 success, |
785 base::FilePath(folder_picker->result()))); | 825 base::FilePath(folder_picker->result()))); |
786 } | 826 } |
787 delete folder_picker; | 827 delete folder_picker; |
788 } | 828 } |
789 | 829 |
| 830 void ChromeAppViewAsh::OnImeCancelComposition() { |
| 831 text_service_->CancelComposition(); |
| 832 } |
| 833 |
| 834 void ChromeAppViewAsh::OnImeUpdateTextInputClient( |
| 835 const std::vector<int32>& input_scopes, |
| 836 const std::vector<metro_viewer::CharacterBounds>& character_bounds) { |
| 837 if (text_input_client_state_->input_scopes != input_scopes) { |
| 838 text_service_->OnDocumentTypeChanged(input_scopes); |
| 839 text_input_client_state_->input_scopes = input_scopes; |
| 840 } |
| 841 text_input_client_state_->composition_character_bounds = character_bounds; |
| 842 } |
| 843 |
| 844 void ChromeAppViewAsh::OnCandidatePopupChanged(bool shown) { |
| 845 ui_channel_->Send(new MetroViewerHostMsg_ImeCandidatePopupChanged(shown)); |
| 846 } |
| 847 |
| 848 void ChromeAppViewAsh::OnInputSourceChanged(LANGID langid, bool is_ime) { |
| 849 ui_channel_->Send(new MetroViewerHostMsg_ImeInputSourceChanged( |
| 850 langid, is_ime)); |
| 851 } |
| 852 |
| 853 void ChromeAppViewAsh::OnCompositionChanged( |
| 854 const string16& text, |
| 855 int32 selection_start, |
| 856 int32 selection_end, |
| 857 const std::vector<metro_viewer::UnderlineInfo>& underlines) { |
| 858 ui_channel_->Send(new MetroViewerHostMsg_ImeCompositionChanged( |
| 859 text, selection_start, selection_end, underlines)); |
| 860 } |
| 861 |
| 862 void ChromeAppViewAsh::OnTextCommitted(const string16& text) { |
| 863 ui_channel_->Send(new MetroViewerHostMsg_ImeTextCommitted(text)); |
| 864 } |
| 865 |
| 866 RECT ChromeAppViewAsh::GetCaretBounds() { |
| 867 if (text_input_client_state_->composition_character_bounds.empty()) { |
| 868 const RECT rect = {}; |
| 869 return rect; |
| 870 } |
| 871 const metro_viewer::CharacterBounds& bounds = |
| 872 text_input_client_state_->composition_character_bounds[0]; |
| 873 POINT left_top = {bounds.left, bounds.top}; |
| 874 POINT right_bottom = {bounds.right, bounds.bottom}; |
| 875 ::ClientToScreen(this->core_window_hwnd_, &left_top); |
| 876 ::ClientToScreen(this->core_window_hwnd_, &right_bottom); |
| 877 const RECT rect = { |
| 878 left_top.x, |
| 879 left_top.y, |
| 880 right_bottom.x, |
| 881 right_bottom.y, |
| 882 }; |
| 883 return rect; |
| 884 } |
| 885 |
| 886 bool ChromeAppViewAsh::GetCompositionCharacterBounds(uint32 index, RECT* rect) { |
| 887 if (index >= text_input_client_state_->composition_character_bounds.size()) { |
| 888 return false; |
| 889 } |
| 890 const metro_viewer::CharacterBounds& bounds = |
| 891 text_input_client_state_->composition_character_bounds[index]; |
| 892 POINT left_top = {bounds.left, bounds.top}; |
| 893 POINT right_bottom = {bounds.right, bounds.bottom}; |
| 894 ::ClientToScreen(this->core_window_hwnd_, &left_top); |
| 895 ::ClientToScreen(this->core_window_hwnd_, &right_bottom); |
| 896 ::SetRect(rect, left_top.x, left_top.y, right_bottom.x, right_bottom.y); |
| 897 return true; |
| 898 } |
| 899 |
790 HRESULT ChromeAppViewAsh::OnActivate( | 900 HRESULT ChromeAppViewAsh::OnActivate( |
791 winapp::Core::ICoreApplicationView*, | 901 winapp::Core::ICoreApplicationView*, |
792 winapp::Activation::IActivatedEventArgs* args) { | 902 winapp::Activation::IActivatedEventArgs* args) { |
793 DVLOG(1) << __FUNCTION__; | 903 DVLOG(1) << __FUNCTION__; |
794 // Note: If doing more work in this function, you migth need to call | 904 // Note: If doing more work in this function, you migth need to call |
795 // get_PreviousExecutionState() and skip the work if the result is | 905 // get_PreviousExecutionState() and skip the work if the result is |
796 // ApplicationExecutionState_Running and globals.previous_state is too. | 906 // ApplicationExecutionState_Running and globals.previous_state is too. |
797 args->get_PreviousExecutionState(&globals.previous_state); | 907 args->get_PreviousExecutionState(&globals.previous_state); |
798 DVLOG(1) << "Previous Execution State: " << globals.previous_state; | 908 DVLOG(1) << "Previous Execution State: " << globals.previous_state; |
799 | 909 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1026 winui::Core::CoreWindowActivationState state; | 1136 winui::Core::CoreWindowActivationState state; |
1027 HRESULT hr = args->get_WindowActivationState(&state); | 1137 HRESULT hr = args->get_WindowActivationState(&state); |
1028 if (FAILED(hr)) | 1138 if (FAILED(hr)) |
1029 return hr; | 1139 return hr; |
1030 | 1140 |
1031 // Treat both full activation (Ash was reopened from the Start Screen or from | 1141 // Treat both full activation (Ash was reopened from the Start Screen or from |
1032 // any other Metro entry point in Windows) and pointer activation (user | 1142 // any other Metro entry point in Windows) and pointer activation (user |
1033 // clicked back in Ash after using another app on another monitor) the same. | 1143 // clicked back in Ash after using another app on another monitor) the same. |
1034 if (state == winui::Core::CoreWindowActivationState_CodeActivated || | 1144 if (state == winui::Core::CoreWindowActivationState_CodeActivated || |
1035 state == winui::Core::CoreWindowActivationState_PointerActivated) { | 1145 state == winui::Core::CoreWindowActivationState_PointerActivated) { |
| 1146 switch (state) { |
| 1147 case winui::Core::CoreWindowActivationState_CodeActivated: |
| 1148 case winui::Core::CoreWindowActivationState_PointerActivated: |
| 1149 text_service_->OnWindowActivated(); |
| 1150 break; |
| 1151 } |
1036 ui_channel_->Send(new MetroViewerHostMsg_WindowActivated()); | 1152 ui_channel_->Send(new MetroViewerHostMsg_WindowActivated()); |
1037 } | 1153 } |
1038 return S_OK; | 1154 return S_OK; |
1039 } | 1155 } |
1040 | 1156 |
1041 HRESULT ChromeAppViewAsh::HandleSearchRequest( | 1157 HRESULT ChromeAppViewAsh::HandleSearchRequest( |
1042 winapp::Activation::IActivatedEventArgs* args) { | 1158 winapp::Activation::IActivatedEventArgs* args) { |
1043 mswr::ComPtr<winapp::Activation::ISearchActivatedEventArgs> search_args; | 1159 mswr::ComPtr<winapp::Activation::ISearchActivatedEventArgs> search_args; |
1044 CheckHR(args->QueryInterface( | 1160 CheckHR(args->QueryInterface( |
1045 winapp::Activation::IID_ISearchActivatedEventArgs, &search_args)); | 1161 winapp::Activation::IID_ISearchActivatedEventArgs, &search_args)); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1136 mswr::ComPtr<winapp::Core::ICoreApplicationExit> app_exit; | 1252 mswr::ComPtr<winapp::Core::ICoreApplicationExit> app_exit; |
1137 CheckHR(core_app.As(&app_exit)); | 1253 CheckHR(core_app.As(&app_exit)); |
1138 globals.app_exit = app_exit.Detach(); | 1254 globals.app_exit = app_exit.Detach(); |
1139 } | 1255 } |
1140 | 1256 |
1141 IFACEMETHODIMP | 1257 IFACEMETHODIMP |
1142 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { | 1258 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { |
1143 *view = mswr::Make<ChromeAppViewAsh>().Detach(); | 1259 *view = mswr::Make<ChromeAppViewAsh>().Detach(); |
1144 return (*view) ? S_OK : E_OUTOFMEMORY; | 1260 return (*view) ? S_OK : E_OUTOFMEMORY; |
1145 } | 1261 } |
OLD | NEW |