https://bugs.kde.org/show_bug.cgi?id=432336
Bug ID: 432336
Summary: Add Open With menu entry under macOS as under Linux
and Windows
Product: digikam
Version: 7.2.0
Platform: macOS (DMG)
OS: macOS
Status: REPORTED
Severity: wishlist
Priority: NOR
Component: Usability-Menus
Assignee: [email protected]
Reporter: [email protected]
Target Milestone: ---
See this ObjectiveC code below from Robert Lindsay send through users mailing
list to get a list of macOS application from a file extension. GUI must provide
a dialog to show this list and allow user to select right one. Code explain
also how to call macOS SDK to invoke target application.
// ---------------------------------
// given a filename extension "extension", here's how to find all of the
// applications known to the OS who can open files of that type.
CFStringRef uti = NULL;
CFArrayRef bundleIDs = NULL;
CFMutableArrayRef applications = NULL;
applications = CFArrayCreateMutable(kCFAllocatorDefault, 0);
// Make a UTI from a filename extension
uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,
extension,
nil);
if (NULL != uti)
{
// get a list of all of the application bundle IDs that know how
to handle this:
bundleIDs = LSCopyAllRoleHandlersForContentType(uti, kLSRolesViewer |
kLSRolesEditor);
}
if (NULL != bundleIDs)
{
// find all the available applications with this bundle ID
// getting the display name and version is left as an exercise for
the reader.
const CFIndex count = CFArrayGetCount(bundleIDs);
for (CFIndex i = 0; i < count; i++)
{
CFArrayRef appsForBundleID = NULL;
appsForBundleID =
LSCopyApplicationURLsForBundleIdentifier(bundleID, NULL);
if (NULL != appsForBundleID)
{
//
// you could call CFURLResourceIsReachable() on
each item before adding
// it to the big array of qualified applications.
//
CFArrayAppendArray(applications, appsForBundleID,
CFRangeMake(0, CFArrayGetCount(appsForBundleID)));
CFRelease(appsForBundleID);
}
}
}
// "applications" now has an array of ALL of the possible applications
// when finished. Given a UI to choose one, you can then call
// LSOpenFromURLSpec() to open your file with a specific application.
// when you're finished, don't forget to release the resources or you'll
leak memory
CFRelease(uti);
CFRelease(bundleIDs);
CFRelease(applications);
// ------------------------------
Gilles Caulier
--
You are receiving this mail because:
You are watching all bug changes.