summaryrefslogtreecommitdiffstats
path: root/byterun/rotatecursor.c
diff options
context:
space:
mode:
Diffstat (limited to 'byterun/rotatecursor.c')
-rw-r--r--byterun/rotatecursor.c69
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;
}