-- FastMouse.mesa -- Revised by McGregor: June 24, 1983 4:54 pm -- Revised by Randy Gobbel: 10-May-83 9:56:34 -- Written by: CharlieLevy <> DIRECTORY ColorDisplay, Interminal, Process USING [SetPriority], ProcessPriorities USING [priorityPageFaultLow], Space USING [Error], SpecialSpace USING [MakeGlobalFrameResident, MakeProcedureResident], UserProfile, UserTerminal; FastMouse: PROGRAM IMPORTS ColorDisplay, Interminal, Process, Space, SpecialSpace, UserProfile, UserTerminal = BEGIN mouseProcess: PROCESS _ NIL; pauseTicks: CARDINAL _ 1; position, prevPosition: Interminal.MousePosition _ Interminal.GetMousePosition[]; threshold: INTEGER _ 2; ampxTen: INTEGER _ 15; MouseProcess: PROCEDURE = BEGIN Process.SetPriority[ProcessPriorities.priorityPageFaultLow]; DO UserTerminal.WaitForScanLine[0]; position _ Interminal.GetMousePosition[]; IF prevPosition = position THEN LOOP; IF prevPosition.color = position.color AND (MAX[ ABS[INTEGER[position.mouseX] - INTEGER[prevPosition.mouseX]], ABS[INTEGER[position.mouseY] - INTEGER[prevPosition.mouseY]]]) > threshold THEN Accelerate[]; prevPosition _ position; ENDLOOP; END; -- MouseProcess Accelerate: PROCEDURE = INLINE BEGIN xDelta: INTEGER _ INTEGER[position.mouseX] - INTEGER[prevPosition.mouseX]; yDelta: INTEGER _ INTEGER[position.mouseY] - INTEGER[prevPosition.mouseY]; IF xDelta > threshold THEN xDelta _ xDelta - threshold ELSE IF xDelta < -threshold THEN xDelta _ xDelta + threshold; IF yDelta > threshold THEN yDelta _ yDelta - threshold ELSE IF yDelta < -threshold THEN yDelta _ yDelta + threshold; position _ [ MAX[ MIN[ INTEGER[position.mouseX] + (xDelta * ampxTen / 10), IF position.color THEN ColorDisplay.width-1 ELSE UserTerminal.screenWidth], 0], position.color, MAX[ MIN[ INTEGER[position.mouseY] + (yDelta * ampxTen / 10), IF position.color THEN ColorDisplay.height-1 ELSE UserTerminal.screenHeight], 0]]; Interminal.SetMousePosition[position]; END; -- Accelerate ProcessProfile: UserProfile.ProfileChangedProc = TRUSTED BEGIN threshold _ UserProfile.Number["FastMouse.Threshold", 2]; ampxTen _ UserProfile.Number["FastMouse.AmpxTen", 15]; END; Init: PROCEDURE = BEGIN SpecialSpace.MakeGlobalFrameResident[FastMouse ! Space.Error => CONTINUE]; SpecialSpace.MakeProcedureResident[MouseProcess ! Space.Error => CONTINUE]; mouseProcess _ FORK MouseProcess[]; UserProfile.CallWhenProfileChanges[ProcessProfile]; END; Init[]; END.