home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c070 / 4.ddi / TOOLS.4 / TCTSRC1.EXE / MNMSTYLE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-31  |  3.9 KB  |  177 lines

  1. /**
  2. *
  3. * Name        mnmstyle -- Install a standard menu mouse style.
  4. *
  5. * Synopsis    presult = mnmstyle(pmenu,style,button);
  6. *
  7. *        BMENU *presult    Pointer to menu for which mouse behavior
  8. *                was just installed, or NIL for failure.
  9. *        BMENU *pmenu    Pointer to menu in which to install mouse
  10. *                behavior.
  11. *        int style    One of several standard styles:
  12. *
  13. *                    MN_MOU_CLICK
  14. *                    MN_MOU_DRAG
  15. *                    MN_MOU_ALT_DRAG
  16. *
  17. *        unsigned button Button that is monitored (MO_LEFT,
  18. *                MO_RIGHT, or MO_MIDDLE -- no combinations
  19. *                allowed).
  20. *
  21. * Description    This function installs several mouse events to govern
  22. *        menu selections via a coherent style of mouse
  23. *        operations.
  24. *
  25. *        All of the button styles work without regard to the
  26. *        shift keys (Shift, Ctrl, and Alt).
  27. *
  28. * Returns    presult        Pointer to changed menu, or NIL if
  29. *                   failure.
  30. *        b_wnerr        Possible values:
  31. *                   (No change)    Success.
  32. *                   MN_BAD_MENU    pmenu is invalid.
  33. *                   MN_BAD_MOUSE    A member of pmenu's list
  34. *                        of mouse actions is bad.
  35. *                   WN_BAD_OPT    "button" or "style" is
  36. *                        unknown.
  37. *                   MN_MOU_CONFLICT    Cannot add an existing
  38. *                        mouse event.
  39. *                   WN_NO_MEMORY    Insufficient memory.
  40. *
  41. * Version    6.00 (C)Copyright Blaise Computing Inc.  1989
  42. *
  43. **/
  44.  
  45. #include <bmenu.h>
  46. #include <bmouse.h>
  47.  
  48. typedef struct
  49. {
  50.     unsigned long event,ignore;
  51.     int       action;
  52. } BMNMOUSE_EVENT;
  53.  
  54. static const BMNMOUSE_EVENT click[] =
  55. {
  56.     {
  57.     MO_CLICK | MN_ITEMS,
  58.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  59.     MN_SELECT
  60.     },
  61.     {
  62.     MO_DCLICK | MN_ITEMS,
  63.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  64.     MN_SELECT | MN_TRANSMIT
  65.     },
  66.     {
  67.     MO_CLICK | MN_OUT_MENU,
  68.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  69.     MN_ABORT
  70.     }
  71. };
  72.  
  73. static const BMNMOUSE_EVENT drag[] =
  74. {
  75.     {
  76.     MO_HOLD | MN_ITEMS,
  77.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  78.     MN_SELECT | MN_KBIGNORE
  79.     },
  80.     {
  81.     MO_HOLD | MN_OUT_MENU,
  82.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  83.     MN_HIDE_BAR | MN_KBIGNORE
  84.     },
  85.     {
  86.     MO_RELEASE | MN_ITEMS,
  87.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  88.     MN_SELECT | MN_TRANSMIT | MN_KBIGNORE
  89.     },
  90.     {
  91.     MO_RELEASE | MN_OFF_ITEMS,
  92.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  93.     MN_TRANSMIT | MN_KBIGNORE
  94.     },
  95.     {
  96.     MO_RELEASE | MN_OUT_MENU,
  97.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  98.     MN_ABORT | MN_KBIGNORE
  99.     }
  100. };
  101.  
  102. static const BMNMOUSE_EVENT alt_drag[] =
  103. {
  104.     {
  105.     MO_HOLD | MN_ITEMS,
  106.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  107.     MN_SELECT
  108.     },
  109.     {
  110.     MO_RELEASE | MN_ITEMS,
  111.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  112.     MN_SELECT | MN_TRANSMIT
  113.     },
  114.     {
  115.     MO_RELEASE | MN_OFF_ITEMS,
  116.     MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
  117.     MN_TRANSMIT
  118.     }
  119. };
  120.  
  121.  
  122. BMENU *mnmstyle(pmenu,style,button)
  123. BMENU    *pmenu;
  124. int     style;
  125. unsigned button;
  126. {
  127.     const BMNMOUSE_EVENT *ptable;
  128.     int           num_events,i;
  129.  
  130.     mnvalidm(pmenu)              /* Validate menu structure.     */
  131.  
  132.     switch (button)              /* Validate button specification*/
  133.     {
  134.     case MO_LEFT:
  135.     case MO_RIGHT:
  136.     case MO_MIDDLE:
  137.         break;
  138.  
  139.     default:
  140.         wnreterr(WN_BAD_OPT);
  141.     }
  142.  
  143.     /* Choose a list of mouse events to implement the specified style.*/
  144.  
  145.     switch (style)
  146.     {
  147.     case MN_MOU_CLICK:
  148.         ptable     = click;
  149.         num_events = sizeof(click) / sizeof(click[0]);
  150.         break;
  151.     case MN_MOU_DRAG:
  152.         ptable     = drag;
  153.         num_events = sizeof(drag) / sizeof(drag[0]);
  154.         break;
  155.     case MN_MOU_ALT_DRAG:
  156.         ptable     = alt_drag;
  157.         num_events = sizeof(alt_drag) / sizeof(alt_drag[0]);
  158.         break;
  159.  
  160.     default:
  161.         wnreterr(WN_BAD_OPT);
  162.     }
  163.  
  164.     /* Install all of the events from the specified list.          */
  165.  
  166.     for (i = 0; i < num_events; i++)
  167.     {
  168.     if (NIL == mnmouse(pmenu,ptable[i].event | button,
  169.                  ptable[i].ignore,
  170.                  ptable[i].action,
  171.                  MN_ADD))
  172.         return NIL;
  173.     }
  174.  
  175.     return pmenu;              /* Success.              */
  176. }
  177.