diff --git a/examples/pxScene2d/external/westeros-stub/westeros-compositor.h b/examples/pxScene2d/external/westeros-stub/westeros-compositor.h index a9dff7f31a..1488087cbc 100644 --- a/examples/pxScene2d/external/westeros-stub/westeros-compositor.h +++ b/examples/pxScene2d/external/westeros-stub/westeros-compositor.h @@ -44,6 +44,10 @@ typedef enum _WstClient_status WstClient_stoppedAbnormal, WstClient_connected, WstClient_disconnected +#ifdef WESTEROS_FIRST_FRAME_SUPPORTED + , WstClient_firstFrame +#endif //WESTEROS_FIRST_FRAME_SUPPORTED + } WstClient_status; typedef enum _WstHints diff --git a/examples/pxScene2d/src/pxWayland.cpp b/examples/pxScene2d/src/pxWayland.cpp index 18c8edb4b3..ff9fc4377d 100644 --- a/examples/pxScene2d/src/pxWayland.cpp +++ b/examples/pxScene2d/src/pxWayland.cpp @@ -535,6 +535,11 @@ void pxWayland::handleClientStatus( int status, int pid, int detail ) case WstClient_disconnected: mEvents->clientDisconnected( pid ); break; +#ifdef WESTEROS_FIRST_FRAME_SUPPORTED + case WstClient_firstFrame: + mEvents->firstFrameRendered( pid ); + break; +#endif //WESTEROS_FIRST_FRAME_SUPPORTED default: rtLogError("unexpected wayland client status type"); break; diff --git a/examples/pxScene2d/src/pxWayland.h b/examples/pxScene2d/src/pxWayland.h index 03663db250..d5caca371f 100644 --- a/examples/pxScene2d/src/pxWayland.h +++ b/examples/pxScene2d/src/pxWayland.h @@ -50,6 +50,7 @@ class pxWaylandEvents { virtual void isReady( bool /*ready*/ ) {} virtual void isRemoteReady( bool /*ready*/ ) {} virtual void remoteDisconnected(void * /*data*/ ) {} + virtual void firstFrameRendered( int /*pid*/ ) {} }; class pxWayland: public pxIView { diff --git a/examples/pxScene2d/src/pxWaylandContainer.cpp b/examples/pxScene2d/src/pxWaylandContainer.cpp index 144cddb751..95d7ab1b65 100644 --- a/examples/pxScene2d/src/pxWaylandContainer.cpp +++ b/examples/pxScene2d/src/pxWaylandContainer.cpp @@ -56,6 +56,7 @@ pxWaylandContainer::pxWaylandContainer(pxScene2d* scene) addListener("onClientStopped", get("onClientStopped")); addListener("onClientConnected", get("onClientConnected")); addListener("onClientDisconnected", get("onClientDisconnected")); + addListener("onFirstFrameRendered", get("onFirstFrameRendered")); mRemoteReady = new rtPromise(); } @@ -119,6 +120,17 @@ void pxWaylandContainer::clientDisconnected( int pid ) mEmit.send("onClientDisconnected", e); } +void pxWaylandContainer::firstFrameRendered( int pid ) +{ + mClientPID= pid; + + rtObjectRef e = new rtMapObject; + e.set("name", "onFirstFrameRendered"); + e.set("target", this); + e.set("pid", pid ); + mEmit.send("onFirstFrameRendered", e); +} + void pxWaylandContainer::clientStoppedNormal( int pid, int exitCode ) { mClientPID= -1; diff --git a/examples/pxScene2d/src/pxWaylandContainer.h b/examples/pxScene2d/src/pxWaylandContainer.h index 2ce61565fa..da441ae268 100644 --- a/examples/pxScene2d/src/pxWaylandContainer.h +++ b/examples/pxScene2d/src/pxWaylandContainer.h @@ -56,6 +56,7 @@ class pxWaylandContainer: public pxViewContainer, pxWaylandEvents { virtual void isRemoteReady(bool ready); virtual void remoteDisconnected(void * data); virtual void sendPromise(); + virtual void firstFrameRendered( int pid ); rtError displayName(rtString& s) const; rtError setDisplayName(const char* s); diff --git a/examples/pxScene2d/src/rcvrcore/optimus.js b/examples/pxScene2d/src/rcvrcore/optimus.js index c27eb97c1a..7a0f6f26a6 100644 --- a/examples/pxScene2d/src/rcvrcore/optimus.js +++ b/examples/pxScene2d/src/rcvrcore/optimus.js @@ -658,6 +658,10 @@ function Application(props) { _externalApp.on("onClientConnected", function () { _this.log("onClientConnected"); }); // is never called _externalApp.on("onClientDisconnected", function () { _this.log("onClientDisconnected"); }); // is never called _externalApp.on("onClientStopped", function () { _this.log( "onClientStopped"); }); // is never called + _externalApp.on("onFirstFrameRendered", function () { + _this.log( "onFirstFrameRendered"); + _this.applicationFirstFrameRendered(); + }); // is never called _externalApp.ready.then(function() { _this.log("successfully created Spark app: " + _this.id); _readyBaseResolve(); @@ -695,6 +699,10 @@ function Application(props) { _externalApp.on("onClientStarted", function () { _this.log("onClientStarted"); }); _externalApp.on("onClientConnected", function () { _this.log("onClientConnected"); }); _externalApp.on("onClientDisconnected", function () { _this.log("onClientDisconnected"); }); // called on client crash + _externalApp.on("onFirstFrameRendered", function () { + _this.log( "onFirstFrameRendered"); + _this.applicationFirstFrameRendered(); + }); _externalApp.on("onClientStopped", function () { // called on client crash _this.log("onClientStopped"); setTimeout(function () { @@ -739,6 +747,10 @@ function Application(props) { _externalApp.on("onClientConnected", function () { _this.log("onClientConnected"); }); _externalApp.on("onClientDisconnected", function () { _this.log("onClientDisconnected"); }); _externalApp.on("onClientStopped", function () { _this.log("onClientStopped"); }); + _externalApp.on("onFirstFrameRendered", function () { + _this.log( "onFirstFrameRendered"); + _this.applicationFirstFrameRendered(); + }); _externalApp.remoteReady.then(function(obj) { if(obj) { _this.log("about to create browser window"); @@ -803,6 +815,10 @@ function Application(props) { _externalApp.on("onClientStarted", function () { _this.log("onClientStarted"); }); _externalApp.on("onClientConnected", function () { _this.log("onClientConnected"); }); _externalApp.on("onClientDisconnected", function () { _this.log("onClientDisconnected"); }); // called on client crash + _externalApp.on("onFirstFrameRendered", function () { + _this.log( "onFirstFrameRendered"); + _this.applicationFirstFrameRendered(); + }); _externalApp.on("onClientStopped", function () { // called on client crash _this.log("onClientStopped"); setTimeout(function () { @@ -905,6 +921,10 @@ Application.prototype.applicationDestroyed = function(){ this.log("applicationDestroyed"); appManager.onDestroy(this); }; +Application.prototype.applicationFirstFrameRendered = function(){ + this.log("applicationFirstFrameRendered"); + appManager.onFirstFrameRendered(this); +}; function Optimus() { @@ -1011,6 +1031,10 @@ function Optimus() { this.onReady = function(app){ notifyListeners("ready",app); }; + this.onFirstFrameRendered = function(app){ + notifyListeners("firstFrameRendered",app); + }; + this.setScene = function(s){ scene = s; // remove reference to scene by passing null