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

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

Issue 10984007: in-chrome viewer for metro (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: only do viewer mode when shift-F11 is pressed, for now Created 8 years, 2 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 | Annotate | Revision Log
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.h" 6 #include "win8/metro_driver/chrome_app_view.h"
7 #include "win8/metro_driver/direct3d_helper.h"
7 8
8 #include <algorithm> 9 #include <algorithm>
9 #include <windows.applicationModel.datatransfer.h> 10 #include <windows.applicationModel.datatransfer.h>
10 #include <windows.foundation.h> 11 #include <windows.foundation.h>
11 12
12 #include "base/bind.h" 13 #include "base/bind.h"
13 #include "base/message_loop.h" 14 #include "base/message_loop.h"
14 #include "base/win/metro.h" 15 #include "base/win/metro.h"
15 16
17 #include "base/threading/thread.h"
18 #include "ipc/ipc_channel.h"
19 #include "ipc/ipc_channel_proxy.h"
20 #include "ipc/ipc_sender.h"
21
16 // This include allows to send WM_SYSCOMMANDs to chrome. 22 // This include allows to send WM_SYSCOMMANDs to chrome.
17 #include "chrome/app/chrome_command_ids.h" 23 #include "chrome/app/chrome_command_ids.h"
18 #include "win8/metro_driver/winrt_utils.h" 24 #include "win8/metro_driver/winrt_utils.h"
19 #include "ui/base/ui_base_switches.h" 25 #include "ui/base/ui_base_switches.h"
20 26
27 //=============================================================================
28
cpu_(ooo_6.6-7.5) 2012/09/28 21:37:37 remove this 29 - 60 block.
scottmg 2012/09/28 22:14:28 moved to metro_viewer_messages.cc
29 // Get basic type definitions.
30 #define IPC_MESSAGE_IMPL
31 #include "chrome/common/viewer_messages.h"
32
33 // Generate constructors.
34 #include "ipc/struct_constructor_macros.h"
35 #include "chrome/common/viewer_messages.h"
36
37 // Generate destructors.
38 #include "ipc/struct_destructor_macros.h"
39 #include "chrome/common/viewer_messages.h"
40
41 // Generate param traits write methods.
42 #include "ipc/param_traits_write_macros.h"
43 namespace IPC {
44 #include "chrome/common/viewer_messages.h"
45 } // namespace IPC
46
47 // Generate param traits read methods.
48 #include "ipc/param_traits_read_macros.h"
49 namespace IPC {
50 #include "chrome/common/viewer_messages.h"
51 } // namespace IPC
52
53 // Generate param traits log methods.
54 #include "ipc/param_traits_log_macros.h"
55 namespace IPC {
56 #include "chrome/common/viewer_messages.h"
57 } // namespace IPC
58
59 //=============================================================================
60
21 typedef winfoundtn::ITypedEventHandler< 61 typedef winfoundtn::ITypedEventHandler<
22 winapp::Core::CoreApplicationView*, 62 winapp::Core::CoreApplicationView*,
23 winapp::Activation::IActivatedEventArgs*> ActivatedHandler; 63 winapp::Activation::IActivatedEventArgs*> ActivatedHandler;
24 64
25 typedef winfoundtn::ITypedEventHandler< 65 typedef winfoundtn::ITypedEventHandler<
26 winui::Core::CoreWindow*, 66 winui::Core::CoreWindow*,
27 winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler; 67 winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler;
28 68
29 typedef winfoundtn::ITypedEventHandler< 69 typedef winfoundtn::ITypedEventHandler<
30 winui::Input::EdgeGesture*, 70 winui::Input::EdgeGesture*,
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 303
264 DVLOG(1) << "Hiding current top window:" 304 DVLOG(1) << "Hiding current top window:"
265 << reinterpret_cast<int>(current_top_window.first); 305 << reinterpret_cast<int>(current_top_window.first);
266 AnimateWindow(current_top_window.first, kAnimateWindowTimeoutMs, 306 AnimateWindow(current_top_window.first, kAnimateWindowTimeoutMs,
267 AW_HIDE | AW_HOR_POSITIVE | AW_SLIDE); 307 AW_HIDE | AW_HOR_POSITIVE | AW_SLIDE);
268 308
269 globals.host_windows.push_back(current_top_window); 309 globals.host_windows.push_back(current_top_window);
270 } 310 }
271 } 311 }
272 312
313 class ChromeChannelListener : public IPC::Listener {
314 public:
315 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
316 DVLOG(1) << "Received ipc message " << message.type();
317 return true;
318 }
319
320 virtual void OnChannelError() OVERRIDE {
321 DVLOG(1) << "Channel error";
322 MessageLoop::current()->Quit();
323 }
324
325 void Init(IPC::Sender* s) {
326 sender_ = s;
327 }
328
329 private:
330 IPC::Sender* sender_;
331 };
332
273 } // namespace 333 } // namespace
274 334
275 HRESULT ChromeAppView::TileRequestCreateDone( 335 HRESULT ChromeAppView::TileRequestCreateDone(
276 winfoundtn::IAsyncOperation<bool>* async, 336 winfoundtn::IAsyncOperation<bool>* async,
277 AsyncStatus status) { 337 AsyncStatus status) {
278 if (status == Completed) { 338 if (status == Completed) {
279 unsigned char result; 339 unsigned char result;
280 CheckHR(async->GetResults(&result)); 340 CheckHR(async->GetResults(&result));
281 DVLOG(1) << __FUNCTION__ << " result " << static_cast<int>(result); 341 DVLOG(1) << __FUNCTION__ << " result " << static_cast<int>(result);
282 } else { 342 } else {
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 // chrome. Uncomment this once we figure out why they don't fire. 756 // chrome. Uncomment this once we figure out why they don't fire.
697 // RegisterInputPaneNotifications(); 757 // RegisterInputPaneNotifications();
698 758
699 hr = winrt_utils::CreateActivationFactory( 759 hr = winrt_utils::CreateActivationFactory(
700 RuntimeClass_Windows_UI_ViewManagement_ApplicationView, 760 RuntimeClass_Windows_UI_ViewManagement_ApplicationView,
701 app_view_.GetAddressOf()); 761 app_view_.GetAddressOf());
702 CheckHR(hr); 762 CheckHR(hr);
703 763
704 DVLOG(1) << "Created appview instance."; 764 DVLOG(1) << "Created appview instance.";
705 765
766 direct3d_helper_.Initialize(window);
767
768 DVLOG(1) << "Initialized Direct3D.";
769
706 hr = devices_handler_.Initialize(window); 770 hr = devices_handler_.Initialize(window);
707 // Don't check or return the failure here, we need to let the app 771 // Don't check or return the failure here, we need to let the app
708 // initialization succeed. Even if we won't be able to access devices 772 // initialization succeed. Even if we won't be able to access devices
709 // we still want to allow the app to start. 773 // we still want to allow the app to start.
710 LOG_IF(ERROR, FAILED(hr)) << "Failed to initialize devices handler."; 774 LOG_IF(ERROR, FAILED(hr)) << "Failed to initialize devices handler.";
711 return S_OK; 775 return S_OK;
712 } 776 }
713 777
714 IFACEMETHODIMP 778 IFACEMETHODIMP
715 ChromeAppView::Load(HSTRING entryPoint) { 779 ChromeAppView::Load(HSTRING entryPoint) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 } 829 }
766 } 830 }
767 } 831 }
768 MessageLoop::current()->PostDelayedTask( 832 MessageLoop::current()->PostDelayedTask(
769 FROM_HERE, 833 FROM_HERE,
770 base::Bind(&ChromeAppView::CheckForOSKActivation, 834 base::Bind(&ChromeAppView::CheckForOSKActivation,
771 base::Unretained(this)), 835 base::Unretained(this)),
772 base::TimeDelta::FromMilliseconds(kCheckOSKDelayMs)); 836 base::TimeDelta::FromMilliseconds(kCheckOSKDelayMs));
773 } 837 }
774 838
839 void SendHwnd(base::Thread* thread, HWND hwnd) {
840 ChromeChannelListener channel_listener;
841 IPC::ChannelProxy chan("viewer", IPC::Channel::MODE_NAMED_CLIENT,
cpu_(ooo_6.6-7.5) 2012/09/28 21:37:37 this is the reason the pipe closes, methinks.
scottmg 2012/09/28 22:14:28 Done.
842 &channel_listener, thread->message_loop_proxy());
843 channel_listener.Init(&chan);
844 chan.Send(new ViewerHostMsg_SetTargetSurface(uint32(hwnd)));
845
846 DVLOG(1) << "ICoreWindow sent " << hwnd;
847 }
848
775 IFACEMETHODIMP 849 IFACEMETHODIMP
776 ChromeAppView::Run() { 850 ChromeAppView::Run() {
777 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(window_.Get()); 851 DVLOG(1) << __FUNCTION__ << ", hwnd=" << LONG_PTR(window_.Get());
778 mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher; 852 mswr::ComPtr<winui::Core::ICoreDispatcher> dispatcher;
779 HRESULT hr = window_->get_Dispatcher(&dispatcher); 853 HRESULT hr = window_->get_Dispatcher(&dispatcher);
780 CheckHR(hr, "Dispatcher failed."); 854 CheckHR(hr, "Dispatcher failed.");
781 855
782 hr = window_->Activate(); 856 hr = window_->Activate();
783 if (SUCCEEDED(hr)) { 857 if (SUCCEEDED(hr)) {
784 // TODO(cpu): Draw something here. 858 // TODO(cpu): Draw something here.
785 } else { 859 } else {
786 DVLOG(1) << "Activate failed, hr=" << hr; 860 DVLOG(1) << "Activate failed, hr=" << hr;
787 } 861 }
788 862
863 // The thread needs to out-live the ChannelProxy.
864 base::Thread thread("metro_IO_thread");
865 base::Thread::Options options;
866 options.message_loop_type = MessageLoop::TYPE_IO;
867 thread.StartWithOptions(options);
868
cpu_(ooo_6.6-7.5) 2012/09/28 21:37:37 if we go back to my code with async message I thin
scottmg 2012/09/28 22:14:28 Done.
869 thread.message_loop_proxy()->PostTask(
870 FROM_HERE,
871 base::Bind(&SendHwnd, &thread, globals.core_window));
872
789 // Create a message loop to allow message passing into this thread. 873 // Create a message loop to allow message passing into this thread.
790 MessageLoop msg_loop(MessageLoop::TYPE_UI); 874 MessageLoop msg_loop(MessageLoop::TYPE_UI);
791 875
792 // Announce our message loop to the world. 876 // Announce our message loop to the world.
793 globals.appview_msg_loop = msg_loop.message_loop_proxy(); 877 globals.appview_msg_loop = msg_loop.message_loop_proxy();
794 878
795 // And post the task that'll do the inner Metro message pumping to it. 879 // And post the task that'll do the inner Metro message pumping to it.
796 msg_loop.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get())); 880 msg_loop.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get()));
797 881
798 // Post the recurring task which checks for OSK activation in metro chrome. 882 // Post the recurring task which checks for OSK activation in metro chrome.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 return S_OK; 977 return S_OK;
894 } 978 }
895 979
896 do { 980 do {
897 ::Sleep(10); 981 ::Sleep(10);
898 ::EnumThreadWindows(globals.main_thread_id, &CoreWindowFinder, 0); 982 ::EnumThreadWindows(globals.main_thread_id, &CoreWindowFinder, 0);
899 } while (globals.core_window == NULL); 983 } while (globals.core_window == NULL);
900 984
901 DVLOG(1) << "CoreWindow found: " << std::hex << globals.core_window; 985 DVLOG(1) << "CoreWindow found: " << std::hex << globals.core_window;
902 986
903 if (!globals.host_thread) {
904 DWORD chrome_ui_thread_id = 0;
905 globals.host_thread =
906 ::CreateThread(NULL, 0, HostMainThreadProc, NULL, 0,
907 &chrome_ui_thread_id);
908 987
988 if (GetAsyncKeyState(VK_SHIFT) && GetAsyncKeyState(VK_F11)) {
scottmg 2012/09/28 22:14:28 Made it #if !defined(USE_AURA) instead
989 DVLOG(1) << "Using Shift-F11 debug hook, connecting to browser";
990 } else {
909 if (!globals.host_thread) { 991 if (!globals.host_thread) {
910 NOTREACHED() << "thread creation failed."; 992 DWORD chrome_ui_thread_id = 0;
911 return E_UNEXPECTED; 993 globals.host_thread =
994 ::CreateThread(NULL, 0, HostMainThreadProc, NULL, 0,
995 &chrome_ui_thread_id);
996
997 if (!globals.host_thread) {
998 NOTREACHED() << "thread creation failed.";
999 return E_UNEXPECTED;
1000 }
912 } 1001 }
913 } 1002 }
914 1003
915 if (RegisterHotKey(globals.core_window, kFlipWindowsHotKeyId, 1004 if (RegisterHotKey(globals.core_window, kFlipWindowsHotKeyId,
916 MOD_CONTROL, VK_F12)) { 1005 MOD_CONTROL, VK_F12)) {
917 DVLOG(1) << "Registered flip window hotkey."; 1006 DVLOG(1) << "Registered flip window hotkey.";
918 } else { 1007 } else {
919 VPLOG(1) << "Failed to register flip window hotkey."; 1008 VPLOG(1) << "Failed to register flip window hotkey.";
920 } 1009 }
921 HRESULT hr = settings_handler_.Initialize(); 1010 HRESULT hr = settings_handler_.Initialize();
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 CheckHR(core_app.As(&app_exit)); 1271 CheckHR(core_app.As(&app_exit));
1183 globals.app_exit = app_exit.Detach(); 1272 globals.app_exit = app_exit.Detach();
1184 } 1273 }
1185 1274
1186 IFACEMETHODIMP 1275 IFACEMETHODIMP
1187 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) { 1276 ChromeAppViewFactory::CreateView(winapp::Core::IFrameworkView** view) {
1188 globals.view = mswr::Make<ChromeAppView>().Detach(); 1277 globals.view = mswr::Make<ChromeAppView>().Detach();
1189 *view = globals.view; 1278 *view = globals.view;
1190 return (*view) ? S_OK : E_OUTOFMEMORY; 1279 return (*view) ? S_OK : E_OUTOFMEMORY;
1191 } 1280 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698