summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-03-24 14:25:22 +0100
committerRobin Gareus <robin@gareus.org>2020-03-24 14:25:22 +0100
commit853bf6d1789b49d233fe4d093a0afa485720bcde (patch)
treed8b199f2db690cf9dc1ba873165f88419053a8db /gtk2_ardour
parent2f0914c73060bad387bf2d92e5eae2de51b6d1e0 (diff)
Add API to query OSX/MacOS version
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/bundle_env_cocoa.cc1
-rw-r--r--gtk2_ardour/cocoacarbon.mm40
2 files changed, 41 insertions, 0 deletions
diff --git a/gtk2_ardour/bundle_env_cocoa.cc b/gtk2_ardour/bundle_env_cocoa.cc
index 828212459e..1ae39c6452 100644
--- a/gtk2_ardour/bundle_env_cocoa.cc
+++ b/gtk2_ardour/bundle_env_cocoa.cc
@@ -54,6 +54,7 @@ using namespace std;
extern void set_language_preference (); // cocoacarbon.mm
extern void no_app_nap (); // cocoacarbon.mm
+extern int query_darwin_version (); // cocoacarbon.mm
static void
setup_logging (void)
diff --git a/gtk2_ardour/cocoacarbon.mm b/gtk2_ardour/cocoacarbon.mm
index 421050b5fc..8c5cac90fa 100644
--- a/gtk2_ardour/cocoacarbon.mm
+++ b/gtk2_ardour/cocoacarbon.mm
@@ -21,9 +21,13 @@
#include <string>
#include <ctype.h>
#include <stdlib.h>
+#include <sys/utsname.h>
+#include <sys/sysctl.h>
+
#include <pbd/error.h>
#include <gtkmm2ext/gtkapplication.h>
#include <gdk/gdkquartz.h>
+
#undef check
#undef YES
#undef NO
@@ -124,3 +128,39 @@ no_app_nap ()
[ [ NSProcessInfo processInfo] beginActivityWithOptions:NSActivityLatencyCritical reason:@"realtime audio" ];
}
}
+
+/** Query Darwin kernel version.
+ * @return major kernel version or -1 on failure
+ *
+ * kernel version is 4 ahead of OS X release
+ * 19.x.x - OS 10.15 (Catalina)
+ * 18.x.x - OS 10.14 (Mojave)
+ * 17.x.x - OS 10.13 (High Sierra)
+ * 16.x.x - OS 10.12 (Sierra)
+ * ...
+ * 10.x.x - OS 10.6 (Snow Leopard)
+ */
+int
+query_darwin_version ()
+{
+ char str[256] = {0};
+ size_t size = sizeof(str);
+
+ if (0 == sysctlbyname ("kern.osrelease", str, &size, NULL, 0)) {
+ short int v[3];
+ if (3 == sscanf (str, "%hd.%hd.%hd", &v[0], &v[1], &v[2])) {
+ return v[0]; // major version only
+ }
+ } else {
+ struct utsname name;
+ uname (&name);
+ int v[3];
+ if (3 == sscanf (name.release, "%d.%d.%d", &v[0], &v[1], &v[2])) {
+ return v[0]; // major version only
+ }
+ if (2 == sscanf (name.release, "%d.%d", &v[0], &v[1])) {
+ return v[0]; // major version only
+ }
+ }
+ return -1;
+}