Ejemplo n.º 1
0
//***** Event handler - Hard key presses
void HandleKeyPress(void) {
  UInt32 keystate = KeyCurrentState();

  // Only valid in the main form
  if (FrmGetActiveFormID() != MainForm)
    return;

  if (keystate & keyBitHard1) { // select pattern
    call_at(1);
  }
  else if (keystate & keyBitHard2) { // enter siteswap
    call_at(2);
  }
  else if (keystate & keyBitHard3) { // Toggle juggler
    call_at(3);
  }
  else if (keystate & keyBitHard4) { // Toggle frameskip
    call_at(4);
  }
  else if (keystate & keyBitPageUp) { // increase speed
    call_at(5);
  }
  else if (keystate & keyBitPageDown) { // decrease speed
    call_at(6);
  }
}
Ejemplo n.º 2
0
// When something outside display.c wants to call 'at' aka put_char_at
// to draw something briefly, this is probably what it wants...
// Draw 1 cell on screen (here row,col are NOT screen-relative.)
// For making animatedness. If c = 0, it will set cell to 'original' value
void animate_char(Short y, Short x, Char c, Boolean bold)
{
  Short row, col, ch;
  Short v_h = itsy_on ? visible_h_itsy : visible_h;
  Short v_w = itsy_on ? visible_w_itsy : visible_w;

  if (FrmGetActiveFormID() != MainForm) return;

  if (y < visible_y || x < visible_x ||
      y >= visible_y + v_h || x >= visible_x + v_w)
    return; // the cursor position is not visible on the screen!

  //  if (c != 0 && FrmGetActiveFormID() == MainForm)
  //    lines_dirty[y] = screen_dirty = true;// worst case, refresh will clean up

  row = y - visible_y;
  col = x - visible_x;
  
  ch = terminal[row][col];
  if (c == 0) c = ch;

#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(ledFont);
#else
  if (itsy_on) FntSetFont(SmallFont);
#endif
  /*
#ifdef I_AM_COLOR
  if (IsColor) {
    start_color();
  }
#endif //I_AM_COLOR
  */
  put_char_at(row, col, c, bold);
  /*
#ifdef I_AM_COLOR
  if (IsColor) {
    stop_color();
  }
#endif //I_AM_COLOR
  */
#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(stdFont);
#else
  if (itsy_on) FntSetFont(BigFont);
#endif
  terminal[row][col] = ch;
}
Ejemplo n.º 3
0
/***********************************************************************
 * Notification Handle
 ***********************************************************************/
static Err
HandleNotification(SysNotifyParamType *notifyParams)
{
  switch (notifyParams->notifyType) {
  case sysNotifyLateWakeupEvent:
    if (FrmGetActiveFormID() == FORM_main) {
      // We are on the main form, we have a LateWakup notification => Highlight next event
      GadgetDrawHintNext();
    }
    break;
    
  default:
    break;
  }

  return errNone;
}
Ejemplo n.º 4
0
void refresh() // formerly known as docrt()
{
  Short col, line, y_abs, x_abs;
  Short v_h = itsy_on ? visible_h_itsy : visible_h;
  Short v_w = itsy_on ? visible_w_itsy : visible_w;
  UChar info;

  if (FrmGetActiveFormID() != MainForm) return;

  if (you.uswallow) {
    swallowed();
    return;
  }
  ridiculous_code();

#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(ledFont);
#else
  if (itsy_on) FntSetFont(SmallFont);
#endif

  /* line is RELATIVE, line+visible_y is ABSOLUTE.
     col is RELATIVE, col+visible_x is ABSOLUTE. */
  for (line = 0 ; line < v_h ; line++) {
    y_abs = line + visible_y;
    for (col = 0; col < v_w; col++) {
      x_abs = col + visible_x;
      info = floor_info[x_abs][y_abs];
      if (info & (SEEN_CELL | NEW_CELL)) // SEEN_CELL in case we clear_visibled
	if (floor_symbol[x_abs][y_abs] != terminal[line][col]) {
	  put_char_at(line, col, floor_symbol[x_abs][y_abs], false);
      }
    }
  }
  scrlx = DCOLS;
  scrly = DROWS;
  scrhx = scrhy = 0;

#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(stdFont);
#else
  if (itsy_on) FntSetFont(BigFont);
#endif
}
Ejemplo n.º 5
0
Archivo: IntExp.c Proyecto: ysei/palmos
static void AppEventLoop(void){
  EventType event;
  short error;
  UInt16 nilEvents;
  do {
    EvtGetEvent(&event, 25);
    if (MenuHandleEvent(NULL, &event, &error)) { nilEvents=0; continue; }
    if (AppHandleEvent(&event)){ if(event.eType!=nilEvent){nilEvents=0;} continue; }
    if (SysHandleEvent(&event)) { nilEvents=0; continue; }
    if (event.eType == nilEvent){
      nilEvents++;
      if(nilEvents++ > 40 * 60){
        nilEvents = 0;
        if(FrmGetActiveFormID()!=HelpForm){
          FrmGotoForm(HelpForm);
        }
        continue;
      }
    }
    FrmDispatchEvent(&event);
  } while (event.eType != appStopEvent);
}
Ejemplo n.º 6
0
// Not good to basically have two independent "refresh" procedures... :-b
// hmmm in the original, pline called nscr!
void nscr()
{
  Short x_abs, y_abs, col, line;
  Short v_h = itsy_on ? visible_h_itsy : visible_h;
  Short v_w = itsy_on ? visible_w_itsy : visible_w;

  if (FrmGetActiveFormID() != MainForm) return;
  // XXX flags.nscrinh is used only in goto_level()  ..will need it though.
  if (you.uswallow || you.ux == FAR /*|| flags.nscrinh*/) return;
#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(ledFont);
#else
  if (itsy_on) FntSetFont(SmallFont);
#endif
  pru();
  for (y_abs = scrly ; y_abs <= scrhy ; y_abs++) {
    line = y_abs - visible_y;
    if (line < 0 || line >= v_h) continue;
    for (x_abs = scrlx ; x_abs <= scrhx ; x_abs++) {
      col = x_abs - visible_x;
      if (col < 0 || col >= v_w) continue;
      if (get_cell_new(floor_info[x_abs][y_abs])) {
	//	room = &levl[x_abs][y_abs]
	floor_info[x_abs][y_abs] &= ~NEW_CELL; // room->new = 0;
	put_char_at(line, col, floor_symbol[x_abs][y_abs], false);
      }
    }
  }
  scrlx = DCOLS;
  scrly = DROWS;
  scrhx = scrhy = 0;
#ifdef I_AM_OS_2
  if (itsy_on) FntSetFont(stdFont);
#else
  if (itsy_on) FntSetFont(BigFont);
#endif
}
Ejemplo n.º 7
0
/* Perform action for specified select type */
void DoSelectTypeAction
    (
    SelectType selection    /* selection type */
    )
{
    if ( IsMainFormWinActive() || IsFullscreenformActive()
         || FrmGetActiveFormID() == frmLibrary ) {
        if ( IsMainFormWinActive() &&
             selection != SELECT_TOGGLE_AUTOSCROLL &&
             selection != SELECT_INCREASE_AUTOSCROLL &&
             selection != SELECT_DECREASE_AUTOSCROLL &&
             selection != SELECT_FULL_PAGE_UP &&
             selection != SELECT_FULL_PAGE_DOWN &&
             selection != SELECT_HALF_PAGE_UP &&
             selection != SELECT_HALF_PAGE_DOWN &&
             selection != SELECT_ONE_LINE_UP &&
             selection != SELECT_ONE_LINE_DOWN ) {
            DoAutoscrollToggle( AUTOSCROLL_OFF );
        }
        switch ( selection ) {
            case SELECT_NONE:
                break;

#ifdef SUPPORT_WORD_LOOKUP
#ifdef SUPPORT_PPI
            case SELECT_WORD_LOOKUP_PPI:
                isSelectWordTapMode = ! isSelectWordTapMode;
                selectedWordAction  = SELECT_WORD_PPI;
                ShowSelectWordTapIcon();
                break;
#endif
#ifdef SUPPORT_ANNOTATION
            case SELECT_WORD_LOOKUP_ANNOTATE:
                isSelectWordTapMode = ! isSelectWordTapMode;
                selectedWordAction  = SELECT_WORD_ANNOTATE;
                ShowSelectWordTapIcon();
                break;
#endif
            case SELECT_WORD_LOOKUP_SEARCH_FORM:
                isSelectWordTapMode = ! isSelectWordTapMode;
                selectedWordAction  = SELECT_WORD_SEARCH_FORM;
                ShowSelectWordTapIcon();
                break;
            case SELECT_WORD_LOOKUP_TO_CLIPBOARD:
                isSelectWordTapMode = ! isSelectWordTapMode;
                selectedWordAction  = SELECT_WORD_TO_CLIPBOARD;
                ShowSelectWordTapIcon();
                break;
#endif

            case SELECT_SAVE_POSITION:
                AddToHistory( GetCurrentRecordId() );
                break;

            case SELECT_BRIGHTNESS_ADJUST:
                EmitKey( vchrBrightness, commandKeyMask );
                break;

            case SELECT_TOGGLE_BACKLIGHT:
                EmitKey( vchrBacklight, commandKeyMask );
                break;
                
            case SELECT_CONTRAST_ADJUST:
                EmitKey( vchrContrast, commandKeyMask );
                break;

            case SELECT_ONE_LINE_UP:
                DoPageMove( GetDefaultMainStyleHeight() );
                break;

            case SELECT_ONE_LINE_DOWN:
                DoPageMove( -GetDefaultMainStyleHeight() );
                break;

            case SELECT_FULL_PAGE_UP:
                if ( Prefs()->autoscrollEnabled &&
                     Prefs()->autoscrollDir == AUTOSCROLL_UP )
                    DoAutoscrollIncr();
                else if ( Prefs()->autoscrollEnabled )
                    DoAutoscrollDecr();
                else if ( Prefs()->pageControlsLink && OnFirstScreen() &&
                          NO_RECORD == GetSequentialRecordId( DIRECTION_UP ) )
                    GoToFirstAnchor();
                else
                    DoPageMove( RotGetScrollValue() );
                break;

            case SELECT_HALF_PAGE_UP:
                if ( Prefs()->autoscrollEnabled &&
                     Prefs()->autoscrollDir == AUTOSCROLL_UP )
                    DoAutoscrollIncr();
                else if ( Prefs()->autoscrollEnabled )
                    DoAutoscrollDecr();
                else if ( Prefs()->pageControlsLink && OnFirstScreen() &&
                          NO_RECORD == GetSequentialRecordId( DIRECTION_UP ) )
                    GoToFirstAnchor();
                else
                    DoPageMove( RotGetScrollValue() / 2 );
                break;

            case SELECT_FULL_PAGE_DOWN:
                if ( Prefs()->autoscrollEnabled &&
                     Prefs()->autoscrollDir == AUTOSCROLL_UP )
                    DoAutoscrollDecr();
                else if ( Prefs()->autoscrollEnabled )
                    DoAutoscrollIncr();
                else if ( Prefs()->pageControlsLink && OnLastScreen() )
                    GoToLastAnchor();
                else
                    DoPageMove( -RotGetScrollValue() );
                break;

            case SELECT_HALF_PAGE_DOWN:
                if ( Prefs()->autoscrollEnabled &&
                     Prefs()->autoscrollDir == AUTOSCROLL_UP )
                    DoAutoscrollDecr();
                else if ( Prefs()->autoscrollEnabled )
                    DoAutoscrollIncr();
                else if ( Prefs()->pageControlsLink && OnLastScreen() )
                    GoToLastAnchor();
                else
                    DoPageMove( -RotGetScrollValue() / 2 );
                break;

            case SELECT_GO_BACK:
                if ( IsFullscreenformActive() )
                    FsDoControlAction( -( LEFTCONTROL + 1 ) );
                else
                    DoControlAction( -( LEFTCONTROL + 1 ) );
                break;

            case SELECT_GO_FORWARD:
                if ( IsFullscreenformActive() )
                    FsDoControlAction( -( RIGHTCONTROL + 1 ) );
                else
                    DoControlAction( -( RIGHTCONTROL + 1 ) );
                break;

            case SELECT_GO_HOME:
                if ( IsFullscreenformActive() )
                    FsDoControlAction( -( HOMECONTROL + 1 ) );
                else
                    DoControlAction( -( HOMECONTROL + 1 ) );
                break;

            case SELECT_GO_TO_TOP:
                if ( IsFullscreenformActive() )
                    FsAdjustVerticalOffset( FULLSCREEN_TOP );
                else
                    GotoLocation( TOP );
                break;

            case SELECT_GO_TO_BOTTOM:
                if ( IsFullscreenformActive() )
                    FsAdjustVerticalOffset( FULLSCREEN_BOTTOM );
                else
                    GotoLocation( BOTTOM );
                break;

            case SELECT_FIND:
                FrmPopupForm( frmSearch );
                break;

            case SELECT_FIND_AGAIN:
                SearchAgain();
                break;

            case SELECT_ADD_BOOKMARK:
                DoAddBookmark();
                break;

            case SELECT_VIEW_BOOKMARKS:
                FrmPopupForm( frmBookmarks );
                break;

            case SELECT_OPEN_LIBRARY:
                CloseDocument();
                FrmGotoForm( GetValidForm( frmLibrary ) );
                break;

            case SELECT_DETAILS:
                FrmPopupForm( frmDetails );
                break;

            case SELECT_PREFS:
                FrmGotoForm( frmPrefs );
                break;

            case SELECT_BUTTON_ACTION:
                PrefsButtonShowFirst();
                FrmGotoForm( frmPrefs );
                break;

            case SELECT_TAP_ACTION:
                PrefsControlShowFirst();
                FrmGotoForm( frmPrefs );
                break;

            case SELECT_GESTURE_ACTION:
                PrefsGestureShowFirst();
                FrmGotoForm( frmPrefs );
                break;

            case SELECT_TOGGLE_AUTOSCROLL:
                DoAutoscrollToggle( AUTOSCROLL_TOGGLE );
                break;

            case SELECT_INCREASE_AUTOSCROLL:
                DoAutoscrollIncr();
                break;
                
            case SELECT_DECREASE_AUTOSCROLL:
                DoAutoscrollDecr();
                break;

            case SELECT_NEXT_ANCHOR:
                HandleNextControl();
                break;

            case SELECT_PREV_ANCHOR:
                HandlePrevControl();
                break;

            case SELECT_GO_TO_LINK:
                if ( IsFullscreenformActive() ) {
                    if ( 0 < actualAnchor )
                        FsDoControlAction( actualAnchor );
                } else {
                    DoControlAction( actualAnchor );
                }
                break;

            case SELECT_COPY_TO_MEMO:
                DoHardcopy();
                break;

            case SELECT_DELETE_DOCUMENT:
                DoDeleteDocument();
                break;

            case SELECT_FONT:
                PrefsFontShowFirst();
                FrmGotoForm( frmPrefs );
                break;

            case SELECT_COMMAND_STROKE:
                EmitKey( vchrCommand, commandKeyMask );
                break;

            case SELECT_MENU:
                EmitKey( vchrMenu, commandKeyMask );
                break;

#ifdef HAVE_ROTATE
            case SELECT_ROTATE_LEFT: {
                RotateType angle;
                angle = Prefs()->rotate;
                switch ( angle ) {
                    case ROTATE_ZERO:
                        angle = ROTATE_PLUS90;
                        break;
                    case ROTATE_PLUS90:
                        angle = ROTATE_MINUS90;
                        break;
                    case ROTATE_MINUS90:
                        angle = ROTATE_ZERO;
                }
                if ( Prefs()->individualDocumentLayout )
                    GetHistoryPtr()->rotate = angle;
                else
                    Prefs()->rotate = angle;
                FrmUpdateForm( Prefs()->lastForm, frmRedrawUpdateCode );
                break;
            }

            case SELECT_ROTATE_RIGHT: {
                RotateType angle;
                angle = Prefs()->rotate;
                switch ( angle ) {
                    case ROTATE_PLUS90:
                        angle = ROTATE_ZERO;
                        break;
                    case ROTATE_MINUS90:
                        angle = ROTATE_PLUS90;
                        break;
                    case ROTATE_ZERO:
                        angle = ROTATE_MINUS90;
                        break;
                }
                if ( Prefs()->individualDocumentLayout )
                    GetHistoryPtr()->rotate = angle;
                else
                    Prefs()->rotate = angle;
                FrmUpdateForm( Prefs()->lastForm, frmRedrawUpdateCode );
                break;
            }
#endif

            case SELECT_TOGGLE_TOOLBAR:
                if ( ! IsFormMain( Prefs()->lastForm ) )
                    break;
                if ( Prefs()->toolbar != TOOLBAR_NONE ) {
                    Prefs()->savedToolbar = Prefs()->toolbar;
                    Prefs()->toolbar      = TOOLBAR_NONE;
                }
                else {
                    if ( Prefs()->savedToolbar == TOOLBAR_NONE )
                        Prefs()->toolbar = TOOLBAR_TOP;
                    else
                        Prefs()->toolbar = Prefs()->savedToolbar;
                }
#ifdef HAVE_SILKSCREEN
                if ( GetDIAState() == DIA_STATE_NO_STATUS_BAR &&
                   Prefs()->toolbar != TOOLBAR_NONE )
                    SetDIAState( Prefs()->savedSilkscreen );
#endif
                FrmUpdateForm( Prefs()->lastForm, frmRedrawUpdateCode );
                break;

            case SELECT_TOGGLE_FULLSCREEN: {
                UInt16       newToolbarState;
                UInt16       newScrollbarState;
                DIAStateType newDIAState;
                if ( Prefs()->toolbar == TOOLBAR_NONE &&
                    Prefs()->scrollbar == SCROLLBAR_NONE
                   ) {
                    /* From fullscreen to non-fullscreen */
                    if ( Prefs()->savedToolbar == TOOLBAR_NONE &&
                         Prefs()->savedScrollbar == SCROLLBAR_NONE ) {
                        Prefs()->savedToolbar   = TOOLBAR_TOP;
                        Prefs()->savedScrollbar = SCROLLBAR_RIGHT;
                    }
                    if ( Prefs()->savedSilkscreen == DIA_STATE_NO_STATUS_BAR ) {
                        Prefs()->savedSilkscreen = DIA_STATE_MIN;
                    }
                    newToolbarState   = Prefs()->savedToolbar;
                    newScrollbarState = Prefs()->savedScrollbar;
                    newDIAState       = Prefs()->savedSilkscreen;
                }
                else {
                    /* From non-fullscreen to fullscreen */
                    newToolbarState   = TOOLBAR_NONE;
                    newScrollbarState = SCROLLBAR_NONE;
                    newDIAState       = DIA_STATE_NO_STATUS_BAR;
                }
                Prefs()->savedToolbar    = Prefs()->toolbar;
                Prefs()->savedScrollbar  = Prefs()->scrollbar;
                Prefs()->savedSilkscreen = GetDIAState();
                Prefs()->toolbar         = newToolbarState;
                Prefs()->scrollbar       = newScrollbarState;
                SetDIAState( newDIAState );
                FrmUpdateForm( Prefs()->lastForm, frmRedrawUpdateCode );
                break;
            }

            default:
                break;
        }
    }
}
Ejemplo n.º 8
0
/* Set screen bit depth for PalmOS3 */
void SetScreenModeOS3( void )
{
    Err     err;
    UInt16  activeFormID;
    Boolean resolutionChanged;
    Boolean depthChanged;

    if ( screenDepth == Prefs()->screenDepth &&
         screenHiRes == HiResType() )
        return;

    resolutionChanged = false;
    depthChanged      = false;

    /* Since HiResType() is set to unknownHiRes by default, the following two
       if statements will both return true to at least give HiResInitialize()
       the benifit of the doubt and the chance to initialize itself. If it
       cannot, then HiResType() is set to noHiRes, and no further attempts
       are made during the course of this session of the viewer */
    if ( ! IsHiResTypeNone( HiResType() ) ) {
        if ( IsHiResTypeNone( screenHiRes ) ) {
            err = HiResInitialize();
            if ( err == errNone )
                resolutionChanged = true;
            else if ( HiResStop != NULL )
                HiResStop();
        }
    }

    /* By default screenDepth is set to 0 when there aren't any preferences.
       Find the true default at this point instead of later on after falsly
       causing a display error */
    if ( Prefs()->screenDepth == 0 )
        SetDefaultScreenMode( true );

    /* Figure out the best resolution for this device */
    if ( ! forceDefaultScreen ) {
        HiRes hiResType;

        hiResType = HiResType();

        if ( IsHiResTypePalm( hiResType ) ) {
            err = WinScreenGetAttribute( winScreenHeight, &screenHeight );
            if ( err != errNone )
                screenHeight = PALM_SCREEN_HEIGHT;
            err = WinScreenGetAttribute( winScreenWidth, &screenWidth );
            if ( err != errNone )
                screenWidth  = PALM_SCREEN_WIDTH;
        }
        else if ( IsHiResTypeSony( hiResType ) ) {
            screenHeight = SONY_SCREEN_HEIGHT;
            screenWidth  = SONY_SCREEN_WIDTH;
        }
        else if ( IsHiResTypeHandera( hiResType ) ) {
            screenHeight = HANDERA_SCREEN_HEIGHT;
            screenWidth  = HANDERA_SCREEN_WIDTH;
        }
        else {
            screenHeight = NORMAL_SCREEN_HEIGHT;
            screenWidth  = NORMAL_SCREEN_WIDTH;
        }
    }

    /* If we no longer want hires... */
    if ( IsHiResTypeNone( HiResType() ) ) {
        /* ... and are currently in a hires mode, hires needs to be disabled */
        if ( ! IsHiResTypeNone( screenHiRes ) ) {
            if ( HiResStop != NULL )
                HiResStop();
            resolutionChanged = true;
        }
    }

    if ( screenDepth != Prefs()->screenDepth )
        depthChanged = true;

    screenDepth = Prefs()->screenDepth;
    screenHiRes = HiResType();

    MSG( _( "Setting screen to %ldx%ldx%ld\n", screenWidth, screenHeight,
        screenDepth ) );

    /* Handera dislikes being told what to set the values for
       screenWidth and screenHeight, so let it think what it wants */
    if ( IsHiResTypeHandera( HiResType() ) ) {
        err = WinScreenMode( winScreenModeSet, NULL, NULL,
            &screenDepth, NULL );
    }
    else {
        UInt16  prevCoordSys;

        prevCoordSys   = PalmSetCoordinateSystem( NATIVE );
        err = WinScreenMode( winScreenModeSet, &screenWidth, &screenHeight,
                  &screenDepth, NULL );
        if ( err != errNone ) {
            WinScreenMode( winScreenModeGetDefaults, &screenWidth, &screenHeight,
                NULL, NULL );
            err = WinScreenMode( winScreenModeSet, &screenWidth, &screenHeight,
                      &screenDepth, NULL );
        }
        PalmSetCoordinateSystem( prevCoordSys );
    }

    /* If we're having problems, set to hardware's default resolution */
    if ( err != errNone ) {
        MSG( _( "Unsuccessful. Trying 'safe' default values.\n" ) );
        if ( HiResStop != NULL )
            HiResStop();
        screenHiRes = noHiRes;

        SetDefaultScreenMode( true );
        resolutionChanged = true; /* assume it has */
        forceDefaultScreen = true;

        MSG( _( "Setting screen to %ldx%ldx%ld\n", screenWidth, screenHeight,
            screenDepth ) );
    }
    activeFormID = FrmGetActiveFormID();
    if ( IsVisibleToolbar( activeFormID ) ) {
        FrmEraseForm( FrmGetFormPtr( activeFormID ) );
        MainFormInit();
    }

    if ( resolutionChanged ) {
        SetHiResFunctions();
        InitializeViewportBoundaries();
    }

    if ( depthChanged ) {
        HanderaResetSilkScreen();
        ResetCache();
    }
    SetFontFunctions();
}
Ejemplo n.º 9
0
void slowPoll( void )
	{
	static BOOLEAN addedFixedItems = FALSE;
	RANDOM_STATE randomState;
	BYTE buffer[ RANDOM_BUFSIZE + 8 ];
	struct batteryInfoType {
		uint16_t warnThreshold;		/* Percent left for warn */
		uint16_t criticalThreshold;	/* Percent left for critical warn */
		uint16_t shutdownThreshold;	/* Percent left for shutdown */
		uint32_t timeout;			/* Battery timeout */
		SysBatteryKind type;		/* Battery type */
		Boolean pluggedIn;			/* Whether battery plugged in */
		uint8_t powerLevel;			/* Percent power remaining */
		} batteryInfo;
	const FontType *fontPtr;
	MenuBarType *menuPtr;
	void *stackStart, *stackEnd;
	MemHeapInfoType memInfo;
	RectangleType rectangleInfo;
	EvtQueueHandle evtQueueHandle;
	DatabaseID databaseID;
	FontID fontID;
	WinHandle winHandle;
	WinFlagsType winFlags;
	PatternType pattern;
	uint32_t version;
	uint16_t formID;
	uint8_t value;

	initRandomData( randomState, buffer, RANDOM_BUFSIZE );

	/* Get the handle of the current thread's event queue, current resource
	   database ID, start and end of the current thread's stack, ID and
	   pointer to the current font, ID and pointer to the currently active
	   form, and pointer to the currently active menu */
	evtQueueHandle = EvtGetThreadEventQueue();
	addRandomValue( randomState, evtQueueHandle );
	SysCurAppDatabase( &databaseID );
	addRandomValue( randomState, databaseID );
	SysGetStackInfo( &stackStart, &stackEnd );
	addRandomData( randomState, &stackStart, sizeof( void * ) );
	addRandomData( randomState, &stackEnd, sizeof( void * ) );
	fontID = FntGetFont();
	addRandomValue( randomState, fontID );
	fontPtr = FntGetFontPtr();
	addRandomData( randomState, &fontPtr, sizeof( FontType * ) );
	formID = FrmGetActiveFormID();
	addRandomValue( randomState, formID );
	if( formID > 0 )
		{
		FormType *formPtr;

		formPtr = FrmGetFormPtr( formID );
		addRandomData( randomState, &formPtr, sizeof( FormType * ) );
		}
	menuPtr = MenuGetActiveMenu();
	addRandomData( randomState, &menuPtr, sizeof( MenuBarType * ) );

	/* Get system memory info: heap base address, total memory, memory in
	   use, number of chunks allocated/free and chunk memory used/free,
	   available memory block info */
	MemDynHeapGetInfo( &memInfo );
	addRandomData( randomState, &memInfo, sizeof( MemHeapInfoType ) );

	/* Get the handle, creation flags, and size of the active window, the
	   screen window created at startup, and the current draw window, the
	   size and clipping rectangle of the draw window, the current pattern
	   type, and the current scaling mode */
	winHandle = WinGetActiveWindow();
	addRandomValue( randomState, winHandle );
	winFlags = WinGetWindowFlags( winHandle );
	addRandomValue( randomState, winFlags );
	WinGetWindowFrameRect( winHandle, &rectangleInfo );
	addRandomData( randomState, &rectangleInfo, sizeof( RectangleType ) );
	winHandle = WinGetDisplayWindow();
	addRandomValue( randomState, winHandle );
	winHandle = WinGetDrawWindow();
	addRandomValue( randomState, winHandle );
	winFlags = WinGetWindowFlags( winHandle );
	addRandomValue( randomState, winFlags );
	WinGetDrawWindowBounds( &rectangleInfo );
	addRandomData( randomState, &rectangleInfo, sizeof( RectangleType ) );
	WinGetClip( &rectangleInfo );
	addRandomData( randomState, &rectangleInfo, sizeof( RectangleType ) );
	pattern = WinGetPatternType();
	addRandomValue( randomState, pattern );
	if( FtrGet( sysFtrCreator, sysFtrNumWinVersion, &version ) == errNone && \
		version >= 5 )
		{
		uint32_t scaleType;

		/* Not implemented before PalmOS 5.3, requires the 1.5x Display
		   Feature Set to avoid generating a fatal alert */
		scaleType = WinGetScalingMode();
		addRandomValue( randomState, scaleType );
		}

	/* Get expansiode card info (capability flags, manufacturer, product,
	   and device info including unique serial number if available), and
	   media info (disk space, partition info, pseudo-HDD metrics) for all
	   expansion slots */
	if( FtrGet( sysFileCExpansionMgr,expFtrIDVersion, &version ) == errNone )
		{
		uint32_t slotIterator = expIteratorStart;
		uint16_t slotRefNum;

		while( slotIterator != expIteratorStop && \
			   ExpSlotEnumerate( &slotRefNum, &slotIterator ) == errNone )
			{
			ExpCardInfoType cardInfo;
			CardMetricsType cardMetrics;

			addRandomValue( randomState, slotRefNum );
			ExpCardInfo( slotRefNum, &cardInfo );
			addRandomData( randomState, &cardInfo, sizeof( ExpCardInfoType ) );
				ExpCardMetrics( slotRefNum, &cardMetrics );
			addRandomData( randomState, &cardMetrics, sizeof( CardMetricsType ) );
			}
		}

	/* Get attributes, filesystem type, mount info, media type, space used,
	   and total space for all mounted volumes */
	if( FtrGet( sysFileCVFSMgr, vfsFtrIDVersion, &version ) == errNone )
		{
		uint32_t volIterator = vfsIteratorStart;
		uint16_t volRefNum;

		while( volIterator != vfsIteratorStop && \
			   VFSVolumeEnumerate( &volRefNum, &volIterator ) == errNone )
			{
			VolumeInfoType volInfo;
			uint32_t volUsed, volTotal;

			addRandomValue( randomState, volRefNum );
			VFSVolumeInfo( volRefNum, &volInfo );
			addRandomData( randomState, &volInfo, sizeof( VolumeInfoType ) );
			VFSVolumeSize( volRefNum, &volUsed, &volTotal );
			addRandomValue( randomState, volUsed );
			addRandomValue( randomState, volTotal );
			}
		}

	/* Get battery state info */
	if( SysBatteryInfo( FALSE, &batteryInfo.warnThreshold,
						&batteryInfo.criticalThreshold,
						&batteryInfo.shutdownThreshold,
						&batteryInfo.timeout, &batteryInfo.type,
						&batteryInfo.pluggedIn,
						&batteryInfo.powerLevel ) == errNone )
		addRandomData( randomState, &batteryInfo,
					   sizeof( struct batteryInfoType ) );

	/* Get the LCD brightness and contrast level */
	value = SysLCDBrightness( FALSE, 0 );
	addRandomValue( randomState, value );
	value = SysLCDContrast( FALSE, 0 );
	addRandomValue( randomState, value );

	/* The following are fixed for the lifetime of the process so we only
	   add them once */
	if( !addedFixedItems )
		{
		struct ftrInfoType {
			uint32_t creator;	/* Feature creator */
			uint16_t number;	/* Feature number */
			uint32_t value;		/* Feature value */
			} ftrInfo;
		uint16_t ftrIterator, romTokenSize;
		uint8_t *romToken;

		/* Get system features.  This includes a large amount of
		   information ranging from fairly static (extensive hardware
		   capability info, OS version/configuration data) through to
		   variable (default font, locale, etc) */
		for( ftrIterator = 0; \
			 FtrGetByIndex( ftrIterator, FALSE, &ftrInfo.creator, \
							&ftrInfo.number, &ftrInfo.value ) == errNone; \
			 ftrIterator++ )
			addRandomData( randomState, &ftrInfo, sizeof( struct ftrInfoType ) );

		/* Get the ROM serial number.  This is somewhat complex, for it to
		   be valid the function call has to succeed and the returned
		   pointer has to be non-null and the first byte of the returned
		   data can't be 0xFF */
		if( SysGetROMToken( sysROMTokenSnum, &romToken, \
							&romTokenSize ) == errNone && \
			romToken != NULL && *romToken != 0xFF )
			addRandomData( randomState, &romToken, romTokenSize );

		addedFixedItems = TRUE;
		}

	/* Flush any remaining data through */
	endRandomData( randomState, 100 );
	}