home *** CD-ROM | disk | FTP | other *** search
- /*
- * MouseClock - Turn your mouse pointer into a digital clock which
- * updates once a minute.
- *
- * NOTE: This program directly modifies the preferences data structure.
- * Using this program while trying to modify your preferences may
- * have bad results.
- *
- * Copyright (c) 1986, 1987 John R. Hoffman
- *
- * To use MouseClock, just Run it from your Startup-Sequence. To stop
- * it just delete the window and the previous pointer will be restored.
- *
- * This program is placed in the public domain as long as the above
- * copyright is included. Sale of this program except for REASONABLE
- * media costs is prohibited.
- *
- * To create with MANX: cc MouseClock.c
- * ln MouseClock.o -lc
- *
- * Error codes:
- *
- * 0 - Normal exit.
- * 101 - Can't get intuition.
- * 102 - Can't create a timer port.
- * 103 - Can't open a timer device.
- * 104 - Can't open a window.
- *
- * Modification History:
- *
- * 11/03/86 John Hoffman - Original version.
- * 01/02/87 John Hoffman - Added call to set task priority to -5,
- * fixed hot point location,
- * fixed to work with 16 bit integers,
- * added code to adjust update time to
- * five seconds after the minute.
- *
- */
-
- static char *Copyright = "Copyright (c) 1986, 1987 John R. Hoffman";
-
- /* #define PRINT_ERRORS */
-
- #ifdef PRINT_ERRORS
- #include <stdio.h>
- #endif
-
- #include <exec/types.h>
- #include <libraries/dos.h>
- #include <intuition/intuitionbase.h>
- #include <intuition/intuition.h>
-
- /* The pointer image. */
-
- static USHORT Clock[] = {
- 0x0000, 0x0000, 0xf800, 0xf800, 0xe000, 0xe000, 0xb000, 0xb000,
- 0x9800, 0x9800, 0x0c00, 0x0c00, 0xfffe, 0xfffe, 0x0000, 0xfffe,
- 0xb8ee, 0xfffe, 0xa8aa, 0xfffe, 0xaaaa, 0xfffe, 0xb8ee, 0xfffe,
- 0xaaaa, 0xfffe, 0xa8aa, 0xfffe, 0xb8ee, 0xfffe, 0x0000, 0xfffe,
- 0xfffe, 0xfffe, 0x0000, 0x0000
- };
-
- /* The hot point offset for the pointer. */
-
- #define CLOCK_HOT_X -1
- #define CLOCK_HOT_Y 0
-
- /* The positions in the pointer image which are replaced. */
-
- static USHORT positions[] = { 16, 18, 20, 22, 24, 26, 28 };
-
- /* The number of positions. */
-
- #define NUMPOS (sizeof(positions)/sizeof(USHORT))
-
- /* The bitmap for each of the digits. */
-
- static USHORT digits[10][7] = {
- 0x7, 0x5, 0x5, 0x5, 0x5, 0x5, 0x7, /* 0 */
- 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, /* 1 */
- 0x7, 0x1, 0x1, 0x7, 0x4, 0x4, 0x7, /* 2 */
- 0x7, 0x1, 0x1, 0x7, 0x1, 0x1, 0x7, /* 3 */
- 0x5, 0x5, 0x5, 0x7, 0x1, 0x1, 0x1, /* 4 */
- 0x7, 0x4, 0x4, 0x7, 0x1, 0x1, 0x7, /* 5 */
- 0x7, 0x4, 0x4, 0x7, 0x5, 0x5, 0x7, /* 6 */
- 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* 7 */
- 0x7, 0x5, 0x5, 0x7, 0x5, 0x5, 0x7, /* 8 */
- 0x7, 0x5, 0x5, 0x7, 0x1, 0x1, 0x7 /* 9 */
- };
-
- static struct NewWindow New_Window = {
- 426, 0, 164, 10,
- -1, -1,
- CLOSEWINDOW,
- WINDOWCLOSE | WINDOWDEPTH | WINDOWDRAG | SIMPLE_REFRESH | NOCAREREFRESH,
- NULL, NULL,
- (UBYTE *) "MouseClock ",
- NULL, NULL, 0, 0, 0, 0,
- WBENCHSCREEN
- };
-
- struct IntuitionBase *IntuitionBase = NULL;
- extern struct IntuitionBase *OpenLibrary();
-
- static struct Window *Window = NULL;
- extern struct Window *OpenWindow();
-
- static struct MsgPort *Msg_Port = NULL;
- extern struct MsgPort *CreatePort();
-
- static struct timerequest Timer_Request;
-
- extern struct Task *FindTask();
- extern struct IntuiMessage *GetMsg();
-
- USHORT SetTime();
-
- main()
- {
- BYTE old_hotX, old_hotY;
- USHORT second, old_pointer[POINTERSIZE];
- struct Preferences pref;
- struct IntuiMessage *Msg;
-
- SetTaskPri(FindTask(0L), -5L);
-
- if ( (IntuitionBase = OpenLibrary("intuition.library", 0L)) == NULL )
- finish(101, "Can't get intuition.\n");
-
- if ( (Msg_Port = CreatePort("timer.port", 0L)) == NULL )
- finish(102, "Can't create a timer port.\n");
-
- if ( OpenDevice(TIMERNAME, (long) UNIT_VBLANK, &Timer_Request, 0L) != 0 )
- finish(103, "Can't open a timer device.\n");
-
- Timer_Request.tr_node.io_Message.mn_ReplyPort = Msg_Port;
- Timer_Request.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
- Timer_Request.tr_node.io_Message.mn_Node.ln_Pri = 0;
-
- Timer_Request.tr_node.io_Command = TR_ADDREQUEST;
-
- if ( (Window = (struct Window *) OpenWindow(&New_Window)) == NULL )
- finish(104, "Can't open a window.\n");
-
- GetMouse(&old_pointer, &old_hotX, &old_hotY);
-
- second = SetTime(&Clock, NUMPOS, &positions);
-
- SetMouse(&Clock, CLOCK_HOT_X, CLOCK_HOT_Y);
-
- for ( ; ; ) {
-
- Timer_Request.tr_time.tv_secs = 60 - second + 5;
- Timer_Request.tr_time.tv_micro = 0;
-
- SendIO(&Timer_Request.tr_node);
-
- Wait(1L << Window->UserPort->mp_SigBit |
- 1L << Msg_Port->mp_SigBit);
-
- while ( (Msg = GetMsg(Window->UserPort)) != 0 ) {
- if ( Msg->Class == CLOSEWINDOW ) {
- ReplyMsg(Msg);
- SetMouse(&old_pointer, old_hotX, old_hotY);
- finish(0, "");
- }
- ReplyMsg(Msg);
- }
-
- GetMsg(Msg_Port);
-
- second = SetTime(&Clock, NUMPOS, &positions);
-
- SetClock(&Clock, NUMPOS, &positions);
-
- }
- }
-
- finish(code, msg)
- int code;
- char *msg;
- {
- AbortIO(&Timer_Request.tr_node);
-
- if ( Window != NULL )
- CloseWindow(Window);
-
- if ( Timer_Request.tr_node.io_Message.mn_ReplyPort != NULL )
- CloseDevice(&Timer_Request);
-
- if ( Msg_Port != NULL )
- DeletePort(Msg_Port);
-
- if ( IntuitionBase != NULL )
- CloseLibrary(IntuitionBase);
-
- #ifdef PRINT_ERRORS
- if ( msg[0] != '\0' )
- fputs(msg, stderr);
- #endif
-
- exit(code);
- }
-
- /* Get the whole pointer matrix and the hot point offset. */
-
- GetMouse(pointer, hotX, hotY)
- register USHORT *pointer;
- BYTE *hotX;
- BYTE *hotY;
- {
- register int i;
- struct Preferences pref;
-
- Forbid();
-
- GetPrefs(&pref, (long)sizeof(struct Preferences));
-
- for ( i = 0; i < POINTERSIZE; i++ )
- pointer[i] = pref.PointerMatrix[i];
-
- *hotX = pref.XOffset;
- *hotY = pref.YOffset;
-
- Permit();
- }
-
- /* Set the current time in the pointer matrix. */
-
- USHORT SetTime(pointer, numpos, pos)
- register USHORT *pointer;
- register USHORT numpos;
- register USHORT *pos;
- {
- register int i;
- struct DateStamp tnow;
- USHORT hour10, hour1, min10, min1;
- static USHORT hour10_old = 99;
- static USHORT hour1_old = 99;
- static USHORT min10_old = 99;
-
- DateStamp(&tnow);
-
- hour1 = (tnow.ds_Minute / 60) % 12;
- hour1 = (hour1 == 0) ? 12 : hour1;
- hour10 = hour1 / 10;
- hour1 = hour1 % 10;
-
- min1 = tnow.ds_Minute % 60;
- min10 = min1 / 10;
- min1 = min1 % 10;
-
- if ( hour10_old != hour10 ) {
- for ( i=0; i < numpos; i++ ) {
- if ( hour10 == 1 )
- pointer[pos[i]] |= 0x8000;
- else
- pointer[pos[i]] &= 0x7fff;
- }
- hour10_old = hour10;
- }
-
- if ( hour1_old != hour1 ) {
- for ( i=0; i < numpos; i++ ) {
- pointer[pos[i]] &= 0xc7ff;
- pointer[pos[i]] |= (digits[hour1][i] << 11);
- }
- hour1_old = hour1;
- }
-
- if ( min10_old != min10 ) {
- for ( i=0; i < numpos; i++ ) {
- pointer[pos[i]] &= 0xff1f;
- pointer[pos[i]] |= (digits[min10][i] << 5);
- }
- min10_old = min10;
- }
-
- for ( i=0; i < numpos; i++ ) {
- pointer[pos[i]] &= 0xfff1;
- pointer[pos[i]] |= (digits[min1][i] << 1);
- }
-
- return((USHORT)(tnow.ds_Tick/TICKS_PER_SECOND));
- }
-
- /* Set certain positions in the pointer matrix. */
-
- SetClock(pointer, numpos, pos)
- register USHORT *pointer;
- register USHORT numpos;
- register USHORT *pos;
- {
- register int i;
- struct Preferences pref;
-
- Forbid();
-
- GetPrefs(&pref, (long)sizeof(struct Preferences));
-
- for ( i = 0; i < numpos; i++ )
- pref.PointerMatrix[pos[i]] = pointer[pos[i]];
-
- SetPrefs(&pref, (long)sizeof(struct Preferences), FALSE);
-
- Permit();
- }
-
- /* Set the whole pointer matrix and the hot point offset. */
-
- SetMouse(pointer, hotX, hotY)
- register USHORT *pointer;
- BYTE hotX;
- BYTE hotY;
- {
- register int i;
- struct Preferences pref;
-
- Forbid();
-
- GetPrefs(&pref, (long)sizeof(struct Preferences));
-
- for ( i = 0; i < POINTERSIZE; i++ )
- pref.PointerMatrix[i] = pointer[i];
-
- pref.XOffset = hotX;
- pref.YOffset = hotY;
-
- SetPrefs(&pref, (long)sizeof(struct Preferences), FALSE);
-
- Permit();
- }
-