home *** CD-ROM | disk | FTP | other *** search
- /**
- *
- * Name mnmstyle -- Install a standard menu mouse style.
- *
- * Synopsis presult = mnmstyle(pmenu,style,button);
- *
- * BMENU *presult Pointer to menu for which mouse behavior
- * was just installed, or NIL for failure.
- * BMENU *pmenu Pointer to menu in which to install mouse
- * behavior.
- * int style One of several standard styles:
- *
- * MN_MOU_CLICK
- * MN_MOU_DRAG
- * MN_MOU_ALT_DRAG
- *
- * unsigned button Button that is monitored (MO_LEFT,
- * MO_RIGHT, or MO_MIDDLE -- no combinations
- * allowed).
- *
- * Description This function installs several mouse events to govern
- * menu selections via a coherent style of mouse
- * operations.
- *
- * All of the button styles work without regard to the
- * shift keys (Shift, Ctrl, and Alt).
- *
- * Returns presult Pointer to changed menu, or NIL if
- * failure.
- * b_wnerr Possible values:
- * (No change) Success.
- * MN_BAD_MENU pmenu is invalid.
- * MN_BAD_MOUSE A member of pmenu's list
- * of mouse actions is bad.
- * WN_BAD_OPT "button" or "style" is
- * unknown.
- * MN_MOU_CONFLICT Cannot add an existing
- * mouse event.
- * WN_NO_MEMORY Insufficient memory.
- *
- * Version 6.00 (C)Copyright Blaise Computing Inc. 1989
- *
- **/
-
- #include <bmenu.h>
- #include <bmouse.h>
-
- typedef struct
- {
- unsigned long event,ignore;
- int action;
- } BMNMOUSE_EVENT;
-
- static const BMNMOUSE_EVENT click[] =
- {
- {
- MO_CLICK | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT
- },
- {
- MO_DCLICK | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT | MN_TRANSMIT
- },
- {
- MO_CLICK | MN_OUT_MENU,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_ABORT
- }
- };
-
- static const BMNMOUSE_EVENT drag[] =
- {
- {
- MO_HOLD | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT | MN_KBIGNORE
- },
- {
- MO_HOLD | MN_OUT_MENU,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_HIDE_BAR | MN_KBIGNORE
- },
- {
- MO_RELEASE | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT | MN_TRANSMIT | MN_KBIGNORE
- },
- {
- MO_RELEASE | MN_OFF_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_TRANSMIT | MN_KBIGNORE
- },
- {
- MO_RELEASE | MN_OUT_MENU,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_ABORT | MN_KBIGNORE
- }
- };
-
- static const BMNMOUSE_EVENT alt_drag[] =
- {
- {
- MO_HOLD | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT
- },
- {
- MO_RELEASE | MN_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_SELECT | MN_TRANSMIT
- },
- {
- MO_RELEASE | MN_OFF_ITEMS,
- MO_LSHIFT | MO_RSHIFT | MO_CSHIFT | MO_ASHIFT,
- MN_TRANSMIT
- }
- };
-
-
- BMENU *mnmstyle(pmenu,style,button)
- BMENU *pmenu;
- int style;
- unsigned button;
- {
- const BMNMOUSE_EVENT *ptable;
- int num_events,i;
-
- mnvalidm(pmenu) /* Validate menu structure. */
-
- switch (button) /* Validate button specification*/
- {
- case MO_LEFT:
- case MO_RIGHT:
- case MO_MIDDLE:
- break;
-
- default:
- wnreterr(WN_BAD_OPT);
- }
-
- /* Choose a list of mouse events to implement the specified style.*/
-
- switch (style)
- {
- case MN_MOU_CLICK:
- ptable = click;
- num_events = sizeof(click) / sizeof(click[0]);
- break;
- case MN_MOU_DRAG:
- ptable = drag;
- num_events = sizeof(drag) / sizeof(drag[0]);
- break;
- case MN_MOU_ALT_DRAG:
- ptable = alt_drag;
- num_events = sizeof(alt_drag) / sizeof(alt_drag[0]);
- break;
-
- default:
- wnreterr(WN_BAD_OPT);
- }
-
- /* Install all of the events from the specified list. */
-
- for (i = 0; i < num_events; i++)
- {
- if (NIL == mnmouse(pmenu,ptable[i].event | button,
- ptable[i].ignore,
- ptable[i].action,
- MN_ADD))
- return NIL;
- }
-
- return pmenu; /* Success. */
- }