diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c63d0cf14..aba701ca8 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -137,15 +137,8 @@ void SurfaceFlinger::binderDied(const wp& who) { // the window manager died on us. prepare its eulogy. - // reset screen orientation - Vector state; - Vector displays; - DisplayState d; - d.what = DisplayState::eOrientationChanged; - d.token = mDefaultDisplays[DisplayDevice::DISPLAY_ID_MAIN]; - d.orientation = DisplayState::eOrientationDefault; - displays.add(d); - setTransactionState(state, displays, 0); + // restore initial conditions (default device unblank, etc) + initializeDisplays(); // restart the boot-animation startBootAnim(); @@ -431,6 +424,9 @@ status_t SurfaceFlinger::readyToRun() // We're now ready to accept clients... mReadyToRunBarrier.open(); + // set initial conditions (e.g. unblank default device) + initializeDisplays(); + // start boot animation startBootAnim(); @@ -1701,6 +1697,36 @@ status_t SurfaceFlinger::onLayerDestroyed(const wp& layer) // --------------------------------------------------------------------------- +void SurfaceFlinger::onInitializeDisplays() { + // reset screen orientation + Vector state; + Vector displays; + DisplayState d; + d.what = DisplayState::eOrientationChanged; + d.token = mDefaultDisplays[DisplayDevice::DISPLAY_ID_MAIN]; + d.orientation = DisplayState::eOrientationDefault; + displays.add(d); + setTransactionState(state, displays, 0); + + // XXX: this should init default device to "unblank" and all other devices to "blank" + onScreenAcquired(); +} + +void SurfaceFlinger::initializeDisplays() { + class MessageScreenInitialized : public MessageBase { + SurfaceFlinger* flinger; + public: + MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { } + virtual bool handler() { + flinger->onInitializeDisplays(); + return true; + } + }; + sp msg = new MessageScreenInitialized(this); + postMessageAsync(msg); // we may be called from main thread, use async message +} + + void SurfaceFlinger::onScreenAcquired() { ALOGD("Screen about to return, flinger = %p", this); sp hw(getDefaultDisplayDevice()); // XXX: this should be per DisplayDevice diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 1f799068d..b1fe7383c 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -231,9 +231,11 @@ private: void signalLayerUpdate(); void signalRefresh(); - // called on the main thread in response to screenReleased() + // called on the main thread in response to initializeDisplays() + void onInitializeDisplays(); + // called on the main thread in response to blank() void onScreenReleased(); - // called on the main thread in response to screenAcquired() + // called on the main thread in response to unblank() void onScreenAcquired(); void handleMessageTransaction(); @@ -321,6 +323,9 @@ private: /* ------------------------------------------------------------------------ * Display and layer stack management */ + // called when starting, or restarting after system_server death + void initializeDisplays(); + sp getDisplayDevice(DisplayID dpy) const { return mDisplays.valueFor(dpy); }