From 621f30f04df61a1be3d5253da4a47f6c9ffc9281 Mon Sep 17 00:00:00 2001 From: John Galvin <96908304+Johnnyg63@users.noreply.github.com> Date: Mon, 19 Oct 2026 16:02:48 +0100 Subject: [PATCH 1/3] 332-implement-app-state --- dev/src/core.cpp | 11 ++++++++ dev/src/core.h | 9 ++++++- dev/src/host_android.cpp | 35 ++++++++++++++++++------- olcPixelGameEngine3.h | 55 ++++++++++++++++++++++++++++++++-------- 4 files changed, 90 insertions(+), 20 deletions(-) diff --git a/dev/src/core.cpp b/dev/src/core.cpp index c3af8ab5..f05e4596 100644 --- a/dev/src/core.cpp +++ b/dev/src/core.cpp @@ -107,6 +107,17 @@ namespace olc return true; } +#if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS + void PGEWindow::OnSaveStateRequested() + { + return; + } + + void PGEWindow::OnResumeStateRequested() + { + return; + } +#endif // OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS bool PGEWindow::olc_WindowUpdate(const float fElapsedTime, const float fTotalElapsedTime) { float fDT = fElapsedTime; diff --git a/dev/src/core.h b/dev/src/core.h index 43e1a767..9df20314 100644 --- a/dev/src/core.h +++ b/dev/src/core.h @@ -90,8 +90,15 @@ namespace olc virtual bool OnUserUpdate(float fElapsedTime); // Return true if window is to close virtual bool OnUserDestroy(); - + // Apple iOS and Android only +#if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS + // Called when the application is requested to save its state + virtual void OnSaveStateRequested(); + // Called when the application is requested to resume its state + virtual void OnResumeStateRequested(); +#endif + public: // olc::Image Handling // These are the preferred methods to create olc::Image objects diff --git a/dev/src/host_android.cpp b/dev/src/host_android.cpp index 1e2c7acc..6526ade9 100644 --- a/dev/src/host_android.cpp +++ b/dev/src/host_android.cpp @@ -239,7 +239,7 @@ namespace olc::host if (!host->pgeWindow) return; switch (cmd) { - case APP_CMD_WINDOW_RESIZED: + case APP_CMD_WINDOW_RESIZED:{ host->pgeWindow->olc_OnWindowSize({ ANativeWindow_getWidth(app->window), ANativeWindow_getHeight(app->window) @@ -248,25 +248,42 @@ namespace olc::host ANativeWindow_getWidth(app->window), ANativeWindow_getHeight(app->window)); break; - case APP_CMD_INIT_WINDOW: + } + case APP_CMD_INIT_WINDOW:{ if (app->window) { host->initialized = true; LOGD("APP_CMD_INIT_WINDOW received with Window"); } break; + } case APP_CMD_TERM_WINDOW: { - host->pgeWindow->olc_OnWindowClose(); - host->initialized = false; LOGD("APP_CMD_TERM_WINDOW received"); - } break; + if(host){ + host->pgeWindow->olc_OnWindowClose(); + host->initialized = false; + } + break; + } + case APP_CMD_SAVE_STATE: { + LOGD("APP_CMD_SAVE_STATE received"); + if(pPrimaryPGE) pPrimaryPGE->OnSaveStateRequested(); + break; + } + case APP_CMD_RESUME: { + LOGD("APP_CMD_RESUME received"); + if(pPrimaryPGE) pPrimaryPGE->OnResumeStateRequested(); + break; + } case APP_CMD_GAINED_FOCUS: { LOGD("APP_CMD_GAINED_FOCUS received"); - host->pgeWindow->olc_OnFocus(true); - } break; + if(host)host->pgeWindow->olc_OnFocus(true); + break; + } case APP_CMD_LOST_FOCUS: { LOGD("APP_CMD_LOST_FOCUS received"); - host->pgeWindow->olc_OnFocus(false); - } break; + if(host) host->pgeWindow->olc_OnFocus(false); + break; + } default: break; } } diff --git a/olcPixelGameEngine3.h b/olcPixelGameEngine3.h index 2a0e918d..3d565e42 100644 --- a/olcPixelGameEngine3.h +++ b/olcPixelGameEngine3.h @@ -4435,8 +4435,15 @@ namespace olc virtual bool OnUserUpdate(float fElapsedTime); // Return true if window is to close virtual bool OnUserDestroy(); - + // Apple iOS and Android only +#if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS + // Called when the application is requested to save its state + virtual void OnSaveStateRequested(); + // Called when the application is requested to resume its state + virtual void OnResumeStateRequested(); +#endif + public: // olc::Image Handling // These are the preferred methods to create olc::Image objects @@ -15051,7 +15058,7 @@ namespace olc::host if (!host->pgeWindow) return; switch (cmd) { - case APP_CMD_WINDOW_RESIZED: + case APP_CMD_WINDOW_RESIZED:{ host->pgeWindow->olc_OnWindowSize({ ANativeWindow_getWidth(app->window), ANativeWindow_getHeight(app->window) @@ -15060,25 +15067,42 @@ namespace olc::host ANativeWindow_getWidth(app->window), ANativeWindow_getHeight(app->window)); break; - case APP_CMD_INIT_WINDOW: + } + case APP_CMD_INIT_WINDOW:{ if (app->window) { host->initialized = true; LOGD("APP_CMD_INIT_WINDOW received with Window"); } break; + } case APP_CMD_TERM_WINDOW: { - host->pgeWindow->olc_OnWindowClose(); - host->initialized = false; LOGD("APP_CMD_TERM_WINDOW received"); - } break; + if(host){ + host->pgeWindow->olc_OnWindowClose(); + host->initialized = false; + } + break; + } + case APP_CMD_SAVE_STATE: { + LOGD("APP_CMD_SAVE_STATE received"); + if(pPrimaryPGE) pPrimaryPGE->OnSaveStateRequested(); + break; + } + case APP_CMD_RESUME: { + LOGD("APP_CMD_RESUME received"); + if(pPrimaryPGE) pPrimaryPGE->OnResumeStateRequested(); + break; + } case APP_CMD_GAINED_FOCUS: { LOGD("APP_CMD_GAINED_FOCUS received"); - host->pgeWindow->olc_OnFocus(true); - } break; + if(host)host->pgeWindow->olc_OnFocus(true); + break; + } case APP_CMD_LOST_FOCUS: { LOGD("APP_CMD_LOST_FOCUS received"); - host->pgeWindow->olc_OnFocus(false); - } break; + if(host) host->pgeWindow->olc_OnFocus(false); + break; + } default: break; } } @@ -20054,6 +20078,17 @@ namespace olc return true; } +#if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS + void PGEWindow::OnSaveStateRequested() + { + return; + } + + void PGEWindow::OnResumeStateRequested() + { + return; + } +#endif // OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS bool PGEWindow::olc_WindowUpdate(const float fElapsedTime, const float fTotalElapsedTime) { float fDT = fElapsedTime; From 3dc8eaf013d5d950e6a68642b445c6094509e3bb Mon Sep 17 00:00:00 2001 From: John Galvin <96908304+Johnnyg63@users.noreply.github.com> Date: Tue, 20 Oct 2026 16:01:04 +0100 Subject: [PATCH 2/3] Added supoort for OnLowMemory() for Android and iOS --- dev/src/core.cpp | 5 +++++ dev/src/core.h | 2 ++ dev/src/host_android.cpp | 5 +++++ olcPixelGameEngine3.h | 12 ++++++++++++ 4 files changed, 24 insertions(+) diff --git a/dev/src/core.cpp b/dev/src/core.cpp index f05e4596..00256eda 100644 --- a/dev/src/core.cpp +++ b/dev/src/core.cpp @@ -117,6 +117,11 @@ namespace olc { return; } + + void PGEWindow::OnLowMemory() + { + return; + } #endif // OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS bool PGEWindow::olc_WindowUpdate(const float fElapsedTime, const float fTotalElapsedTime) { diff --git a/dev/src/core.h b/dev/src/core.h index 9df20314..4094b872 100644 --- a/dev/src/core.h +++ b/dev/src/core.h @@ -97,6 +97,8 @@ namespace olc virtual void OnSaveStateRequested(); // Called when the application is requested to resume its state virtual void OnResumeStateRequested(); + // Called when the application is running low on memory + virtual void OnLowMemory(); #endif public: // olc::Image Handling diff --git a/dev/src/host_android.cpp b/dev/src/host_android.cpp index 6526ade9..a8d348be 100644 --- a/dev/src/host_android.cpp +++ b/dev/src/host_android.cpp @@ -284,6 +284,11 @@ namespace olc::host if(host) host->pgeWindow->olc_OnFocus(false); break; } + case APP_CMD_LOW_MEMORY: { + LOGD("APP_CMD_LOW_MEMORY received"); + if(pPrimaryPGE) pPrimaryPGE->OnLowMemory(); + break; + } default: break; } } diff --git a/olcPixelGameEngine3.h b/olcPixelGameEngine3.h index 3d565e42..2ccd81d2 100644 --- a/olcPixelGameEngine3.h +++ b/olcPixelGameEngine3.h @@ -4442,6 +4442,8 @@ namespace olc virtual void OnSaveStateRequested(); // Called when the application is requested to resume its state virtual void OnResumeStateRequested(); + // Called when the application is running low on memory + virtual void OnLowMemory(); #endif public: // olc::Image Handling @@ -15103,6 +15105,11 @@ namespace olc::host if(host) host->pgeWindow->olc_OnFocus(false); break; } + case APP_CMD_LOW_MEMORY: { + LOGD("APP_CMD_LOW_MEMORY received"); + if(pPrimaryPGE) pPrimaryPGE->OnLowMemory(); + break; + } default: break; } } @@ -20088,6 +20095,11 @@ namespace olc { return; } + + void PGEWindow::OnLowMemory() + { + return; + } #endif // OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS bool PGEWindow::olc_WindowUpdate(const float fElapsedTime, const float fTotalElapsedTime) { From dd3dbb3695f6c23731269a2cfa6c43bb8eb653ce Mon Sep 17 00:00:00 2001 From: John Galvin <96908304+Johnnyg63@users.noreply.github.com> Date: Wed, 21 Oct 2026 19:20:48 +0100 Subject: [PATCH 3/3] Updated State methdood names to OnUserSaveState, OnUserResume and OnUserLowMemory as it is the user that needs to address these requests --- dev/src/core.cpp | 6 +++--- dev/src/core.h | 6 +++--- dev/src/host_android.cpp | 6 +++--- olcPixelGameEngine3.h | 18 +++++++++--------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/dev/src/core.cpp b/dev/src/core.cpp index 00256eda..e7ea8954 100644 --- a/dev/src/core.cpp +++ b/dev/src/core.cpp @@ -108,17 +108,17 @@ namespace olc } #if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS - void PGEWindow::OnSaveStateRequested() + void PGEWindow::OnUserSaveState() { return; } - void PGEWindow::OnResumeStateRequested() + void PGEWindow::OnUserResume() { return; } - void PGEWindow::OnLowMemory() + void PGEWindow::OnUserLowMemory() { return; } diff --git a/dev/src/core.h b/dev/src/core.h index 4094b872..af2136ce 100644 --- a/dev/src/core.h +++ b/dev/src/core.h @@ -94,11 +94,11 @@ namespace olc // Apple iOS and Android only #if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS // Called when the application is requested to save its state - virtual void OnSaveStateRequested(); + virtual void OnUserSaveState(); // Called when the application is requested to resume its state - virtual void OnResumeStateRequested(); + virtual void OnUserResume(); // Called when the application is running low on memory - virtual void OnLowMemory(); + virtual void OnUserLowMemory(); #endif public: // olc::Image Handling diff --git a/dev/src/host_android.cpp b/dev/src/host_android.cpp index a8d348be..9fafe419 100644 --- a/dev/src/host_android.cpp +++ b/dev/src/host_android.cpp @@ -266,12 +266,12 @@ namespace olc::host } case APP_CMD_SAVE_STATE: { LOGD("APP_CMD_SAVE_STATE received"); - if(pPrimaryPGE) pPrimaryPGE->OnSaveStateRequested(); + if(pPrimaryPGE) pPrimaryPGE->OnUserSaveState(); break; } case APP_CMD_RESUME: { LOGD("APP_CMD_RESUME received"); - if(pPrimaryPGE) pPrimaryPGE->OnResumeStateRequested(); + if(pPrimaryPGE) pPrimaryPGE->OnUserResume(); break; } case APP_CMD_GAINED_FOCUS: { @@ -286,7 +286,7 @@ namespace olc::host } case APP_CMD_LOW_MEMORY: { LOGD("APP_CMD_LOW_MEMORY received"); - if(pPrimaryPGE) pPrimaryPGE->OnLowMemory(); + if(pPrimaryPGE) pPrimaryPGE->OnUserLowMemory(); break; } default: break; diff --git a/olcPixelGameEngine3.h b/olcPixelGameEngine3.h index 2ccd81d2..4bf822ed 100644 --- a/olcPixelGameEngine3.h +++ b/olcPixelGameEngine3.h @@ -4439,11 +4439,11 @@ namespace olc // Apple iOS and Android only #if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS // Called when the application is requested to save its state - virtual void OnSaveStateRequested(); + virtual void OnUserSaveState(); // Called when the application is requested to resume its state - virtual void OnResumeStateRequested(); + virtual void OnUserResume(); // Called when the application is running low on memory - virtual void OnLowMemory(); + virtual void OnUserLowMemory(); #endif public: // olc::Image Handling @@ -15087,12 +15087,12 @@ namespace olc::host } case APP_CMD_SAVE_STATE: { LOGD("APP_CMD_SAVE_STATE received"); - if(pPrimaryPGE) pPrimaryPGE->OnSaveStateRequested(); + if(pPrimaryPGE) pPrimaryPGE->OnUserSaveState(); break; } case APP_CMD_RESUME: { LOGD("APP_CMD_RESUME received"); - if(pPrimaryPGE) pPrimaryPGE->OnResumeStateRequested(); + if(pPrimaryPGE) pPrimaryPGE->OnUserResume(); break; } case APP_CMD_GAINED_FOCUS: { @@ -15107,7 +15107,7 @@ namespace olc::host } case APP_CMD_LOW_MEMORY: { LOGD("APP_CMD_LOW_MEMORY received"); - if(pPrimaryPGE) pPrimaryPGE->OnLowMemory(); + if(pPrimaryPGE) pPrimaryPGE->OnUserLowMemory(); break; } default: break; @@ -20086,17 +20086,17 @@ namespace olc } #if OLC_HOST == OLC_HOST_ANDROID || OLC_HOST == OLC_HOST_IOS - void PGEWindow::OnSaveStateRequested() + void PGEWindow::OnUserSaveState() { return; } - void PGEWindow::OnResumeStateRequested() + void PGEWindow::OnUserResume() { return; } - void PGEWindow::OnLowMemory() + void PGEWindow::OnUserLowMemory() { return; }