From 530be3ff9d30fff73f328a38683e76c26321ed33 Mon Sep 17 00:00:00 2001 From: crs Date: Sun, 11 Apr 2004 14:58:08 +0000 Subject: [PATCH] Updates to support OS X. This improves support for building on multiple systems with automake, with X Windows and Carbon window system APIs supported. It's also a starting port for supporting win32 builds using mingw. OS X support is incomplete; the tree will compile and link but the binaries will not function. --- PORTING | 42 ++- cmd/synergyc/COSXClientTaskBarReceiver.cpp | 56 +++ cmd/synergyc/COSXClientTaskBarReceiver.h | 35 ++ cmd/synergyc/Makefile.am | 52 ++- cmd/synergyc/synergyc.cpp | 33 +- cmd/synergys/COSXServerTaskBarReceiver.cpp | 56 +++ cmd/synergys/COSXServerTaskBarReceiver.h | 35 ++ cmd/synergys/Makefile.am | 54 ++- cmd/synergys/synergys.cpp | 35 +- configure.in | 77 +++- lib/arch/CArch.cpp | 6 +- lib/arch/CArchDaemonUnix.cpp | 3 - lib/arch/CArchFileUnix.cpp | 1 + lib/arch/CArchImpl.cpp | 45 --- lib/arch/CArchNetworkBSD.cpp | 1 + lib/arch/CMultibyte.cpp | 2 +- lib/arch/CMultibyteOS.cpp | 1 + lib/arch/Makefile.am | 110 +++--- lib/arch/vsnprintf.cpp | 4 +- lib/base/CPriorityQueue.h | 2 +- lib/common/BasicTypes.h | 5 +- lib/common/common.h | 73 ++-- lib/platform/COSXClipboard.cpp | 70 ++++ lib/platform/COSXClipboard.h | 36 ++ lib/platform/COSXEventQueueBuffer.cpp | 76 ++++ lib/platform/COSXEventQueueBuffer.h | 40 ++ lib/platform/COSXKeyState.cpp | 294 +++++++++++++++ lib/platform/COSXKeyState.h | 55 +++ lib/platform/COSXScreen.cpp | 407 +++++++++++++++++++++ lib/platform/COSXScreen.h | 110 ++++++ lib/platform/COSXScreenSaver.cpp | 56 +++ lib/platform/COSXScreenSaver.h | 34 ++ lib/platform/CSynergyHook.h | 5 - lib/platform/CXWindowsEventQueueBuffer.cpp | 30 +- lib/platform/CXWindowsScreen.cpp | 18 - lib/platform/Makefile.am | 75 ++-- 36 files changed, 1757 insertions(+), 277 deletions(-) create mode 100644 cmd/synergyc/COSXClientTaskBarReceiver.cpp create mode 100644 cmd/synergyc/COSXClientTaskBarReceiver.h create mode 100644 cmd/synergys/COSXServerTaskBarReceiver.cpp create mode 100644 cmd/synergys/COSXServerTaskBarReceiver.h delete mode 100644 lib/arch/CArchImpl.cpp create mode 100644 lib/platform/COSXClipboard.cpp create mode 100644 lib/platform/COSXClipboard.h create mode 100644 lib/platform/COSXEventQueueBuffer.cpp create mode 100644 lib/platform/COSXEventQueueBuffer.h create mode 100644 lib/platform/COSXKeyState.cpp create mode 100644 lib/platform/COSXKeyState.h create mode 100644 lib/platform/COSXScreen.cpp create mode 100644 lib/platform/COSXScreen.h create mode 100644 lib/platform/COSXScreenSaver.cpp create mode 100644 lib/platform/COSXScreenSaver.h diff --git a/PORTING b/PORTING index a771799d..2e31bbe7 100644 --- a/PORTING +++ b/PORTING @@ -333,16 +333,25 @@ other files. On Unix, synergy uses autoconf/automake which produces a `configure' script that generates makefiles. On Windows, synergy uses Visual C++ workspace and project files. If you're porting to another Unix variant, you may need to adjust `configure.in', -`acinclude.m4', and Unix flavor dependent code in lib/arch. +`acinclude.m4', and Unix flavor dependent code in lib/arch. Note +especially the SYSAPI_* and WINAPI_* macro definitions in +ARCH_CFLAGS. Exactly one of each must be defined. It should also +add AM_CONDITIONALs if a new SYSAPI_* or WINAPI_* was added. Adjusting lib/common/common.h: The lib/common/common.h header file is included directly or indirectly -by every other file. It prepares some platform dependent macros for -integer sizes and defines a macro for conveniently testing which -platform we're building on. That macro is named *_LIKE (e.g. UNIX_LIKE) -and has the value `1'. Exactly one *_LIKE macro must be defined by -common.h. +by every other file. Its primary job is to include config.h, which +defines macros depending on what the 'configure' script discovered +about the system. If the platform does not use the 'configure' script +it must define the appropriate SYSAPI_* and WINAPI_* macro. It may +also do other platform specific setup. + +Adjusting lib/common/BasicTypes.h: + +No changes should be necessary in BasicTypes.h. However, if the +platform's system header files define SInt8, et al. you may need +to adjust the typedefs to match the system's definitions. Implementing lib/arch: @@ -355,6 +364,18 @@ CArchMiscXXX where XXX is the platform name. The class should have only static methods. Clients can include the appropriate header file and make calls directly, surrounded by a suitable #ifdef/#endif. +If using automake, the Makefile.am should list the system specific +files in a XXX_SOURCE_FILES macro where XXX matches the appropriate +AM_CONDITIONAL symbol. XXX_SOURCE_FILES must be added to EXTRA_DIST +and the following added above the INCLUDES macro: + + if XXX + libarch_a_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(XXX_SOURCE_FILES) \ + $(NULL) + endif + Implementing lib/platform: Most of the remaining platform dependent code lives in lib/platform. @@ -381,6 +402,15 @@ classes should be derived and implemented: * CXXXScreenSaver : IScreenSaver Provides screen saver operations. +If using automake, the Makefile.am should list the window system +specific files in a XXX_SOURCE_FILES macro where XXX matches the +appropriate AM_CONDITIONAL symbol. XXX_SOURCE_FILES must be added +to EXTRA_DIST and the following added above the INCLUDES macro: + + if XXX + libplatform_a_SOURCES = $(XXX_SOURCE_FILES) + endif + Tweaks: Finally, each platform typically requires various adjustments here diff --git a/cmd/synergyc/COSXClientTaskBarReceiver.cpp b/cmd/synergyc/COSXClientTaskBarReceiver.cpp new file mode 100644 index 00000000..c380ac4d --- /dev/null +++ b/cmd/synergyc/COSXClientTaskBarReceiver.cpp @@ -0,0 +1,56 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXClientTaskBarReceiver.h" +#include "CArch.h" + +// +// COSXClientTaskBarReceiver +// + +COSXClientTaskBarReceiver::COSXClientTaskBarReceiver( + const CBufferedLogOutputter*) +{ + // add ourself to the task bar + ARCH->addReceiver(this); +} + +COSXClientTaskBarReceiver::~COSXClientTaskBarReceiver() +{ + ARCH->removeReceiver(this); +} + +void +COSXClientTaskBarReceiver::showStatus() +{ + // do nothing +} + +void +COSXClientTaskBarReceiver::runMenu(int, int) +{ + // do nothing +} + +void +COSXClientTaskBarReceiver::primaryAction() +{ + // do nothing +} + +const IArchTaskBarReceiver::Icon +COSXClientTaskBarReceiver::getIcon() const +{ + return NULL; +} diff --git a/cmd/synergyc/COSXClientTaskBarReceiver.h b/cmd/synergyc/COSXClientTaskBarReceiver.h new file mode 100644 index 00000000..59bca97c --- /dev/null +++ b/cmd/synergyc/COSXClientTaskBarReceiver.h @@ -0,0 +1,35 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXCLIENTTASKBARRECEIVER_H +#define COSXCLIENTTASKBARRECEIVER_H + +#include "CClientTaskBarReceiver.h" + +class CBufferedLogOutputter; + +//! Implementation of CClientTaskBarReceiver for OS X +class COSXClientTaskBarReceiver : public CClientTaskBarReceiver { +public: + COSXClientTaskBarReceiver(const CBufferedLogOutputter*); + virtual ~COSXClientTaskBarReceiver(); + + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; +}; + +#endif diff --git a/cmd/synergyc/Makefile.am b/cmd/synergyc/Makefile.am index 950a0072..783472c2 100644 --- a/cmd/synergyc/Makefile.am +++ b/cmd/synergyc/Makefile.am @@ -13,17 +13,36 @@ ## Process this file with automake to produce Makefile.in NULL = -EXTRA_DIST = \ +COMMON_SOURCE_FILES = \ + CClientTaskBarReceiver.cpp \ + CClientTaskBarReceiver.h \ + synergyc.cpp \ + $(NULL) +XWINDOWS_SOURCE_FILES = \ + CXWindowsClientTaskBarReceiver.cpp \ + CXWindowsClientTaskBarReceiver.h \ + $(NULL) +MSWINDOWS_SOURCE_FILES = \ CMSWindowsClientTaskBarReceiver.cpp \ CMSWindowsClientTaskBarReceiver.h \ resource.h \ + synergyc.rc \ + $(NULL) +CARBON_SOURCE_FILES = \ + COSXClientTaskBarReceiver.cpp \ + COSXClientTaskBarReceiver.h \ + $(NULL) + +EXTRA_DIST = \ synergyc.dsp \ synergyc.ico \ - synergyc.rc \ tb_error.ico \ tb_idle.ico \ tb_run.ico \ tb_wait.ico \ + $(XWINDOWS_SOURCE_FILES) \ + $(MSWINDOWS_SOURCE_FILES) \ + $(CARBON_SOURCE_FILES) \ $(NULL) MAINTAINERCLEANFILES = \ @@ -31,13 +50,24 @@ MAINTAINERCLEANFILES = \ $(NULL) bin_PROGRAMS = synergyc -synergyc_SOURCES = \ - CClientTaskBarReceiver.cpp \ - CClientTaskBarReceiver.h \ - CXWindowsClientTaskBarReceiver.cpp \ - CXWindowsClientTaskBarReceiver.h \ - synergyc.cpp \ +if XWINDOWS +synergyc_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(XWINDOWS_SOURCE_FILES) \ $(NULL) +endif +if MSWINDOWS +synergyc_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(MSWINDOWS_SOURCE_FILES) \ + $(NULL) +endif +if CARBON +synergyc_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(CARBON_SOURCE_FILES) \ + $(NULL) +endif synergyc_LDADD = \ $(top_builddir)/lib/client/libclient.a \ $(top_builddir)/lib/platform/libplatform.a \ @@ -48,12 +78,6 @@ synergyc_LDADD = \ $(top_builddir)/lib/base/libbase.a \ $(top_builddir)/lib/common/libcommon.a \ $(top_builddir)/lib/arch/libarch.a \ - $(X_LIBS) \ - $(X_PRE_LIBS) \ - -lXtst \ - -lXext \ - -lX11 \ - $(X_EXTRA_LIBS) \ $(NULL) INCLUDES = \ -I$(top_srcdir)/lib/common \ diff --git a/cmd/synergyc/synergyc.cpp b/cmd/synergyc/synergyc.cpp index 9e7be5ab..a10601fd 100644 --- a/cmd/synergyc/synergyc.cpp +++ b/cmd/synergyc/synergyc.cpp @@ -34,7 +34,7 @@ #include #define DAEMON_RUNNING(running_) -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS #include "CArchMiscWindows.h" #include "CMSWindowsScreen.h" #include "CMSWindowsUtil.h" @@ -42,22 +42,25 @@ #include "resource.h" #undef DAEMON_RUNNING #define DAEMON_RUNNING(running_) CArchMiscWindows::daemonRunning(running_) -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS #include "CXWindowsScreen.h" #include "CXWindowsClientTaskBarReceiver.h" +#elif WINAPI_CARBON +#include "COSXScreen.h" +#include "COSXClientTaskBarReceiver.h" #endif // platform dependent name of a daemon -#if WINDOWS_LIKE +#if SYSAPI_WIN32 #define DAEMON_NAME "Synergy Client" -#elif UNIX_LIKE +#elif SYSAPI_UNIX #define DAEMON_NAME "synergyc" #endif typedef int (*StartupFunc)(int, char**); static bool startClient(); static void parse(int argc, const char* const* argv); -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS static void handleSystemSuspend(void*); static void handleSystemResume(void*); #endif @@ -102,12 +105,14 @@ static CScreen* createScreen() { -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS return new CScreen(new CMSWindowsScreen(false, new CFunctionJob(&handleSystemSuspend), new CFunctionJob(&handleSystemResume))); -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS return new CScreen(new CXWindowsScreen(false)); +#elif WINAPI_CARBON + return new CScreen(new COSXScreen(false)); #endif } @@ -115,11 +120,13 @@ static CClientTaskBarReceiver* createTaskBarReceiver(const CBufferedLogOutputter* logBuffer) { -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS return new CMSWindowsClientTaskBarReceiver( CMSWindowsScreen::getInstance(), logBuffer); -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS return new CXWindowsClientTaskBarReceiver(logBuffer); +#elif WINAPI_CARBON + return new COSXClientTaskBarReceiver(logBuffer); #endif } @@ -190,7 +197,7 @@ handleScreenError(const CEvent&, void*) EVENTQUEUE->addEvent(CEvent(CEvent::kQuit)); } -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS static void handleSystemSuspend(void*) @@ -676,7 +683,7 @@ parse(int argc, const char* const* argv) // increase default filter level for daemon. the user must // explicitly request another level for a daemon. if (ARG->m_daemon && ARG->m_logFilter == NULL) { -#if WINDOWS_LIKE +#if SYSAPI_WIN32 if (CArchMiscWindows::isWindows95Family()) { // windows 95 has no place for logging so avoid showing // the log console window. @@ -702,7 +709,7 @@ parse(int argc, const char* const* argv) // platform dependent entry points // -#if WINDOWS_LIKE +#if SYSAPI_WIN32 static bool s_hasImportantLogMessages = false; @@ -825,7 +832,7 @@ WinMain(HINSTANCE instance, HINSTANCE, LPSTR, int) } } -#elif UNIX_LIKE +#elif SYSAPI_UNIX int main(int argc, char** argv) diff --git a/cmd/synergys/COSXServerTaskBarReceiver.cpp b/cmd/synergys/COSXServerTaskBarReceiver.cpp new file mode 100644 index 00000000..8195b84f --- /dev/null +++ b/cmd/synergys/COSXServerTaskBarReceiver.cpp @@ -0,0 +1,56 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXServerTaskBarReceiver.h" +#include "CArch.h" + +// +// COSXServerTaskBarReceiver +// + +COSXServerTaskBarReceiver::COSXServerTaskBarReceiver( + const CBufferedLogOutputter*) +{ + // add ourself to the task bar + ARCH->addReceiver(this); +} + +COSXServerTaskBarReceiver::~COSXServerTaskBarReceiver() +{ + ARCH->removeReceiver(this); +} + +void +COSXServerTaskBarReceiver::showStatus() +{ + // do nothing +} + +void +COSXServerTaskBarReceiver::runMenu(int, int) +{ + // do nothing +} + +void +COSXServerTaskBarReceiver::primaryAction() +{ + // do nothing +} + +const IArchTaskBarReceiver::Icon +COSXServerTaskBarReceiver::getIcon() const +{ + return NULL; +} diff --git a/cmd/synergys/COSXServerTaskBarReceiver.h b/cmd/synergys/COSXServerTaskBarReceiver.h new file mode 100644 index 00000000..7f6dc298 --- /dev/null +++ b/cmd/synergys/COSXServerTaskBarReceiver.h @@ -0,0 +1,35 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXSERVERTASKBARRECEIVER_H +#define COSXSERVERTASKBARRECEIVER_H + +#include "CServerTaskBarReceiver.h" + +class CBufferedLogOutputter; + +//! Implementation of CServerTaskBarReceiver for OS X +class COSXServerTaskBarReceiver : public CServerTaskBarReceiver { +public: + COSXServerTaskBarReceiver(const CBufferedLogOutputter*); + virtual ~COSXServerTaskBarReceiver(); + + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; +}; + +#endif diff --git a/cmd/synergys/Makefile.am b/cmd/synergys/Makefile.am index 1a45c95f..c45e6b4f 100644 --- a/cmd/synergys/Makefile.am +++ b/cmd/synergys/Makefile.am @@ -13,17 +13,36 @@ ## Process this file with automake to produce Makefile.in NULL = -EXTRA_DIST = \ +COMMON_SOURCE_FILES = \ + CServerTaskBarReceiver.cpp \ + CServerTaskBarReceiver.h \ + synergys.cpp \ + $(NULL) +XWINDOWS_SOURCE_FILES = \ + CXWindowsServerTaskBarReceiver.cpp \ + CXWindowsServerTaskBarReceiver.h \ + $(NULL) +MSWINDOWS_SOURCE_FILES = \ CMSWindowsServerTaskBarReceiver.cpp \ CMSWindowsServerTaskBarReceiver.h \ resource.h \ - synergys.ico \ - synergys.dsp \ synergys.rc \ + $(NULL) +CARBON_SOURCE_FILES = \ + COSXServerTaskBarReceiver.cpp \ + COSXServerTaskBarReceiver.h \ + $(NULL) + +EXTRA_DIST = \ + synergys.dsp \ + synergys.ico \ tb_error.ico \ tb_idle.ico \ tb_run.ico \ tb_wait.ico \ + $(XWINDOWS_SOURCE_FILES) \ + $(MSWINDOWS_SOURCE_FILES) \ + $(CARBON_SOURCE_FILES) \ $(NULL) MAINTAINERCLEANFILES = \ @@ -31,13 +50,24 @@ MAINTAINERCLEANFILES = \ $(NULL) bin_PROGRAMS = synergys -synergys_SOURCES = \ - CServerTaskBarReceiver.cpp \ - CServerTaskBarReceiver.h \ - CXWindowsServerTaskBarReceiver.cpp \ - CXWindowsServerTaskBarReceiver.h \ - synergys.cpp \ +if XWINDOWS +synergys_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(XWINDOWS_SOURCE_FILES) \ $(NULL) +endif +if MSWINDOWS +synergys_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(MSWINDOWS_SOURCE_FILES) \ + $(NULL) +endif +if CARBON +synergys_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(CARBON_SOURCE_FILES) \ + $(NULL) +endif synergys_LDADD = \ $(top_builddir)/lib/server/libserver.a \ $(top_builddir)/lib/platform/libplatform.a \ @@ -48,12 +78,6 @@ synergys_LDADD = \ $(top_builddir)/lib/base/libbase.a \ $(top_builddir)/lib/common/libcommon.a \ $(top_builddir)/lib/arch/libarch.a \ - $(X_LIBS) \ - $(X_PRE_LIBS) \ - -lXtst \ - -lXext \ - -lX11 \ - $(X_EXTRA_LIBS) \ $(NULL) INCLUDES = \ -I$(top_srcdir)/lib/common \ diff --git a/cmd/synergys/synergys.cpp b/cmd/synergys/synergys.cpp index b1cdaed5..49aca596 100644 --- a/cmd/synergys/synergys.cpp +++ b/cmd/synergys/synergys.cpp @@ -37,7 +37,7 @@ #include #define DAEMON_RUNNING(running_) -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS #include "CArchMiscWindows.h" #include "CMSWindowsScreen.h" #include "CMSWindowsUtil.h" @@ -45,23 +45,26 @@ #include "resource.h" #undef DAEMON_RUNNING #define DAEMON_RUNNING(running_) CArchMiscWindows::daemonRunning(running_) -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS #include "CXWindowsScreen.h" #include "CXWindowsServerTaskBarReceiver.h" +#elif WINAPI_CARBON +#include "COSXScreen.h" +#include "COSXServerTaskBarReceiver.h" #endif // platform dependent name of a daemon -#if WINDOWS_LIKE +#if SYSAPI_WIN32 #define DAEMON_NAME "Synergy Server" -#elif UNIX_LIKE +#elif SYSAPI_UNIX #define DAEMON_NAME "synergys" #endif // configuration file name -#if WINDOWS_LIKE +#if SYSAPI_WIN32 #define USR_CONFIG_NAME "synergy.sgc" #define SYS_CONFIG_NAME "synergy.sgc" -#elif UNIX_LIKE +#elif SYSAPI_UNIX #define USR_CONFIG_NAME ".synergy.conf" #define SYS_CONFIG_NAME "synergy.conf" #endif @@ -113,10 +116,12 @@ static CScreen* createScreen() { -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS return new CScreen(new CMSWindowsScreen(true, NULL, NULL)); -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS return new CScreen(new CXWindowsScreen(true)); +#elif WINAPI_CARBON + return new CScreen(new COSXScreen(true)); #endif } @@ -124,11 +129,13 @@ static CServerTaskBarReceiver* createTaskBarReceiver(const CBufferedLogOutputter* logBuffer) { -#if WINDOWS_LIKE +#if WINAPI_MSWINDOWS return new CMSWindowsServerTaskBarReceiver( CMSWindowsScreen::getInstance(), logBuffer); -#elif UNIX_LIKE +#elif WINAPI_XWINDOWS return new CXWindowsServerTaskBarReceiver(logBuffer); +#elif WINAPI_CARBON + return new COSXServerTaskBarReceiver(logBuffer); #endif } @@ -579,7 +586,7 @@ static void help() { -#if WINDOWS_LIKE +#if SYSAPI_WIN32 # define PLATFORM_ARGS \ " {--daemon|--no-daemon}" @@ -778,7 +785,7 @@ parse(int argc, const char* const* argv) // increase default filter level for daemon. the user must // explicitly request another level for a daemon. if (ARG->m_daemon && ARG->m_logFilter == NULL) { -#if WINDOWS_LIKE +#if SYSAPI_WIN32 if (CArchMiscWindows::isWindows95Family()) { // windows 95 has no place for logging so avoid showing // the log console window. @@ -870,7 +877,7 @@ loadConfig() // platform dependent entry points // -#if WINDOWS_LIKE +#if SYSAPI_WIN32 static bool s_hasImportantLogMessages = false; @@ -994,7 +1001,7 @@ WinMain(HINSTANCE instance, HINSTANCE, LPSTR, int) } } -#elif UNIX_LIKE +#elif SYSAPI_UNIX int main(int argc, char** argv) diff --git a/configure.in b/configure.in index ea209543..242d6ca3 100644 --- a/configure.in +++ b/configure.in @@ -27,6 +27,33 @@ AM_CONFIG_HEADER(config.h) dnl information on the package +dnl decide on platform +ARCH_LIBS="" +ARCH_CFLAGS="" +AC_CANONICAL_HOST +case $host in + *-*-windows*) + acx_host_arch="WIN32" + acx_host_winapi="MSWINDOWS" + ARCH_CFLAGS="$ARCH_CFLAGS -DSYSAPI_WIN32=1 -DWINAPI_MSWINDOWS=1" + ;; + *-*-darwin*) + acx_host_arch="UNIX" + acx_host_winapi="CARBON" + ARCH_CFLAGS="$ARCH_CFLAGS -DSYSAPI_UNIX=1 -DWINAPI_CARBON=1" + ;; + *) + acx_host_arch="UNIX" + acx_host_winapi="XWINDOWS" + ARCH_CFLAGS="$ARCH_CFLAGS -DSYSAPI_UNIX=1 -DWINAPI_XWINDOWS=1" + ;; +esac +AM_CONDITIONAL(WIN32, test x$acx_host_arch = xWIN32) +AM_CONDITIONAL(UNIX, test x$acx_host_arch = xUNIX) +AM_CONDITIONAL(MSWINDOWS, test x$acx_host_winapi = xMSWINDOWS) +AM_CONDITIONAL(CARBON, test x$acx_host_winapi = xCARBON) +AM_CONDITIONAL(XWINDOWS, test x$acx_host_winapi = xXWINDOWS) + dnl checks for programs AC_PROG_CXX AC_PROG_RANLIB @@ -45,7 +72,14 @@ dnl macros we should do testing with CXXFLAGS="$CXXFLAGS -D_BSD_SOURCE -D_XOPEN_SOURCE=500" dnl checks for libraries -ACX_PTHREAD(,AC_MSG_ERROR(You must have pthreads to compile synergy)) +if test x"$acx_host_arch" = xUNIX; then + ACX_PTHREAD(,AC_MSG_ERROR(You must have pthreads to compile synergy)) + ARCH_LIBS="$PTHREAD_LIBS $ARCH_LIBS" + ARCH_CFLAGS="$ARCH_CFLAGS $PTHREAD_CFLAGS" +fi +if test x"$acx_host_winapi" = xCARBON; then + ARCH_LIBS="-framework Carbon $ARCH_LIBS" +fi ACX_CHECK_NANOSLEEP ACX_CHECK_INET_ATON @@ -55,14 +89,33 @@ AC_CHECK_HEADERS([unistd.h sys/time.h sys/types.h wchar.h]) AC_CHECK_HEADERS([sys/socket.h sys/select.h]) AC_CHECK_HEADERS([istream ostream sstream]) AC_HEADER_TIME -AC_PATH_X -AC_PATH_XTRA -save_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$X_CFLAGS $CPPFLAGS" -AC_CHECK_HEADERS([X11/extensions/XTest.h]) -AC_CHECK_LIB(Xinerama, XineramaQueryExtension, AC_CHECK_HEADERS([X11/extensions/Xinerama.h]) [X_LIBS="$X_LIBS -lXinerama"], , [$X_LIBS -lXext -lX11 $X_EXTRA_LIBS]) -AC_CHECK_LIB(Xext, DPMSQueryExtension, AC_CHECK_HEADERS([X11/extensions/dpms.h]) [X_LIBS="$X_LIBS -lXext"], , [$X_LIBS -lX11 $X_EXTRA_LIBS]) -CPPFLAGS="$save_CPPFLAGS" +if test x"$acx_host_winapi" = xXWINDOWS; then + AC_PATH_X + AC_PATH_XTRA + save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$X_CFLAGS $CPPFLAGS" + AC_CHECK_LIB(Xtst, + XTestQueryExtension, + AC_CHECK_HEADERS([X11/extensions/XTest.h], + [X_LIBS="$X_LIBS -lXtst"], + AC_MSG_ERROR(Your must have the XTest headers to compile synergy)), + AC_MSG_ERROR(You must have the XTest library to build synergy), + [$X_LIBS -lXext -lX11 $X_EXTRA_LIBS]) + AC_CHECK_LIB(Xinerama, + XineramaQueryExtension, + AC_CHECK_HEADERS([X11/extensions/Xinerama.h], + [X_LIBS="$X_LIBS -lXinerama"]), + , + [$X_LIBS -lXext -lX11 $X_EXTRA_LIBS]) + AC_CHECK_LIB(Xext, + DPMSQueryExtension, + AC_CHECK_HEADERS([X11/extensions/dpms.h]), + , + [$X_LIBS -lX11 $X_EXTRA_LIBS]) + CPPFLAGS="$save_CPPFLAGS" + ARCH_LIBS="$X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS $ARCH_LIBS" + ARCH_CFLAGS="$ARCH_CFLAGS $X_CFLAGS" +fi dnl checks for types AC_TYPE_SIZE_T @@ -100,9 +153,9 @@ dnl enable maximum compiler warnings and warnings are errors. ACX_CXX_WARNINGS ACX_CXX_WARNINGS_ARE_ERRORS -dnl adjust variables for X11 and pthreads -CXXFLAGS="$CXXFLAGS $SYNERGY_CXXFLAGS $X_CFLAGS $PTHREAD_CFLAGS" -LIBS="$NANOSLEEP_LIBS $INET_ATON_LIBS $PTHREAD_LIBS $LIBS" +dnl adjust compiler and linker variables +CXXFLAGS="$CXXFLAGS $SYNERGY_CXXFLAGS $ARCH_CFLAGS" +LIBS="$NANOSLEEP_LIBS $INET_ATON_LIBS $ARCH_LIBS $LIBS" AC_OUTPUT([ Makefile diff --git a/lib/arch/CArch.cpp b/lib/arch/CArch.cpp index 88f2eda4..943cbbb6 100644 --- a/lib/arch/CArch.cpp +++ b/lib/arch/CArch.cpp @@ -27,7 +27,7 @@ #undef ARCH_TIME // include appropriate architecture implementation -#if WINDOWS_LIKE +#if SYSAPI_WIN32 # include "CArchConsoleWindows.h" # include "CArchDaemonWindows.h" # include "CArchFileWindows.h" @@ -39,7 +39,7 @@ # include "CArchStringWindows.h" # include "CArchTaskBarWindows.h" # include "CArchTimeWindows.h" -#elif UNIX_LIKE +#elif SYSAPI_UNIX # include "CArchConsoleUnix.h" # include "CArchDaemonUnix.h" # include "CArchFileUnix.h" @@ -118,7 +118,7 @@ CArch::CArch(ARCH_ARGS* args) m_daemon = new ARCH_DAEMON; m_taskbar = new ARCH_TASKBAR(args); -#if WINDOWS_LIKE +#if SYSAPI_WIN32 CArchMiscWindows::init(); #endif } diff --git a/lib/arch/CArchDaemonUnix.cpp b/lib/arch/CArchDaemonUnix.cpp index 748780db..93d50d4d 100644 --- a/lib/arch/CArchDaemonUnix.cpp +++ b/lib/arch/CArchDaemonUnix.cpp @@ -20,9 +20,6 @@ #include #include -// we derive from CArchDaemonNone -#include "CArchDaemonNone.cpp" - // // CArchDaemonUnix // diff --git a/lib/arch/CArchFileUnix.cpp b/lib/arch/CArchFileUnix.cpp index dc4cc3b8..4048061f 100644 --- a/lib/arch/CArchFileUnix.cpp +++ b/lib/arch/CArchFileUnix.cpp @@ -13,6 +13,7 @@ */ #include "CArchFileUnix.h" +#include #include #include #include diff --git a/lib/arch/CArchImpl.cpp b/lib/arch/CArchImpl.cpp deleted file mode 100644 index 9e57d0a7..00000000 --- a/lib/arch/CArchImpl.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * synergy -- mouse and keyboard sharing utility - * Copyright (C) 2002 Chris Schoeneman - * - * 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 COPYING 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. - */ - -#include "common.h" - -// include appropriate architecture implementation -#if WINDOWS_LIKE -# include "CArchMiscWindows.cpp" -# include "CArchConsoleWindows.cpp" -# include "CArchDaemonWindows.cpp" -# include "CArchFileWindows.cpp" -# include "CArchLogWindows.cpp" -# include "CArchMultithreadWindows.cpp" -# include "CArchNetworkWinsock.cpp" -# include "CArchSleepWindows.cpp" -# include "CArchStringWindows.cpp" -# include "CArchTaskBarWindows.cpp" -# include "CArchTimeWindows.cpp" -# include "XArchWindows.cpp" -#elif UNIX_LIKE -# include "CArchConsoleUnix.cpp" -# include "CArchDaemonUnix.cpp" -# include "CArchFileUnix.cpp" -# include "CArchLogUnix.cpp" -# if HAVE_PTHREAD -# include "CArchMultithreadPosix.cpp" -# endif -# include "CArchNetworkBSD.cpp" -# include "CArchSleepUnix.cpp" -# include "CArchStringUnix.cpp" -# include "CArchTaskBarXWindows.cpp" -# include "CArchTimeUnix.cpp" -# include "XArchUnix.cpp" -#endif diff --git a/lib/arch/CArchNetworkBSD.cpp b/lib/arch/CArchNetworkBSD.cpp index fa7f7ebe..d8845801 100644 --- a/lib/arch/CArchNetworkBSD.cpp +++ b/lib/arch/CArchNetworkBSD.cpp @@ -14,6 +14,7 @@ #include "CArchNetworkBSD.h" #include "CArch.h" +#include "CArchMultithreadPosix.h" #include "XArchUnix.h" #if HAVE_SYS_TYPES_H # include diff --git a/lib/arch/CMultibyte.cpp b/lib/arch/CMultibyte.cpp index 43b8b41f..9f318570 100644 --- a/lib/arch/CMultibyte.cpp +++ b/lib/arch/CMultibyte.cpp @@ -17,7 +17,7 @@ #include "common.h" -#if (HAVE_MBSINIT && HAVE_MBRTOWC && HAVE_WCRTOMB) || WINDOWS_LIKE +#if (HAVE_MBSINIT && HAVE_MBRTOWC && HAVE_WCRTOMB) || SYSAPI_WIN32 #include "CMultibyteOS.cpp" #else #include "CMultibyteEmu.cpp" diff --git a/lib/arch/CMultibyteOS.cpp b/lib/arch/CMultibyteOS.cpp index 49a85229..57f4fd22 100644 --- a/lib/arch/CMultibyteOS.cpp +++ b/lib/arch/CMultibyteOS.cpp @@ -14,6 +14,7 @@ #include #include +#include class CArchMBStateImpl { public: diff --git a/lib/arch/Makefile.am b/lib/arch/Makefile.am index 47888ade..d1a43f04 100644 --- a/lib/arch/Makefile.am +++ b/lib/arch/Makefile.am @@ -13,8 +13,50 @@ ## Process this file with automake to produce Makefile.in NULL = -EXTRA_DIST = \ - arch.dsp \ +COMMON_SOURCE_FILES = \ + CArch.cpp \ + CArchDaemonNone.cpp \ + CArchDaemonNone.h \ + XArch.cpp \ + CArch.h \ + IArchConsole.h \ + IArchDaemon.h \ + IArchFile.h \ + IArchLog.h \ + IArchMultithread.h \ + IArchNetwork.h \ + IArchSleep.h \ + IArchString.h \ + IArchTaskBar.h \ + IArchTaskBarReceiver.h \ + IArchTime.h \ + XArch.h \ + $(NULL) +UNIX_SOURCE_FILES = \ + CArchConsoleUnix.cpp \ + CArchDaemonUnix.cpp \ + CArchFileUnix.cpp \ + CArchLogUnix.cpp \ + CArchMultithreadPosix.cpp \ + CArchNetworkBSD.cpp \ + CArchSleepUnix.cpp \ + CArchStringUnix.cpp \ + CArchTaskBarXWindows.cpp \ + CArchTimeUnix.cpp \ + XArchUnix.cpp \ + CArchConsoleUnix.h \ + CArchDaemonUnix.h \ + CArchFileUnix.h \ + CArchLogUnix.h \ + CArchMultithreadPosix.h \ + CArchNetworkBSD.h \ + CArchSleepUnix.h \ + CArchStringUnix.h \ + CArchTaskBarXWindows.h \ + CArchTimeUnix.h \ + XArchUnix.h \ + $(NULL) +WIN32_SOURCE_FILES = \ CArchConsoleWindows.cpp \ CArchDaemonWindows.cpp \ CArchFileWindows.cpp \ @@ -41,59 +83,33 @@ EXTRA_DIST = \ XArchWindows.h \ $(NULL) +EXTRA_DIST = \ + arch.dsp \ + CMultibyte.cpp \ + CMultibyteEmu.cpp \ + CMultibyteOS.cpp \ + vsnprintf.cpp \ + $(UNIX_SOURCE_FILES) \ + $(WIN32_SOURCE_FILES) \ + $(NULL) + MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) noinst_LIBRARIES = libarch.a +if UNIX libarch_a_SOURCES = \ - CArch.cpp \ - CArchImpl.cpp \ - XArch.cpp \ - CArch.h \ - IArchConsole.h \ - IArchDaemon.h \ - IArchFile.h \ - IArchLog.h \ - IArchMultithread.h \ - IArchNetwork.h \ - IArchSleep.h \ - IArchString.h \ - IArchTaskBar.h \ - IArchTaskBarReceiver.h \ - IArchTime.h \ - XArch.h \ + $(COMMON_SOURCE_FILES) \ + $(UNIX_SOURCE_FILES) \ $(NULL) -EXTRA_libarch_a_SOURCES = \ - CArchConsoleUnix.cpp \ - CArchDaemonNone.cpp \ - CArchDaemonUnix.cpp \ - CArchFileUnix.cpp \ - CArchLogUnix.cpp \ - CArchMultithreadPosix.cpp \ - CArchNetworkBSD.cpp \ - CArchSleepUnix.cpp \ - CArchStringUnix.cpp \ - CArchTaskBarXWindows.cpp \ - CArchTimeUnix.cpp \ - CMultibyte.cpp \ - CMultibyteOS.cpp \ - CMultibyteEmu.cpp \ - XArchUnix.cpp \ - vsnprintf.cpp \ - CArchConsoleUnix.h \ - CArchDaemonNone.h \ - CArchDaemonUnix.h \ - CArchFileUnix.h \ - CArchLogUnix.h \ - CArchMultithreadPosix.h \ - CArchNetworkBSD.h \ - CArchSleepUnix.h \ - CArchStringUnix.h \ - CArchTaskBarXWindows.h \ - CArchTimeUnix.h \ - XArchUnix.h \ +endif +if WIN32 +libarch_a_SOURCES = \ + $(COMMON_SOURCE_FILES) \ + $(WIN32_SOURCE_FILES) \ $(NULL) +endif INCLUDES = \ -I$(top_srcdir)/lib/common \ $(NULL) diff --git a/lib/arch/vsnprintf.cpp b/lib/arch/vsnprintf.cpp index 62ccd771..10800ec7 100644 --- a/lib/arch/vsnprintf.cpp +++ b/lib/arch/vsnprintf.cpp @@ -28,7 +28,7 @@ ARCH_STRING::vsnprintf(char* str, int size, const char* fmt, va_list ap) return n; } -#elif UNIX_LIKE // !HAVE_VSNPRINTF +#elif SYSAPI_UNIX // !HAVE_VSNPRINTF #include @@ -54,7 +54,7 @@ ARCH_STRING::vsnprintf(char* str, int size, const char* fmt, va_list ap) } } -#else // !HAVE_VSNPRINTF && !UNIX_LIKE +#else // !HAVE_VSNPRINTF && !SYSAPI_UNIX #error vsnprintf not implemented diff --git a/lib/base/CPriorityQueue.h b/lib/base/CPriorityQueue.h index 8a7fd7e7..29129e31 100644 --- a/lib/base/CPriorityQueue.h +++ b/lib/base/CPriorityQueue.h @@ -26,7 +26,7 @@ it sorts by std::greater, it has a forward iterator through the elements (which can appear in any order), and its contents can be swapped. */ template , -#if WINDOWS_LIKE +#if defined(_MSC_VER) class Compare = std::greater > #else class Compare = std::greater > diff --git a/lib/common/BasicTypes.h b/lib/common/BasicTypes.h index c7176637..b9d8293e 100644 --- a/lib/common/BasicTypes.h +++ b/lib/common/BasicTypes.h @@ -36,7 +36,8 @@ #endif #if !defined(TYPE_OF_SIZE_4) -# if SIZEOF_INT == 4 + // Carbon defines SInt32 and UInt32 in terms of long +# if SIZEOF_INT == 4 && !defined(__APPLE__) # define TYPE_OF_SIZE_4 int # else # define TYPE_OF_SIZE_4 long @@ -83,5 +84,3 @@ typedef unsigned TYPE_OF_SIZE_4 UInt32; #undef TYPE_OF_SIZE_4 #endif - - diff --git a/lib/common/common.h b/lib/common/common.h index 74b8f1d9..d7963e94 100644 --- a/lib/common/common.h +++ b/lib/common/common.h @@ -19,48 +19,51 @@ #if HAVE_CONFIG_H # include "config.h" +#else + // we may not have run configure on win32 +# if defined(_WIN32) +# define SYSAPI_WIN32 1 +# define WINAPI_MSWINDOWS 1 +# endif #endif -// check if win32 platform -#if defined(_WIN32) -# define WINDOWS_LIKE 1 +// VC++ specific +#if (_MSC_VER >= 1200) + // work around for statement scoping bug +# define for if (false) { } else for - // VC++ specific -# if (_MSC_VER >= 1200) - // work around for statement scoping bug -# define for if (false) { } else for + // turn off bonehead warnings +# pragma warning(disable: 4786) // identifier truncated in debug info +# pragma warning(disable: 4514) // unreferenced inline function removed - // turn off bonehead warnings -# pragma warning(disable: 4786) // identifier truncated in debug info -# pragma warning(disable: 4514) // unreferenced inline function removed + // this one's a little too aggressive +# pragma warning(disable: 4127) // conditional expression is constant - // this one's a little too aggressive -# pragma warning(disable: 4127) // conditional expression is constant - - // emitted incorrectly under release build in some circumstances -# if defined(NDEBUG) -# pragma warning(disable: 4702) // unreachable code -# pragma warning(disable: 4701) // variable maybe used uninitialized -# endif - -# endif // (_MSC_VER >= 1200) - - // VC++ has built-in sized types -# if defined(_MSC_VER) -# define TYPE_OF_SIZE_1 __int8 -# define TYPE_OF_SIZE_2 __int16 -# define TYPE_OF_SIZE_4 __int32 -# else -# define SIZE_OF_CHAR 1 -# define SIZE_OF_SHORT 2 -# define SIZE_OF_INT 4 -# define SIZE_OF_LONG 4 + // emitted incorrectly under release build in some circumstances +# if defined(NDEBUG) +# pragma warning(disable: 4702) // unreachable code +# pragma warning(disable: 4701) // variable maybe used uninitialized # endif -#endif // defined(_WIN32) +#endif // (_MSC_VER >= 1200) -// unix-like if not like anything else -#if (!defined(WINDOWS_LIKE) || WINDOWS_LIKE == 0) -# define UNIX_LIKE 1 +// VC++ has built-in sized types +#if defined(_MSC_VER) +# define TYPE_OF_SIZE_1 __int8 +# define TYPE_OF_SIZE_2 __int16 +# define TYPE_OF_SIZE_4 __int32 +#else +# define SIZE_OF_CHAR 1 +# define SIZE_OF_SHORT 2 +# define SIZE_OF_INT 4 +# define SIZE_OF_LONG 4 +#endif + +// FIXME -- including fp.h from Carbon.h causes a undefined symbol error +// on my build system. the symbol is scalb. since we don't need any +// math functions we define __FP__, the include guard macro for fp.h, to +// prevent fp.h from being included. +#if defined(__APPLE__) +#define __FP__ #endif // define NULL diff --git a/lib/platform/COSXClipboard.cpp b/lib/platform/COSXClipboard.cpp new file mode 100644 index 00000000..8c0071f6 --- /dev/null +++ b/lib/platform/COSXClipboard.cpp @@ -0,0 +1,70 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXClipboard.h" +#include + +// FIXME -- implement this + +// +// COSXClipboard +// + +COSXClipboard::COSXClipboard() +{ +} + +COSXClipboard::~COSXClipboard() +{ +} + +bool +COSXClipboard::empty() +{ + return true; +} + +void +COSXClipboard::add(EFormat, const CString&) +{ +} + +bool +COSXClipboard::open(Time) const +{ + return false; +} + +void +COSXClipboard::close() const +{ +} + +IClipboard::Time +COSXClipboard::getTime() const +{ + return 0; +} + +bool +COSXClipboard::has(EFormat) const +{ + return false; +} + +CString +COSXClipboard::get(EFormat) const +{ + return ""; +} diff --git a/lib/platform/COSXClipboard.h b/lib/platform/COSXClipboard.h new file mode 100644 index 00000000..8b6382d8 --- /dev/null +++ b/lib/platform/COSXClipboard.h @@ -0,0 +1,36 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXCLIPBOARD_H +#define COSXCLIPBOARD_H + +#include "IClipboard.h" + +//! OS X clipboard implementation +class COSXClipboard : public IClipboard { +public: + COSXClipboard(); + virtual ~COSXClipboard(); + + // IClipboard overrides + virtual bool empty(); + virtual void add(EFormat, const CString& data); + virtual bool open(Time) const; + virtual void close() const; + virtual Time getTime() const; + virtual bool has(EFormat) const; + virtual CString get(EFormat) const; +}; + +#endif diff --git a/lib/platform/COSXEventQueueBuffer.cpp b/lib/platform/COSXEventQueueBuffer.cpp new file mode 100644 index 00000000..b373f63a --- /dev/null +++ b/lib/platform/COSXEventQueueBuffer.cpp @@ -0,0 +1,76 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXEventQueueBuffer.h" + +// +// COSXEventQueueBuffer +// + +COSXEventQueueBuffer::COSXEventQueueBuffer() +{ + // FIXME +} + +COSXEventQueueBuffer::~COSXEventQueueBuffer() +{ + // FIXME +} + +void +COSXEventQueueBuffer::waitForEvent(double timeout) +{ + EventRef event; + ReceiveNextEvent(0, NULL, timeout, false, &event); +} + +IEventQueueBuffer::Type +COSXEventQueueBuffer::getEvent(CEvent& event, UInt32& dataID) +{ + // FIXME + (void)event; + (void)dataID; + return kNone; +} + +bool +COSXEventQueueBuffer::addEvent(UInt32 dataID) +{ + // FIXME + (void)dataID; + return false; +} + +bool +COSXEventQueueBuffer::isEmpty() const +{ + EventRef event; + OSStatus status = ReceiveNextEvent(0, NULL, 0.0, false, &event); + return (status != eventLoopTimedOutErr); +} + +CEventQueueTimer* +COSXEventQueueBuffer::newTimer(double duration, bool oneShot) const +{ + // FIXME + (void)duration; + (void)oneShot; + return NULL; +} + +void +COSXEventQueueBuffer::deleteTimer(CEventQueueTimer*) const +{ + // FIXME +} diff --git a/lib/platform/COSXEventQueueBuffer.h b/lib/platform/COSXEventQueueBuffer.h new file mode 100644 index 00000000..215b018c --- /dev/null +++ b/lib/platform/COSXEventQueueBuffer.h @@ -0,0 +1,40 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXEVENTQUEUEBUFFER_H +#define COSXEVENTQUEUEBUFFER_H + +#include "IEventQueueBuffer.h" +#include + +//! Event queue buffer for OS X +class COSXEventQueueBuffer : public IEventQueueBuffer { +public: + COSXEventQueueBuffer(); + virtual ~COSXEventQueueBuffer(); + + // IEventQueueBuffer overrides + virtual void waitForEvent(double timeout); + virtual Type getEvent(CEvent& event, UInt32& dataID); + virtual bool addEvent(UInt32 dataID); + virtual bool isEmpty() const; + virtual CEventQueueTimer* + newTimer(double duration, bool oneShot) const; + virtual void deleteTimer(CEventQueueTimer*) const; + +private: + // FIXME +}; + +#endif diff --git a/lib/platform/COSXKeyState.cpp b/lib/platform/COSXKeyState.cpp new file mode 100644 index 00000000..ec454ace --- /dev/null +++ b/lib/platform/COSXKeyState.cpp @@ -0,0 +1,294 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXKeyState.h" +#include "CLog.h" + +struct CKeyEntry { +public: + KeyID m_keyID; + KeyButton m_button; +}; +static const CKeyEntry s_keys[] = { + /* ASCII */ + { ' ', 49 }, + { '!', 18 }, + { '\"', 39 }, + { '#', 20 }, + { '$', 21 }, + { '%', 23 }, + { '&', 26 }, + { '\'', 39 }, + { '(', 25 }, + { ')', 29 }, + { '*', 28 }, + { '+', 24 }, + { ',', 43 }, + { '-', 27 }, + { '.', 47 }, + { '/', 44 }, + { '0', 29 }, + { '1', 18 }, + { '2', 19 }, + { '3', 20 }, + { '4', 21 }, + { '5', 23 }, + { '6', 22 }, + { '7', 26 }, + { '8', 28 }, + { '9', 25 }, + { ':', 41 }, + { ';', 41 }, + { '<', 43 }, + { '=', 24 }, + { '>', 47 }, + { '?', 44 }, + { '@', 19 }, + { 'A', 0 }, + { 'B', 11 }, + { 'C', 8 }, + { 'D', 2 }, + { 'E', 14 }, + { 'F', 3 }, + { 'G', 5 }, + { 'H', 4 }, + { 'I', 34 }, + { 'J', 38 }, + { 'K', 40 }, + { 'L', 37 }, + { 'M', 46 }, + { 'N', 45 }, + { 'O', 31 }, + { 'P', 35 }, + { 'Q', 12 }, + { 'R', 15 }, + { 'S', 1 }, + { 'T', 17 }, + { 'U', 32 }, + { 'V', 9 }, + { 'W', 13 }, + { 'X', 7 }, + { 'Y', 16 }, + { 'Z', 6 }, + { '[', 33 }, + { '\\', 42 }, + { ']', 30 }, + { '^', 22 }, + { '_', 27 }, + { '`', 50 }, + { 'a', 0 }, + { 'b', 11 }, + { 'c', 8 }, + { 'd', 2 }, + { 'e', 14 }, + { 'f', 3 }, + { 'g', 5 }, + { 'h', 4 }, + { 'i', 34 }, + { 'j', 38 }, + { 'k', 40 }, + { 'l', 37 }, + { 'm', 46 }, + { 'n', 45 }, + { 'o', 31 }, + { 'p', 35 }, + { 'q', 12 }, + { 'r', 15 }, + { 's', 1 }, + { 't', 17 }, + { 'u', 32 }, + { 'v', 9 }, + { 'w', 13 }, + { 'x', 7 }, + { 'y', 16 }, + { 'z', 6 }, + { '{', 33 }, + { '|', 42 }, + { '}', 30 }, + { '~', 50 }, + + /* TTY functions */ + { kKeyBackSpace, 51 }, + { kKeyTab, 48 }, + { kKeyLinefeed, 36 }, +// { kKeyClear, 0xFFFF }, + { kKeyReturn, 36 }, + { kKeyPause, 113 }, + { kKeyScrollLock, 107 }, +// { kKeySysReq, 0xFFFF }, /* no mapping on apple */ + { kKeyEscape, 53 }, + { kKeyDelete, 117 }, + + /* cursor control */ + { kKeyHome, 115 }, + { kKeyLeft, 123 }, + { kKeyUp, 126 }, + { kKeyRight, 124 }, + { kKeyDown, 125 }, + { kKeyPageUp, 116 }, + { kKeyPageDown, 121 }, + { kKeyEnd, 119 }, + { kKeyBegin, 115 }, + + /* numeric keypad */ + { kKeyKP_Space, 49 }, + { kKeyKP_0, 82 }, + { kKeyKP_1, 83 }, + { kKeyKP_2, 84 }, + { kKeyKP_3, 85 }, + { kKeyKP_4, 86 }, + { kKeyKP_5, 87 }, + { kKeyKP_6, 88 }, + { kKeyKP_7, 89 }, + { kKeyKP_8, 91 }, + { kKeyKP_9, 92 }, + { kKeyKP_Enter, 76 }, + { kKeyKP_Decimal, 65 }, + { kKeyKP_Add, 69 }, + { kKeyKP_Subtract, 78 }, + { kKeyKP_Multiply, 67 }, + { kKeyKP_Divide, 75 }, + + /* Function keys */ + { kKeyF1, 122 }, + { kKeyF2, 120 }, + { kKeyF3, 99 }, + { kKeyF4, 118 }, + { kKeyF5, 96 }, + { kKeyF6, 97 }, + { kKeyF7, 98 }, + { kKeyF8, 100 }, + { kKeyF9, 101 }, + { kKeyF10, 109 }, + { kKeyF11, 103 }, + { kKeyF12, 111 }, + + /* Modifier keys */ + { kKeyShift_L, 56 }, + { kKeyShift_R, 56 }, + { kKeyControl_L, 59 }, + { kKeyControl_R, 59 }, + { kKeyAlt_L, 55 }, + { kKeyAlt_R, 55 }, + { kKeyCapsLock, 57 }, + { kKeyNumLock, 71 }, + { kKeyMeta_L, 58 }, + { kKeyMeta_R, 58 }, + { kKeySuper_L, 58 }, + { kKeySuper_R, 58 }, + { kKeyLeftTab, 48 } +}; + +// +// COSXKeyState +// + +COSXKeyState::COSXKeyState() +{ + // FIXME +} + +COSXKeyState::~COSXKeyState() +{ + // FIXME +} + +bool +COSXKeyState::fakeCtrlAltDel() +{ + // pass keys through unchanged + return false; +} + +const char* +COSXKeyState::getKeyName(KeyButton) const +{ + // FIXME + return ""; +} + +void +COSXKeyState::doUpdateKeys() +{ + // FIXME -- get the current keyboard state. call setKeyDown(), + // setToggled(), and addModifier() as appropriate. + + // save key mapping + // FIXME -- this probably needs to be more dynamic to support + // non-english keyboards. also need to map modifiers needed + // for each KeyID. + for (UInt32 i = 0; i < sizeof(s_keys) / sizeof(s_keys[0]); ++i) { + m_keyMap.insert(std::make_pair(s_keys[i].m_keyID, s_keys[i].m_button)); + } +} + +void +COSXKeyState::doFakeKeyEvent(KeyButton button, bool press, bool) +{ + // let system figure out character for us + CGPostKeyboardEvent(0, static_cast(button), press); +} + +KeyButton +COSXKeyState::mapKey(Keystrokes& keys, KeyID id, + KeyModifierMask desiredMask, + bool isAutoRepeat) const +{ + // look up virtual key + CKeyMap::const_iterator keyIndex = m_keyMap.find(id); + if (keyIndex == m_keyMap.end()) { + return 0; + } + CGKeyCode keyCode = keyIndex->second; + + // adjust the modifiers to match the desired modifiers + Keystrokes undo; + if (!adjustModifiers(keys, undo, desiredMask)) { + LOG((CLOG_DEBUG2 "failed to adjust modifiers")); + return 0; + } + + // add the key event + Keystroke keystroke; + keystroke.m_key = keyCode; + if (!isAutoRepeat) { + keystroke.m_press = true; + keystroke.m_repeat = false; + keys.push_back(keystroke); + } + else { + keystroke.m_press = false; + keystroke.m_repeat = true; + keys.push_back(keystroke); + keystroke.m_press = true; + keys.push_back(keystroke); + } + + // put undo keystrokes at end of keystrokes in reverse order + while (!undo.empty()) { + keys.push_back(undo.back()); + undo.pop_back(); + } + + return keyCode; +} + +bool +COSXKeyState::adjustModifiers(Keystrokes& /*keys*/, + Keystrokes& /*undo*/, + KeyModifierMask /*desiredMask*/) const +{ + // FIXME -- should add necessary modifier events to keys and undo + return true; +} diff --git a/lib/platform/COSXKeyState.h b/lib/platform/COSXKeyState.h new file mode 100644 index 00000000..ef563e14 --- /dev/null +++ b/lib/platform/COSXKeyState.h @@ -0,0 +1,55 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXKEYSTATE_H +#define COSXKEYSTATE_H + +#include "CKeyState.h" +#include "stdmap.h" +#include + +//! OS X key state +/*! +A key state for OS X. +*/ +class COSXKeyState : public CKeyState { +public: + COSXKeyState(); + virtual ~COSXKeyState(); + + // IKeyState overrides + virtual bool fakeCtrlAltDel(); + virtual const char* getKeyName(KeyButton) const; + +protected: + // IKeyState overrides + virtual void doUpdateKeys(); + virtual void doFakeKeyEvent(KeyButton button, + bool press, bool isAutoRepeat); + virtual KeyButton mapKey(Keystrokes& keys, KeyID id, + KeyModifierMask desiredMask, + bool isAutoRepeat) const; + +private: + bool adjustModifiers(Keystrokes& keys, + Keystrokes& undo, + KeyModifierMask desiredMask) const; + +private: + typedef std::map CKeyMap; + + CKeyMap m_keyMap; +}; + +#endif diff --git a/lib/platform/COSXScreen.cpp b/lib/platform/COSXScreen.cpp new file mode 100644 index 00000000..83175ec8 --- /dev/null +++ b/lib/platform/COSXScreen.cpp @@ -0,0 +1,407 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXScreen.h" +#include "COSXClipboard.h" +#include "COSXEventQueueBuffer.h" +#include "COSXKeyState.h" +#include "COSXScreenSaver.h" +#include "CClipboard.h" +#include "CLog.h" +#include "IEventQueue.h" +#include "TMethodEventJob.h" + +// +// COSXScreen +// + +COSXScreen::COSXScreen(bool isPrimary) : + m_isPrimary(isPrimary), + m_isOnScreen(m_isPrimary), + m_cursorHidden(false), + m_keyState(NULL), + m_sequenceNumber(0), + m_screensaver(NULL), + m_screensaverNotify(false) +{ + try { + m_displayID = CGMainDisplayID(); + updateScreenShape(); + m_screensaver = new COSXScreenSaver(); + m_keyState = new COSXKeyState(); + LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d", m_x, m_y, m_w, m_h)); + } + catch (...) { + delete m_keyState; + delete m_screensaver; + throw; + } + + // install event handlers + EVENTQUEUE->adoptHandler(CEvent::kSystem, IEventQueue::getSystemTarget(), + new TMethodEventJob(this, + &COSXScreen::handleSystemEvent)); + + // install the platform event queue + EVENTQUEUE->adoptBuffer(new COSXEventQueueBuffer); +} + +COSXScreen::~COSXScreen() +{ + disable(); + EVENTQUEUE->adoptBuffer(NULL); + EVENTQUEUE->removeHandler(CEvent::kSystem, IEventQueue::getSystemTarget()); + delete m_keyState; + delete m_screensaver; +} + +void* +COSXScreen::getEventTarget() const +{ + return const_cast(this); +} + +bool +COSXScreen::getClipboard(ClipboardID, IClipboard* dst) const +{ + COSXClipboard src; + CClipboard::copy(dst, &src); + return true; +} + +void +COSXScreen::getShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) const +{ + x = m_x; + y = m_y; + w = m_w; + h = m_h; +} + +void +COSXScreen::getCursorPos(SInt32& x, SInt32& y) const +{ + Point mouse; + GetGlobalMouse(&mouse); + x = mouse.h; + y = mouse.v; +} + +void +COSXScreen::reconfigure(UInt32 activeSides) +{ + // FIXME + (void)activeSides; +} + +void +COSXScreen::warpCursor(SInt32 x, SInt32 y) +{ + // move cursor without generating events + CGPoint pos; + pos.x = x; + pos.y = y; + CGWarpMouseCursorPosition(pos); + + // save new cursor position + m_xCursor = x; + m_yCursor = y; +} + +SInt32 +COSXScreen::getJumpZoneSize() const +{ + // FIXME -- is this correct? + return 1; +} + +bool +COSXScreen::isAnyMouseButtonDown() const +{ + // FIXME + return false; +} + +void +COSXScreen::getCursorCenter(SInt32& x, SInt32& y) const +{ + x = m_xCenter; + y = m_yCenter; +} + +void +COSXScreen::fakeMouseButton(ButtonID id, bool press) const +{ + // get button index + UInt32 index = id - kButtonLeft; + if (index >= sizeof(m_buttons) / sizeof(m_buttons[0])) { + return; + } + + // update state + m_buttons[index] = press; + + // synthesize event. CGPostMouseEvent is a particularly good + // example of a bad API. we have to shadow the mouse state to + // use this API and if we want to support more buttons we have + // to recompile. + CGPoint pos; + pos.x = m_xCursor; + pos.y = m_yCursor; + CGPostMouseEvent(pos, false, sizeof(m_buttons) / sizeof(m_buttons[0]), + m_buttons[0], + m_buttons[1], + m_buttons[2], + m_buttons[3], + m_buttons[4]); +} + +void +COSXScreen::fakeMouseMove(SInt32 x, SInt32 y) const +{ + // synthesize event + CGPoint pos; + pos.x = x; + pos.y = y; + // FIXME -- is it okay to pass no buttons here? + CGPostMouseEvent(pos, true, 0, m_buttons[0]); + + // save new cursor position + m_xCursor = x; + m_yCursor = y; +} + +void +COSXScreen::fakeMouseWheel(SInt32 delta) const +{ + CGPostScrollWheelEvent(1, delta / 120); +} + +void +COSXScreen::enable() +{ + // FIXME -- install clipboard snooper (if we need one) + + if (m_isPrimary) { + // FIXME -- start watching jump zones + } + else { + // FIXME -- prevent system from entering power save mode + + // hide cursor + if (!m_cursorHidden) { + CGDisplayHideCursor(m_displayID); + m_cursorHidden = true; + } + + // warp the mouse to the cursor center + fakeMouseMove(m_xCenter, m_yCenter); + + // FIXME -- prepare to show cursor if it moves + } + + updateKeys(); +} + +void +COSXScreen::disable() +{ + if (m_isPrimary) { + // FIXME -- stop watching jump zones, stop capturing input + } + else { + // show cursor + if (m_cursorHidden) { + CGDisplayShowCursor(m_displayID); + m_cursorHidden = false; + } + + // FIXME -- allow system to enter power saving mode + } + + // FIXME -- uninstall clipboard snooper (if we needed one) + + m_isOnScreen = m_isPrimary; +} + +void +COSXScreen::enter() +{ + if (m_isPrimary) { + // FIXME -- stop capturing input, watch jump zones + } + else { + // show cursor + if (m_cursorHidden) { + CGDisplayShowCursor(m_displayID); + m_cursorHidden = false; + } + + // reset buttons + for (UInt32 i = 0; i < sizeof(m_buttons) / sizeof(m_buttons[0]); ++i) { + m_buttons[i] = false; + } + } + + // now on screen + m_isOnScreen = true; +} + +bool +COSXScreen::leave() +{ + // FIXME -- choose keyboard layout if per-process and activate it here + + if (m_isPrimary) { + // update key and button state + updateKeys(); + + // warp to center + warpCursor(m_xCenter, m_yCenter); + + // capture events + // FIXME + } + else { + // hide cursor + if (!m_cursorHidden) { + CGDisplayHideCursor(m_displayID); + m_cursorHidden = true; + } + + // warp the mouse to the cursor center + fakeMouseMove(m_xCenter, m_yCenter); + + // FIXME -- prepare to show cursor if it moves + + // take keyboard focus + // FIXME + } + + // now off screen + m_isOnScreen = false; + + return true; +} + +bool +COSXScreen::setClipboard(ClipboardID, const IClipboard* src) +{ + COSXClipboard dst; + if (src != NULL) { + // save clipboard data + return CClipboard::copy(&dst, src); + } + else { + // assert clipboard ownership + if (!dst.open(0)) { + return false; + } + dst.empty(); + dst.close(); + return true; + } +} + +void +COSXScreen::checkClipboards() +{ + // FIXME -- do nothing if we're always up to date +} + +void +COSXScreen::openScreensaver(bool notify) +{ + m_screensaverNotify = notify; + if (!m_screensaverNotify) { + m_screensaver->disable(); + } +} + +void +COSXScreen::closeScreensaver() +{ + if (!m_screensaverNotify) { + m_screensaver->enable(); + } +} + +void +COSXScreen::screensaver(bool activate) +{ + if (activate) { + m_screensaver->activate(); + } + else { + m_screensaver->deactivate(); + } +} + +void +COSXScreen::resetOptions() +{ + // no options +} + +void +COSXScreen::setOptions(const COptionsList&) +{ + // no options +} + +void +COSXScreen::setSequenceNumber(UInt32 seqNum) +{ + m_sequenceNumber = seqNum; +} + +bool +COSXScreen::isPrimary() const +{ + return m_isPrimary; +} + +void +COSXScreen::handleSystemEvent(const CEvent&, void*) +{ + // FIXME +} + +void +COSXScreen::updateButtons() +{ + // FIXME -- get current button state into m_buttons[] +} + +IKeyState* +COSXScreen::getKeyState() const +{ + return m_keyState; +} + +void +COSXScreen::updateScreenShape() +{ + // FIXME -- handle multiple monitors + + // get shape of default screen + m_x = 0; + m_y = 0; + m_w = CGDisplayPixelsWide(m_displayID); + m_h = CGDisplayPixelsHigh(m_displayID); + + // get center of default screen + m_xCenter = m_x + (m_w >> 1); + m_yCenter = m_y + (m_h >> 1); +} diff --git a/lib/platform/COSXScreen.h b/lib/platform/COSXScreen.h new file mode 100644 index 00000000..0e13c5ba --- /dev/null +++ b/lib/platform/COSXScreen.h @@ -0,0 +1,110 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXSCREEN_H +#define COSXSCREEN_H + +#include "CPlatformScreen.h" +#include "stdvector.h" +#include + +class COSXKeyState; +class COSXScreenSaver; + +//! Implementation of IPlatformScreen for OS X +class COSXScreen : public CPlatformScreen { +public: + COSXScreen(bool isPrimary); + virtual ~COSXScreen(); + + //! @name manipulators + //@{ + + //@} + + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; + + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides); + virtual void warpCursor(SInt32 x, SInt32 y); + virtual SInt32 getJumpZoneSize() const; + virtual bool isAnyMouseButtonDown() const; + virtual void getCursorCenter(SInt32& x, SInt32& y) const; + + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press) const; + virtual void fakeMouseMove(SInt32 x, SInt32 y) const; + virtual void fakeMouseWheel(SInt32 delta) const; + + // IPlatformScreen overrides + virtual void enable(); + virtual void disable(); + virtual void enter(); + virtual bool leave(); + virtual bool setClipboard(ClipboardID, const IClipboard*); + virtual void checkClipboards(); + virtual void openScreensaver(bool notify); + virtual void closeScreensaver(); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const COptionsList& options); + virtual void setSequenceNumber(UInt32); + virtual bool isPrimary() const; + +protected: + // IPlatformScreen overrides + virtual void handleSystemEvent(const CEvent&, void*); + virtual void updateButtons(); + virtual IKeyState* getKeyState() const; + +private: + void updateScreenShape(); + +private: + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; + + // true if mouse has entered the screen + bool m_isOnScreen; + + // the display + CGDirectDisplayID m_displayID; + + // screen shape stuff + SInt32 m_x, m_y; + SInt32 m_w, m_h; + SInt32 m_xCenter, m_yCenter; + + // mouse state + mutable SInt32 m_xCursor, m_yCursor; + mutable boolean_t m_buttons[5]; + bool m_cursorHidden; + + // keyboard stuff + COSXKeyState* m_keyState; + + // clipboards + UInt32 m_sequenceNumber; + + // screen saver stuff + COSXScreenSaver* m_screensaver; + bool m_screensaverNotify; +}; + +#endif diff --git a/lib/platform/COSXScreenSaver.cpp b/lib/platform/COSXScreenSaver.cpp new file mode 100644 index 00000000..f67dc016 --- /dev/null +++ b/lib/platform/COSXScreenSaver.cpp @@ -0,0 +1,56 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2004 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#include "COSXScreenSaver.h" +#include + +// FIXME -- implement this + +// +// COSXScreenSaver +// + +COSXScreenSaver::COSXScreenSaver() +{ +} + +COSXScreenSaver::~COSXScreenSaver() +{ +} + +void +COSXScreenSaver::enable() +{ +} + +void +COSXScreenSaver::disable() +{ +} + +void +COSXScreenSaver::activate() +{ +} + +void +COSXScreenSaver::deactivate() +{ +} + +bool +COSXScreenSaver::isActive() const +{ + return false; +} diff --git a/lib/platform/COSXScreenSaver.h b/lib/platform/COSXScreenSaver.h new file mode 100644 index 00000000..a40caefa --- /dev/null +++ b/lib/platform/COSXScreenSaver.h @@ -0,0 +1,34 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2002 Chris Schoeneman + * + * 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 COPYING 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. + */ + +#ifndef COSXSCREENSAVER_H +#define COSXSCREENSAVER_H + +#include "IScreenSaver.h" + +//! OSX screen saver implementation +class COSXScreenSaver : public IScreenSaver { +public: + COSXScreenSaver(); + virtual ~COSXScreenSaver(); + + // IScreenSaver overrides + virtual void enable(); + virtual void disable(); + virtual void activate(); + virtual void deactivate(); + virtual bool isActive() const; +}; + +#endif diff --git a/lib/platform/CSynergyHook.h b/lib/platform/CSynergyHook.h index 045d96e7..b0c8e5d3 100644 --- a/lib/platform/CSynergyHook.h +++ b/lib/platform/CSynergyHook.h @@ -16,13 +16,8 @@ #define CSYNERGYHOOK_H #include "BasicTypes.h" - -#if WINDOWS_LIKE #define WIN32_LEAN_AND_MEAN #include -#else -#error CSynergyHook is a win32 specific file -#endif #if defined(SYNRGYHK_EXPORTS) #define CSYNERGYHOOK_API __declspec(dllexport) diff --git a/lib/platform/CXWindowsEventQueueBuffer.cpp b/lib/platform/CXWindowsEventQueueBuffer.cpp index ea450e17..7f41dc5a 100644 --- a/lib/platform/CXWindowsEventQueueBuffer.cpp +++ b/lib/platform/CXWindowsEventQueueBuffer.cpp @@ -16,22 +16,20 @@ #include "CThread.h" #include "CEvent.h" #include "IEventQueue.h" -#if UNIX_LIKE -# if HAVE_POLL -# include -# else -# if HAVE_SYS_SELECT_H -# include -# endif -# if HAVE_SYS_TIME_H -# include -# endif -# if HAVE_SYS_TYPES_H -# include -# endif -# if HAVE_UNISTD_H -# include -# endif +#if HAVE_POLL +# include +#else +# if HAVE_SYS_SELECT_H +# include +# endif +# if HAVE_SYS_TIME_H +# include +# endif +# if HAVE_SYS_TYPES_H +# include +# endif +# if HAVE_UNISTD_H +# include # endif #endif diff --git a/lib/platform/CXWindowsScreen.cpp b/lib/platform/CXWindowsScreen.cpp index fe368d13..ffe5a64e 100644 --- a/lib/platform/CXWindowsScreen.cpp +++ b/lib/platform/CXWindowsScreen.cpp @@ -45,24 +45,6 @@ } # endif #endif -#if UNIX_LIKE -# if HAVE_POLL -# include -# else -# if HAVE_SYS_SELECT_H -# include -# endif -# if HAVE_SYS_TIME_H -# include -# endif -# if HAVE_SYS_TYPES_H -# include -# endif -# if HAVE_UNISTD_H -# include -# endif -# endif -#endif #include "CArch.h" // map "Internet" keys to KeyIDs diff --git a/lib/platform/Makefile.am b/lib/platform/Makefile.am index 9ac9c323..74074267 100644 --- a/lib/platform/Makefile.am +++ b/lib/platform/Makefile.am @@ -13,10 +13,27 @@ ## Process this file with automake to produce Makefile.in NULL = -EXTRA_DIST = \ - makehook.dsp \ - platform.dsp \ - synrgyhk.dsp \ +XWINDOWS_SOURCE_FILES = \ + CXWindowsClipboard.cpp \ + CXWindowsClipboardTextConverter.cpp \ + CXWindowsClipboardUCS2Converter.cpp \ + CXWindowsClipboardUTF8Converter.cpp \ + CXWindowsEventQueueBuffer.cpp \ + CXWindowsKeyState.cpp \ + CXWindowsScreen.cpp \ + CXWindowsScreenSaver.cpp \ + CXWindowsUtil.cpp \ + CXWindowsClipboard.h \ + CXWindowsClipboardTextConverter.h \ + CXWindowsClipboardUCS2Converter.h \ + CXWindowsClipboardUTF8Converter.h \ + CXWindowsEventQueueBuffer.h \ + CXWindowsKeyState.h \ + CXWindowsScreen.h \ + CXWindowsScreenSaver.h \ + CXWindowsUtil.h \ + $(NULL) +MSWINDOWS_SOURCE_FILES = \ CMSWindowsClipboard.cpp \ CMSWindowsClipboardAnyTextConverter.cpp \ CMSWindowsClipboardTextConverter.cpp \ @@ -40,32 +57,42 @@ EXTRA_DIST = \ CMSWindowsUtil.h \ CSynergyHook.h \ $(NULL) +CARBON_SOURCE_FILES = \ + COSXClipboard.cpp \ + COSXEventQueueBuffer.cpp \ + COSXKeyState.cpp \ + COSXScreen.cpp \ + COSXScreenSaver.cpp \ + COSXClipboard.h \ + COSXEventQueueBuffer.h \ + COSXKeyState.h \ + COSXScreen.h \ + COSXScreenSaver.h \ + $(NULL) + +EXTRA_DIST = \ + makehook.dsp \ + platform.dsp \ + synrgyhk.dsp \ + $(XWINDOWS_SOURCE_FILES) \ + $(MSWINDOWS_SOURCE_FILES) \ + $(CARBON_SOURCE_FILES) \ + $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) noinst_LIBRARIES = libplatform.a -libplatform_a_SOURCES = \ - CXWindowsClipboard.cpp \ - CXWindowsClipboardTextConverter.cpp \ - CXWindowsClipboardUCS2Converter.cpp \ - CXWindowsClipboardUTF8Converter.cpp \ - CXWindowsEventQueueBuffer.cpp \ - CXWindowsKeyState.cpp \ - CXWindowsScreen.cpp \ - CXWindowsScreenSaver.cpp \ - CXWindowsUtil.cpp \ - CXWindowsClipboard.h \ - CXWindowsClipboardTextConverter.h \ - CXWindowsClipboardUCS2Converter.h \ - CXWindowsClipboardUTF8Converter.h \ - CXWindowsEventQueueBuffer.h \ - CXWindowsKeyState.h \ - CXWindowsScreen.h \ - CXWindowsScreenSaver.h \ - CXWindowsUtil.h \ - $(NULL) +if XWINDOWS +libplatform_a_SOURCES = $(XWINDOWS_SOURCE_FILES) +endif +if MSWINDOWS +libplatform_a_SOURCES = $(MSWINDOWS_SOURCE_FILES) +endif +if CARBON +libplatform_a_SOURCES = $(CARBON_SOURCE_FILES) +endif INCLUDES = \ -I$(top_srcdir)/lib/common \ -I$(top_srcdir)/lib/arch \