---
name: "xpaconvert"
section: "7"
platform: "linux"
package: "libxpa-dev"
version: "2.1.20-3"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/xpaconvert"
---

# xpaconvert(7)

Converting the XPA API to 2.0

## NAME

**XPAConvert - Converting the XPA API to 2.0**

## SYNOPSIS

This document describes tips for converting from xpa 1.0 (Xt-based xpa) to xpa 2.0 (socket-based xpa).

## DESCRIPTION

The following are tips for converting from xpa 1.0 (Xt-based xpa) to xpa 2.0 (socket-based xpa). The changes are straight-forward and almost can be done automatically (we used editor macros for most of the conversion).

- •

  The existence of the cpp XPA\_VERSION directive to distinguish between 1.0 (where it is not defined) and 2.0 (where it is defined).

- •

  Remove the first widget argument from all send and receive server callbacks.  Also change first 2 arguments from XtPointer to void \*. For example:

  \#ifdef XPA\_VERSION static void XPAReceiveFile(client\_data, call\_data, paramlist, buf, len)\
        void \*client\_data;\
        void \*call\_data;\
        char \*paramlist;\
        char \*buf;\
        int len; #else static void XPAReceiveFile(w, client\_data, call\_data, paramlist, buf, len)\
        Widget w;\
        XtPointer client\_data;\
        XtPointer call\_data;\
        char \*paramlist;\
        char \*buf;\
        int len; #endif

- •

  Server callbacks should be declared as returning int instead of void. They now should return 0 for no errors, -1 for error.

- •

  The mode flags have changed when defining XPA server callbacks. The old *S* flag (save buffer) is replaced by *freebuf=false*. The old *E* flag (empty buffer is OK) is no longer used (it was an artifact of the X implementation).

- •

  Change *NewXPACommand()* to *XPAcmdNew()*, with the new calling sequence:

  ```
    xpa = NewXPACommand(toplevel, NULL, prefix, NULL);
  ```

  is changed to:

  ```
    xpa = XPACmdNew(xclass, name);
  ```

- •

  Change the *AddXPACommand()* subroutine name to XPACmdAdd (with the same calling sequence):

  ```
    AddXPACommand(xpa, "file",
      "\tdisplay a new file\n\t\t  requires: filename",
      NULL, NULL, NULL, XPAReceiveFile, text, NULL);
  ```

  is changed to:

  ```
    XPACmdAdd(xpa, "file",
      "\tdisplay a new file\n\t\t  requires: filename",
      NULL, NULL, NULL, XPAReceiveFile, text, NULL);
  ```

- •

  The *XPAXtAppInput()* routine should be called just before *XtAppMainLoop()* to add xpa fds to the Xt event loop:

  ```
    /* add the xpas to the Xt loop */
    XPAXtAddInput(app, NULL);
    /* process events */
    XtAppMainLoop(app);
  ```

- •

  Change *NewXPA()* to *XPANew()* and call *XPAXtAddInput()* if the XtAppMainLoop routine already has been entered:

  ```
    xpa = NewXPA(saotng->xim->toplevel, prefix, xparoot,
                 "FITS data or image filename\n\t\t  options: file type",
                 XPASendData, new, NULL,
                 XPAReceiveData, new, "SE");
  ```

  is changed to:

  ```
    sprintf(tbuf, "%s.%s", prefix, xparoot);
    xpa = XPANew("SAOTNG", tbuf,
                 "FITS data or image filename\n\t\t  options: file type",
                 XPASendData, new, NULL,
                 XPAReceiveData, new, "SE");
    XPAXtAddInput(XtWidgetToApplicationContext(saotng->xim->toplevel), xpa);
  ```

- •

  Change *XPAInternalReceiveCommand()* to *XPACmdInternalReceive()* remove first argument in the calling sequence):

  ```
    XPAInternalReceiveCommand(im->saotng->xim->toplevel,
                              im->saotng, im->saotng->commands,
                              "zoom reset", NULL, 0);
  ```

  is changed to:

  ```
    XPACmdInternalReceive(im->saotng, im->saotng->commands,
                          "zoom reset", NULL, 0);
  ```

- •

  Change DestroyXPA to XPAFree:

  ```
    DestroyXPA(im->dataxpa);
  ```

  is changed to:

  ```
    XPAFree(im->dataxpa);
  ```

## SEE ALSO

See xpa(n) for a list of XPA help pages
