Subject: [PATCH] OSXScreen: drop the last Objective-C dependency

OSXScreen.mm was Objective-C++ solely because of a single message send,
[NSEvent doubleClickInterval]. Everything else in its ~1800 lines is
plain C++, and the .mm extension pulls the whole translation unit into
the Objective-C++ front end -- which is GCC's weakest and most divergent
one. Among other things it is why 'id' could not be used as a variable
name there.

Move that one call behind a C wrapper, following the same pattern as the
existing OSXScreenSaverUtil/OSXPasteboardPeeker helpers, and rename the
file to .cpp. libplatform now has no Objective-C++ translation units at
all -- only C++ and (renameable) Objective-C ones.

OSXPasteboardPeeker.h switches from #import to #include because it is now
reached from a C++ translation unit, where GCC warns that #import is a
deprecated extension. CoreFoundation.h is include-guarded, so this is a
no-op otherwise.

The CMake globs in src/lib/platform/CMakeLists.txt already cover OSX*.cpp
and OSX*.mm, so no build system change is needed.

diff --git a/src/lib/platform/OSXEventUtil.h b/src/lib/platform/OSXEventUtil.h
new file mode 100644
index 00000000..9fc61f09
--- /dev/null
+++ b/src/lib/platform/OSXEventUtil.h
@@ -0,0 +1,32 @@
+/*
+ * barrier -- mouse and keyboard sharing utility
+ * Copyright (C) 2012-2016 Symless Ltd.
+ *
+ * This package is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * found in the file LICENSE that should have accompanied this file.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "common/common.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+// The system-wide double click interval, in seconds. This lives behind a C
+// wrapper so that OSXScreen can remain plain C++ rather than Objective-C++.
+double                    getDoubleClickInterval();
+
+#if defined(__cplusplus)
+}
+#endif
diff --git a/src/lib/platform/OSXEventUtil.mm b/src/lib/platform/OSXEventUtil.mm
new file mode 100644
index 00000000..247dc88c
--- /dev/null
+++ b/src/lib/platform/OSXEventUtil.mm
@@ -0,0 +1,26 @@
+/*
+ * barrier -- mouse and keyboard sharing utility
+ * Copyright (C) 2012-2016 Symless Ltd.
+ *
+ * This package is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * found in the file LICENSE that should have accompanied this file.
+ *
+ * This package is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "platform/OSXEventUtil.h"
+
+#import <AppKit/NSEvent.h>
+
+double
+getDoubleClickInterval()
+{
+    return [NSEvent doubleClickInterval];
+}
diff --git a/src/lib/platform/OSXPasteboardPeeker.h b/src/lib/platform/OSXPasteboardPeeker.h
index b69dba82..d3201274 100644
--- a/src/lib/platform/OSXPasteboardPeeker.h
+++ b/src/lib/platform/OSXPasteboardPeeker.h
@@ -19,7 +19,7 @@
 
 #include "common/common.h"
 
-#import <CoreFoundation/CoreFoundation.h>
+#include <CoreFoundation/CoreFoundation.h>
 
 #if defined(__cplusplus)
 extern "C" {
diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.cpp
similarity index 99%
rename from src/lib/platform/OSXScreen.mm
rename to src/lib/platform/OSXScreen.cpp
index d41e321b..a52cb9ce 100644
--- a/src/lib/platform/OSXScreen.cpp
+++ b/src/lib/platform/OSXScreen.cpp
@@ -27,6 +27,7 @@
 #include "platform/OSXDragSimulator.h"
 #include "platform/OSXMediaKeySupport.h"
 #include "platform/OSXPasteboardPeeker.h"
+#include "platform/OSXEventUtil.h"
 #include "barrier/Clipboard.h"
 #include "barrier/KeyMap.h"
 #include "barrier/ClientApp.h"
@@ -43,7 +44,6 @@
 #include <mach-o/dyld.h>
 #include <AvailabilityMacros.h>
 #include <IOKit/hidsystem/event_status_driver.h>
-#include <AppKit/NSEvent.h>
 
 // This isn't in any Apple SDK that I know of as of yet.
 enum {
@@ -532,7 +532,7 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
 	// we define our own defaults.
 	const double maxDiff = sqrt(2) + 0.0001;
 
-    double clickTime = [NSEvent doubleClickInterval];
+    double clickTime = getDoubleClickInterval();
 
     // As long as the click is within the time window and distance window
     // increase clickState (double click, triple click, etc)
