diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-10 23:24:27 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-10 23:24:27 +0000 |
commit | 3df1e15f05e97223a7acff7373f0b4fb5a39fc76 (patch) | |
tree | 69ac96a449de70f5fa47a1e9ec53930daa9661ec /mojo/services/native_viewport/native_viewport_impl.cc | |
parent | af7b5864f521efbd3c3758dc3d10f0a4a10c0080 (diff) | |
download | chromium_src-3df1e15f05e97223a7acff7373f0b4fb5a39fc76.zip chromium_src-3df1e15f05e97223a7acff7373f0b4fb5a39fc76.tar.gz chromium_src-3df1e15f05e97223a7acff7373f0b4fb5a39fc76.tar.bz2 |
Do something more interesting than printf when an event is received by sample_app.
R=abarth@chromium.org
http://crbug.com/324639
Review URL: https://codereview.chromium.org/108273008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239910 0039d316-1c4b-4281-b951-d872f2087c98
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 |