diff options
Diffstat (limited to 'src/hyper/hyper.h')
-rw-r--r-- | src/hyper/hyper.h | 575 |
1 files changed, 575 insertions, 0 deletions
diff --git a/src/hyper/hyper.h b/src/hyper/hyper.h new file mode 100644 index 00000000..1a9a53e1 --- /dev/null +++ b/src/hyper/hyper.h @@ -0,0 +1,575 @@ +/* + Copyright (C) 1991-2002, The Numerical Algorithms Group Ltd. + All rights reserved. + Copyright (C) 2007-2008, Gabriel Dos Reis. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + - Neither the name of The Numerical Algorithms Group Ltd. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _HYPER_H_ +#define _HYPER_H_ 1 + +#include "axiom-c-macros.h" +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <limits.h> + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xos.h> + +#include "com.h" +#include "token.h" +#include "hash.h" + +#define boolean unsigned short int + +#ifndef TRUE +#define TRUE ((boolean) 0x1) +#endif +#ifndef FALSE +#define FALSE ((boolean) 0x0) +#endif + +/* Struct forward declarations */ + +struct text_node; +struct input_box; +struct input_window; +struct paste_node; +struct radio_boxes; +struct group_item; + +#define Scrollupbutton 1 +#define Scrolldownbutton 2 +#define Noopbutton 6 + +#define Scrolling 1 +#define Header 2 +#define Footer 3 +#define Title 4 + +#ifndef HTADD +extern int MenuServerOpened; + +/* These are all the colors one can use in HyperDoc. */ + +extern int gActiveColor, + gAxiomColor, + gBackgroundColor, + gBfColor, + gControlBackgroundColor, + gControlForegroundColor, + gEmColor, + gInputBackgroundColor, + gInputForegroundColor, + gItColor, + gRmColor, + gSlColor, + gTtColor; + +/* These are all the different fonts one can use in HyperDoc. */ + +extern XFontStruct *gActiveFont, + *gAxiomFont, + *gBfFont, + *gEmFont, + *gInputFont, + *gItFont, + *gRmFont, + *gSlFont, + *gTitleFont, + *gTtFont; + + +#endif + + +/** I am implementing a state node stack, this is the structure I store **/ + +typedef struct state_node { + int last_ch, last_token, input_type; + long fpos, keyword_fpos; + long page_start_fpos; + Token token; + char *input_string; + FILE *cfile; + int keyword; + struct state_node *next; +} StateNode; + +#ifndef HTADD +/** pointer to the top of the state node graph **/ +extern StateNode *top_state_node; +#endif + + +/* structure for a hyper text link */ +typedef struct hyper_link { + int type; /* Memolink, Spadlink, Downlink etc. */ + Window win; /* X11 window containing active area */ + union { + struct text_node *node; /* ID of link to which link refers */ + struct input_box *box; + struct input_window *string; + struct paste_node *paste; /* the paste node area */ + } reference; + int x,y; /* relative position inside page */ +} HyperLink; + + +typedef struct if_node { + struct text_node *cond; /* the condition nodes*/ + struct text_node *thennode; + struct text_node *elsenode; +} IfNode; + +typedef struct item_stack { + int indent; + int item_indent; + int in_item; + struct item_stack *next; +} ItemStack; + +typedef struct paste_node { + char *name; + int where; /* where should I be parsing from? */ + short int hasbutton; + short int haspaste; + struct group_item *group; + ItemStack *item_stack; + struct text_node *arg_node; + struct text_node *end_node; + struct text_node *begin_node; + struct input_window *paste_item; +} PasteNode; + +/* Structure for formatted hypertext */ + +typedef struct text_node { + short type; /* type of node (text, link, etc.) */ + int x,y, width, height; /* relative location on screen */ + int space; /* was there space in front of me ? */ + union { + char *text; /* piece of text to display */ + struct text_node *node; /* argument text */ + struct if_node *ifnode; + } data; + HyperLink *link; /* link for active text */ + union { + Pixmap pm; /* pixmap for bit images */ + XImage *xi; /* pixmap image */ + } image; + struct text_node *next; /* next node in formatted text */ +} TextNode; + +/** Structure used to store pixmaps and bitmaps **/ + +typedef struct image_struct { + int width,height; /** It's width and height **/ + union { + Pixmap pm; + XImage *xi; + } image; + char *filename; /** The filename used to reference it **/ +} ImageStruct; + +/* Structure for locating HyperDoc pages in a source file */ + +typedef struct { + char *name; /* file name */ + long pos; /* position in file */ + int ln; /* the line number */ +} FilePosition; + +/*** The structure needed for storing a macro **/ + +typedef struct macro_store { + short int loaded; + FilePosition fpos; + char *name; + char *macro_string; + short number_parameters; +} MacroStore; + + +/** Structure needed for storing a patch **/ +typedef struct patch_store { + short int loaded; + FilePosition fpos; + char *name; + char *string; +} PatchStore; + +/* Here are the structures needed for doing input to HyperDoc windows. */ + +typedef struct line_struct { + char *buffer; + int changed; /* Has the line changed */ + int line_number; + int buff_pntr; + int len; + struct line_struct *prev, *next; +} LineStruct; + +typedef struct input_window { + char *name; /* symbol name **/ + int size; /* the length of the window **/ + int cursor_x; /* x-coordinate for the cursor **/ + int entered; /* tells me whether I have typed here + before */ + int num_lines; /* number of lines needed to store + buffer */ + LineStruct *lines; + LineStruct *curr_line; /* the current line on which the cursor */ + Window win; + struct input_window *next; +} InputItem; + + +/* structure for storing input boxes **/ +typedef struct input_box { + char *name; + ImageStruct *selected, *unselected; + short int picked; + struct input_box *next; + struct radio_boxes *rbs; + Window win; +} InputBox; + +typedef struct radio_boxes { + char *name; + InputBox *boxes; + ImageStruct *selected, *unselected; + int width, height; + struct radio_boxes *next; +} RadioBoxes; + +/* Structure for spadcommand dependencies hash table entries */ +typedef struct spadcom_depend { + char *label; /* dependency label */ + TextNode *spadcom; /* spadcommand defining the label */ + short executed; /* true iff spadcommand has benn executed */ +} SpadcomDepend; + +typedef struct button_list { + int x0,y0,x1,y1; + HyperLink *link; + Window win; + struct button_list *next; +} ButtonList; + +/* Stucture for unformatted hyper text page */ + +typedef struct hyperdoc_page { + short type; /* Normal, Quitbutton, Upbutton etc. */ + char *name; /* ID of page */ + char *filename; /* The name of the file in which the page + occurs, Null if not */ + int scroll_off; /* The offset in the scrolling region */ + int bot_scroll_margin; /* bottom of the scrolling region */ + int top_scroll_margin; /* top of the scrolling region */ + TextNode *title; /* the title of the page */ + TextNode *header; /* formatted version of page */ + TextNode *scrolling; /* Top of scrolling region */ + TextNode *footer; /* top of non-scrolling region at bottom */ + Sock *sock; /* socket connection for spad buffer */ + HashTable *fLinkHashTable; /* active link hash table */ + ButtonList *s_button_list; /* active buttons on page */ + ButtonList *button_list; /* active buttons on page */ + HashTable *depend_hash; /* Hash tables of spadcommand dependencies */ + InputItem *input_list; /* List of input structures */ + InputItem *current_item; /* a pntr to the currently active item */ + HashTable *box_hash; /* place where all the boxes are stored */ + RadioBoxes *radio_boxes; /* a linked list of radio boxes */ + short page_flags; /* A list of flags for the page */ + char *helppage; /* the name of the helppage */ +} HyperDocPage; + +/* Structure for an unloaded page */ + +typedef struct unloaded_page { + short type; /* indicator of unloaded page */ + char *name; /* name of page */ + FilePosition fpos; /* where to find the page */ +} UnloadedPage; + +/* Structure for a HyperDoc Window */ + +typedef struct { + Window fMainWindow; /* The main text field window. */ + Window fScrollWindow; /* The scrolling area of the window */ + Window fDisplayedWindow; /* The current window of the above two, */ + /* being filled by display */ + + Window fScrollUpWindow; /* Window for scrolling up a line */ + Window fScrollDownWindow; /* Window for scrolling down a line */ + + Window scrollbar; /* the window for scrolling */ + Window scroller; /* the scroller window */ + + Window fTitleBarButton1; /* 1st titlebar bitmap button */ + Window fTitleBarButton2; /* 2nd titlebar bitmap button */ + Window fTitleBarButton3; /* 3rd titlebar bitmap button */ + Window fTitleBarButton4; /* 4th titlebar bitmap button */ + + int fScrollerTopPos; /* where the top of the scroller is */ + int fScrollerHeight; /* the height of the scroller */ + int fScrollBarHeight; /* the height for the scrollbar */ + + int scrollwidth; /* the width of the scrolling area */ + int scrollheight; /* the height of the scrolling area */ + int scrollupy; /* Current y position of the scroll up */ + /* button */ + int scrolldowny; /* Current y position of the scroll */ + /* downbutton */ + int scrollbary; /* Current y position of teh scrollbar */ + int scrollx; /* X coordinates for all of the above */ + int border_width; /* Width of the border */ + HyperDocPage *page; /* currently displayed page */ + int width, height; /* in pixels */ + int columns; /* Width in characters, only setable */ + /* for form pages */ + HyperDocPage **fMemoStack; /* stack of memo links */ + HyperDocPage **fDownLinkStack;/* stack of down links */ + + int *fDownLinkStackTop; /* stack of down links */ + int fMemoStackIndex; /* memo stack pointer */ + int fDownLinkStackIndex; /* downlink stack pointer */ + + HashTable *fWindowHashTable; /* hash table of active subwindows */ + HashTable *fPageHashTable; /* hash table of HyperDoc pages */ + HashTable *fPasteHashTable; /* hash table for paste in areas */ + HashTable *fMacroHashTable; /* hash table of HyperDoc macros */ + HashTable *fCondHashTable; /* hash table for values */ + HashTable *fPatchHashTable; /* hash table for patch locations */ + + int fAxiomFrame; /* Axiom frame number initializing window */ + GC fStandardGC; /* Graphics context for window */ + GC fInputGC; /* Graphics context for the input windows */ + GC fCursorGC; /* Graphics context for the cursors */ + GC fControlGC; /* Graphics context for the buttons */ + Cursor fDisplayedCursor; /* The currently displayed cursor */ +} HDWindow; + +/* Structure for identifying appropriate link hash tables */ + +typedef struct { + int code; /* code of active area */ + HyperDocPage *page; /* page for which hash table applies */ +} LinkHashID; + +/*** Flags for the page ***/ + +#define NOLINES 0000001 /* Ibid, for the bottom of the page ***/ + + +/* external variables and functions. See the source file for a description + of their purposes */ + +extern HashTable gSessionHashTable; /* hash table of HD windows */ + +extern HDWindow *gParentWindow; /* the parent window. The one that + * appears when you first start HD */ + +extern HyperLink *quitLink; /** a special link to the protected quit page **/ + + +#ifndef HTADD +/* From hyper.c */ +extern int gXScreenNumber; +extern Display *gXDisplay; +extern int gSwitch_to_mono; +extern unsigned long * spadColors; +extern int gIsEndOfOutput; +extern HDWindow *gWindow; +extern Sock *session_server; +extern Sock *spad_socket; +extern HashTable gFileHashTable; +extern HashTable gImageHashTable; /* A global hash table for images */ +extern Cursor gNormalCursor; /* The normal mouse cursor */ +extern Cursor gActiveCursor; /* The cursor in active regions */ +extern Cursor gBusyCursor; /* The clock cursor for when I am busy */ +extern int gIsAxiomServer; /* true iff HyperDoc is acting as an Axiom server */ +extern int gArgc; /* original argc from main */ +extern char **gArgv; /* original argv from main */ +/* from lex.c */ +extern long fpos, keyword_fpos; +extern Token token; +extern int last_token, input_type, last_ch; +extern char *input_string; +extern FILE *cfile; +/* from input.c */ +extern XImage *picked; +extern int picked_height; +extern int picked_width; +extern XImage *unpicked; +extern int unpicked_height; +extern int unpicked_width; +/* from display.c */ +extern int line_height; +extern int need_scroll_up_button; +extern int scrolling; +extern int need_scroll_down_button; +extern int space_width; +#endif + +/* Here are some of the functions and constants declared and needed in + htadd.c ******/ + +#define NoChar -9999 +#define temp_dir "/tmp/" +#define db_file_name "ht.db" +#define def_spad "/usr/local/axiom" + + +/* Types of HyperDoc pages */ + +#define UlUnknownPage 9993 /*I hate this hack, but I have to know whether*/ +#define UnknownPage 9994 /*this page has been loaded or not. */ +#define ErrorPage 9995 +#define Unixfd 9996 +#define SpadGen 9997 +#define Normal 9998 +#define UnloadedPageType 9999 + +/* Commands from Axiom */ + +#define EndOfPage 99 +#define SendLine 98 +#define StartPage 97 /* A normal HyperDoc page */ +#define LinkToPage 96 +#define PopUpPage 95 /* A pop-up page */ +#define PopUpNamedPage 94 +#define KillPage 93 +#define ReplacePage 92 +#define ReplaceNamedPage 91 +#define SpadError 90 + +/* Constants declaring size of page stacks */ + +#define MaxMemoDepth 25 /* max nesting level for memolinks */ +#define MaxDownlinkDepth 50 /* max downlink nesting depth */ + +/* Constants defining the size of various hash tables */ + +#define PageHashSize 1000 +#define FileHashSize 30 +#define SessionHashSize 10 +#define MacroHashSize 100 +#define ImageHashSize 100 +#define CondHashSize 100 +#define BoxHashSize 20 +#define PasteHashSize 100 +#define PatchHashSize 100 + +/* A couple of macros for memo and down links */ + +#define need_up_button \ + (gWindow->fMemoStackIndex ? gWindow->fDownLinkStackIndex >= \ + gWindow->fDownLinkStackTop[gWindow->fMemoStackIndex-1] \ + : gWindow->fDownLinkStackIndex) + +#define need_return_button (gWindow->fMemoStackIndex) + +#define need_help_button (gWindow->page->helppage != NULL) + +#define max(x,y) ((x) > (y) ? (x) : (y)) + + +#define pick_box(box) fill_box(box->win, box->selected) +#define unpick_box(box) fill_box(box->win, box->unselected) + +#define TopLevelHelpPage "ugHyperPage" +#define NoMoreHelpPage "NoMoreHelpPage" +#define KeyDefsHelpPage "ugHyperKeysPage" +#define InputAreaHelpPage "ugHyperInputPage" + +/* definitions for connecting to the Axiom server */ + +#define Connected 0 +#define NotConnected 1 +#define SpadBusy 2 + +/* some GUI-dependent stuff */ + +#define BeepAtTheUser() /* (XBell(gXDisplay, 5)) */ +#define LoudBeepAtTheUser() /* (XBell(gXDisplay, 50)) */ + + +/*** default fonts ***/ + +#if defined(RTplatform) || defined(PS2platform) || defined(RIOSplatform) || defined(AIX370platform) +#define RmFontDefault "Rom14" +#define TtFontDefault "Erg14" +#define ActiveFontDefault "Bld14" +#define AxiomFontDefault "Erg14" +#define EmphasizeFontDefault "Itl14" +#define BoldFontDefault "Bld14" +#endif + +#if defined(SUNplatform) || defined (SUN4OS5platform) || defined(SGIplatform) || defined (HP9platform) || defined(HP10platform) || defined (ALPHAplatform) || defined(LINUXplatform) || defined(MACOSXplatform) || defined(BSDplatform) +#define RmFontDefault "-adobe-courier-medium-r-normal--18-*-*-*-m-*-iso8859-1" +#define TtFontDefault "-adobe-courier-medium-r-normal--18-*-*-*-m-*-iso8859-1" +#define ActiveFontDefault "-adobe-courier-bold-r-normal--18-*-*-*-m-*-iso8859-1" +#define AxiomFontDefault "-adobe-courier-bold-o-normal--18-*-*-*-m-*-iso8859-1" +#define EmphasizeFontDefault "-adobe-courier-medium-o-normal--18-*-*-*-m-*-iso8859-1" +#define BoldFontDefault "-adobe-courier-bold-r-normal--18-*-*-*-m-*-iso8859-1" +#endif + + + + + + +typedef struct group_item { + int cur_color; + XFontStruct *cur_font; + int center; + struct group_item *next; +} GroupItem; + + +extern GroupItem *gTopOfGroupStack; + + +typedef struct cond_node { + char *label; + char *cond; +} CondNode; + +typedef struct parameter_list_type { + char **list; /** The parameters in string form **/ + short number; /** How many parameters are there **/ + struct parameter_list_type *next; +} *ParameterList; + +#endif |