5.7 Canvas Functions

Functions which are declared as canvas functions in the dialog descriptions have to be programmed in C independently of the window system. The underlying window system is usually accessed to carry out the desired actions.

DM_Boolean DML_default DM_CALLBACK Functionname
(
  DM_CanvasUserArgs *canvasargs
)

if the function is defined in the dialog script as

function canvasfunc Functionname();

or as

DM_Boolean DML_c DM_CALLBACK Functionname
(
  DM_ContentArgs *data
)

if the function is defined in the dialog script as

function c canvasfunc Functionname();

Example

In the dialog a canvas function is defined as follows:

function canvasfunc CallbackCanvas();

The assignment to the canvas is as follows:

child canvas Canvas

{

  .borderwidth 1;

  .xauto 0;

  .xleft 1;

  .xright 1;

  .yauto 0;

  .ytop 1;

  .ybottom 5;

.canvasfunc CallbackCanvas;

}

A realization for the window system Motif then is as follows:

DM_Boolean DML_default DM_CALLBACK CallbackCanvas (data)
DM_CanvasUserArgs *data;
{
  switch (data->reason)
  {
    case CCR_expose:
    if (data->xevent)
    {
      DM_TraceMessage("CCR_expose width %d height %d",
          DMF_LogFile | DMF_InhibitTag | DMF_Printf,
          data->xevent->xexpose.width,
          data->xevent->xexpose.height);

      if (data->xevent->xexpose.count == 0)
        DoExpose(data->widget, x0, y0);
    }
    break;

    case CCR_input:
    switch (data->xevent->type)
    {
      case ButtonPress:
      switch (data->xevent->xbutton.button)
      {
        case Button1:
        x0 = data->xevent->xbutton.x;
        y0 = data->xevent->xbutton.y;
        DoExpose(data->widget, x0, y0);
        break;
      }
      break;
    }
    break;

    case CCR_start:
    DM_TraceMessage("CCR_start ** ", DMF_LogFile |
        DMF_InhibitTag);
    /* fallthrough */

    case CCR_resize:
    {
      Arg args[2];

      XtSetArg(args[ 0 ], XmNwidth, NULL);
      XtSetArg(args[ 1 ], XmNheight, NULL);
      XtGetValues(data->widget, args, 2);

      width = args[0].value;
      height = args[1].value;
      DM_TraceMessage("Resize height %d width %d event %ld",
          DMF_LogFile | DMF_InhibitTag | DMF_Printf,
          height, width, (long) data->xevent);
    }
    break;

    case CCR_stop:
    break;
  }
  /*
  ** On Motif the return value of the canvas function is ignored.
  ** On Windows the message processing is stopped if the
  ** return value is TRUE.
  ** So the default return value of the canvas function is FALSE.
  */
  return FALSE;
}