summaryrefslogtreecommitdiff
path: root/indra/llwindow
diff options
context:
space:
mode:
authorAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2026-05-29 03:03:31 +0300
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2026-05-30 01:35:25 +0300
commitedf982b7a4efbee1ba75349c460e7040e8d04428 (patch)
tree3f9b195794f5c8be59c550c1219c42ec63e45a04 /indra/llwindow
parent34540cce4f2d504740ea997016b4b06b80ae7adf (diff)
#5719 Detect hybernation #2
Diffstat (limited to 'indra/llwindow')
-rw-r--r--indra/llwindow/llwindowcallbacks.cpp8
-rw-r--r--indra/llwindow/llwindowcallbacks.h2
-rw-r--r--indra/llwindow/llwindowwin32.cpp15
3 files changed, 18 insertions, 7 deletions
diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp
index 6267433751..8d1eebe33d 100644
--- a/indra/llwindow/llwindowcallbacks.cpp
+++ b/indra/llwindow/llwindowcallbacks.cpp
@@ -72,6 +72,14 @@ void LLWindowCallbacks::handlePreCloseRequest()
{
}
+void LLWindowCallbacks::handleCloseRequestCanceled()
+{
+}
+
+void LLWindowCallbacks::handleSuspendRequest()
+{
+}
+
bool LLWindowCallbacks::handleCloseRequest(LLWindow *window, bool from_user)
{
//allow the window to close
diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h
index 457087448f..390e3ff93a 100644
--- a/indra/llwindow/llwindowcallbacks.h
+++ b/indra/llwindow/llwindowcallbacks.h
@@ -43,6 +43,8 @@ public:
virtual void handleMouseLeave(LLWindow *window);
// Called before close request is processed (ex: to create marker file in case OS is about to kill app).
virtual void handlePreCloseRequest();
+ virtual void handleCloseRequestCanceled();
+ virtual void handleSuspendRequest();
// return true to allow window to close, which will then cause handleQuit to be called
virtual bool handleCloseRequest(LLWindow *window, bool from_user);
virtual bool handleSessionExit(LLWindow* window);
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 52e0cdd5d5..79cdf8b67a 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -2657,21 +2657,22 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// Viewer can't function in hibernation, try to shut down.
// The system allows approximately two seconds for an
// application to handle this notification.
+
+ // Mark app as potentially closing, to minimize issues if OS does not recover.
+ window_imp->mCallbacks->handlePreCloseRequest();
window_imp->post([=]()
{
- LL_INFOS("Window") << "Shutting down due to system suspending (sleep/hibernate)" << LL_ENDL;
- if (window_imp->mCallbacks->handleSessionExit(window_imp))
- {
- // Get the app to initiate cleanup.
- window_imp->mCallbacks->handleQuit(window_imp);
- }
+ window_imp->mCallbacks->handleSuspendRequest();
});
+ // Window thread normally doesn't block main thread, but OS can suspend
+ // immediately if we don't wait.
+ // Keep OS from suspending to give a chance to send stats.
ms_sleep(1000);
return TRUE;
case PBT_APMRESUMESUSPEND:
LL_INFOS("Window") << "System is resuming from suspend" << LL_ENDL;
- // Shouldn't be up, but log just in case.
+ window_imp->mCallbacks->handleCloseRequestCanceled();
return TRUE;
case PBT_APMPOWERSTATUSCHANGE: