Migrate away from deprecated methods for setting the standard application on macOS

The methods for checking if qBittorrent is set as the standard application for opening torrent files and magnet links and setting qBittorrent as the standard application for those is using deprecated methods now. For example `LSCopyDefaultHandlerForURLScheme` and `kUTTagClassFilenameExtension`.
The new methods have been moved to `macutilities.mm` because in `os.cpp` cocoa couldn't be imported.

PR #23059.
This commit is contained in:
Ryu481 2025-08-09 12:13:18 +02:00 committed by GitHub
commit 02d72179fe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 54 additions and 82 deletions

View file

@ -193,72 +193,6 @@ void Utils::OS::shutdownComputer([[maybe_unused]] const ShutdownDialogAction &ac
#endif #endif
} }
#ifdef Q_OS_MACOS
namespace
{
const CFStringRef torrentExtension = CFSTR("torrent");
const CFStringRef magnetUrlScheme = CFSTR("magnet");
}
bool Utils::OS::isTorrentFileAssocSet()
{
bool isSet = false;
const CFStringRef torrentId = ::UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL);
if (torrentId != NULL)
{
const CFStringRef defaultHandlerId = ::LSCopyDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer);
if (defaultHandlerId != NULL)
{
const CFStringRef myBundleId = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
if (myBundleId != NULL)
isSet = ::CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo;
::CFRelease(defaultHandlerId);
}
::CFRelease(torrentId);
}
return isSet;
}
void Utils::OS::setTorrentFileAssoc()
{
if (isTorrentFileAssocSet())
return;
const CFStringRef torrentId = ::UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, torrentExtension, NULL);
if (torrentId != NULL)
{
const CFStringRef myBundleId = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
if (myBundleId != NULL)
::LSSetDefaultRoleHandlerForContentType(torrentId, kLSRolesViewer, myBundleId);
::CFRelease(torrentId);
}
}
bool Utils::OS::isMagnetLinkAssocSet()
{
bool isSet = false;
const CFStringRef defaultHandlerId = ::LSCopyDefaultHandlerForURLScheme(magnetUrlScheme);
if (defaultHandlerId != NULL)
{
const CFStringRef myBundleId = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
if (myBundleId != NULL)
isSet = ::CFStringCompare(myBundleId, defaultHandlerId, 0) == kCFCompareEqualTo;
::CFRelease(defaultHandlerId);
}
return isSet;
}
void Utils::OS::setMagnetLinkAssoc()
{
if (isMagnetLinkAssocSet())
return;
const CFStringRef myBundleId = ::CFBundleGetIdentifier(::CFBundleGetMainBundle());
if (myBundleId != NULL)
::LSSetDefaultHandlerForURLScheme(magnetUrlScheme, myBundleId);
}
#endif // Q_OS_MACOS
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
Path Utils::OS::windowsSystemPath() Path Utils::OS::windowsSystemPath()
{ {

View file

@ -48,13 +48,6 @@ namespace Utils::OS
{ {
void shutdownComputer(const ShutdownDialogAction &action); void shutdownComputer(const ShutdownDialogAction &action);
#ifdef Q_OS_MACOS
bool isTorrentFileAssocSet();
void setTorrentFileAssoc();
bool isMagnetLinkAssocSet();
void setMagnetLinkAssoc();
#endif // Q_OS_MACOS
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
Path windowsSystemPath(); Path windowsSystemPath();

View file

@ -44,6 +44,11 @@ namespace MacUtils
void displayNotification(const QString &title, const QString &message); void displayNotification(const QString &title, const QString &message);
void openFiles(const PathList &pathList); void openFiles(const PathList &pathList);
bool isMagnetLinkAssocSet();
void setMagnetLinkAssoc();
bool isTorrentFileAssocSet();
void setTorrentFileAssoc();
QString badgeLabelText(); QString badgeLabelText();
void setBadgeLabelText(const QString &text); void setBadgeLabelText(const QString &text);
} }

View file

@ -143,6 +143,46 @@ namespace MacUtils
} }
} }
bool isMagnetLinkAssocSet()
{
@autoreleasepool
{
const NSURL *magnetStandardURL = [[NSWorkspace sharedWorkspace] URLForApplicationToOpenURL:[NSURL URLWithString:@"magnet:"]];
const NSURL *qbtURL = [[NSBundle mainBundle] bundleURL];
return [magnetStandardURL isEqual:qbtURL];
}
}
void setMagnetLinkAssoc()
{
@autoreleasepool
{
[[NSWorkspace sharedWorkspace] setDefaultApplicationAtURL:[[NSBundle mainBundle] bundleURL]
toOpenURLsWithScheme:@"magnet" completionHandler:nil];
}
}
bool isTorrentFileAssocSet()
{
@autoreleasepool
{
const NSURL *torrentStandardURL = [[NSWorkspace sharedWorkspace]
URLForApplicationToOpenContentType:[UTType typeWithFilenameExtension:@"torrent"]];
const NSURL *qbtURL = [[NSBundle mainBundle] bundleURL];
return [torrentStandardURL isEqual:qbtURL];
}
}
void setTorrentFileAssoc()
{
@autoreleasepool
{
[[NSWorkspace sharedWorkspace] setDefaultApplicationAtURL:[[NSBundle mainBundle] bundleURL]
toOpenContentType:[UTType typeWithFilenameExtension:@"torrent"]
completionHandler:nil];
}
}
QString badgeLabelText() QString badgeLabelText()
{ {
return QString::fromNSString(NSApp.dockTile.badgeLabel); return QString::fromNSString(NSApp.dockTile.badgeLabel);

View file

@ -88,9 +88,9 @@
#include "base/net/dnsupdater.h" #include "base/net/dnsupdater.h"
#endif #endif
#if defined Q_OS_MACOS || defined Q_OS_WIN #ifdef Q_OS_MACOS
#include "base/utils/os.h" #include "macutilities.h"
#endif // defined Q_OS_MACOS || defined Q_OS_WIN #endif
#define SETTINGS_KEY(name) u"OptionsDialog/" name #define SETTINGS_KEY(name) u"OptionsDialog/" name
@ -329,9 +329,9 @@ void OptionsDialog::loadBehaviorTabOptions()
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
m_ui->checkShowSystray->setVisible(false); m_ui->checkShowSystray->setVisible(false);
m_ui->checkAssociateTorrents->setChecked(Utils::OS::isTorrentFileAssocSet()); m_ui->checkAssociateTorrents->setChecked(MacUtils::isTorrentFileAssocSet());
m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked());
m_ui->checkAssociateMagnetLinks->setChecked(Utils::OS::isMagnetLinkAssocSet()); m_ui->checkAssociateMagnetLinks->setChecked(MacUtils::isMagnetLinkAssocSet());
m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked());
#endif #endif
@ -517,14 +517,14 @@ void OptionsDialog::saveBehaviorTabOptions() const
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
if (m_ui->checkAssociateTorrents->isChecked()) if (m_ui->checkAssociateTorrents->isChecked())
{ {
Utils::OS::setTorrentFileAssoc(); MacUtils::setTorrentFileAssoc();
m_ui->checkAssociateTorrents->setChecked(Utils::OS::isTorrentFileAssocSet()); m_ui->checkAssociateTorrents->setChecked(MacUtils::isTorrentFileAssocSet());
m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked());
} }
if (m_ui->checkAssociateMagnetLinks->isChecked()) if (m_ui->checkAssociateMagnetLinks->isChecked())
{ {
Utils::OS::setMagnetLinkAssoc(); MacUtils::setMagnetLinkAssoc();
m_ui->checkAssociateMagnetLinks->setChecked(Utils::OS::isMagnetLinkAssocSet()); m_ui->checkAssociateMagnetLinks->setChecked(MacUtils::isMagnetLinkAssocSet());
m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked());
} }
#endif #endif