- renamed synrgyhk.dll to synwinhk.dll and moved lib code to separate folder.
- removed game device support (fallen into significant disrepair).
This commit is contained in:
parent
289f1ff71f
commit
dab838ed14
|
@ -294,10 +294,6 @@ else (UNIX)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
add_definitions(-DGAME_DEVICE_SUPPORT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(tools)
|
add_subdirectory(tools)
|
||||||
|
|
||||||
|
|
2
hm.py
2
hm.py
|
@ -58,7 +58,7 @@ globalOptionsLong = ['no-prompts', 'generator=', 'verbose', 'make-gui']
|
||||||
cmd_opt_dict = {
|
cmd_opt_dict = {
|
||||||
'about' : ['', []],
|
'about' : ['', []],
|
||||||
'setup' : ['g:', []],
|
'setup' : ['g:', []],
|
||||||
'configure' : ['g:dr', ['debug', 'release', 'game-device', 'mac-sdk=']],
|
'configure' : ['g:dr', ['debug', 'release', 'mac-sdk=']],
|
||||||
'build' : ['dr', ['debug', 'release']],
|
'build' : ['dr', ['debug', 'release']],
|
||||||
'clean' : ['dr', ['debug', 'release']],
|
'clean' : ['dr', ['debug', 'release']],
|
||||||
'update' : ['', []],
|
'update' : ['', []],
|
||||||
|
|
|
@ -36,8 +36,6 @@
|
||||||
!include "MUI2.nsh"
|
!include "MUI2.nsh"
|
||||||
!include "DefineIfExist.nsh"
|
!include "DefineIfExist.nsh"
|
||||||
|
|
||||||
${!defineifexist} gameDeviceSupport "${binDir}\Release\synxinhk.dll"
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_LICENSE "..\\res\\License.rtf"
|
!insertmacro MUI_PAGE_LICENSE "..\\res\\License.rtf"
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
|
@ -63,6 +61,7 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${product}" ""
|
||||||
Delete "${dir}\synergyd.log"
|
Delete "${dir}\synergyd.log"
|
||||||
Delete "${dir}\launcher.exe"
|
Delete "${dir}\launcher.exe"
|
||||||
Delete "${dir}\synrgyhk.dll"
|
Delete "${dir}\synrgyhk.dll"
|
||||||
|
Delete "${dir}\synwinhk.dll"
|
||||||
Delete "${dir}\libgcc_s_dw2-1.dll"
|
Delete "${dir}\libgcc_s_dw2-1.dll"
|
||||||
Delete "${dir}\mingwm10.dll"
|
Delete "${dir}\mingwm10.dll"
|
||||||
Delete "${dir}\QtCore4.dll"
|
Delete "${dir}\QtCore4.dll"
|
||||||
|
@ -70,8 +69,6 @@ InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${product}" ""
|
||||||
Delete "${dir}\QtNetwork4.dll"
|
Delete "${dir}\QtNetwork4.dll"
|
||||||
Delete "${dir}\Uninstall.exe"
|
Delete "${dir}\Uninstall.exe"
|
||||||
Delete "${dir}\uninstall.exe"
|
Delete "${dir}\uninstall.exe"
|
||||||
Delete "${dir}\synxinhk.dll"
|
|
||||||
Delete "${dir}\sxinpx13.dll"
|
|
||||||
|
|
||||||
RMDir "${dir}"
|
RMDir "${dir}"
|
||||||
|
|
||||||
|
@ -168,10 +165,10 @@ Section "Server and Client" core
|
||||||
|
|
||||||
; if the hook file exists, skip, assuming it couldn't be deleted
|
; if the hook file exists, skip, assuming it couldn't be deleted
|
||||||
; because it was in use by some process.
|
; because it was in use by some process.
|
||||||
${If} ${FileExists} "synrgyhk.dll"
|
${If} ${FileExists} "synwinhk.dll"
|
||||||
DetailPrint "Skipping synrgyhk.dll, file already exists."
|
DetailPrint "Skipping synwinhk.dll, file already exists."
|
||||||
${Else}
|
${Else}
|
||||||
File "${binDir}\Release\synrgyhk.dll"
|
File "${binDir}\Release\synwinhk.dll"
|
||||||
${EndIf}
|
${EndIf}
|
||||||
|
|
||||||
; windows firewall exception
|
; windows firewall exception
|
||||||
|
@ -183,16 +180,6 @@ Section "Server and Client" core
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
!ifdef gameDeviceSupport
|
|
||||||
Section "Game Device Support" gamedev
|
|
||||||
|
|
||||||
; files for xinput support
|
|
||||||
File "${binDir}\Release\synxinhk.dll"
|
|
||||||
File "${binDir}\Release\sxinpx13.dll"
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
!endif
|
|
||||||
|
|
||||||
Section "Graphical User Interface" gui
|
Section "Graphical User Interface" gui
|
||||||
|
|
||||||
; gui and qt libs
|
; gui and qt libs
|
||||||
|
|
|
@ -47,6 +47,7 @@ set(inc
|
||||||
../../lib/net
|
../../lib/net
|
||||||
../../lib/platform
|
../../lib/platform
|
||||||
../../lib/synergy
|
../../lib/synergy
|
||||||
|
../../lib/synwinhk
|
||||||
)
|
)
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
|
|
|
@ -47,6 +47,7 @@ set(inc
|
||||||
../../lib/platform
|
../../lib/platform
|
||||||
../../lib/synergy
|
../../lib/synergy
|
||||||
../../lib/server
|
../../lib/server
|
||||||
|
../../lib/synwinhk
|
||||||
)
|
)
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
|
|
|
@ -47,6 +47,7 @@ set(inc
|
||||||
../../lib/platform
|
../../lib/platform
|
||||||
../../lib/synergy
|
../../lib/synergy
|
||||||
../../lib/server
|
../../lib/server
|
||||||
|
../../lib/synwinhk
|
||||||
)
|
)
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
|
|
|
@ -25,3 +25,7 @@ add_subdirectory(net)
|
||||||
add_subdirectory(platform)
|
add_subdirectory(platform)
|
||||||
add_subdirectory(server)
|
add_subdirectory(server)
|
||||||
add_subdirectory(synergy)
|
add_subdirectory(synergy)
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
add_subdirectory(synwinhk)
|
||||||
|
endif()
|
||||||
|
|
|
@ -101,9 +101,3 @@ endif()
|
||||||
|
|
||||||
include_directories(${inc})
|
include_directories(${inc})
|
||||||
add_library(arch STATIC ${src})
|
add_library(arch STATIC ${src})
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
target_link_libraries(arch synxinhk)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
|
@ -42,7 +42,6 @@ EVENT_TYPE_ACCESSOR(CServerApp)
|
||||||
EVENT_TYPE_ACCESSOR(IKeyState)
|
EVENT_TYPE_ACCESSOR(IKeyState)
|
||||||
EVENT_TYPE_ACCESSOR(IPrimaryScreen)
|
EVENT_TYPE_ACCESSOR(IPrimaryScreen)
|
||||||
EVENT_TYPE_ACCESSOR(IScreen)
|
EVENT_TYPE_ACCESSOR(IScreen)
|
||||||
EVENT_TYPE_ACCESSOR(ISecondaryScreen)
|
|
||||||
|
|
||||||
// interrupt handler. this just adds a quit event to the queue.
|
// interrupt handler. this just adds a quit event to the queue.
|
||||||
static
|
static
|
||||||
|
@ -78,8 +77,7 @@ CEventQueue::CEventQueue() :
|
||||||
m_typesForCServerApp(NULL),
|
m_typesForCServerApp(NULL),
|
||||||
m_typesForIKeyState(NULL),
|
m_typesForIKeyState(NULL),
|
||||||
m_typesForIPrimaryScreen(NULL),
|
m_typesForIPrimaryScreen(NULL),
|
||||||
m_typesForIScreen(NULL),
|
m_typesForIScreen(NULL)
|
||||||
m_typesForISecondaryScreen(NULL)
|
|
||||||
{
|
{
|
||||||
m_mutex = ARCH->newMutex();
|
m_mutex = ARCH->newMutex();
|
||||||
ARCH->setSignalHandler(CArch::kINTERRUPT, &interrupt, this);
|
ARCH->setSignalHandler(CArch::kINTERRUPT, &interrupt, this);
|
||||||
|
|
|
@ -151,7 +151,6 @@ public:
|
||||||
IKeyStateEvents& forIKeyState();
|
IKeyStateEvents& forIKeyState();
|
||||||
IPrimaryScreenEvents& forIPrimaryScreen();
|
IPrimaryScreenEvents& forIPrimaryScreen();
|
||||||
IScreenEvents& forIScreen();
|
IScreenEvents& forIScreen();
|
||||||
ISecondaryScreenEvents& forISecondaryScreen();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CClientEvents* m_typesForCClient;
|
CClientEvents* m_typesForCClient;
|
||||||
|
@ -172,7 +171,6 @@ private:
|
||||||
IKeyStateEvents* m_typesForIKeyState;
|
IKeyStateEvents* m_typesForIKeyState;
|
||||||
IPrimaryScreenEvents* m_typesForIPrimaryScreen;
|
IPrimaryScreenEvents* m_typesForIPrimaryScreen;
|
||||||
IScreenEvents* m_typesForIScreen;
|
IScreenEvents* m_typesForIScreen;
|
||||||
ISecondaryScreenEvents* m_typesForISecondaryScreen;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define EVENT_TYPE_ACCESSOR(type_) \
|
#define EVENT_TYPE_ACCESSOR(type_) \
|
||||||
|
|
|
@ -166,10 +166,6 @@ REGISTER_EVENT(IPrimaryScreen, hotKeyDown)
|
||||||
REGISTER_EVENT(IPrimaryScreen, hotKeyUp)
|
REGISTER_EVENT(IPrimaryScreen, hotKeyUp)
|
||||||
REGISTER_EVENT(IPrimaryScreen, fakeInputBegin)
|
REGISTER_EVENT(IPrimaryScreen, fakeInputBegin)
|
||||||
REGISTER_EVENT(IPrimaryScreen, fakeInputEnd)
|
REGISTER_EVENT(IPrimaryScreen, fakeInputEnd)
|
||||||
REGISTER_EVENT(IPrimaryScreen, gameDeviceButtons)
|
|
||||||
REGISTER_EVENT(IPrimaryScreen, gameDeviceSticks)
|
|
||||||
REGISTER_EVENT(IPrimaryScreen, gameDeviceTriggers)
|
|
||||||
REGISTER_EVENT(IPrimaryScreen, gameDeviceTimingReq)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// IScreen
|
// IScreen
|
||||||
|
@ -183,13 +179,6 @@ REGISTER_EVENT(IScreen, resume)
|
||||||
REGISTER_EVENT(IScreen, fileChunkSending)
|
REGISTER_EVENT(IScreen, fileChunkSending)
|
||||||
REGISTER_EVENT(IScreen, fileRecieveComplete)
|
REGISTER_EVENT(IScreen, fileRecieveComplete)
|
||||||
|
|
||||||
//
|
|
||||||
// ISecondaryScreen
|
|
||||||
//
|
|
||||||
|
|
||||||
REGISTER_EVENT(ISecondaryScreen, gameDeviceTimingResp)
|
|
||||||
REGISTER_EVENT(ISecondaryScreen, gameDeviceFeedback)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// CIpcServer
|
// CIpcServer
|
||||||
//
|
//
|
||||||
|
|
|
@ -559,11 +559,7 @@ public:
|
||||||
m_hotKeyDown(CEvent::kUnknown),
|
m_hotKeyDown(CEvent::kUnknown),
|
||||||
m_hotKeyUp(CEvent::kUnknown),
|
m_hotKeyUp(CEvent::kUnknown),
|
||||||
m_fakeInputBegin(CEvent::kUnknown),
|
m_fakeInputBegin(CEvent::kUnknown),
|
||||||
m_fakeInputEnd(CEvent::kUnknown),
|
m_fakeInputEnd(CEvent::kUnknown) { }
|
||||||
m_gameDeviceButtons(CEvent::kUnknown),
|
|
||||||
m_gameDeviceSticks(CEvent::kUnknown),
|
|
||||||
m_gameDeviceTriggers(CEvent::kUnknown),
|
|
||||||
m_gameDeviceTimingReq(CEvent::kUnknown) { }
|
|
||||||
|
|
||||||
//! @name accessors
|
//! @name accessors
|
||||||
//@{
|
//@{
|
||||||
|
@ -608,18 +604,6 @@ public:
|
||||||
//! end of fake input event type
|
//! end of fake input event type
|
||||||
CEvent::Type fakeInputEnd();
|
CEvent::Type fakeInputEnd();
|
||||||
|
|
||||||
//! game device buttons event type.
|
|
||||||
CEvent::Type gameDeviceButtons();
|
|
||||||
|
|
||||||
//! game device sticks event type.
|
|
||||||
CEvent::Type gameDeviceSticks();
|
|
||||||
|
|
||||||
//! game device triggers event type.
|
|
||||||
CEvent::Type gameDeviceTriggers();
|
|
||||||
|
|
||||||
//! game device timing request event type.
|
|
||||||
CEvent::Type gameDeviceTimingReq();
|
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -634,10 +618,6 @@ private:
|
||||||
CEvent::Type m_hotKeyUp;
|
CEvent::Type m_hotKeyUp;
|
||||||
CEvent::Type m_fakeInputBegin;
|
CEvent::Type m_fakeInputBegin;
|
||||||
CEvent::Type m_fakeInputEnd;
|
CEvent::Type m_fakeInputEnd;
|
||||||
CEvent::Type m_gameDeviceButtons;
|
|
||||||
CEvent::Type m_gameDeviceSticks;
|
|
||||||
CEvent::Type m_gameDeviceTriggers;
|
|
||||||
CEvent::Type m_gameDeviceTimingReq;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class IScreenEvents : public CEventTypes {
|
class IScreenEvents : public CEventTypes {
|
||||||
|
@ -707,25 +687,3 @@ private:
|
||||||
CEvent::Type m_fileChunkSending;
|
CEvent::Type m_fileChunkSending;
|
||||||
CEvent::Type m_fileRecieveComplete;
|
CEvent::Type m_fileRecieveComplete;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ISecondaryScreenEvents : public CEventTypes {
|
|
||||||
public:
|
|
||||||
ISecondaryScreenEvents() :
|
|
||||||
m_gameDeviceTimingResp(CEvent::kUnknown),
|
|
||||||
m_gameDeviceFeedback(CEvent::kUnknown) { }
|
|
||||||
|
|
||||||
//! @name accessors
|
|
||||||
//@{
|
|
||||||
|
|
||||||
//! Get game device timing response event type.
|
|
||||||
CEvent::Type gameDeviceTimingResp();
|
|
||||||
|
|
||||||
//! Get game device feedback event type.
|
|
||||||
CEvent::Type gameDeviceFeedback();
|
|
||||||
|
|
||||||
//@}
|
|
||||||
|
|
||||||
private:
|
|
||||||
CEvent::Type m_gameDeviceTimingResp;
|
|
||||||
CEvent::Type m_gameDeviceFeedback;
|
|
||||||
};
|
|
||||||
|
|
|
@ -49,7 +49,6 @@ class CServerAppEvents;
|
||||||
class IKeyStateEvents;
|
class IKeyStateEvents;
|
||||||
class IPrimaryScreenEvents;
|
class IPrimaryScreenEvents;
|
||||||
class IScreenEvents;
|
class IScreenEvents;
|
||||||
class ISecondaryScreenEvents;
|
|
||||||
|
|
||||||
//! Event queue interface
|
//! Event queue interface
|
||||||
/*!
|
/*!
|
||||||
|
@ -239,7 +238,6 @@ public:
|
||||||
virtual IKeyStateEvents& forIKeyState() = 0;
|
virtual IKeyStateEvents& forIKeyState() = 0;
|
||||||
virtual IPrimaryScreenEvents& forIPrimaryScreen() = 0;
|
virtual IPrimaryScreenEvents& forIPrimaryScreen() = 0;
|
||||||
virtual IScreenEvents& forIScreen() = 0;
|
virtual IScreenEvents& forIScreen() = 0;
|
||||||
virtual ISecondaryScreenEvents& forISecondaryScreen() = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -81,14 +81,6 @@ CClient::CClient(IEventQueue* events,
|
||||||
getEventTarget(),
|
getEventTarget(),
|
||||||
new TMethodEventJob<CClient>(this,
|
new TMethodEventJob<CClient>(this,
|
||||||
&CClient::handleResume));
|
&CClient::handleResume));
|
||||||
m_events->adoptHandler(m_events->forISecondaryScreen().gameDeviceTimingResp(),
|
|
||||||
getEventTarget(),
|
|
||||||
new TMethodEventJob<CClient>(this,
|
|
||||||
&CClient::handleGameDeviceTimingResp));
|
|
||||||
m_events->adoptHandler(m_events->forISecondaryScreen().gameDeviceFeedback(),
|
|
||||||
getEventTarget(),
|
|
||||||
new TMethodEventJob<CClient>(this,
|
|
||||||
&CClient::handleGameDeviceFeedback));
|
|
||||||
m_events->adoptHandler(m_events->forIScreen().fileChunkSending(),
|
m_events->adoptHandler(m_events->forIScreen().fileChunkSending(),
|
||||||
this,
|
this,
|
||||||
new TMethodEventJob<CClient>(this,
|
new TMethodEventJob<CClient>(this,
|
||||||
|
@ -363,30 +355,6 @@ CClient::setOptions(const COptionsList& options)
|
||||||
m_screen->setOptions(options);
|
m_screen->setOptions(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CClient::gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClient::gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClient::gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClient::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
CString
|
CString
|
||||||
CClient::getName() const
|
CClient::getName() const
|
||||||
{
|
{
|
||||||
|
@ -732,24 +700,6 @@ CClient::handleResume(const CEvent&, void*)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CClient::handleGameDeviceTimingResp(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
IPlatformScreen::CGameDeviceTimingRespInfo* info =
|
|
||||||
reinterpret_cast<IPlatformScreen::CGameDeviceTimingRespInfo*>(event.getData());
|
|
||||||
|
|
||||||
m_server->onGameDeviceTimingResp(info->m_freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClient::handleGameDeviceFeedback(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
IPlatformScreen::CGameDeviceFeedbackInfo* info =
|
|
||||||
reinterpret_cast<IPlatformScreen::CGameDeviceFeedbackInfo*>(event.getData());
|
|
||||||
|
|
||||||
m_server->onGameDeviceFeedback(info->m_id, info->m_m1, info->m_m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CClient::handleFileChunkSending(const CEvent& event, void*)
|
CClient::handleFileChunkSending(const CEvent& event, void*)
|
||||||
{
|
{
|
||||||
|
|
|
@ -163,10 +163,6 @@ public:
|
||||||
virtual void screensaver(bool activate);
|
virtual void screensaver(bool activate);
|
||||||
virtual void resetOptions();
|
virtual void resetOptions();
|
||||||
virtual void setOptions(const COptionsList& options);
|
virtual void setOptions(const COptionsList& options);
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
virtual void gameDeviceTimingReq();
|
|
||||||
virtual CString getName() const;
|
virtual CString getName() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -193,8 +189,6 @@ private:
|
||||||
void handleHello(const CEvent&, void*);
|
void handleHello(const CEvent&, void*);
|
||||||
void handleSuspend(const CEvent& event, void*);
|
void handleSuspend(const CEvent& event, void*);
|
||||||
void handleResume(const CEvent& event, void*);
|
void handleResume(const CEvent& event, void*);
|
||||||
void handleGameDeviceTimingResp(const CEvent& event, void*);
|
|
||||||
void handleGameDeviceFeedback(const CEvent& event, void*);
|
|
||||||
void handleFileChunkSending(const CEvent&, void*);
|
void handleFileChunkSending(const CEvent&, void*);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -294,22 +294,6 @@ CServerProxy::parseMessage(const UInt8* code)
|
||||||
setOptions();
|
setOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (memcmp(code, kMsgDGameButtons, 4) == 0) {
|
|
||||||
gameDeviceButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (memcmp(code, kMsgDGameSticks, 4) == 0) {
|
|
||||||
gameDeviceSticks();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (memcmp(code, kMsgDGameTriggers, 4) == 0) {
|
|
||||||
gameDeviceTriggers();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (memcmp(code, kMsgCGameTimingReq, 4) == 0) {
|
|
||||||
gameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (memcmp(code, kMsgDCryptoIv, 4) == 0) {
|
else if (memcmp(code, kMsgDCryptoIv, 4) == 0) {
|
||||||
cryptoIv();
|
cryptoIv();
|
||||||
}
|
}
|
||||||
|
@ -379,20 +363,6 @@ CServerProxy::onClipboardChanged(ClipboardID id, const IClipboard* clipboard)
|
||||||
CProtocolUtil::writef(m_stream, kMsgDClipboard, id, m_seqNum, &data);
|
CProtocolUtil::writef(m_stream, kMsgDClipboard, id, m_seqNum, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::onGameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "sending game device timing response freq=%d", freq));
|
|
||||||
CProtocolUtil::writef(m_stream, kMsgCGameTimingResp, freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::onGameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "sending game device feedback id=%d, m1=%d, m2=%d", id, m1, m2));
|
|
||||||
CProtocolUtil::writef(m_stream, kMsgDGameFeedback, id, m1, m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CServerProxy::flushCompressedMouse()
|
CServerProxy::flushCompressedMouse()
|
||||||
{
|
{
|
||||||
|
@ -789,55 +759,6 @@ CServerProxy::mouseWheel()
|
||||||
m_client->mouseWheel(xDelta, yDelta);
|
m_client->mouseWheel(xDelta, yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::gameDeviceButtons()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
GameDeviceID id;
|
|
||||||
GameDeviceButton buttons;
|
|
||||||
CProtocolUtil::readf(m_stream, kMsgDGameButtons + 4, &id, &buttons);
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device id=%d buttons=%d", id, buttons));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_client->gameDeviceButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::gameDeviceSticks()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
GameDeviceID id;
|
|
||||||
SInt16 x1, y1, x2, y2;
|
|
||||||
CProtocolUtil::readf(m_stream, kMsgDGameSticks + 4, &id, &x1, &y1, &x2, &y2);
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device sticks id=%d s1=%+d,%+d s2=%+d,%+d", id, x1, y1, x2, y2));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_client->gameDeviceSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::gameDeviceTriggers()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
GameDeviceID id;
|
|
||||||
UInt8 t1, t2;
|
|
||||||
CProtocolUtil::readf(m_stream, kMsgDGameTriggers + 4, &id, &t1, &t2);
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device triggers id=%d t1=%d t2=%d", id, t1, t2));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_client->gameDeviceTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServerProxy::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device timing request"));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_client->gameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CServerProxy::cryptoIv()
|
CServerProxy::cryptoIv()
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "ClipboardTypes.h"
|
#include "ClipboardTypes.h"
|
||||||
#include "KeyTypes.h"
|
#include "KeyTypes.h"
|
||||||
#include "CEvent.h"
|
#include "CEvent.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
#include "CStopwatch.h"
|
#include "CStopwatch.h"
|
||||||
|
|
||||||
class CClient;
|
class CClient;
|
||||||
|
@ -52,8 +51,6 @@ public:
|
||||||
void onInfoChanged();
|
void onInfoChanged();
|
||||||
bool onGrabClipboard(ClipboardID);
|
bool onGrabClipboard(ClipboardID);
|
||||||
void onClipboardChanged(ClipboardID, const IClipboard*);
|
void onClipboardChanged(ClipboardID, const IClipboard*);
|
||||||
void onGameDeviceTimingResp(UInt16 freq);
|
|
||||||
void onGameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
@ -104,10 +101,6 @@ private:
|
||||||
void mouseMove();
|
void mouseMove();
|
||||||
void mouseRelativeMove();
|
void mouseRelativeMove();
|
||||||
void mouseWheel();
|
void mouseWheel();
|
||||||
void gameDeviceButtons();
|
|
||||||
void gameDeviceSticks();
|
|
||||||
void gameDeviceTriggers();
|
|
||||||
void gameDeviceTimingReq();
|
|
||||||
void cryptoIv();
|
void cryptoIv();
|
||||||
void screensaver();
|
void screensaver();
|
||||||
void resetOptions();
|
void resetOptions();
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
#include "CMSWindowsDesks.h"
|
#include "CMSWindowsDesks.h"
|
||||||
#include "CMSWindowsScreen.h"
|
#include "CMSWindowsScreen.h"
|
||||||
#include "CSynergyHook.h"
|
#include "synwinhk.h"
|
||||||
#include "IScreenSaver.h"
|
#include "IScreenSaver.h"
|
||||||
#include "XScreen.h"
|
#include "XScreen.h"
|
||||||
#include "CLock.h"
|
#include "CLock.h"
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifndef CMSWINDOWSDESKS_H
|
#ifndef CMSWINDOWSDESKS_H
|
||||||
#define CMSWINDOWSDESKS_H
|
#define CMSWINDOWSDESKS_H
|
||||||
|
|
||||||
#include "CSynergyHook.h"
|
#include "synwinhk.h"
|
||||||
#include "KeyTypes.h"
|
#include "KeyTypes.h"
|
||||||
#include "MouseTypes.h"
|
#include "MouseTypes.h"
|
||||||
#include "OptionTypes.h"
|
#include "OptionTypes.h"
|
||||||
|
@ -220,7 +220,6 @@ private:
|
||||||
void deskEnter(CDesk* desk);
|
void deskEnter(CDesk* desk);
|
||||||
void deskLeave(CDesk* desk, HKL keyLayout);
|
void deskLeave(CDesk* desk, HKL keyLayout);
|
||||||
void deskThread(void* vdesk);
|
void deskThread(void* vdesk);
|
||||||
void xinputThread();
|
|
||||||
|
|
||||||
// desk switch checking and handling
|
// desk switch checking and handling
|
||||||
CDesk* addDesk(const CString& name, HDESK hdesk);
|
CDesk* addDesk(const CString& name, HDESK hdesk);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include "CSynergyHook.h"
|
#include "synwinhk.h"
|
||||||
|
|
||||||
//! Loads Windows hook DLLs.
|
//! Loads Windows hook DLLs.
|
||||||
class CMSWindowsHookLibraryLoader
|
class CMSWindowsHookLibraryLoader
|
||||||
|
|
|
@ -84,7 +84,6 @@ CMSWindowsScreen* CMSWindowsScreen::s_screen = NULL;
|
||||||
CMSWindowsScreen::CMSWindowsScreen(
|
CMSWindowsScreen::CMSWindowsScreen(
|
||||||
bool isPrimary,
|
bool isPrimary,
|
||||||
bool noHooks,
|
bool noHooks,
|
||||||
const CGameDeviceInfo& gameDeviceInfo,
|
|
||||||
bool stopOnDeskSwitch,
|
bool stopOnDeskSwitch,
|
||||||
IEventQueue* events) :
|
IEventQueue* events) :
|
||||||
CPlatformScreen(events),
|
CPlatformScreen(events),
|
||||||
|
@ -114,8 +113,6 @@ CMSWindowsScreen::CMSWindowsScreen(
|
||||||
m_keyState(NULL),
|
m_keyState(NULL),
|
||||||
m_hasMouse(GetSystemMetrics(SM_MOUSEPRESENT) != 0),
|
m_hasMouse(GetSystemMetrics(SM_MOUSEPRESENT) != 0),
|
||||||
m_showingMouse(false),
|
m_showingMouse(false),
|
||||||
m_gameDeviceInfo(gameDeviceInfo),
|
|
||||||
m_gameDevice(NULL),
|
|
||||||
m_events(events)
|
m_events(events)
|
||||||
{
|
{
|
||||||
assert(s_windowInstance != NULL);
|
assert(s_windowInstance != NULL);
|
||||||
|
@ -124,7 +121,7 @@ CMSWindowsScreen::CMSWindowsScreen(
|
||||||
s_screen = this;
|
s_screen = this;
|
||||||
try {
|
try {
|
||||||
if (m_isPrimary && !m_noHooks) {
|
if (m_isPrimary && !m_noHooks) {
|
||||||
m_hookLibrary = openHookLibrary("synrgyhk");
|
m_hookLibrary = openHookLibrary("synwinhk");
|
||||||
}
|
}
|
||||||
m_screensaver = new CMSWindowsScreenSaver();
|
m_screensaver = new CMSWindowsScreenSaver();
|
||||||
m_desks = new CMSWindowsDesks(
|
m_desks = new CMSWindowsDesks(
|
||||||
|
@ -163,25 +160,6 @@ CMSWindowsScreen::CMSWindowsScreen(
|
||||||
|
|
||||||
// install the platform event queue
|
// install the platform event queue
|
||||||
m_events->adoptBuffer(new CMSWindowsEventQueueBuffer(m_events));
|
m_events->adoptBuffer(new CMSWindowsEventQueueBuffer(m_events));
|
||||||
|
|
||||||
if ((gameDeviceInfo.m_mode == CGameDeviceInfo::kGameModeXInput) &&
|
|
||||||
(gameDeviceInfo.m_poll != CGameDeviceInfo::kGamePollDynamic))
|
|
||||||
LOG((CLOG_WARN "only dynamic polling is supported with xnput."));
|
|
||||||
|
|
||||||
if ((gameDeviceInfo.m_mode == CGameDeviceInfo::kGameModeJoyInfoEx) &&
|
|
||||||
(gameDeviceInfo.m_poll != CGameDeviceInfo::kGamePollStatic))
|
|
||||||
LOG((CLOG_WARN "only static polling is supported with joyinfoex."));
|
|
||||||
|
|
||||||
if (m_gameDeviceInfo.m_mode == CGameDeviceInfo::kGameModeXInput) {
|
|
||||||
#if GAME_DEVICE_SUPPORT
|
|
||||||
m_gameDevice = new CMSWindowsXInput(this, gameDeviceInfo);
|
|
||||||
#else if _AMD64_
|
|
||||||
LOG((CLOG_WARN "xinput game device mode not supported for 64-bit."));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_gameDevice = new CEventGameDevice(getEventTarget());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CMSWindowsScreen::~CMSWindowsScreen()
|
CMSWindowsScreen::~CMSWindowsScreen()
|
||||||
|
@ -197,9 +175,6 @@ CMSWindowsScreen::~CMSWindowsScreen()
|
||||||
destroyWindow(m_window);
|
destroyWindow(m_window);
|
||||||
destroyClass(m_class);
|
destroyClass(m_class);
|
||||||
|
|
||||||
if (m_gameDevice != NULL)
|
|
||||||
delete m_gameDevice;
|
|
||||||
|
|
||||||
if (m_hookLibrary != NULL)
|
if (m_hookLibrary != NULL)
|
||||||
closeHookLibrary(m_hookLibrary);
|
closeHookLibrary(m_hookLibrary);
|
||||||
|
|
||||||
|
@ -708,18 +683,6 @@ CMSWindowsScreen::getCursorCenter(SInt32& x, SInt32& y) const
|
||||||
y = m_yCenter;
|
y = m_yCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::gameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
m_gameDevice->gameDeviceTimingResp(freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
m_gameDevice->gameDeviceFeedback(id, m1, m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CMSWindowsScreen::fakeMouseButton(ButtonID id, bool press)
|
CMSWindowsScreen::fakeMouseButton(ButtonID id, bool press)
|
||||||
{
|
{
|
||||||
|
@ -744,34 +707,6 @@ CMSWindowsScreen::fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const
|
||||||
m_desks->fakeMouseWheel(xDelta, yDelta);
|
m_desks->fakeMouseWheel(xDelta, yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "fake game device buttons id=%d buttons=%d", id, buttons));
|
|
||||||
m_gameDevice->fakeGameDeviceButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "fake game device sticks id=%d s1=%+d,%+d s2=%+d,%+d", id, x1, y1, x2, y2));
|
|
||||||
m_gameDevice->fakeGameDeviceSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "fake game device triggers id=%d t1=%d t2=%d", id, t1, t2));
|
|
||||||
m_gameDevice->fakeGameDeviceTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsScreen::queueGameDeviceTimingReq() const
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "queue game device timing request"));
|
|
||||||
m_gameDevice->queueGameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CMSWindowsScreen::updateKeys()
|
CMSWindowsScreen::updateKeys()
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,14 +20,11 @@
|
||||||
#define CMSWINDOWSSCREEN_H
|
#define CMSWINDOWSSCREEN_H
|
||||||
|
|
||||||
#include "CPlatformScreen.h"
|
#include "CPlatformScreen.h"
|
||||||
#include "CSynergyHook.h"
|
#include "synwinhk.h"
|
||||||
#include "CCondVar.h"
|
#include "CCondVar.h"
|
||||||
#include "CMutex.h"
|
#include "CMutex.h"
|
||||||
#include "CString.h"
|
#include "CString.h"
|
||||||
#include "CMSWindowsHookLibraryLoader.h"
|
#include "CMSWindowsHookLibraryLoader.h"
|
||||||
#include "CGameDevice.h"
|
|
||||||
#include "CMSWindowsXInput.h"
|
|
||||||
#include "CEventGameDevice.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -44,7 +41,6 @@ public:
|
||||||
CMSWindowsScreen(
|
CMSWindowsScreen(
|
||||||
bool isPrimary,
|
bool isPrimary,
|
||||||
bool noHooks,
|
bool noHooks,
|
||||||
const CGameDeviceInfo &gameDevice,
|
|
||||||
bool stopOnDeskSwitch,
|
bool stopOnDeskSwitch,
|
||||||
IEventQueue* events);
|
IEventQueue* events);
|
||||||
virtual ~CMSWindowsScreen();
|
virtual ~CMSWindowsScreen();
|
||||||
|
@ -89,18 +85,12 @@ public:
|
||||||
virtual SInt32 getJumpZoneSize() const;
|
virtual SInt32 getJumpZoneSize() const;
|
||||||
virtual bool isAnyMouseButtonDown() const;
|
virtual bool isAnyMouseButtonDown() const;
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq);
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
|
|
||||||
// ISecondaryScreen overrides
|
// ISecondaryScreen overrides
|
||||||
virtual void fakeMouseButton(ButtonID id, bool press);
|
virtual void fakeMouseButton(ButtonID id, bool press);
|
||||||
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
||||||
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const;
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const;
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const;
|
|
||||||
virtual void queueGameDeviceTimingReq() const;
|
|
||||||
|
|
||||||
// IKeyState overrides
|
// IKeyState overrides
|
||||||
virtual void updateKeys();
|
virtual void updateKeys();
|
||||||
|
@ -325,14 +315,12 @@ private:
|
||||||
MOUSEKEYS m_mouseKeys;
|
MOUSEKEYS m_mouseKeys;
|
||||||
MOUSEKEYS m_oldMouseKeys;
|
MOUSEKEYS m_oldMouseKeys;
|
||||||
|
|
||||||
// loads synrgyhk.dll
|
// loads synwinhk.dll
|
||||||
CMSWindowsHookLibraryLoader
|
CMSWindowsHookLibraryLoader
|
||||||
m_hookLibraryLoader;
|
m_hookLibraryLoader;
|
||||||
|
|
||||||
const CGameDeviceInfo& m_gameDeviceInfo;
|
static CMSWindowsScreen*
|
||||||
CGameDevice* m_gameDevice;
|
s_screen;
|
||||||
|
|
||||||
static CMSWindowsScreen* s_screen;
|
|
||||||
|
|
||||||
IEventQueue* m_events;
|
IEventQueue* m_events;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,363 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If notsee <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "CMSWindowsXInput.h"
|
|
||||||
#include "XScreen.h"
|
|
||||||
#include "CThread.h"
|
|
||||||
#include "TMethodJob.h"
|
|
||||||
#include "CLog.h"
|
|
||||||
#include "XInputHook.h"
|
|
||||||
#include "CMSWindowsScreen.h"
|
|
||||||
|
|
||||||
#include "XInput.h"
|
|
||||||
|
|
||||||
typedef DWORD (WINAPI *XInputGetStateFunc)(DWORD, XINPUT_STATE*);
|
|
||||||
typedef DWORD (WINAPI *XInputSetStateFunc)(DWORD, XINPUT_VIBRATION*);
|
|
||||||
|
|
||||||
CMSWindowsXInput::CMSWindowsXInput(CMSWindowsScreen* screen, const CGameDeviceInfo& gameDeviceInfo) :
|
|
||||||
m_screen(screen),
|
|
||||||
m_gameDeviceInfo(gameDeviceInfo),
|
|
||||||
m_xInputPollThread(NULL),
|
|
||||||
m_xInputTimingThread(NULL),
|
|
||||||
m_xInputFeedbackThread(NULL),
|
|
||||||
m_gameButtonsLast(0),
|
|
||||||
m_gameLeftTriggerLast(0),
|
|
||||||
m_gameRightTriggerLast(0),
|
|
||||||
m_gameLeftStickXLast(0),
|
|
||||||
m_gameLeftStickYLast(0),
|
|
||||||
m_gameRightStickXLast(0),
|
|
||||||
m_gameRightStickYLast(0),
|
|
||||||
m_gameLastTimingSent(0),
|
|
||||||
m_gameTimingWaiting(false),
|
|
||||||
m_gameFakeLag(0),
|
|
||||||
m_gamePollFreq(kGamePollFreqDefault),
|
|
||||||
m_gamePollFreqAdjust(0),
|
|
||||||
m_gameFakeLagMin(kGamePollFreqDefault),
|
|
||||||
m_gameTimingStarted(false),
|
|
||||||
m_gameTimingFirst(0),
|
|
||||||
m_gameFakeLagLast(0),
|
|
||||||
m_gameTimingCalibrated(false),
|
|
||||||
m_xinputModule(NULL)
|
|
||||||
{
|
|
||||||
m_xinputModule = LoadLibrary("xinput1_3.dll");
|
|
||||||
if (m_xinputModule == NULL)
|
|
||||||
{
|
|
||||||
throw XScreenXInputFailure("could not load xinput library");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (screen->isPrimary())
|
|
||||||
{
|
|
||||||
// only capture xinput on the server.
|
|
||||||
m_xInputPollThread = new CThread(new TMethodJob<CMSWindowsXInput>(
|
|
||||||
this, &CMSWindowsXInput::xInputPollThread));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check for queued timing requests on client.
|
|
||||||
m_xInputTimingThread = new CThread(new TMethodJob<CMSWindowsXInput>(
|
|
||||||
this, &CMSWindowsXInput::xInputTimingThread));
|
|
||||||
|
|
||||||
// check for waiting feedback state on client.
|
|
||||||
m_xInputFeedbackThread = new CThread(new TMethodJob<CMSWindowsXInput>(
|
|
||||||
this, &CMSWindowsXInput::xInputFeedbackThread));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CMSWindowsXInput::~CMSWindowsXInput()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const
|
|
||||||
{
|
|
||||||
SetXInputButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const
|
|
||||||
{
|
|
||||||
SetXInputSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const
|
|
||||||
{
|
|
||||||
SetXInputTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::queueGameDeviceTimingReq() const
|
|
||||||
{
|
|
||||||
QueueXInputTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::gameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
if (!m_gameTimingStarted)
|
|
||||||
{
|
|
||||||
// record when timing started for calibration period.
|
|
||||||
m_gameTimingFirst = (UInt16)(ARCH->time() * 1000);
|
|
||||||
m_gameTimingStarted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_gameTimingWaiting = false;
|
|
||||||
m_gameFakeLagLast = m_gameFakeLag;
|
|
||||||
m_gameFakeLag = (UInt16)((ARCH->time() - m_gameLastTimingSent) * 1000);
|
|
||||||
m_gameFakeLagRecord.push_back(m_gameFakeLag);
|
|
||||||
|
|
||||||
if (m_gameFakeLag < m_gameFakeLagMin)
|
|
||||||
{
|
|
||||||
// record the lowest value so that the poll frequency
|
|
||||||
// is adjusted to track.
|
|
||||||
m_gameFakeLagMin = m_gameFakeLag;
|
|
||||||
}
|
|
||||||
else if (m_gameFakeLag > (m_gameFakeLagLast * 2))
|
|
||||||
{
|
|
||||||
// if fake lag has increased significantly since the last
|
|
||||||
// timing, then we must have reached the safe minimum.
|
|
||||||
m_gameFakeLagMin = m_gameFakeLagLast;
|
|
||||||
}
|
|
||||||
|
|
||||||
// only change poll frequency if it's a sensible value.
|
|
||||||
if (freq > kGamePollFreqMin && freq < kGamePollFreqMax)
|
|
||||||
{
|
|
||||||
m_gamePollFreq = freq;
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt16 timeSinceStart = ((UInt16)(ARCH->time() * 1000) - m_gameTimingFirst);
|
|
||||||
if (!m_gameTimingCalibrated && (timeSinceStart < kGameCalibrationPeriod))
|
|
||||||
{
|
|
||||||
// during the calibration period, increase polling speed
|
|
||||||
// to try and find the lowest lag value.
|
|
||||||
m_gamePollFreqAdjust = 1;
|
|
||||||
LOG((CLOG_DEBUG2 "calibrating game device poll frequency, start=%d, now=%d, since=%d",
|
|
||||||
m_gameTimingFirst, (int)(ARCH->time() * 1000), timeSinceStart));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// @bug - calibration seems to re-occur after a period of time,
|
|
||||||
// though, this would actually be a nice feature (but could be
|
|
||||||
// a bit risky -- could cause poor game play)... setting this
|
|
||||||
// stops calibration from happening again.
|
|
||||||
m_gameTimingCalibrated = true;
|
|
||||||
|
|
||||||
// only adjust poll frequency if outside desired limits.
|
|
||||||
m_gamePollFreqAdjust = 0;
|
|
||||||
if (m_gameFakeLag > m_gameFakeLagMin * 3)
|
|
||||||
{
|
|
||||||
m_gamePollFreqAdjust = 1;
|
|
||||||
}
|
|
||||||
else if (m_gameFakeLag < m_gameFakeLagMin)
|
|
||||||
{
|
|
||||||
m_gamePollFreqAdjust = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG((CLOG_DEBUG3 "game device timing, lag=%dms, freq=%dms, adjust=%dms, min=%dms",
|
|
||||||
m_gameFakeLag, m_gamePollFreq, m_gamePollFreqAdjust, m_gameFakeLagMin));
|
|
||||||
|
|
||||||
if (m_gameFakeLagRecord.size() >= kGameLagRecordMax)
|
|
||||||
{
|
|
||||||
UInt16 v, min = 65535, max = 0, total = 0;
|
|
||||||
std::vector<UInt16>::iterator it;
|
|
||||||
for (it = m_gameFakeLagRecord.begin(); it < m_gameFakeLagRecord.end(); ++it)
|
|
||||||
{
|
|
||||||
v = *it;
|
|
||||||
if (v < min)
|
|
||||||
{
|
|
||||||
min = v;
|
|
||||||
}
|
|
||||||
if (v > max)
|
|
||||||
{
|
|
||||||
max = v;
|
|
||||||
}
|
|
||||||
total += v;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG((CLOG_INFO "game device timing, min=%dms, max=%dms, avg=%dms",
|
|
||||||
min, max, (UInt16)(total / m_gameFakeLagRecord.size())));
|
|
||||||
m_gameFakeLagRecord.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
XInputSetStateFunc xInputSetStateFunc =
|
|
||||||
(XInputSetStateFunc)GetProcAddress(m_xinputModule, "XInputSetState");
|
|
||||||
|
|
||||||
if (xInputSetStateFunc == NULL)
|
|
||||||
{
|
|
||||||
throw XScreenXInputFailure("could not get function address: XInputSetState");
|
|
||||||
}
|
|
||||||
|
|
||||||
XINPUT_VIBRATION vibration;
|
|
||||||
ZeroMemory(&vibration, sizeof(XINPUT_VIBRATION));
|
|
||||||
vibration.wLeftMotorSpeed = m1;
|
|
||||||
vibration.wRightMotorSpeed = m2;
|
|
||||||
xInputSetStateFunc(id, &vibration);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::xInputPollThread(void*)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput poll thread started"));
|
|
||||||
|
|
||||||
XInputGetStateFunc xInputGetStateFunc =
|
|
||||||
(XInputGetStateFunc)GetProcAddress(m_xinputModule, "XInputGetState");
|
|
||||||
|
|
||||||
if (xInputGetStateFunc == NULL)
|
|
||||||
{
|
|
||||||
throw XScreenXInputFailure("could not get function address: XInputGetState");
|
|
||||||
}
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
XINPUT_STATE state;
|
|
||||||
bool end = false;
|
|
||||||
while (!end)
|
|
||||||
{
|
|
||||||
ZeroMemory(&state, sizeof(XINPUT_STATE));
|
|
||||||
DWORD result = xInputGetStateFunc(index, &state);
|
|
||||||
|
|
||||||
// timeout the timing request after 10 seconds
|
|
||||||
if (m_gameTimingWaiting && (ARCH->time() - m_gameLastTimingSent > 2))
|
|
||||||
{
|
|
||||||
m_gameTimingWaiting = false;
|
|
||||||
LOG((CLOG_DEBUG "game device timing request timed out"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// xinput controller is connected
|
|
||||||
if (result == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
// @todo game device state class
|
|
||||||
bool buttonsChanged = state.Gamepad.wButtons != m_gameButtonsLast;
|
|
||||||
bool leftTriggerChanged = state.Gamepad.bLeftTrigger != m_gameLeftTriggerLast;
|
|
||||||
bool rightTriggerChanged = state.Gamepad.bRightTrigger != m_gameRightTriggerLast;
|
|
||||||
bool leftStickXChanged = state.Gamepad.sThumbLX != m_gameLeftStickXLast;
|
|
||||||
bool leftStickYChanged = state.Gamepad.sThumbLY != m_gameLeftStickYLast;
|
|
||||||
bool rightStickXChanged = state.Gamepad.sThumbRX != m_gameRightStickXLast;
|
|
||||||
bool rightStickYChanged = state.Gamepad.sThumbRY != m_gameRightStickYLast;
|
|
||||||
|
|
||||||
m_gameButtonsLast = state.Gamepad.wButtons;
|
|
||||||
m_gameLeftTriggerLast = state.Gamepad.bLeftTrigger;
|
|
||||||
m_gameRightTriggerLast = state.Gamepad.bRightTrigger;
|
|
||||||
m_gameLeftStickXLast = state.Gamepad.sThumbLX;
|
|
||||||
m_gameLeftStickYLast = state.Gamepad.sThumbLY;
|
|
||||||
m_gameRightStickXLast = state.Gamepad.sThumbRX;
|
|
||||||
m_gameRightStickYLast = state.Gamepad.sThumbRY;
|
|
||||||
|
|
||||||
bool eventSent = false;
|
|
||||||
|
|
||||||
if (buttonsChanged)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput buttons changed"));
|
|
||||||
|
|
||||||
// xinput buttons convert exactly to synergy buttons
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceButtons(),
|
|
||||||
new IPrimaryScreen::CGameDeviceButtonInfo(index, state.Gamepad.wButtons));
|
|
||||||
|
|
||||||
eventSent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leftStickXChanged || leftStickYChanged || rightStickXChanged || rightStickYChanged)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput sticks changed"));
|
|
||||||
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceSticks(),
|
|
||||||
new IPrimaryScreen::CGameDeviceStickInfo(
|
|
||||||
index,
|
|
||||||
m_gameLeftStickXLast, m_gameLeftStickYLast,
|
|
||||||
m_gameRightStickXLast, m_gameRightStickYLast));
|
|
||||||
|
|
||||||
eventSent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leftTriggerChanged || rightTriggerChanged)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput triggers changed"));
|
|
||||||
|
|
||||||
// @todo seems wrong re-using x/y for a single value...
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceTriggers(),
|
|
||||||
new IPrimaryScreen::CGameDeviceTriggerInfo(
|
|
||||||
index,
|
|
||||||
state.Gamepad.bLeftTrigger,
|
|
||||||
state.Gamepad.bRightTrigger));
|
|
||||||
|
|
||||||
eventSent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (/*eventSent && */!m_gameTimingWaiting && (ARCH->time() - m_gameLastTimingSent > .5))
|
|
||||||
{
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceTimingReq(), NULL);
|
|
||||||
m_gameLastTimingSent = ARCH->time();
|
|
||||||
m_gameTimingWaiting = true;
|
|
||||||
|
|
||||||
LOG((CLOG_DEBUG "game device timing request at %.4f", m_gameLastTimingSent));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt16 sleep = m_gamePollFreq + m_gamePollFreqAdjust;
|
|
||||||
LOG((CLOG_DEBUG5 "xinput poll sleeping for %dms", sleep));
|
|
||||||
Sleep(sleep);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::xInputTimingThread(void*)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput timing thread started"));
|
|
||||||
|
|
||||||
bool end = false;
|
|
||||||
while (!end)
|
|
||||||
{
|
|
||||||
// if timing request was queued, a timing response is queued
|
|
||||||
// when the xinput status is faked; if it was faked, go tell
|
|
||||||
// the server when this happened.
|
|
||||||
if (DequeueXInputTimingResp())
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "dequeued game device timing response"));
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceTimingResp(),
|
|
||||||
new IPrimaryScreen::CGameDeviceTimingRespInfo(GetXInputFakeFreqMillis()));
|
|
||||||
}
|
|
||||||
|
|
||||||
// give the cpu a break.
|
|
||||||
Sleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CMSWindowsXInput::xInputFeedbackThread(void*)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "xinput feedback thread started"));
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
bool end = false;
|
|
||||||
while (!end)
|
|
||||||
{
|
|
||||||
WORD leftMotor, rightMotor;
|
|
||||||
if (DequeueXInputFeedback(&leftMotor, &rightMotor))
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "dequeued game device feedback"));
|
|
||||||
m_screen->sendEvent(m_events->forIScreen().gameDeviceFeedback(),
|
|
||||||
new IPrimaryScreen::CGameDeviceFeedbackInfo(index, leftMotor, rightMotor));
|
|
||||||
}
|
|
||||||
|
|
||||||
Sleep(50);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,92 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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 "CGameDevice.h"
|
|
||||||
#include "CThread.h"
|
|
||||||
#include "CGameDevice.h"
|
|
||||||
#include "BasicTypes.h"
|
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
#include "IPrimaryScreen.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
class CMSWindowsScreen;
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
kGamePollFreqDefault = 100,
|
|
||||||
kGamePollFreqMin = 50,
|
|
||||||
kGamePollFreqMax = 200,
|
|
||||||
kGameCalibrationPeriod = 10000, // 10 seconds
|
|
||||||
kGameLagRecordMax = 10,
|
|
||||||
};
|
|
||||||
|
|
||||||
class CMSWindowsXInput : public CGameDevice
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CMSWindowsXInput(CMSWindowsScreen* screen, const CGameDeviceInfo& gameDevice);
|
|
||||||
virtual ~CMSWindowsXInput();
|
|
||||||
|
|
||||||
void init(CMSWindowsScreen* screen);
|
|
||||||
|
|
||||||
// thread for polling xinput state.
|
|
||||||
void xInputPollThread(void*);
|
|
||||||
|
|
||||||
// thread for checking queued timing requests.
|
|
||||||
void xInputTimingThread(void*);
|
|
||||||
|
|
||||||
// thread for checking pending feedback state.
|
|
||||||
void xInputFeedbackThread(void*);
|
|
||||||
|
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq);
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const;
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const;
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const;
|
|
||||||
virtual void queueGameDeviceTimingReq() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
CMSWindowsScreen* m_screen;
|
|
||||||
const CGameDeviceInfo& m_gameDeviceInfo;
|
|
||||||
CThread* m_xInputPollThread;
|
|
||||||
CThread* m_xInputTimingThread;
|
|
||||||
CThread* m_xInputFeedbackThread;
|
|
||||||
WORD m_gameButtonsLast;
|
|
||||||
BYTE m_gameLeftTriggerLast;
|
|
||||||
BYTE m_gameRightTriggerLast;
|
|
||||||
SHORT m_gameLeftStickXLast;
|
|
||||||
SHORT m_gameLeftStickYLast;
|
|
||||||
SHORT m_gameRightStickXLast;
|
|
||||||
SHORT m_gameRightStickYLast;
|
|
||||||
double m_gameLastTimingSent;
|
|
||||||
bool m_gameTimingWaiting;
|
|
||||||
UInt16 m_gameFakeLag;
|
|
||||||
UInt16 m_gameFakeLagMin;
|
|
||||||
UInt16 m_gamePollFreq;
|
|
||||||
SInt8 m_gamePollFreqAdjust;
|
|
||||||
UInt16 m_gameTimingStarted;
|
|
||||||
UInt16 m_gameTimingFirst;
|
|
||||||
UInt16 m_gameFakeLagLast;
|
|
||||||
bool m_gameTimingCalibrated;
|
|
||||||
std::vector<UInt16> m_gameFakeLagRecord;
|
|
||||||
HMODULE m_xinputModule;
|
|
||||||
};
|
|
|
@ -33,7 +33,6 @@ if (WIN32)
|
||||||
CMSWindowsHookLibraryLoader.h
|
CMSWindowsHookLibraryLoader.h
|
||||||
IMSWindowsClipboardFacade.h
|
IMSWindowsClipboardFacade.h
|
||||||
CMSWindowsDebugOutputter.h
|
CMSWindowsDebugOutputter.h
|
||||||
CMSWindowsXInput.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(src
|
set(src
|
||||||
|
@ -55,50 +54,10 @@ if (WIN32)
|
||||||
CMSWindowsDebugOutputter.cpp
|
CMSWindowsDebugOutputter.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(inc_hook
|
list(APPEND src
|
||||||
CSynergyHook.h
|
${inc}
|
||||||
)
|
)
|
||||||
|
|
||||||
set(src_hook
|
|
||||||
CSynergyHook.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
|
|
||||||
list(APPEND inc
|
|
||||||
CMSWindowsXInput.h
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND src
|
|
||||||
CMSWindowsXInput.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
set(inc_xinhook
|
|
||||||
XInputHook.h
|
|
||||||
HookDLL.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(src_xinhook
|
|
||||||
XInputHook.cpp
|
|
||||||
HookDLL.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(inc_xinproxy13
|
|
||||||
XInput13.h
|
|
||||||
XInputProxy13.h
|
|
||||||
)
|
|
||||||
|
|
||||||
set(src_xinproxy13
|
|
||||||
XInputProxy13.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND src
|
|
||||||
${inc}
|
|
||||||
)
|
|
||||||
|
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
|
|
||||||
set(src
|
set(src
|
||||||
|
@ -141,6 +100,7 @@ set(inc
|
||||||
../ipc
|
../ipc
|
||||||
../net
|
../net
|
||||||
../io
|
../io
|
||||||
|
../synwinhk
|
||||||
)
|
)
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
|
@ -152,48 +112,6 @@ endif()
|
||||||
include_directories(${inc})
|
include_directories(${inc})
|
||||||
add_library(platform STATIC ${src})
|
add_library(platform STATIC ${src})
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
add_library(synrgyhk SHARED ${inc_hook} ${src_hook})
|
|
||||||
|
|
||||||
# copy the dlls (and supporting files) from the lib dir to
|
|
||||||
# the bin dir, so that synergyc and synergys can easily find them.
|
|
||||||
# we should leave the other libraries compiling to the lib dir,
|
|
||||||
# so that the bin dir remains tidy. the path is relative to the
|
|
||||||
# build dir (in this case, that's: build\src\lib\platform).
|
|
||||||
add_custom_command(
|
|
||||||
TARGET synrgyhk
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND xcopy /Y /Q
|
|
||||||
..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\synrgyhk.*
|
|
||||||
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\
|
|
||||||
)
|
|
||||||
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
include_directories($ENV{DXSDK_DIR}/Include)
|
|
||||||
add_library(synxinhk SHARED ${inc_xinhook} ${src_xinhook})
|
|
||||||
|
|
||||||
add_custom_command(
|
|
||||||
TARGET synxinhk
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND xcopy /Y /Q
|
|
||||||
..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\synxinhk.*
|
|
||||||
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\
|
|
||||||
)
|
|
||||||
|
|
||||||
# synergy xinput1_3.dll proxy
|
|
||||||
include_directories($ENV{DXSDK_DIR}/Include)
|
|
||||||
add_library(sxinpx13 SHARED ${inc_xinproxy13} ${src_xinproxy13})
|
|
||||||
target_link_libraries(sxinpx13 synxinhk)
|
|
||||||
add_custom_command(
|
|
||||||
TARGET sxinpx13
|
|
||||||
POST_BUILD
|
|
||||||
COMMAND xcopy /Y /Q
|
|
||||||
..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\sxinpx13.*
|
|
||||||
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
target_link_libraries(platform io net ipc synergy ${libs})
|
target_link_libraries(platform io net ipc synergy ${libs})
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -76,17 +76,12 @@ public:
|
||||||
virtual SInt32 getJumpZoneSize() const;
|
virtual SInt32 getJumpZoneSize() const;
|
||||||
virtual bool isAnyMouseButtonDown() const;
|
virtual bool isAnyMouseButtonDown() const;
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) { }
|
|
||||||
|
|
||||||
// ISecondaryScreen overrides
|
// ISecondaryScreen overrides
|
||||||
virtual void fakeMouseButton(ButtonID id, bool press);
|
virtual void fakeMouseButton(ButtonID id, bool press);
|
||||||
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
||||||
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const { }
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const { }
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const { }
|
|
||||||
virtual void queueGameDeviceTimingReq() const { }
|
|
||||||
|
|
||||||
// IPlatformScreen overrides
|
// IPlatformScreen overrides
|
||||||
virtual void enable();
|
virtual void enable();
|
||||||
|
@ -102,7 +97,6 @@ public:
|
||||||
virtual void setOptions(const COptionsList& options);
|
virtual void setOptions(const COptionsList& options);
|
||||||
virtual void setSequenceNumber(UInt32);
|
virtual void setSequenceNumber(UInt32);
|
||||||
virtual bool isPrimary() const;
|
virtual bool isPrimary() const;
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2) { }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// IPlatformScreen overrides
|
// IPlatformScreen overrides
|
||||||
|
|
|
@ -63,17 +63,12 @@ public:
|
||||||
virtual SInt32 getJumpZoneSize() const;
|
virtual SInt32 getJumpZoneSize() const;
|
||||||
virtual bool isAnyMouseButtonDown() const;
|
virtual bool isAnyMouseButtonDown() const;
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) { }
|
|
||||||
|
|
||||||
// ISecondaryScreen overrides
|
// ISecondaryScreen overrides
|
||||||
virtual void fakeMouseButton(ButtonID id, bool press);
|
virtual void fakeMouseButton(ButtonID id, bool press);
|
||||||
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
||||||
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const { }
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const { }
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const { }
|
|
||||||
virtual void queueGameDeviceTimingReq() const { }
|
|
||||||
|
|
||||||
// IPlatformScreen overrides
|
// IPlatformScreen overrides
|
||||||
virtual void enable();
|
virtual void enable();
|
||||||
|
@ -89,7 +84,6 @@ public:
|
||||||
virtual void setOptions(const COptionsList& options);
|
virtual void setOptions(const COptionsList& options);
|
||||||
virtual void setSequenceNumber(UInt32);
|
virtual void setSequenceNumber(UInt32);
|
||||||
virtual bool isPrimary() const;
|
virtual bool isPrimary() const;
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2) { }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// IPlatformScreen overrides
|
// IPlatformScreen overrides
|
||||||
|
|
|
@ -1,342 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------------------------------
|
|
||||||
Original comment:
|
|
||||||
|
|
||||||
APIHIJACK.CPP - Based on DelayLoadProfileDLL.CPP, by Matt Pietrek for MSJ February 2000.
|
|
||||||
http://msdn.microsoft.com/library/periodic/period00/hood0200.htm
|
|
||||||
Adapted by Wade Brainerd, wadeb@wadeb.com
|
|
||||||
--------------------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "HookDLL.h"
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
std::stringstream _hookDllLogStream;
|
|
||||||
#define LOG(s) \
|
|
||||||
_hookDllLogStream.str(""); \
|
|
||||||
_hookDllLogStream << "Synergy HookDLL: " << s << std::endl; \
|
|
||||||
OutputDebugString( _hookDllLogStream.str().c_str() );
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Called from the DLPD_IAT_STUB stubs. Increments "count" field of the stub
|
|
||||||
|
|
||||||
void __cdecl DefaultHook( PVOID dummy )
|
|
||||||
{
|
|
||||||
// asm only supported on 32-bit
|
|
||||||
#ifdef _M_IX86
|
|
||||||
__asm pushad // Save all general purpose registers
|
|
||||||
|
|
||||||
// Get return address, then subtract 5 (size of a CALL X instruction)
|
|
||||||
// The result points at a DLPD_IAT_STUB
|
|
||||||
|
|
||||||
// pointer math! &dummy-1 really subtracts sizeof(PVOID)
|
|
||||||
PDWORD pRetAddr = (PDWORD)(&dummy - 1);
|
|
||||||
|
|
||||||
DLPD_IAT_STUB * pDLPDStub = (DLPD_IAT_STUB *)(*pRetAddr - 5);
|
|
||||||
|
|
||||||
pDLPDStub->count++;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Remove the above conditional to get a cheezy API trace from
|
|
||||||
// the loader process. It's slow!
|
|
||||||
if ( !IMAGE_SNAP_BY_ORDINAL( pDLPDStub->pszNameOrOrdinal) )
|
|
||||||
{
|
|
||||||
LOG( "Called hooked function: " );
|
|
||||||
LOG( (PSTR)pDLPDStub->pszNameOrOrdinal );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__asm popad // Restore all general purpose registers
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// This function must be __cdecl!!!
|
|
||||||
void __cdecl DelayLoadProfileDLL_UpdateCount( PVOID dummy );
|
|
||||||
|
|
||||||
PIMAGE_IMPORT_DESCRIPTOR g_pFirstImportDesc;
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Given an HMODULE, returns a pointer to the PE header
|
|
||||||
|
|
||||||
PIMAGE_NT_HEADERS PEHeaderFromHModule(HMODULE hModule)
|
|
||||||
{
|
|
||||||
PIMAGE_NT_HEADERS pNTHeader = 0;
|
|
||||||
|
|
||||||
__try
|
|
||||||
{
|
|
||||||
if ( PIMAGE_DOS_HEADER(hModule)->e_magic != IMAGE_DOS_SIGNATURE )
|
|
||||||
__leave;
|
|
||||||
|
|
||||||
pNTHeader = PIMAGE_NT_HEADERS(PBYTE(hModule)
|
|
||||||
+ PIMAGE_DOS_HEADER(hModule)->e_lfanew);
|
|
||||||
|
|
||||||
if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )
|
|
||||||
pNTHeader = 0;
|
|
||||||
}
|
|
||||||
__except( EXCEPTION_EXECUTE_HANDLER )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
return pNTHeader;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Builds stubs for and redirects the IAT for one DLL (pImportDesc)
|
|
||||||
|
|
||||||
bool RedirectIAT( SDLLHook* DLLHook, PIMAGE_IMPORT_DESCRIPTOR pImportDesc, PVOID pBaseLoadAddr )
|
|
||||||
{
|
|
||||||
PIMAGE_THUNK_DATA pIAT; // Ptr to import address table
|
|
||||||
PIMAGE_THUNK_DATA pINT; // Ptr to import names table
|
|
||||||
PIMAGE_THUNK_DATA pIteratingIAT;
|
|
||||||
|
|
||||||
// Figure out which OS platform we're on
|
|
||||||
OSVERSIONINFO osvi;
|
|
||||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
|
||||||
GetVersionEx( &osvi );
|
|
||||||
|
|
||||||
// If no import names table, we can't redirect this, so bail
|
|
||||||
if ( pImportDesc->OriginalFirstThunk == 0 )
|
|
||||||
{
|
|
||||||
LOG( "no IAT available." );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
pIAT = MakePtr( PIMAGE_THUNK_DATA, pBaseLoadAddr, pImportDesc->FirstThunk );
|
|
||||||
pINT = MakePtr( PIMAGE_THUNK_DATA, pBaseLoadAddr, pImportDesc->OriginalFirstThunk );
|
|
||||||
|
|
||||||
// Count how many entries there are in this IAT. Array is 0 terminated
|
|
||||||
pIteratingIAT = pIAT;
|
|
||||||
unsigned cFuncs = 0;
|
|
||||||
while ( pIteratingIAT->u1.Function )
|
|
||||||
{
|
|
||||||
cFuncs++;
|
|
||||||
pIteratingIAT++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( cFuncs == 0 ) // If no imported functions, we're done!
|
|
||||||
{
|
|
||||||
LOG( "no imported functions" );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// These next few lines ensure that we'll be able to modify the IAT,
|
|
||||||
// which is often in a read-only section in the EXE.
|
|
||||||
DWORD flOldProtect, flNewProtect, flDontCare;
|
|
||||||
MEMORY_BASIC_INFORMATION mbi;
|
|
||||||
|
|
||||||
// Get the current protection attributes
|
|
||||||
VirtualQuery( pIAT, &mbi, sizeof(mbi) );
|
|
||||||
|
|
||||||
// remove ReadOnly and ExecuteRead attributes, add on ReadWrite flag
|
|
||||||
flNewProtect = mbi.Protect;
|
|
||||||
flNewProtect &= ~(PAGE_READONLY | PAGE_EXECUTE_READ);
|
|
||||||
flNewProtect |= (PAGE_READWRITE);
|
|
||||||
|
|
||||||
if ( !VirtualProtect( pIAT, sizeof(PVOID) * cFuncs,
|
|
||||||
flNewProtect, &flOldProtect) )
|
|
||||||
{
|
|
||||||
LOG( "could not remove ReadOnly and ExecuteRead attributes, or add ReadWrite flag" );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the Default hook is enabled, build an array of redirection stubs in the processes memory.
|
|
||||||
DLPD_IAT_STUB * pStubs = 0;
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
{
|
|
||||||
// Allocate memory for the redirection stubs. Make one extra stub at the
|
|
||||||
// end to be a sentinel
|
|
||||||
pStubs = new DLPD_IAT_STUB[ cFuncs + 1];
|
|
||||||
if ( !pStubs )
|
|
||||||
{
|
|
||||||
LOG( "could not allocate memory for redirection stubs" );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scan through the IAT, completing the stubs and redirecting the IAT
|
|
||||||
// entries to point to the stubs
|
|
||||||
pIteratingIAT = pIAT;
|
|
||||||
|
|
||||||
while ( pIteratingIAT->u1.Function )
|
|
||||||
{
|
|
||||||
void* HookFn = 0; // Set to either the SFunctionHook or pStubs.
|
|
||||||
|
|
||||||
if ( !IMAGE_SNAP_BY_ORDINAL( pINT->u1.Ordinal ) ) // import by name
|
|
||||||
{
|
|
||||||
PIMAGE_IMPORT_BY_NAME pImportName = MakePtr( PIMAGE_IMPORT_BY_NAME, pBaseLoadAddr, pINT->u1.AddressOfData );
|
|
||||||
|
|
||||||
LOG( "checking function with name: " << pImportName->Name );
|
|
||||||
|
|
||||||
// Iterate through the hook functions, searching for this import.
|
|
||||||
SFunctionHook* FHook = DLLHook->Functions;
|
|
||||||
while ( FHook->Name )
|
|
||||||
{
|
|
||||||
if ( lstrcmpi( FHook->Name, (char*)pImportName->Name ) == 0 )
|
|
||||||
{
|
|
||||||
// Save the old function in the SFunctionHook structure and get the new one.
|
|
||||||
FHook->OrigFn = (void*)pIteratingIAT->u1.Function;
|
|
||||||
HookFn = FHook->HookFn;
|
|
||||||
|
|
||||||
LOG( "hooked function: " << pImportName->Name );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
FHook++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the default function is enabled, store the name for the user.
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
pStubs->pszNameOrOrdinal = (DWORD)&pImportName->Name;
|
|
||||||
}
|
|
||||||
else // added comparison for ordinal
|
|
||||||
{
|
|
||||||
LOG( "checking function at ordinal: " << pINT->u1.Ordinal );
|
|
||||||
|
|
||||||
SFunctionHook* FHook = DLLHook->Functions;
|
|
||||||
while ( FHook->Name )
|
|
||||||
{
|
|
||||||
if ( (DWORD)FHook->Name == pINT->u1.Ordinal )
|
|
||||||
{
|
|
||||||
// Save the old function in the SFunctionHook structure and get the new one.
|
|
||||||
FHook->OrigFn = (void*)pIteratingIAT->u1.Function;
|
|
||||||
HookFn = FHook->HookFn;
|
|
||||||
|
|
||||||
LOG( "hooked ordinal: " << pINT->u1.Ordinal );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
FHook++;
|
|
||||||
}
|
|
||||||
// If the default function is enabled, store the ordinal for the user.
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
pStubs->pszNameOrOrdinal = (DWORD)pINT->u1.Ordinal;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the default function is enabled, fill in the fields to the stub code.
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
{
|
|
||||||
pStubs->data_call = (DWORD)(PDWORD)DLLHook->DefaultFn
|
|
||||||
- (DWORD)(PDWORD)&pStubs->instr_JMP;
|
|
||||||
pStubs->data_JMP = *(PDWORD)pIteratingIAT - (DWORD)(PDWORD)&pStubs->count;
|
|
||||||
|
|
||||||
// If it wasn't manually hooked, use the Stub function.
|
|
||||||
if ( !HookFn )
|
|
||||||
HookFn = (void*)pStubs;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace the IAT function pointer if we have a hook.
|
|
||||||
if ( HookFn )
|
|
||||||
{
|
|
||||||
// Cheez-o hack to see if what we're importing is code or data.
|
|
||||||
// If it's code, we shouldn't be able to write to it
|
|
||||||
if ( IsBadWritePtr( (PVOID)pIteratingIAT->u1.Function, 1 ) )
|
|
||||||
{
|
|
||||||
pIteratingIAT->u1.Function = (DWORD)(PDWORD)HookFn;
|
|
||||||
}
|
|
||||||
else if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
|
|
||||||
{
|
|
||||||
// Special hack for Win9X, which builds stubs for imported
|
|
||||||
// functions in system DLLs (Loaded above 2GB). These stubs are
|
|
||||||
// writeable, so we have to explicitly check for this case
|
|
||||||
if ( pIteratingIAT->u1.Function > (DWORD)(PDWORD)0x80000000 )
|
|
||||||
pIteratingIAT->u1.Function = (DWORD)(PDWORD)HookFn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
pStubs++; // Advance to next stub
|
|
||||||
|
|
||||||
pIteratingIAT++; // Advance to next IAT entry
|
|
||||||
pINT++; // Advance to next INT entry
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( DLLHook->UseDefault )
|
|
||||||
pStubs->pszNameOrOrdinal = 0; // Final stub is a sentinel
|
|
||||||
|
|
||||||
// Put the page attributes back the way they were.
|
|
||||||
VirtualProtect( pIAT, sizeof(PVOID) * cFuncs, flOldProtect, &flDontCare);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Top level routine to find the EXE's imports, and redirect them
|
|
||||||
bool HookAPICalls( SDLLHook* hook )
|
|
||||||
{
|
|
||||||
if ( !hook )
|
|
||||||
{
|
|
||||||
LOG("no hook");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
HMODULE hModEXE = GetModuleHandle( 0 );
|
|
||||||
|
|
||||||
PIMAGE_NT_HEADERS pExeNTHdr = PEHeaderFromHModule( hModEXE );
|
|
||||||
|
|
||||||
if ( !pExeNTHdr )
|
|
||||||
{
|
|
||||||
LOG("no PE header");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD importRVA = pExeNTHdr->OptionalHeader.DataDirectory
|
|
||||||
[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
|
|
||||||
if ( !importRVA )
|
|
||||||
{
|
|
||||||
LOG("no virtual address for image directory entry import");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert imports RVA to a usable pointer
|
|
||||||
PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr( PIMAGE_IMPORT_DESCRIPTOR,
|
|
||||||
hModEXE, importRVA );
|
|
||||||
|
|
||||||
// Save off imports address in a global for later use
|
|
||||||
g_pFirstImportDesc = pImportDesc;
|
|
||||||
|
|
||||||
// Iterate through each import descriptor, and redirect if appropriate
|
|
||||||
while ( pImportDesc->FirstThunk )
|
|
||||||
{
|
|
||||||
PSTR pszImportModuleName = MakePtr( PSTR, hModEXE, pImportDesc->Name);
|
|
||||||
|
|
||||||
if ( lstrcmpi( pszImportModuleName, hook->Name ) == 0 )
|
|
||||||
{
|
|
||||||
LOG( "found " << hook->Name << " in process" );
|
|
||||||
|
|
||||||
if ( RedirectIAT( hook, pImportDesc, (PVOID)hModEXE ) )
|
|
||||||
{
|
|
||||||
LOG( "redirected IAT ok" );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG( "failed to redirect IAT" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pImportDesc++; // Advance to next import descriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------------------------------
|
|
||||||
Original comment:
|
|
||||||
|
|
||||||
APIHIJACK.H - Based on DelayLoadProfileDLL.CPP, by Matt Pietrek for MSJ February 2000.
|
|
||||||
http://msdn.microsoft.com/library/periodic/period00/hood0200.htm
|
|
||||||
Adapted by Wade Brainerd, wadeb@wadeb.com
|
|
||||||
--------------------------------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#pragma warning(disable:4200)
|
|
||||||
|
|
||||||
// Macro for convenient pointer addition.
|
|
||||||
// Essentially treats the last two parameters as DWORDs. The first
|
|
||||||
// parameter is used to typecast the result to the appropriate pointer type.
|
|
||||||
#define MakePtr(cast, ptr, addValue ) (cast)( (DWORD)(ptr)+(DWORD)(addValue))
|
|
||||||
|
|
||||||
// Default Hook Stub Structure: Contains data about the original function, Name/Ordinal, Address
|
|
||||||
// and a Count field. This is actually a block of assembly code.
|
|
||||||
#pragma pack( push, 1 )
|
|
||||||
struct DLPD_IAT_STUB
|
|
||||||
{
|
|
||||||
BYTE instr_CALL;
|
|
||||||
DWORD data_call;
|
|
||||||
BYTE instr_JMP;
|
|
||||||
DWORD data_JMP;
|
|
||||||
DWORD count;
|
|
||||||
DWORD pszNameOrOrdinal;
|
|
||||||
|
|
||||||
DLPD_IAT_STUB() : instr_CALL( 0xE8 ), instr_JMP( 0xE9 ), count( 0 ) {}
|
|
||||||
};
|
|
||||||
#pragma pack( pop )
|
|
||||||
|
|
||||||
// Example DefaultHook procedure, called from the DLPD_IAT_STUB stubs.
|
|
||||||
// Increments "count" field of the stub.
|
|
||||||
// See the implementation for more information.
|
|
||||||
void __cdecl DefaultHook( PVOID dummy );
|
|
||||||
|
|
||||||
struct SFunctionHook
|
|
||||||
{
|
|
||||||
char* Name; // Function name, e.g. "DirectDrawCreateEx".
|
|
||||||
void* HookFn; // Address of your function.
|
|
||||||
void* OrigFn; // Stored by HookAPICalls, the address of the original function.
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SDLLHook
|
|
||||||
{
|
|
||||||
// Name of the DLL, e.g. "DDRAW.DLL"
|
|
||||||
char* Name;
|
|
||||||
|
|
||||||
// Set true to call the default for all non-hooked functions before they are executed.
|
|
||||||
bool UseDefault;
|
|
||||||
void* DefaultFn;
|
|
||||||
|
|
||||||
// Function hook array. Terminated with a NULL Name field.
|
|
||||||
SFunctionHook Functions[];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Hook functions one or more DLLs.
|
|
||||||
bool HookAPICalls( SDLLHook* hook );
|
|
|
@ -1,229 +0,0 @@
|
||||||
/***************************************************************************
|
|
||||||
* *
|
|
||||||
* XInput.h -- This module defines XBOX controller APIs *
|
|
||||||
* and constansts for the Windows platform. *
|
|
||||||
* *
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (c) Microsoft Corp. All rights reserved. *
|
|
||||||
* *
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef _XINPUT_H_
|
|
||||||
#define _XINPUT_H_
|
|
||||||
|
|
||||||
#include <windef.h>
|
|
||||||
|
|
||||||
// Current name of the DLL shipped in the same SDK as this header.
|
|
||||||
// The name reflects the current version
|
|
||||||
#ifndef XINPUT_USE_9_1_0
|
|
||||||
#define XINPUT_DLL_A "xinput1_3.dll"
|
|
||||||
#define XINPUT_DLL_W L"xinput1_3.dll"
|
|
||||||
#else
|
|
||||||
#define XINPUT_DLL_A "xinput9_1_0.dll"
|
|
||||||
#define XINPUT_DLL_W L"xinput9_1_0.dll"
|
|
||||||
#endif
|
|
||||||
#ifdef UNICODE
|
|
||||||
#define XINPUT_DLL XINPUT_DLL_W
|
|
||||||
#else
|
|
||||||
#define XINPUT_DLL XINPUT_DLL_A
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Device types available in XINPUT_CAPABILITIES
|
|
||||||
//
|
|
||||||
#define XINPUT_DEVTYPE_GAMEPAD 0x01
|
|
||||||
|
|
||||||
//
|
|
||||||
// Device subtypes available in XINPUT_CAPABILITIES
|
|
||||||
//
|
|
||||||
#define XINPUT_DEVSUBTYPE_GAMEPAD 0x01
|
|
||||||
|
|
||||||
#ifndef XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
#define XINPUT_DEVSUBTYPE_WHEEL 0x02
|
|
||||||
#define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03
|
|
||||||
#define XINPUT_DEVSUBTYPE_FLIGHT_SICK 0x04
|
|
||||||
#define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
|
|
||||||
#define XINPUT_DEVSUBTYPE_GUITAR 0x06
|
|
||||||
#define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
|
|
||||||
|
|
||||||
#endif // !XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Flags for XINPUT_CAPABILITIES
|
|
||||||
//
|
|
||||||
#define XINPUT_CAPS_VOICE_SUPPORTED 0x0004
|
|
||||||
|
|
||||||
//
|
|
||||||
// Constants for gamepad buttons
|
|
||||||
//
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_UP 0x0001
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_DOWN 0x0002
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_LEFT 0x0004
|
|
||||||
#define XINPUT_GAMEPAD_DPAD_RIGHT 0x0008
|
|
||||||
#define XINPUT_GAMEPAD_START 0x0010
|
|
||||||
#define XINPUT_GAMEPAD_BACK 0x0020
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_THUMB 0x0040
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_THUMB 0x0080
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
|
|
||||||
#define XINPUT_GAMEPAD_A 0x1000
|
|
||||||
#define XINPUT_GAMEPAD_B 0x2000
|
|
||||||
#define XINPUT_GAMEPAD_X 0x4000
|
|
||||||
#define XINPUT_GAMEPAD_Y 0x8000
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Gamepad thresholds
|
|
||||||
//
|
|
||||||
#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849
|
|
||||||
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
|
|
||||||
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30
|
|
||||||
|
|
||||||
//
|
|
||||||
// Flags to pass to XInputGetCapabilities
|
|
||||||
//
|
|
||||||
#define XINPUT_FLAG_GAMEPAD 0x00000001
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
//
|
|
||||||
// Devices that support batteries
|
|
||||||
//
|
|
||||||
#define BATTERY_DEVTYPE_GAMEPAD 0x00
|
|
||||||
#define BATTERY_DEVTYPE_HEADSET 0x01
|
|
||||||
|
|
||||||
//
|
|
||||||
// Flags for battery status level
|
|
||||||
//
|
|
||||||
#define BATTERY_TYPE_DISCONNECTED 0x00 // This device is not connected
|
|
||||||
#define BATTERY_TYPE_WIRED 0x01 // Wired device, no battery
|
|
||||||
#define BATTERY_TYPE_ALKALINE 0x02 // Alkaline battery source
|
|
||||||
#define BATTERY_TYPE_NIMH 0x03 // Nickel Metal Hydride battery source
|
|
||||||
#define BATTERY_TYPE_UNKNOWN 0xFF // Cannot determine the battery type
|
|
||||||
|
|
||||||
// These are only valid for wireless, connected devices, with known battery types
|
|
||||||
// The amount of use time remaining depends on the type of device.
|
|
||||||
#define BATTERY_LEVEL_EMPTY 0x00
|
|
||||||
#define BATTERY_LEVEL_LOW 0x01
|
|
||||||
#define BATTERY_LEVEL_MEDIUM 0x02
|
|
||||||
#define BATTERY_LEVEL_FULL 0x03
|
|
||||||
|
|
||||||
// User index definitions
|
|
||||||
#define XUSER_MAX_COUNT 4
|
|
||||||
|
|
||||||
#define XUSER_INDEX_ANY 0x000000FF
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Codes returned for the gamepad keystroke
|
|
||||||
//
|
|
||||||
|
|
||||||
#define VK_PAD_A 0x5800
|
|
||||||
#define VK_PAD_B 0x5801
|
|
||||||
#define VK_PAD_X 0x5802
|
|
||||||
#define VK_PAD_Y 0x5803
|
|
||||||
#define VK_PAD_RSHOULDER 0x5804
|
|
||||||
#define VK_PAD_LSHOULDER 0x5805
|
|
||||||
#define VK_PAD_LTRIGGER 0x5806
|
|
||||||
#define VK_PAD_RTRIGGER 0x5807
|
|
||||||
|
|
||||||
#define VK_PAD_DPAD_UP 0x5810
|
|
||||||
#define VK_PAD_DPAD_DOWN 0x5811
|
|
||||||
#define VK_PAD_DPAD_LEFT 0x5812
|
|
||||||
#define VK_PAD_DPAD_RIGHT 0x5813
|
|
||||||
#define VK_PAD_START 0x5814
|
|
||||||
#define VK_PAD_BACK 0x5815
|
|
||||||
#define VK_PAD_LTHUMB_PRESS 0x5816
|
|
||||||
#define VK_PAD_RTHUMB_PRESS 0x5817
|
|
||||||
|
|
||||||
#define VK_PAD_LTHUMB_UP 0x5820
|
|
||||||
#define VK_PAD_LTHUMB_DOWN 0x5821
|
|
||||||
#define VK_PAD_LTHUMB_RIGHT 0x5822
|
|
||||||
#define VK_PAD_LTHUMB_LEFT 0x5823
|
|
||||||
#define VK_PAD_LTHUMB_UPLEFT 0x5824
|
|
||||||
#define VK_PAD_LTHUMB_UPRIGHT 0x5825
|
|
||||||
#define VK_PAD_LTHUMB_DOWNRIGHT 0x5826
|
|
||||||
#define VK_PAD_LTHUMB_DOWNLEFT 0x5827
|
|
||||||
|
|
||||||
#define VK_PAD_RTHUMB_UP 0x5830
|
|
||||||
#define VK_PAD_RTHUMB_DOWN 0x5831
|
|
||||||
#define VK_PAD_RTHUMB_RIGHT 0x5832
|
|
||||||
#define VK_PAD_RTHUMB_LEFT 0x5833
|
|
||||||
#define VK_PAD_RTHUMB_UPLEFT 0x5834
|
|
||||||
#define VK_PAD_RTHUMB_UPRIGHT 0x5835
|
|
||||||
#define VK_PAD_RTHUMB_DOWNRIGHT 0x5836
|
|
||||||
#define VK_PAD_RTHUMB_DOWNLEFT 0x5837
|
|
||||||
|
|
||||||
//
|
|
||||||
// Flags used in XINPUT_KEYSTROKE
|
|
||||||
//
|
|
||||||
#define XINPUT_KEYSTROKE_KEYDOWN 0x0001
|
|
||||||
#define XINPUT_KEYSTROKE_KEYUP 0x0002
|
|
||||||
#define XINPUT_KEYSTROKE_REPEAT 0x0004
|
|
||||||
|
|
||||||
#endif //!XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
//
|
|
||||||
// Structures used by XInput APIs
|
|
||||||
//
|
|
||||||
typedef struct _XINPUT_GAMEPAD
|
|
||||||
{
|
|
||||||
WORD wButtons;
|
|
||||||
BYTE bLeftTrigger;
|
|
||||||
BYTE bRightTrigger;
|
|
||||||
SHORT sThumbLX;
|
|
||||||
SHORT sThumbLY;
|
|
||||||
SHORT sThumbRX;
|
|
||||||
SHORT sThumbRY;
|
|
||||||
} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_STATE
|
|
||||||
{
|
|
||||||
DWORD dwPacketNumber;
|
|
||||||
XINPUT_GAMEPAD Gamepad;
|
|
||||||
} XINPUT_STATE, *PXINPUT_STATE;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_VIBRATION
|
|
||||||
{
|
|
||||||
WORD wLeftMotorSpeed;
|
|
||||||
WORD wRightMotorSpeed;
|
|
||||||
} XINPUT_VIBRATION, *PXINPUT_VIBRATION;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_CAPABILITIES
|
|
||||||
{
|
|
||||||
BYTE Type;
|
|
||||||
BYTE SubType;
|
|
||||||
WORD Flags;
|
|
||||||
XINPUT_GAMEPAD Gamepad;
|
|
||||||
XINPUT_VIBRATION Vibration;
|
|
||||||
} XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;
|
|
||||||
|
|
||||||
#ifndef XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
typedef struct _XINPUT_BATTERY_INFORMATION
|
|
||||||
{
|
|
||||||
BYTE BatteryType;
|
|
||||||
BYTE BatteryLevel;
|
|
||||||
} XINPUT_BATTERY_INFORMATION, *PXINPUT_BATTERY_INFORMATION;
|
|
||||||
|
|
||||||
typedef struct _XINPUT_KEYSTROKE
|
|
||||||
{
|
|
||||||
WORD VirtualKey;
|
|
||||||
WCHAR Unicode;
|
|
||||||
WORD Flags;
|
|
||||||
BYTE UserIndex;
|
|
||||||
BYTE HidCode;
|
|
||||||
} XINPUT_KEYSTROKE, *PXINPUT_KEYSTROKE;
|
|
||||||
|
|
||||||
#endif // !XINPUT_USE_9_1_0
|
|
||||||
|
|
||||||
//
|
|
||||||
// XInput APIs
|
|
||||||
//
|
|
||||||
|
|
||||||
// now defined in proxy class.
|
|
||||||
|
|
||||||
#endif //_XINPUT_H_
|
|
|
@ -1,296 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#define SYNERGY_EXPORT_XINPUT_HOOKS
|
|
||||||
#define REQUIRED_XINPUT_DLL "xinput1_3.dll"
|
|
||||||
#define HOOK_TIMEOUT 10000 // 10 sec
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <XInput.h>
|
|
||||||
#include "XInputHook.h"
|
|
||||||
#include "HookDLL.h"
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
HINSTANCE dll;
|
|
||||||
char name[256];
|
|
||||||
|
|
||||||
#pragma data_seg(".SHARED")
|
|
||||||
|
|
||||||
HHOOK s_hook = NULL;
|
|
||||||
|
|
||||||
// @todo use a struct for multiple gamepad support
|
|
||||||
WORD s_buttons = 0;
|
|
||||||
SHORT s_leftStickX = 0;
|
|
||||||
SHORT s_leftStickY = 0;
|
|
||||||
SHORT s_rightStickX = 0;
|
|
||||||
SHORT s_rightStickY = 0;
|
|
||||||
BYTE s_leftTrigger = 0;
|
|
||||||
BYTE s_rightTrigger = 0;
|
|
||||||
BOOL s_timingReqQueued = FALSE;
|
|
||||||
BOOL s_timingRespQueued = FALSE;
|
|
||||||
DWORD s_lastFakeMillis = 0;
|
|
||||||
WORD s_fakeFreqMillis = 0;
|
|
||||||
DWORD s_packetNumber = 0;
|
|
||||||
WORD s_leftMotor = 0;
|
|
||||||
WORD s_rightMotor = 0;
|
|
||||||
BOOL s_feedbackQueued = FALSE;
|
|
||||||
|
|
||||||
#pragma data_seg()
|
|
||||||
|
|
||||||
#pragma comment(linker, "/SECTION:.SHARED,RWS")
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
std::stringstream _xInputHookLogStream;
|
|
||||||
#define LOG(s) \
|
|
||||||
_xInputHookLogStream.str(""); \
|
|
||||||
_xInputHookLogStream << "Synergy XInputHook: " << s << endl; \
|
|
||||||
OutputDebugString( _xInputHookLogStream.str().c_str())
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
SDLLHook s_xInputHook =
|
|
||||||
{
|
|
||||||
XINPUT_DLL,
|
|
||||||
false, NULL,
|
|
||||||
{
|
|
||||||
{ (char*)(0x80000002), HookXInputGetState },
|
|
||||||
{ (char*)(0x80000003), HookXInputSetState },
|
|
||||||
{ (char*)(0x80000004), HookXInputGetCapabilities },
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOL APIENTRY
|
|
||||||
DllMain(HINSTANCE module, DWORD reason, LPVOID reserved)
|
|
||||||
{
|
|
||||||
if (reason == DLL_PROCESS_ATTACH)
|
|
||||||
{
|
|
||||||
dll = module;
|
|
||||||
|
|
||||||
// disable unwanted thread notifications to reduce overhead
|
|
||||||
DisableThreadLibraryCalls(dll);
|
|
||||||
|
|
||||||
GetModuleFileName(GetModuleHandle(NULL), name, sizeof(name));
|
|
||||||
|
|
||||||
// don't hook synergys (this needs to detect real input)
|
|
||||||
if (string(name).find("synergy") == string::npos)
|
|
||||||
{
|
|
||||||
LOG("checking '" << name << "' for " << XINPUT_DLL);
|
|
||||||
HookAPICalls(&s_xInputHook);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SetXInputButtons(DWORD userIndex, WORD buttons)
|
|
||||||
{
|
|
||||||
s_buttons = buttons;
|
|
||||||
|
|
||||||
s_packetNumber++;
|
|
||||||
|
|
||||||
LOG("SetXInputButtons: idx=" << userIndex << ", btns=" << buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SetXInputSticks(DWORD userIndex, SHORT lx, SHORT ly, SHORT rx, SHORT ry)
|
|
||||||
{
|
|
||||||
s_leftStickX = lx;
|
|
||||||
s_leftStickY = ly;
|
|
||||||
s_rightStickX = rx;
|
|
||||||
s_rightStickY = ry;
|
|
||||||
|
|
||||||
s_packetNumber++;
|
|
||||||
|
|
||||||
LOG("SetXInputSticks:" <<
|
|
||||||
" l=" << s_leftStickX << "," << s_leftStickY <<
|
|
||||||
" r=" << s_rightStickX << "," << s_rightStickY);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SetXInputTriggers(DWORD userIndex, BYTE left, BYTE right)
|
|
||||||
{
|
|
||||||
s_leftTrigger = left;
|
|
||||||
s_rightTrigger = right;
|
|
||||||
|
|
||||||
s_packetNumber++;
|
|
||||||
|
|
||||||
LOG("SetXInputTriggers: " <<
|
|
||||||
"l=" << (int)left << " r=" << (int)right);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
QueueXInputTimingReq()
|
|
||||||
{
|
|
||||||
s_timingReqQueued = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
DequeueXInputTimingResp()
|
|
||||||
{
|
|
||||||
BOOL result = s_timingRespQueued;
|
|
||||||
s_timingRespQueued = FALSE;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL
|
|
||||||
DequeueXInputFeedback(WORD* leftMotor, WORD* rightMotor)
|
|
||||||
{
|
|
||||||
if (s_feedbackQueued)
|
|
||||||
{
|
|
||||||
*leftMotor = s_leftMotor;
|
|
||||||
*rightMotor = s_rightMotor;
|
|
||||||
s_feedbackQueued = FALSE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
WORD
|
|
||||||
GetXInputFakeFreqMillis()
|
|
||||||
{
|
|
||||||
return s_fakeFreqMillis;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD WINAPI
|
|
||||||
HookXInputGetState(DWORD userIndex, XINPUT_STATE* state)
|
|
||||||
{
|
|
||||||
// @todo multiple device support
|
|
||||||
if (userIndex != 0)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD now = GetTickCount();
|
|
||||||
s_fakeFreqMillis = (WORD)(now - s_lastFakeMillis);
|
|
||||||
s_lastFakeMillis = now;
|
|
||||||
|
|
||||||
state->dwPacketNumber = s_packetNumber;
|
|
||||||
state->Gamepad.wButtons = s_buttons;
|
|
||||||
state->Gamepad.bLeftTrigger = s_leftTrigger;
|
|
||||||
state->Gamepad.bRightTrigger = s_rightTrigger;
|
|
||||||
state->Gamepad.sThumbLX = s_leftStickX;
|
|
||||||
state->Gamepad.sThumbLY = s_leftStickY;
|
|
||||||
state->Gamepad.sThumbRX = s_rightStickX;
|
|
||||||
state->Gamepad.sThumbRY = s_rightStickY;
|
|
||||||
|
|
||||||
LOG("HookXInputGetState"
|
|
||||||
<< ", idx=" << userIndex
|
|
||||||
<< ", pkt=" << state->dwPacketNumber
|
|
||||||
<< ", btn=" << state->Gamepad.wButtons
|
|
||||||
<< ", t1=" << (int)state->Gamepad.bLeftTrigger
|
|
||||||
<< ", t2=" << (int)state->Gamepad.bRightTrigger
|
|
||||||
<< ", s1=" << state->Gamepad.sThumbLX << "," << state->Gamepad.sThumbLY
|
|
||||||
<< ", s2=" << state->Gamepad.sThumbRX << "," << state->Gamepad.sThumbRY);
|
|
||||||
|
|
||||||
if (s_timingReqQueued)
|
|
||||||
{
|
|
||||||
s_timingRespQueued = TRUE;
|
|
||||||
s_timingReqQueued = FALSE;
|
|
||||||
LOG("timing response queued");
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD WINAPI
|
|
||||||
HookXInputSetState(DWORD userIndex, XINPUT_VIBRATION* vibration)
|
|
||||||
{
|
|
||||||
// @todo multiple device support
|
|
||||||
if (userIndex != 0)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// only change values and queue feedback change if
|
|
||||||
// feedback has actually changed.
|
|
||||||
if ((s_leftMotor != vibration->wLeftMotorSpeed) ||
|
|
||||||
(s_rightMotor != vibration->wRightMotorSpeed))
|
|
||||||
{
|
|
||||||
s_leftMotor = vibration->wLeftMotorSpeed;
|
|
||||||
s_rightMotor = vibration->wRightMotorSpeed;
|
|
||||||
s_feedbackQueued = TRUE;
|
|
||||||
|
|
||||||
LOG("HookXInputSetState"
|
|
||||||
", idx=" << userIndex <<
|
|
||||||
", lm=" << s_leftMotor <<
|
|
||||||
", rm=" << s_rightMotor);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD WINAPI
|
|
||||||
HookXInputGetCapabilities(DWORD userIndex, DWORD flags, XINPUT_CAPABILITIES* capabilities)
|
|
||||||
{
|
|
||||||
// @todo multiple device support
|
|
||||||
if (userIndex != 0)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG("HookXInputGetCapabilities"
|
|
||||||
", idx=" << userIndex <<
|
|
||||||
", flags=" << flags);
|
|
||||||
|
|
||||||
capabilities->Type = 1;
|
|
||||||
capabilities->SubType = 1;
|
|
||||||
capabilities->Flags = 4;
|
|
||||||
capabilities->Gamepad.bLeftTrigger = 1;
|
|
||||||
capabilities->Gamepad.bRightTrigger = 1;
|
|
||||||
capabilities->Gamepad.sThumbLX = 1;
|
|
||||||
capabilities->Gamepad.sThumbLY = 1;
|
|
||||||
capabilities->Gamepad.sThumbRX = 1;
|
|
||||||
capabilities->Gamepad.sThumbRY = 1;
|
|
||||||
capabilities->Gamepad.wButtons = 62463;
|
|
||||||
capabilities->Vibration.wLeftMotorSpeed = 1;
|
|
||||||
capabilities->Vibration.wRightMotorSpeed = 1;
|
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
synxinhk_API LRESULT CALLBACK
|
|
||||||
HookProc(int code, WPARAM wParam, LPARAM lParam)
|
|
||||||
{
|
|
||||||
return CallNextHookEx(s_hook, code, wParam, lParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
synxinhk_API BOOL
|
|
||||||
InstallXInputHook()
|
|
||||||
{
|
|
||||||
if (_stricmp(XINPUT_DLL, REQUIRED_XINPUT_DLL) != 0)
|
|
||||||
{
|
|
||||||
LOG("DLL not supported: " << XINPUT_DLL);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG("installing hook");
|
|
||||||
s_hook = SetWindowsHookEx(WH_CBT, HookProc, dll, 0);
|
|
||||||
LOG("hook installed");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
synxinhk_API void
|
|
||||||
RemoveXInputHook()
|
|
||||||
{
|
|
||||||
LOG("removing hook");
|
|
||||||
UnhookWindowsHookEx(s_hook);
|
|
||||||
LOG("hook removed");
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
#ifdef synxinhk_EXPORTS
|
|
||||||
#define synxinhk_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define synxinhk_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
synxinhk_API LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
|
|
||||||
synxinhk_API BOOL InstallXInputHook();
|
|
||||||
synxinhk_API void RemoveXInputHook();
|
|
||||||
synxinhk_API void SetXInputButtons(DWORD userIndex, WORD buttons);
|
|
||||||
synxinhk_API void SetXInputSticks(DWORD userIndex, SHORT lx, SHORT ly, SHORT rx, SHORT ry);
|
|
||||||
synxinhk_API void SetXInputTriggers(DWORD userIndex, BYTE left, BYTE right);
|
|
||||||
synxinhk_API void QueueXInputTimingReq();
|
|
||||||
synxinhk_API BOOL DequeueXInputTimingResp();
|
|
||||||
synxinhk_API WORD GetXInputFakeFreqMillis();
|
|
||||||
synxinhk_API BOOL DequeueXInputFeedback(WORD* leftMotor, WORD* rightMotor);
|
|
||||||
|
|
||||||
#ifdef SYNERGY_EXPORT_XINPUT_HOOKS
|
|
||||||
|
|
||||||
synxinhk_API DWORD WINAPI HookXInputGetState(DWORD dwUserIndex, XINPUT_STATE* pState);
|
|
||||||
synxinhk_API DWORD WINAPI HookXInputSetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration);
|
|
||||||
synxinhk_API DWORD WINAPI HookXInputGetCapabilities(DWORD userIndex, DWORD flags, XINPUT_CAPABILITIES* capabilities);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,73 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SYNERGY_EXPORT_XINPUT_HOOKS
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
|
|
||||||
#include <Windows.h>
|
|
||||||
#include "XInputProxy13.h"
|
|
||||||
#include "XInputHook.h"
|
|
||||||
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputGetState=_XInputGetState@8,@2")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputSetState=_XInputSetState@8,@3")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputGetCapabilities=_XInputGetCapabilities@12,@4")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputEnable=_XInputEnable@4,@5")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputGetDSoundAudioDeviceGuids=_XInputGetDSoundAudioDeviceGuids@12,@6")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputGetBatteryInformation=_XInputGetBatteryInformation@12,@7")
|
|
||||||
#pragma comment(linker, "/EXPORT:XInputGetKeystroke=_XInputGetKeystroke@12,@8")
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputGetState(DWORD dwUserIndex, XINPUT_STATE* pState)
|
|
||||||
{
|
|
||||||
return HookXInputGetState(dwUserIndex, pState);
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputSetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration)
|
|
||||||
{
|
|
||||||
return HookXInputSetState(dwUserIndex, pVibration);
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputGetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities)
|
|
||||||
{
|
|
||||||
return HookXInputGetCapabilities(dwUserIndex, dwFlags, pCapabilities);
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API void WINAPI
|
|
||||||
XInputEnable(BOOL enable)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputGetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputGetBatteryInformation(DWORD dwUserIndex, BYTE devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI
|
|
||||||
XInputGetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke)
|
|
||||||
{
|
|
||||||
return ERROR_DEVICE_NOT_CONNECTED;
|
|
||||||
}
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
#ifdef sxinpx13_EXPORTS
|
|
||||||
#define sxinpx13_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define sxinpx13_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "XInput13.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputGetState
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__out XINPUT_STATE* pState // Receives the current state
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputSetState
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputGetCapabilities
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__in DWORD dwFlags, // Input flags that identify the device type
|
|
||||||
__out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API void WINAPI XInputEnable
|
|
||||||
(
|
|
||||||
__in BOOL enable // [in] Indicates whether xinput is enabled or disabled.
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputGetDSoundAudioDeviceGuids
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__out GUID* pDSoundRenderGuid, // DSound device ID for render
|
|
||||||
__out GUID* pDSoundCaptureGuid // DSound device ID for capture
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputGetBatteryInformation
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__in BYTE devType, // Which device on this user index
|
|
||||||
__out XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries
|
|
||||||
);
|
|
||||||
|
|
||||||
sxinpx13_API DWORD WINAPI XInputGetKeystroke
|
|
||||||
(
|
|
||||||
__in DWORD dwUserIndex, // Index of the gamer associated with the device
|
|
||||||
__reserved DWORD dwReserved, // Reserved for future use
|
|
||||||
__out PXINPUT_KEYSTROKE pKeystroke // Pointer to an XINPUT_KEYSTROKE structure that receives an input event.
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -76,10 +76,6 @@ public:
|
||||||
virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0;
|
virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0;
|
||||||
virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0;
|
virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0;
|
||||||
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0;
|
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0;
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) = 0;
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) = 0;
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) = 0;
|
|
||||||
virtual void gameDeviceTimingReq() = 0;
|
|
||||||
virtual void screensaver(bool activate) = 0;
|
virtual void screensaver(bool activate) = 0;
|
||||||
virtual void resetOptions() = 0;
|
virtual void resetOptions() = 0;
|
||||||
virtual void setOptions(const COptionsList& options) = 0;
|
virtual void setOptions(const COptionsList& options) = 0;
|
||||||
|
|
|
@ -84,10 +84,6 @@ public:
|
||||||
virtual void screensaver(bool activate) = 0;
|
virtual void screensaver(bool activate) = 0;
|
||||||
virtual void resetOptions() = 0;
|
virtual void resetOptions() = 0;
|
||||||
virtual void setOptions(const COptionsList& options) = 0;
|
virtual void setOptions(const COptionsList& options) = 0;
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) = 0;
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) = 0;
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) = 0;
|
|
||||||
virtual void gameDeviceTimingReq() = 0;
|
|
||||||
virtual void cryptoIv(const UInt8* iv) = 0;
|
virtual void cryptoIv(const UInt8* iv) = 0;
|
||||||
virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0;
|
virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0;
|
||||||
|
|
||||||
|
|
|
@ -358,34 +358,6 @@ CClientProxy1_0::mouseWheel(SInt32, SInt32 yDelta)
|
||||||
CProtocolUtil::writef(getStream(), kMsgDMouseWheel1_0, yDelta);
|
CProtocolUtil::writef(getStream(), kMsgDMouseWheel1_0, yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_0::gameDeviceButtons(GameDeviceID, GameDeviceButton)
|
|
||||||
{
|
|
||||||
// ignore -- not supported in protocol 1.0
|
|
||||||
LOG((CLOG_DEBUG "gameDeviceButtons not supported"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_0::gameDeviceSticks(GameDeviceID, SInt16, SInt16, SInt16, SInt16)
|
|
||||||
{
|
|
||||||
// ignore -- not supported in protocol 1.0
|
|
||||||
LOG((CLOG_DEBUG "gameDeviceSticks not supported"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_0::gameDeviceTriggers(GameDeviceID, UInt8, UInt8)
|
|
||||||
{
|
|
||||||
// ignore -- not supported in protocol 1.0
|
|
||||||
LOG((CLOG_DEBUG "gameDeviceTriggers not supported"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_0::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
// ignore -- not supported in protocol 1.0
|
|
||||||
LOG((CLOG_DEBUG "gameDeviceTimingReq not supported"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CClientProxy1_0::cryptoIv(const UInt8* iv)
|
CClientProxy1_0::cryptoIv(const UInt8* iv)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,10 +59,6 @@ public:
|
||||||
virtual void screensaver(bool activate);
|
virtual void screensaver(bool activate);
|
||||||
virtual void resetOptions();
|
virtual void resetOptions();
|
||||||
virtual void setOptions(const COptionsList& options);
|
virtual void setOptions(const COptionsList& options);
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
virtual void gameDeviceTimingReq();
|
|
||||||
virtual void cryptoIv(const UInt8* iv);
|
virtual void cryptoIv(const UInt8* iv);
|
||||||
virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize);
|
virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize);
|
||||||
|
|
||||||
|
|
|
@ -40,34 +40,6 @@ CClientProxy1_4::~CClientProxy1_4()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG2 "send game device buttons to \"%s\" id=%d buttons=%d", getName().c_str(), id, buttons));
|
|
||||||
CProtocolUtil::writef(getStream(), kMsgDGameButtons, id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG2 "send game device sticks to \"%s\" id=%d s1=%+d,%+d s2=%+d,%+d", getName().c_str(), id, x1, y1, x2, y2));
|
|
||||||
CProtocolUtil::writef(getStream(), kMsgDGameSticks, id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG2 "send game device triggers to \"%s\" id=%d t1=%d t2=%d", getName().c_str(), id, t1, t2));
|
|
||||||
CProtocolUtil::writef(getStream(), kMsgDGameTriggers, id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG2 "send game device timing request to \"%s\"", getName().c_str()));
|
|
||||||
CProtocolUtil::writef(getStream(), kMsgCGameTimingReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CClientProxy1_4::keyDown(KeyID key, KeyModifierMask mask, KeyButton button)
|
CClientProxy1_4::keyDown(KeyID key, KeyModifierMask mask, KeyButton button)
|
||||||
{
|
{
|
||||||
|
@ -108,47 +80,3 @@ CClientProxy1_4::cryptoIv()
|
||||||
// the client won't be able to decrypt the new IV.
|
// the client won't be able to decrypt the new IV.
|
||||||
cryptoStream->setEncryptIv(iv);
|
cryptoStream->setEncryptIv(iv);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
CClientProxy1_4::parseMessage(const UInt8* code)
|
|
||||||
{
|
|
||||||
// process message
|
|
||||||
if (memcmp(code, kMsgCGameTimingResp, 4) == 0) {
|
|
||||||
gameDeviceTimingResp();
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (memcmp(code, kMsgDGameFeedback, 4) == 0) {
|
|
||||||
gameDeviceFeedback();
|
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
|
||||||
return CClientProxy1_3::parseMessage(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceFeedback()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
GameDeviceID id;
|
|
||||||
UInt16 m1, m2;
|
|
||||||
CProtocolUtil::readf(getStream(), kMsgDGameFeedback + 4, &id, &m1, &m2);
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device feedback id=%d m1=%d m2=%d", id, m1, m2));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_server->gameDeviceFeedback(id, m1, m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CClientProxy1_4::gameDeviceTimingResp()
|
|
||||||
{
|
|
||||||
// parse
|
|
||||||
UInt16 freq;
|
|
||||||
CProtocolUtil::readf(getStream(), kMsgCGameTimingResp + 4, &freq);
|
|
||||||
LOG((CLOG_DEBUG2 "recv game device timing response freq=%dms", freq));
|
|
||||||
|
|
||||||
// forward
|
|
||||||
m_server->gameDeviceTimingResp(freq);
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CClientProxy1_3.h"
|
#include "CClientProxy1_3.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
|
|
||||||
class CServer;
|
class CServer;
|
||||||
|
|
||||||
|
@ -38,10 +37,6 @@ public:
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
// IClient overrides
|
// IClient overrides
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
virtual void gameDeviceTimingReq();
|
|
||||||
virtual void keyDown(KeyID key, KeyModifierMask mask, KeyButton button);
|
virtual void keyDown(KeyID key, KeyModifierMask mask, KeyButton button);
|
||||||
virtual void keyRepeat(KeyID key, KeyModifierMask mask, SInt32 count, KeyButton button);
|
virtual void keyRepeat(KeyID key, KeyModifierMask mask, SInt32 count, KeyButton button);
|
||||||
virtual void keyUp(KeyID key, KeyModifierMask mask, KeyButton button);
|
virtual void keyUp(KeyID key, KeyModifierMask mask, KeyButton button);
|
||||||
|
@ -49,14 +44,5 @@ public:
|
||||||
//! Send IV to make
|
//! Send IV to make
|
||||||
void cryptoIv();
|
void cryptoIv();
|
||||||
|
|
||||||
protected:
|
|
||||||
// CClientProxy overrides
|
|
||||||
virtual bool parseMessage(const UInt8* code);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// message handlers
|
|
||||||
void gameDeviceTimingResp();
|
|
||||||
void gameDeviceFeedback();
|
|
||||||
|
|
||||||
CServer* m_server;
|
CServer* m_server;
|
||||||
};
|
};
|
||||||
|
|
|
@ -72,12 +72,6 @@ endif()
|
||||||
include_directories(${inc})
|
include_directories(${inc})
|
||||||
add_library(server STATIC ${src})
|
add_library(server STATIC ${src})
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
include_directories($ENV{DXSDK_DIR}/Include)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
target_link_libraries(server synergy)
|
target_link_libraries(server synergy)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -243,30 +243,6 @@ CPrimaryClient::mouseWheel(SInt32, SInt32)
|
||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CPrimaryClient::gameDeviceButtons(GameDeviceID, GameDeviceButton)
|
|
||||||
{
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPrimaryClient::gameDeviceSticks(GameDeviceID, SInt16, SInt16, SInt16, SInt16)
|
|
||||||
{
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPrimaryClient::gameDeviceTriggers(GameDeviceID, UInt8, UInt8)
|
|
||||||
{
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPrimaryClient::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CPrimaryClient::screensaver(bool)
|
CPrimaryClient::screensaver(bool)
|
||||||
{
|
{
|
||||||
|
|
|
@ -141,10 +141,6 @@ public:
|
||||||
virtual void mouseMove(SInt32 xAbs, SInt32 yAbs);
|
virtual void mouseMove(SInt32 xAbs, SInt32 yAbs);
|
||||||
virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel);
|
virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel);
|
||||||
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta);
|
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta);
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
virtual void gameDeviceTimingReq();
|
|
||||||
virtual void screensaver(bool activate);
|
virtual void screensaver(bool activate);
|
||||||
virtual void resetOptions();
|
virtual void resetOptions();
|
||||||
virtual void setOptions(const COptionsList& options);
|
virtual void setOptions(const COptionsList& options);
|
||||||
|
|
|
@ -132,22 +132,6 @@ CServer::CServer(CConfig& config, CPrimaryClient* primaryClient, CScreen* screen
|
||||||
m_primaryClient->getEventTarget(),
|
m_primaryClient->getEventTarget(),
|
||||||
new TMethodEventJob<CServer>(this,
|
new TMethodEventJob<CServer>(this,
|
||||||
&CServer::handleWheelEvent));
|
&CServer::handleWheelEvent));
|
||||||
m_events->adoptHandler(m_events->forIPrimaryScreen().gameDeviceButtons(),
|
|
||||||
m_primaryClient->getEventTarget(),
|
|
||||||
new TMethodEventJob<CServer>(this,
|
|
||||||
&CServer::handleGameDeviceButtons));
|
|
||||||
m_events->adoptHandler(m_events->forIPrimaryScreen().gameDeviceSticks(),
|
|
||||||
m_primaryClient->getEventTarget(),
|
|
||||||
new TMethodEventJob<CServer>(this,
|
|
||||||
&CServer::handleGameDeviceSticks));
|
|
||||||
m_events->adoptHandler(m_events->forIPrimaryScreen().gameDeviceTriggers(),
|
|
||||||
m_primaryClient->getEventTarget(),
|
|
||||||
new TMethodEventJob<CServer>(this,
|
|
||||||
&CServer::handleGameDeviceTriggers));
|
|
||||||
m_events->adoptHandler(m_events->forIPrimaryScreen().gameDeviceTimingReq(),
|
|
||||||
m_primaryClient->getEventTarget(),
|
|
||||||
new TMethodEventJob<CServer>(this,
|
|
||||||
&CServer::handleGameDeviceTimingReq));
|
|
||||||
m_events->adoptHandler(m_events->forIPrimaryScreen().screensaverActivated(),
|
m_events->adoptHandler(m_events->forIPrimaryScreen().screensaverActivated(),
|
||||||
m_primaryClient->getEventTarget(),
|
m_primaryClient->getEventTarget(),
|
||||||
new TMethodEventJob<CServer>(this,
|
new TMethodEventJob<CServer>(this,
|
||||||
|
@ -358,18 +342,6 @@ CServer::disconnect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CServer::gameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceTimingResp(freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceFeedback(id, m1, m2);
|
|
||||||
}
|
|
||||||
|
|
||||||
UInt32
|
UInt32
|
||||||
CServer::getNumClients() const
|
CServer::getNumClients() const
|
||||||
{
|
{
|
||||||
|
@ -1337,36 +1309,6 @@ CServer::handleWheelEvent(const CEvent& event, void*)
|
||||||
onMouseWheel(info->m_xDelta, info->m_yDelta);
|
onMouseWheel(info->m_xDelta, info->m_yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CServer::handleGameDeviceButtons(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
IPlatformScreen::CGameDeviceButtonInfo* info =
|
|
||||||
reinterpret_cast<IPlatformScreen::CGameDeviceButtonInfo*>(event.getData());
|
|
||||||
onGameDeviceButtons(info->m_id, info->m_buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::handleGameDeviceSticks(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
IPlatformScreen::CGameDeviceStickInfo* info =
|
|
||||||
reinterpret_cast<IPlatformScreen::CGameDeviceStickInfo*>(event.getData());
|
|
||||||
onGameDeviceSticks(info->m_id, info->m_x1, info->m_y1, info->m_x2, info->m_y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::handleGameDeviceTriggers(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
IPlatformScreen::CGameDeviceTriggerInfo* info =
|
|
||||||
reinterpret_cast<IPlatformScreen::CGameDeviceTriggerInfo*>(event.getData());
|
|
||||||
onGameDeviceTriggers(info->m_id, info->m_t1, info->m_t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::handleGameDeviceTimingReq(const CEvent& event, void*)
|
|
||||||
{
|
|
||||||
onGameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CServer::handleScreensaverActivatedEvent(const CEvent&, void*)
|
CServer::handleScreensaverActivatedEvent(const CEvent&, void*)
|
||||||
{
|
{
|
||||||
|
@ -1968,34 +1910,6 @@ CServer::onMouseWheel(SInt32 xDelta, SInt32 yDelta)
|
||||||
m_active->mouseWheel(xDelta, yDelta);
|
m_active->mouseWheel(xDelta, yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CServer::onGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "onGameDeviceButtons id=%d buttons=%d", id, buttons));
|
|
||||||
m_active->gameDeviceButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::onGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "onGameDeviceSticks id=%d s1=%+d,%+d s2=%+d,%+d", id, x1, y1, x2, y2));
|
|
||||||
m_active->gameDeviceSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::onGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "onGameDeviceTriggers id=%d t1=%d t2=%d", id, t1, t2));
|
|
||||||
m_active->gameDeviceTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CServer::onGameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG1 "onGameDeviceTimingReq"));
|
|
||||||
m_active->gameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CServer::onFileChunkSending(const void* data)
|
CServer::onFileChunkSending(const void* data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -138,12 +138,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void disconnect();
|
void disconnect();
|
||||||
|
|
||||||
//! Notify of game device timing response
|
|
||||||
void gameDeviceTimingResp(UInt16 freq);
|
|
||||||
|
|
||||||
//! Notify of game device feedback
|
|
||||||
void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
|
|
||||||
//! Clears the file buffer
|
//! Clears the file buffer
|
||||||
void clearReceivedFileData();
|
void clearReceivedFileData();
|
||||||
|
|
||||||
|
@ -304,10 +298,6 @@ private:
|
||||||
void handleMotionPrimaryEvent(const CEvent&, void*);
|
void handleMotionPrimaryEvent(const CEvent&, void*);
|
||||||
void handleMotionSecondaryEvent(const CEvent&, void*);
|
void handleMotionSecondaryEvent(const CEvent&, void*);
|
||||||
void handleWheelEvent(const CEvent&, void*);
|
void handleWheelEvent(const CEvent&, void*);
|
||||||
void handleGameDeviceButtons(const CEvent&, void*);
|
|
||||||
void handleGameDeviceSticks(const CEvent&, void*);
|
|
||||||
void handleGameDeviceTriggers(const CEvent&, void*);
|
|
||||||
void handleGameDeviceTimingReq(const CEvent&, void*);
|
|
||||||
void handleScreensaverActivatedEvent(const CEvent&, void*);
|
void handleScreensaverActivatedEvent(const CEvent&, void*);
|
||||||
void handleScreensaverDeactivatedEvent(const CEvent&, void*);
|
void handleScreensaverDeactivatedEvent(const CEvent&, void*);
|
||||||
void handleSwitchWaitTimeout(const CEvent&, void*);
|
void handleSwitchWaitTimeout(const CEvent&, void*);
|
||||||
|
@ -336,10 +326,6 @@ private:
|
||||||
bool onMouseMovePrimary(SInt32 x, SInt32 y);
|
bool onMouseMovePrimary(SInt32 x, SInt32 y);
|
||||||
void onMouseMoveSecondary(SInt32 dx, SInt32 dy);
|
void onMouseMoveSecondary(SInt32 dx, SInt32 dy);
|
||||||
void onMouseWheel(SInt32 xDelta, SInt32 yDelta);
|
void onMouseWheel(SInt32 xDelta, SInt32 yDelta);
|
||||||
void onGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
void onGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
void onGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
void onGameDeviceTimingReq();
|
|
||||||
void onFileChunkSending(const void* data);
|
void onFileChunkSending(const void* data);
|
||||||
void onFileRecieveComplete();
|
void onFileRecieveComplete();
|
||||||
|
|
||||||
|
|
|
@ -169,17 +169,6 @@ private:
|
||||||
|
|
||||||
#elif SYSAPI_WIN32
|
#elif SYSAPI_WIN32
|
||||||
|
|
||||||
#if GAME_DEVICE_SUPPORT
|
|
||||||
# define HELP_GAME_DEVICE \
|
|
||||||
" --game-mode <mode> enable game device support. valid modes:\n" \
|
|
||||||
" xinput, joyinfoex\n" \
|
|
||||||
" --game-poll <mode> game polling mode. valid modes:\n" \
|
|
||||||
" dynamic, static\n" \
|
|
||||||
" --game-poll-freq <i> frequency for static polling.\n"
|
|
||||||
#else
|
|
||||||
# define HELP_GAME_DEVICE ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// windows args
|
// windows args
|
||||||
# define HELP_SYS_ARGS \
|
# define HELP_SYS_ARGS \
|
||||||
" [--service <action>] [--relaunch] [--exit-pause]"
|
" [--service <action>] [--relaunch] [--exit-pause]"
|
||||||
|
@ -189,7 +178,5 @@ private:
|
||||||
" --relaunch persistently relaunches process in current user \n" \
|
" --relaunch persistently relaunches process in current user \n" \
|
||||||
" session (useful for vista and upward).\n" \
|
" session (useful for vista and upward).\n" \
|
||||||
" --exit-pause wait for key press on exit, can be useful for\n" \
|
" --exit-pause wait for key press on exit, can be useful for\n" \
|
||||||
" reading error messages that occur on exit.\n" \
|
" reading error messages that occur on exit.\n"
|
||||||
HELP_GAME_DEVICE
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,27 +70,6 @@ CAppUtilWindows::parseArg(const int& argc, const char* const* argv, int& i)
|
||||||
|
|
||||||
app().argsBase().m_pauseOnExit = true;
|
app().argsBase().m_pauseOnExit = true;
|
||||||
}
|
}
|
||||||
else if (app().isArg(i, argc, argv, NULL, "--game-mode")) {
|
|
||||||
CString mode(argv[++i]);
|
|
||||||
if (mode == "xinput") {
|
|
||||||
app().argsBase().m_gameDevice.m_mode = CGameDeviceInfo::kGameModeXInput;
|
|
||||||
}
|
|
||||||
else if (mode == "joyinfoex") {
|
|
||||||
app().argsBase().m_gameDevice.m_mode = CGameDeviceInfo::kGameModeJoyInfoEx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (app().isArg(i, argc, argv, NULL, "--game-poll")) {
|
|
||||||
CString mode(argv[++i]);
|
|
||||||
if (mode == "dynamic") {
|
|
||||||
app().argsBase().m_gameDevice.m_poll = CGameDeviceInfo::kGamePollDynamic;
|
|
||||||
}
|
|
||||||
else if (mode == "static") {
|
|
||||||
app().argsBase().m_gameDevice.m_poll = CGameDeviceInfo::kGamePollStatic;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (app().isArg(i, argc, argv, NULL, "--game-poll-freq")) {
|
|
||||||
app().argsBase().m_gameDevice.m_pollFreq = atoi(argv[++i]);
|
|
||||||
}
|
|
||||||
else if (app().isArg(i, argc, argv, NULL, "--stop-on-desk-switch")) {
|
else if (app().isArg(i, argc, argv, NULL, "--stop-on-desk-switch")) {
|
||||||
app().argsBase().m_stopOnDeskSwitch = true;
|
app().argsBase().m_stopOnDeskSwitch = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "CString.h"
|
#include "CString.h"
|
||||||
#include "CGameDevice.h"
|
|
||||||
#include "CCryptoOptions.h"
|
#include "CCryptoOptions.h"
|
||||||
|
|
||||||
class CArgsBase {
|
class CArgsBase {
|
||||||
|
@ -41,7 +40,6 @@ public:
|
||||||
#if SYSAPI_WIN32
|
#if SYSAPI_WIN32
|
||||||
bool m_debugServiceWait;
|
bool m_debugServiceWait;
|
||||||
bool m_pauseOnExit;
|
bool m_pauseOnExit;
|
||||||
CGameDeviceInfo m_gameDevice;
|
|
||||||
bool m_stopOnDeskSwitch;
|
bool m_stopOnDeskSwitch;
|
||||||
#endif
|
#endif
|
||||||
#if WINAPI_XWINDOWS
|
#if WINAPI_XWINDOWS
|
||||||
|
|
|
@ -42,11 +42,6 @@
|
||||||
#include "CArchMiscWindows.h"
|
#include "CArchMiscWindows.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SYSAPI_WIN32 && GAME_DEVICE_SUPPORT
|
|
||||||
#include <Windows.h>
|
|
||||||
#include "XInputHook.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WINAPI_MSWINDOWS
|
#if WINAPI_MSWINDOWS
|
||||||
#include "CMSWindowsScreen.h"
|
#include "CMSWindowsScreen.h"
|
||||||
#elif WINAPI_XWINDOWS
|
#elif WINAPI_XWINDOWS
|
||||||
|
@ -230,7 +225,7 @@ CClientApp::createScreen()
|
||||||
{
|
{
|
||||||
#if WINAPI_MSWINDOWS
|
#if WINAPI_MSWINDOWS
|
||||||
return new CScreen(new CMSWindowsScreen(
|
return new CScreen(new CMSWindowsScreen(
|
||||||
false, args().m_noHooks, args().m_gameDevice, args().m_stopOnDeskSwitch, m_events), m_events);
|
false, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events);
|
||||||
#elif WINAPI_XWINDOWS
|
#elif WINAPI_XWINDOWS
|
||||||
return new CScreen(new CXWindowsScreen(
|
return new CScreen(new CXWindowsScreen(
|
||||||
args().m_display, false, args().m_disableXInitThreads,
|
args().m_display, false, args().m_disableXInitThreads,
|
||||||
|
@ -468,18 +463,6 @@ CClientApp::startClient()
|
||||||
LOG((CLOG_NOTE "started client"));
|
LOG((CLOG_NOTE "started client"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SYSAPI_WIN32 && GAME_DEVICE_SUPPORT
|
|
||||||
if (args().m_gameDevice.m_mode == CGameDeviceInfo::kGameModeXInput)
|
|
||||||
{
|
|
||||||
// TODO: currently this is failing because we're not
|
|
||||||
// forcing compile with the DX XInput.h (so the win
|
|
||||||
// SDK is being used)... we need to figure out how to
|
|
||||||
// tell cmake to prefer the DX include path.
|
|
||||||
LOG((CLOG_DEBUG "installing xinput hook"));
|
|
||||||
InstallXInputHook();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
s_client->connect();
|
s_client->connect();
|
||||||
|
|
||||||
updateStatus();
|
updateStatus();
|
||||||
|
@ -516,14 +499,6 @@ CClientApp::startClient()
|
||||||
void
|
void
|
||||||
CClientApp::stopClient()
|
CClientApp::stopClient()
|
||||||
{
|
{
|
||||||
#if SYSAPI_WIN32 && GAME_DEVICE_SUPPORT
|
|
||||||
if (args().m_gameDevice.m_mode == CGameDeviceInfo::kGameModeXInput)
|
|
||||||
{
|
|
||||||
LOG((CLOG_DEBUG "removing xinput hook"));
|
|
||||||
RemoveXInputHook();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
closeClient(s_client);
|
closeClient(s_client);
|
||||||
closeClientScreen(s_clientScreen);
|
closeClientScreen(s_clientScreen);
|
||||||
s_client = NULL;
|
s_client = NULL;
|
||||||
|
|
|
@ -223,8 +223,7 @@ CDaemonApp::mainLoop(bool logToFile)
|
||||||
// HACK: create a dummy screen, which can handle system events
|
// HACK: create a dummy screen, which can handle system events
|
||||||
// (such as a stop request from the service controller).
|
// (such as a stop request from the service controller).
|
||||||
CMSWindowsScreen::init(CArchMiscWindows::instanceWin32());
|
CMSWindowsScreen::init(CArchMiscWindows::instanceWin32());
|
||||||
CGameDeviceInfo gameDevice;
|
CScreen dummyScreen(new CMSWindowsScreen(false, true, false, m_events), m_events);
|
||||||
CScreen dummyScreen(new CMSWindowsScreen(false, true, gameDevice, false, m_events), m_events);
|
|
||||||
|
|
||||||
CString command = ARCH->setting("Command");
|
CString command = ARCH->setting("Command");
|
||||||
bool elevate = ARCH->setting("Elevate") == "1";
|
bool elevate = ARCH->setting("Elevate") == "1";
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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 "CEventGameDevice.h"
|
|
||||||
|
|
||||||
CEventGameDevice::CEventGameDevice(void* eventTarget) :
|
|
||||||
m_eventTarget(eventTarget)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CEventGameDevice::~CEventGameDevice()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::gameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CEventGameDevice::queueGameDeviceTimingReq() const
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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 "CGameDevice.h"
|
|
||||||
|
|
||||||
class CEventGameDevice : public CGameDevice
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CEventGameDevice(void* eventTarget);
|
|
||||||
virtual ~CEventGameDevice();
|
|
||||||
|
|
||||||
void gameDeviceTimingResp(UInt16 freq);
|
|
||||||
void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const;
|
|
||||||
void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const;
|
|
||||||
void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const;
|
|
||||||
void queueGameDeviceTimingReq() const;
|
|
||||||
private:
|
|
||||||
void* m_eventTarget;
|
|
||||||
};
|
|
|
@ -48,7 +48,7 @@ CFileChunker::sendFileChunks(char* filename, IEventQueue* events, void* eventTar
|
||||||
|
|
||||||
// send first message (file size)
|
// send first message (file size)
|
||||||
CString fileSize = intToString(size);
|
CString fileSize = intToString(size);
|
||||||
UInt32 sizeLength = fileSize.size();
|
size_t sizeLength = fileSize.size();
|
||||||
CFileChunk* sizeMessage = new CFileChunk(sizeLength + 2);
|
CFileChunk* sizeMessage = new CFileChunk(sizeLength + 2);
|
||||||
char* chunkData = sizeMessage->m_chunk;
|
char* chunkData = sizeMessage->m_chunk;
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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 "CGameDevice.h"
|
|
||||||
|
|
||||||
CGameDeviceInfo::CGameDeviceInfo() :
|
|
||||||
m_mode(CGameDeviceInfo::kGameModeNone),
|
|
||||||
m_poll(CGameDeviceInfo::kGamePollDynamic),
|
|
||||||
m_pollFreq(60)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CGameDeviceInfo::~CGameDeviceInfo()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CGameDevice::CGameDevice()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
CGameDevice::~CGameDevice()
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,57 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2012 Nick Bolton
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* 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 "GameDeviceTypes.h"
|
|
||||||
|
|
||||||
class CGameDeviceInfo
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
enum EGameMode {
|
|
||||||
kGameModeNone,
|
|
||||||
kGameModeXInput,
|
|
||||||
kGameModeJoyInfoEx
|
|
||||||
};
|
|
||||||
|
|
||||||
enum EGamePoll {
|
|
||||||
kGamePollDynamic,
|
|
||||||
kGamePollStatic
|
|
||||||
};
|
|
||||||
|
|
||||||
CGameDeviceInfo();
|
|
||||||
virtual ~CGameDeviceInfo();
|
|
||||||
EGameMode m_mode;
|
|
||||||
EGamePoll m_poll;
|
|
||||||
int m_pollFreq;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CGameDevice
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
CGameDevice();
|
|
||||||
virtual ~CGameDevice();
|
|
||||||
|
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) = 0;
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2) = 0;
|
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const = 0;
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const = 0;
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const = 0;
|
|
||||||
virtual void queueGameDeviceTimingReq() const = 0;
|
|
||||||
};
|
|
|
@ -43,12 +43,10 @@ set(inc
|
||||||
ProtocolTypes.h
|
ProtocolTypes.h
|
||||||
XScreen.h
|
XScreen.h
|
||||||
XSynergy.h
|
XSynergy.h
|
||||||
GameDeviceTypes.h
|
|
||||||
CDaemonApp.h
|
CDaemonApp.h
|
||||||
CAppUtil.h
|
CAppUtil.h
|
||||||
CArgsBase.h
|
CArgsBase.h
|
||||||
IAppUtil.h
|
IAppUtil.h
|
||||||
CEventGameDevice.h
|
|
||||||
CFileChunker.h
|
CFileChunker.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -76,15 +74,12 @@ set(src
|
||||||
CDaemonApp.cpp
|
CDaemonApp.cpp
|
||||||
CAppUtil.cpp
|
CAppUtil.cpp
|
||||||
CArgsBase.cpp
|
CArgsBase.cpp
|
||||||
CEventGameDevice.cpp
|
|
||||||
CGameDevice.cpp
|
|
||||||
CFileChunker.cpp
|
CFileChunker.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list(APPEND inc
|
list(APPEND inc
|
||||||
CAppUtilWindows.h
|
CAppUtilWindows.h
|
||||||
CGameDevice.h
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND src
|
list(APPEND src
|
||||||
|
@ -109,6 +104,7 @@ set(inc
|
||||||
../platform
|
../platform
|
||||||
../server
|
../server
|
||||||
../synergy
|
../synergy
|
||||||
|
../synwinhk
|
||||||
../..
|
../..
|
||||||
../../../tools
|
../../../tools
|
||||||
)
|
)
|
||||||
|
|
|
@ -50,17 +50,12 @@ public:
|
||||||
virtual SInt32 getJumpZoneSize() const = 0;
|
virtual SInt32 getJumpZoneSize() const = 0;
|
||||||
virtual bool isAnyMouseButtonDown() const = 0;
|
virtual bool isAnyMouseButtonDown() const = 0;
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) = 0;
|
|
||||||
|
|
||||||
// ISecondaryScreen overrides
|
// ISecondaryScreen overrides
|
||||||
virtual void fakeMouseButton(ButtonID id, bool press) = 0;
|
virtual void fakeMouseButton(ButtonID id, bool press) = 0;
|
||||||
virtual void fakeMouseMove(SInt32 x, SInt32 y) const = 0;
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const = 0;
|
||||||
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0;
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0;
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const = 0;
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const = 0;
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const = 0;
|
|
||||||
virtual void queueGameDeviceTimingReq() const = 0;
|
|
||||||
|
|
||||||
// IKeyState overrides
|
// IKeyState overrides
|
||||||
virtual void updateKeyMap();
|
virtual void updateKeyMap();
|
||||||
|
|
|
@ -250,34 +250,6 @@ CScreen::mouseWheel(SInt32 xDelta, SInt32 yDelta)
|
||||||
m_screen->fakeMouseWheel(xDelta, yDelta);
|
m_screen->fakeMouseWheel(xDelta, yDelta);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons)
|
|
||||||
{
|
|
||||||
assert(!m_isPrimary);
|
|
||||||
m_screen->fakeGameDeviceButtons(id, buttons);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2)
|
|
||||||
{
|
|
||||||
assert(!m_isPrimary);
|
|
||||||
m_screen->fakeGameDeviceSticks(id, x1, y1, x2, y2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2)
|
|
||||||
{
|
|
||||||
assert(!m_isPrimary);
|
|
||||||
m_screen->fakeGameDeviceTriggers(id, t1, t2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceTimingReq()
|
|
||||||
{
|
|
||||||
assert(!m_isPrimary);
|
|
||||||
m_screen->queueGameDeviceTimingReq();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CScreen::resetOptions()
|
CScreen::resetOptions()
|
||||||
{
|
{
|
||||||
|
@ -526,15 +498,3 @@ CScreen::leaveSecondary()
|
||||||
// release any keys we think are still down
|
// release any keys we think are still down
|
||||||
m_screen->fakeAllKeysUp();
|
m_screen->fakeAllKeysUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceTimingResp(UInt16 freq)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceTimingResp(freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CScreen::gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2)
|
|
||||||
{
|
|
||||||
m_screen->gameDeviceFeedback(id, m1, m2);
|
|
||||||
}
|
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include "KeyTypes.h"
|
#include "KeyTypes.h"
|
||||||
#include "MouseTypes.h"
|
#include "MouseTypes.h"
|
||||||
#include "OptionTypes.h"
|
#include "OptionTypes.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
|
|
||||||
class IClipboard;
|
class IClipboard;
|
||||||
class IPlatformScreen;
|
class IPlatformScreen;
|
||||||
|
@ -172,42 +171,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void mouseWheel(SInt32 xDelta, SInt32 yDelta);
|
void mouseWheel(SInt32 xDelta, SInt32 yDelta);
|
||||||
|
|
||||||
//! Notify of game device buttons changed
|
|
||||||
/*!
|
|
||||||
Synthesize game device button states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons);
|
|
||||||
|
|
||||||
//! Notify of game device sticks changed
|
|
||||||
/*!
|
|
||||||
Synthesize game device stick states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2);
|
|
||||||
|
|
||||||
//! Notify of game device trigger changes
|
|
||||||
/*!
|
|
||||||
Synthesize game device trigger states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2);
|
|
||||||
|
|
||||||
//! Notify of game device timing request
|
|
||||||
/*!
|
|
||||||
Causes a game device timing response when state is next faked.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceTimingReq();
|
|
||||||
|
|
||||||
//! Notify of game device timing response
|
|
||||||
/*!
|
|
||||||
Handles a game device timing response coming back from the client.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq);
|
|
||||||
|
|
||||||
//! Notify of game device feedback changes
|
|
||||||
/*!
|
|
||||||
Sets the game device state with new feedback values.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2);
|
|
||||||
|
|
||||||
//! Notify of options changes
|
//! Notify of options changes
|
||||||
/*!
|
/*!
|
||||||
Resets all options to their default values.
|
Resets all options to their default values.
|
||||||
|
|
|
@ -622,7 +622,7 @@ CServerApp::createScreen()
|
||||||
{
|
{
|
||||||
#if WINAPI_MSWINDOWS
|
#if WINAPI_MSWINDOWS
|
||||||
return new CScreen(new CMSWindowsScreen(
|
return new CScreen(new CMSWindowsScreen(
|
||||||
true, args().m_noHooks, args().m_gameDevice, args().m_stopOnDeskSwitch, m_events), m_events);
|
true, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events);
|
||||||
#elif WINAPI_XWINDOWS
|
#elif WINAPI_XWINDOWS
|
||||||
return new CScreen(new CXWindowsScreen(
|
return new CScreen(new CXWindowsScreen(
|
||||||
args().m_display, true, args().m_disableXInitThreads, 0, m_events), m_events);
|
args().m_display, true, args().m_disableXInitThreads, 0, m_events), m_events);
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* synergy -- mouse and keyboard sharing utility
|
|
||||||
* Copyright (C) 2012 Bolton Software Ltd.
|
|
||||||
* Copyright (C) 2011 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.
|
|
||||||
*
|
|
||||||
* 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 "BasicTypes.h"
|
|
||||||
|
|
||||||
//! Game device ID
|
|
||||||
/*!
|
|
||||||
Type to hold a game device ID.
|
|
||||||
*/
|
|
||||||
typedef UInt8 GameDeviceID;
|
|
||||||
|
|
||||||
//! Game device button
|
|
||||||
/*!
|
|
||||||
Type to hold a game device button.
|
|
||||||
*/
|
|
||||||
typedef UInt16 GameDeviceButton;
|
|
||||||
|
|
||||||
//! @name Game device buttons
|
|
||||||
//@{
|
|
||||||
static const GameDeviceButton kGameDeviceDpadUp = 0x0001;
|
|
||||||
static const GameDeviceButton kGameDeviceDpadDown = 0x0002;
|
|
||||||
static const GameDeviceButton kGameDeviceDpadLeft = 0x0004;
|
|
||||||
static const GameDeviceButton kGameDeviceDpadRight = 0x0008;
|
|
||||||
static const GameDeviceButton kGameDeviceButtonStart = 0x0010;
|
|
||||||
static const GameDeviceButton kGameDeviceButtonBack = 0x0020;
|
|
||||||
static const GameDeviceButton kGameDeviceThumb1 = 0x0040;
|
|
||||||
static const GameDeviceButton kGameDeviceThumb2 = 0x0080;
|
|
||||||
static const GameDeviceButton kGameDeviceShoulder1 = 0x0100;
|
|
||||||
static const GameDeviceButton kGameDeviceShoulder2 = 0x0200;
|
|
||||||
static const GameDeviceButton kGameDeviceButton1 = 0x1000;
|
|
||||||
static const GameDeviceButton kGameDeviceButton2 = 0x2000;
|
|
||||||
static const GameDeviceButton kGameDeviceButton3 = 0x4000;
|
|
||||||
static const GameDeviceButton kGameDeviceButton4 = 0x8000;
|
|
||||||
//@}
|
|
||||||
|
|
||||||
static const UInt8 NumGameDeviceButtons = 14;
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include "MouseTypes.h"
|
#include "MouseTypes.h"
|
||||||
#include "OptionTypes.h"
|
#include "OptionTypes.h"
|
||||||
#include "CString.h"
|
#include "CString.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
|
|
||||||
//! Client interface
|
//! Client interface
|
||||||
/*!
|
/*!
|
||||||
|
@ -141,30 +140,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0;
|
virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0;
|
||||||
|
|
||||||
//! Notify of game device buttons changed
|
|
||||||
/*!
|
|
||||||
Synthesize game device button states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) = 0;
|
|
||||||
|
|
||||||
//! Notify of game device sticks changed
|
|
||||||
/*!
|
|
||||||
Synthesize game device stick states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) = 0;
|
|
||||||
|
|
||||||
//! Notify of game device trigger changes
|
|
||||||
/*!
|
|
||||||
Synthesize game device trigger states.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) = 0;
|
|
||||||
|
|
||||||
//! Notify of game device timing request
|
|
||||||
/*!
|
|
||||||
Causes a game device timing response when state is next faked.
|
|
||||||
*/
|
|
||||||
virtual void gameDeviceTimingReq() = 0;
|
|
||||||
|
|
||||||
//! Notify of screen saver change
|
//! Notify of screen saver change
|
||||||
virtual void screensaver(bool activate) = 0;
|
virtual void screensaver(bool activate) = 0;
|
||||||
|
|
||||||
|
|
|
@ -159,18 +159,12 @@ public:
|
||||||
virtual SInt32 getJumpZoneSize() const = 0;
|
virtual SInt32 getJumpZoneSize() const = 0;
|
||||||
virtual bool isAnyMouseButtonDown() const = 0;
|
virtual bool isAnyMouseButtonDown() const = 0;
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) = 0;
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2) = 0;
|
|
||||||
|
|
||||||
// ISecondaryScreen overrides
|
// ISecondaryScreen overrides
|
||||||
virtual void fakeMouseButton(ButtonID id, bool press) = 0;
|
virtual void fakeMouseButton(ButtonID id, bool press) = 0;
|
||||||
virtual void fakeMouseMove(SInt32 x, SInt32 y) const = 0;
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const = 0;
|
||||||
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0;
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0;
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const = 0;
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const = 0;
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const = 0;
|
|
||||||
virtual void queueGameDeviceTimingReq() const = 0;
|
|
||||||
|
|
||||||
// IKeyState overrides
|
// IKeyState overrides
|
||||||
virtual void updateKeyMap() = 0;
|
virtual void updateKeyMap() = 0;
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include "KeyTypes.h"
|
#include "KeyTypes.h"
|
||||||
#include "MouseTypes.h"
|
#include "MouseTypes.h"
|
||||||
#include "CEvent.h"
|
#include "CEvent.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
#include "CEventTypes.h"
|
#include "CEventTypes.h"
|
||||||
|
|
||||||
//! Primary screen interface
|
//! Primary screen interface
|
||||||
|
@ -71,55 +70,6 @@ public:
|
||||||
public:
|
public:
|
||||||
UInt32 m_id;
|
UInt32 m_id;
|
||||||
};
|
};
|
||||||
//! Game device button event data
|
|
||||||
class CGameDeviceButtonInfo {
|
|
||||||
public:
|
|
||||||
CGameDeviceButtonInfo(GameDeviceID id, GameDeviceButton buttons) :
|
|
||||||
m_id(id), m_buttons(buttons) { }
|
|
||||||
public:
|
|
||||||
GameDeviceID m_id;
|
|
||||||
GameDeviceButton m_buttons;
|
|
||||||
};
|
|
||||||
//! Game device sticks event data
|
|
||||||
class CGameDeviceStickInfo {
|
|
||||||
public:
|
|
||||||
CGameDeviceStickInfo(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) :
|
|
||||||
m_id(id), m_x1(x1), m_x2(x2), m_y1(y1), m_y2(y2) { }
|
|
||||||
public:
|
|
||||||
GameDeviceID m_id;
|
|
||||||
SInt16 m_x1;
|
|
||||||
SInt16 m_x2;
|
|
||||||
SInt16 m_y1;
|
|
||||||
SInt16 m_y2;
|
|
||||||
};
|
|
||||||
//! Game device triggers event data
|
|
||||||
class CGameDeviceTriggerInfo {
|
|
||||||
public:
|
|
||||||
CGameDeviceTriggerInfo(GameDeviceID id, UInt8 t1, UInt8 t2) :
|
|
||||||
m_id(id), m_t1(t1), m_t2(t2) { }
|
|
||||||
public:
|
|
||||||
GameDeviceID m_id;
|
|
||||||
UInt8 m_t1;
|
|
||||||
UInt8 m_t2;
|
|
||||||
};
|
|
||||||
//! Game device timing response event data
|
|
||||||
class CGameDeviceTimingRespInfo {
|
|
||||||
public:
|
|
||||||
CGameDeviceTimingRespInfo(UInt16 freq) :
|
|
||||||
m_freq(freq) { }
|
|
||||||
public:
|
|
||||||
UInt16 m_freq;
|
|
||||||
};
|
|
||||||
//! Game device feedback event data
|
|
||||||
class CGameDeviceFeedbackInfo {
|
|
||||||
public:
|
|
||||||
CGameDeviceFeedbackInfo(GameDeviceID id, UInt16 m1, UInt16 m2) :
|
|
||||||
m_id(id), m_m1(m1), m_m2(m2) { }
|
|
||||||
public:
|
|
||||||
GameDeviceID m_id;
|
|
||||||
UInt16 m_m1;
|
|
||||||
UInt16 m_m2;
|
|
||||||
};
|
|
||||||
|
|
||||||
//! @name manipulators
|
//! @name manipulators
|
||||||
//@{
|
//@{
|
||||||
|
@ -212,12 +162,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0;
|
||||||
|
|
||||||
//! Handle incoming game device timing responses.
|
|
||||||
virtual void gameDeviceTimingResp(UInt16 freq) = 0;
|
|
||||||
|
|
||||||
//! Handle incoming game device feedback changes.
|
|
||||||
virtual void gameDeviceFeedback(GameDeviceID id, UInt16 m1, UInt16 m2) = 0;
|
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
|
|
||||||
#include "IInterface.h"
|
#include "IInterface.h"
|
||||||
#include "MouseTypes.h"
|
#include "MouseTypes.h"
|
||||||
#include "GameDeviceTypes.h"
|
|
||||||
#include "CEvent.h"
|
#include "CEvent.h"
|
||||||
#include "CEventTypes.h"
|
#include "CEventTypes.h"
|
||||||
|
|
||||||
|
@ -59,24 +58,6 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0;
|
||||||
|
|
||||||
//! Fake game device buttons
|
|
||||||
/*!
|
|
||||||
Synthesize game device buttons state.
|
|
||||||
*/
|
|
||||||
virtual void fakeGameDeviceButtons(GameDeviceID id, GameDeviceButton buttons) const = 0;
|
|
||||||
|
|
||||||
//! Fake game device sticks
|
|
||||||
/*!
|
|
||||||
Synthesize game device sticks state.
|
|
||||||
*/
|
|
||||||
virtual void fakeGameDeviceSticks(GameDeviceID id, SInt16 x1, SInt16 y1, SInt16 x2, SInt16 y2) const = 0;
|
|
||||||
|
|
||||||
//! Fake game device triggers
|
|
||||||
/*!
|
|
||||||
Synthesize game device triggers state.
|
|
||||||
*/
|
|
||||||
virtual void fakeGameDeviceTriggers(GameDeviceID id, UInt8 t1, UInt8 t2) const = 0;
|
|
||||||
|
|
||||||
//@}
|
//@}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,6 @@ const char* kMsgCScreenSaver = "CSEC%1i";
|
||||||
const char* kMsgCResetOptions = "CROP";
|
const char* kMsgCResetOptions = "CROP";
|
||||||
const char* kMsgCInfoAck = "CIAK";
|
const char* kMsgCInfoAck = "CIAK";
|
||||||
const char* kMsgCKeepAlive = "CALV";
|
const char* kMsgCKeepAlive = "CALV";
|
||||||
const char* kMsgCGameTimingReq = "CGRQ";
|
|
||||||
const char* kMsgCGameTimingResp = "CGRS%2i";
|
|
||||||
const char* kMsgDKeyDown = "DKDN%2i%2i%2i";
|
const char* kMsgDKeyDown = "DKDN%2i%2i%2i";
|
||||||
const char* kMsgDKeyDown1_0 = "DKDN%2i%2i";
|
const char* kMsgDKeyDown1_0 = "DKDN%2i%2i";
|
||||||
const char* kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i";
|
const char* kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i";
|
||||||
|
@ -46,10 +44,6 @@ const char* kMsgDMouseWheel1_0 = "DMWM%2i";
|
||||||
const char* kMsgDClipboard = "DCLP%1i%4i%s";
|
const char* kMsgDClipboard = "DCLP%1i%4i%s";
|
||||||
const char* kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i";
|
const char* kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i";
|
||||||
const char* kMsgDSetOptions = "DSOP%4I";
|
const char* kMsgDSetOptions = "DSOP%4I";
|
||||||
const char* kMsgDGameButtons = "DGBT%1i%2i";
|
|
||||||
const char* kMsgDGameSticks = "DGST%1i%2i%2i%2i%2i";
|
|
||||||
const char* kMsgDGameTriggers = "DGTR%1i%1i%1i";
|
|
||||||
const char* kMsgDGameFeedback = "DGFB%1i%2i%2i";
|
|
||||||
const char* kMsgDCryptoIv = "DCIV%s";
|
const char* kMsgDCryptoIv = "DCIV%s";
|
||||||
const char* kMsgDFileTransfer = "DFTR%1i%s";
|
const char* kMsgDFileTransfer = "DFTR%1i%s";
|
||||||
const char* kMsgQInfo = "QINF";
|
const char* kMsgQInfo = "QINF";
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
// 1.2: adds mouse relative motion
|
// 1.2: adds mouse relative motion
|
||||||
// 1.3: adds keep alive and deprecates heartbeats,
|
// 1.3: adds keep alive and deprecates heartbeats,
|
||||||
// adds horizontal mouse scrolling
|
// adds horizontal mouse scrolling
|
||||||
// 1.4: adds game device support
|
// 1.4: adds crypto support (game device support added then removed)
|
||||||
static const SInt16 kProtocolMajorVersion = 1;
|
static const SInt16 kProtocolMajorVersion = 1;
|
||||||
static const SInt16 kProtocolMinorVersion = 5;
|
static const SInt16 kProtocolMinorVersion = 5;
|
||||||
|
|
||||||
|
@ -163,20 +163,6 @@ extern const char* kMsgCInfoAck;
|
||||||
// defined by an option.
|
// defined by an option.
|
||||||
extern const char* kMsgCKeepAlive;
|
extern const char* kMsgCKeepAlive;
|
||||||
|
|
||||||
// game device timing: primary -> secondary
|
|
||||||
// periodically, sent from primary to secondary when game device device is polled.
|
|
||||||
// this causes a game timing response to be queued, which is dequeued when
|
|
||||||
// the device is next faked.
|
|
||||||
extern const char* kMsgCGameTimingReq;
|
|
||||||
|
|
||||||
// game device timing: primary <- secondary
|
|
||||||
// in response, sent from secondary to primary when game device device is faked.
|
|
||||||
// the difference between when the message was sent and received is a
|
|
||||||
// measurement of time it took for the game device device state to reach the
|
|
||||||
// game device device user. a timing request is not retransmitted until after
|
|
||||||
// the pending timing response is received.
|
|
||||||
extern const char* kMsgCGameTimingResp;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// data codes
|
// data codes
|
||||||
//
|
//
|
||||||
|
@ -237,31 +223,6 @@ extern const char* kMsgDMouseWheel;
|
||||||
// like as kMsgDMouseWheel except only sends $1 = yDelta.
|
// like as kMsgDMouseWheel except only sends $1 = yDelta.
|
||||||
extern const char* kMsgDMouseWheel1_0;
|
extern const char* kMsgDMouseWheel1_0;
|
||||||
|
|
||||||
// game device buttons: primary -> secondary
|
|
||||||
// $1 = device id
|
|
||||||
// $2 = buttons bit mask
|
|
||||||
extern const char* kMsgDGameButtons;
|
|
||||||
|
|
||||||
// game device sticks: primary -> secondary
|
|
||||||
// $1 = device id
|
|
||||||
// $2 = x1
|
|
||||||
// $3 = y1
|
|
||||||
// $4 = x2
|
|
||||||
// $5 = y2
|
|
||||||
extern const char* kMsgDGameSticks;
|
|
||||||
|
|
||||||
// game device triggers: primary -> secondary
|
|
||||||
// $1 = device id
|
|
||||||
// $2 = t1
|
|
||||||
// $3 = t2
|
|
||||||
extern const char* kMsgDGameTriggers;
|
|
||||||
|
|
||||||
// game device feedback: secondary -> primary
|
|
||||||
// $1 = device id
|
|
||||||
// $2 = motor 1
|
|
||||||
// $3 = motor 2
|
|
||||||
extern const char* kMsgDGameFeedback;
|
|
||||||
|
|
||||||
// clipboard data: primary <-> secondary
|
// clipboard data: primary <-> secondary
|
||||||
// $2 = sequence number, $3 = clipboard data. the sequence number
|
// $2 = sequence number, $3 = clipboard data. the sequence number
|
||||||
// is 0 when sent by the primary. secondary screens should use the
|
// is 0 when sent by the primary. secondary screens should use the
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# synergy -- mouse and keyboard sharing utility
|
||||||
|
# Copyright (C) 2013 Bolton Software 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 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.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
set(inc
|
||||||
|
synwinhk.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(src
|
||||||
|
synwinhk.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND src
|
||||||
|
${inc}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(inc
|
||||||
|
../common
|
||||||
|
../synergy
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(${inc})
|
||||||
|
add_library(synwinhk SHARED ${inc} ${src})
|
||||||
|
|
||||||
|
# copy the dlls (and supporting files) from the lib dir to
|
||||||
|
# the bin dir, so that synergyc and synergys can easily find them.
|
||||||
|
# we should leave the other libraries compiling to the lib dir,
|
||||||
|
# so that the bin dir remains tidy. the path is relative to the
|
||||||
|
# build dir (in this case, that's: build\src\lib\platform).
|
||||||
|
add_custom_command(
|
||||||
|
TARGET synwinhk
|
||||||
|
POST_BUILD
|
||||||
|
COMMAND xcopy /Y /Q
|
||||||
|
..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\synwinhk.*
|
||||||
|
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\
|
||||||
|
)
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "CSynergyHook.h"
|
#include "synwinhk.h"
|
||||||
#include "ProtocolTypes.h"
|
#include "ProtocolTypes.h"
|
||||||
#include <zmouse.h>
|
#include <zmouse.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
@ -910,7 +910,7 @@ init(DWORD threadID)
|
||||||
|
|
||||||
// clean up after old process. the system should've already
|
// clean up after old process. the system should've already
|
||||||
// removed the hooks so we just need to reset our state.
|
// removed the hooks so we just need to reset our state.
|
||||||
g_hinstance = GetModuleHandle(_T("synrgyhk"));
|
g_hinstance = GetModuleHandle(_T("synwinhk"));
|
||||||
g_processID = GetCurrentProcessId();
|
g_processID = GetCurrentProcessId();
|
||||||
g_wheelSupport = kWheelNone;
|
g_wheelSupport = kWheelNone;
|
||||||
g_threadID = 0;
|
g_threadID = 0;
|
|
@ -31,10 +31,7 @@
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// fix: cmake defines the library name in lower case (synrgyhk_EXPORTS) as
|
#if defined(synwinhk_EXPORTS)
|
||||||
// opposed to upper case (SYNRGYHK_EXPORTS), so rather than figuring out
|
|
||||||
// how to change cmake's behaviour, it's easier to just change the code.
|
|
||||||
#if defined(synrgyhk_EXPORTS)
|
|
||||||
#define CSYNERGYHOOK_API __declspec(dllexport)
|
#define CSYNERGYHOOK_API __declspec(dllexport)
|
||||||
#else
|
#else
|
||||||
#define CSYNERGYHOOK_API __declspec(dllimport)
|
#define CSYNERGYHOOK_API __declspec(dllimport)
|
|
@ -59,6 +59,7 @@ cleanup()
|
||||||
DWORD WINAPI
|
DWORD WINAPI
|
||||||
mainLoop(void* data)
|
mainLoop(void* data)
|
||||||
{
|
{
|
||||||
|
// TODO: use a different message - e.g. DPLG%s (data - plugin)
|
||||||
const char* buttonsEvent = "IPrimaryScreen::getGameDeviceButtonsEvent";
|
const char* buttonsEvent = "IPrimaryScreen::getGameDeviceButtonsEvent";
|
||||||
const char* sticksEvent = "IPrimaryScreen::getGameDeviceSticksEvent";
|
const char* sticksEvent = "IPrimaryScreen::getGameDeviceSticksEvent";
|
||||||
const char* triggersEvent = "IPrimaryScreen::getGameDeviceTriggersEvent";
|
const char* triggersEvent = "IPrimaryScreen::getGameDeviceTriggersEvent";
|
||||||
|
|
|
@ -59,6 +59,7 @@ set(inc
|
||||||
../../lib/platform
|
../../lib/platform
|
||||||
../../lib/server
|
../../lib/server
|
||||||
../../lib/synergy
|
../../lib/synergy
|
||||||
|
../../lib/synwinhk
|
||||||
../../../tools/gtest-1.6.0/include
|
../../../tools/gtest-1.6.0/include
|
||||||
../../../tools/gmock-1.6.0/include
|
../../../tools/gmock-1.6.0/include
|
||||||
../unittests
|
../unittests
|
||||||
|
@ -70,12 +71,6 @@ if (UNIX)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
link_directories("$ENV{DXSDK_DIR}/Lib/x86")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(${inc})
|
include_directories(${inc})
|
||||||
add_executable(integtests ${src})
|
add_executable(integtests ${src})
|
||||||
target_link_libraries(integtests
|
target_link_libraries(integtests
|
||||||
|
|
|
@ -398,7 +398,7 @@ NetworkTests::sendMockData(void* eventTarget)
|
||||||
{
|
{
|
||||||
// send first message (file size)
|
// send first message (file size)
|
||||||
CString size = intToString(kMockDataSize);
|
CString size = intToString(kMockDataSize);
|
||||||
UInt32 sizeLength = size.size();
|
size_t sizeLength = size.size();
|
||||||
CFileChunker::CFileChunk* sizeMessage = new CFileChunker::CFileChunk(sizeLength + 2);
|
CFileChunker::CFileChunk* sizeMessage = new CFileChunker::CFileChunk(sizeLength + 2);
|
||||||
char* chunkData = sizeMessage->m_chunk;
|
char* chunkData = sizeMessage->m_chunk;
|
||||||
|
|
||||||
|
@ -461,13 +461,13 @@ newMockData(size_t size)
|
||||||
memcpy(data, head, headSize);
|
memcpy(data, head, headSize);
|
||||||
data += headSize;
|
data += headSize;
|
||||||
|
|
||||||
SInt32 times = (size - headSize - tailSize) / synergyRocksSize;
|
size_t times = (size - headSize - tailSize) / synergyRocksSize;
|
||||||
for (SInt32 i = 0; i < times; ++i) {
|
for (SInt32 i = 0; i < times; ++i) {
|
||||||
memcpy(data, synergyRocks, synergyRocksSize);
|
memcpy(data, synergyRocks, synergyRocksSize);
|
||||||
data += synergyRocksSize;
|
data += synergyRocksSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
SInt32 remainder = (size - headSize - tailSize) % synergyRocksSize;
|
size_t remainder = (size - headSize - tailSize) % synergyRocksSize;
|
||||||
if (remainder != 0) {
|
if (remainder != 0) {
|
||||||
memset(data, '.', remainder);
|
memset(data, '.', remainder);
|
||||||
data += remainder;
|
data += remainder;
|
||||||
|
|
|
@ -41,8 +41,8 @@ class CMSWindowsKeyStateTests : public ::testing::Test
|
||||||
protected:
|
protected:
|
||||||
virtual void SetUp()
|
virtual void SetUp()
|
||||||
{
|
{
|
||||||
// load synrgyhk.dll
|
// load synwinhk.dll
|
||||||
m_hookLibrary = m_hookLibraryLoader.openHookLibrary("synrgyhk");
|
m_hookLibrary = m_hookLibraryLoader.openHookLibrary("synwinhk");
|
||||||
m_screensaver = new CMSWindowsScreenSaver();
|
m_screensaver = new CMSWindowsScreenSaver();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,12 +62,6 @@ if (UNIX)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
if (GAME_DEVICE_SUPPORT)
|
|
||||||
link_directories("$ENV{DXSDK_DIR}/Lib/x86")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(${inc})
|
include_directories(${inc})
|
||||||
add_executable(unittests ${src})
|
add_executable(unittests ${src})
|
||||||
target_link_libraries(unittests
|
target_link_libraries(unittests
|
||||||
|
|
|
@ -61,7 +61,6 @@ public:
|
||||||
MOCK_METHOD0(forIKeyState, IKeyStateEvents&());
|
MOCK_METHOD0(forIKeyState, IKeyStateEvents&());
|
||||||
MOCK_METHOD0(forIPrimaryScreen, IPrimaryScreenEvents&());
|
MOCK_METHOD0(forIPrimaryScreen, IPrimaryScreenEvents&());
|
||||||
MOCK_METHOD0(forIScreen, IScreenEvents&());
|
MOCK_METHOD0(forIScreen, IScreenEvents&());
|
||||||
MOCK_METHOD0(forISecondaryScreen, ISecondaryScreenEvents&());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -63,9 +63,6 @@ class InternalCommands:
|
||||||
# by default, don't compile the gui
|
# by default, don't compile the gui
|
||||||
enable_make_gui = False
|
enable_make_gui = False
|
||||||
|
|
||||||
# by default, do not compile with game device support.
|
|
||||||
gameDevice = False
|
|
||||||
|
|
||||||
# by default, let cmake decide
|
# by default, let cmake decide
|
||||||
macSdk = None
|
macSdk = None
|
||||||
|
|
||||||
|
@ -184,11 +181,6 @@ class InternalCommands:
|
||||||
if generator.cmakeName.find('Unix Makefiles') != -1:
|
if generator.cmakeName.find('Unix Makefiles') != -1:
|
||||||
cmake_args += ' -DCMAKE_BUILD_TYPE=' + target.capitalize()
|
cmake_args += ' -DCMAKE_BUILD_TYPE=' + target.capitalize()
|
||||||
|
|
||||||
if self.gameDevice:
|
|
||||||
cmake_args += " -DGAME_DEVICE_SUPPORT:BOOL=TRUE"
|
|
||||||
else:
|
|
||||||
cmake_args += " -DGAME_DEVICE_SUPPORT:BOOL=FALSE"
|
|
||||||
|
|
||||||
if self.macSdk:
|
if self.macSdk:
|
||||||
path = "/Developer/SDKs/MacOSX" + self.macSdk + ".sdk/"
|
path = "/Developer/SDKs/MacOSX" + self.macSdk + ".sdk/"
|
||||||
cmake_args += " -DCMAKE_OSX_SYSROOT=" + path
|
cmake_args += " -DCMAKE_OSX_SYSROOT=" + path
|
||||||
|
@ -389,7 +381,7 @@ class InternalCommands:
|
||||||
self.signFile(pfx, pwd, 'bin/Release', 'synergyc.exe')
|
self.signFile(pfx, pwd, 'bin/Release', 'synergyc.exe')
|
||||||
self.signFile(pfx, pwd, 'bin/Release', 'synergys.exe')
|
self.signFile(pfx, pwd, 'bin/Release', 'synergys.exe')
|
||||||
self.signFile(pfx, pwd, 'bin/Release', 'synergyd.exe')
|
self.signFile(pfx, pwd, 'bin/Release', 'synergyd.exe')
|
||||||
self.signFile(pfx, pwd, 'bin/Release', 'synrgyhk.dll')
|
self.signFile(pfx, pwd, 'bin/Release', 'synwinhk.dll')
|
||||||
|
|
||||||
def signFile(self, pfx, pwd, dir, file):
|
def signFile(self, pfx, pwd, dir, file):
|
||||||
self.try_chdir(dir)
|
self.try_chdir(dir)
|
||||||
|
@ -1228,8 +1220,6 @@ class CommandHandler:
|
||||||
self.vcRedistDir = a
|
self.vcRedistDir = a
|
||||||
elif o == '--qt-dir':
|
elif o == '--qt-dir':
|
||||||
self.qtDir = a
|
self.qtDir = a
|
||||||
elif o == '--game-device':
|
|
||||||
self.ic.gameDevice = True
|
|
||||||
elif o == '--mac-sdk':
|
elif o == '--mac-sdk':
|
||||||
self.ic.macSdk = a
|
self.ic.macSdk = a
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue