Listing 4: A callback that works in C++. The callback is implemented as a static member function that takes an object pointer as a parameter

class PrintDialog {
   Widget okButton;
   Widget cancelButton;
   Widget printerList;

   char *printerName;

public:
    PrintDialog(Widget parent);

    static void okCallback(Widget,
                           XtPointer,
                           XtPointer);
};

PrintDialog::PrintDialog(Widget parent)
{
    ...
    okButton = XmCreatePushButton(parent,
                                  "OK",
                                  NULL,
                                  0);
    XtAddCallback(okButton,
                  XmNactivateCallback,
                  okCallback,
                  (XtPointer)this);
    ...
}

void PrintDialog::okCallback(Widget w,
                             XtPointer user_data,
                             XtPointer call_data)
{
    PrintDialog *pd = (PrintDialog *)user_data;
    cout << "Selected Printer: " << pd->printerName << endl;
}

int main()
{
    ...
    PrintDialog *pd = new PrintDialog(parent);
    ...
}
//End of File