/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "nsWatchTask.h" #include #include // our global, as soon as the gfx code fragment loads, this will setup // the VBL task automagically. nsWatchTask gWatchTask; // // GetTask // // A nice little getter to avoid exposing the global variable nsWatchTask& nsWatchTask :: GetTask ( ) { return gWatchTask; } nsWatchTask :: nsWatchTask ( ) : mChecksum('mozz'), mSelf(this), mTicks(::TickCount()), mBusy(PR_FALSE), mSuspended(PR_FALSE), mInstallSucceeded(PR_FALSE), mAnimation(0) { } nsWatchTask :: ~nsWatchTask ( ) { InitCursor(); } // // Start // // Registers the VBL task and does other various init tasks to begin // watching for time away from the event loop. It is ok to call other // methods on this object w/out calling Start(). // void nsWatchTask :: Start ( ) { } // Start // // DoWatchTask // // Called at vertical retrace. If we haven't been to the event loop for // |kTicksToShowWatch| ticks, animate the cursor. // // Note: assumes that the VBLTask, mTask, is the first member variable, so // that we can piggy-back off the pointer to get to the rest of our data. // // (Do we still need the check for LMGetCrsrBusy()? It's not in carbon...) // pascal void nsWatchTask :: DoWatchTask ( nsWatchTask* inSelf ) { if ( inSelf->mChecksum == 'mozz' ) { if ( !inSelf->mSuspended ) { PRBool busy = inSelf->mBusy; if ( !busy ) { if ( ::TickCount() - inSelf->mTicks > kTicksToShowWatch ) { ::SetCursor ( &(inSelf->mWatchCursor) ); inSelf->mBusy = PR_TRUE; } } else ::SetCursor ( &(inSelf->mWatchCursor) ); // next frame in cursor animation ++inSelf->mAnimation; } } // if valid checksum } // DoWatchTask // // EventLoopReached // // Called every time we reach the event loop (or an event loop), this tickles // our internal tick count to reset the time since our last visit to WNE and // if we were busy, we're not any more. // void nsWatchTask :: EventLoopReached ( ) { // reset the cursor if we were animating it if ( mBusy ) ::InitCursor(); mBusy = PR_FALSE; mTicks = ::TickCount(); mAnimation = 0; }