diff -r a984f7ffeb4b -r c28fe93274d6 doc/contributions.txt --- a/doc/contributions.txt Wed Nov 30 15:27:00 2011 -0500 +++ b/doc/contributions.txt Mon Dec 05 23:35:29 2011 +0100 @@ -171,6 +171,7 @@ VWR-25480 VWR-26150 STORM-1685 + STORM-1713 Aralara Rajal Ardy Lay STORM-859 diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindow.h --- a/indra/llwindow/llwindow.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindow.h Mon Dec 05 23:35:29 2011 +0100 @@ -91,8 +91,9 @@ virtual S32 getBusyCount() const; // Sets cursor, may set to arrow+hourglass - virtual void setCursor(ECursorType cursor) = 0; + virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; }; virtual ECursorType getCursor() const; + virtual void updateCursor() = 0; virtual void captureMouse() = 0; virtual void releaseMouse() = 0; @@ -181,6 +182,7 @@ LLWindowResolution* mSupportedResolutions; S32 mNumSupportedResolutions; ECursorType mCurrentCursor; + ECursorType mNextCursor; BOOL mCursorHidden; S32 mBusyCount; // how deep is the "cursor busy" stack? BOOL mIsMouseClipping; // Is this window currently clipping the mouse diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindow.cpp --- a/indra/llwindow/llwindow.cpp Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindow.cpp Mon Dec 05 23:35:29 2011 +0100 @@ -108,6 +108,7 @@ mSupportedResolutions(NULL), mNumSupportedResolutions(0), mCurrentCursor(UI_CURSOR_ARROW), + mNextCursor(UI_CURSOR_ARROW), mCursorHidden(FALSE), mBusyCount(0), mIsMouseClipping(FALSE), diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowheadless.h --- a/indra/llwindow/llwindowheadless.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowheadless.h Mon Dec 05 23:35:29 2011 +0100 @@ -55,7 +55,7 @@ /*virtual*/ void showCursorFromMouseMove() {}; /*virtual*/ void hideCursorUntilMouseMove() {}; /*virtual*/ BOOL isCursorHidden() {return FALSE;}; - /*virtual*/ void setCursor(ECursorType cursor) {}; + /*virtual*/ void updateCursor() {}; //virtual ECursorType getCursor() { return mCurrentCursor; }; /*virtual*/ void captureMouse() {}; /*virtual*/ void releaseMouse() {}; diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowmacosx.h --- a/indra/llwindow/llwindowmacosx.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowmacosx.h Mon Dec 05 23:35:29 2011 +0100 @@ -67,7 +67,7 @@ /*virtual*/ void showCursorFromMouseMove(); /*virtual*/ void hideCursorUntilMouseMove(); /*virtual*/ BOOL isCursorHidden(); - /*virtual*/ void setCursor(ECursorType cursor); + /*virtual*/ void updateCursor(); /*virtual*/ ECursorType getCursor() const; /*virtual*/ void captureMouse(); /*virtual*/ void releaseMouse(); diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowmacosx.cpp --- a/indra/llwindow/llwindowmacosx.cpp Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowmacosx.cpp Mon Dec 05 23:35:29 2011 +0100 @@ -1164,6 +1164,8 @@ } } + + updateCursor(); } BOOL LLWindowMacOSX::getPosition(LLCoordScreen *position) @@ -2841,7 +2843,7 @@ gCursors[cursorid] = createImageCursor(fullpath.c_str(), hotspotX, hotspotY); } -void LLWindowMacOSX::setCursor(ECursorType cursor) +void LLWindowMacOSX::updateCursor() { OSStatus result = noErr; @@ -2849,30 +2851,30 @@ { // A drag is in progress...remember the requested cursor and we'll // restore it when it is done - mCurrentCursor = cursor; + mCurrentCursor = mNextCursor; return; } - if (cursor == UI_CURSOR_ARROW + if (mNextCursor == UI_CURSOR_ARROW && mBusyCount > 0) { - cursor = UI_CURSOR_WORKING; + mNextCursor = UI_CURSOR_WORKING; } - if(mCurrentCursor == cursor) + if(mCurrentCursor == mNextCursor) return; // RN: replace multi-drag cursors with single versions - if (cursor == UI_CURSOR_ARROWDRAGMULTI) + if (mNextCursor == UI_CURSOR_ARROWDRAGMULTI) { - cursor = UI_CURSOR_ARROWDRAG; + mNextCursor = UI_CURSOR_ARROWDRAG; } - else if (cursor == UI_CURSOR_ARROWCOPYMULTI) + else if (mNextCursor == UI_CURSOR_ARROWCOPYMULTI) { - cursor = UI_CURSOR_ARROWCOPY; + mNextCursor = UI_CURSOR_ARROWCOPY; } - switch(cursor) + switch(mNextCursor) { default: case UI_CURSOR_ARROW: @@ -2923,7 +2925,7 @@ case UI_CURSOR_TOOLSIT: case UI_CURSOR_TOOLBUY: case UI_CURSOR_TOOLOPEN: - result = setImageCursor(gCursors[cursor]); + result = setImageCursor(gCursors[mNextCursor]); break; } @@ -2933,7 +2935,7 @@ InitCursor(); } - mCurrentCursor = cursor; + mCurrentCursor = mNextCursor; } ECursorType LLWindowMacOSX::getCursor() const diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowmesaheadless.h --- a/indra/llwindow/llwindowmesaheadless.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowmesaheadless.h Mon Dec 05 23:35:29 2011 +0100 @@ -59,7 +59,7 @@ /*virtual*/ void showCursorFromMouseMove() {}; /*virtual*/ void hideCursorUntilMouseMove() {}; /*virtual*/ BOOL isCursorHidden() {return FALSE;}; - /*virtual*/ void setCursor(ECursorType cursor) {}; + /*virtual*/ void updateCursor() {}; //virtual ECursorType getCursor() { return mCurrentCursor; }; /*virtual*/ void captureMouse() {}; /*virtual*/ void releaseMouse() {}; diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowsdl.h --- a/indra/llwindow/llwindowsdl.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowsdl.h Mon Dec 05 23:35:29 2011 +0100 @@ -72,7 +72,7 @@ /*virtual*/ void showCursorFromMouseMove(); /*virtual*/ void hideCursorUntilMouseMove(); /*virtual*/ BOOL isCursorHidden(); - /*virtual*/ void setCursor(ECursorType cursor); + /*virtual*/ void updateCursor(); /*virtual*/ void captureMouse(); /*virtual*/ void releaseMouse(); /*virtual*/ void setMouseClipping( BOOL b ); diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowsdl.cpp --- a/indra/llwindow/llwindowsdl.cpp Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowsdl.cpp Mon Dec 05 23:35:29 2011 +0100 @@ -1920,6 +1920,8 @@ break; } } + + updateCursor(); #if LL_X11 // This is a good time to stop flashing the icon if our mFlashTimer has @@ -2006,7 +2008,7 @@ return sdlcursor; } -void LLWindowSDL::setCursor(ECursorType cursor) +void LLWindowSDL::updateCursor() { if (ATIbug) { // cursor-updating is very flaky when this bug is @@ -2014,11 +2016,11 @@ return; } - if (mCurrentCursor != cursor) + if (mCurrentCursor != mNextCursor) { - if (cursor < UI_CURSOR_COUNT) + if (mNextCursor < UI_CURSOR_COUNT) { - SDL_Cursor *sdlcursor = mSDLCursors[cursor]; + SDL_Cursor *sdlcursor = mSDLCursors[mNextCursor]; // Try to default to the arrow for any cursors that // did not load correctly. if (!sdlcursor && mSDLCursors[UI_CURSOR_ARROW]) @@ -2026,9 +2028,9 @@ if (sdlcursor) SDL_SetCursor(sdlcursor); } else { - llwarns << "Tried to set invalid cursor number " << cursor << llendl; + llwarns << "Tried to set invalid cursor number " << mNextCursor << llendl; } - mCurrentCursor = cursor; + mCurrentCursor = mNextCursor; } } diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowwin32.h --- a/indra/llwindow/llwindowwin32.h Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowwin32.h Mon Dec 05 23:35:29 2011 +0100 @@ -66,7 +66,7 @@ /*virtual*/ void showCursorFromMouseMove(); /*virtual*/ void hideCursorUntilMouseMove(); /*virtual*/ BOOL isCursorHidden(); - /*virtual*/ void setCursor(ECursorType cursor); + /*virtual*/ void updateCursor(); /*virtual*/ ECursorType getCursor() const; /*virtual*/ void captureMouse(); /*virtual*/ void releaseMouse(); diff -r a984f7ffeb4b -r c28fe93274d6 indra/llwindow/llwindowwin32.cpp --- a/indra/llwindow/llwindowwin32.cpp Wed Nov 30 15:27:00 2011 -0500 +++ b/indra/llwindow/llwindowwin32.cpp Mon Dec 05 23:35:29 2011 +0100 @@ -1667,18 +1667,18 @@ -void LLWindowWin32::setCursor(ECursorType cursor) +void LLWindowWin32::updateCursor() { - if (cursor == UI_CURSOR_ARROW + if (mNextCursor == UI_CURSOR_ARROW && mBusyCount > 0) { - cursor = UI_CURSOR_WORKING; + mNextCursor = UI_CURSOR_WORKING; } - if( mCurrentCursor != cursor ) + if( mCurrentCursor != mNextCursor ) { - mCurrentCursor = cursor; - SetCursor( mCursor[cursor] ); + mCurrentCursor = mNextCursor; + SetCursor( mCursor[mNextCursor] ); } } @@ -1760,6 +1760,8 @@ mInputProcessingPaused = FALSE; + updateCursor(); + // clear this once we've processed all mouse messages that might have occurred after // we slammed the mouse position mMousePositionModified = FALSE;