home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 152.lha / DMouse_v1.09 / dmouse.c < prev    next >
C/C++ Source or Header  |  1988-04-26  |  8KB  |  222 lines

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