Revert "Merge branch 'bug3784-MacOSXDoubleTripleClickFix' of https://github.com/jpmcmu/synergy into jpmcmu-tripple-click-fix"

This reverts commit b5effc0591, reversing
changes made to 297100c88a.
This commit is contained in:
Nick Bolton 2015-03-21 11:36:38 +00:00
parent b5effc0591
commit 32323bc0d1
2 changed files with 73 additions and 49 deletions

View File

@ -105,8 +105,8 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
m_activeModifierHotKeyMask(0), m_activeModifierHotKeyMask(0),
m_eventTapPort(nullptr), m_eventTapPort(nullptr),
m_eventTapRLSR(nullptr), m_eventTapRLSR(nullptr),
m_lastClickTime(0), m_lastSingleClick(0),
m_clickState(1), m_lastDoubleClick(0),
m_lastSingleClickXCursor(0), m_lastSingleClickXCursor(0),
m_lastSingleClickYCursor(0), m_lastSingleClickYCursor(0),
m_autoShowHideCursor(autoShowHideCursor), m_autoShowHideCursor(autoShowHideCursor),
@ -524,10 +524,6 @@ OSXScreen::postMouseEvent(CGPoint& pos) const
} }
CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, button); CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, button);
// Dragging events also need the click state
CGEventSetIntegerValueField(event, kCGMouseEventClickState, m_clickState);
CGEventPost(kCGHIDEventTap, event); CGEventPost(kCGHIDEventTap, event);
CFRelease(event); CFRelease(event);
@ -536,6 +532,20 @@ OSXScreen::postMouseEvent(CGPoint& pos) const
void void
OSXScreen::fakeMouseButton(ButtonID id, bool press) OSXScreen::fakeMouseButton(ButtonID id, bool press)
{ {
NXEventHandle handle = NXOpenEventStatus();
double clickTime = NXClickTime(handle);
if ((ARCH->time() - m_lastDoubleClick) <= clickTime) {
// drop all down and up fakes immedately after a double click.
// TODO: perhaps there is a better way to do this, usually in
// finder, if you tripple click a folder, it will open it and
// then select a folder under the cursor -- and perhaps other
// strange behaviour might happen?
LOG((CLOG_DEBUG1 "dropping mouse button %s",
press ? "press" : "release"));
return;
}
// Buttons are indexed from one, but the button down array is indexed from zero // Buttons are indexed from one, but the button down array is indexed from zero
UInt32 index = id - kButtonLeft; UInt32 index = id - kButtonLeft;
if (index >= NumButtonIDs) { if (index >= NumButtonIDs) {
@ -559,47 +569,61 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
// since we don't have double click distance in NX APIs // since we don't have double click distance in NX APIs
// we define our own defaults. // we define our own defaults.
const double maxDiff = sqrt(2) + 0.0001; const double maxDiff = sqrt(2) + 0.0001;
if (press && (id == kButtonLeft) &&
NXEventHandle handle = NXOpenEventStatus(); ((ARCH->time() - m_lastSingleClick) <= clickTime) &&
double clickTime = NXClickTime(handle); diff <= maxDiff) {
// As long as the click is within the time window and distance window LOG((CLOG_DEBUG1 "faking mouse left double click"));
// increase clickState (double click, triple click, etc)
// This will allow for higher than triple click but the quartz documenation // finder does not seem to detect double clicks from two separate
// does not specify that this should be limited to triple click // CGEventCreateMouseEvent calls. so, if we detect a double click we
if(press) { // use CGEventSetIntegerValueField to tell the OS.
if((ARCH->time() - m_lastClickTime) <= clickTime && diff <= maxDiff){ //
m_clickState++; // the caveat here is that findor will see this as a single click
} // followed by a double click (even though there should be only a
else { // double click). this may cause weird behaviour in other apps.
m_clickState = 1; //
} // for some reason using the old CGPostMouseEvent function, doesn't
// cause double clicks (though i'm sure it did work at some point).
m_lastClickTime = ARCH->time();
} CGEventRef event = CGEventCreateMouseEvent(
NULL, kCGEventLeftMouseDown, pos, kCGMouseButtonLeft);
if(m_clickState == 1){
m_lastSingleClickXCursor = m_xCursor; CGEventSetIntegerValueField(event, kCGMouseEventClickState, 2);
m_lastSingleClickYCursor = m_yCursor; m_buttonState.set(index, kMouseButtonDown);
} CGEventPost(kCGHIDEventTap, event);
EMouseButtonState state = press ? kMouseButtonDown : kMouseButtonUp; CGEventSetType(event, kCGEventLeftMouseUp);
m_buttonState.set(index, kMouseButtonUp);
LOG((CLOG_DEBUG1 "faking mouse button id: %d press: %s", id, press ? "pressed" : "released")); CGEventPost(kCGHIDEventTap, event);
MouseButtonEventMapType thisButtonMap = MouseButtonEventMap[index]; CFRelease(event);
CGEventType type = thisButtonMap[state];
m_lastDoubleClick = ARCH->time();
CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, index); }
else {
CGEventSetIntegerValueField(event, kCGMouseEventClickState, m_clickState);
// ... otherwise, perform a single press or release as normal.
m_buttonState.set(index, state);
CGEventPost(kCGHIDEventTap, event); EMouseButtonState state = press ? kMouseButtonDown : kMouseButtonUp;
CFRelease(event); LOG((CLOG_DEBUG1 "faking mouse button id: %d press: %s", id, press ? "pressed" : "released"));
MouseButtonEventMapType thisButtonMap = MouseButtonEventMap[index];
CGEventType type = thisButtonMap[state];
CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, index);
m_buttonState.set(index, state);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
m_lastSingleClick = ARCH->time();
m_lastSingleClickXCursor = m_xCursor;
m_lastSingleClickYCursor = m_yCursor;
}
if (!press && (id == kButtonLeft)) { if (!press && (id == kButtonLeft)) {
if (m_fakeDraggingStarted) { if (m_fakeDraggingStarted) {
m_getDropTargetThread = new Thread(new TMethodJob<OSXScreen>( m_getDropTargetThread = new Thread(new TMethodJob<OSXScreen>(

View File

@ -335,8 +335,8 @@ private:
CFRunLoopSourceRef m_eventTapRLSR; CFRunLoopSourceRef m_eventTapRLSR;
// for double click coalescing. // for double click coalescing.
double m_lastClickTime; double m_lastSingleClick;
int m_clickState; double m_lastDoubleClick;
SInt32 m_lastSingleClickXCursor; SInt32 m_lastSingleClickXCursor;
SInt32 m_lastSingleClickYCursor; SInt32 m_lastSingleClickYCursor;