diff options
Diffstat (limited to 'mojo/services/native_viewport/native_viewport_impl.cc')
-rw-r--r-- | mojo/services/native_viewport/native_viewport_impl.cc | 76 |
1 files changed, 62 insertions, 14 deletions
diff --git a/mojo/services/native_viewport/native_viewport_impl.cc b/mojo/services/native_viewport/native_viewport_impl.cc index 5b980c8..6d04ca4 100644 --- a/mojo/services/native_viewport/native_viewport_impl.cc +++ b/mojo/services/native_viewport/native_viewport_impl.cc @@ -5,17 +5,32 @@ #include "mojo/services/native_viewport/native_viewport_impl.h" #include "base/message_loop/message_loop.h" +#include "base/time/time.h" #include "mojo/services/gles2/gles2_impl.h" #include "mojo/services/native_viewport/native_viewport.h" #include "ui/events/event.h" namespace mojo { namespace services { +namespace { + +bool IsRateLimitedEventType(ui::Event* event) { + return event->type() == ui::ET_MOUSE_MOVED || + event->type() == ui::ET_MOUSE_DRAGGED || + event->type() == ui::ET_TOUCH_MOVED; +} + +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeViewportImpl, public: NativeViewportImpl::NativeViewportImpl(shell::Context* context, ScopedMessagePipeHandle pipe) : context_(context), widget_(gfx::kNullAcceleratedWidget), + waiting_for_event_ack_(false), + pending_event_timestamp_(0), client_(pipe.Pass()) { client_.SetPeer(this); } @@ -23,6 +38,9 @@ NativeViewportImpl::NativeViewportImpl(shell::Context* context, NativeViewportImpl::~NativeViewportImpl() { } +//////////////////////////////////////////////////////////////////////////////// +// NativeViewportImpl, NativeViewportStub overrides: + void NativeViewportImpl::Open() { native_viewport_ = services::NativeViewport::Create(context_, this); native_viewport_->Init(); @@ -40,18 +58,47 @@ void NativeViewportImpl::CreateGLES2Context( CreateGLES2ContextIfNeeded(); } -void NativeViewportImpl::CreateGLES2ContextIfNeeded() { - if (widget_ == gfx::kNullAcceleratedWidget || !gles2_) - return; - gles2_->CreateContext(widget_, native_viewport_->GetSize()); +void NativeViewportImpl::AckEvent(const Event& event) { + DCHECK_EQ(event.time_stamp(), pending_event_timestamp_); + waiting_for_event_ack_ = false; +} + +//////////////////////////////////////////////////////////////////////////////// +// NativeViewportImpl, NativeViewportDelegate implementation: + +void NativeViewportImpl::OnResized(const gfx::Size& size) { +} + +void NativeViewportImpl::OnAcceleratedWidgetAvailable( + gfx::AcceleratedWidget widget) { + widget_ = widget; + CreateGLES2ContextIfNeeded(); } bool NativeViewportImpl::OnEvent(ui::Event* ui_event) { + // Must not return early before updating capture. + switch (ui_event->type()) { + case ui::ET_MOUSE_PRESSED: + case ui::ET_TOUCH_PRESSED: + native_viewport_->SetCapture(); + break; + case ui::ET_MOUSE_RELEASED: + case ui::ET_TOUCH_RELEASED: + native_viewport_->ReleaseCapture(); + break; + default: + break; + } + + if (waiting_for_event_ack_ && IsRateLimitedEventType(ui_event)) + return false; + AllocationScope scope; Event::Builder event; event.set_action(ui_event->type()); - event.set_time_stamp(ui_event->time_stamp().ToInternalValue()); + pending_event_timestamp_ = ui_event->time_stamp().ToInternalValue(); + event.set_time_stamp(pending_event_timestamp_); if (ui_event->IsMouseEvent() || ui_event->IsTouchEvent()) { ui::LocatedEvent* located_event = static_cast<ui::LocatedEvent*>(ui_event); @@ -69,18 +116,10 @@ bool NativeViewportImpl::OnEvent(ui::Event* ui_event) { } client_->OnEvent(event.Finish()); + waiting_for_event_ack_ = true; return false; } -void NativeViewportImpl::OnAcceleratedWidgetAvailable( - gfx::AcceleratedWidget widget) { - widget_ = widget; - CreateGLES2ContextIfNeeded(); -} - -void NativeViewportImpl::OnResized(const gfx::Size& size) { -} - void NativeViewportImpl::OnDestroyed() { // TODO(beng): // Destroying |gles2_| on the shell thread here hits thread checker asserts. @@ -94,5 +133,14 @@ void NativeViewportImpl::OnDestroyed() { client_->OnDestroyed(); } +//////////////////////////////////////////////////////////////////////////////// +// NativeViewportImpl, private: + +void NativeViewportImpl::CreateGLES2ContextIfNeeded() { + if (widget_ == gfx::kNullAcceleratedWidget || !gles2_) + return; + gles2_->CreateContext(widget_, native_viewport_->GetSize()); +} + } // namespace services } // namespace mojo |