system startup for osx
@@ -408,11 +408,73 @@ bool SetStartOnSystemStartup(bool fAutoStart)
}
return true;
}
+
+#elif defined(Q_OS_MAC)
+// based on: https://github.com/Mozketo/LaunchAtLoginController/blob/master/LaunchAtLoginController.m
+
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreServices/CoreServices.h>
+
+LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl);
+LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl)
+{
+ // loop through the list of startup items and try to find the bitcoin app
+ CFArrayRef listSnapshot = LSSharedFileListCopySnapshot(list, NULL);
+ for(int i = 0; i < CFArrayGetCount(listSnapshot); i++) {
+ LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(listSnapshot, i);
+ UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
+ CFURLRef currentItemURL = NULL;
+
+#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= 10100
+ if(&LSSharedFileListItemCopyResolvedURL)
+ currentItemURL = LSSharedFileListItemCopyResolvedURL(item, resolutionFlags, NULL);
+#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && MAC_OS_X_VERSION_MIN_REQUIRED < 10100
+ else
+ LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
+#endif
#else
+ LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
+#endif
+
+ if(currentItemURL && CFEqual(currentItemURL, findUrl)) {
+ // found
+ CFRelease(currentItemURL);
+ return item;
+ }
+ if(currentItemURL) {
+ CFRelease(currentItemURL);
+ }
+ }
+ return NULL;
+}
-// TODO: OSX startup stuff; see:
-// https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html
+bool GetStartOnSystemStartup()
+{
+ CFURLRef denariusAppURL = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+ LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
+ LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, denariusAppURL);
+ return !!foundItem; // return boolified object
+}
+
+bool SetStartOnSystemStartup(bool fAutoStart)
+{
+ CFURLRef denariusAppURL = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+ LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
+ LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, denariusAppURL);
+
+ if(fAutoStart && !foundItem) {
+ // add denarius app to startup item list
+ LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst, NULL, NULL, denariusAppURL, NULL, NULL);
+ }
+ else if(!fAutoStart && foundItem) {
+ // remove item
+ LSSharedFileListItemRemove(loginItems, foundItem);
+ }
+ return true;
+}
+#else
+// system startup not supported
bool GetStartOnSystemStartup() { return false; }
bool SetStartOnSystemStartup(bool fAutoStart) { return false; }
