From cf6fe303d66468616a0dbadb879b6a8df68bc784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Thu, 12 Jan 2006 11:46:49 +0000 Subject: [PATCH] * I decided having the cursor obscuring feature in the HWInterface class was not such a bad idea after all. * Reenabled obscuring the cursor in ServerApp. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15925 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/ServerApp.cpp | 3 +-- src/servers/app/drawing/HWInterface.cpp | 21 +++++++++++++++++++++ src/servers/app/drawing/HWInterface.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) 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;