diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 174bb83810..3447b21252 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -877,8 +877,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) case AS_OBSCURE_CURSOR: { STRACE(("ServerApp %s: Obscure Cursor\n", Signature())); - // ToDo: Enable ObscureCursor - //fDesktop->HWInterface()->ObscureCursor(); + fDesktop->HWInterface()->ObscureCursor(); break; } case AS_QUERY_CURSOR_HIDDEN: diff --git a/src/servers/app/drawing/HWInterface.cpp b/src/servers/app/drawing/HWInterface.cpp index 80b7c56391..d6f196f898 100644 --- a/src/servers/app/drawing/HWInterface.cpp +++ b/src/servers/app/drawing/HWInterface.cpp @@ -26,6 +26,7 @@ HWInterface::HWInterface(bool doubleBuffered) fDragBitmapOffset(0, 0), fCursorAndDragBitmap(NULL), fCursorVisible(false), + fCursorObscured(false), fCursorLocation(0, 0), fDoubleBuffered(doubleBuffered), // fUpdateExecutor(new UpdateQueue(this)) @@ -105,6 +106,7 @@ HWInterface::SetCursorVisible(bool visible) // fCursorVisible == false! if (visible) { fCursorVisible = visible; + fCursorObscured = false; BRect r = _CursorFrame(); _DrawCursor(r); @@ -133,6 +135,19 @@ HWInterface::IsCursorVisible() return visible; } +// ObscureCursor +void +HWInterface::ObscureCursor() +{ + if (WriteLock()) { + if (!fCursorObscured) { + SetCursorVisible(false); + fCursorObscured = true; + } + WriteUnlock(); + } +} + // MoveCursorTo void HWInterface::MoveCursorTo(const float& x, const float& y) @@ -140,6 +155,12 @@ HWInterface::MoveCursorTo(const float& x, const float& y) if (WriteLock()) { BPoint p(x, y); if (p != fCursorLocation) { + // unhide cursor if it is obscured only + if (fCursorObscured) { + // TODO: causes nested lock, which + // the MultiLocker doesn't actually support? + SetCursorVisible(true); + } BRect oldFrame = _CursorFrame(); fCursorLocation = p; if (fCursorVisible) { diff --git a/src/servers/app/drawing/HWInterface.h b/src/servers/app/drawing/HWInterface.h index c69dbf3dbf..1c4094adc1 100644 --- a/src/servers/app/drawing/HWInterface.h +++ b/src/servers/app/drawing/HWInterface.h @@ -79,6 +79,7 @@ class HWInterface : public MultiLocker { virtual void SetCursor(ServerCursor* cursor); virtual void SetCursorVisible(bool visible); bool IsCursorVisible(); + virtual void ObscureCursor(); virtual void MoveCursorTo(const float& x, const float& y); BPoint GetCursorPosition(); @@ -168,6 +169,7 @@ class HWInterface : public MultiLocker { BPoint fDragBitmapOffset; ServerCursor* fCursorAndDragBitmap; bool fCursorVisible; + bool fCursorObscured; BPoint fCursorLocation; bool fDoubleBuffered;