Browse Source

Moved the data lost flag to GPUObject.
Do not poll for window minimization, instead process as an immediate event.

Lasse Öörni 13 years ago
parent
commit
fcbd3b493d

+ 2 - 2
Engine/Engine/APITemplates.h

@@ -688,7 +688,7 @@ template <class T> void RegisterTexture(asIScriptEngine* engine, const char* cla
     RegisterResource<T>(engine, className);
     RegisterResource<T>(engine, className);
     RegisterSubclass<Texture, T>(engine, "Texture", className);
     RegisterSubclass<Texture, T>(engine, "Texture", className);
     engine->RegisterObjectMethod(className, "void SetNumLevels(uint)", asMETHOD(T, SetNumLevels), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void SetNumLevels(uint)", asMETHOD(T, SetNumLevels), asCALL_THISCALL);
-    engine->RegisterObjectMethod(className, "void ClearDataLost()", asMETHOD(T, ClearDataLost), asCALL_THISCALL);
+    engine->RegisterObjectMethod(className, "void ClearDataLost()", asMETHODPR(T, ClearDataLost, (), void), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "TextureUsage get_usage() const", asMETHOD(T, GetUsage), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "TextureUsage get_usage() const", asMETHOD(T, GetUsage), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "uint get_format() const", asMETHOD(T, GetFormat), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "uint get_format() const", asMETHOD(T, GetFormat), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "bool get_compressed() const", asMETHOD(T, IsCompressed), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "bool get_compressed() const", asMETHOD(T, IsCompressed), asCALL_THISCALL);
@@ -705,7 +705,7 @@ template <class T> void RegisterTexture(asIScriptEngine* engine, const char* cla
     engine->RegisterObjectMethod(className, "const Color& get_borderColor() const", asMETHOD(T, GetBorderColor), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "const Color& get_borderColor() const", asMETHOD(T, GetBorderColor), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void set_backupTexture(Texture@+)", asMETHOD(T, SetBackupTexture), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "void set_backupTexture(Texture@+)", asMETHOD(T, SetBackupTexture), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "Texture@+ get_backupTexture() const", asMETHOD(T, GetBackupTexture), asCALL_THISCALL);
     engine->RegisterObjectMethod(className, "Texture@+ get_backupTexture() const", asMETHOD(T, GetBackupTexture), asCALL_THISCALL);
-    engine->RegisterObjectMethod(className, "bool get_dataLost() const", asMETHOD(T, IsDataLost), asCALL_THISCALL);
+    engine->RegisterObjectMethod(className, "bool get_dataLost() const", asMETHODPR(T, IsDataLost, () const, bool), asCALL_THISCALL);
 }
 }
 
 
 static CScriptArray* UIElementGetChildren(bool recursive, UIElement* ptr)
 static CScriptArray* UIElementGetChildren(bool recursive, UIElement* ptr)

+ 7 - 1
Engine/Graphics/Direct3D9/D3D9GPUObject.cpp

@@ -30,7 +30,8 @@
 
 
 GPUObject::GPUObject(Graphics* graphics) :
 GPUObject::GPUObject(Graphics* graphics) :
     graphics_(graphics),
     graphics_(graphics),
-    object_(0)
+    object_(0),
+    dataLost_(false)
 {
 {
     if (graphics_)
     if (graphics_)
         graphics->AddGPUObject(this);
         graphics->AddGPUObject(this);
@@ -41,3 +42,8 @@ GPUObject::~GPUObject()
     if (graphics_)
     if (graphics_)
         graphics_->RemoveGPUObject(this);
         graphics_->RemoveGPUObject(this);
 }
 }
+
+void GPUObject::ClearDataLost()
+{
+    dataLost_ = false;
+}

+ 7 - 0
Engine/Graphics/Direct3D9/D3D9GPUObject.h

@@ -43,14 +43,21 @@ public:
     /// Unconditionally release the GPU resource.
     /// Unconditionally release the GPU resource.
     virtual void Release() {}
     virtual void Release() {}
     
     
+    /// Clear the data lost flag.
+    void ClearDataLost();
+    
     /// Return the graphics subsystem.
     /// Return the graphics subsystem.
     Graphics* GetGraphics() const { return graphics_; }
     Graphics* GetGraphics() const { return graphics_; }
     /// Return Direct3D object.
     /// Return Direct3D object.
     void* GetGPUObject() const { return object_; }
     void* GetGPUObject() const { return object_; }
+    /// Return whether data is lost due to device loss.
+    bool IsDataLost() const { return dataLost_; }
     
     
 protected:
 protected:
     /// Graphics subsystem.
     /// Graphics subsystem.
     WeakPtr<Graphics> graphics_;
     WeakPtr<Graphics> graphics_;
     /// Direct3D object.
     /// Direct3D object.
     void* object_;
     void* object_;
+    /// Data lost flag.
+    bool dataLost_;
 };
 };

+ 1 - 7
Engine/Graphics/Direct3D9/D3D9IndexBuffer.cpp

@@ -43,8 +43,7 @@ IndexBuffer::IndexBuffer(Context* context) :
     lockStart_(0),
     lockStart_(0),
     lockCount_(0),
     lockCount_(0),
     lockScratchData_(0),
     lockScratchData_(0),
-    shadowed_(false),
-    dataLost_(false)
+    shadowed_(false)
 {
 {
     // Force shadowing mode if graphics subsystem does not exist
     // Force shadowing mode if graphics subsystem does not exist
     if (!graphics_)
     if (!graphics_)
@@ -275,11 +274,6 @@ void IndexBuffer::Unlock()
     }
     }
 }
 }
 
 
-void IndexBuffer::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 bool IndexBuffer::IsDynamic() const
 bool IndexBuffer::IsDynamic() const
 {
 {
     return pool_ == D3DPOOL_DEFAULT;
     return pool_ == D3DPOOL_DEFAULT;

+ 0 - 6
Engine/Graphics/Direct3D9/D3D9IndexBuffer.h

@@ -58,15 +58,11 @@ public:
     void* Lock(unsigned start, unsigned count, bool discard = false);
     void* Lock(unsigned start, unsigned count, bool discard = false);
     /// Unlock the buffer and apply changes to the GPU buffer.
     /// Unlock the buffer and apply changes to the GPU buffer.
     void Unlock();
     void Unlock();
-    /// Clear data lost flag.
-    void ClearDataLost();
     
     
     /// Return whether CPU memory shadowing is enabled.
     /// Return whether CPU memory shadowing is enabled.
     bool IsShadowed() const { return shadowed_; }
     bool IsShadowed() const { return shadowed_; }
     /// Return whether is dynamic.
     /// Return whether is dynamic.
     bool IsDynamic() const;
     bool IsDynamic() const;
-    /// Return whether default pool data is lost.
-    bool IsDataLost() const { return dataLost_; }
     /// Return whether is currently locked.
     /// Return whether is currently locked.
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     /// Return number of indices.
     /// Return number of indices.
@@ -108,6 +104,4 @@ private:
     void* lockScratchData_;
     void* lockScratchData_;
     /// Shadowed flag.
     /// Shadowed flag.
     bool shadowed_;
     bool shadowed_;
-    /// Default pool data lost flag.
-    bool dataLost_;
 };
 };

+ 0 - 6
Engine/Graphics/Direct3D9/D3D9Texture.cpp

@@ -63,7 +63,6 @@ Texture::Texture(Context* context) :
     requestedLevels_(0),
     requestedLevels_(0),
     width_(0),
     width_(0),
     height_(0),
     height_(0),
-    dataLost_(false),
     filterMode_(FILTER_DEFAULT)
     filterMode_(FILTER_DEFAULT)
 {
 {
     for (int i = 0; i < MAX_COORDS; ++i)
     for (int i = 0; i < MAX_COORDS; ++i)
@@ -104,11 +103,6 @@ void Texture::SetBackupTexture(Texture* texture)
     backupTexture_ = texture;
     backupTexture_ = texture;
 }
 }
 
 
-void Texture::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 bool Texture::IsCompressed() const
 bool Texture::IsCompressed() const
 {
 {
     return format_ == D3DFMT_DXT1 || format_ == D3DFMT_DXT3 || format_ == D3DFMT_DXT5;
     return format_ == D3DFMT_DXT1 || format_ == D3DFMT_DXT3 || format_ == D3DFMT_DXT5;

+ 0 - 6
Engine/Graphics/Direct3D9/D3D9Texture.h

@@ -53,8 +53,6 @@ public:
     void SetBorderColor(const Color& color);
     void SetBorderColor(const Color& color);
     /// %Set backup texture to use when rendering to this texture.
     /// %Set backup texture to use when rendering to this texture.
     void SetBackupTexture(Texture* texture);
     void SetBackupTexture(Texture* texture);
-    /// Clear default pool data lost flag.
-    void ClearDataLost();
     
     
     /// Return texture format.
     /// Return texture format.
     unsigned GetFormat() const { return format_; }
     unsigned GetFormat() const { return format_; }
@@ -66,8 +64,6 @@ public:
     int GetWidth() const { return width_; }
     int GetWidth() const { return width_; }
     /// Return height.
     /// Return height.
     int GetHeight() const { return height_; }
     int GetHeight() const { return height_; }
-    /// Return whether default pool data is lost.
-    bool IsDataLost() const { return dataLost_; }
     /// Return filtering mode.
     /// Return filtering mode.
     TextureFilterMode GetFilterMode() const { return filterMode_; }
     TextureFilterMode GetFilterMode() const { return filterMode_; }
     /// Return addressing mode by texture coordinate.
     /// Return addressing mode by texture coordinate.
@@ -112,8 +108,6 @@ protected:
     int width_;
     int width_;
     /// Texture height.
     /// Texture height.
     int height_;
     int height_;
-    /// Default pool data lost flag.
-    bool dataLost_;
     /// Filtering mode.
     /// Filtering mode.
     TextureFilterMode filterMode_;
     TextureFilterMode filterMode_;
     /// Addressing mode.
     /// Addressing mode.

+ 1 - 7
Engine/Graphics/Direct3D9/D3D9VertexBuffer.cpp

@@ -76,8 +76,7 @@ VertexBuffer::VertexBuffer(Context* context) :
     lockStart_(0),
     lockStart_(0),
     lockCount_(0),
     lockCount_(0),
     lockScratchData_(0),
     lockScratchData_(0),
-    shadowed_(false),
-    dataLost_(false)
+    shadowed_(false)
 {
 {
     UpdateOffsets();
     UpdateOffsets();
     
     
@@ -315,11 +314,6 @@ void VertexBuffer::Unlock()
     }
     }
 }
 }
 
 
-void VertexBuffer::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 bool VertexBuffer::IsDynamic() const
 bool VertexBuffer::IsDynamic() const
 {
 {
     return pool_ == D3DPOOL_DEFAULT;
     return pool_ == D3DPOOL_DEFAULT;

+ 0 - 6
Engine/Graphics/Direct3D9/D3D9VertexBuffer.h

@@ -57,15 +57,11 @@ public:
     void* Lock(unsigned start, unsigned count, bool discard = false);
     void* Lock(unsigned start, unsigned count, bool discard = false);
     /// Unlock the buffer and apply changes to the GPU buffer.
     /// Unlock the buffer and apply changes to the GPU buffer.
     void Unlock();
     void Unlock();
-    /// Clear data lost flag.
-    void ClearDataLost();
     
     
     /// Return whether CPU memory shadowing is enabled.
     /// Return whether CPU memory shadowing is enabled.
     bool IsShadowed() const { return shadowed_; }
     bool IsShadowed() const { return shadowed_; }
     /// Return whether is dynamic.
     /// Return whether is dynamic.
     bool IsDynamic() const;
     bool IsDynamic() const;
-    /// Return whether default pool data is lost.
-    bool IsDataLost() const { return dataLost_; }
     /// Return whether is currently locked.
     /// Return whether is currently locked.
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     /// Return number of vertices.
     /// Return number of vertices.
@@ -125,6 +121,4 @@ private:
     void* lockScratchData_;
     void* lockScratchData_;
     /// Shadowed flag.
     /// Shadowed flag.
     bool shadowed_;
     bool shadowed_;
-    /// Default pool data lost flag.
-    bool dataLost_;
 };
 };

+ 7 - 1
Engine/Graphics/OpenGL/OGLGPUObject.cpp

@@ -29,7 +29,8 @@
 
 
 GPUObject::GPUObject(Graphics* graphics) :
 GPUObject::GPUObject(Graphics* graphics) :
     graphics_(graphics),
     graphics_(graphics),
-    object_(0)
+    object_(0),
+    dataLost_(false)
 {
 {
     if (graphics_)
     if (graphics_)
         graphics->AddGPUObject(this);
         graphics->AddGPUObject(this);
@@ -45,3 +46,8 @@ void GPUObject::OnDeviceLost()
 {
 {
     object_ = 0;
     object_ = 0;
 }
 }
+
+void GPUObject::ClearDataLost()
+{
+    dataLost_ = false;
+}

+ 7 - 0
Engine/Graphics/OpenGL/OGLGPUObject.h

@@ -43,14 +43,21 @@ public:
     /// Unconditionally release the GPU resource.
     /// Unconditionally release the GPU resource.
     virtual void Release() {}
     virtual void Release() {}
     
     
+    /// Clear the data lost flag.
+    void ClearDataLost();
+    
     /// Return the graphics subsystem.
     /// Return the graphics subsystem.
     Graphics* GetGraphics() const { return graphics_; }
     Graphics* GetGraphics() const { return graphics_; }
     /// Return the object's OpenGL handle.
     /// Return the object's OpenGL handle.
     unsigned GetGPUObject() const { return object_; }
     unsigned GetGPUObject() const { return object_; }
+    /// Return whether data is lost due to context loss.
+    bool IsDataLost() const { return dataLost_; }
     
     
 protected:
 protected:
     /// Graphics subsystem.
     /// Graphics subsystem.
     WeakPtr<Graphics> graphics_;
     WeakPtr<Graphics> graphics_;
     /// Object handle.
     /// Object handle.
     unsigned object_;
     unsigned object_;
+    /// Data lost flag.
+    bool dataLost_;
 };
 };

+ 6 - 0
Engine/Graphics/OpenGL/OGLGraphics.cpp

@@ -1544,6 +1544,12 @@ bool Graphics::IsInitialized() const
 
 
 bool Graphics::IsDeviceLost() const
 bool Graphics::IsDeviceLost() const
 {
 {
+    // On iOS treat window minimization as device loss, as it is forbidden to access OpenGL when minimized
+    #ifdef IOS
+    if (impl_->window_ && (SDL_GetWindowFlags(impl_->window_) & SDL_WINDOW_MINIMIZED) != 0)
+        return true;
+    #endif
+    
     return impl_->context_ == 0;
     return impl_->context_ == 0;
 }
 }
 
 

+ 1 - 7
Engine/Graphics/OpenGL/OGLIndexBuffer.cpp

@@ -44,8 +44,7 @@ IndexBuffer::IndexBuffer(Context* context) :
     lockCount_(0),
     lockCount_(0),
     lockScratchData_(0),
     lockScratchData_(0),
     shadowed_(false),
     shadowed_(false),
-    dynamic_(false),
-    dataLost_(false)
+    dynamic_(false)
 {
 {
     // Force shadowing mode if graphics subsystem does not exist
     // Force shadowing mode if graphics subsystem does not exist
     if (!graphics_)
     if (!graphics_)
@@ -251,11 +250,6 @@ void IndexBuffer::Unlock()
     }
     }
 }
 }
 
 
-void IndexBuffer::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 bool IndexBuffer::GetUsedVertexRange(unsigned start, unsigned count, unsigned& minVertex, unsigned& vertexCount)
 bool IndexBuffer::GetUsedVertexRange(unsigned start, unsigned count, unsigned& minVertex, unsigned& vertexCount)
 {
 {
     if (!shadowData_)
     if (!shadowData_)

+ 0 - 6
Engine/Graphics/OpenGL/OGLIndexBuffer.h

@@ -58,15 +58,11 @@ public:
     void* Lock(unsigned start, unsigned count, bool discard = false);
     void* Lock(unsigned start, unsigned count, bool discard = false);
     /// Unlock the buffer and apply changes to the GPU buffer.
     /// Unlock the buffer and apply changes to the GPU buffer.
     void Unlock();
     void Unlock();
-    /// Clear data lost flag.
-    void ClearDataLost();
     
     
     /// Return whether CPU memory shadowing is enabled.
     /// Return whether CPU memory shadowing is enabled.
     bool IsShadowed() const { return shadowed_; }
     bool IsShadowed() const { return shadowed_; }
     /// Return whether is dynamic.
     /// Return whether is dynamic.
     bool IsDynamic() const { return dynamic_; }
     bool IsDynamic() const { return dynamic_; }
-    /// Return whether data is lost due to context loss.
-    bool IsDataLost() const { return dataLost_; }
     /// Return whether is currently locked.
     /// Return whether is currently locked.
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     /// Return number of indices.
     /// Return number of indices.
@@ -102,6 +98,4 @@ private:
     bool shadowed_;
     bool shadowed_;
     /// Dynamic flag.
     /// Dynamic flag.
     bool dynamic_;
     bool dynamic_;
-    /// Data lost flag.
-    bool dataLost_;
 };
 };

+ 0 - 6
Engine/Graphics/OpenGL/OGLTexture.cpp

@@ -76,7 +76,6 @@ Texture::Texture(Context* context) :
     dynamic_(false),
     dynamic_(false),
     shadowCompare_(false),
     shadowCompare_(false),
     parametersDirty_(true),
     parametersDirty_(true),
-    dataLost_(false),
     filterMode_(FILTER_DEFAULT)
     filterMode_(FILTER_DEFAULT)
 {
 {
     for (int i = 0; i < MAX_COORDS; ++i)
     for (int i = 0; i < MAX_COORDS; ++i)
@@ -128,11 +127,6 @@ void Texture::SetParametersDirty()
     parametersDirty_ = true;
     parametersDirty_ = true;
 }
 }
 
 
-void Texture::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 void Texture::UpdateParameters()
 void Texture::UpdateParameters()
 {
 {
     if (!object_ || !graphics_)
     if (!object_ || !graphics_)

+ 0 - 6
Engine/Graphics/OpenGL/OGLTexture.h

@@ -57,8 +57,6 @@ public:
     void SetBackupTexture(Texture* texture);
     void SetBackupTexture(Texture* texture);
     /// Dirty the parameters.
     /// Dirty the parameters.
     void SetParametersDirty();
     void SetParametersDirty();
-    /// Clear data lost flag. No-op on OpenGL.
-    void ClearDataLost();
     /// Update changed parameters to OpenGL. Called by Graphics when binding the texture.
     /// Update changed parameters to OpenGL. Called by Graphics when binding the texture.
     void UpdateParameters();
     void UpdateParameters();
     
     
@@ -74,8 +72,6 @@ public:
     int GetWidth() const { return width_; }
     int GetWidth() const { return width_; }
     /// Return height.
     /// Return height.
     int GetHeight() const { return height_; }
     int GetHeight() const { return height_; }
-    /// Return whether data is lost due to context loss.
-    bool IsDataLost() const { return dataLost_; }
     /// Return whether parameters are dirty.
     /// Return whether parameters are dirty.
     bool GetParametersDirty() const { return parametersDirty_; }
     bool GetParametersDirty() const { return parametersDirty_; }
     /// Return filtering mode.
     /// Return filtering mode.
@@ -132,8 +128,6 @@ protected:
     bool shadowCompare_;
     bool shadowCompare_;
     /// Parameters dirty flag.
     /// Parameters dirty flag.
     bool parametersDirty_;
     bool parametersDirty_;
-    /// Data lost flag.
-    bool dataLost_;
     /// Filtering mode.
     /// Filtering mode.
     TextureFilterMode filterMode_;
     TextureFilterMode filterMode_;
     /// Addressing mode.
     /// Addressing mode.

+ 1 - 7
Engine/Graphics/OpenGL/OGLVertexBuffer.cpp

@@ -128,8 +128,7 @@ VertexBuffer::VertexBuffer(Context* context) :
     lockCount_(0),
     lockCount_(0),
     lockScratchData_(0),
     lockScratchData_(0),
     shadowed_(false),
     shadowed_(false),
-    dynamic_(false),
-    dataLost_(false)
+    dynamic_(false)
 {
 {
     UpdateOffsets();
     UpdateOffsets();
     
     
@@ -340,11 +339,6 @@ void VertexBuffer::Unlock()
     }
     }
 }
 }
 
 
-void VertexBuffer::ClearDataLost()
-{
-    dataLost_ = false;
-}
-
 void VertexBuffer::UpdateOffsets()
 void VertexBuffer::UpdateOffsets()
 {
 {
     unsigned elementOffset = 0;
     unsigned elementOffset = 0;

+ 0 - 6
Engine/Graphics/OpenGL/OGLVertexBuffer.h

@@ -57,15 +57,11 @@ public:
     void* Lock(unsigned start, unsigned count, bool discard = false);
     void* Lock(unsigned start, unsigned count, bool discard = false);
     /// Unlock the buffer and apply changes to the GPU buffer.
     /// Unlock the buffer and apply changes to the GPU buffer.
     void Unlock();
     void Unlock();
-    /// Clear data lost flag.
-    void ClearDataLost();
     
     
     /// Return whether CPU memory shadowing is enabled.
     /// Return whether CPU memory shadowing is enabled.
     bool IsShadowed() const { return shadowed_; }
     bool IsShadowed() const { return shadowed_; }
     /// Return whether is dynamic.
     /// Return whether is dynamic.
     bool IsDynamic() const { return dynamic_; }
     bool IsDynamic() const { return dynamic_; }
-    /// Return whether data is lost due to context loss.
-    bool IsDataLost() const { return dataLost_; }
     /// Return whether is currently locked.
     /// Return whether is currently locked.
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     bool IsLocked() const { return lockState_ != LOCK_NONE; }
     /// Return number of vertices.
     /// Return number of vertices.
@@ -122,6 +118,4 @@ private:
     bool shadowed_;
     bool shadowed_;
     /// Dynamic flag.
     /// Dynamic flag.
     bool dynamic_;
     bool dynamic_;
-    /// Data lost flag.
-    bool dataLost_;
 };
 };

+ 17 - 8
Engine/Input/Input.cpp

@@ -139,17 +139,11 @@ void Input::Update()
     SDL_Window* window = graphics_->GetImpl()->GetWindow();
     SDL_Window* window = graphics_->GetImpl()->GetWindow();
     if (window)
     if (window)
     {
     {
-        unsigned flags = SDL_GetWindowFlags(window);
-        bool oldMinimized = minimized_;
-        minimized_ = (flags & SDL_WINDOW_MINIMIZED) != 0;
-        
-        flags &= (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS);
+        unsigned flags = SDL_GetWindowFlags(window) & (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS);
         if (!active_ && graphics_->GetFullscreen() && flags == (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS))
         if (!active_ && graphics_->GetFullscreen() && flags == (SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_MOUSE_FOCUS))
             activated_ = true;
             activated_ = true;
         else if (active_ && (flags & SDL_WINDOW_INPUT_FOCUS) == 0)
         else if (active_ && (flags & SDL_WINDOW_INPUT_FOCUS) == 0)
             MakeInactive();
             MakeInactive();
-        else if (minimized_ != oldMinimized)
-            SendActivationEvent();
         
         
         // Activate input now if necessary
         // Activate input now if necessary
         if (activated_)
         if (activated_)
@@ -623,6 +617,17 @@ void Input::HandleSDLEvent(void* sdlEvent)
                 input->GetSubsystem<Graphics>()->Close();
                 input->GetSubsystem<Graphics>()->Close();
                 break;
                 break;
                 
                 
+            case SDL_WINDOWEVENT_MINIMIZED:
+                input->minimized_ = true;
+                input->SendActivationEvent();
+                break;
+                
+            case SDL_WINDOWEVENT_MAXIMIZED:
+            case SDL_WINDOWEVENT_RESTORED:
+                input->minimized_ = false;
+                input->SendActivationEvent();
+                break;
+                
             #ifdef ANDROID
             #ifdef ANDROID
             case SDL_WINDOWEVENT_SURFACE_LOST:
             case SDL_WINDOWEVENT_SURFACE_LOST:
                 // Mark GPU objects lost
                 // Mark GPU objects lost
@@ -650,7 +655,8 @@ void Input::HandleScreenMode(StringHash eventType, VariantMap& eventData)
     
     
     // Re-enable cursor clipping, and re-center the cursor (if needed) to the new screen size, so that there is no erroneous
     // Re-enable cursor clipping, and re-center the cursor (if needed) to the new screen size, so that there is no erroneous
     // mouse move event. Also get the new window ID in case it changed
     // mouse move event. Also get the new window ID in case it changed
-    unsigned newWindowID = SDL_GetWindowID(graphics_->GetImpl()->GetWindow());
+    SDL_Window* window = graphics_->GetImpl()->GetWindow();
+    unsigned newWindowID = SDL_GetWindowID(window);
     if (newWindowID != windowID_)
     if (newWindowID != windowID_)
     {
     {
         MutexLock lock(GetStaticMutex());
         MutexLock lock(GetStaticMutex());
@@ -663,6 +669,9 @@ void Input::HandleScreenMode(StringHash eventType, VariantMap& eventData)
     SetCursorPosition(center);
     SetCursorPosition(center);
     lastCursorPosition_ = center;
     lastCursorPosition_ = center;
     activated_ = true;
     activated_ = true;
+    
+    // After setting a new screen mode we should not be minimized
+    minimized_ = (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) != 0;
 }
 }
 
 
 void Input::HandleBeginFrame(StringHash eventType, VariantMap& eventData)
 void Input::HandleBeginFrame(StringHash eventType, VariantMap& eventData)