home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 138.lha / DMouse_1.06 / dmouse.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  7KB  |  207 lines

  1. /*
  2.  *  DMOUSE.C    V1.06   18 May 1988      (Aztec Compile, +L  ... 32 bit ints)
  3.  *                                       and link w/ c32.lib
  4.  *
  5.  *  DMOUSE QUIT
  6.  *  DMOUSE -a# -t# -s# -m# -c# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd
  7.  *
  8.  *  -a#     # = acceleration, default 3.        1 to disable
  9.  *  -t#     # = mouse threshold before acceleration takes effect, def. 0
  10.  *              (in pixels/event)
  11.  *  -s#     # = screen timeout, default 5min,   0 to disable
  12.  *  -m#     # = pointer timeout, default 5 secs,0 to disable
  13.  *  -c#     # = # of clicks to bring window to front
  14.  *  -L0     Disable LeftMouseButton->WindowToFront (LMB+RMB->ToBack)
  15.  *  -L1     Enable it
  16.  *  -Rqqqq  Set qualifier + RMB for Window/ScreenToBack (default LMB)
  17.  *  -A0     Disable Auto-Activate window on mouse move
  18.  *  -A1     Enable it
  19.  *  -Kcccc  Set key code in hex that activates cmd, def is escape
  20.  *  -Qqqqq  Set key qualifier in hex for keycode, def is left-amiga
  21.  *  -C cmd  Set command (must be last option on command line), def NewCli
  22.  *
  23.  *      Note:   The -Q Qualifiers usually must be or'd with x8000
  24.  *      Note:   The -R Qualifier should NOT be or'd with x8000.
  25.  *
  26.  *
  27.  *  To remove, BREAK the CLI it ran under.
  28.  *
  29.  *  TODO:   mouse pointer sometimes gets turned on by intuition
  30.  */
  31. #include <stdio.h>
  32. #include "dmouse.h"
  33. #define VERSION 6
  34. int     Enable_Abort;       /*  CLI break enable        */
  35. main(ac, av)
  36. char *av[];
  37. {
  38.     register short i, j, len;
  39.     register long val;
  40.     register char *ptr;
  41.     register DMS  *dms = FindPort(PORTNAME);
  42.     short   exists = (dms != NULL);
  43.     short   create = (dms == NULL);
  44.     short   quit = 0;
  45.     Enable_Abort = 0;
  46.     if (create) {
  47.         dms = AllocMem(sizeof(DMS), MEMF_PUBLIC|MEMF_CLEAR);
  48.         dms->Version = VERSION;
  49.         dms->Acc = 3;
  50.         dms->STo = 5*60;
  51.         dms->MTo = 5;
  52.         dms->Code = 0x45;
  53.         dms->Qual = 0x8040;
  54.         dms->RQual= 0x4000;
  55.         dms->Clicks = 1;
  56.         dms->CLeft = dms->Clicks;
  57.         strcpy(dms->Cmd, "newcli");
  58.         dms->LMBEnable = 1;
  59.         dms->AAEnable = 1;
  60.         dms->NoSprData = AllocMem(12, MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
  61.         dms->NoSprData[0] = 0xFE00;
  62.         dms->NoSprData[1] = 0xFF00;
  63.     }
  64.     for (i = 1; i < ac; ++i) {
  65.         ptr = av[i];
  66.         if (strcmp(ptr, "QUIT") == 0 || strcmp(ptr, "quit") == 0) {
  67.             quit = 1;
  68.             create = 0;
  69.             break;
  70.         }
  71.         val = atoi(ptr+2);
  72.         if (*ptr == '-') {
  73.             switch(ptr[1]) {
  74.             case 'a':
  75.                 dms->Acc = val;
  76.                 break;
  77.             case 'c':
  78.                 if (val < 1)
  79.                     val = 1;
  80.                 dms->Clicks = dms->CLeft = val;
  81.                 break;
  82.             case 't':
  83.                 dms->AThresh = val;
  84.                 break;
  85.             case 's':
  86.                 dms->STo = val;
  87.                 break;
  88.             case 'm':
  89.                 dms->MTo = val;
  90.                 break;
  91.             case 'L':
  92.                 dms->LMBEnable = val;
  93.                 break;
  94.             case 'R':
  95.                 dms->RQual = ahtoi(ptr+2);
  96.                 break;
  97.             case 'A':
  98.                 dms->AAEnable = val;
  99.                 break;
  100.             case 'K':
  101.                 dms->Code = ahtoi(ptr+2);
  102.                 break;
  103.             case 'Q':
  104.                 dms->Qual = ahtoi(ptr+2);
  105.                 break;
  106.             case 'C':
  107.                 for (len = strlen(ptr+2) + 2, j = i + 1; j < ac; ++j)
  108.                     len += strlen(av[j]) + 1;
  109.                 strcpy(dms->Cmd, ptr + 2);
  110.                 for (j = i + 1; j < ac; ++j) {
  111.                     if (dms->Cmd[0])
  112.                         strcat(dms->Cmd, " ");
  113.                     strcat(dms->Cmd, av[j]);
  114.                 }
  115.                 break;
  116.             default:
  117.                 puts("DMOUSE QUIT  or");
  118.                 puts("DMOUSE -a# -t# -s# -m# -L0 -Rqqqq -A0 -Kcccc -Qqqqq -C cmd");
  119.                 printf("V1.%02d PUBLIC DOMAIN, Matthew Dillon, 14 May 1988\n\n", VERSION);
  120.                 puts("  -a#     Acceleration (default 3)");
  121.                 puts("  -t#     Accel. threshold (default 0)");
  122.                 puts("  -s#     Screen timeout (default 300)");
  123.                 puts("  -m#     Mouse timeout (default 5)");
  124.                 puts("  -c#     Set # of clicks for wintofront (default 1)");
  125.                 puts("  -L0/1   LMB disable/enable (default 1=enabled)");
  126.                 puts("  -Rqqqq  RMB qualifier wintoback (default 4000=LMB)");
  127.                 puts("  -A0/1   Auto-Activate Window disable/enable");
  128.                 puts("  -Kcccc  Command Key Code, default 45 = esc");
  129.                 puts("  -Qqqqq  Command Key Qualifier (must | with 8000)");
  130.                 puts("  -C cmd  cmd to run, must be last option");
  131.                 puts("Note: LMB(or -R qualifier)(hold)+RMB = WindowToBack");
  132.                 puts("\n");
  133.                 puts("Additionaly, Any option may be modified while DMOUSE is active");
  134.                 create = 0;
  135.                 break;
  136.             }
  137.         }
  138.     }
  139.     if (!exists && create) {
  140.         PROC *proc;
  141.         printf("Installing DMouse, ");
  142.         fflush(stdout);
  143.         dms->Port.mp_Flags = PA_IGNORE;
  144.         dms->Port.mp_Node.ln_Pri = 0;
  145.         dms->Port.mp_Node.ln_Type= NT_MSGPORT;
  146.         dms->Port.mp_Node.ln_Name= AllocMem(sizeof(PORTNAME), MEMF_PUBLIC);
  147.         strcpy(dms->Port.mp_Node.ln_Name, PORTNAME);
  148.         NewList(&dms->Port.mp_MsgList);
  149.         dms->Segment = LoadSeg("l:DMouse-Handler");
  150.         if (!dms->Segment)
  151.             dms->Segment = LoadSeg("DMouse-Handler");
  152.         if (!dms->Segment) {
  153.             puts("Unable to find L:DMouse-Handler");
  154.             FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  155.             create = 0;
  156.         } else {
  157.             AddPort(&dms->Port);
  158.             dms->ShakeTask = FindTask(NULL);
  159.             dms->ShakeSig = AllocSignal(-1);
  160.             proc = CreateProc(dms->Port.mp_Node.ln_Name, 1, dms->Segment, 4096);            Wait(1 << dms->ShakeSig);
  161.             FreeSignal(dms->ShakeSig);
  162.             exists = 1;
  163.             quit = dms->StartupError;
  164.             if (quit)
  165.                 puts("Handler error");
  166.             else
  167.                 printf("ok.  DMouse V1.%02d, by Matthew Dillon.  PUBLIC DOMAIN.\n", VERSION);
  168.         }
  169.     }
  170.     if (quit) {
  171.         if (exists) {
  172.             printf("Removing, ");
  173.             fflush(stdout);
  174.             dms->ShakeTask = FindTask(NULL);
  175.             dms->ShakeSig = AllocSignal(-1);
  176.             Signal(dms->HandTask, SBF_C);
  177.             Wait(1 << dms->ShakeSig);
  178.             FreeSignal(dms->ShakeSig);
  179.             RemPort(&dms->Port);
  180.             FreeMem(dms->Port.mp_Node.ln_Name, sizeof(PORTNAME));
  181.             UnLoadSeg(dms->Segment);
  182.             puts("ok");
  183.         }
  184.         exists = 0;
  185.         create = 0;
  186.     }
  187.     if (!exists) {
  188.         FreeMem(dms->NoSprData, 12);
  189.         FreeMem(dms, sizeof(DMS));
  190.     }
  191. }
  192. ahtoi(str)
  193. register char *str;
  194. {
  195.     register long val = 0;
  196.     register char c;
  197.     while (c = *str) {
  198.         val <<= 4;
  199.         if (c >= '0' && c <= '9')
  200.             val |= (c & 15);
  201.         else
  202.             val |= (c & 15) + 9;
  203.         ++str;
  204.     }
  205.     return(val);
  206. }
  207.