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

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

Issue 53553003: WIP: Ash IME support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 1 month 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
« no previous file with comments | « win8/metro_driver/chrome_app_view_ash.h ('k') | win8/metro_driver/ime/ime.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « win8/metro_driver/chrome_app_view_ash.h ('k') | win8/metro_driver/ime/ime.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698