Index: mojo/examples/sample_app/sample_app.cc |
diff --git a/mojo/examples/sample_app/sample_app.cc b/mojo/examples/sample_app/sample_app.cc |
index 02d4ce20c3e5b2c687ed5cafe8f16dc69ec9b7b1..094ff88b9898cc531d0f363b5f447288607780b2 100644 |
--- a/mojo/examples/sample_app/sample_app.cc |
+++ b/mojo/examples/sample_app/sample_app.cc |
@@ -7,11 +7,14 @@ |
#include "base/message_loop/message_loop.h" |
#include "mojo/common/bindings_support_impl.h" |
-#include "mojo/examples/sample_app/native_viewport_client_impl.h" |
+#include "mojo/examples/sample_app/gles2_client_impl.h" |
#include "mojo/public/bindings/lib/bindings_support.h" |
+#include "mojo/public/bindings/lib/remote_ptr.h" |
#include "mojo/public/gles2/gles2.h" |
#include "mojo/public/system/core.h" |
#include "mojo/public/system/macros.h" |
+#include "mojom/native_viewport.h" |
+#include "mojom/shell.h" |
#if defined(WIN32) |
#if !defined(CDECL) |
@@ -26,25 +29,75 @@ |
namespace mojo { |
namespace examples { |
-void Start(ScopedMessagePipeHandle pipe) { |
- printf("Starting sample app.\n"); |
- NativeViewportClientImpl client(pipe.Pass()); |
- client.Open(); |
- base::MessageLoop::current()->Run(); |
-} |
+class SampleApp : public ShellClientStub { |
+ public: |
+ explicit SampleApp(ScopedMessagePipeHandle shell_handle) |
+ : shell_(shell_handle.Pass()) { |
+ shell_.SetPeer(this); |
+ mojo::ScopedMessagePipeHandle client_handle, native_viewport_handle; |
+ CreateMessagePipe(&client_handle, &native_viewport_handle); |
+ native_viewport_client_.reset( |
+ new NativeViewportClientImpl(native_viewport_handle.Pass())); |
+ mojo::AllocationScope scope; |
+ shell_->Connect("mojo:mojo_native_viewport_service", client_handle.Pass()); |
+ } |
+ |
+ virtual void AcceptConnection(ScopedMessagePipeHandle handle) MOJO_OVERRIDE { |
+ NOTREACHED() << "SampleApp can't be connected to."; |
+ } |
+ |
+ private: |
+ class NativeViewportClientImpl : public mojo::NativeViewportClientStub { |
+ public: |
+ explicit NativeViewportClientImpl(ScopedMessagePipeHandle viewport_handle) |
+ : viewport_(viewport_handle.Pass()) { |
+ viewport_.SetPeer(this); |
+ viewport_->Open(); |
+ ScopedMessagePipeHandle gles2_handle; |
+ ScopedMessagePipeHandle gles2_client_handle; |
+ CreateMessagePipe(&gles2_handle, &gles2_client_handle); |
+ |
+ gles2_client_.reset(new GLES2ClientImpl(gles2_handle.Pass())); |
+ viewport_->CreateGLES2Context(gles2_client_handle.Pass()); |
+ } |
+ |
+ virtual ~NativeViewportClientImpl() {} |
+ |
+ virtual void OnCreated() MOJO_OVERRIDE { |
+ } |
+ |
+ virtual void OnDestroyed() MOJO_OVERRIDE { |
+ base::MessageLoop::current()->Quit(); |
+ } |
+ |
+ virtual void OnEvent(const Event& event) MOJO_OVERRIDE { |
+ if (!event.location().is_null()) { |
+ gles2_client_->HandleInputEvent(event); |
+ viewport_->AckEvent(event); |
+ } |
+ } |
+ |
+ private: |
+ scoped_ptr<GLES2ClientImpl> gles2_client_; |
+ RemotePtr<NativeViewport> viewport_; |
+ }; |
+ mojo::RemotePtr<Shell> shell_; |
+ scoped_ptr<NativeViewportClientImpl> native_viewport_client_; |
+}; |
} // namespace examples |
} // namespace mojo |
-extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain(MojoHandle pipe) { |
+extern "C" SAMPLE_APP_EXPORT MojoResult CDECL MojoMain( |
+ MojoHandle shell_handle) { |
base::MessageLoop loop; |
- mojo::common::BindingsSupportImpl bindings_support; |
- mojo::BindingsSupport::Set(&bindings_support); |
+ mojo::common::BindingsSupportImpl bindings_support_impl; |
+ mojo::BindingsSupport::Set(&bindings_support_impl); |
MojoGLES2Initialize(); |
- mojo::ScopedMessagePipeHandle scoped_handle; |
- scoped_handle.reset(mojo::MessagePipeHandle(pipe)); |
- mojo::examples::Start(scoped_handle.Pass()); |
+ mojo::examples::SampleApp app( |
+ mojo::MakeScopedHandle(mojo::MessagePipeHandle(shell_handle)).Pass()); |
+ loop.Run(); |
MojoGLES2Terminate(); |
mojo::BindingsSupport::Set(NULL); |