attempted fix to 'cursor does not show' bug, though i don't think the issue is solved, it appears to be more stable (but it's so hard to tell, since the bug is so random)
This commit is contained in:
parent
69db341660
commit
eda0018fc5
|
@ -650,18 +650,30 @@ COSXScreen::showCursor()
|
||||||
{
|
{
|
||||||
LOG((CLOG_DEBUG "showing cursor"));
|
LOG((CLOG_DEBUG "showing cursor"));
|
||||||
|
|
||||||
|
CFStringRef propertyString = CFStringCreateWithCString(
|
||||||
|
NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
|
||||||
|
|
||||||
|
// it looks like from around 2010 (os x 10.6 or 10.7) the behavior of
|
||||||
|
// CGDisplayHideCursor changed so that the cursor could only be hidden by
|
||||||
|
// the program which owned it. ed's solution in r820 was to send the
|
||||||
|
// cursor to the background before trying to hide it. however, this
|
||||||
|
// intermittently caused the cursor to remain hidden when we try to
|
||||||
|
// show it again. to solve this bug, we return the cursor to the
|
||||||
|
// background.
|
||||||
|
CGSSetConnectionProperty(
|
||||||
|
_CGSDefaultConnection(), _CGSDefaultConnection(),
|
||||||
|
propertyString, kCFBooleanTrue);
|
||||||
|
|
||||||
CGError error = CGDisplayShowCursor(m_displayID);
|
CGError error = CGDisplayShowCursor(m_displayID);
|
||||||
if (error != kCGErrorSuccess) {
|
if (error != kCGErrorSuccess) {
|
||||||
LOG((CLOG_ERR "failed to show cursor, error=%d", error));
|
LOG((CLOG_ERR "failed to show cursor, error=%d", error));
|
||||||
}
|
}
|
||||||
|
|
||||||
CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
|
CGSSetConnectionProperty(
|
||||||
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanFalse);
|
_CGSDefaultConnection(), _CGSDefaultConnection(),
|
||||||
CFRelease(propertyString);
|
propertyString, kCFBooleanFalse);
|
||||||
|
|
||||||
if (!CGCursorIsVisible()) {
|
CFRelease(propertyString);
|
||||||
LOG((CLOG_WARN "cursor is not visible"));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_cursorHidden = false;
|
m_cursorHidden = false;
|
||||||
}
|
}
|
||||||
|
@ -671,18 +683,41 @@ COSXScreen::hideCursor()
|
||||||
{
|
{
|
||||||
LOG((CLOG_DEBUG "hiding cursor"));
|
LOG((CLOG_DEBUG "hiding cursor"));
|
||||||
|
|
||||||
CFStringRef propertyString = CFStringCreateWithCString(NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
|
CFStringRef propertyString = CFStringCreateWithCString(
|
||||||
CGSSetConnectionProperty(_CGSDefaultConnection(), _CGSDefaultConnection(), propertyString, kCFBooleanTrue);
|
NULL, "SetsCursorInBackground", kCFStringEncodingMacRoman);
|
||||||
CFRelease(propertyString);
|
|
||||||
|
CGSSetConnectionProperty(
|
||||||
|
_CGSDefaultConnection(), _CGSDefaultConnection(),
|
||||||
|
propertyString, kCFBooleanTrue);
|
||||||
|
|
||||||
CGError error = CGDisplayHideCursor(m_displayID);
|
CGError error = CGDisplayHideCursor(m_displayID);
|
||||||
if (error != kCGErrorSuccess) {
|
if (error != kCGErrorSuccess) {
|
||||||
LOG((CLOG_ERR "failed to hide cursor, error=%d", error));
|
LOG((CLOG_ERR "failed to hide cursor, error=%d", error));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ed's solution to send the cursor to the background before hiding
|
||||||
|
// fixed the bug caused by the new behavior of CGDisplayHideCursor,
|
||||||
|
// which is to only allow cursor to be shown/hidden by the program
|
||||||
|
// that has focus.
|
||||||
|
// however, this does not always work, and the cursor remains hidden,
|
||||||
|
// often when leaving the screen immediately after using the dock.
|
||||||
|
// to work around this, we send the mouse to the corner of the screen
|
||||||
|
// when the cursor is still visible, where it is less noticeable than
|
||||||
|
// at the center.
|
||||||
if (CGCursorIsVisible()) {
|
if (CGCursorIsVisible()) {
|
||||||
LOG((CLOG_WARN "cursor is still visible"));
|
LOG((CLOG_WARN "cursor is still visible (warping to corner)"));
|
||||||
|
warpCursor(0, m_h);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
LOG((CLOG_DEBUG "cursor is hidden, warping to center"));
|
||||||
|
warpCursor(m_xCenter, m_yCenter);
|
||||||
|
}
|
||||||
|
|
||||||
|
CGSSetConnectionProperty(
|
||||||
|
_CGSDefaultConnection(), _CGSDefaultConnection(),
|
||||||
|
propertyString, kCFBooleanFalse);
|
||||||
|
|
||||||
|
CFRelease(propertyString);
|
||||||
|
|
||||||
m_cursorHidden = true;
|
m_cursorHidden = true;
|
||||||
}
|
}
|
||||||
|
@ -807,7 +842,7 @@ COSXScreen::leave()
|
||||||
|
|
||||||
if (m_isPrimary) {
|
if (m_isPrimary) {
|
||||||
// warp to center
|
// warp to center
|
||||||
warpCursor(m_xCenter, m_yCenter);
|
//warpCursor(m_xCenter, m_yCenter);
|
||||||
|
|
||||||
// This used to be necessary to get smooth mouse motion on other screens,
|
// This used to be necessary to get smooth mouse motion on other screens,
|
||||||
// but now is just to avoid a hesitating cursor when transitioning to
|
// but now is just to avoid a hesitating cursor when transitioning to
|
||||||
|
@ -819,7 +854,7 @@ COSXScreen::leave()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// warp the mouse to the cursor center
|
// warp the mouse to the cursor center
|
||||||
fakeMouseMove(m_xCenter, m_yCenter);
|
//fakeMouseMove(m_xCenter, m_yCenter);
|
||||||
|
|
||||||
// FIXME -- prepare to show cursor if it moves
|
// FIXME -- prepare to show cursor if it moves
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue