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