home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / SDMOUTRK.C < prev    next >
Text File  |  1990-09-24  |  5KB  |  167 lines

  1. /*
  2.     sdmoutrk.c  10/27/89
  3.  
  4.     % sedmou_Track
  5.  
  6.     The "tracking" mouse handler.
  7.     Jumps to whatever field the mouse is pointing to.
  8.     When a mouse button is clicked over the field, the sed Mouse Code
  9.     is set to MOU_CLICK.
  10.  
  11.     If the field is in a different sed, and both seds have mouse handlers,
  12.     then the first sed is exited and control is passed to the new sed.
  13.  
  14.     C-scape 3.2
  15.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  16.     ALL RIGHTS RESERVED.
  17.  
  18.     Revision History:
  19.     -----------------
  20.      5/15/89 jmd    added debouncing
  21.      6/07/89 jmd    renamed mouse codes
  22.      6/15/89 jmd    added additional debouncing
  23.      8/12/89 jmd    removed call to sed_GetBob
  24.      8/16/89 jdc    fixed in bob REQUEST nextwin = (jumpwin == NULL) bug
  25.      8/29/89 jmd    added test for 'fake' events
  26.      9/10/89 jmd    added mev_ClearEvent to fake event test
  27.  
  28.      1/04/90 jmd    restructured
  29.      1/24/90 ted    Revamped for new nested MEV_START/STOPCUR msg scheme.
  30.      3/03/90 ted/pmcm Added support for sed_FindField -2 return in case of protected fields.
  31.      3/28/90 jmd    ansi-fied
  32.      4/13/90 jmd    added MOU_NOFIELD support
  33.      5/12/90 jmd    mouse handlers now return ints
  34.      8/17/90 ted    Changed references from sed_SetMouseCode to kb_Stuff.
  35.      9/24/90 ted    Cancelled the MOU_HERE if GotoField was not successful.
  36. */
  37.  
  38. #include <stdio.h>
  39. #include "cscape.h"
  40.  
  41. #include "scancode.h"        /* for MOU codes */
  42.  
  43. int sedmou_Track(sed_type sed, int msg, mev_struct *mev)
  44. /*
  45.     Messages a mouse handler receives when its window is current
  46.     MEV_REQUEST            someone else wants to be it
  47.     MEV_STARTEVENT        current, mouse entered
  48.     MEV_EVENT            current, event in win
  49.     MEV_ENDEVENT        current, mouse left
  50.     Messages a mouse handler receives when its window is not current
  51.     MEV_STARTOFFER        not current, mouse entered
  52.     MEV_OFFER            not current, event in win
  53.     MEV_ENDOFFER        not current, mouse left
  54. */
  55. {
  56.     int      fld;
  57.  
  58.     switch (msg) {
  59.     case MEV_STARTOFFER:           /* we're not the current window */
  60.         win_SetDebounced(sed, mev_IsButtonDown(mev));
  61.  
  62.         if (mev_IsFake()) {        /* ignore 'fake' events */
  63.             mev_ClearEvent(mev);
  64.             break;
  65.         }
  66.         /* no break, fall through */
  67.  
  68.     case MEV_OFFER:                /* we're not the current window */
  69.         /* Accept the offer */
  70.         if ((fld = sedmev_acceptoffer(sed, mev, msg == MEV_STARTOFFER)) == -2) {
  71.             break;
  72.         }
  73.         if (!mev_IsButtonDown(mev)) {
  74.             win_SetDebounced(sed, FALSE);
  75.         }
  76.         else {
  77.             if (!win_GetDebounced(sed)) {
  78.                 win_SetDebounced(sed, TRUE);
  79.  
  80.                 /* Set the mouse code to tell us that the mouse was clicked
  81.                     when our field function is eventually called
  82.                 */
  83.                 if (fld != -1 && !mev_IsFake()) { /* ignore 'fake' clicks */
  84.                     kb_Stuff(MOU_CLICK);
  85.                 }
  86.                 else if (fld == -1 && !mev_IsFake()) {
  87.                     /* clicked, but not over a field */
  88.                     kb_Stuff(MOU_NOFIELD);
  89.                 }
  90.             }
  91.         }
  92.         /* We don't care what code we return because we accepted the
  93.             offer, which means the REQUEST message gets to decide what
  94.             to return from this particular kb_Read call */
  95.         break;
  96.  
  97.     case MEV_ENDOFFER:                   /* we're not the current window */
  98.         break;
  99.  
  100.     case MEV_REQUEST:    /* we're the current window;
  101.                             another window was selected by the mouse. */
  102.         winmev_grantrequest(sed, mev);
  103.  
  104.         /* Return MOU_THERE as a scancode to kb_Read to tell the sed
  105.             about the request so it can exit */
  106.         return(MOU_THERE);
  107.  
  108.     case MEV_STARTEVENT:
  109.         win_SetDebounced(sed, mev_IsButtonDown(mev));
  110.         if (mev_IsFake() && !kb_WasMouse()) {
  111.             break;        /* ignore 'fake' events */
  112.         }
  113.  
  114.         /* no break, fall through */
  115.  
  116.     case MEV_EVENT:                    /* we're the current window */
  117.     {
  118.         ocbox      mbox;
  119.         boolean     ret = FALSE;
  120.  
  121.         mbox.toprow = mbox.botrow = mev_GetRow(mev) + sed_GetYoffset(sed);
  122.         mbox.leftcol = mbox.rightcol = mev_GetCol(mev) + sed_GetXoffset(sed);
  123.  
  124.         /* sed_FindField finds the best field in the given box */ 
  125.         fld = sed_FindField(sed, &mbox, OAK_DOWN);
  126.  
  127.         if (!mev_IsButtonDown(mev)) {
  128.             win_SetDebounced(sed, FALSE);
  129.         }
  130.         else {
  131.             if (!win_GetDebounced(sed)) {
  132.                 win_SetDebounced(sed, TRUE);
  133.                 ret = TRUE;
  134.  
  135.                 /* Set our mousecode to tell us that the mouse was clicked
  136.                    when our field function is eventually called. */
  137.                 if (fld >= 0) {
  138.                     kb_Stuff(MOU_CLICK);
  139.                 }
  140.                 else {
  141.                     /* clicked, but not over a field */
  142.                     kb_Stuff(MOU_NOFIELD);
  143.                 }
  144.             }
  145.         }
  146.  
  147.         /* go to the new field */
  148.         if (fld >= 0 && fld != sed_GetFieldNo(sed)) {
  149.             if (sed_GotoField(sed, fld) == SED_MOVED) {
  150.                 ret = TRUE;
  151.             }
  152.         }
  153.         if (ret) {
  154.             /* Return MOU_HERE as a scancode to kb_Read. We return it even if
  155.                 the button hasn't been pressed because we have changed fields
  156.                 and we want to leave the current field immediately.
  157.             */
  158.             return(MOU_HERE);
  159.         }
  160.     }
  161.     case MEV_ENDEVENT:                   /* we're the current window */
  162.         break;
  163.     }
  164.     return(MOU_IGNORE);        /* Ignore this mouse event */
  165. }
  166.  
  167.