[LyX/master] update canAutoOpenFile/autoOpenFile implementation to new MacOSX API, avoid deprecated calls

Stephan Witt switt at lyx.org
Thu Feb 6 21:37:01 UTC 2020


commit a50e07db46aa32bc0f05cef21236663925910da2
Author: Stephan Witt <switt at lyx.org>
Date:   Fri Sep 20 19:49:56 2019 +0200

    update canAutoOpenFile/autoOpenFile implementation to new MacOSX API, avoid deprecated calls
---
 src/support/os_unix.cpp |   53 ++++++++++++++++++++++++++++------------------
 1 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/src/support/os_unix.cpp b/src/support/os_unix.cpp
index 34cfd47..3f16dd8 100644
--- a/src/support/os_unix.cpp
+++ b/src/support/os_unix.cpp
@@ -221,32 +221,46 @@ char path_separator(path_type)
 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)
 {
 #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,
 					(UInt8 *) ext.c_str(), ext.length(),
 					kCFStringEncodingISOLatin1, false);
-	// this is what we would like to do but it seems that the
-	// 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);
+	CFStringRef cfs_uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, cfs_ext, NULL);
 	CFRelease(cfs_ext);
+	if (cfs_uti == NULL) return false;
+
+	LSRolesMask role = (mode == VIEW) ? kLSRolesViewer :  kLSRolesEditor;
+	bool result = canAutoOpenFile(cfs_uti, role);
+	if (!result && mode == VIEW)
+		result = canAutoOpenFile(cfs_uti, kLSRolesEditor);
 
-	return status != kLSApplicationNotFoundErr;
+	CFRelease(cfs_uti);
+	return result;
 #else
 	// silence compiler warnings
 	(void)ext;
 	(void)mode;
 
-	// currently, no default viewer is tried for non-windows system
-	// support for KDE/Gnome/Macintosh may be added later
+	// currently, no default viewer is tried for non-apple system
+	// support for KDE/Gnome may be added later
 	return false;
 #endif
 }
@@ -261,14 +275,11 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
 	// viewer for PDF is often quicktime...
 	//LSRolesMask role = (mode == VIEW) ? kLSRolesViewer :  kLSRolesEditor;
 	(void)mode;
-	LSRolesMask role = kLSRolesAll;
+	LSRolesMask role = (mode == VIEW) ? kLSRolesAll :  kLSRolesEditor;
 
 	CFURLRef docURL = CFURLCreateFromFileSystemRepresentation(
 		NULL, (UInt8 *) filename.c_str(), filename.size(), false);
-	CFURLRef appURL;
-	OSStatus status = LSGetApplicationForURL(docURL, role, NULL, &appURL);
-	if (status == kLSApplicationNotFoundErr)
-		return false;
+	CFURLRef appURL = LSCopyDefaultApplicationURLForURL(docURL, role, NULL);
 
 	CFURLRef docURLs[] = { docURL };
 	CFArrayRef launchItems = CFArrayCreate(
@@ -296,7 +307,7 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
 		setEnv("BSTINPUTS", newbstinputs);
 		setEnv("TEXFONTS", newtexfonts);
 	}
-	status = LSOpenFromURLSpec (&launchUrlSpec, NULL);
+	OSStatus const status = LSOpenFromURLSpec (&launchUrlSpec, NULL);
 	CFRelease(launchItems);
 	if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
 		setEnv("TEXINPUTS", oldtexinputs);
@@ -311,8 +322,8 @@ bool autoOpenFile(string const & filename, auto_open_mode const mode,
 	(void)mode;
 	(void)path;
 
-	// currently, no default viewer is tried for non-windows system
-	// support for KDE/Gnome/Macintosh may be added later
+	// currently, no default viewer is tried for non-apple system
+	// support for KDE/Gnome may be added later
 	return false;
 #endif
 }


More information about the lyx-cvs mailing list