diff options
Diffstat (limited to 'byterun/rotatecursor.c')
-rw-r--r-- | byterun/rotatecursor.c | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/byterun/rotatecursor.c b/byterun/rotatecursor.c index ad75c24c7..46f7d07fd 100644 --- a/byterun/rotatecursor.c +++ b/byterun/rotatecursor.c @@ -11,29 +11,35 @@ /* $Id$ */ -/* Cursor rotation for MPW tools (ocamlrun and ocamlyacc) */ +/* Rotatecursor library, written by Damien Doligez + This file is in the public domain. + version 1.7 + + See rotatecursor.h for documentation. +*/ #include <CursorCtl.h> +#include <MacTypes.h> #include <stdlib.h> #include <Timer.h> -#include <Types.h> #include "rotatecursor.h" -int volatile have_to_interact; - typedef struct { TMTask t; int volatile *p1; int volatile *p2; } Xtmtask; -static Xtmtask mytmtask; +int volatile rotatecursor_flag = 1; +static int rotatecursor_inited = 0; +static int rotatecursor_period = 50; +static Xtmtask rotatecursor_tmtask; #if GENERATINGCFM -static void mytimerproc (Xtmtask *p) +static void rotatecursor_timerproc (Xtmtask *p) { if (p->p1 != NULL && *(p->p1) == 0) *(p->p1) = 1; if (p->p2 != NULL && *(p->p2) == 0) *(p->p2) = 1; @@ -43,38 +49,59 @@ static void mytimerproc (Xtmtask *p) extern Xtmtask *getparam() ONEWORDINLINE(0x2009); /* MOVE.L A1, D0 */ -static void mytimerproc (void) +static void rotatecursor_timerproc (void) { register Xtmtask *p = getparam (); - if (p->p1 != NULL) *(p->p1) = 1; - if (p->p2 != NULL) *(p->p2) = 1; + if (p->p1 != NULL && *(p->p1) == 0) *(p->p1) = 1; + if (p->p2 != NULL && *(p->p2) == 0) *(p->p2) = 1; } #endif /* GENERATINGCFM */ -static void remove_task (void) +static void rotatecursor_remove_task (void) { - RmvTime ((QElemPtr) &mytmtask); + RmvTime ((QElemPtr) &rotatecursor_tmtask); } -void rotatecursor_init (int volatile *p1) +static void rotatecursor_init (void) { + if (rotatecursor_inited) return; + InitCursorCtl (NULL); - mytmtask.t.tmAddr = NewTimerProc (mytimerproc); - mytmtask.t.tmWakeUp = 0; - mytmtask.t.tmReserved = 0; - mytmtask.p1 = p1; - mytmtask.p2 = &have_to_interact; - InsTime ((QElemPtr) &mytmtask); - PrimeTime ((QElemPtr) &mytmtask, 1); - atexit (remove_task); + + rotatecursor_tmtask.t.tmAddr = NewTimerProc (rotatecursor_timerproc); + rotatecursor_tmtask.t.tmWakeUp = 0; + rotatecursor_tmtask.t.tmReserved = 0; + rotatecursor_tmtask.p1 = NULL; + rotatecursor_tmtask.p2 = &rotatecursor_flag; + + InsTime ((QElemPtr) &rotatecursor_tmtask); + PrimeTime ((QElemPtr) &rotatecursor_tmtask, 1); + + atexit (rotatecursor_remove_task); + + rotatecursor_inited = 1; +} + +void rotatecursor_options (int volatile *p1, int period) +{ + if (!rotatecursor_inited) rotatecursor_init (); + + rotatecursor_tmtask.p1 = p1; + rotatecursor_period = period; } int rotatecursor_action (int reverse) { - PrimeTime ((QElemPtr) &mytmtask, 50); /* 20 Hz */ + if (!rotatecursor_inited) rotatecursor_init (); + + rotatecursor_flag = 0; + + PrimeTime ((QElemPtr) &rotatecursor_tmtask, rotatecursor_period); + RotateCursor (reverse ? -32 : 32); + return 0; } |