Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions indra/llwindow/llwindowwin32.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2587,6 +2587,7 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
{
window_imp->post([=]()
{
LL_INFOS("Window") << "Shutting down due to session terminating" << LL_ENDL;
// Check if app needs cleanup or can be closed immediately.
if (window_imp->mCallbacks->handleSessionExit(window_imp))
{
Expand All @@ -2605,6 +2606,47 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// if session is ending OS is going to take care of it.
return 0;
}
case WM_POWERBROADCAST:
{
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_POWERBROADCAST");
switch (w_param)
{
case PBT_APMSUSPEND:
LL_INFOS("Window") << "System is suspending (sleep/hibernate)" << LL_ENDL;
// System is about to enter sleep or hibernation
// Viewer can't function in hibernation, try to shut down.
// The system allows approximately two seconds for an
// application to handle this notification.
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);
}
});
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.
return TRUE;

case PBT_APMPOWERSTATUSCHANGE:
LL_INFOS("Window") << "Power status has changed" << LL_ENDL;
// Power status change (AC/battery)
// Viewer requires high performance, not much we can do.
// about it, but log for diagnostic purposes (example:
// OS trying to throw viewer at an iGPU after this message)
return TRUE;

default:
break;
}
break;
}
case WM_POST_UNINSTALL_:
{
LL_PROFILE_ZONE_NAMED_CATEGORY_WIN32("mwp - WM_POST_UNINSTALL_");
Expand Down
1 change: 1 addition & 0 deletions indra/newview/llappviewermacosx-objc.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,6 @@
#include <vector>

void force_ns_sxeption();
void register_url_schemes();

#endif // LL_LLAPPVIEWERMACOSX_OBJC_H
25 changes: 25 additions & 0 deletions indra/newview/llappviewermacosx-objc.mm
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,28 @@ void force_ns_sxeption()
NSException *exception = [NSException exceptionWithName:@"Forced NSException" reason:nullptr userInfo:nullptr];
@throw exception;
}

void register_url_schemes()
{
@autoreleasepool // Objective-C automatic memory tracking and release.
{
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSURL *bundleURL = [NSURL fileURLWithPath:bundlePath];

// Force Launch Services to re-register this app bundle
OSStatus status = LSRegisterURL((__bridge CFURLRef)bundleURL, true);

if (status == noErr)
{
// Explicitly set this app as the default handler for our URL schemes
NSArray *schemes = @[@"secondlife", @"x-grid-location-info"];
NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];

for (NSString *scheme in schemes)
{
LSSetDefaultHandlerForURLScheme((__bridge CFStringRef)scheme,
(__bridge CFStringRef)bundleID);
Comment thread
akleshchev marked this conversation as resolved.
}
}
}
}
15 changes: 15 additions & 0 deletions indra/newview/llappviewermacosx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,21 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
return reset_count == 0;
}

bool LLAppViewerMacOSX::initSLURLHandler()
{
if (isSecondInstance())
{
return false;
}
// Main secondlife:// registration is in info.plist, but macOS
// Launch Services caches URL scheme handlers, and a different
// viewer might still be registered.
// Register URL schemes with Launch Services on every launch
register_url_schemes();

return true;
}

std::string LLAppViewerMacOSX::generateSerialNumber()
{
char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore
Expand Down
1 change: 1 addition & 0 deletions indra/newview/llappviewermacosx.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class LLAppViewerMacOSX : public LLAppViewer

protected:
virtual bool restoreErrorTrap();
virtual bool initSLURLHandler();

std::string generateSerialNumber();
virtual bool initParseCommandLine(LLCommandLineParser& clp);
Expand Down
Loading