fix: macOS deep links after wxWidgets 3.3.2 upgrade (#13737)

Fix macOS orcaslicer:// deep links after wxWidgets 3.3.2 upgrade

Install an OrcaSlicer-owned kAEGetURL Apple Event handler from
on_init_inner(). The wxWidgets 3.3.2 handler registered in
applicationWillFinishLaunching: stopped delivering URL events to
GUI_App::MacOpenURL on macOS (#13119), so links from Printables /
Thingiverse opened a blank project instead of importing the model.

Registering our own handler late in startup is last-writer-wins on
NSAppleEventManager and routes back to the existing MacOpenURL ->
start_download path, restoring the pre-upgrade behavior without
touching wxWidgets.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Brandon Wees
2026-05-19 04:13:07 -05:00
committed by GitHub
parent 3370e224b2
commit 1f2ed70288
4 changed files with 68 additions and 0 deletions

View File

@@ -687,6 +687,8 @@ if (APPLE)
GUI/Mouse3DHandlerMac.mm
GUI/InstanceCheckMac.mm
GUI/InstanceCheckMac.h
GUI/DeepLinkHandlerMac.mm
GUI/DeepLinkHandlerMac.h
GUI/GUI_UtilsMac.mm
GUI/wxMediaCtrl2.mm
GUI/wxMediaCtrl2.h

View File

@@ -0,0 +1,16 @@
#ifndef slic3r_GUI_DeepLinkHandlerMac_h_
#define slic3r_GUI_DeepLinkHandlerMac_h_
namespace Slic3r {
namespace GUI {
// Re-registers a Cocoa Apple Event handler for kInternetEventClass/kAEGetURL.
// Works around a regression observed after upgrading to wxWidgets 3.3.2 on
// macOS Tahoe (#13119) where wxWidgets' built-in handler is registered but
// never fires for orcaslicer:// deep links.
void register_mac_deep_link_handler();
} // namespace GUI
} // namespace Slic3r
#endif

View File

@@ -0,0 +1,41 @@
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
#include <boost/log/trivial.hpp>
#include "DeepLinkHandlerMac.h"
#include "GUI_App.hpp"
@interface OrcaDeepLinkHandler : NSObject
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply;
@end
@implementation OrcaDeepLinkHandler
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)reply
{
NSString *url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
if (url == nil || url.length == 0)
return;
BOOST_LOG_TRIVIAL(info) << "Deep link received: " << [url UTF8String];
Slic3r::GUI::wxGetApp().MacOpenURL(wxString::FromUTF8([url UTF8String]));
}
@end
namespace Slic3r {
namespace GUI {
void register_mac_deep_link_handler()
{
static OrcaDeepLinkHandler *handler = nil;
if (handler == nil)
handler = [[OrcaDeepLinkHandler alloc] init];
[[NSAppleEventManager sharedAppleEventManager]
setEventHandler:handler
andSelector:@selector(handleGetURLEvent:withReplyEvent:)
forEventClass:kInternetEventClass
andEventID:kAEGetURL];
}
} // namespace GUI
} // namespace Slic3r

View File

@@ -100,6 +100,9 @@
#include "Mouse3DController.hpp"
#include "RemovableDriveManager.hpp"
#include "InstanceCheck.hpp"
#ifdef __APPLE__
#include "DeepLinkHandlerMac.h"
#endif
#include "NotificationManager.hpp"
#include "UnsavedChangesDialog.hpp"
#include "SavePresetDialog.hpp"
@@ -2547,6 +2550,12 @@ std::string get_system_info()
bool GUI_App::on_init_inner()
{
wxLog::SetActiveTarget(new wxBoostLog());
#ifdef __APPLE__
// Override wxWidgets' kAEGetURL handler so orcaslicer:// deep links keep
// working after the wxWidgets 3.3.2 upgrade on macOS (#13119).
register_mac_deep_link_handler();
#endif
#if BBL_RELEASE_TO_PUBLIC
wxLog::SetLogLevel(wxLOG_Message);
#endif