Closed
Bug 78363
Opened 23 years ago
Closed 21 years ago
Beachball in Mac `spinning' cursor should actually spin
Categories
(SeaMonkey :: UI Design, defect, P5)
Tracking
(Not tracked)
VERIFIED
FIXED
mozilla1.4final
People
(Reporter: mpt, Assigned: lordpixel)
References
Details
Attachments
(2 files, 4 obsolete files)
3.01 KB,
patch
|
Details | Diff | Splinter Review | |
11.55 KB,
patch
|
mikepinkerton
:
review+
sfraser_bugs
:
superreview+
asa
:
approval1.4+
|
Details | Diff | Splinter Review |
Build: 2001043008, Mac OS 9.1 To reproduce: * Go from one Web page to another. * Look at the combination arrow-and-beachball cursor. What you should see: * The beachball spins round and round. What you actually see: * It doesn't.
Assignee | ||
Comment 2•23 years ago
|
||
OK, Apple "helpfully" removed RotateCursor and SpinCursor from Carbon. As it happens they were always part of the MPW toolkit, not a core part of the Quickdraw API. That's the reason... However, since all Spin/RotateCursor actually does is advance to the next frame in a cursor sequence (as defined in an acur resource) for you, they're not actually necessary. Consider: the hard part was always deciding when to call SpinCursor - you still had to call it every time you wanted to advance a frame, it does no automatic animation for you. So, at mpt's suggestion, I've just implemented this by calling SetCursor repeatedly, and we maintain the state which knows which frame to draw. This is all neatly wrapped up in nsDocShell::OnProgress. Patches to follow...
Assignee | ||
Comment 3•23 years ago
|
||
oh, this will fix 78362 also..
Assignee | ||
Comment 4•23 years ago
|
||
Assignee | ||
Comment 5•23 years ago
|
||
Also take Matthew's cursors from bug 78362 and paste them into nsmacWidget.rsrc as numbers 149, 150, 151 and 152
Comment 6•23 years ago
|
||
You can't #ifdef XP_MAC in nsDocShell. Sorry. You'll have to use timers or something.
Assignee | ||
Comment 8•23 years ago
|
||
Taking (goes with a bunch of other polish bugs I want to get to)
Assignee: pchen → lordpixel
Assignee | ||
Comment 9•23 years ago
|
||
Note to self: EventStateManager (as in nsIEventStateManager)
Comment 10•21 years ago
|
||
Still occurs in OSX, but this bug probably does not affect LinuxPPC.
OS: All → MacOS X
Assignee | ||
Comment 11•21 years ago
|
||
This is nsMacWidget.rsrc with MPTs 3 additional cursor frames added. This file is MacBinary encoded, to preserve the resource fork. Currently the file in CVS is in AppleSingle format, so we'll need to unpack this file to a regular 2 fork Mac file then check it in using something like MacCVSPro that can AppleSingle encode it. I'll work on some code to use these frames shortly.
Attachment #33350 -
Attachment is obsolete: true
Assignee | ||
Updated•21 years ago
|
Status: NEW → ASSIGNED
Assignee | ||
Comment 12•21 years ago
|
||
Assignee | ||
Comment 13•21 years ago
|
||
To try this: Put this "nsMacWidget.rsrc" file into /mozilla/widget/src/mac/ Apply the patch Build & run
Attachment #117970 -
Attachment is obsolete: true
Assignee | ||
Comment 14•21 years ago
|
||
Comment on attachment 121042 [details] [diff] [review] patch uses a carbon event loop timer to spin the cursor Reviewers: Any threading issues strike you as troublesome?
Attachment #121042 -
Flags: superreview?(sfraser)
Attachment #121042 -
Flags: review?(pinkerton)
Comment 15•21 years ago
|
||
Comment on attachment 121042 [details] [diff] [review] patch uses a carbon event loop timer to spin the cursor >Index: nsWindow.cpp >=================================================================== >RCS file: /cvsroot/mozilla/widget/src/mac/nsWindow.cpp,v >retrieving revision 1.198 >diff -u -2 -r1.198 nsWindow.cpp >--- nsWindow.cpp 25 Mar 2003 02:58:00 -0000 1.198 >+++ nsWindow.cpp 19 Apr 2003 03:53:34 -0000 >@@ -85,4 +85,7 @@ > static Boolean gNotificationInstalled = false; > >+//used to animate the Arrow + Beachball cursor >+static CursorSpinner *gCursorSpinner = new CursorSpinner(); >+ Best not to rely on running code at library load time. Allocate the thing when it's first required. > // Routines for iterating over the rects of a region. Carbon and pre-Carbon > // do this differently so provide a way to do both. >@@ -106,5 +109,5 @@ > #endif > >- >+#if defined(INVALIDATE_DEBUGGING) || defined(PAINT_DEBUGGING) || defined (PINK_PROFILING) > static Boolean KeyDown(const UInt8 theKey) > { >@@ -113,4 +116,5 @@ > return ((*((UInt8 *)map + (theKey >> 3)) >> (theKey & 7)) & 1) != 0; > } >+#endif > > #if defined(INVALIDATE_DEBUGGING) || defined(PAINT_DEBUGGING) >@@ -699,117 +703,52 @@ > nsBaseWidget::SetCursor(aCursor); > >- // allow the cursor to be set internally if we're in the bg, but >- // don't actually set it. >- if ( !nsToolkit::IsAppInForeground() ) >+ // allow the cursor to be set internally if we're in the bg, but >+ // don't actually set it. >+ if ( !nsToolkit::IsAppInForeground() ) { > return NS_OK; >- >- // mac specific cursor manipulation >- if (nsToolkit::HasAppearanceManager()) >- { >- short cursor = -1; >- switch (aCursor) >- { >- case eCursor_standard: cursor = kThemeArrowCursor; break; >- case eCursor_wait: cursor = kThemeWatchCursor; break; >- case eCursor_select: cursor = kThemeIBeamCursor; break; >- case eCursor_hyperlink: cursor = kThemePointingHandCursor; break; >- case eCursor_sizeWE: cursor = kThemeResizeLeftRightCursor; break; >- case eCursor_sizeNS: cursor = 129; break; >- case eCursor_sizeNW: cursor = 130; break; >- case eCursor_sizeSE: cursor = 131; break; >- case eCursor_sizeNE: cursor = 132; break; >- case eCursor_sizeSW: cursor = 133; break; >- case eCursor_arrow_north: cursor = 134; break; >- case eCursor_arrow_north_plus:cursor = 135; break; >- case eCursor_arrow_south: cursor = 136; break; >- case eCursor_arrow_south_plus:cursor = 137; break; >- case eCursor_arrow_west: cursor = 138; break; >- case eCursor_arrow_west_plus: cursor = 139; break; >- case eCursor_arrow_east: cursor = 140; break; >- case eCursor_arrow_east_plus: cursor = 141; break; >- case eCursor_crosshair: cursor = kThemeCrossCursor; break; >- case eCursor_move: cursor = kThemeOpenHandCursor; break; >- case eCursor_help: cursor = 143; break; >- case eCursor_copy: cursor = 144; break; // CSS3 >- case eCursor_alias: cursor = 145; break; >- case eCursor_context_menu: cursor = 146; break; >- case eCursor_cell: cursor = kThemePlusCursor; break; >- case eCursor_grab: cursor = kThemeOpenHandCursor; break; >- case eCursor_grabbing: cursor = kThemeClosedHandCursor; break; >- case eCursor_spinning: cursor = 149; break; // better than kThemeSpinningCursor >- case eCursor_count_up: cursor = kThemeCountingUpHandCursor; break; >- case eCursor_count_down: cursor = kThemeCountingDownHandCursor; break; >- case eCursor_count_up_down: cursor = kThemeCountingUpAndDownHandCursor; break; >- >- } >- if (cursor >= 0) >- { >- if (cursor >= 128) >- { >- nsMacResources::OpenLocalResourceFile(); >- CursHandle cursHandle = ::GetCursor(cursor); >- NS_ASSERTION ( cursHandle, "Can't load cursor, is the resource file installed correctly?" ); >- if ( cursHandle ) >- ::SetCursor(*cursHandle); >- nsMacResources::CloseLocalResourceFile(); >- } >- else >- ::SetThemeCursor(cursor); >- } > } >- else Erk, diff hard to read here. diff -uw please? >@@ -817,4 +756,69 @@ > > } // nsWindow::SetCursor >+ >+void nsWindow::SetCursor(short aCursor) { Brace on new line pls, here and below. >+ if (aCursor >= 0) >+ { >+ if (aCursor >= 128) >+ { >+ nsMacResources::OpenLocalResourceFile(); >+ CursHandle cursHandle = ::GetCursor(aCursor); >+ NS_ASSERTION ( cursHandle, "Can't load cursor, is the resource file installed correctly?"); >+ if ( cursHandle ) >+ { >+ ::SetCursor(*cursHandle); >+ } >+ nsMacResources::CloseLocalResourceFile(); >+ } >+ else >+ { >+ ::SetThemeCursor(aCursor); >+ } >+ } >+} >+ >+CursorSpinner::CursorSpinner() : >+ mSpinCursorFrame(0), mTimerUPP(nsnull), mTimerRef(nsnull) >+{ >+ mTimerUPP = NewEventLoopTimerUPP(SpinCursor); >+} >+ >+CursorSpinner::~CursorSpinner() >+{ >+ if (mTimerUPP) ::DisposeEventLoopTimerUPP(mTimerUPP); >+ if (mTimerRef) ::RemoveEventLoopTimer(mTimerRef); >+} >+ >+short CursorSpinner::GetNextCursorFrame() { >+ int result = 149 + mSpinCursorFrame; >+ mSpinCursorFrame = (mSpinCursorFrame + 1) % 4; >+ return (short) result; >+} >+ >+void CursorSpinner::StartSpinCursor() { >+ OSStatus result = noErr; >+ if (mTimerRef == nsnull) >+ { >+ result = ::InstallEventLoopTimer(::GetMainEventLoop(), 0, 0.25 * kEventDurationSecond, >+ mTimerUPP, this, &mTimerRef); >+ if (result != noErr) { >+ mTimerRef = nsnull; >+ nsWindow::SetCursor(149); >+ } >+ } >+} >+ >+void CursorSpinner::StopSpinCursor() { >+ if (mTimerRef) >+ { >+ ::RemoveEventLoopTimer(mTimerRef); >+ mTimerRef = nsnull; >+ } >+} >+ >+pascal void CursorSpinner::SpinCursor(EventLoopTimerRef inTimer, void *inUserData) { >+ CursorSpinner* cs = reinterpret_cast<CursorSpinner*>(inUserData); >+ nsWindow::SetCursor(cs->GetNextCursorFrame()); >+} > > #pragma mark - >Index: nsWindow.h >=================================================================== >RCS file: /cvsroot/mozilla/widget/src/mac/nsWindow.h,v >retrieving revision 1.94 >diff -u -2 -r1.94 nsWindow.h >--- nsWindow.h 27 Feb 2003 23:31:54 -0000 1.94 >+++ nsWindow.h 19 Apr 2003 03:53:34 -0000 >@@ -75,4 +75,18 @@ > } TRectArray; > >+class CursorSpinner { >+public: >+ CursorSpinner(); >+ virtual ~CursorSpinner(); No need for virtual dtor. >+ void StartSpinCursor(); >+ void StopSpinCursor(); >+private: >+ short mSpinCursorFrame; >+ EventLoopTimerUPP mTimerUPP; >+ EventLoopTimerRef mTimerRef; >+ >+ short GetNextCursorFrame(); >+ static pascal void SpinCursor(EventLoopTimerRef inTimer, void *inUserData); >+}; Spacing looks odd. Tabs? > //------------------------------------------------------------------------- >@@ -181,5 +195,6 @@ > > NS_IMETHOD SetCursor(nsCursor aCursor); >- >+ static void SetCursor(short aCursor); >+ I'd prefer a different method name, clarifying the difference. > NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture, PRBool aConsumeRollupEvent); > NS_IMETHOD SetTitle(const nsString& title);
Attachment #121042 -
Flags: superreview?(sfraser) → superreview-
Assignee | ||
Comment 16•21 years ago
|
||
I tried adding -w to the cvs diff, but it made a much worse, all sorts of unrelated code changes got conflated into a real mess :) I think the bit that's confusing you in the patch is the part where I removed a chunk of code which was designed to do the cursor setting on pre-AppearanceManager systems (ie, System 7!) I figured we didn't need that any more. Take a look at nsWindow::SetCursor() as it stands now and you'll soon figure out which bit I took out.
Attachment #121042 -
Attachment is obsolete: true
Assignee | ||
Updated•21 years ago
|
Attachment #121067 -
Flags: superreview?(sfraser)
Attachment #121067 -
Flags: review?(pinkerton)
Comment 17•21 years ago
|
||
Comment on attachment 121067 [details] [diff] [review] Changes to patch to cover Simon's comments + int result = 149 + mSpinCursorFrame; a constant would be nice. i know the original code didn't have one, but still... how about doing this feature (and the code cleanup) for the cocoa ChildView class as well? we don't want the two to get any more out of sync in terms of functionality than they need to. r=pink
Attachment #121067 -
Flags: review?(pinkerton) → review+
Assignee | ||
Comment 18•21 years ago
|
||
>(From update of attachment 121067 [details] [diff] [review]) >+ int result = 149 + mSpinCursorFrame; >a constant would be nice. i know the original code didn't have one, but >still... OK. I'll add one before I checkin. >how about doing this feature (and the code cleanup) for the cocoa ChildView >class as well? we don't want the two to get any more out of sync in terms of >functionality than they need to. Sure. Planned to do that anyway. I need to learn to use NSTimer in any case. I've never built Chimera however. Do I need a seperate tree or can I build ontop of a Mozilla debug tree?
Assignee | ||
Comment 19•21 years ago
|
||
Assignee | ||
Updated•21 years ago
|
Attachment #121837 -
Flags: superreview?(sfraser)
Attachment #121837 -
Flags: review?(pinkerton)
Attachment #121042 -
Flags: review?(pinkerton)
Comment 20•21 years ago
|
||
+- (id) init; +- (void) dealloc; you don't need to list inherited methods in the decl. + if ( gCursorSpinner == nsnull) + { + gCursorSpinner = [[CursorSpinner alloc] init]; + } in an embedding context, this will never go away, will it? how will the embeddor clean up if they don't want gecko around anymore? +- (id) init +{ + self = [super init]; + return self; +} un-necessary. + if (mTimer != nsnull) if (mTimer) + if ( mTimer == nsnull) if (!mTimer) + mTimer = nsnull; should probably stick with cocoa stuff using |nil| rather than nsnull. doubt it matters, but...
Updated•21 years ago
|
Attachment #121837 -
Flags: review?(pinkerton) → review-
Comment 21•21 years ago
|
||
I think we should eliminate the use of resources in Cocoa, and load the cursors from images instead.
Assignee | ||
Comment 22•21 years ago
|
||
Switch to NSCursor you mean? Yeah, I hadn't noticed that. That'd be cool. I'll file a seperate bug since this is really doing double time as it is. Can you sr= the patch for Mozilla so I can check in the Carbon version please?
Assignee | ||
Updated•21 years ago
|
Attachment #121837 -
Flags: superreview?(sfraser)
Comment 23•21 years ago
|
||
Comment on attachment 121067 [details] [diff] [review] Changes to patch to cover Simon's comments We open the resource file ever time we switch the cursor. I think with an animating cursor, this will be too expensive; it will hit the disk each time.
Attachment #121067 -
Flags: superreview?(sfraser) → superreview-
Comment 24•21 years ago
|
||
Comment on attachment 121067 [details] [diff] [review] Changes to patch to cover Simon's comments OK, I was mislead by the nsMacResources method names, grumble.
Attachment #121067 -
Flags: superreview- → superreview+
Assignee | ||
Updated•21 years ago
|
Attachment #121837 -
Attachment is obsolete: true
Assignee | ||
Comment 25•21 years ago
|
||
Fix checked into Mozilla Trunk for 1.5/Firebird Fixed in Nightly 2003052703
Status: ASSIGNED → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
Comment 26•21 years ago
|
||
This looks like it may have can a regression in the Camino build. http://bugzilla.mozilla.org/show_bug.cgi?id=207301
Comment 27•21 years ago
|
||
Comment on attachment 121067 [details] [diff] [review] Changes to patch to cover Simon's comments I think this would be a good thing to land on the long lived 1.4 branch. The landing would include the changes in bug 207301.
Attachment #121067 -
Flags: approval1.4?
Comment 28•21 years ago
|
||
Comment on attachment 121067 [details] [diff] [review] Changes to patch to cover Simon's comments a=asa (on behalf of drivers) for checkin to the 1.4 branch. We'll also need to get the fix at 207301 with this as well.
Attachment #121067 -
Flags: approval1.4? → approval1.4+
Comment 29•21 years ago
|
||
looks good with the 2003.05.30.08 trunk build (OS X 10.2.6). when checked into the 1.4 branch, pls add the fixed1.4 keyword. thanks!
Whiteboard: [verified on trunk]
Target Milestone: Future → mozilla1.4final
Comment 31•21 years ago
|
||
weird, this doesn't seem to be working with the 2003.06.09.05-1.4 (commercial branch) build on OS X (10.2.6). is this working for anyone using today's *branch* mozilla build?
Keywords: fixed1.4
Assignee | ||
Comment 32•21 years ago
|
||
I see the problem. Is should have checked in nsMacWidget.r too. Will do ASAP
Comment 33•21 years ago
|
||
vrfy'd fixed with 2003.06.10.05-1.4 comm bits, and carrying over trunk vrfy from comment 29.
Comment 34•21 years ago
|
||
it appears that this bug caused the regression for bug 211462 (Crash turning on JA IME on Mac 10.1) lordpixel--can you please look at bug 211462 and this patch and see if you can fix it?
Updated•20 years ago
|
Product: Core → Mozilla Application Suite
You need to log in
before you can comment on or make changes to this bug.
Description
•