Index: win8/metro_driver/chrome_app_view.cc |
=================================================================== |
--- win8/metro_driver/chrome_app_view.cc (revision 161376) |
+++ win8/metro_driver/chrome_app_view.cc (working copy) |
@@ -48,6 +48,10 @@ |
winui::ViewManagement::InputPaneVisibilityEventArgs*> |
InputPaneEventHandler; |
+typedef winfoundtn::ITypedEventHandler< |
+ winui::Core::CoreWindow*, |
+ winui::Core::PointerEventArgs*> PointerEventHandler; |
+ |
struct Globals globals; |
// TODO(ananta) |
@@ -666,7 +670,9 @@ |
ChromeAppView::ChromeAppView() |
: osk_visible_notification_received_(false), |
- osk_offset_adjustment_(0) { |
+ osk_offset_adjustment_(0), |
+ ui_channel_(nullptr), |
+ ui_channel_listener_(nullptr) { |
globals.previous_state = |
winapp::Activation::ApplicationExecutionState_NotRunning; |
} |
@@ -702,6 +708,24 @@ |
&sizechange_token_); |
CheckHR(hr); |
+#if defined(USE_AURA) |
+ // Register for pointer notifications. |
+ hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>( |
+ this, &ChromeAppView::OnPointerMoved).Get(), |
+ &pointermoved_token_); |
+ CheckHR(hr); |
+ |
+ hr = window_->add_PointerPressed(mswr::Callback<PointerEventHandler>( |
+ this, &ChromeAppView::OnPointerPressed).Get(), |
+ &pointerpressed_token_); |
+ CheckHR(hr); |
+ |
+ hr = window_->add_PointerReleased(mswr::Callback<PointerEventHandler>( |
+ this, &ChromeAppView::OnPointerReleased).Get(), |
+ &pointerreleased_token_); |
+ CheckHR(hr); |
+#endif |
+ |
// Register for edge gesture notifications. |
mswr::ComPtr<winui::Input::IEdgeGestureStatics> edge_gesture_statics; |
hr = winrt_utils::CreateActivationFactory( |
@@ -847,16 +871,23 @@ |
options.message_loop_type = MessageLoop::TYPE_IO; |
thread.StartWithOptions(options); |
- // The viewer channel opened below only applies when we are launched as an |
- // AURA viewer process. |
+ |
#if defined(USE_AURA) |
- ChromeChannelListener channel_listener; |
- IPC::ChannelProxy chan("viewer", IPC::Channel::MODE_NAMED_CLIENT, |
- &channel_listener, thread.message_loop_proxy()); |
- channel_listener.Init(&chan); |
- chan.Send(new MetroViewerHostMsg_SetTargetSurface( |
- gfx::NativeViewId(globals.core_window))); |
+ // In Aura mode we create an IPC channel to the browser which should |
+ // be already running. |
+ ChromeChannelListener ui_channel_listener; |
+ IPC::ChannelProxy ui_channel("viewer", |
+ IPC::Channel::MODE_NAMED_CLIENT, |
+ &ui_channel_listener, |
+ thread.message_loop_proxy()); |
+ ui_channel_listener.Init(&ui_channel); |
+ ui_channel_listener_ = &ui_channel_listener; |
+ ui_channel_ = &ui_channel; |
+ |
+ ui_channel_->Send(new MetroViewerHostMsg_SetTargetSurface( |
+ gfx::NativeViewId(globals.core_window))); |
+ |
DVLOG(1) << "ICoreWindow sent " << globals.core_window; |
#endif |
// And post the task that'll do the inner Metro message pumping to it. |
@@ -1056,6 +1087,51 @@ |
return S_OK; |
} |
+HRESULT ChromeAppView::OnPointerMoved(winui::Core::ICoreWindow* sender, |
+ winui::Core::IPointerEventArgs* args) { |
+ metro_driver::PointerEventHandler pointer; |
+ HRESULT hr = pointer.Init(args); |
+ if (FAILED(hr)) |
+ return hr; |
+ if (!pointer.is_mouse()) |
+ return S_OK; |
+ |
+ ui_channel_->Send(new MetroViewerHostMsg_MouseMoved(pointer.x(), |
+ pointer.y(), |
+ 0)); |
+ return S_OK; |
+} |
+ |
+HRESULT ChromeAppView::OnPointerPressed(winui::Core::ICoreWindow* sender, |
+ winui::Core::IPointerEventArgs* args) { |
+ metro_driver::PointerEventHandler pointer; |
+ HRESULT hr = pointer.Init(args); |
+ if (FAILED(hr)) |
+ return hr; |
+ if (!pointer.is_mouse()) |
+ return S_OK; |
+ |
+ ui_channel_->Send(new MetroViewerHostMsg_MouseButton(pointer.x(), |
+ pointer.y(), |
+ 1)); |
+ return S_OK; |
+} |
+ |
+HRESULT ChromeAppView::OnPointerReleased(winui::Core::ICoreWindow* sender, |
+ winui::Core::IPointerEventArgs* args) { |
+ metro_driver::PointerEventHandler pointer; |
+ HRESULT hr = pointer.Init(args); |
+ if (FAILED(hr)) |
+ return hr; |
+ if (!pointer.is_mouse()) |
+ return S_OK; |
+ |
+ ui_channel_->Send(new MetroViewerHostMsg_MouseButton(pointer.x(), |
+ pointer.y(), |
+ 0)); |
+ return S_OK; |
+} |
+ |
HRESULT ChromeAppView::OnPositionChanged(int x, int y) { |
DVLOG(1) << __FUNCTION__; |