---
name: "xgks"
section: "3"
platform: "linux"
package: "libxgks-dev"
version: "2.6.1+dfsg.2-17"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/xgks"
---

# xgks(3)

A GKS library for the X Window System

## NAME

XGKS - A GKS library for the X Window System

## SYNOPSIS

**#include \<xgks.h\>**

**Gint gopenws (Gint wsid, Gchar \*connection, Gchar \*ws\_type);**

**Gint gclosews (Gint wsid);**

**Gint gclearws (Gint wsid, Gclrflag control\_flag);**

**Gint gopengks (Gfile \*err\_file, Glong memory);**

**Gint gclosegks (void);**

**Gint gsetasf (Gasfs \*asf);**

**Gint gsetcolorrep (Gint wsid, Gint idx, Gcobundl \*rep);**

**Gint ginqcolorrep (Gint wsid, Gint idx, Gqtype type, Gcobundl \*rep);**

**Gint ginqcolorindices (Gint wsid, Gintlist \*indices);**

**Gint ginqcolorfacil (Gchar \*ws\_type, Gcofac \*fac);**

**Gint ginqpredcolorrep (Gchar \*ws\_type, Gint index, Gcobundl \*rep);**

**Gint gactivatews (Gint wsid);**

**Gint gdeactivatews (Gint wsid);**

**Gint gsetwindow (Gint trans, Glimit \*window);**

**Gint gsetviewport (Gint trans, Glimit \*viewport);**

**Gint gsetviewportinputpri (Gint trans, Gint ref\_trans, Gvpri priority);**

**Gint gselntran (Gint trans);**

**Gint gsetclip (Gclip ind);**

**Gint gsetwswindow (Gint wsid, Glimit \*window);**

**Gint gsetwsviewport (Gint wsid, Glimit \*viewport);**

**Gint gevaltran (Gpoint \*ppoint, Gpoint \*pshift, Gfloat angle, Gpoint \*pscale, Gcsw coord, Gfloat result\[2\]\[3\]);**

**Gint gaccumtran (Gfloat segtran\[2\]\[3\], Gpoint \*ppoint, Gpoint \*pshift, Gfloat angle, Gpoint \*pscale, Gcsw coord, Gfloat result\[2\]\[3\]);**

**Gint gemergencyclosegks (void);**

**Gint gerrorhand (Gint errnum, Gchar \*funcname, Gfile \*perrfile);**

**Gint gerrorlog (Gint errnum, Gchar \*funcname, Gfile \*perrfile);**

**Gint gpolyline (Gint num\_pts, Gpoint \*pts);**

**Gint gsetlineind (Gint idx);**

**Gint gsetlinetype (Gint type);**

**Gint gsetlinewidth (Gfloat width);**

**Gint gsetlinecolorind (Gint idx);**

**Gint gsetlinerep (Gint wsid, Gint idx, Glnbundl \*rep);**

**Gint gcreateseg (Gint name);**

**Gint gcloseseg (void);**

**Gint grenameseg (Gint old, Gint new);**

**Gint gdelseg (Gint name);**

**Gint gdelsegws (Gint wsid, Gint name);**

**Gint gsetsegattr (Gint name, Gsegattr \*segattr);**

**Gint gsetpickid (Gint pick\_id);**

**Gint gassocsegws (Gint wsid, Gint seg\_id);**

**Gint gcopysegws (Gint wsid, Gint seg\_id);**

**Gint ginsertseg (Gint seg\_id, Gfloat segtran\[2\]\[3\]);**

**Gint gredrawsegws (Gint wsid);**

**Gint ginqmodsegattr (Gchar \*ws\_type, Gmodseg \*dyn);**

**Gint ginqnameopenseg (Gint \*seg);**

**Gint ginqsegattr (Gsegattr \*segattr);**

**Gint ginqassocws (Gint seg, Gintlist \*asswk);**

**Gint ginqsegnames (Gintlist \*segs);**

**Gint ginqsegnamesws (Gint wsid, Gintlist \*segs);**

**Gint ginqnumsegpri (Gchar \*ws\_type, Gint \*numpri);**

**Gint ginqcurpickid (Gint \*pickid);**

**Gint gpolymarker (Gint num\_pts, Gpoint \*pts);**

**Gint gsetmarkersize (Gfloat size);**

**Gint gsetmarkertype (Gint type);**

**Gint gsetmarkercolorind (Gint color);**

**Gint gsetmarkerind (Gint idx);**

**Gint gsetmarkerrep (Gint wsid, Gint idx, Gmkbundl \*rep);**

**Gint gfillarea (Gint num\_pts, Gpoint \*pts);**

**Gint gsetfillcolorind (Gint color);**

**Gint gsetfillind (Gint idx);**

**Gint gsetfillintstyle (Gflinter style);**

**Gint gsetfillrep (Gint wsid, Gint idx, Gflbundl \*rep);**

**Gint gsetfillstyleind (Gint idx);**

**Gint gsetpatrep (Gint wsid, Gint idx, Gptbundl \*rep);**

**Gint gcellarray (Grect \*rect, Gipoint \*dim, Gint row, Gint \*color);**

**Gint ginitloc (Gint wsid, Gint dev, Gloc \*init, Gint pet, Glimit \*area, Glocrec \*record);**

**Gint gsetlocmode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqloc (Gint wsid, Gint dev, Gqloc \*response);**

**Gint gsampleloc (Gint wsid, Gint dev, Gloc \*response);**

**Gint ginqlocst (Gint wsid, Gint dev, Gqtype type, Glocst \*state);**

**Gint ginqdefloc (Gchar \*type, Gint dev, Gdefloc \*data);**

**Gint gawaitevent (Gfloat timeout, Gevent \*event);**

**Gint gflushevents (Gint wsid, Giclass class, Gint dev);**

**Gint ginqinputoverflow (Gqueue \*overflow);**

**Gint ginqmoreevents (Gsimultev \*events);**

**Gint ggetloc (Gloc \*response);**

**Gint ggetstroke (Gstroke \*response);**

**Gint ggetchoice (Gchoice \*response);**

**Gint ggetpick (Gpick \*response);**

**Gint ggetval (Gfloat \*response);**

**Gint ggetstring (Gchar \*response);**

**Gint gupdatews (Gint wsid, Gregen regenflag);**

**Gint gsetcharexpan (Gfloat expansion);**

**Gint gsetcharheight (Gfloat height);**

**Gint gsetcharspace (Gfloat spacing);**

**Gint gsetcharup (Gpoint \*up\_vector);**

**Gint gsettextalign (Gtxalign \*txalign);**

**Gint gsettextcolorind (Gint color);**

**Gint gsettextfontprec (Gtxfp \*txfp);**

**Gint gsettextind (Gint idx);**

**Gint gsettextpath (Gtxpath path);**

**Gint gsettextrep (Gint wsid, Gint idx, Gtxbundl \*bundle);**

**Gint gtext (Gpoint \*at, Gchar \*string);**

**Gint ginqtextextent (Gint wsid, Gpoint position, Gchar \*string, Gextent \*extent);**

**Gint gsetdeferst (Gint wsid, Gdefmode deferral\_mode, Girgmode regen\_mode);**

**Gint ginitchoice (Gint wsid, Gint dev, Gchoice \*init, Gint pet, Glimit \*area, Gchoicerec \*record);**

**Gint gsetchoicemode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqchoice (Gint wsid, Gint dev, Gchoice \*response);**

**Gint gsamplechoice (Gint wsid, Gint dev, Gchoice \*response);**

**Gint ginqchoicest (Gint wsid, Gint dev, Gchoicest \*state);**

**Gint ginqdefchoice (Gchar \*type, Gint dev, Gdefchoice \*data);**

**Gint ginitpick (Gint wsid, Gint dev, Gpick \*init, Gint pet, Glimit \*area, Gpickrec \*record);**

**Gint gsetpickmode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqpick (Gint wsid, Gint dev, Gpick \*response);**

**Gint gsamplepick (Gint wsid, Gint dev, Gpick \*response);**

**Gint ginqpickst (Gint wsid, Gint dev, Gqtype type, Gpickst \*state);**

**Gint ginqdefpick (Gchar \*type, Gint dev, Gdefpick \*data);**

**Gint ginitval (Gint wsid, Gint dev, Gfloat init, Gint pet, Glimit \*area, Gvalrec \*record);**

**Gint gsetvalmode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqval (Gint wsid, Gint dev, Gqval \*response);**

**Gint gsampleval (Gint wsid, Gint dev, Gfloat \*response);**

**Gint ginqvalst (Gint wsid, Gint dev, Gvalst \*state);**

**Gint ginqdefval (Gchar \*type, Gint dev, Gdefval \*data);**

**Gint ginitstring (Gint wsid, Gint dev, Gchar \*init, Gint pet, Glimit \*area, Gstringrec \*record);**

**Gint gsetstringmode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqstring (Gint wsid, Gint dev, Gqstring \*response);**

**Gint gsamplestring (Gint wsid, Gint dev, Gchar \*response);**

**Gint ginqstringst (Gint wsid, Gint dev, Gstringst \*state);**

**Gint ginqdefstring (Gchar \*type, Gint dev, Gdefstring \*data);**

**Gint ginitstroke (Gint wsid, Gint dev, Gstroke \*init, Gint pet, Glimit \*area, Gstrokerec \*record);**

**Gint gsetstrokemode (Gint wsid, Gint dev, Gimode mode, Gesw echo);**

**Gint greqstroke (Gint wsid, Gint dev, Gqstroke \*response);**

**Gint gsamplestroke (Gint wsid, Gint dev, Gstroke \*response);**

**Gint ginqstrokest (Gint wsid, Gint dev, Gqtype type, Gstrokest \*state);**

**Gint ginqdefstroke (Gchar \*type, Gint dev, Gdefstroke \*data);**

**Gint ginqlinefacil (Gchar \*ws\_type, Glnfac \*fac);**

**Gint ginqpredlinerep (Gchar \*ws\_type, Gint idx, Glnbundl \*rep);**

**Gint ginqlineindices (Gint wsid, Gintlist \*idxlist);**

**Gint ginqlinerep (Gint wsid, Gint idx, Gqtype type, Glnbundl \*rep);**

**Gint ginqmarkerfacil (Gchar \*ws\_type, Gmkfac \*fac);**

**Gint ginqpredmarkerrep (Gchar \*ws\_type, Gint idx, Gmkbundl \*rep);**

**Gint ginqmarkerindices (Gint wsid, Gintlist \*idxlist);**

**Gint ginqmarkerrep (Gint wsid, Gint idx, Gqtype type, Gmkbundl \*rep);**

**Gint ginqfillfacil (Gchar \*ws\_type, Gflfac \*fac);**

**Gint ginqpredfillrep (Gchar \*ws\_type, Gint idx, Gflbundl \*rep);**

**Gint ginqfillindices (Gint wsid, Gintlist \*idxlist);**

**Gint ginqfillrep (Gint wsid, Gint idx, Gqtype type, Gflbundl \*rep);**

**Gint ginqpatfacil (Gchar \*ws\_type, Gint \*fac);**

**Gint ginqpredpatrep (Gchar \*ws\_type, Gint idx, Gptbundl \*rep);**

**Gint ginqpatindices (Gint wsid, Gintlist \*idxlist);**

**Gint ginqpatrep (Gint wsid, Gint idx, Gqtype type, Gptbundl \*rep);**

**Gint gmessage (Gint wsid, Gchar \*string);**

**Gint gescinqxattr (Gint wsid, Display \*\*dpy, Window \*win, GC \*gc);**

**void gescsetbackingstore (Gint wsid, Gint i);**

**void gescsetprogname (char \*name);**

**Gint gescsetcolormask (Gint wsid, unsigned long mask);**

**Gint gescsetdcsize (Gint wsid, Gpoint size);**

**Gint gescstoreprimi (Gint wsid, Gstore store);**

**Gint gescredrawnotify (Gint wsid, Gint (\*funcp)(Gint wsid, typedef enum Gredraw who));**

**Gint ginqtextfacil (Gchar \*ws\_type, Gtxfac \*fac);**

**Gint ginqpredtextrep (Gchar \*ws\_type, Gint idx, Gtxbundl \*rep);**

**Gint ginqtextindices (Gint wsid, Gintlist \*idxlist);**

**Gint ginqtextrep (Gint wsid, Gint idx, Gqtype type, Gtxbundl \*rep);**

**Gint ginqavailwstypes (Gstrlist \*wstypes);**

**Gint ginqdisplayspacesize (Gchar \*ws\_type, Gdspsize \*dspsz);**

**Gint ginqwscategory (Gchar \*ws\_type, Gwscat \*cat);**

**Gint ginqwsclass (Gchar \*ws\_type, Gwsclass \*class);**

**Gint ginqmodwsattr (Gchar \*ws\_type, Gmodws \*dyn);**

**Gint ginqdefdeferst (Gchar \*ws\_type, Gdefer \*def);**

**Gint ginqmaxwssttables (Gchar \*ws\_type, Gwstables \*tables);**

**Gint ginqnumavailinput (Gchar \*ws\_type, Gnumdev \*num);**

**Gint ginqwsconntype (Gint wsid, Gwsct \*ct);**

**Gint ginqwsst (Gint wsid, Gwsstate \*state);**

**Gint ginqwsdeferupdatest (Gint wsid, Gwsdus \*du);**

**Gint ginqopst (Gos \*state);**

**Gint ginqlevelgks (Glevel \*lev);**

**Gint ginqwsmaxnum (Gwsmax \*maxws);**

**Gint ginqopenws (Gintlist \*wsids);**

**Gint ginqactivews (Gintlist \*wsids);**

**Gint ginqprimattr (Gpriattr \*primattr);**

**Gint ginqindivattr (Gindattr \*indivattr);**

**Gint ginqcurntrannum (Gint \*tran);**

**Gint ginqntrannum (Gintlist \*tranlist);**

**Gint ginqntran (Gint num, Gwstran \*tran);**

**Gint ginqclip (Gcliprec \*clipping);**

**Gint ginqmaxntrannum (Gint \*maxtran);**

**Gint ginqwstran (Gint wsid, Gwsti \*wstran);**

**Gint ginqpixelarraydim (Gint wsid, Grect \*rect, Gipoint \*dim);**

**Gint ginqpixelarray (Gint wsid, Gpoint \*point, Gipoint \*dimen, Gpxarray \*pxarr);**

**Gint ginqpixel (Gint wsid, Gpoint \*ppoint, Gint \*pix);**

**Gint gwritegksm (Gint wsid, Gint type, Gint length, Gchar \*data);**

**Gint ggetgksm (Gint wsid, Ggksmit \*result);**

**Gint greadgksm (Gint wsid, Gint length, Gchar \*record);**

**Gint ginterpret (Ggksmit \*recInfo, Gchar \*data);**

## DESCRIPTION

XGKS is an implementation of the ANSI Graphical Kernel System for use with the X Window System.  XGKS was developed at the University of Illinois, Urbana, Illinois, and supported by IBM ACIS. After being made freely available in the X11R4 distribution, XGKS was adopted by the Unidata Program Center (UPC) of the University Corporation for Atmospheric Research (UCAR) in Boulder, Colorado.

## STANDARDS

XGKS is an  implementation  of  the  ANSI  Graphical  Kernel System  as  defined  by  the  functional description and the draft 1988 C language binding.  Thus, the  ultimate  reference for any programmer is the C binding manual which details the data types and functions available.   XGKS  is  a  level  2C implementation  of  the  GKS  specification.    It  supports REQUEST, SAMPLE, and EVENT input modes for all  six  logical input  devices, workstation independent segment storage, and metafiles.

## CAPABILITIES

The XGKS library supports all  functions  specified  by  the ANSI standard with the exception of :

```
ESCAPE (in its most general form)
GENERALIZED DRAWING PRIMITIVE (in its most general form)
INQUIRE GENERALIZED DRAWING PRIMITIVE
INQUIRE LIST OF AVAILABLE GENERALIZED DRAWING PRIMITIVES
SET PATTERN REFERENCE POINT
SET PATTERN SIZE
```

The escape and gdp functions are implemented  as  a  set  of functions which follow the naming convention outlined in the C  binding.    That   is,   escape   functions   are   named **gesc***function*  and  gdp functions are named  **ggdp***function*, where *function* is a  descriptive  name  for  the  function performed.

## ESCAPE FUNCTIONS

**gescinqxattr()** returns the attributes of the opened X window for workstation *wsid*.

**gescsetbackingstore()** enables (disables) backingstore for workstation *wsid* if *i* is non-zero (zero).  Backingstore is enabled by default if it is available on the workstation and the **backingstore** X resource (see  **X-RESOURCES**) doesn't indicate otherwise.

**gescsetprogname()** sets the program name by which the application will be known to X to  *name*.  This name will be used to access X resouces by prepending it to resource names (along with a separating period \`.').  The X window will also be named *name*.  By default, the name **XGKS** is used.

**gescsetcolormask ()** changes the color-plane mask on workstation *wsid* to *mask* via the X function **XSetPlaneMask()**.

**gescsetdcsize()** changes the device coordinate space on workstation *wsid* to *size*.

**gescstoreprimi()** enables (disables) the storing of non-segment output primitives on workstation *wsid* if *store* is non-zero (zero).  Storing is enabled by default and is necessary for an X refresh (after an expose or resize event) to include primitives which are not stored in any segment.

**gescredrawnotify()** registers the user-defined redraw function *funcp* with workstation  *wsid*.  When a redraw action is initiated, the final action will be to call *funcp* with the first argument set to the workstation number and the second argument set to GRD\_GKS (if the redraw was initiated by GKS) or to GRD\_X (if the redraw was initiated by X).  Both symbolic constants  are defined in the header-file **xgks.h**.

## OUTPUT PRIMITIVES

Polylines of any width and  color  can  be  displayed  while seven line styles are supported they are:

```
	GLN_DASH		long dash
	GLN_DDOTDASH	double dot dash
	GLN_SDASH		short dash
	GLN_SOLID		solid
	GLN_DASH		medium dash
	GLN_DOT		dotted
	GLN_DOTDASH	dot dash
```

Polymarkers of any size and color  can  be  displayed,  five marker styles are provided:

```
	GMK_POINT		filled circle
	GMK_PLUS		+
	GMK_STAR		*
	GMK_O		unfilled circle
	GMK_X		X
```

All text within XGKS is implemented  through  stroke  fonts, thus  text  primitives  are  fully transformable.  Nine font styles are supported:

```
	1	SanSerif Roman
	2	Serif Roman
	3	SansSerif Bold Roman
	4	Serif Bold Roman
	5	Sanserif Italic Roman
	6	Serif Italic Roman
	7	SanSerif Script
	8	Serif Script
	9	Gothic
```

Fill Area output primitives  can  be  displayed  as  hollow, solid,  hatched  and  patterned.   Twenty (numbered one to twenty)  hatch and pattern styles are predefined. The application program can redefine these patterns; however, the programmer should be aware that the **gsetpatrep()** function expects patterns  to be stored in column major order from bottom to top. This means that cell\[0\]\[0\] is the bottom-left corner, cell\[dx-1\]\[dy-1\] is the top-right corner, and cell\[0\]\[1\] is directly above cell\[0\]\[0\].

GKS  Cell  Arrays  are  supported  in  their  most   general, transformable form.

## LOGIAL INPUT DEVICES

XGKS supports the full GKS input model.  Thus,  all  logical input  devices  operate in request, sample, and event modes. Any number of logical input devices can be created for  each of the six input classes.  All logical devices are triggered through the use of  the  mouse  and  its  buttons  with  the exception of the choice device where one prompting technique uses the  keyboard's  function  buttons.   A  logical  input device is only active when the mouse is within the echo area of the device and one  or  more  of  the  mouse  buttons  is pressed.   When  the  mouse button is released, the physical device triggers all logical  input  devices  in  request  or event mode whose echo area surrounds the cursor.  Devices in sample mode are triggered whenever the  mouse  moves  within the  echo  area  while  the  mouse  is  pressed.   Any input operation can be aborted by pressing the Break  key  on  the keyboard.

Five prompting types are defined for the locator:

```
	1	tracking cross
	2	crosshair spanning X window
	3	tracking cross
	4	rubberband line
	5	rubberband rectangle
```

The only restriction placed on these prompts is that  prompt and  echo  type  5 does not allow the rectangle to be a fill area  style  other  than  hollow.   The  fixed  end  of  the rubberband  line  and  rubber  rectangle  is  at the initial locator position while  the  floating  end  is  the  current value.

The stroke input device differs from the locator by allowing more  than  one  coordinate  point to be entered.  There are three stroke prompts supported:

```
	1	tracking cross
	3	polymarker at each point
	4	polyline joining points
```

The closeness  of  selected  points  can  be  controlled  by specifying  a  minimum  X  and minimum Y displacement in the stroke data record during stroke  initialization.   Although specified  as  a  distance  in  World  Coordinate space, the restriction is enforced in Normalized Device space.

The valuator input device allows the user to select  a  real numbered value within the application specified range.  Only one  visual  representation  is  currently  supported:   the valuator appears as a bar with a sliding knob whose relative position determines the current value.  A horizontal bar  is displayed  if  the  echo  area  is  wider  than  it is tall, otherwise a vertical bar is used.  This prompt technique  is selected by valuator prompt and echo types one and two.

Two types of choice devices are provided.    Choice  prompts one  and  two  use  the  keyboard  function keys as a choice device, thus function key  F1  returns  choice  number  one. Prompt  and  echo  type  one enables all function keys while prompt type two enables only those  keys  specified  in  the data  record  when the device is initialized.  Choice prompt type three presents the user with  a  menu  from  which  the current  choice  is  selected.  These  menus  appear and act similar to most X11 window  manager  menus.   That  is,  the current  selection  is  highlighted and selection is made by releasing the mouse button when the desired choice  is  lit. A  word  of warning, these menus are displayed in the choice echo  area  and  DO  NOT  attempt  to  restore  any   output primitives that they cover.

Currently only two pick prompt types are supported: one  and three.   Both  prompt types highlight the currently selected segment by flashing a  bounding  box  around  the  segment's extent.  Also, picking is only implemented at the segment extent level.   Thus, if two segments overlap and the user points at the area of intersection, then the segment of highest priority will be picked even if the cursor is directly over a primitive contained in the other segment.

The string device has only one prompt and echo type:  number 1.   This  prompt  type  gives the user one line on which to type.  This line is positioned in the upper-left  corner  of the  string echo area and is displayed as a hollow fill area within which  an  insertion  point  cursor  and  typed  text appear.   As  the  user  types,  the  only  special keys are Backspace, Delete,  and  Enter  which  perform  the  obvious functions.   The  length of the line is limited by the width of the echo area and  the  size  of  the  string  buffer  as specified   by   the   application   program  during  string initialization.

## LIMITS

Four workstation types are defined by XGKS:  MI,  MO,  WISS, and  X11.   When  calling  the open workstation function the application must specify three  parameters:  1)  a workstation identifier,  which is an  integer  used  to identify this workstation throughout the application; 2) a workstation  connection,   which is either a file name for the metafile workstations (MI and MO) or an  X11  DISPLAY  specification string (see the X man page), or a null character pointer for the X11 workstation (if null, then the environment variable DISPLAY is consulted); and 3) the  workstation  type,  which  is  either one of the strings "MI",  "MO", or "WISS" (in which case a workstation of the appropriate type will be opened) or a null character pointer (in which case an X11 window will be created); The workstation connection parameter is ignored for the workstation independent segment  store  (WISS) workstation. Ten   workstations    can    be    open simultaneously;  however,  only  one WISS workstation can be open.

There are thirty-one normalization transformations, numbered 0  to  30.   Transformation  number  zero  is  the  identity transformation and cannot be changed.

Every X11 window workstation has a fixed  device  coordinate space that is 0 to 1279 on the X axis and 0 to 1023 on the Y axis.  This is not to say that the X window is that big, the GKS  workstation  will  be  scaled to fit the X window; this scaling preserves the aspect ratio.

There are twenty bundle  table  entries  for  each  type  of bundle table.

The size of the color table is determined by the X11  window server   and   the  hardware  being  used.   The  IBM  apa16 monochrome display  provides  two  colors  and  the  Megapel display supports 255 out of 4096 possible colors. Each XGKS workstation shares the default color map of the display. The GKS SET COLOR REPRESENTATION function uses the X11  **XAllocColor()** function to obtain the pixel value of the colorcell having the color  closest to the requested one.   The association between GKS colour indices and X11 colorcells is maintained in a lookup table. This mechanism decouples GKS colour indices from X11 pixel values and makes the XGKS client "friendly" in relation to other X11 clients  in the handling of the X11 colormap.

GKS color index zero always refers to the X window background color while GKS color index one refers to the X window foreground color.

## METAFILES

Two Metafile formats are supported: GKSM and CGM.  The GKSM format  is a formatted audit-trail of the GKS session: there is an almost isomorphic mapping between GKS calls and GKSM records.  Because GKSM is a formatted encoding, however, this format can impose a considerable  storage requirement.  Also, the GKSM format is not widely used.

The CGM format used by XGKS is a subset of the binary encoding specified  in the ANSI X3.122-1986 standard.  Because it is a binary encoding, this format is more space efficient than the GKSM format. It is not quite as powerful, however, as it does not record an audit-trail of the GKSM session; rather, it describes a set of independent, static pictures.  The CGM format is a widely used graphics standard.

The standard allows several alternative encodings for primitives such as floating-point and integer values.  XGKS uses the default encodings only.  These are

```
REAL PRECISION	Fixed point; whole part 16 bits;
	fractional part 16 bits.
INTEGER PRECISION	16 bits
COLOUR PRECISION	1 octet (per colour component)
COLOUR INDEX PRECISION	1 octet
INDEX PRECISION	16 bits
VDC TYPE	INTEGER
VDC INTEGER PRECISION	16 bits
VDC EXTENT	(0,0) to (32767,32767)
COLOUR VALUE EXTENT	minimum is (0,0,0) and maximum
	is (255,255,255).
```

This CGM form is compatible with the NCAR Graphics package.

The type of Metafile is selected by the Metafile's filename.  Filenames containing the string ".cgm" (or ".CGM") are assumed to be in CGM format; all other files are assumed to be in GKSM format.

## X-RESOURCES

The following X-resources and their parameters are searched for by the XGKS library:

- *program***.backingstore: on\|off**

  Whether or not the server should use the X backing-store feature for windows created by this application. Whether the backingstore feature is enabled by default depends on the  capability of the X server: if the server can use backingstore, then it's  enabled by default; otherwise it's disabled by default.

- **Xgks.Backingstore: on\|off**

  Whether or not the server should use the X backing-store feature for  the entire class of XGKS applications.

- *program***.background:** *color*

  Color for the background of the XGKS window for program *program*. The string *color* must be understood by the X-server (.e.g "MidnightBlue").

- **Xgks.Background:** *color*

  Background color for the entire class of XGKS applications.

- *program***.foreground:** *color*

  Color for the foreground of the XGKS window for program *program*. The string *colorP* *must be understood by the X-server (.e.g "white").*

- **Xgks.Foreground:** *color*

  *Foreground color for the entire class of XGKS applications.*

- *program**.geometry:** XSIZE**x**YSIZE**\[+-\]**xoff**\[+-\]**yoff*

  *Geometry in pixels for the XGKS window of program program.*

- **Xgks.Geometry: *XSIZE*x*YSIZE*\[+-\]*xoff*\[+-\]*yoff***

  *Geometry in pixels for the entire class of XGKS applications.*

- *program***.iconic: on\|off**

  *Initially, map the XGKS window as an icon rather than as a normal*  *window.*

- **Xgks.Iconic: on\|off**

  *Initially, map the entire class of XGKS windows as icons rather than*  *as normal windows.*

- *program***.beep: on\|off**

  *Controls whether or not the bell sounds during interactive input*  *in the XGKS window of program program.* *The default is* **off***.*

- **Xgks.Beep: on\|off**

  *Controls whether or not the bell sounds during interactive input*  *for the entire class of XGKS applications.* *The default is* **off***.*

- *program***.softclipping: on\|off**

  *Enable or disable the soft-clipping of polylines.  By default, XGKS defers* *the clipping of output primitives to the X Window System.*   *This works reliably only if the normalized device co-ordinates (NDC) of the* *output primitives are relatively close to the NDC \[0,1\] unit-square.*   *Due to wrap-around in the NDC-to-X co-ordinate transformation, very* *large NDC values might cause extraneous lines to appear in the display* *window.* *Though this behavior is server-dependent,* *it typically occurs when displaying a small portion of a large* *graphic.* *Soft-clipping causes XGKS to clip polyline output against the*  *current NDC clip-window before calling X; thus eliminating extraneous*  *lines but incurring some additional computational overhead.* *Because this behavior is server-dependent, we suggest you use* *the default (i.e. no soft-clipping) until the problem manifests* *itself.*

- **Xgks.Softclipping: on\|off**

  *Enable or disable soft-clipping for the entire class of Unidata XGKS*  *applications.*

## USING X-RESOURCES

*The following pseudo-code details the sequence of steps taken to initialize*  *the program-specific, internal, X-resource database.  Definitions encountered*  *during later steps override earlier ones.*

*Clear internal X-resource database;*

*if (file* **/usr/lib/X11/app-defaults/***program exists)*

*Merge its definitions into the database;*

*if (environment variable* **XAPPLRESDIR** *exists)*

*Merge the definitions in file* **$XAPPLRESDIR/***program* into the database;

if (X-server has an X-resource database) {

Merge its definitions into the database;

} else if (file **~/.Xdefaults** exists) {

Merge its definitions into the database;

}

if (environment variable **XENVIRONMENT** exists) {

Merge the definitions in file **$XENVIRONMENT** into the database;

} else if (file **~/.Xdefaults-***X-server\_hostname* exists) {

Merge its definitions into the database;

}

Notes:

- 1\)

  The X-server may have its X-resource database updated via the **[xrdb(1)](/xrdb/1.md)** utility.

- 2\)

  *Program* is the name of the program as set by the **gescsetprogname()** function (see ESCAPE FUNCTIONS).

- 3\)

  *X-server\_hostname* is the name of the first host to which XGKS connects as returned by the X function **DisplayString()**. (e.g. "groucho").

## PROGRAMMING

Here is a simple XGKS program that displays "Hello World" in the   center  of  the  default  workstation  window.   After displaying the greeting, the program  uses  a  choice  input device to wait for the user to press the break key.  This is done because the X window that represents  this  workstation is  removed  from  the  screen as soon as the workstation is closed.  The for loop in the main program  is  a  convenient way  for  the  application  to allow the user to specify the workstation  connection  id  on  the  command  line  via   a hostname:serverNumber  pair.   If  the  connection id is not specified  XGKS  will  use  the  value  of  the  environment variable DISPLAY in the users environment.

```
#include <stdio.h>
#include <string.h>
#include <xgks.h>
/*
 * This function is called when the program is finished
 * and we just want to wait until the user is done looking
 * at the output.  Here we set up a choice device to use
 * the function keys. However, we ignore all choices and
 * wait for the user to press the Break key.
 */
    static void
WaitForBreak(wsid)
    Gint wsid;
{
    Gchoice init;
    Gchoicerec record;
    Glimit earea = { 0.0, 1279.0, 0.0, 1023.0 };
    gmessage(wsid, "Done, press Break to quit ...");
    init.status = GC_NOCHOICE;
    init.choice = 0;
    record.pet1.data = NULL;
    ginitchoice(wsid, 1, &init, 1, &earea, &record);
    gsetchoicemode(wsid, 1, GREQUEST, GECHO);
    while (init.status != GC_NONE)
        greqchoice(wsid, 1, &init);
}
/*
 * set up various text parameters and print "Hello World"
 */
PrintHello()
{
    Gpoint tpt;
    Gpoint up;
    Gtxfp txfp;
    Gtxalign align;
    txfp.font = 4;           /* use Serif Bold Roman font */
    txfp.prec = GSTROKE;
    gsettextfontprec(&txfp);
    gsetcharexpan(0.5);
    gsetcharspace(0.2);
    gsettextcolorind(1);   /* should be white */
    gsetcharheight(0.05);
    up.x = 0.0; up.y = 1.0;  /* characters are straight up */
    gsetcharup(&up);
    align.hor = GTH_CENTER;
    align.ver = GTV_HALF;
    gsettextalign(&align);
    gsettextpath(GTP_RIGHT); /* print from left to right */
    tpt.x = 0.5; tpt.y = 0.5;/* center of the window */
    gtext(&tpt,"Hello World!");
}
main(argc,argv)
    int argc;
    char *argv[];
{
    int i, wsid=1;
    char *conn = (char*)NULL;
    for (i=1; i<argc; i++) {
        if (strchr(argv[i], ':'))
            conn = argv[i];
        /* Application dependent options here */
    }
    gopengks(stdout,0);
    if (gopenws(wsid, conn, conn) != 0)
        exit(1);
    gactivatews(wsid);
    PrintHello();
    WaitForBreak(wsid);
    gdeactivatews(wsid);
    gclosews(wsid);
    gclosegks();
    exit(0);
}
```

To compile the program, we use the following command line (NB: **${prefix}** **is the root of the installation-tree):**

```
cc hello.c -o hello -I${prefix}/include -L${prefix}/lib -lxgks -lX11 -lm
```

**Or, if on an Apollo workstation:**

```
cc hello.c -o hello -I${prefix}/include -L${prefix}/lib -lxgks -L/usr/lib/X11 -lX11 -lm
```

**To execute, just type:**

**./hello**

**(NB: you must be running an X server when you run  any  XGKS** **application.)**

**Similarly, to compile a Fortran-based XGKS program (e.g. hello.f),**  **we use:**

```
f77 -O -o hello hello.f -L${prefix}/lib -lxgks -lX11 -lm
```

**or, if using an Apollo workstation:**

```
f77 -O -o hello hello.f -L${prefix}/lib -lxgks -L/usr/lib/X11 -lX11 -lm
```

**or, if using an HP 9000/720 workstation:**

```
f77 -O -o hello hello.f -Wl,-L,${prefix}/lib -lxgks -Wl,-L,/usr/lib/X11R4 -lX11 -lm
```

**When the program opens the GKS workstation  the  X11  window** **system  will  prompt  the  user  to  open a new window.  The** **program will display "Hello World!" and then  wait  for  the** **user  to  press  the  Break  key.  While the GKS workstation** **window is on the screen the user can  resize,  move,  cover,** **and   uncover   the  window  and  XGKS  will  take  care  of** **redisplaying the greeting.**

## FILES

**In the following, ${prefix} is the root of the installation** **directory-tree as defined by the Makefile macro of the same name.**

**${prefix}/lib/libxgks.a	The XGKS library.**\
 **${prefix}/lib/xgksfonts	Font data-base directory.**\
 **${prefix}/bin	Directory containing sample programs.**\
 **${prefix}/include/xgks.h	C header-file.**

## ENVIRONMENT

**XGKSFontDir**, **if set, contains the pathname of the directory which contains the XGKS** **fonts.  If not set, then the compiled-in pathname**  **is used (see FILES).**

## SEE ALSO

**X**(1), [**xrdb**(1)](/xrdb/1.md), [**xterm**(1)](/xterm/1.md).

**Computer Graphics - Graphical Kernel System (GKS) Functional Description.** **ANSI, X3.124-1985.**

**C Language Binding of GKS. ANSI X3H34/83-12R5, March 1986.**

**Computer Graphics, Donald Hearn and Pauline Baker, Prentice-Hall, 1986.**

**The X Window System, Robert W. Scheifler and Jim Gettys, ACM** **Transactions on Graphics, volume 5, number 2, April 1986, pp. 79-109.**

## BUGS

**The only workstations currently supported are X, GKSM, and CGM.**

**Support for input Metafiles is primitive, at best.**

**The decoupling between GKS colour-indices and X pixel values is** **primitive at best.  Also, an XGKS window always uses the default colormap.**

## BUG REPORTING

**Bugs reports should be sent to xgks-bugs@unidata.ucar.edu** **\[128.117.140.3\].  Please include a potential fix, if possible.**

## MAILING-LIST

**A mutual-aid society, electronic mailing-list exists.  Requests to join** **should be sent to xgks-request@unidata.ucar.edu \[128.117.140.3\].**

## AUTHORS

**Greg Rogers (grogers@a.cs.uiuc.edu)**\
 **Sung Hsien Ching (ksung@a.cs.uiuc.edu)**\
 **Yu Pan**\
 **Steve Emmerson (steve@unidata.ucar.edu)**

**This project was supported by IBM ACIS and was directed** **by Professors Bill Kubitz and Roy Campbell** **of the Graphics Workstation Research Group, Department of Computer**  **Science, at the University of Illinois in Urbana, Illinois.** **Special thanks go to David Berkowitz and Terry Rowan, our IBM contacts,** **who helped us get early versions of the X server for our workstations.**

**Maintenance of XGKS by the Unidata Program Center is supported by the** **National Science Foundation.  Special thanks to all those in the user** **community who contribute to its evolution.**
