[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

Because not all commodities are interested in every input event that
makes it way down the input chain, Commodities Exchange has a method
for filtering them.  A filter CxObject compares the CxMessages it
receives to a pattern.  If a CxMessage matches the pattern, the filter
diverts the CxMessage down its personal list of CxObjects.

    CxObj *CxFilter(char *descriptionstring);

The C macro CxFilter() (defined in <libraries/commodities.h>) returns
a pointer to a filter CxObject.  The macro has only one argument, a
pointer to a string describing which input events to filter.  The
following regular expression outlines the format of a description
string (CX_POPKEY uses the same description string format):

    [class]  ( [-] (qual | syn) )*  [ [-] upstroke]  [highmap |ANSICode]
             the * means zero or more occurances of ( [-] ( qual | syn ) )

where:

class can be any one of the strings in the table below.  Each string
corresponds to a class of input event (shown below).  The classes are
defined in <devices/inputevent.h>.  Commodities Exchange will assume
the class is rawkey if the class is not explici tly stated.

    "rawkey"        IECLASS_RAWKEY
    "rawmouse"      IECLASS_RAWMOUSE
    "event"         IECLASS_EVENT
    "pointerpos"    IECLASS_POINTERPOS
    "timer"         IECLASS_TIMER
    "newprefs"      IECLASS_NEWPREFS
    "diskremoved"   IECLASS_DISKREMOVED
    "diskinserted"  IECLASS_DISKINSERTED


qual is one of the strings in the table below.  Each string
corresponds to an input event qualifier (followed by its ID from
<devices/inputevent.h>).  A dash preceding the qualifier string tells
the filter object not to care if that qualifier is present i n the
input event.  Notice that there can be more than one qual (or none at
all) in the input description string.

    "lshift"            IEQUALIFIER_LSHIFT
    "rshift"            IEQUALIFIER_RSHIFT
    "capslock"          IEQUALIFIER_CAPSLOCK
    "control"           IEQUALIFIER_CONTROL
    "lalt"              IEQUALIFIER_LALT
    "ralt"              IEQUALIFIER_RALT
    "lcommand"          IEQUALIFIER_LCOMMAND
    "rcommand"          IEQUALIFIER_RCOMMAND
    "numericpad"        IEQUALIFIER_NUMERICPAD
    "repeat"            IEQUALIFIER_REPEAT
    "midbutton"         IEQUALIFIER_MIDBUTTON
    "rbutton"           IEQUALIFIER_RBUTTON
    "leftbutton"        IEQUALIFIER_LEFTBUTTON
    "relativemouse"     IEQUALIFIER_RELATIVEMOUSE


syn is one of the strings in the table below.  These strings act as
synonyms for groups of qualifiers.  Each string below is followed by
its identifier from <libraries/commodities.h>.  A dash preceding the
synonym string tells the filter object not to car e if that qualifier
is present in the input event.  Notice that there can be more than one
syn (or none at all) in the input description string.

    "shift"     IXSYM_SHIFT    /* look for either shift key */
    "caps"      IXSYM_CAPS     /* look for either shift key or capslock */
    "alt"       IXSYM_ALT      /* look for either alt key */


upstroke is the literal string "upstroke".  If this string is absent,
the filter considers only downstrokes.  If is present alone, the
filter considers only upstrokes.  If preceded by a dash, the filter
considers both upstrokes and downstrokes.


highmap is one of the following strings:

    "space", "backspace", "tab", "enter", "return", "esc", "del", "up",
    "down", "right", "left", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
    "f8", "f9", "f10", "help".


ANSICode is a single character (for example `a`) that Commodities
Exchange looks up in the system default keymap.


The following are some example description strings:

    "rawkey lshift alt f2"    Function key f2 with the left shift and
                                either alt key pressed.
    "-shift -alt -control a"  The key that produces an 'a' with or
                                without any shift, alt, or control keys
                                pressed.
    "rawmouse rbutton"        A mouse move with the right mouse button
                                 down.
    "timer"                   A timer event.

As of commodities.library version 37.3, ParseIX(), the function used
to parse input description strings, does not parse certain classes
correctly.  Only the rawkey, diskremoved, and newprefs classes are
properly parsed.  For the moment, any commodity that needs to look
for the other classes must directly use Commodities Exchange's
internal format for input event descriptions, input expressions or
IX, discussed later in this article.

A filter has to be inserted into the Commodities network before it can
process any CxMessages.  AttachCxObj() adds a CxObject to the personal
list of another commodity.  The HotKey.c example uses this function to
attach its filter to a broker.

    void AttachCxObj(CxObj *HeadObj, CxObj *co);

This function uses the Exec function AddTail() to add the CxObject to
the end of HeadObj's personal list.  The position of a CxObject list
determines which CxObject gets CxMessages first.  Other functions
exist to add CxObjects at different points in the list (see the
commodities.doc Autodoc for details).