| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "mojo/services/native_viewport/native_viewport_service.h" | 5 #include "mojo/services/native_viewport/native_viewport_service.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "mojo/public/cpp/bindings/allocation_scope.h" | 10 #include "mojo/public/cpp/bindings/allocation_scope.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 } | 28 } |
| 29 | 29 |
| 30 class NativeViewportImpl | 30 class NativeViewportImpl |
| 31 : public ServiceConnection<mojo::NativeViewport, | 31 : public ServiceConnection<mojo::NativeViewport, |
| 32 NativeViewportImpl, | 32 NativeViewportImpl, |
| 33 shell::Context>, | 33 shell::Context>, |
| 34 public NativeViewportDelegate { | 34 public NativeViewportDelegate { |
| 35 public: | 35 public: |
| 36 NativeViewportImpl() | 36 NativeViewportImpl() |
| 37 : widget_(gfx::kNullAcceleratedWidget), | 37 : client_(NULL), |
| 38 widget_(gfx::kNullAcceleratedWidget), |
| 38 waiting_for_event_ack_(false) {} | 39 waiting_for_event_ack_(false) {} |
| 39 virtual ~NativeViewportImpl() { | 40 virtual ~NativeViewportImpl() { |
| 40 // Destroy the NativeViewport early on as it may call us back during | 41 // Destroy the NativeViewport early on as it may call us back during |
| 41 // destruction and we want to be in a known state. | 42 // destruction and we want to be in a known state. |
| 42 native_viewport_.reset(); | 43 native_viewport_.reset(); |
| 43 } | 44 } |
| 44 | 45 |
| 46 virtual void SetClient(NativeViewportClient* client) OVERRIDE { |
| 47 client_ = client; |
| 48 } |
| 49 |
| 45 virtual void Create(const Rect& bounds) OVERRIDE { | 50 virtual void Create(const Rect& bounds) OVERRIDE { |
| 46 native_viewport_ = | 51 native_viewport_ = |
| 47 services::NativeViewport::Create(context(), this); | 52 services::NativeViewport::Create(context(), this); |
| 48 native_viewport_->Init(bounds); | 53 native_viewport_->Init(bounds); |
| 49 client()->OnCreated(); | 54 client_->OnCreated(); |
| 50 OnBoundsChanged(bounds); | 55 OnBoundsChanged(bounds); |
| 51 } | 56 } |
| 52 | 57 |
| 53 virtual void Show() OVERRIDE { | 58 virtual void Show() OVERRIDE { |
| 54 native_viewport_->Show(); | 59 native_viewport_->Show(); |
| 55 } | 60 } |
| 56 | 61 |
| 57 virtual void Hide() OVERRIDE { | 62 virtual void Hide() OVERRIDE { |
| 58 native_viewport_->Hide(); | 63 native_viewport_->Hide(); |
| 59 } | 64 } |
| 60 | 65 |
| 61 virtual void Close() OVERRIDE { | 66 virtual void Close() OVERRIDE { |
| 62 command_buffer_.reset(); | 67 command_buffer_.reset(); |
| 63 DCHECK(native_viewport_); | 68 DCHECK(native_viewport_); |
| 64 native_viewport_->Close(); | 69 native_viewport_->Close(); |
| 65 } | 70 } |
| 66 | 71 |
| 67 virtual void SetBounds(const Rect& bounds) OVERRIDE { | 72 virtual void SetBounds(const Rect& bounds) OVERRIDE { |
| 68 gfx::Rect gfx_bounds(bounds.position().x(), bounds.position().y(), | 73 gfx::Rect gfx_bounds(bounds.position().x(), bounds.position().y(), |
| 69 bounds.size().width(), bounds.size().height()); | 74 bounds.size().width(), bounds.size().height()); |
| 70 native_viewport_->SetBounds(gfx_bounds); | 75 native_viewport_->SetBounds(gfx_bounds); |
| 71 } | 76 } |
| 72 | 77 |
| 73 virtual void CreateGLES2Context(ScopedMessagePipeHandle client_handle) | 78 virtual void CreateGLES2Context(ScopedMessagePipeHandle client_handle) |
| 74 OVERRIDE { | 79 OVERRIDE { |
| 75 if (command_buffer_ || command_buffer_handle_.is_valid()) { | 80 if (command_buffer_.get() || command_buffer_handle_.is_valid()) { |
| 76 LOG(ERROR) << "Can't create multiple contexts on a NativeViewport"; | 81 LOG(ERROR) << "Can't create multiple contexts on a NativeViewport"; |
| 77 return; | 82 return; |
| 78 } | 83 } |
| 79 | 84 |
| 80 // TODO(darin): | 85 // TODO(darin): CreateGLES2Context should accept a |CommandBufferPtr*|. |
| 81 // CreateGLES2Context should accept a ScopedCommandBufferClientHandle once | 86 command_buffer_handle_ = client_handle.Pass(); |
| 82 // it is possible to import interface definitions from another module. For | |
| 83 // now, we just kludge it. | |
| 84 command_buffer_handle_.reset( | |
| 85 InterfaceHandle<CommandBufferClient>(client_handle.release().value())); | |
| 86 | 87 |
| 87 CreateCommandBufferIfNeeded(); | 88 CreateCommandBufferIfNeeded(); |
| 88 } | 89 } |
| 89 | 90 |
| 90 void AckEvent() { | 91 void AckEvent() { |
| 91 waiting_for_event_ack_ = false; | 92 waiting_for_event_ack_ = false; |
| 92 } | 93 } |
| 93 | 94 |
| 94 void CreateCommandBufferIfNeeded() { | 95 void CreateCommandBufferIfNeeded() { |
| 95 if (!command_buffer_handle_.is_valid()) | 96 if (!command_buffer_handle_.is_valid()) |
| 96 return; | 97 return; |
| 97 DCHECK(!command_buffer_.get()); | 98 DCHECK(!command_buffer_.get()); |
| 98 if (widget_ == gfx::kNullAcceleratedWidget) | 99 if (widget_ == gfx::kNullAcceleratedWidget) |
| 99 return; | 100 return; |
| 100 gfx::Size size = native_viewport_->GetSize(); | 101 gfx::Size size = native_viewport_->GetSize(); |
| 101 if (size.IsEmpty()) | 102 if (size.IsEmpty()) |
| 102 return; | 103 return; |
| 103 command_buffer_.reset(new CommandBufferImpl( | 104 command_buffer_.reset( |
| 104 command_buffer_handle_.Pass(), widget_, native_viewport_->GetSize())); | 105 BindToPipe(new CommandBufferImpl(widget_, native_viewport_->GetSize()), |
| 106 command_buffer_handle_.Pass())); |
| 105 } | 107 } |
| 106 | 108 |
| 107 virtual bool OnEvent(ui::Event* ui_event) OVERRIDE { | 109 virtual bool OnEvent(ui::Event* ui_event) OVERRIDE { |
| 108 // Must not return early before updating capture. | 110 // Must not return early before updating capture. |
| 109 switch (ui_event->type()) { | 111 switch (ui_event->type()) { |
| 110 case ui::ET_MOUSE_PRESSED: | 112 case ui::ET_MOUSE_PRESSED: |
| 111 case ui::ET_TOUCH_PRESSED: | 113 case ui::ET_TOUCH_PRESSED: |
| 112 native_viewport_->SetCapture(); | 114 native_viewport_->SetCapture(); |
| 113 break; | 115 break; |
| 114 case ui::ET_MOUSE_RELEASED: | 116 case ui::ET_MOUSE_RELEASED: |
| (...skipping 29 matching lines...) Expand all Loading... |
| 144 touch_data.set_pointer_id(touch_event->touch_id()); | 146 touch_data.set_pointer_id(touch_event->touch_id()); |
| 145 event.set_touch_data(touch_data.Finish()); | 147 event.set_touch_data(touch_data.Finish()); |
| 146 } else if (ui_event->IsKeyEvent()) { | 148 } else if (ui_event->IsKeyEvent()) { |
| 147 ui::KeyEvent* key_event = static_cast<ui::KeyEvent*>(ui_event); | 149 ui::KeyEvent* key_event = static_cast<ui::KeyEvent*>(ui_event); |
| 148 KeyData::Builder key_data; | 150 KeyData::Builder key_data; |
| 149 key_data.set_key_code(key_event->key_code()); | 151 key_data.set_key_code(key_event->key_code()); |
| 150 key_data.set_is_char(key_event->is_char()); | 152 key_data.set_is_char(key_event->is_char()); |
| 151 event.set_key_data(key_data.Finish()); | 153 event.set_key_data(key_data.Finish()); |
| 152 } | 154 } |
| 153 | 155 |
| 154 client()->OnEvent(event.Finish(), | 156 client_->OnEvent(event.Finish(), |
| 155 base::Bind(&NativeViewportImpl::AckEvent, | 157 base::Bind(&NativeViewportImpl::AckEvent, |
| 156 base::Unretained(this))); | 158 base::Unretained(this))); |
| 157 waiting_for_event_ack_ = true; | 159 waiting_for_event_ack_ = true; |
| 158 return false; | 160 return false; |
| 159 } | 161 } |
| 160 | 162 |
| 161 virtual void OnAcceleratedWidgetAvailable( | 163 virtual void OnAcceleratedWidgetAvailable( |
| 162 gfx::AcceleratedWidget widget) OVERRIDE { | 164 gfx::AcceleratedWidget widget) OVERRIDE { |
| 163 widget_ = widget; | 165 widget_ = widget; |
| 164 CreateCommandBufferIfNeeded(); | 166 CreateCommandBufferIfNeeded(); |
| 165 } | 167 } |
| 166 | 168 |
| 167 virtual void OnBoundsChanged(const gfx::Rect& bounds) OVERRIDE { | 169 virtual void OnBoundsChanged(const gfx::Rect& bounds) OVERRIDE { |
| 168 CreateCommandBufferIfNeeded(); | 170 CreateCommandBufferIfNeeded(); |
| 169 AllocationScope scope; | 171 AllocationScope scope; |
| 170 client()->OnBoundsChanged(bounds); | 172 client_->OnBoundsChanged(bounds); |
| 171 } | 173 } |
| 172 | 174 |
| 173 virtual void OnDestroyed() OVERRIDE { | 175 virtual void OnDestroyed() OVERRIDE { |
| 174 command_buffer_.reset(); | 176 command_buffer_.reset(); |
| 175 client()->OnDestroyed(); | 177 client_->OnDestroyed(); |
| 176 base::MessageLoop::current()->Quit(); | 178 base::MessageLoop::current()->Quit(); |
| 177 } | 179 } |
| 178 | 180 |
| 179 private: | 181 private: |
| 182 NativeViewportClient* client_; |
| 180 gfx::AcceleratedWidget widget_; | 183 gfx::AcceleratedWidget widget_; |
| 181 scoped_ptr<services::NativeViewport> native_viewport_; | 184 scoped_ptr<services::NativeViewport> native_viewport_; |
| 182 ScopedCommandBufferClientHandle command_buffer_handle_; | 185 ScopedMessagePipeHandle command_buffer_handle_; |
| 183 scoped_ptr<CommandBufferImpl> command_buffer_; | 186 scoped_ptr<CommandBufferImpl> command_buffer_; |
| 184 bool waiting_for_event_ack_; | 187 bool waiting_for_event_ack_; |
| 185 }; | 188 }; |
| 186 | 189 |
| 187 } // namespace services | 190 } // namespace services |
| 188 } // namespace mojo | 191 } // namespace mojo |
| 189 | 192 |
| 190 | 193 |
| 191 MOJO_NATIVE_VIEWPORT_EXPORT mojo::Application* | 194 MOJO_NATIVE_VIEWPORT_EXPORT mojo::Application* |
| 192 CreateNativeViewportService(mojo::shell::Context* context, | 195 CreateNativeViewportService(mojo::shell::Context* context, |
| 193 mojo::ScopedShellHandle shell_handle) { | 196 mojo::ScopedMessagePipeHandle shell_handle) { |
| 194 mojo::Application* app = new mojo::Application(shell_handle.Pass()); | 197 mojo::Application* app = new mojo::Application(shell_handle.Pass()); |
| 195 app->AddServiceConnector( | 198 app->AddServiceConnector( |
| 196 new mojo::ServiceConnector<mojo::services::NativeViewportImpl, | 199 new mojo::ServiceConnector<mojo::services::NativeViewportImpl, |
| 197 mojo::shell::Context>(context)); | 200 mojo::shell::Context>(context)); |
| 198 return app; | 201 return app; |
| 199 } | 202 } |
| 200 | 203 |
| OLD | NEW |