WinSet
... function (such as
WinSetUnderlineMode
). Each WinSet
... function returns the old value. It's your responsibility to save the old value returned by the function and to restore the variable's value when you are finished by calling the function again. Using such routines can be inconvenient because it means using application stack space to track system state. Further, if a caller forgets to restore the value, the entire look and feel of the device may be altered.
WinFill
... routines, and foreground and background colors. It also contains text-related drawing information: the font ID, the font pointer, the underline mode, and the text color. (Palm OS does not currently support other common pen-like concepts such as line width, pen shape, or corner join.) Only one draw state exists in the system.
WinPushDrawState
to push a copy of the current draw state on the top of the stack. Then use the existing WinSet...
functions to make your changes. When you've finished your drawing and want to restore the draw state, call
WinPopDrawState
.
WinSetDrawWindow
to set the draw window before calling these functions.
frmOpenEvent
is triggered and the form's ID is stored. A
winExitEvent
is triggered whenever a form is closed, and a
winEnterEvent
is triggered whenever a form is drawn.
PrgStartDialog
. Then, as your process progresses, you call
PrgUpdateDialog
to update the dialog with new information for the user. In your event loop you call
PrgHandleEvent
to handle the progress dialog update events queued by PrgUpdateDialog
. The PrgHandleEvent
function makes a callback to a textCallback
function that you supply to get the latest progress information.
EvtGetEvent
and do work when you get a
nilEvent
. Each time you get a nilEvent
, do a chunk of work, but be sure to continue to call EvtGetEvent
frequently (like every half second), so that pen taps and other events get noticed quickly enough.
PrgUpdateDialog
. To get the current progress information to display in the progress dialog, PrgHandleEvent
makes a callback to a function, textCallback, that you supplied in your call to
PrgStartDialog
.
textCallback
function one parameter, a pointer to a PrgCallbackData
structure. To learn what type of information is passed in this structure, see the chapter "Progress Manager" in the Palm OS SDK Reference.
textCallback
function should return a Boolean. Return true
if the progress dialog should be updated using the values you specified in the PrgCallbackData
structure. If you specify false
, the dialog is still updated, but with default status messages. (Returning false
is not recommended.)
textCallback
function, you should set the value of the textP
buffer to the string you want to display in the progress dialog when it is updated. You can use the value in the stage
field to look up a message in a string resource. You also might want to append the text in the message
field to your base string. Typically, the message
field would contain more dynamic information that depends on a user selection, such as a phone number, device name, or network identifier, etc.
PrgUpdateDialog
function might have been called with a stage
of 1 and a messageP
parameter value of a phone number string, "555-1212". Based on the stage, you might find the string "Dialing" in a string resource, and append the phone number, to form the final text "Dialing 555-1212" that you place in the text buffer textP
.
messageP
parameter to PrgUpdateDialog
.
NOTE:  ThetextCallback
function is called only if the parameters passed toPrgUpdateDialog
have changed from the last time it was called. IfPrgUpdateDialog
is called twice with exactly the same parameters, thetextCallback
function is called only once.
CtlHandleEvent
. There are several types of control objects, which are all described in this section.
NOTE:  Palm OS 3.5 and higher support graphical controls for all control types other than check box. Graphical controls behave the same as their non-graphical counterparts, but they display a bitmap instead of a text label. On releases prior to Palm OS 3.5, you can create a graphical control by setting the text label to the empty string and placing the control on top of a bitmap.
CtlHandleEvent
's response to the events.
User Action | System Response | CtlHandleEvent Response |
---|---|---|
Pen goes down on a button. |
penDownEvent with the x and y coordinates stored in EventType.
|
Adds the ctlEnterEvent to the event queue.
|
ctlEnterEvent with button's ID number.
| Inverts the button's display. | |
Pen is lifted from button. |
penUpEvent with the x and y coordinates stored in EventType.
| Adds the ctlSelectEvent to the event queue. |
Pen is lifted outside button. |
penUpEvent with the x and y coordinates stored in EventType.
|
Adds the ctlExitEvent to the event queue.
|
CtlHandleEvent
's response to the events. Because popup triggers are used to display list objects, also see the section "Lists" in this chapter.
CtlHandleEvent
's response to the events.
CtlHandleEvent
's response to the events.
CtlHandleEvent
's response to the events.
CtlHandleEvent
's response to the events.
CtlHandleEvent
responds to the events.
CtlHandleEvent
's response to the events.
NOTE:  Field objects can handle line feeds--\0A--but not carriage returns--\0D. PalmRez translates any carriage returns it finds in any Palm OS resources into line feeds, but doesn't touch static data.
F
ldHandleEvent
deals with the different events
MenuHandleEvent
. Table 5.12 describes how user actions get translated into events and what MenuHandleEvent
does in response.
menuOpenEvent
is sent when the menu resource is loaded. (Note that this event is new in version 3.5. Previous releases do not use it.) In response to this event, you can call
MenuAddItem
to add a menu item to one of the pull-down menus,
MenuHideItem
to hide a menu item, or
MenuShowItem
to display a menu item.
menuOpenEvent
several times during an application session. The menu resource is loaded each time the menu is made the active menu. A menu becomes active the first time the user either requests that the menu be displayed or enters the command keystroke on the current form. That menu remains active as long as the form with which it is associated is active. A menu loses its active status under these conditions:
FrmSetMenu
is called to change the active menu on the form. menuOpenEvent
is queued.
menuEvent
with that menu item is generated. To support this behavior, you simply specify a shortcut character when you create a menu item resource. The default behavior of Palm OS handles this shortcut appropriately.
menuEvent
to be added to the event queue.
menuCmdBarOpenEvent
and use
MenuCmdBarAddButton
to add the button. Listing 5.1 shows some code from the Memo application that adds to the command toolbar a button that displays the security dialog and then prevents the field manager from adding other buttons.
else if (event->eType == menuCmdBarOpenEvent) {
    MenuCmdBarAddButton(menuCmdBarOnLeft,
    BarSecureBitmap, menuCmdBarResultMenuItem,
    ListOptionsSecurityCmd, 0);
    // Tell the field package to not add buttons
    // automatically; we've done it all ourselves.
    event->data.menuCmdBarOpen.preventFieldButtons =
    true;
    // Don't set handled to true; this event must
    // fall through to the system.
}
BarDeleteBitmap
should always be the rightmost of these bitmaps, and BarInfoBitmap
should always be the leftmost.
preventFieldButtons
flag of the menuCmdBarOpenEvent
to true
as is shown in Listing 5.1.
LstHandleEvent
deals with the different events.
User Action | System Response | LstHandleEvent Response |
---|---|---|
Pen goes down on popup trigger button. |
winEnterEvent identifying list's window.
|
Adds the lstEnterEvent to the event queue.
|
lstEnterEvent with list's ID number and selected item.
| Tracks the pen. | |
Pen goes down on a list box. |
penDownEvent with the x and y coordinates stored in EventType.
| Highlights the selection underneath the pen. |
Pen is lifted from the list box. |
penUpEvent with the x and y coordinates stored in EventType.
|
Adds the lstSelectEvent to the event queue.
|
lstSelectEvent with list's ID number and number of selected item.
|
Stores the new selection. If the list is associated with a popup trigger, adds a popSelectEvent to the event queue. with the popup trigger ID, the popup list ID, and the item number selected in EventType. Control passes to FrmHandleEvent .
| |
Pen is lifted outside the list box. |
penUpEvent with the x and y coordinates stored in EventType.
|
Adds winExitEvent to event queue.
|
CategorySelect
; it shows the popup list of categories and handles editing the categories. Few applications will call CategoryEdit
directly.
CategoryInitialize
when the database is created to initialize the AppInfoType
structure. You can also use this to set any local category names.
CategoryCreateList
to create a list of categories. With this function, you can also select whether you want to show the "All" list or hide the "Edit Categories" string. You can use this last option to keep users from changing some category names.
ListType
is set to the list.
CategoryEdit
,
CategoryFind
,
CategoryGetName
,
CategoryGetNext
, and
CategorySelect
.
CategorySetName
writes the renamed categories to the database,
CategorySetTriggerLabel
marks a category if it is to be truncated, and
CategoryTruncateName
shortens the name so it will fit the space available.
CategoryFreeList
must be called to deallocate and unlock the memory allocated for the list.
'Tbmp'
resource, and the Form Bitmap object that contains it is a 'tFBM'
resource.'tbmf'
resource, and the PalmRez post linker converts it and its associated PICTs to a 'Tbmp'
resource. (Constructor creates PICT format images on both the Macintosh and Microsoft Windows operating systems.)'Tbmp'
resource defines either a single bitmap or a bitmap family. A bitmap family is a group of bitmaps, each containing the same drawing but at a different pixel depth (see Figure 5.14). When requested to draw a bitmap family, the operating system chooses the version of the bitmap with the pixel depth equal to the display. If such a bitmap doesn't exist, the bitmap with the pixel depth closest to but less than the display depth is chosen. If there are no bitmaps less than the display depth, then the bitmap with the pixel depth closest to the display depth is used.
BitmapType
structure. This structure is simply a header. It is followed by the bitmap data in the same memory block. Bitmaps in Palm OS 3.0 and higher are also allowed to have their own color tables. When a bitmap has its own color table, it is stored between the bitmap header and the bitmap data.
WinDrawBitmap
or
WinPaintBitmap
. (The form manager code uses WinDrawBitmap
to draw Form Bitmap objects.) If passed a bitmap family, these two functions draw the bitmap that has the depth equal to the current draw window depth or the closest depth that is less than the current draw window depth if available, or the closest depth greater than the current draw depth if not.
MemHandle resH =
    DmGetResource (bitmapRsc, rscID);
BitmapType *bitmap = MemHandleLock (resH);
WinPaintBitmap(bitmap, 0, 0);
BmpCreate
, create an offscreen window wrapper around the bitmap using
WinCreateBitmapWindow
, set the active window to the new bitmap window, and use the window drawing functions to draw to the bitmap:
BitmapType *bmpP;
WinHandle win;
Err error;
bmpP = BmpCreate(10, 10, 8, NULL, &error);
if (bmpP) {
    win = WinCreateBitmapWindow(bmpP, &error);
    if (win) {
    WinSetDrawWindow(win);
    WinDrawLines(win, ...);
    /* etc */
    }
}
BmpCreate
always creates a version 2 bitmap, even if you don't specify a transparency or compression.
WinPalette
again to set the system palette back to its previous state.
1. Create a scroll bar (tSCL) UI resource.
Provide the ID and the bounds for the scroll bar rectangle. The height has to match the object you want to attach it to. The width should be 7.
2. Provide a minimum and maximum value as well as a page size.
3. Make the scroll bar part of the form.
When you compile your application, the system creates the appropriate scroll bar UI object. (See the chapter "Scroll Bars" in the Palm OS SDK Reference for more information on the scroll bar UI object.)
hasScrollbar
attribute of the field, table, or list. (For tables, you must set this programmatically with the function
TblHasScrollBar
.)
hasScrollbar
is set for a field, you'll receive a
fldChangedEvent
whenever the field's size changes. Your application should handle these events by computing new values for the scroll bar's minimum, maximum, and current position and then use
SclSetScrollBar
to update it.
hasScrollbar
is set for a table, you should keep track of when the table's size changes. Whenever it does, you should compute new values for the scroll bar's minimum, maximum, and current position and then use SclSetScrollBar
to update it.
SclSetScrollBar
when the form is initialized to set the current position of the scroll bar.
penDownEvent
occurs within the bounds of the scroll bar.
sclRepeatEvent
s.
sclRepeatEvent
. In response to this event, call the scrolling function associated with the UI object (
FldScrollField
,
LstScrollList
, or your own scrolling function in the case of tables).
sclRepeatEvent
and wait only for the sclExitEvent
.
FormGadgetHandler
) that provides drawing and event handling code for the gadget. Use
FrmSetGadgetHandler
to set the callback function. (A pointer to the gadget is passed to the callback, so you can use the same function for multiple gadgets.) When the form receives certain requests to draw itself, delete itself, or to hide or show a gadget object, the form manager calls the gadget handler function you provide. When the form receives events intended for the gadget, it passes those to the gadget handler function as well.
frmOpenEvent
or frmUpdateEvent
, and if there is a penDownEvent
within the bounds of the gadget, it calls a function to handle that event as well. Listing 5.3 shows how a gadget handler function might be written for Rock Music.
Boolean MainViewHandleEvent(EventPtr event)
{
    Boolean handled = false;
    Word objIndex;
    FormPtr frm;
    RectangleType r;
    switch (event->eType) {
case frmOpenEvent:
    MainViewInit();
    frm = FrmGetActiveForm ();
    FrmDrawForm (frm);
    DrawGadget();
    handled = true;
    break;
   
    case frmUpdateEvent:
    frm = FrmGetActiveForm ();
    FrmDrawForm (frm);
    DrawGadget();
    handled = true;
    break;
   
    case penDownEvent:
    frm = FrmGetActiveForm ();
    objIndex = FrmGetObjectIndex (frm,
    RockMusicMainInputGadget);
    FrmGetObjectBounds (frm, objIndex, &r);
    if (RctPtInRectangle (event->screenX,
    event->screenY, &r)) {
    GadgetTapped ();
    handled=true;
    }
    break;
    ...
    }
Boolean GadgetHandler (struct FormGadgetType *gadgetP, UInt16 cmd, void *paramP)
{
    Boolean handled = false;
    switch (cmd) {
case frmGadgetDrawCmd:
    //Sent to active gadgets any time form is
    //drawn or redrawn.
    DrawGadget();
    gadgetP->attr.visible = true;
    handled = true;
    break;
   
    case formGadgetHandleEventCmd:
    //Sent when form receives a gadget event.
    //paramP points to EventType structure.
    if (paramP->eType == fldGadgetEnterEvent) {
    // penDown in gadget's bounds.
    GadgetTapped ();
    handled = true;
    }
    if (paramP->eType == frmGadgetMiscEvent) {
    //This event is sent by your application
    //when it needs to send info to the gadget
    }
    break;
    case formGadgetDeleteCmd:
    //Perform any cleanup prior to deletion.
    break;
    case formGadgetEraseCmd:
    //FrmHideObject takes care of this if you
    //return false.
    handled = false;
    break;
    }
    return handled;
}
FrmShowObject
and
FrmHideObject
to make the object appear and disappear as needed.
FrmValidatePtr
function to ensure that your form pointer is valid and the form it points to is valid. This routine can catch lots of bugs for you--use it!
CtlNewControl
CtlValidatePointer
FldNewField
FrmNewBitmap
FrmNewForm
FrmNewGadget
FrmNewLabel
FrmRemoveObject
FrmValidatePtr
LstNewList
WinValidateHandle
FrmNewGsi
(available only if 3.5 New Feature Set is present)'tclt'
resource (symbolically named colorTableRsc
). The color table is a count of the number of entries, followed by an array of
RGBColorType
colors. An RGBColorType
struct holds 8 bits each of red, green, and blue plus an "extra" byte to hold an index value.
WinPalette
function. If the current draw window is onscreen, the palette for the display hardware is also changed. For more information see the WinPalette
function description in the Palm OS SDK Reference.
WinRGBToIndex
and
WinIndexToRGB
. When calling WinRGBToIndex
, an exact match may not be available. That is, you may be calling WinRGBToIndex
with an RGB value that is not in the palette and thus does not have an index. If there is no exact RGB match, the best-fit algorithm currently in place is used to determine the index value. For WinIndexToRGB
, the RGB value returned is always the exact match. (An error is displayed if the index is out of range.)
sysResIDPrefUIColorTableBase
plus the current screen depth. The use of a preference allows for the possibility that individual users could customize the look using a third party "personality" or "themes" editor. If the preference is not defined, it loads the default color table from the system color table resource using systemDefaultUIColorsBase
plus the current screen depth.
UIColorSetTableEntry
. If you need to retrieve a color used, it can do so with
UIColorGetTableEntryIndex
or
UIColorGetTableEntryRGB
.
UIColorSetTableEntry
again.
NOTE:  If you application is going to be localized, you must take special care when working with text. See the chapter "Localized Applications" for more information.
strcpy
, strcat
, etc.
malloc
) and doesn't support the subroutine calls used by most standard C functions.
NOTE:  If your application is going to be localized, be careful when using string functions. Where possible, use the functions described in the chapter "Localized Applications" instead.
vsprintf
function, the
StrVPrintF
function is designed to be called by your own function that takes a variable number of arguments and passes them to StrVPrintF
for formatting. This section gives a brief overview of how to use StrVPrintF
. For more details, refer to vsprintf
and the use of the stdarg.h
macros in a standard C reference book.
StrVPrintF
, you must use the special macros from stdarg.h
to access the optional arguments (those specified after the fixed arguments) passed to your function. This is necessary, because when you declare your function that takes an optional number of arguments, you declare it using an ellipsis at the end of the argument list:
MyPrintF(CharPtr s, CharPtr formatStr, ...);
formatStr
argument. Since these optional arguments don't have names, the stdarg.h
macros must be used to access them before they can be passed to StrVPrintF
.
args
variable as type va_list
:
va_list args;
args
variable to point to the optional argument list by using va_start
:
va_start(args, formatStr);
va_start
macro is the last required argument to your function (last before the optional arguments begin). Now you can pass the args
variable as the last parameter to the StrVPrintF
function:
StrVPrintF(text, formatStr, args);
va_end
before returning from your function:
va_end(args);
StrPrintF
and StrVPrintF
functions implement only a subset of the conversion specifications allowed by the ANSI C function vsprintf
. See the
StrVPrintF
function reference for details.
largeBoldFont
), two new font manipulation routines (FontSelect and FntDefineFont), and support for the use of custom fonts.
largeBoldFont
selector to the FntSetFont function. Under Palm OS 3.0 and later, if you try to draw with a font that isn't installed, the system uses the standard font by default. Previous versions of Palm OS can crash if told to use a nonexistent font.
FontSelect
function displays a dialog box in which the user can specify the use of one of the three primary fonts stdFont
, boldFont
, or largeBoldFont
. For more information, see the description of FontSelect
in the Palm OS SDK Reference.
FntDefineFont
in the Palm OS SDK Reference.
devsupp@palm.com
for updated information.
GrfProcessStroke
automatically handles Graffiti ShortCuts and calls the user interface as appropriate to display shift indicators in the current window.
GrfProcessStroke
when it receives a penUpEvent from the event manager if it wants to recognize strokes entered into its application area (in addition to the Graffiti area).
SysGraffitiReferenceDialog
or by putting a virtual character--graffitiReferenceChr
from Chars.h
--on the queue.
KeyCurrentState
function call.
KeyRates
call changes the auto-repeat rate of the hardware buttons. This might be useful to game applications that want to use the hardware buttons for control. The current key repeat rates are stored in the key manager globals and should be restored before the application exits.
APPL
) appear in the Application Launcher automatically.
NOTE:  Versions of Palm OS prior to 3.0 implemented the Launcher as a popup. TheSysAppLauncherDialog
function, which provides the API to the old popup launcher, is still present in Palm OS 3.0 for compatibility purposes, but it has not been updated and, in most cases, should not be used.
dmHdrAttrCopyPrevention
bit in your database header. (For a runtime code example, see the "Dr McCoy" sample application. Note that you can also use compile-time code to suppress beaming.)
tAIB
resource having 1001
as the value of its ID.
tver
resource, ID 1000
. This short string (usually 3 to 6 characters) is displayed in the "Info" dialog.
keyDownEvent
that contains a launchChr
, as shown in Listing 5.4.
WARNING!Do not use the SysUIAppSwitch or SysAppLaunch functions to open the Application Launcher application.
EventType newEvent;
newEvent.eType = keyDownEvent;
newEvent.data.keyDown.chr = launchChr;
newEvent.data.keyDown.modifiers = commandKeyMask;
EvtAddEventToQueue (&newEvent);
Progress Manager Functions | |
---|---|
PrgHandleEvent PrgStopDialog PrgUserCancel |
PrgStartDialog PrgUpdateDialog |
Control Functions | |
---|---|
Displaying a Control | |
CtlShowControl CtlSetUsable CtlNewGraphicControl |
CtlDrawControl CtlNewControl CtlNewSliderControl |
Control's Value | |
CtlGetValue CtlGetSliderValues | CtlSetValue |
Label | |
CtlSetLabel | CtlGetLabel |
Enabling/Disabling | |
CtlSetEnabled CtlHideControl |
CtlEnabled CtlEraseControl |
Event Handling | |
CtlHandleEvent | |
Setting up controls | |
CtlGetSliderValues CtlSetGraphics | CtlSetSliderValues |
Debugging | |
CtlHitControl | CtlValidatePointer |
Field Functions | |
---|---|
Obtaining User Input | |
FldGetTextPtr FldSetDirty FldGetSelection |
FldGetTextHandle FldDirty |
Updating the Display | |
FldDrawField FldSetSelection FldRecalculateField |
FldMakeFullyVisible FldSetBounds |
Displaying Text | |
FldSetTextPtr | |
Editing Text | |
FldSetText FldInsert FldEraseField |
FldSetTextHandle FldDelete |
Cut/Copy/Paste | |
FldCopy FldPaste |
FldCut FldUndo |
Scrolling | |
FldScrollField FldSetScrollPosition FldGetVisibleLines FldGetNumberOfBlankLines |
FldScrollable FldGetScrollPosition FldGetScrollValues |
Field Attributes | |
FldGetAttributes FldGetFont FldGetMaxChars |
FldSetAttributes FldSetFont FldSetMaxChars FldGetBounds |
Text Attributes | |
FldCalcFieldHeight FldGetTextAllocatedSize FldSetTextAllocatedSize |
FldGetTextHeight FldGetTextLength FldWordWrap |
Working With the Insertion Point | |
FldGetInsPtPosition FldSetInsertionPoint | FldSetInsPtPosition |
Releasing Memory | |
FldCompactText | FldFreeMemory |
Event Handling | |
FldHandleEvent FldSendHeightChangeNotification | FldSendChangeNotification |
Dynamic UI | |
FldNewField |
Private Record Functions | |
---|---|
SecSelectViewStatus | SecVerifyPW |
List Functions | |
---|---|
Displaying a List | |
LstDrawList LstPopupList |
LstSetDrawFunction LstNewList |
Updating the Display | |
LstMakeItemVisible LstSetListChoices LstSetSelection LstScrollList |
LstSetHeight LstSetTopItem LstSetPosition |
List Data and Attributes | |
LstGetNumberOfItems LstGetSelection |
LstGetVisibleItems LstGetSelectionText |
Removing a List From the Display | |
LstEraseList | |
Event Handling | |
LstHandleEvent |
Bitmap Functions | |
---|---|
BmpBitsSize BmpColortableSize BmpCompress BmpCreate BmpDelete |
BmpGetBits BmpGetColortable BmpSize ColorTableEntries |
Scroll Bar Functions | |
---|---|
SclSetScrollBar SclHandleEvent |
SclGetScrollBar SclDrawScrollBar |
UI Color List Functions | |
---|---|
UIColorGetTableEntryIndex UIColorSetTableEntry | UIColorGetTableEntryRGB |
UI Controls | |
---|---|
UIBrightnessAdjust UIPickColor | UIContrastAdjust |
Insertion Point Functions | |
---|---|
InsPtEnable InsPtGetHeight InsPtGetLocation |
InsPtEnabled InsPtSetHeight InsPtSetLocation |
String Manager Functions | |
---|---|
Length of a String | |
StrLen | |
Comparing Strings | |
StrCompare StrCaselessCompare |
StrNCompare StrNCaselessCompare |
Changing Strings | |
StrPrintF StrCat StrCopy StrToLower |
StrVPrintF StrNCat StrNCopy |
Searching Strings | |
StrStr | StrChr |
Converting | |
StrAToI StrIToH | StrIToA |
Localized Numbers | |
StrDelocalizeNumber | StrLocalizeNumber |
Font Functions | |
---|---|
Changing the Font | |
FontSelect | FntSetFont |
Accessing the Font Programmatically | |
FntGetFont | FntGetFontPtr |
Wrapping Text | |
FntWordWrap | FntWordWrapReverseNLines |
String Width | |
FntCharsInWidth FntLineWidth |
FntCharsWidth FntWidthToOffset |
Character Width | |
FntAverageCharWidth | FntCharWidth |
Height | |
FntCharHeight FntBaseLine |
FntLineHeight FntDescenderHeight |
Scrolling | |
FntGetScrollValues | |
Creating a Font | |
FntDefineFont |
Graffiti Manager Functions | |
---|---|
Translate a Stroke into Keyboard Events | |
GrfProcessStroke | |
Shift State | |
GrfInitState GrfCleanState GrfFindBranch |
GrfGetState GrfSetState |
Point Buffer | |
GrfGetNumPoints GrfAddPoint GrfFlushPoints GrfMatch |
GrfGetPoint GrfFilterPoints GrfGetGlyphMapping GrfMatchGlyph |
Working with Macros | |
GrfGetAndExpandMacro GrfDeleteMacro GrfGetMacroName |
GrfAddMacro GrfGetMacro |
Key Manager Functions | |
---|---|
KeyCurrentState KeySetMask | KeyRates |
Pen Manager Functions | |
---|---|
PenCalibrate | PenResetCalibration |
  |   |