Here are some code fragments that create a GLwDrawingArea widget, and manage the appropriate callbacks.
#include <stdlib.h>
#include <X11/GLw/GLwDrawA.h>
static GLXContext glx_context;
. . .
main()
{
Arg args[10];
int n;
Widget parent;
Widget glw;
. . .
n = 0;
XtSetArg(args[n], GLwNrgba, True); n++;
glw = XtCreateManagedWidget("glw", glwDrawingAreaWidgetClass,
parent, args, n);
XtAddCallback(glw, GLwNexposeCallback, exposeCB, NULL);
XtAddCallback(glw, GLwNresizeCallback, resizeCB, NULL);
XtAddCallback(glw, GLwNginitCallback, ginitCB, NULL);
. . .
}
static void
exposeCB(Widget w, XtPointer client_data,
GLwDrawingAreaCallbackStruct *call_data)
{
GLwDrawingAreaMakeCurrent(w, glx_context);
}
static void
resizeCB(Widget w, XtPointer client_data,
GLwDrawingAreaCallbackStruct *call_data)
{
GLwDrawingAreaMakeCurrent(w, glx_context);
}
static void
ginitCB(Widget w, XtPointer client_data,
GLwDrawingAreaCallbackStruct *call_data)
{
Arg args[1];
XVisualInfo *vi;
XtSetArg(args[0], GLwNvisualInfo, &vi);
XtGetValues(w, args, 1);
glx_context = glXCreateContext(XtDisplay(w), vi,
NULL, GL_FALSE);
GLwDrawingAreaMakeCurrent(w, glx_context);
}
The Motif program need only differ by including
GLwMDrawingArea.h instead of GLwDrawingArea.h and by creating a widget of type GLwMDrawingAreaWidgetClass instead of GLwDrawingAreaWidgetClass. As an alternative, the Motif program could use GLwCreateMDraw(3X) instead.