List of sections:
The View-Objects List
'C' Structures Associated with the View-Objects List
Routines for Managing the View-Objects List
The Initialisation Routine
Event Handling
The Fortran to 'C' Interface
Fonts
The heart of the management of the XDL_VIEW view-objects is an array of C structures with one element for each view-object currently present for the application. The structure includes a list of all windows associated with the view-object, pointers to global data areas associated with the view-object and the names of callback and other routines for use for example in the event handling.
The view-object routines are coded in such a way that multiple copies of any particular view-object may be used as required. In most cases, when a new view-object is created, the routine which is called to create it allocates an area of memory for a view-object specific C structure to hold any items of data which are required for communication bewteen the various routines associated with that view-object. Thus each instance of a view-object has its own 'global data' area.
The format of the view-objects list structure is as follows:
typedef struct { int vh; /*The view object handle as set in the application program*/ Window wid; /*The (top level) window id for this view-object*/ int vh_parent; /*View object handle of parent if view-object is a sub_window of another view-object in the XDL_view_objects list*/ int type; /*A unique integer value identifying the view-object type. This is for safety checking to ensure that, when a routine is called to manipulate or get data from a view-object identified by the view-object handle, the view-object is of the correct type*/ char *gd; /*Pointer to structure of data items used for communicating between the functions of the view-object ('global data' area)*/ int num_win ; /*Number of window objects associated with this view-object (subwindows etc.)*/ XDl_window *win_list; /*Array of window objects associated with this view-object. (includes the top level window of the view-object*/ void (*on_off)(); /*Pointer to view-object's on/off function to be called to turn program input from the view-object on or off. This will be called by the xdl_get_events routine. A null may be given if such a routine is not required or implemented*/ void (*tidy_up)(); /*Pointer to the view_object's tidy up function to be called when the view-object is deleted by calling the xdl_delete_view_object routine. This routine will for example free any memory areas allocated by the view object. (It need not free the global data area as this will be automatically freed by the xdl_delete_view_object routine). A NULL may be given if such a routine is not required*/ } XDl_view_object;As already indicated, the entry for a view-object contains a pointer to a list of windows associated with the view-object. Each entry in this list is a structure with the following format:
typedef struct { Window wid; /*Window i.d. for the window*/ void (*repaint)(); /*Repaint routine to be called on expose, configure notify (resize) */ void (*ehp)(); /*Event Handling Procedure for other events*/ XDl_libdata *libdata; /*Pointer to XDl_libdata structure for a library routine window - otherwise NULL*/ } XDl_window;If a window is associated with some special library type of routine (e.g. a panel item) then an additional structure of type XDl_libdata may be present. This has the following format:
typedef struct { char *gd; /*Pointer to a private data area used by the library window function*/ void (*callback)(); /*Callback routine to return data to view-object*/ void (*tidy_up)(); /*Tidy up routine to be called when library routine window is deleted via xdl_delete_view_object (this need not free gd as this will be done automatically by xdl_delete_view_object)*/ } XDl_libdata;
A number of routines are available for managing the list of view-objects. These include the following:
A list of all the routines in the xdl_view.c source file is given in Volume 3 of the documentation. The calls to the repaint, event handling, on_off and tidy_up routines are also described in Volume 3 of the documentation.
The initialisation routine xdl_open_view (or xdlf_open_view for Fortran) must be called before any other XDL_VIEW routine. As already indicated, it initialises the array of XDl_view_object structures. It also sets up, in addition to a a small default colour map which contains the colours black, white and the six primary and secondary colours, colour maps based on the user's requirements for the application. In addition to these items, a number of other global data items, which may be used within the code for the individual view-objects, are set up by the initialisation routine.
The global data items set up are as follows:
Display *XDL_display; Display. XtAppContext XDL_app; Application Context int XDL_screen; Screen no. int XDL_open = 0; XDL_VIEW opened flag.
int XDL_num_view_objects; Number of view-objects set up. XDl_view_object **XDL_view_objects; Array of pointers to XDL_view_object structures int XDL_max_alloc_objects; Max. no. of view-objects for which table space has been allocated.
XFontStruct *XDL_fontinfo; Standard (small) font. XFontStruct *XDL_fontinfo_bold; Standard (small) bold font. XFontStruct *XDL_fonts[5]; Fonts very small, small, medium, large and very large. XFontStruct *XDL_bold_fonts[5]; Bold fonts very small, small, medium, large and very large.
Cursor XDL_default_cursor; Default cursor.
int XDL_color; Colour availability flag = 0, not available - monochrome = 1, grays = 2, colour int XDL_display_type; Display type to be used = StaticGray, GrayScale, StaticColor, PseudoColor, TrueColor or DirectColor (Values defined in X.h) int XDL_csets_alloc; =1 requested colour sets allocated with writeable colour cells =0 requested colour sets not allocated (static display type or less than 8 bit planes) int XDL_display_cells; No. of color cells available. Visual *XDL_visual; Visual for creating windows. int XDL_pw_depth; Depth for paint windows. Colormap XDL_colormap; Colormap selected for the application. int XDL_num_colorsets; Number of colormap sets (in addition to the standard short pallette). XDl_colorset XDL_colorsets[MAXCOLORSETS]; Array of allocated colormap sets unsigned long XDL_blackpixel; Black pixel no. unsigned long XDL_whitepixel; White pixel no. unsigned long XDL_redpixel; Red pixel no. unsigned long XDL_yellowpixel; Yellow pixel no. unsigned long XDL_greenpixel; Green pixel no. unsigned long XDL_cyanpixel; Cyan pixel no. unsigned long XDL_bluepixel; Blue pixel no. unsigned long XDL_magentapixel; Magenta pixel no.
GC XDL_active_strip_gc; GC for standard 'view-object active for input to the application' window use.
int XDL_return_data_vh; Data returned from 'active' view-object. flag = 0, none returned. > 0, the view-object handle of the view-object returning the data.
Atom XDL_paste_buffer; Atom for xdl_view cut/paste string buffers.
int XDL_tmr_events; Timer events handling in progress flag. =0 no, =1 yes
char * XDL_pointers[MAXPOINTERS]; List of string pointers. int XDL_pointers_index; Last index to pointers currently used (list used in a circular manner).
The definitions are included in the file 'xdl_view_extern.h' which should be included in all view-objects source code files.
An important part of XDL_VIEW is the X event handling mechanism. This is normally done through a call from the application program to the routine xdl_get_events (in C) or xdlf_get_events (in Fortran). When the routine is called, the user specifies a list of the view objects from which the program is ready to receive input ('active' view-objects). The routine services all the X events, passing them on to the approriate event handling routines, as defined in the XDl_view_objects array, until an event causes program input from one of the active view-objects; when this occurs, a return is made from the routine giving the view-object handle of the routine from which the input originated. The structure of the event handling routine is shown below:
Structure of the event handling routine xdl_get_events
Set XDL_return_data_vh, the data returned from view-object flag, to zero. | For each view-object in the user specified active view-objects list, call the on/off routine specified for that view-object in the XDL_view_objects array (unless a NULL) with the flag set to 'on'. | |-------------------------->| | | | Get (wait for) next X event and find the | id of the window associated with it (wid) | | | Find the offset in the XDL_view_objects | array (iv) for the view-object to which | the window belongs and the XDl_window | structure associated with the window. | | | If the event was a Configure Notify or an | Expose, then call the repaint routine for | that window (unless a NULL) as defined in | the XDL_window structure. Otherwise call | the general event handling procedure | (unless a NULL) from the XDL_window | structure. | | | Has the XDL_return_data_vh flag been set |<--No--- to a view-object handle? | | | Yes | | | Is the view-object in the list of active | view-objects (reset XDL_return_data_vh to |<--No--- zero before continuing) | Yes | For each view-object in the user specified active view-objects list, call the on/off routine specified for that view-object in the XDL_view_objects array (unless a NULL) with the flag set to 'off'. | Flush display and return the view-object handle to the calling program.
When the program is not waiting for events from a view-object and is in the middle of a long calculation, it may be desirable to call, at intervals, the routine xdl_flush_events (in C) or xdlf_flush_events (in Fortran) to service any X events currently in the event queue. This will enable 'background' activity to continue in the windows of the view-objects for events which do not give rise to program input.
Routines are also available which will handle keyboard input from the standard input stream whilst handling events xdl_getio_events (xdlf_getio_events). Their use is best avoided if possible.
Some thought has been given to the portability of the Fortran to C interface. Passing integer and real parameters seems to pose no problems. When needed, the address of a character string is passed as a parameter using a function XDLSTR to return an index to an internal table of pointers which contains the address of the character string. The string length is always passed as an additional, integer, parameter. A table relating the routine names expected by the linker to those within the C source code is set up within each view-object source code file. Two parameter definitions in a file xdl_view_systyp.h select the option to be used for the XDLSTR routine and the form of the linking name. These are CHAR_STRING_TYPE and LINKTYP. The xdl_systyp.h file also contains a few other definitions required to cope with variations in system functions available on different operating systems or versions of operating systems. The required options are set in this file for a range of machine types and others will be added as the information becomes available.
For routines, which return character strings, it may be useful to follow the example of a routine such as xdl_io_window_getstring. The routine allows for either the return of the character data into a Fortran string padded with blanks, if the 'max_len' parameter is given a negative value in the call, or into a null terminated C string, if the 'max_len' parameter is given a positive value. The xdl_copy_chars routine is available to assist such an implementation.
The original set of view-objects were written to use the five sizes of Courier fonts as set up by the the xdl_open_view initialisation routine. These fonts are available in both normal and bold print (structure pointers *XDL_fonts[5] and *XDL_bold_fonts[5]). The following default font specifications are now used within the routines:
static char *font_default[] = { "*adobe-courier-medium-r*--8*", "*adobe-courier-medium-r*--12*", "*adobe-courier-medium-r*--14*", "*adobe-courier-medium-r*--18*", "*adobe-courier-medium-r*--24*"}; /* Default fontnames */Fonts will normally be defined as X-windows resources Xdl*font1...Xdl*font5 and Xdl*boldFont1...Xdl*boldFont5. There are five normal and five bold fonts. These should normally be fixed width fonts. Each series must be in ascending size order. Bold fonts must match normal fonts to within 1 pixel in width and two in height. Some of the view-objects assume that the small font does not exceed 7x13 in pixels in size; a warning will be output if this size is exceeded.static char *font_bold_default[] = { "*adobe-courier-bold-r*--8*", "*adobe-courier-bold-r*--12*", "*adobe-courier-bold-r*--14*", "*adobe-courier-bold-r*--18*", "*adobe-courier-bold-r*--24*"}; /* Default fontnames */
The following is an example of specifing the fonts as X-windows resources:
Xdl*font1: -adobe-courier-medium-r-normal--10-100-75-75-m-60-iso8859-1 Xdl*font2: -adobe-courier-medium-r-normal--12-120-75-75-m-70-iso8859-1 Xdl*font3: -adobe-courier-medium-r-normal--14-140-75-75-m-90-iso8859-1 Xdl*font4: -adobe-courier-medium-r-normal--18-180-75-75-m-110-iso8859-1 Xdl*font5: -adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1Xdl*boldFont1: -adobe-courier-bold-r-normal--10-100-75-75-m-60-iso8859-1 Xdl*boldFont2: -adobe-courier-bold-r-normal--12-120-75-75-m-70-iso8859-1 Xdl*boldFont3: -adobe-courier-bold-r-normal--14-140-75-75-m-90-iso8859-1 Xdl*boldFont4: -adobe-courier-bold-r-normal--18-180-75-75-m-110-iso8859-1 Xdl*boldFont5: -adobe-courier-bold-r-normal--24-240-75-75-m-150-iso8859-1