diff --git a/XInputSimulator/.idea/workspace.xml b/XInputSimulator/.idea/workspace.xml
index 5c08a99..4792309 100644
--- a/XInputSimulator/.idea/workspace.xml
+++ b/XInputSimulator/.idea/workspace.xml
@@ -87,16 +87,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -506,4 +496,4 @@
-
\ No newline at end of file
+
diff --git a/XInputSimulator/CMakeLists.txt b/XInputSimulator/CMakeLists.txt
old mode 100644
new mode 100755
index 7ac8dd7..e674327
--- a/XInputSimulator/CMakeLists.txt
+++ b/XInputSimulator/CMakeLists.txt
@@ -1,41 +1,93 @@
cmake_minimum_required(VERSION 2.8.4)
project(XInputSimulator)
+set(PROJECT_VERSION 0.1)
+
+option(WITH_PIC "Compile static library as position-independent code" OFF) # Shared library is always PIC
+option(BUILD_STATIC_LIBS "Build the static library" ON)
+option(BUILD_SHARED_LIBS "Build the shared library" ON)
+option(BUILD_MACOS_FATLIB "Build Fat library for both i386 and x86_64 on macOS" ON)
+option(BUILD_MANUAL_TEST "Build the test application" ON)
+
+if(BUILD_MACOS_FATLIB)
+ if (CMAKE_OSX_ARCHITECTURES)
+ message(FATAL_ERROR "User supplied -DCMAKE_OSX_ARCHITECTURES overrides BUILD_MACOS_FATLIB=ON")
+ else()
+ SET(CMAKE_OSX_ARCHITECTURES "x86_64;i386")
+ endif()
+endif()
# Linux
if(UNIX AND NOT APPLE)
- find_library(X_11 X11)
- find_library(X_TST Xtst)
- set(EXTRA_LIBS ${X_11} ${X_TST})
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- set(PLATFORM_SOURCE_FILES xinputsimulatorimpllinux.cpp xinputsimulatorimpllinux.h)
+ find_library(X_11 X11)
+ find_library(X_TST Xtst)
+ set(EXTRA_LIBS ${X_11} ${X_TST})
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ # Not nice, but I don't know how to have CMake generate all dependencies
+ # One could run ldd(1) on the .so and extract all deps...
+ set(PKG_CONFIG_EXTRA_LIBS "-lX11 -lXtst -lXext -lxcb -lXau -pthread -lXdmcp -lrt")
+ set(PLATFORM_SOURCE_FILES xinputsimulatorimpllinux.cpp xinputsimulatorimpllinux.h)
+ set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif(UNIX AND NOT APPLE)
# Apple
if(APPLE)
- find_library(APP_SERVICES ApplicationServices)
find_library(CARBON Carbon)
find_library(CORE_FOUNDATION CoreFoundation)
- set(EXTRA_LIBS ${APP_SERVICES_LIBRARY} ${CARBON} ${CORE_FOUNDATION})
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- set(PLATFORM_SOURCE_FILES xinputsimulatorimplmacos.cpp xinputsimulatorimplmacos.h)
+ set(EXTRA_LIBS ${CARBON} ${CORE_FOUNDATION})
+ set(PKG_CONFIG_EXTRA_LIBS "-framework CoreFoundation -framework Carbon")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+ set(PLATFORM_SOURCE_FILES xinputsimulatorimplmacos.cpp xinputsimulatorimplmacos.h)
+ set(CMAKE_MACOSX_RPATH ON)
endif(APPLE)
-
- # Windows
- if(WIN32)
- #find_library(USER_32 User32.Lib)
- #set(EXTRA_LIBS ${USER_32})
- set(PLATFORM_SOURCE_FILES xinputsimulatorimplwin.cpp xinputsimulatorimplwin.h)
- endif(WIN32)
-
- set(SOURCE_FILES
- main.cpp
- notimplementedexception.cpp
- notimplementedexception.h
- xinputsimulator.cpp
- xinputsimulator.h
- xinputsimulatorimpl.cpp
- xinputsimulatorimpl.h
- ${PLATFORM_SOURCE_FILES})
-
-add_executable(XInputSimulator ${SOURCE_FILES})
-target_link_libraries(XInputSimulator ${EXTRA_LIBS} )
\ No newline at end of file
+
+ # Windows
+ if(WIN32)
+ #find_library(USER_32 User32.Lib)
+ #set(EXTRA_LIBS ${USER_32})
+ set(PLATFORM_SOURCE_FILES xinputsimulatorimplwin.cpp xinputsimulatorimplwin.h)
+ endif(WIN32)
+
+ set(SOURCE_FILES
+ notimplementedexception.cpp
+ xinputsimulator.cpp
+ xinputsimulator.h
+ xinputsimulatorimpl.cpp
+ xinputsimulatorimpl.h
+ ${PLATFORM_SOURCE_FILES})
+
+link_libraries(${EXTRA_LIBS} )
+configure_file(XInputSimulator.pc.in XInputSimulator.pc @ONLY)
+
+if (BUILD_SHARED_LIBS)
+ add_library(XInputSimulator SHARED ${SOURCE_FILES})
+ set_property(TARGET XInputSimulator PROPERTY POSITION_INDEPENDENT_CODE ON)
+endif()
+if (BUILD_STATIC_LIBS)
+ add_library(XInputSimulator_static STATIC ${SOURCE_FILES})
+ if (WITH_PIC)
+ set_property(TARGET XInputSimulator_static PROPERTY POSITION_INDEPENDENT_CODE ON)
+ endif()
+ if(NOT WIN32) # Keep lib*.(a|dll) name, but avoid *.lib files overwriting each other on Windows
+ set_target_properties(XInputSimulator_static PROPERTIES OUTPUT_NAME XInputSimulator)
+ endif()
+endif()
+
+
+
+IF (NOT (BUILD_STATIC_LIBS OR BUILD_SHARED_LIBS))
+ MESSAGE(FATAL_ERROR "Both -DBUILD_SHARED_LIBS=OFF and -DBUILD_STATIC_LIBS=OFF supplied. Nothing to do...")
+ENDIF()
+
+if (BUILD_MANUAL_TEST)
+ add_executable(XInputSimulator_bin main.cpp)
+ target_link_libraries(XInputSimulator_bin XInputSimulator)
+ set_target_properties(XInputSimulator_bin PROPERTIES OUTPUT_NAME "XInputSimulator")
+endif()
+
+install(FILES ${CMAKE_BINARY_DIR}/XInputSimulator.pc DESTINATION lib/pkgconfig)
+install(TARGETS XInputSimulator XInputSimulator_static
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib)
+install(FILES xinputsimulator.h DESTINATION include)
+
diff --git a/XInputSimulator/XInputSimulator.pc.in b/XInputSimulator/XInputSimulator.pc.in
new file mode 100644
index 0000000..db25c66
--- /dev/null
+++ b/XInputSimulator/XInputSimulator.pc.in
@@ -0,0 +1,14 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib
+includedir=${prefix}/include
+
+Name: XInputSimulator
+Description: Cross-Platform Simulator mouse and keyboard input
+URL: https://github.com/pythoneer/XInputSimulator
+Version: @PROJECT_VERSION@
+Requires:
+Libs: -L${libdir} -lXInputSimulator
+Libs.private: @PKG_CONFIG_EXTRA_LIBS@
+Cflags: -I${includedir}
+
diff --git a/XInputSimulator/XInputSimulator.pro b/XInputSimulator/XInputSimulator.pro
index 7d04846..4fa0675 100644
--- a/XInputSimulator/XInputSimulator.pro
+++ b/XInputSimulator/XInputSimulator.pro
@@ -18,7 +18,6 @@ HEADERS += \
xinputsimulator.h \
xinputsimulatorimpl.h \
xinputsimulatorimpllinux.h \
- notimplementedexception.h \
xinputsimulatorimplmacos.h \
xinputsimulatorimplwin.h
diff --git a/XInputSimulator/notimplementedexception.cpp b/XInputSimulator/notimplementedexception.cpp
index 858c36c..55d10b2 100644
--- a/XInputSimulator/notimplementedexception.cpp
+++ b/XInputSimulator/notimplementedexception.cpp
@@ -15,7 +15,7 @@
// You should have received a copy of the GNU Lesser Public License
// along with XInputSimulator. If not, see .
-#include "notimplementedexception.h"
+#include "xinputsimulator.h"
NotImplementedException::NotImplementedException()
:
diff --git a/XInputSimulator/notimplementedexception.h b/XInputSimulator/notimplementedexception.h
deleted file mode 100644
index c637baa..0000000
--- a/XInputSimulator/notimplementedexception.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2013 Dustin Bensing
-
-// This file is part of XInputSimulator.
-
-// XInputSimulator is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// any later version.
-
-// XInputSimulator 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 Lesser Public License for more details.
-
-// You should have received a copy of the GNU Lesser Public License
-// along with XInputSimulator. If not, see .
-
-#ifndef NOTIMPLEMENTEDEXCEPTION_H
-#define NOTIMPLEMENTEDEXCEPTION_H
-
-#include
-
-class NotImplementedException : public std::runtime_error
-{
-public:
- NotImplementedException();
-};
-
-#endif // NOTIMPLEMENTEDEXCEPTION_H
diff --git a/XInputSimulator/xinputsimulator.cpp b/XInputSimulator/xinputsimulator.cpp
index a6c9c09..48687b9 100644
--- a/XInputSimulator/xinputsimulator.cpp
+++ b/XInputSimulator/xinputsimulator.cpp
@@ -17,6 +17,32 @@
#include "xinputsimulator.h"
+#ifdef __linux__
+#include "xinputsimulatorimpllinux.h"
+#elif __APPLE__
+#include "xinputsimulatorimplmacos.h"
+#elif _WIN32
+#include "xinputsimulatorimplwin.h"
+#endif
+
+XInputSimulator & XInputSimulator::getInstance()
+{
+ static XInputSimulator instance;
+
+#ifdef __linux__
+ instance.implementation = new XInputSimulatorImplLinux;
+#elif __APPLE__
+ instance.implementation = new XInputSimulatorImplMacOs;
+#elif _WIN32
+ instance.implementation = new XInputSimulatorImplWin;
+#endif
+ return instance;
+}
+
+XInputSimulator::~XInputSimulator() {
+ delete implementation;
+}
+
//*************************************************//
//******************M O U S E**********************//
diff --git a/XInputSimulator/xinputsimulator.h b/XInputSimulator/xinputsimulator.h
index e00abc7..8d008c2 100644
--- a/XInputSimulator/xinputsimulator.h
+++ b/XInputSimulator/xinputsimulator.h
@@ -20,21 +20,12 @@
#include
#include
-#include "xinputsimulatorimpl.h"
-#include "notimplementedexception.h"
-
-#ifdef __linux__
-#include "xinputsimulatorimpllinux.h"
-#elif __APPLE__
-#include "xinputsimulatorimplmacos.h"
-#elif _WIN32
-#include "xinputsimulatorimplwin.h"
-#endif
+#include
class XInputSimulator
{
private:
- XInputSimulatorImpl *implementation;
+ class XInputSimulatorImpl *implementation;
XInputSimulator(){}
@@ -42,23 +33,9 @@ class XInputSimulator
XInputSimulator(XInputSimulator&) = delete;
void operator=(XInputSimulator&) = delete;
- ~XInputSimulator() {
- delete implementation;
- }
-
- static XInputSimulator & getInstance()
- {
- static XInputSimulator instance;
+ ~XInputSimulator();
-#ifdef __linux__
- instance.implementation = new XInputSimulatorImplLinux;
-#elif __APPLE__
- instance.implementation = new XInputSimulatorImplMacOs;
-#elif _WIN32
- instance.implementation = new XInputSimulatorImplWin;
-#endif
- return instance;
- }
+ static XInputSimulator & getInstance();
void mouseMoveTo(int x, int y);
void mouseMoveRelative(int x, int y);
@@ -83,4 +60,12 @@ class XInputSimulator
typedef XInputSimulator XIS;
+
+class NotImplementedException : public std::runtime_error
+{
+public:
+ NotImplementedException();
+};
+
+
#endif // XINPUTSIMULATOR_H
diff --git a/XInputSimulator/xinputsimulatorimpllinux.cpp b/XInputSimulator/xinputsimulatorimpllinux.cpp
index 0924b54..53242a9 100644
--- a/XInputSimulator/xinputsimulatorimpllinux.cpp
+++ b/XInputSimulator/xinputsimulatorimpllinux.cpp
@@ -20,7 +20,6 @@
#include //usleep
#include "xinputsimulatorimpllinux.h"
-#include "notimplementedexception.h"
#include
//memset
diff --git a/XInputSimulator/xinputsimulatorimplmacos.cpp b/XInputSimulator/xinputsimulatorimplmacos.cpp
index f4ebf9d..7b46908 100644
--- a/XInputSimulator/xinputsimulatorimplmacos.cpp
+++ b/XInputSimulator/xinputsimulatorimplmacos.cpp
@@ -23,8 +23,8 @@
//sleep
#include
+#include "xinputsimulator.h"
#include "xinputsimulatorimplmacos.h"
-#include "notimplementedexception.h"
//#include
diff --git a/XInputSimulator/xinputsimulatorimplwin.cpp b/XInputSimulator/xinputsimulatorimplwin.cpp
index e676169..f5550a1 100644
--- a/XInputSimulator/xinputsimulatorimplwin.cpp
+++ b/XInputSimulator/xinputsimulatorimplwin.cpp
@@ -18,8 +18,8 @@
#ifdef _WIN32
+#include "xinputsimulator.h"
#include "xinputsimulatorimplwin.h"
-#include "notimplementedexception.h"
#include
#include