home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / MOUSEPTR.CPP < prev    next >
C/C++ Source or Header  |  1993-05-02  |  4KB  |  148 lines

  1. /* 2D pointer device (built-in) */
  2.  
  3. /* Written by Dave Stampe, Aug. 1992 */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <dos.h>
  14. #include <bios.h>
  15.  
  16. #include "rend386.hpp"
  17. #include "pointer.hpp"
  18. #include "standard.hpp"
  19.  
  20. #define sub_exit        atexit
  21.  
  22. /************** INTERNAL MOUSE SETUP ***********/
  23.  
  24. PDRIVER *mouse_device;
  25.  
  26. void mouseptr_quit()
  27. {
  28.     pointer_quit(mouse_device);
  29. }
  30.  
  31. PDRIVER *mouseptr_init(char *mname)
  32. {
  33.     PDRIVER *p;
  34.     POINTER x;
  35.  
  36.     p = pointer_init(P_IS2DP, mname); /* setup mouse device */
  37.     if (p==NULL) return NULL;
  38.  
  39.     init_pointer(&x); /* so that defaults are OK */
  40.     pointer_tscale(p, 1000, 1000, 1000); /* scale mouse */
  41.     set_mouse_limits(p, screeninfo->xmax, screeninfo->ymax);
  42.     pointer_read(p, &x);
  43.     pointer_read(p, &x); /* save current position */
  44.     mouse_read(p, NULL, NULL, NULL);
  45.  
  46.     mouse_device = p;
  47.     sub_exit(mouseptr_quit);
  48.  
  49.     return p;
  50. }
  51.  
  52.  
  53.  
  54. /***************** MOUSE POINTER DRIVER *************/
  55.  
  56. pconfig mouse_pconfig = {
  57.     65536L, 65536L, 65536L, /* position res: mm/tick in <16.16>  */
  58.     320, 200, 200, -320, -200, -200, /* xyz ranges:                */
  59.     0, 0, 0, 0, 0, 0, 0, 0, 0, /* no rotation                       */
  60.     640, 480, /* mouse emulation limits (writable) */
  61.     P_HASB1 | P_HASB2 | P_HASX | P_HASY | P_HASZ | P_HASSCR, /* databits  */
  62.     P_CENTER | P_SCREEN, 0, 0, /* modes, nullkey, flexnum           */
  63.     1, 10, 60, /* delay, idelay, reads/sec          */
  64.     P_IS2DP | P_IS2D, /* uses  */
  65.     "Default Mouse Driver"
  66. };
  67.  
  68.  
  69. static mtype; /* if == P_IS2D, don't map Z with buttons */
  70. static x_acc, y_acc, z_acc, xs_acc, ys_acc;
  71.  
  72. #pragma argsused
  73. pconfig *mouse_driver(int op, POINTER *p, int mode, int dummy)
  74. {
  75.     union REGS r;
  76.     int type = FP_OFF(p); /* way to get integer arg. */
  77.  
  78.     switch(op)
  79.     {
  80.     case DRIVER_CMD:
  81.         if (!(type & P_CENTER)) break;
  82.         if (type & P_SCREEN)
  83.         {
  84.             xs_acc = mouse_pconfig.maxsx >> 1;
  85.             ys_acc = mouse_pconfig.maxsy >> 1;
  86.         }
  87.         if (type & P_POINTER)
  88.         {
  89.             x_acc = y_acc = z_acc = 0;
  90.         }
  91.         break;
  92.     case DRIVER_INIT:
  93.     case DRIVER_RESET:
  94.         r.x.ax = 0;
  95.         int86(0x33, &r, &r);
  96.         if (r.x.ax == 0) return NULL;
  97.         x_acc = y_acc = z_acc = 0;
  98.         xs_acc = mouse_pconfig.maxsx>>1;
  99.         ys_acc = mouse_pconfig.maxsy>>1;
  100.         break;
  101.  
  102.     case DRIVER_READ:/* pointer (2DP) read */
  103.         if (mode == P_POINTER)
  104.         {
  105.             r.x.ax = 3; /* read button status */
  106.             int86(0x33, &r, &r);
  107.             p->buttons = r.x.bx;
  108.             r.x.ax = 11; /* read motion counters */
  109.             int86(0x33, &r, &r);
  110.             x_acc += ((int) r.x.cx);
  111.             if (p->buttons & 0x02)
  112.             {
  113.                 z_acc -= ((int) r.x.dx);
  114.                 p->buttons &= 0x01;
  115.             }
  116.             else
  117.                 y_acc -= ((int) r.x.dx);
  118.             p->x = x_acc;
  119.             p->y = y_acc;
  120.             p->z = z_acc;
  121.         }
  122.         else if (mode == P_SCREEN) /* mouse read (640x480) */
  123.         {
  124.             r.x.ax = 3; /* read button status */
  125.             int86(0x33, &r, &r);
  126.             p->buttons = r.x.bx;
  127.             r.x.ax = 11; /* read motion counters */
  128.             int86(0x33, &r, &r);
  129.             xs_acc += ((int) r.x.cx);
  130.             ys_acc += ((int) r.x.dx);
  131.             if (xs_acc < 0) xs_acc = 0;
  132.             if (ys_acc < 0) ys_acc = 0;
  133.             if (xs_acc > mouse_pconfig.maxsx) xs_acc = mouse_pconfig.maxsx;
  134.             if (ys_acc > mouse_pconfig.maxsy) ys_acc = mouse_pconfig.maxsy;
  135.             p->x = xs_acc;
  136.             p->y = ys_acc;
  137.         }
  138.         break;
  139.  
  140.     case DRIVER_CHECK:
  141.         break;
  142.     case DRIVER_QUIT:
  143.         break;
  144.     }
  145.     return &mouse_pconfig;
  146. }
  147.  
  148.