diff options
Diffstat (limited to 'src/h/graphics.h')
-rw-r--r-- | src/h/graphics.h | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/src/h/graphics.h b/src/h/graphics.h new file mode 100644 index 0000000..fa56f79 --- /dev/null +++ b/src/h/graphics.h @@ -0,0 +1,447 @@ +/* + * graphics.h - macros and types used in Icon's graphics interface. + */ + +#ifdef XWindows + #include "../h/xwin.h" +#endif /* XWindows */ + +#ifdef WinGraphics + #include "../h/mswin.h" +#endif /* WinGraphics */ + +#ifndef MAXXOBJS + #define MAXXOBJS 256 +#endif /* MAXXOBJS */ + +#ifndef MAXCOLORNAME + #define MAXCOLORNAME 40 +#endif /* MAXCOLORNAME */ + +#ifndef MAXFONTWORD + #define MAXFONTWORD 40 +#endif /* MAXFONTWORD */ + +#define POLLSLEEP 20 /* milliseconds sleep while awaiting event */ + +#define DEFAULTFONTSIZE 14 + +#define FONTATT_SPACING 0x01000000 +#define FONTFLAG_MONO 0x00000001 +#define FONTFLAG_PROPORTIONAL 0x00000002 + +#define FONTATT_SERIF 0x02000000 +#define FONTFLAG_SANS 0x00000004 +#define FONTFLAG_SERIF 0x00000008 + +#define FONTATT_SLANT 0x04000000 +#define FONTFLAG_ROMAN 0x00000010 +#define FONTFLAG_ITALIC 0x00000020 +#define FONTFLAG_OBLIQUE 0x00000040 + +#define FONTATT_WEIGHT 0x08000000 +#define FONTFLAG_LIGHT 0x00000100 +#define FONTFLAG_MEDIUM 0x00000200 +#define FONTFLAG_DEMI 0x00000400 +#define FONTFLAG_BOLD 0x00000800 + +#define FONTATT_WIDTH 0x10000000 +#define FONTFLAG_CONDENSED 0x00001000 +#define FONTFLAG_NARROW 0x00002000 +#define FONTFLAG_NORMAL 0x00004000 +#define FONTFLAG_WIDE 0x00008000 +#define FONTFLAG_EXTENDED 0x00010000 + +/* + * EVENT HANDLING + * + * Each window keeps an associated queue of events waiting to be + * processed. The queue consists of <eventcode,x,y> triples, + * where eventcodes are strings for normal keyboard events, and + * integers for mouse and special keystroke events. + * + * The main queue is an icon list. In addition, there is a queue of + * old keystrokes maintained for cooked mode operations, maintained + * in a little circular array of chars. + */ +#define EQ_MOD_CONTROL (1L<<16L) +#define EQ_MOD_META (1L<<17L) +#define EQ_MOD_SHIFT (1L<<18L) + +#define EVQUESUB(w,i) *evquesub(w,i) +#define EQUEUELEN 256 + +/* + * mode bits for the Icon window context (as opposed to X context) + */ + +#define ISINITIAL(w) ((w)->window->bits & 1) +#define ISINITIALW(ws) ((ws)->bits & 1) +#define ISCURSORON(w) ((w)->window->bits & 2) +#define ISCURSORONW(ws) ((ws->bits) & 2) +#define ISMAPPED(w) ((w)->window->bits & 4) +#define ISREVERSE(w) ((w)->context->bits & 8) +#define ISXORREVERSE(w) ((w)->context->bits & 16) +#define ISXORREVERSEW(w) ((w)->bits & 16) +#define ISCLOSED(w) ((w)->window->bits & 64) +#define ISRESIZABLE(w) ((w)->window->bits & 128) +#define ISEXPOSED(w) ((w)->window->bits & 256) +#define ISCEOLON(w) ((w)->window->bits & 512) +#define ISECHOON(w) ((w)->window->bits & 1024) + +#define SETCURSORON(w) ((w)->window->bits |= 2) +/* 4 is available */ +#define SETMAPPED(w) ((w)->window->bits |= 4) +#define SETREVERSE(w) ((w)->context->bits |= 8) +#define SETXORREVERSE(w) ((w)->context->bits |= 16) +#define SETCLOSED(w) ((w)->window->bits |= 64) +#define SETRESIZABLE(w) ((w)->window->bits |= 128) +#define SETEXPOSED(w) ((w)->window->bits |= 256) +#define SETCEOLON(w) ((w)->window->bits |= 512) +#define SETECHOON(w) ((w)->window->bits |= 1024) + +#define CLRCURSORON(w) ((w)->window->bits &= ~2) +#define CLRMAPPED(w) ((w)->window->bits &= ~4) +#define CLRREVERSE(w) ((w)->context->bits &= ~8) +#define CLRXORREVERSE(w) ((w)->context->bits &= ~16) +#define CLRCLOSED(w) ((w)->window->bits &= ~64) +#define CLRRESIZABLE(w) ((w)->window->bits &= ~128) +#define CLREXPOSED(w) ((w)->window->bits &= ~256) +#define CLRCEOLON(w) ((w)->window->bits &= ~512) +#define CLRECHOON(w) ((w)->window->bits &= ~1024) + +#ifdef XWindows + #define ISZOMBIE(w) ((w)->window->bits & 1) + #define SETZOMBIE(w) ((w)->window->bits |= 1) + #define CLRZOMBIE(w) ((w)->window->bits &= ~1) +#endif /* XWindows */ + +#ifdef WinGraphics + #define ISTOBEHIDDEN(ws) ((ws)->bits & 4096) + #define SETTOBEHIDDEN(ws) ((ws)->bits |= 4096) + #define CLRTOBEHIDDEN(ws) ((ws)->bits &= ~4096) +#endif /* WinGraphics */ + +/* + * Window Resources + * Icon "Resources" are a layer on top of the window system resources, + * provided in order to facilitate resource sharing and minimize the + * number of calls to the window system. Resources are reference counted. + * These data structures are simple sets of pointers + * into internal window system structures. + */ + +/* + * Fonts are allocated within displays. + */ +typedef struct _wfont { + int refcount; + int serial; /* serial # */ + struct _wfont *previous, *next; + char *name; /* name for WAttrib and fontsearch */ + + #ifdef XWindows + int height; /* font height */ + XFontStruct *fsp; /* X font pointer */ + #endif /* XWindows */ + + #ifdef WinGraphics + HFONT font; + LONG ascent; + LONG descent; + LONG charwidth; + LONG height; + #endif /* WinGraphics */ + + } wfont, *wfp; + +/* + * These structures and definitions are used for colors and images. + */ +typedef struct { + long red, green, blue; /* color components, linear 0 - 65535*/ + } LinearColor; + +struct palentry { /* entry for one palette member */ + LinearColor clr; /* RGB value of color */ + char used; /* nonzero if char is used */ + char valid; /* nonzero if entry is valid & opaque */ + char transpt; /* nonzero if char is transparent */ + }; + +struct imgdata { /* image loaded from a file */ + int width, height; /* image dimensions */ + struct palentry *paltbl; /* pointer to palette table */ + unsigned char *data; /* pointer to image data */ + }; + +struct imgmem { + int x, y, width, height; + + #ifdef XWindows + XImage *im; + #endif /* XWindows */ + + #ifdef WinGraphics + COLORREF *crp; + #endif /* WinGraphics */ + }; + +#define TCH1 '~' /* usual transparent character */ +#define TCH2 0377 /* alternate transparent character */ +#define PCH1 ' ' /* punctuation character */ +#define PCH2 ',' /* punctuation character */ + +#define GIFMAX 256 /* maximum colors in a GIF file */ + +#ifdef XWindows +/* + * Displays are maintained in a global list in rwinrsc.r. + */ +typedef struct _wdisplay { + int refcount; + int serial; /* serial # */ + char name[MAXDISPLAYNAME]; + Display * display; + Visual * visual; + GC icongc; + Colormap cmap; + double gamma; + int screen; + int numFonts; + wfp fonts; + int numColors; /* number of allocated color structs */ + int cpSize; /* max number of slots before realloc */ + struct wcolor **colrptrs; /* array of pointers to those colors */ + Cursor cursors[NUMCURSORSYMS]; + struct _wdisplay *previous, *next; + } *wdp; +#endif /* XWindows */ + +/* + * "Context" comprises the graphics context, and the font (i.e. text context). + * Foreground and background colors (pointers into the display color table) + * are stored here to reduce the number of window system queries. + * Contexts are allocated out of a global array in rwinrsrc.c. + */ +typedef struct _wcontext { + int refcount; + int serial; /* serial # */ + struct _wcontext *previous, *next; + int clipx, clipy, clipw, cliph; + char *patternname; + wfp font; + int dx, dy; + int fillstyle; + int drawop; + double gamma; /* gamma correction value */ + int bits; /* context bits */ + + #ifdef XWindows + wdp display; + GC gc; /* X graphics context */ + wclrp fg, bg; + int linestyle; + int linewidth; + int leading; /* inter-line leading */ + #endif /* XWindows */ + + #ifdef WinGraphics + LOGPEN pen; + LOGPEN bgpen; + LOGBRUSH brush; + LOGBRUSH bgbrush; + HRGN cliprgn; + HBITMAP pattern; + SysColor fg, bg; + char *fgname, *bgname; + int leading, bkmode; + #endif /* WinGraphics*/ + + } wcontext, *wcp; + +/* + * Native facilities include the following child controls (windows) that + * persist on the canvas and intercept various events. + */ +#ifdef WinGraphics + #define CHILD_BUTTON 0 + #define CHILD_SCROLLBAR 1 + #define CHILD_EDIT 2 + typedef struct childcontrol { + int type; /* what kind of control? */ + HWND win; /* child window handle */ + HFONT font; + char *id; /* child window string id */ + } childcontrol; +#endif /* WinGraphics */ + +/* + * "Window state" includes the actual X window and references to a large + * number of resources allocated on a per-window basis. Windows are + * allocated out of a global array in rwinrsrc.c. Windows remember the + * first WMAXCOLORS colors they allocate, and deallocate them on clearscreen. + */ +typedef struct _wstate { + int refcount; /* reference count */ + int serial; /* serial # */ + struct _wstate *previous, *next; + int pixheight; /* backing pixmap height, in pixels */ + int pixwidth; /* pixmap width, in pixels */ + char *windowlabel; /* window label */ + char *iconimage; /* icon pixmap file name */ + char *iconlabel; /* icon label */ + struct imgdata initimage; /* initial image data */ + struct imgdata initicon; /* initial icon image data */ + int y, x; /* current cursor location, in pixels*/ + int pointery, pointerx; /* current mouse location, in pixels */ + int posy, posx; /* desired upper lefthand corner */ + unsigned int height; /* window height, in pixels */ + unsigned int width; /* window width, in pixels */ + int bits; /* window bits */ + int theCursor; /* index into cursor table */ + word timestamp; /* last event time stamp */ + char eventQueue[EQUEUELEN]; /* queue of cooked-mode keystrokes */ + int eQfront, eQback; + char *cursorname; + struct descrip filep, listp; /* icon values for this window */ + + #ifdef XWindows + wdp display; + Window win; /* X window */ + Pixmap pix; /* current screen state */ + Pixmap initialPix; /* an initial image to display */ + Window iconwin; /* icon window */ + Pixmap iconpix; /* icon pixmap */ + int normalx, normaly; /* pos to remember when maximized */ + int normalw, normalh; /* size to remember when maximized */ + int numColors; /* allocated color info */ + short *theColors; /* indices into display color table */ + int numiColors; /* allocated color info for the icon */ + short *iconColors; /* indices into display color table */ + int iconic; /* window state; icon, window or root*/ + int iconx, icony; /* location of icon */ + unsigned int iconw, iconh; /* width and height of icon */ + long wmhintflags; /* window manager hints */ + #endif /* XWindows */ + + #ifdef WinGraphics + HWND win; /* client window */ + HWND iconwin; /* client window when iconic */ + HBITMAP pix; /* backing bitmap */ + HBITMAP iconpix; /* backing bitmap */ + HBITMAP initialPix; /* backing bitmap */ + HBITMAP theOldPix; + int hasCaret; + HCURSOR curcursor; + HCURSOR savedcursor; + HMENU menuBar; + int nmMapElems; + char ** menuMap; + HWND focusChild; + int nChildren; + childcontrol *child; + #endif /* WinGraphics */ + + } wstate, *wsp; + +/* + * Icon window file variables are actually pointers to "bindings" + * of a window and a context. They are allocated out of a global + * array in rwinrsrc.c. There is one binding per Icon window value. + */ +typedef struct _wbinding { + int refcount; + int serial; + struct _wbinding *previous, *next; + wcp context; + wsp window; + } wbinding, *wbp; + +/* + * Table entry for string <-> integer mapping. + */ +typedef struct { + char *s; + int i; + } stringint, *siptr; + + +/* + * Gamma Correction value to compensate for nonlinear monitor color response + */ +#ifndef GammaCorrection + #define GammaCorrection 2.5 +#endif /* GammaCorrection */ + +/* + * Attributes + */ +#define A_ASCENT 1 +#define A_BG 2 +#define A_CANVAS 3 +#define A_CEOL 4 +#define A_CLIPH 5 +#define A_CLIPW 6 +#define A_CLIPX 7 +#define A_CLIPY 8 +#define A_COL 9 +#define A_COLUMNS 10 +#define A_CURSOR 11 +#define A_DEPTH 12 +#define A_DESCENT 13 +#define A_DISPLAY 14 +#define A_DISPLAYHEIGHT 15 +#define A_DISPLAYWIDTH 16 +#define A_DRAWOP 17 +#define A_DX 18 +#define A_DY 19 +#define A_ECHO 20 +#define A_FG 21 +#define A_FHEIGHT 22 +#define A_FILLSTYLE 23 +#define A_FONT 24 +#define A_FWIDTH 25 +#define A_GAMMA 26 +#define A_GEOMETRY 27 +#define A_HEIGHT 28 +#define A_ICONIC 29 +#define A_ICONIMAGE 30 +#define A_ICONLABEL 31 +#define A_ICONPOS 32 +#define A_IMAGE 33 +#define A_LABEL 34 +#define A_LEADING 35 +#define A_LINES 36 +#define A_LINESTYLE 37 +#define A_LINEWIDTH 38 +#define A_PATTERN 39 +#define A_POINTERCOL 40 +#define A_POINTERROW 41 +#define A_POINTERX 42 +#define A_POINTERY 43 +#define A_POINTER 44 +#define A_POS 45 +#define A_POSX 46 +#define A_POSY 47 +#define A_RESIZE 48 +#define A_REVERSE 49 +#define A_ROW 50 +#define A_ROWS 51 +#define A_SIZE 52 +#define A_VISUAL 53 +#define A_WIDTH 54 +#define A_WINDOWLABEL 55 +#define A_X 56 +#define A_Y 57 + +#define NUMATTRIBS 57 + +/* + * flags for ConsoleFlags + */ +/* I/O redirection flags */ +#define StdOutRedirect 1 +#define StdErrRedirect 2 +#define StdInRedirect 4 +#define OutputToBuf 8 |