update canAutoOpenFile/autoOpenFile implementation to new MacOSX API, avoid deprecated calls

This commit is contained in:
Stephan Witt 2017-04-08 21:01:17 +02:00
parent 4a009c85bb
commit d568846e03

View File

@ -238,32 +238,46 @@ char path_separator(path_type)
void windows_style_tex_paths(bool) void windows_style_tex_paths(bool)
{} {}
#ifdef __APPLE__
bool canAutoOpenFile(CFStringRef cfs_uti, LSRolesMask role)
{
// Reference:
// https://developer.apple.com/reference/coreservices/1447734-lscopydefaultapplicationurlforco
CFURLRef outAppRef = LSCopyDefaultApplicationURLForContentType(cfs_uti, role, NULL);
if (outAppRef == NULL) return false;
CFRelease(outAppRef);
return true;
}
#endif
bool canAutoOpenFile(string const & ext, auto_open_mode const mode) bool canAutoOpenFile(string const & ext, auto_open_mode const mode)
{ {
#ifdef __APPLE__ #ifdef __APPLE__
// Reference: http://developer.apple.com/documentation/Carbon/Reference/LaunchServicesReference/ // References:
// https://developer.apple.com/reference/coreservices/1447734-lscopydefaultapplicationurlforco
CFStringRef cfs_ext = CFStringCreateWithBytes(kCFAllocatorDefault, CFStringRef cfs_ext = CFStringCreateWithBytes(kCFAllocatorDefault,
(UInt8 *) ext.c_str(), ext.length(), (UInt8 *) ext.c_str(), ext.length(),
kCFStringEncodingISOLatin1, false); kCFStringEncodingISOLatin1, false);
// this is what we would like to do but it seems that the CFStringRef cfs_uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, cfs_ext, NULL);
// viewer for PDF is often quicktime...
//LSRolesMask role = (mode == VIEW) ? kLSRolesViewer : kLSRolesEditor;
(void)mode;
LSRolesMask role = kLSRolesAll;
FSRef outAppRef;
OSStatus status =
LSGetApplicationForInfo(kLSUnknownType, kLSUnknownCreator,
cfs_ext, role, &outAppRef, NULL);
CFRelease(cfs_ext); CFRelease(cfs_ext);
if (cfs_uti == NULL) return false;
return status != kLSApplicationNotFoundErr; LSRolesMask role = (mode == VIEW) ? kLSRolesViewer : kLSRolesEditor;
bool result = canAutoOpenFile(cfs_uti, role);
if (!result && mode == VIEW)
result = canAutoOpenFile(cfs_uti, kLSRolesEditor);
CFRelease(cfs_uti);
return result;
#else #else
// silence compiler warnings // silence compiler warnings
(void)ext; (void)ext;
(void)mode; (void)mode;
// currently, no default viewer is tried for non-windows system // currently, no default viewer is tried for non-apple system
// support for KDE/Gnome/Macintosh may be added later // support for KDE/Gnome may be added later
return false; return false;
#endif #endif
} }
@ -278,14 +292,11 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
// viewer for PDF is often quicktime... // viewer for PDF is often quicktime...
//LSRolesMask role = (mode == VIEW) ? kLSRolesViewer : kLSRolesEditor; //LSRolesMask role = (mode == VIEW) ? kLSRolesViewer : kLSRolesEditor;
(void)mode; (void)mode;
LSRolesMask role = kLSRolesAll; LSRolesMask role = (mode == VIEW) ? kLSRolesAll : kLSRolesEditor;
CFURLRef docURL = CFURLCreateFromFileSystemRepresentation( CFURLRef docURL = CFURLCreateFromFileSystemRepresentation(
NULL, (UInt8 *) filename.c_str(), filename.size(), false); NULL, (UInt8 *) filename.c_str(), filename.size(), false);
CFURLRef appURL; CFURLRef appURL = LSCopyDefaultApplicationURLForURL(docURL, role, NULL);
OSStatus status = LSGetApplicationForURL(docURL, role, NULL, &appURL);
if (status == kLSApplicationNotFoundErr)
return false;
CFURLRef docURLs[] = { docURL }; CFURLRef docURLs[] = { docURL };
CFArrayRef launchItems = CFArrayCreate( CFArrayRef launchItems = CFArrayCreate(
@ -313,7 +324,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
setEnv("BSTINPUTS", newbstinputs); setEnv("BSTINPUTS", newbstinputs);
setEnv("TEXFONTS", newtexfonts); setEnv("TEXFONTS", newtexfonts);
} }
status = LSOpenFromURLSpec (&launchUrlSpec, NULL); OSStatus const status = LSOpenFromURLSpec (&launchUrlSpec, NULL);
CFRelease(launchItems); CFRelease(launchItems);
if (!path.empty() && !lyxrc.texinputs_prefix.empty()) { if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
setEnv("TEXINPUTS", oldtexinputs); setEnv("TEXINPUTS", oldtexinputs);
@ -328,8 +339,8 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
(void)mode; (void)mode;
(void)path; (void)path;
// currently, no default viewer is tried for non-windows system // currently, no default viewer is tried for non-apple system
// support for KDE/Gnome/Macintosh may be added later // support for KDE/Gnome may be added later
return false; return false;
#endif #endif
} }