Difference between revisions of "Professional GEM - Appendices"
| Line 1: | Line 1: | ||
| − | + | {{Professional GEM}} | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | ==Appendix I - Sample redraw code== | ||
| + | <pre> | ||
/* >>>>>>>>>>>>>>>>>>>>>>>>> Sample Redraw Code <<<<<<<<<<<<<<<<<<<<<<<<<<< */ | /* >>>>>>>>>>>>>>>>>>>>>>>>> Sample Redraw Code <<<<<<<<<<<<<<<<<<<<<<<<<<< */ | ||
| Line 48: | Line 43: | ||
} | } | ||
| + | </pre> | ||
| + | ==Appendix I - Utilities used in doredraw== | ||
| − | + | ||
| − | + | <pre> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
/* >>>>>>>>>>>>>>>>>>>>>>>> Utilities used in doredraw <<<<<<<<<<<<<<<<<<<< */ | /* >>>>>>>>>>>>>>>>>>>>>>>> Utilities used in doredraw <<<<<<<<<<<<<<<<<<<< */ | ||
| Line 106: | Line 92: | ||
} | } | ||
| + | </pre> | ||
| + | ==Appendix I - "Self-redraw" Utility== | ||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>>>>> "Self-redraw" Utility <<<<<<<<<<<<<<<<<<<<<<<<< */ | ||
| − | + | VOID | |
| − | + | sendredraw(wh, p) | |
| − | + | WORD wh; | |
| − | + | GRECT *p; | |
| − | + | { | |
| − | + | WORD msg[8]; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | VOID | ||
| − | sendredraw(wh, p) | ||
| − | WORD wh; | ||
| − | GRECT *p; | ||
| − | { | ||
| − | WORD msg[8]; | ||
msg[0] = WMREDRAW; /* Defined in GEMBIND.H */ | msg[0] = WMREDRAW; /* Defined in GEMBIND.H */ | ||
| Line 145: | Line 120: | ||
} | } | ||
| + | </pre> | ||
| + | ==Appendix I - Utilities for Window Requests== | ||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>> Utilities for Window Requests <<<<<<<<<<<<<<<<<< */ | ||
| + | VOID | ||
| + | rcconstrain(pc, pt) | ||
| + | GRECT *pc; | ||
| + | GRECT *pt; | ||
| + | { | ||
| + | if (pt->gx < pc->gx) | ||
| + | pt->gx = pc->gx; | ||
| + | if (pt->gy < pc->gy) | ||
| + | pt->gy = pc->gy; | ||
| + | if ((pt->gx + pt->gw) > (pc->gx + pc->gw)) | ||
| + | pt->gx = (pc->gx + pc->gw) - pt->gw; | ||
| + | if ((pt->gy + pt->gh) > (pc->gy + pc->gh)) | ||
| + | pt->gy = (pc->gy + pc->gh) - pt->gh; | ||
| + | } | ||
| + | WORD | ||
| + | align(x,n) /* Snap position x to an n-bit grid */ | ||
| + | WORD x, n; /* Use n = 16 for horizontal word alignment */ | ||
| + | { | ||
| + | x += (n >> 2) - 1; /* Round and... */ | ||
| + | x = n * (x / n); /* remove residue */ | ||
| + | return (x); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix I - Window full utility== | ||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>>>>> Window full utility <<<<<<<<<<<<<<<<<<<<<<< */ | ||
| + | VOID | ||
| + | hndlfull(wh) /* depending on current window state, make window */ | ||
| + | WORD wh; /* full size -or- return to previous shrunken size */ | ||
| + | { /* graf calls are optional special effects. */ | ||
| + | GRECT prev; | ||
| + | GRECT curr; | ||
| + | GRECT full; | ||
| + | windget(wh, WFCXYWH, &curr.gx, &curr.gy, &curr.gw, &curr.gh); | ||
| + | windget(wh, WFPXYWH, &prev.gx, &prev.gy, &prev.gw, &prev.gh); | ||
| + | windget(wh, WFFXYWH, &full.gx, &full.gy, &full.gw, &full.gh); | ||
| + | if ( rcequal(&curr, &full) ) | ||
| + | { /* Is full, change to previous */ | ||
| + | grafshrinkbox(prev.gx, prev.gy, prev.gw, prev.gh, | ||
| + | full.gx, full.gy, full.gw, full.gh); | ||
| + | windset(wh, WFCXYWH, prev.gx, prev.gy, prev.gw, prev.gh); | ||
| + | /* put sendredraw here if you need it */ | ||
| + | } | ||
| + | else | ||
| + | { /* is not full, so set to full */ | ||
| + | grafgrowbox(curr.gx, curr.gy, curr.gw, curr.gh, | ||
| + | full.gx, full.gy, full.gw, full.gh); | ||
| + | windset(wh, WFCXYWH, full.gx, full.gy, full.gw, full.gh); | ||
| + | } | ||
| + | } | ||
| + | WORD | ||
| + | rcequal(p1, p2) /* tests for two rectangles equal */ | ||
| + | GRECT *p1, *p2; | ||
| + | { | ||
| + | if ((p1->gx != p2->gx) || | ||
| + | (p1->gy != p2->gy) || | ||
| + | (p1->gw != p2->gw) || | ||
| + | (p1->gh != p2->gh)) | ||
| + | return(FALSE); | ||
| + | return(TRUE); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix II - Basic Dialog Handler== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>> Basic Dialog Handler <<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | WORD | ||
| + | hndldial(tree, def, x, y, w, h) | ||
| + | LONG tree; | ||
| + | WORD def; | ||
| + | WORD x, y, w, h; | ||
| + | { | ||
| + | WORD xdial, ydial, wdial, hdial, exitobj; | ||
| + | formcenter(tree, &xdial, &ydial, &wdial, &hdial); | ||
| + | formdial(0, x, y, w, h, xdial, ydial, wdial, hdial); | ||
| + | formdial(1, x, y, w, h, xdial, ydial, wdial, hdial); | ||
| + | objcdraw(tree, ROOT, MAXDEPTH, xdial, ydial, wdial, hdial); | ||
| + | exitobj = formdo(tree, def) & 0x7FFF; | ||
| + | formdial(2, x, y, w, h, xdial, ydial, wdial, hdial); | ||
| + | formdial(3, x, y, w, h, xdial, ydial, wdial, hdial); | ||
| + | return (exitobj); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix II - Object rectangle utility== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>> Object rectangle utility <<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | VOID | ||
| + | objcxywh(tree, obj, p) /* get x,y,w,h for specified object */ | ||
| + | LONG tree; | ||
| + | WORD obj; | ||
| + | GRECT *p; | ||
| + | { | ||
| + | objcoffset(tree, obj, &p->gx, &p->gy); | ||
| + | p->gw = LWGET(OBWIDTH(obj)); | ||
| + | p->gh = LWGET(OBHEIGHT(obj)); | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | ==Appendix II - Object flag utilities== | ||
| − | + | <pre> | |
| − | + | ||
| − | + | /* | |
| − | + | >>>>>>>>>>>>>>>>>>>>>>> Object flag utilities <<<<<<<<<<<<<<<<<<<<<<<<<<< | |
| − | + | */ | |
| − | |||
| − | |||
VOID | VOID | ||
| − | + | undoobj(tree, which, bit) /* clear specified bit in object state */ | |
| − | + | LONG tree; | |
| − | + | WORD which, bit; | |
{ | { | ||
| − | + | WORD state; | |
| − | + | ||
| − | + | state = LWGET(OBSTATE(which)); | |
| − | + | LWSET(OBSTATE(which), state & ~bit); | |
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | + | VOID | |
| − | + | deselobj(tree, which) /* turn off selected bit of spcfd object*/ | |
| − | WORD | + | LONG tree; |
| + | WORD which; | ||
{ | { | ||
| − | + | undoobj(tree, which, SELECTED); | |
| − | + | } | |
| − | |||
| − | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | VOID | ||
| + | doobj(tree, which, bit) /* set specified bit in object state */ | ||
| + | LONG tree; | ||
| + | WORD which, bit; | ||
| + | { | ||
| + | WORD state; | ||
| + | state = LWGET(OBSTATE(which)); | ||
| + | LWSET(OBSTATE(which), state | bit); | ||
| + | } | ||
| + | VOID | ||
| + | selobj(tree, which) /* turn on selected bit of spcfd object */ | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | { | ||
| + | doobj(tree, which, SELECTED); | ||
| + | } | ||
| + | BOOLEAN | ||
| + | statep(tree, which, bit) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | WORD bit; | ||
| + | { | ||
| + | return ( (LWGET(OBSTATE(which)) & bit) != 0); | ||
| + | } | ||
| + | BOOLEAN | ||
| + | selectp(tree, which) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | { | ||
| + | return statep(tree, which, SELECTED); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix II - Sample radio buttons after dialog== | ||
| + | |||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>> Sample radio buttons after dialog <<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | WORD | ||
| + | encode(tree, ob1st, num) | ||
| + | LONG tree; | ||
| + | WORD ob1st, num; | ||
| + | { | ||
| + | for (; num--; ) | ||
| + | if (selectp(ob1st+num)) | ||
| + | return(num); | ||
| + | return (-1); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix III - Sample C output file from RCS== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>> Sample C output file from RCS <<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | /* (Comments added) */ | ||
| + | BYTE *rsstrings[] = { /* ASCII data */ | ||
| + | "Title String", | ||
| + | "Exit", | ||
| + | "Centered Text", | ||
| + | "", | ||
| + | "", | ||
| + | "Butt", | ||
| + | "Tokyo", | ||
| + | "", | ||
| + | "Time: _:_:_", | ||
| + | "999999", | ||
| + | "", | ||
| + | "Time: _:_:_ ", | ||
| + | "999999", | ||
| + | "New York"}; | ||
| − | + | WORD IMAG0[] = { /* Bitmap for GIMAGE */ | |
| − | + | 0x7FF, 0xFFFF, 0xFF80, 0xC00, | |
| − | + | 0x0, 0xC0, 0x183F, 0xF03F, | |
| − | + | 0xF060, 0x187F, 0xF860, 0x1860, | |
| − | + | 0x187F, 0xF860, 0x1860, 0x187F, | |
| − | + | 0xF860, 0x1860, 0x187F, 0xF860, | |
| − | + | 0x1860, 0x187F, 0xF860, 0x1860, | |
| − | + | 0x187F, 0xF860, 0x1860, 0x187F, | |
| − | + | 0xF860, 0x1860, 0x187F, 0xF860, | |
| − | + | 0x1860, 0x187F, 0xF860, 0x1860, | |
| − | + | 0x187F, 0xF860, 0x1860, 0x187F, | |
| − | + | 0xF860, 0x1860, 0x183F, 0xF03F, | |
| − | + | 0xF060, 0xC00, 0x0, 0xC0, | |
| − | + | 0x7FF, 0xFFFF, 0xFF80, 0x0, | |
| − | + | 0x0, 0x0, 0x3F30, 0xC787, | |
| − | + | 0x8FE0, 0xC39, 0xCCCC, 0xCC00, | |
| − | + | 0xC36, 0xCFCC, 0xF80, 0xC30, | |
| − | + | 0xCCCD, 0xCC00, 0x3F30, 0xCCC7, | |
| − | + | 0xCFE0, 0x0, 0x0, 0x0}; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | WORD IMAG1[] = { /* Mask for first icon */ | ||
| + | 0x0, 0x0, 0x0, 0x0, | ||
| + | 0x7FFE, 0x0, 0x1F, 0xFFFF, | ||
| + | 0xFC00, 0xFF, 0xFFFF, 0xFF00, | ||
| + | 0x3FF, 0xFFFF, 0xFFC0, 0xFFF, | ||
| + | 0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF, | ||
| + | 0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0xFFF, 0xFFFF, 0xFFF0, | ||
| + | 0x3FF, 0xFFFF, 0xFFC0, 0xFF, | ||
| + | 0xFFFF, 0xFF00, 0x1F, 0xFFFF, | ||
| + | 0xF800, 0x0, 0x7FFE, 0x0}; | ||
| + | WORD IMAG2[] = { /* Data for first icon */ | ||
| + | 0x0, 0x0, 0x0, 0x0, | ||
| + | 0x3FFC, 0x0, 0xF, 0xC003, | ||
| + | 0xF000, 0x78, 0x180, 0x1E00, | ||
| + | 0x180, 0x180, 0x180, 0x603, | ||
| + | 0x180, 0xC060, 0x1C00, 0x6, | ||
| + | 0x38, 0x3000, 0x18C, 0xC, | ||
| + | 0x60C0, 0x198, 0x306, 0x6000, | ||
| + | 0x1B0, 0x6, 0x4000, 0x1E0, | ||
| + | 0x2, 0xC000, 0x1C0, 0x3, | ||
| + | 0xCFC0, 0x180, 0x3F3, 0xC000, | ||
| + | 0x0, 0x3, 0x4000, 0x0, | ||
| + | 0x2, 0x6000, 0x0, 0x6, | ||
| + | 0x60C0, 0x0, 0x306, 0x3000, | ||
| + | 0x0, 0xC, 0x1C00, 0x0, | ||
| + | 0x38, 0x603, 0x180, 0xC060, | ||
| + | 0x180, 0x180, 0x180, 0x78, | ||
| + | 0x180, 0x1E00, 0xF, 0xC003, | ||
| + | 0xF000, 0x0, 0x3FFC, 0x0}; | ||
| + | WORD IMAG3[] = { /* Mask for second icon */ | ||
| + | 0x0, 0x0, 0x0, 0x0, | ||
| + | 0x7FFE, 0x0, 0x1F, 0xFFFF, | ||
| + | 0xFC00, 0xFF, 0xFFFF, 0xFF00, | ||
| + | 0x3FF, 0xFFFF, 0xFFC0, 0xFFF, | ||
| + | 0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF, | ||
| + | 0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0xFFF, 0xFFFF, 0xFFF0, | ||
| + | 0x3FF, 0xFFFF, 0xFFC0, 0xFF, | ||
| + | 0xFFFF, 0xFF00, 0x1F, 0xFFFF, | ||
| + | 0xF800, 0x0, 0x7FFE, 0x0}; | ||
| + | WORD IMAG4[] = { /* Data for second icon */ | ||
| + | 0x0, 0x0, 0x0, 0x0, | ||
| + | 0x3FFC, 0x0, 0xF, 0xC003, | ||
| + | 0xF000, 0x78, 0x180, 0x1E00, | ||
| + | 0x180, 0x180, 0x180, 0x603, | ||
| + | 0x180, 0xC060, 0x1C00, 0x6, | ||
| + | 0x38, 0x3000, 0x18C, 0xC, | ||
| + | 0x60C0, 0x198, 0x306, 0x6000, | ||
| + | 0x1B0, 0x6, 0x4000, 0x1E0, | ||
| + | 0x2, 0xC000, 0x1C0, 0x3, | ||
| + | 0xCFC0, 0x180, 0x3F3, 0xC000, | ||
| + | 0x0, 0x3, 0x4000, 0x0, | ||
| + | 0x2, 0x6000, 0x0, 0x6, | ||
| + | 0x60C0, 0x0, 0x306, 0x3000, | ||
| + | 0x0, 0xC, 0x1C00, 0x0, | ||
| + | 0x38, 0x603, 0x180, 0xC060, | ||
| + | 0x180, 0x180, 0x180, 0x78, | ||
| + | 0x180, 0x1E00, 0xF, 0xC003, | ||
| + | 0xF000, 0x0, 0x3FFC, 0x0}; | ||
| + | LONG rsfrstr[] = { /* Free string index - unused */ | ||
| + | 0}; | ||
| + | BITBLK rsbitblk[] = { /* First entry is index to image data */ | ||
| + | 0L, 6, 24, 0, 0, 0}; | ||
| − | + | LONG rsfrimg[] = { /* Free image index - unused */ | |
| + | 0}; | ||
| + | ICONBLK rsiconblk[] = { | ||
| + | 1L, 2L, 10L, 4096,0,0, 0,0,48,24, 9,24,30,8, /* First pointer is mask */ | ||
| + | 3L, 4L, 17L, 4864,0,0, 0,0,48,24, 0,24,48,8}; /* Second is data, third */ | ||
| + | /* is to title string */ | ||
| + | TEDINFO rstedinfo[] = { | ||
| + | 2L, 3L, 4L, 3, 6, 2, 0x1180, 0x0, -1, 14,1, /* First pointer is text */ | ||
| + | 7L, 8L, 9L, 3, 6, 2, 0x2072, 0x0, -3, 11,1, /* Second is template */ | ||
| + | 11L, 12L, 13L, 3, 6, 0, 0x1180, 0x0, -1, 1,15, /* Third is validation */ | ||
| + | 14L, 15L, 16L, 3, 6, 1, 0x1173, 0x0, 0, 1,17}; | ||
| − | + | OBJECT rsobject[] = { | |
| + | -1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 18,12, /* Pointers are to: */ | ||
| + | 2, -1, -1, GSTRING, NONE, NORMAL, 0x0L, 3,1, 12,1, /* rsstrings */ | ||
| + | 3, -1, -1, GBUTTON, 0x7, NORMAL, 0x1L, 5,9, 8,1, /* rsstrings */ | ||
| + | 0, 4, 4, GBOX, NONE, NORMAL, 0xFF1172L, 3,3, 12,5, | ||
| + | 3, -1, -1, GIMAGE, LASTOB, NORMAL, 0x0L, 3,1, 6,3, /* rsbitblk */ | ||
| + | -1, 1, 6, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 23,12, | ||
| + | 2, -1, -1, GTEXT, NONE, NORMAL, 0x0L, 0,1, 23,1, /* rstedinfo */ | ||
| + | 6, 3, 5, GIBOX, NONE, NORMAL, 0x1100L, 6,3, 11,5, | ||
| + | 4, -1, -1, GBUTTON, 0x11, NORMAL, 0x5L, 0,0, 11,1, /* rsstrings */ | ||
| + | 5, -1, -1, GBUTTON, 0x11, NORMAL, 0x6L, 0,2, 11,1, /* rsstrings */ | ||
| + | 2, -1, -1, GBOXCHAR, 0x11, NORMAL, 0x43FF1400L, 0,4, 11,1, | ||
| + | 0, -1, -1, GBOXTEXT, 0x27, NORMAL, 0x1L, 5,9, 13,1, /* rstedinfo */ | ||
| + | -1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 32,11, | ||
| + | 2, -1, -1, GICON, NONE, NORMAL, 0x0L, 4,1, 6,4, /* rsiconblk */ | ||
| + | 3, -1, -1, GFTEXT, EDITABLE, NORMAL, 0x2L, 12,2, 14,1, /* rstedinfo */ | ||
| + | 0, 4, 4, GFBOXTEXT, 0xE, NORMAL, 0x3L, 3,5, 25,4, /* rstedinfo */ | ||
| + | 3, -1, -1, GICON, LASTOB, NORMAL, 0x1L, 1,0, 6,4}; /* rsiconblk */ | ||
| − | + | LONG rstrindex[] = { /* Points to start of trees in */ | |
| − | + | 0L, /* rsobject */ | |
| + | 5L, | ||
| + | 12L}; | ||
| + | struct foobar { /* Temporary structure used by */ | ||
| + | WORD dummy; /* RSCREATE when setting up image */ | ||
| + | WORD *image; /* pointers. */ | ||
| + | } rsimdope[] = { | ||
| + | 0, &IMAG0[0], | ||
| + | 0, &IMAG1[0], | ||
| + | 0, &IMAG2[0], | ||
| + | 0, &IMAG3[0], | ||
| + | 0, &IMAG4[0]}; | ||
| + | /* Counts of structures defined */ | ||
| + | #define NUMSTRINGS 18 | ||
| + | #define NUMFRSTR 0 | ||
| + | #define NUMIMAGES 5 | ||
| + | #define NUMBB 1 | ||
| + | #define NUMFRIMG 0 | ||
| + | #define NUMIB 2 | ||
| + | #define NUMTI 4 | ||
| + | #define NUMOBS 17 | ||
| + | #define NUMTREE 3 | ||
| + | |||
| + | BYTE pname[] = "DEMO.RSC"; | ||
| + | |||
| + | </pre> | ||
| − | + | ==Appendix III - Title change utility== | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Title change utility <<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | VOID | ||
| + | settext(tree, obj, str) | ||
| + | LONG tree, str; | ||
| + | WORD obj; | ||
| + | { | ||
| + | LONG obspec; | ||
| + | obspec = LLGET(OBSPEC(obj)); /* Get TEDINFO address */ | ||
| + | LLSET(TEPTEXT(obspec), str); /* Set new text pointer */ | ||
| + | LWSET(TETXTLEN(obspec), LSTRLEN(str)); /* Set new length */ | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix III - Text edit code segment== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>> Text edit code segment <<<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | LONG tree, obspec; | ||
| + | BYTE text[41]; | ||
| + | rsrcgaddr(RTREE, DIALOG, &tree); /* Get tree address */ | ||
| + | obspec = LLGET(OBSPEC(EDITOBJ)); /* Get TEDINFO address */ | ||
| + | LLSET(TEPTEXT(obspec), ADDR(str)); /* Set new text pointer */ | ||
| + | LWSET(TETXTLEN(obspec), 41); /* Set max length */ | ||
| + | text[0] = '\0'; /* Make empty string */ | ||
| + | </pre> | ||
| + | |||
| + | ==Appendix III - Sample 68K only source code== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>> Sample 68K only source code <<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | VOID | ||
| + | settext(tree, obj, str) | ||
| + | OBJECT *tree; | ||
| + | WORD obj; | ||
| + | BYTE *str; | ||
| + | { | ||
| + | TEDINFO *obspec; | ||
| + | obspec = (TEDINFO *) (tree + obj)->obspec; | ||
| + | /* Get TEDINFO address */ | ||
| + | obspec->teptext = str; /* Set new text pointer */ | ||
| + | obspec->tetxtlen = strlen(str); /* Set new length */ | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix III - Symbol definitions== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>>>> Symbol definitions <<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | /* Window parts */ | ||
| + | #define NAME 0x0001 | ||
| + | #define CLOSER 0x0002 | ||
| + | #define FULLER 0x0004 | ||
| + | #define MOVER 0x0008 | ||
| + | #define INFO 0x0010 | ||
| + | #define SIZER 0x0020 | ||
| + | #define UPARROW 0x0040 | ||
| + | #define DNARROW 0x0080 | ||
| + | #define VSLIDE 0x0100 | ||
| + | #define LFARROW 0x0200 | ||
| + | #define RTARROW 0x0400 | ||
| + | #define HSLIDE 0x0800 | ||
| + | #define WFKIND 1 /* windget/set parameters */ | ||
| + | #define WFNAME 2 | ||
| + | #define WFINFO 3 | ||
| + | #define WFWXYWH 4 | ||
| + | #define WFCXYWH 5 | ||
| + | #define WFPXYWH 6 | ||
| + | #define WFFXYWH 7 | ||
| + | #define WFHSLIDE 8 | ||
| + | #define WFVSLIDE 9 | ||
| + | #define WFTOP 10 | ||
| + | #define WFFIRSTXYWH 11 | ||
| + | #define WFNEXTXYWH 12 | ||
| + | #define WFNEWDESK 14 | ||
| + | #define WFHSLSIZ 15 | ||
| + | #define WFVSLSIZ 16 | ||
| + | /* window messages */ | ||
| + | #define WMREDRAW 20 | ||
| + | #define WMTOPPED 21 | ||
| + | #define WMCLOSED 22 | ||
| + | #define WMFULLED 23 | ||
| + | #define WMARROWED 24 | ||
| + | #define WMHSLID 25 | ||
| + | #define WMVSLID 26 | ||
| + | #define WMSIZED 27 | ||
| + | #define WMMOVED 28 | ||
| + | #define WMNEWTOP 29 | ||
| + | /* arrow messages */ | ||
| + | #define WAUPPAGE 0 | ||
| + | #define WADNPAGE 1 | ||
| + | #define WAUPLINE 2 | ||
| + | #define WADNLINE 3 | ||
| + | #define WALFPAGE 4 | ||
| + | #define WARTPAGE 5 | ||
| + | #define WALFLINE 6 | ||
| + | #define WARTLINE 7 | ||
| + | #define RTREE 0 /* Redraw definitions */ | ||
| + | #define ROOT 0 | ||
| + | #define MAXDEPTH 8 | ||
| + | /* update flags */ | ||
| + | #define ENDUPDATE 0 | ||
| + | #define BEGUPDATE 1 | ||
| + | #define ENDMCTRL 2 | ||
| + | #define BEGMCTRL 3 | ||
| + | /* Mouse state changes */ | ||
| + | #define MOFF 256 | ||
| + | #define MON 257 | ||
| + | /* Object flags */ | ||
| + | #define NONE 0x0 | ||
| + | #define SELECTABLE 0x1 | ||
| + | #define DEFAULT 0x2 | ||
| + | #define EXIT 0x4 | ||
| + | #define EDITABLE 0x8 | ||
| + | #define RBUTTON 0x10 | ||
| + | /* Object states */ | ||
| + | #define SELECTED 0x1 | ||
| + | #define CROSSED 0x2 | ||
| + | #define CHECKED 0x4 | ||
| + | #define DISABLED 0x8 | ||
| + | #define OUTLINED 0x10 | ||
| + | #define SHADOWED 0x20 | ||
| − | + | #define GBOX 20 | |
| − | + | #define GTEXT 21 | |
| − | + | #define GBOXTEXT 22 | |
| − | + | #define GIMAGE 23 | |
| − | + | #define GIBOX 25 | |
| − | + | #define GBUTTON 26 | |
| − | + | #define GBOXCHAR 27 | |
| − | + | #define GSTRING 28 | |
| − | + | #define GFTEXT 29 | |
| − | + | #define GFBOXTEXT 30 | |
| − | + | #define GICON 31 | |
| − | + | #define GTITLE 32 | |
| − | + | /* Data structures */ | |
| − | + | typedef struct grect | |
| − | + | { | |
| − | { | + | int gx; |
| − | + | int gy; | |
| − | + | int gw; | |
| − | + | int gh; | |
| − | + | } GRECT; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | typedef struct object | ||
| + | { | ||
| + | int obnext; /* -> object's next sibling */ | ||
| + | int obhead; /* -> head of object's children */ | ||
| + | int obtail; /* -> tail of object's children */ | ||
| + | unsigned int obtype; /* type of object- BOX, CHAR,...*/ | ||
| + | unsigned int obflags; /* flags */ | ||
| + | unsigned int obstate; /* state- SELECTED, OPEN, ... */ | ||
| + | long obspec; /* "out"- -> anything else */ | ||
| + | int obx; /* upper left corner of object */ | ||
| + | int oby; /* upper left corner of object */ | ||
| + | int obwidth; /* width of obj */ | ||
| + | int obheight; /* height of obj */ | ||
| + | } OBJECT; | ||
| + | typedef struct textedinfo | ||
| + | { | ||
| + | long teptext; /* ptr to text (must be 1st) */ | ||
| + | long teptmplt; /* ptr to template */ | ||
| + | long tepvalid; /* ptr to validation chrs. */ | ||
| + | int tefont; /* font */ | ||
| + | int tejunk1; /* junk word */ | ||
| + | int tejust; /* justification- left, right...*/ | ||
| + | int tecolor; /* color information word */ | ||
| + | int tejunk2; /* junk word */ | ||
| + | int tethickness; /* border thickness */ | ||
| + | int tetxtlen; /* length of text string */ | ||
| + | int tetmplen; /* length of template string */ | ||
| + | } TEDINFO; | ||
| + | /* "Portable" data definitions */ | ||
| + | #define OBNEXT(x) (tree + (x) * sizeof(OBJECT) + 0) | ||
| + | #define OBHEAD(x) (tree + (x) * sizeof(OBJECT) + 2) | ||
| + | #define OBTAIL(x) (tree + (x) * sizeof(OBJECT) + 4) | ||
| + | #define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6) | ||
| + | #define OBFLAGS(x) (tree + (x) * sizeof(OBJECT) + 8) | ||
| + | #define OBSTATE(x) (tree + (x) * sizeof(OBJECT) + 10) | ||
| + | #define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12) | ||
| + | #define OBX(x) (tree + (x) * sizeof(OBJECT) + 16) | ||
| + | #define OBY(x) (tree + (x) * sizeof(OBJECT) + 18) | ||
| + | #define OBWIDTH(x) (tree + (x) * sizeof(OBJECT) + 20) | ||
| + | #define OBHEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22) | ||
| + | #define TEPTEXT(x) (x) | ||
| + | #define TETXTLEN(x) (x + 24) | ||
| + | </pre> | ||
| + | ==Appendix IV - Sample object trees== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>>> Sample object trees <<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | OBJECT rsobject[] = { | ||
| + | -1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 18,12, /* Tree # 1 */ | ||
| + | 2, -1, -1, GSTRING, NONE, NORMAL, 0x0L, 3,1, 12,1, | ||
| + | 3, -1, -1, GBUTTON, 0x7, NORMAL, 0x1L, 5,9, 8,1, | ||
| + | 0, 4, 4, GBOX, NONE, NORMAL, 0xFF1172L, 3,3, 12,5, | ||
| + | 3, -1, -1, GIMAGE, LASTOB, NORMAL, 0x0L, 3,1, 6,3, | ||
| + | -1, 1, 6, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 23,12, /* Tree # 2 */ | ||
| + | 2, -1, -1, GTEXT, NONE, NORMAL, 0x0L, 0,1, 23,1, | ||
| + | 6, 3, 5, GIBOX, NONE, NORMAL, 0x1100L, 6,3, 11,5, | ||
| + | 4, -1, -1, GBUTTON, 0x11, NORMAL, 0x5L, 0,0, 11,1, | ||
| + | 5, -1, -1, GBUTTON, 0x11, NORMAL, 0x6L, 0,2, 11,1, | ||
| + | 2, -1, -1, GBOXCHAR, 0x11, NORMAL, 0x43FF1400L, 0,4, 11,1, | ||
| + | 0, -1, -1, GBOXTEXT, 0x27, NORMAL, 0x1L, 5,9, 13,1, | ||
| + | -1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 32,11, /* Tree # 3 */ | ||
| + | 2, -1, -1, GICON, NONE, NORMAL, 0x0L, 4,1, 6,4, | ||
| + | 3, -1, -1, GFTEXT, EDITABLE, NORMAL, 0x2L, 12,2, 14,1, | ||
| + | 0, 4, 4, GFBOXTEXT, 0xE, NORMAL, 0x3L, 3,5, 25,4, | ||
| + | 3, -1, -1, GICON, LASTOB, NORMAL, 0x1L, 1,0, 6,4}; | ||
| + | </pre> | ||
| + | ==Appendix IV - Object tree walk utility== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>> Object tree walk utility <<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | VOID | ||
| + | maptree(tree, this, last, routine) | ||
| + | LONG tree; | ||
| + | WORD this, last; | ||
| + | WORD (*routine)(); | ||
| + | { | ||
| + | WORD tmp1; | ||
| + | |||
| + | tmp1 = this; /* Initialize to impossible value: */ | ||
| + | /* TAIL won't point to self! */ | ||
| + | /* Look until final node, or off */ | ||
| + | /* the end of tree */ | ||
| + | while (this != last && this != NIL) | ||
| + | /* Did we 'pop' into this node */ | ||
| + | /* for the second time? */ | ||
| + | if (LWGET(OBTAIL(this)) != tmp1) | ||
| + | { | ||
| + | tmp1 = this; /* This is a new node */ | ||
| + | this = NIL; | ||
| + | /* Apply operation, testing */ | ||
| + | /* for rejection of sub-tree */ | ||
| + | if ((*routine)(tree, tmp1)) | ||
| + | this = LWGET(OBHEAD(tmp1)); | ||
| + | /* Subtree path not taken, */ | ||
| + | /* so traverse right */ | ||
| + | if (this == NIL) | ||
| + | this = LWGET(OBNEXT(tmp1)); | ||
| + | } | ||
| + | else /* Revisiting parent: */ | ||
| + | /* No operation, move right */ | ||
| + | { | ||
| + | tmp1 = this; | ||
| + | this = LWGET(OBNEXT(tmp1)); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </pre> | ||
| + | ==Appendix IV - Sample routine to use with maptree()== | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | VOID | + | <pre> |
| − | + | ||
| − | + | /* | |
| − | + | >>>>>>>>>>>>>>>>>> Sample routine to use with maptree() <<<<<<<<<<<<<<< | |
| − | + | */ | |
| + | VOID | ||
| + | undoobj(tree, which, bit) /* clear specified bit in object state */ | ||
| + | LONG tree; | ||
| + | WORD which, bit; | ||
| + | { | ||
WORD state; | WORD state; | ||
state = LWGET(OBSTATE(which)); | state = LWGET(OBSTATE(which)); | ||
| − | LWSET(OBSTATE(which), state | + | LWSET(OBSTATE(which), state & ~bit); |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | VOID | ||
| + | deselobj(tree, which) /* turn off selected bit of spcfd object*/ | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | { | ||
| + | undoobj(tree, which, SELECTED); | ||
| + | return (TRUE); | ||
| + | } | ||
| + | </pre> | ||
| + | ==Appendix IV - Sample .ICN Files== | ||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>> Sample .ICN Files <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | >>>>>>>>>> Save everything between >>><<< lines as CLOCK.ICN <<<<<<<<<<<<<< | ||
| + | */ | ||
| + | /* GEM Icon Definition: */ | ||
| + | #define ICONW 0x0030 | ||
| + | #define ICONH 0x0018 | ||
| + | #define DATASIZE 0x0048 | ||
| + | UWORD clock[DATASIZE] = | ||
| + | { 0x0000, 0x0000, 0x0000, 0x0000, | ||
| + | 0x3FFC, 0x0000, 0x000F, 0xC003, | ||
| + | 0xF000, 0x0078, 0x0180, 0x1E00, | ||
| + | 0x0180, 0x0180, 0x0180, 0x0603, | ||
| + | 0x0180, 0xC060, 0x1C00, 0x0006, | ||
| + | 0x0038, 0x3000, 0x018C, 0x000C, | ||
| + | 0x60C0, 0x0198, 0x0306, 0x6000, | ||
| + | 0x01B0, 0x0006, 0x4000, 0x01E0, | ||
| + | 0x0002, 0xC000, 0x01C0, 0x0003, | ||
| + | 0xCFC0, 0x0180, 0x03F3, 0xC000, | ||
| + | 0x0000, 0x0003, 0x4000, 0x0000, | ||
| + | 0x0002, 0x6000, 0x0000, 0x0006, | ||
| + | 0x60C0, 0x0000, 0x0306, 0x3000, | ||
| + | 0x0000, 0x000C, 0x1C00, 0x0000, | ||
| + | 0x0038, 0x0603, 0x0180, 0xC060, | ||
| + | 0x0180, 0x0180, 0x0180, 0x0078, | ||
| + | 0x0180, 0x1E00, 0x000F, 0xC003, | ||
| + | 0xF000, 0x0000, 0x3FFC, 0x0000 | ||
| + | }; | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End of CLOCK.ICN <<<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | /* | ||
| + | >>>>>>>>> Save everything between >>>><<<<< lines as CLOCKM.ICN <<<<<<<<<< | ||
| + | */ | ||
| + | /* GEM Icon Definition: */ | ||
| + | #define ICONW 0x0030 | ||
| + | #define ICONH 0x0018 | ||
| + | #define DATASIZE 0x0048 | ||
| + | UWORD clockm[DATASIZE] = | ||
| + | { 0x0000, 0x0000, 0x0000, 0x0000, | ||
| + | 0x7FFE, 0x0000, 0x001F, 0xFFFF, | ||
| + | 0xFC00, 0x00FF, 0xFFFF, 0xFF00, | ||
| + | 0x03FF, 0xFFFF, 0xFFC0, 0x0FFF, | ||
| + | 0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, | ||
| + | 0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF, | ||
| + | 0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF, | ||
| + | 0xFFFC, 0x0FFF, 0xFFFF, 0xFFF0, | ||
| + | 0x03FF, 0xFFFF, 0xFFC0, 0x00FF, | ||
| + | 0xFFFF, 0xFF00, 0x001F, 0xFFFF, | ||
| + | 0xF800, 0x0000, 0x7FFE, 0x0000 | ||
| + | }; | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>> End of CLOCKM.ICN <<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | </pre> | ||
| + | ==Appendix V - MFDB Structure== | ||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>>>>>>>>> MFDB Structure <<<<<<<<<<<<<<<<<<<<<<<<<< */ | ||
| + | /* Memory Form Definition Block */ | ||
| + | typedef struct fdbstr | ||
| + | { | ||
| + | long fdaddr; /* Form address */ | ||
| + | int fdw; /* Form width in pixels */ | ||
| + | int fdh; /* Form height in pixels */ | ||
| + | int fdwdwidth; /* Form width in memory words */ | ||
| + | int fdstand; /* Standard form flag */ | ||
| + | int fdnplanes; /* Number of color planes */ | ||
| + | int fdr1; /* Dummy locations: */ | ||
| + | int fdr2; /* Reserved for future use */ | ||
| + | int fdr3; | ||
| + | } MFDB; | ||
| + | </pre> | ||
| + | ==Appendix V - Resource Transform Utilities== | ||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>> Resource Transform Utilities <<<<<<<<<<<<<<<<<< */ | ||
| + | /*------------------------------*/ | ||
| + | /* vdifix */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | vdifix(pfd, theaddr, wb, h) /* This routine loads the MFDB */ | ||
| + | MFDB *pfd; /* Input values are the MFDB's */ | ||
| + | LONG theaddr; /* address, the form's address,*/ | ||
| + | WORD wb, h; /* the form's width in bytes, */ | ||
| + | { /* and the height in pixels */ | ||
| + | pfd->fww = wb >> 1; | ||
| + | pfd->fwp = wb << 3; | ||
| + | pfd->fh = h; | ||
| + | pfd->np = 1; /* Monochrome assumed */ | ||
| + | pfd->mp = theaddr; | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* vditrans */ | ||
| + | /*------------------------------*/ | ||
| + | WORD | ||
| + | vditrans(saddr, swb, daddr, dwb, h) /* Transform the standard form */ | ||
| + | LONG saddr; /* pointed at by saddr and */ | ||
| + | UWORD swb; /* store in the form at daddr */ | ||
| + | LONG daddr; /* Byte widths and pixel height*/ | ||
| + | UWORD dwb; /* are given */ | ||
| + | UWORD h; | ||
| + | { | ||
| + | MFDB src, dst; /* These are on-the-fly MFDBs */ | ||
| + | vdifix(&src, saddr, swb, h); /* Load the source MFDB */ | ||
| + | src.ff = TRUE; /* Set it's std form flag */ | ||
| + | vdifix(&dst, daddr, dwb, h); /* Load the destination MFDB */ | ||
| + | dst.ff = FALSE; /* Clear the std flag */ | ||
| + | vrtrnfm(vdihandle, &src, &dst ); /* Call the VDI */ | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* transbitblk */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | transbitblk(obspec) /* Transform the image belonging */ | ||
| + | LONG obspec; /* to the bitblk pointed to by */ | ||
| + | { /* obspec. This routine may also*/ | ||
| + | LONG taddr; /* be used with free images */ | ||
| + | WORD wb, hl; | ||
| + | if ( (taddr = LLGET(BIPDATA(obspec))) == -1L) | ||
| + | return; /* Get and validate image address */ | ||
| + | wb = LWGET(BIWB(obspec)); /* Extract image dimensions */ | ||
| + | hl = LWGET(BIHL(obspec)); | ||
| + | vditrans(taddr, wb, taddr, wb, hl); /* Perform a transform */ | ||
| + | } /* in place */ | ||
| + | /*------------------------------*/ | ||
| + | /* transobj */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | transobj(tree, obj) /* Examine the input object. If */ | ||
| + | LONG tree; /* it is an icon or image, trans- */ | ||
| + | WORD obj; /* form the associated raster */ | ||
| + | { /* forms in place. */ | ||
| + | WORD type, wb, hl; /* This routine may be used with */ | ||
| + | LONG taddr, obspec; /* maptree() to transform an */ | ||
| + | /* entire resource tree */ | ||
| + | type = LLOBT(LWGET(OBTYPE(obj))); /* Load object type */ | ||
| + | if ( (obspec = LLGET(OBSPEC(obj))) == -1L) /* Load and check */ | ||
| + | return (TRUE); /* obspec pointer */ | ||
| + | switch (type) { | ||
| + | case GIMAGE: | ||
| + | transbitblk(obspec); /* Transform image */ | ||
| + | return (TRUE); | ||
| + | case GICON: /* Load icon size */ | ||
| + | hl = LWGET(IBHICON(obspec)); | ||
| + | wb = (LWGET(IBWICON(obspec)) + 7) >> 3; | ||
| + | /* Transform data */ | ||
| + | if ( (taddr = LLGET(IBPDATA(obspec))) != -1L) | ||
| + | vditrans(taddr, wb, taddr, wb, hl); | ||
| + | /* Transform mask */ | ||
| + | if ( (taddr = LLGET(IBPMASK(obspec))) != -1L) | ||
| + | vditrans(taddr, wb, taddr, wb, hl); | ||
| + | return (TRUE); | ||
| + | default: | ||
| + | return (TRUE); | ||
| + | } | ||
| + | } | ||
| + | /* >>>>>>>>>>>>>>>> Macro definitions for the code above <<<<<<<<<<<<<<< */ | ||
| + | #define BIPDATA(x) (x) | ||
| + | #define BIWB(x) (x + 4) | ||
| + | #define BIHL(x) (x + 6) | ||
| + | #define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6) | ||
| + | #define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12) | ||
| + | #define IBPMASK(x) (x) | ||
| + | #define IBPDATA(x) (x + 4) | ||
| + | #define IBWICON(x) (x + 22) | ||
| + | #define IBHICON(x) (x + 24) | ||
| + | </pre> | ||
| − | + | ==Appendix V - VDI Copy Mode Table== | |
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | <pre> | ||
| + | /* >>>>>>>>>>>>>>>>>>>>>>>> VDI Copy Mode Table <<<<<<<<<<<<<<<<<<<<<<<<< */ | ||
| + | Symbols: N = new destination pixel value (0 or 1) | ||
| + | D = old destination pixel value (0 or 1) | ||
| + | S = source pixel value (0 or 1) | ||
| + | ~ = Boolean not (inversion) | ||
| + | & = Boolean and | ||
| + | | = Boolean or | ||
| + | ^ = Boolean xor (exclusive-or) | ||
| + | Mode Number Action | ||
| + | ---------- ------ | ||
| + | 0 N = 0 (USE VBAR INSTEAD) | ||
| + | 1 N = S & D | ||
| + | 2 N = S & ~D | ||
| + | 3 N = S (REPLACE) | ||
| + | 4 N = ~S & D (ERASE) | ||
| + | 5 N = D (USELESS) | ||
| + | 6 N = S ^ D (XOR) | ||
| + | 7 N = S | D (TRANSPARENT) | ||
| + | 8 N = ~ (S | D) | ||
| + | 9 N = ~ (S ^ D) | ||
| + | 10 N = ~D (USE VBAR INSTEAD) | ||
| + | 11 N = S | ~D | ||
| + | 12 N = ~S | ||
| + | 13 N = ~S | D (REVERSE TRANSPARENT) | ||
| + | 14 N = ~ (S & D) | ||
| + | 15 N = 1 (USE VBAR INSTEAD) | ||
| + | /* >>>>>>>>>>>>>>>>>>>>>>>> END OF DOWNLOAD <<<<<<<<<<<<<<<<<<<<<<<<<< */ | ||
| + | </pre> | ||
| + | ==Appendix VI - Download file for GEM column #7== | ||
| + | |||
| + | <pre> | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>> Download file for GEM column #7 <<<<<<<<<<<<<<<<<<<<< | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>>>>>> Sample Menu Tree <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | -1, 1, 6, GIBOX, NONE, NORMAL, 0x0L, 0,0, 80,25, /* ROOT */ | ||
| + | 6, 2, 2, GBOX, NONE, NORMAL, 0x1100L, 0,0, 80,513, /* THE BAR */ | ||
| + | 1, 3, 5, GIBOX, NONE, NORMAL, 0x0L, 2,0, 20,769, /* THE ACTIVE */ | ||
| + | 4, -1, -1, GTITLE, NONE, NORMAL, 0x0L, 0,0, 6,769, /* Title #1 */ | ||
| + | 5, -1, -1, GTITLE, NONE, NORMAL, 0x1L, 6,0, 6,769, /* Title #2 */ | ||
| + | 2, -1, -1, GTITLE, NONE, NORMAL, 0x2L, 12,0, 8,769, /* Title #3 */ | ||
| + | 0, 7, 22, GIBOX, NONE, NORMAL, 0x0L, 0,769, 80,19, /* THE SCREEN */ | ||
| + | 16, 8, 15, GBOX, NONE, NORMAL, 0xFF1100L, 2,0, 20,8, /* Drop-down #1 */ | ||
| + | 9, -1, -1, GSTRING, NONE, NORMAL, 0x3L, 0,0, 19,1, /* About... entry */ | ||
| + | 10, -1, -1, GSTRING, NONE, DISABLED, 0x4L, 0,1, 20,1, | ||
| + | 11, -1, -1, GSTRING, NONE, NORMAL, 0x5L, 0,2, 20,1, /* Desk acc entries */ | ||
| + | 12, -1, -1, GSTRING, NONE, NORMAL, 0x6L, 0,3, 20,1, | ||
| + | 13, -1, -1, GSTRING, NONE, NORMAL, 0x7L, 0,4, 20,1, | ||
| + | 14, -1, -1, GSTRING, NONE, NORMAL, 0x8L, 0,5, 20,1, | ||
| + | 15, -1, -1, GSTRING, NONE, NORMAL, 0x9L, 0,6, 20,1, | ||
| + | 7, -1, -1, GSTRING, NONE, NORMAL, 0xAL, 0,7, 20,1, | ||
| + | 22, 17, 21, GBOX, NONE, NORMAL, 0xFF1100L, 8,0, 13,5, /* Drop-down #2 */ | ||
| + | 18, -1, -1, GSTRING, NONE, NORMAL, 0xBL, 0,0, 13,1, | ||
| + | 19, -1, -1, GSTRING, NONE, DISABLED, 0xCL, 0,1, 13,1, | ||
| + | 20, -1, -1, GSTRING, NONE, NORMAL, 0xDL, 0,4, 13,1, | ||
| + | 21, -1, -1, GSTRING, NONE, NORMAL, 0xEL, 0,2, 13,1, | ||
| + | 16, -1, -1, GSTRING, NONE, DISABLED, 0xFL, 0,3, 13,1, | ||
| + | 6, 23, 25, GBOX, NONE, NORMAL, 0xFF1100L, 14,0, 26,3, /* Drop down #3 */ | ||
| + | 24, -1, -1, GSTRING, NONE, NORMAL, 0x10L, 0,2, 26,1, | ||
| + | 25, -1, -1, GSTRING, NONE, NORMAL, 0x11L, 0,0, 26,1, | ||
| + | 22, -1, -1, GSTRING, LASTOB, DISABLED, 0x12L, 0,1, 26,1 | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>>>>> Menu enable/disable utility <<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | /*------------------------------*/ | ||
| + | /* undoobj */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | undoobj(tree, which, bit) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | UWORD bit; | ||
| + | { | ||
| + | WORD state; | ||
| + | state = LWGET(OBSTATE(which)); | ||
| + | LWSET(OBSTATE(which), state & ~bit); | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* enabobj */ | ||
| + | /*------------------------------*/ | ||
| + | WORD | ||
| + | enabobj(tree, which) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | { | ||
| + | undoobj(tree, which, (UWORD) DISABLED); | ||
| + | return (TRUE); | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* doobj */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | doobj(tree, which, bit) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | UWORD bit; | ||
| + | { | ||
| + | WORD state; | ||
| + | state = LWGET(OBSTATE(which)); | ||
| + | LWSET(OBSTATE(which), state | bit); | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* disabobj */ | ||
| + | /*------------------------------*/ | ||
| + | WORD | ||
| + | disabobj(tree, which) | ||
| + | LONG tree; | ||
| + | WORD which; | ||
| + | { | ||
| + | doobj(tree, which, (UWORD) DISABLED); | ||
| + | return (TRUE); | ||
| + | } | ||
| + | /*------------------------------*/ | ||
| + | /* setmenu */ | ||
| + | /*------------------------------*/ | ||
| + | VOID | ||
| + | setmenu(tree, change) /* change[0] TRUE selects all entries*/ | ||
| + | LONG tree; /* FALSE deselects all. Change list */ | ||
| + | WORD *change; /* of items is then toggled. */ | ||
| + | { | ||
| + | WORD dflt, screen, drop, obj; | ||
| + | dflt = *change++; /* What is default? */ | ||
| + | screen = LWGET(OBTAIL(ROOT)); /* Get SCREEN */ | ||
| + | drop = LWGET(OBHEAD(screen)); /* Get DESK drop-down */ | ||
| + | /* and skip it */ | ||
| + | for (; (drop = LWGET(OBNEXT(drop))) != screen; ) | ||
| + | { | ||
| + | obj = LWGET(OBHEAD(drop)); | ||
| + | if (obj != NIL) | ||
| + | if (dflt) | ||
| + | maptree(tree, obj, drop, enabobj); | ||
| + | else | ||
| + | maptree(tree, obj, drop, disabobj); | ||
| + | } | ||
| + | for (; *change; change++) | ||
| + | if (dflt) | ||
| + | disabobj(tree, *change); | ||
| + | else | ||
| + | enabobj(tree, *change); | ||
| + | } | ||
| + | /* | ||
| + | >>>>>>>>>>>>>>>>>>>>> Definitions used in this article <<<<<<<<<<<<<<<<<<<<<< | ||
| + | */ | ||
| + | #define ROOT 0 | ||
| + | #define GIBOX 25 | ||
| + | #define GSTRING 28 | ||
| + | #define GTITLE 32 | ||
| + | #define RTREE 0 | ||
| − | + | #define MNSELECTED 10 | |
| + | #define CHECKED 0x4 | ||
| + | #define DISABLED 0x8 | ||
| − | + | #define OBNEXT(x) (tree + (x) * sizeof(OBJECT) + 0) | |
| + | #define OBHEAD(x) (tree + (x) * sizeof(OBJECT) + 2) | ||
| + | #define OBTAIL(x) (tree + (x) * sizeof(OBJECT) + 4) | ||
| + | #define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6) | ||
| + | #define OBFLAGS(x) (tree + (x) * sizeof(OBJECT) + 8) | ||
| + | #define OBSTATE(x) (tree + (x) * sizeof(OBJECT) + 10) | ||
| + | #define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12) | ||
| + | #define OBX(x) (tree + (x) * sizeof(OBJECT) + 16) | ||
| + | #define OBY(x) (tree + (x) * sizeof(OBJECT) + 18) | ||
| + | #define OBWIDTH(x) (tree + (x) * sizeof(OBJECT) + 20) | ||
| + | #define OBHEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22) | ||
| + | #define MOFF 256 | ||
| + | #define MON 257 | ||
| − | + | </pre> | |
| − | + | ||
| + | |||
| + | ==Appendix VII - Routines to set clip to a GRECT== | ||
| + | <pre> | ||
| − | + | /* | |
| − | >>>>>>>>>>>>>>>> | + | >>>>>>>>>>>>>>>> Routines to set clip to a GRECT <<<<<<<<<<<<<<<< |
*/ | */ | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | VOID | |
| − | + | grecttoarray(area, array) /* convert x,y,w,h to upr lt x,y and */ | |
| − | + | GRECT *area; /* lwr rt x,y */ | |
| − | + | WORD *array; | |
| − | + | { | |
| − | + | *array++ = area->gx; | |
| − | + | *array++ = area->gy; | |
| − | + | *array++ = area->gx + area->gw - 1; | |
| − | + | *array = area->gy + area->gh - 1; | |
| − | + | } | |
| − | + | ||
| − | + | VOID | |
| − | + | setclip(clipflag, sarea) /* set clip to specified area */ | |
| − | + | WORD clipflag; | |
| − | + | GRECT *sarea; | |
| − | + | { | |
| − | + | WORD pxy[4]; | |
| − | |||
| − | |||
| − | + | grecttoarray(sarea, pxy); | |
| − | + | vsclip(vdihandle, clipflag, pxy); | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| + | </pre> | ||
| − | |||
| + | ==Appendix VII - Routines to set attributes before output== | ||
| − | |||
| + | <pre> | ||
| − | + | /* | |
| − | + | >>>>>>>>>> Routines to set attributes before output <<<<<<<<<<<< | |
| − | + | */ | |
| − | + | VOID | |
| − | + | rrperim(mode, color, type, width, pxy) /* Draw a rounded */ | |
| − | + | WORD mode, color, width, *pxy; /* rectangle outline */ | |
| − | + | { | |
| − | + | vswrmode(vdihandle, mode); | |
| − | + | vslcolor(vdihandle, color); | |
| − | + | vsltype(vdihandle, type); | |
| − | + | vslwidth(vdihandle, width); | |
| − | + | vrbox(vdihandle, pxy); | |
| + | vswrmode(vdihandle, MDREPLACE); | ||
| + | } | ||
| − | + | VOID | |
| − | + | plperim(mode, type, color, width, npts, pxy) /* Draw a polygonal */ | |
| − | + | /* figure */ | |
| − | + | WORD mode, type, color, width, npts, *pxy; | |
| − | + | { | |
| − | + | vswrmode(vdihandle, mode); | |
| − | + | vsltype(vdihandle, type); | |
| − | + | vslcolor(vdihandle, color); | |
| − | + | vslwidth(vdihandle, width); | |
| − | + | vpline(vdihandle, npts, pxy); | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | VOID /* Draw a filled polygonal area */ | |
| − | + | plfill(mode, perim, color, interior, style, npts, pxy) | |
| − | + | WORD mode, perim, color, interior, style, npts, *pxy; | |
| − | + | { | |
| − | + | vswrmode(vdihandle, mode); | |
| − | + | vsfcolor(vdihandle, color); | |
| − | + | vsfstyle(vdihandle, style); | |
| − | + | vsfinterior(vdihandle, interior); | |
| − | + | vsfperimeter(vdihandle, perim); | |
| − | + | vfillarea(vdihandle, npts, pxy); | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | VOID /* Draw a filled rectangle */ | ||
| + | rectfill(mode, perim, color, interior, style, pxy) | ||
| + | WORD mode, perim, color, style, interior, *pxy; | ||
| + | { | ||
| + | vswrmode(vdihandle, mode); | ||
| + | vsfcolor(vdihandle, color); | ||
| + | vsfstyle(vdihandle, style); | ||
| + | vsfinterior(vdihandle, interior); | ||
| + | vsfperimeter(vdihandle, perim); | ||
| + | vrrecfl(vdihandle, pxy); | ||
| + | } | ||
| − | + | </pre> | |
| − | + | ==Appendix VIII - Demonstration of byte alignment of window interior== | |
| + | <pre> | ||
| − | + | /* | |
| − | + | >>>>>>>>>>> Demonstration of byte alignment of window interior <<<<<<<<<<< | |
| − | + | */ | |
| − | + | ||
| − | + | #define FEATURES 0x0fef /* what border features are used */ | |
| − | + | WORD msg[8]; /* message from evntmulti */ | |
| − | + | GRECT workarea; /* defines working area */ | |
| − | + | WORD whndl; /* handle for window being changed */ | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | /* | ||
| − | >>>>>>>>>>> Demonstration of byte alignment of window interior <<<<<<<<<<< | ||
| − | */ | ||
| − | |||
| − | #define FEATURES 0x0fef /* what border features are used */ | ||
| − | WORD msg[8]; /* message from evntmulti */ | ||
| − | GRECT workarea; /* defines working area */ | ||
| − | WORD whndl; /* handle for window being changed */ | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | windcalc(1, FEATURES, msg[4], msg[5], msg[6], msg[7], | ||
| + | &workarea.gx, &workarea.gy, &workarea.gw, | ||
| + | &workarea.gh); | ||
| + | workarea.gx = alignx(workarea.gx); | ||
| + | workarea.gw = alignx(workarea.gw); | ||
| + | windcalc(0, FEATURES, workarea.gx, workarea.gy, | ||
| + | workarea.gw, workarea.gh, &msg[4], &msg[5], | ||
| + | &msg[6], &msg[7]); | ||
| + | windset(whndl, WFCXYWH, msg[4], msg[5], msg[6], msg[7]); | ||
/* | /* | ||
| Line 2,234: | Line 1,405: | ||
return((x & 0xfff0) + ((x & 0x0008) ? 0x0010 : 0)); | return((x & 0xfff0) + ((x & 0x0008) ? 0x0010 : 0)); | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
/* | /* | ||
| Line 2,306: | Line 1,427: | ||
} | } | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre> | </pre> | ||
| − | |||
| − | |||
Revision as of 01:05, 13 October 2006
Contents
- 1 Appendix I - Sample redraw code
- 2 Appendix I - Utilities used in doredraw
- 3 Appendix I - "Self-redraw" Utility
- 4 Appendix I - Utilities for Window Requests
- 5 Appendix I - Window full utility
- 6 Appendix II - Basic Dialog Handler
- 7 Appendix II - Object rectangle utility
- 8 Appendix II - Object flag utilities
- 9 Appendix II - Sample radio buttons after dialog
- 10 Appendix III - Sample C output file from RCS
- 11 Appendix III - Title change utility
- 12 Appendix III - Text edit code segment
- 13 Appendix III - Sample 68K only source code
- 14 Appendix III - Symbol definitions
- 15 Appendix IV - Sample object trees
- 16 Appendix IV - Object tree walk utility
- 17 Appendix IV - Sample routine to use with maptree()
- 18 Appendix IV - Sample .ICN Files
- 19 Appendix V - MFDB Structure
- 20 Appendix V - Resource Transform Utilities
- 21 Appendix V - VDI Copy Mode Table
- 22 Appendix VI - Download file for GEM column #7
- 23 Appendix VII - Routines to set clip to a GRECT
- 24 Appendix VII - Routines to set attributes before output
- 25 Appendix VIII - Demonstration of byte alignment of window interior
Appendix I - Sample redraw code
/* >>>>>>>>>>>>>>>>>>>>>>>>> Sample Redraw Code <<<<<<<<<<<<<<<<<<<<<<<<<<< */
VOID
doredraw(wh, area) /* wh = window handle from msg[3] */
WORD wh; /* area = pointer to redraw rect- */
GRECT *area; /* tangle in msg[4] thru msg[7] */
{
GRECT box;
grafmouse(MOFF, 0x0L);
windupdate(BEGUPDATE);
windget(wh, WFFIRSTXYWH, &box.gx, &box.gy, &box.gw, &box.gh);
while ( box.gw && box.gh )
{
if (rcintersect(full, &box)) /* Full is entire screen */
if (rcintersect(area, &box))
{
if (wh == w1handle) /* Test for window 1 handle */
{ /* AES redraw example */
objcdraw(w1tree, ROOT, MAXDEPTH, box.gx,
box.gy, box.gw, box.gh);
}
else if (wh == w2handle) /* Test for window 2 handle */
{ /* VDI redraw example */
setclip(TRUE, &box);
/* Put VDI drawing calls here */
}
/* add more windows here */
}
windget(wh, WFNEXTXYWH, &box.gx, &box.gy, &box.gw,
&box.gh);
}
windupdate(ENDUPDATE);
grafmouse(MON, 0x0L);
}
Appendix I - Utilities used in doredraw
/* >>>>>>>>>>>>>>>>>>>>>>>> Utilities used in doredraw <<<<<<<<<<<<<<<<<<<< */
VOID
setclip(clipflag, area) /* set clip to specified area */
WORD clipflag;
GRECT *area;
{
WORD pxy[4];
grecttoarray(area, pxy);
vsclip(vdihandle, clipflag, pxy);
}
VOID
grecttoarray(area, array) /* convert x,y,w,h to upr lt x,y and */
GRECT *area; /* lwr rt x,y */
WORD *array;
{
*array++ = area->gx;
*array++ = area->gy;
*array++ = area->gx + area->gw - 1;
*array = area->gy + area->gh - 1;
}
WORD
rcintersect(p1, p2) /* compute intersect of two rectangles */
GRECT *p1, *p2;
{
WORD tx, ty, tw, th;
tw = min(p2->gx + p2->gw, p1->gx + p1->gw);
th = min(p2->gy + p2->gh, p1->gy + p1->gh);
tx = max(p2->gx, p1->gx);
ty = max(p2->gy, p1->gy);
p2->gx = tx;
p2->gy = ty;
p2->gw = tw - tx;
p2->gh = th - ty;
return( (tw > tx) && (th > ty) );
}
Appendix I - "Self-redraw" Utility
/* >>>>>>>>>>>>>>>>>>>>>>> "Self-redraw" Utility <<<<<<<<<<<<<<<<<<<<<<<<< */
VOID
sendredraw(wh, p)
WORD wh;
GRECT *p;
{
WORD msg[8];
msg[0] = WMREDRAW; /* Defined in GEMBIND.H */
msg[1] = glapid; /* As returned by applinit */
msg[2] = 0;
msg[3] = wh; /* Handle of window to redraw */
msg[4] = p->gx;
msg[5] = p->gy;
msg[6] = p->gw;
msg[7] = p->gh;
applwrite(glapid, 16, &msg); /* Use ADDR(msg) for portability */
}
Appendix I - Utilities for Window Requests
/* >>>>>>>>>>>>>>>>>>>> Utilities for Window Requests <<<<<<<<<<<<<<<<<< */
VOID
rcconstrain(pc, pt)
GRECT *pc;
GRECT *pt;
{
if (pt->gx < pc->gx)
pt->gx = pc->gx;
if (pt->gy < pc->gy)
pt->gy = pc->gy;
if ((pt->gx + pt->gw) > (pc->gx + pc->gw))
pt->gx = (pc->gx + pc->gw) - pt->gw;
if ((pt->gy + pt->gh) > (pc->gy + pc->gh))
pt->gy = (pc->gy + pc->gh) - pt->gh;
}
WORD
align(x,n) /* Snap position x to an n-bit grid */
WORD x, n; /* Use n = 16 for horizontal word alignment */
{
x += (n >> 2) - 1; /* Round and... */
x = n * (x / n); /* remove residue */
return (x);
}
Appendix I - Window full utility
/* >>>>>>>>>>>>>>>>>>>>>>> Window full utility <<<<<<<<<<<<<<<<<<<<<<< */
VOID
hndlfull(wh) /* depending on current window state, make window */
WORD wh; /* full size -or- return to previous shrunken size */
{ /* graf calls are optional special effects. */
GRECT prev;
GRECT curr;
GRECT full;
windget(wh, WFCXYWH, &curr.gx, &curr.gy, &curr.gw, &curr.gh);
windget(wh, WFPXYWH, &prev.gx, &prev.gy, &prev.gw, &prev.gh);
windget(wh, WFFXYWH, &full.gx, &full.gy, &full.gw, &full.gh);
if ( rcequal(&curr, &full) )
{ /* Is full, change to previous */
grafshrinkbox(prev.gx, prev.gy, prev.gw, prev.gh,
full.gx, full.gy, full.gw, full.gh);
windset(wh, WFCXYWH, prev.gx, prev.gy, prev.gw, prev.gh);
/* put sendredraw here if you need it */
}
else
{ /* is not full, so set to full */
grafgrowbox(curr.gx, curr.gy, curr.gw, curr.gh,
full.gx, full.gy, full.gw, full.gh);
windset(wh, WFCXYWH, full.gx, full.gy, full.gw, full.gh);
}
}
WORD
rcequal(p1, p2) /* tests for two rectangles equal */
GRECT *p1, *p2;
{
if ((p1->gx != p2->gx) ||
(p1->gy != p2->gy) ||
(p1->gw != p2->gw) ||
(p1->gh != p2->gh))
return(FALSE);
return(TRUE);
}
Appendix II - Basic Dialog Handler
/*
>>>>>>>>>>>>>>>>>>>>>>> Basic Dialog Handler <<<<<<<<<<<<<<<<<<<<<<<
*/
WORD
hndldial(tree, def, x, y, w, h)
LONG tree;
WORD def;
WORD x, y, w, h;
{
WORD xdial, ydial, wdial, hdial, exitobj;
formcenter(tree, &xdial, &ydial, &wdial, &hdial);
formdial(0, x, y, w, h, xdial, ydial, wdial, hdial);
formdial(1, x, y, w, h, xdial, ydial, wdial, hdial);
objcdraw(tree, ROOT, MAXDEPTH, xdial, ydial, wdial, hdial);
exitobj = formdo(tree, def) & 0x7FFF;
formdial(2, x, y, w, h, xdial, ydial, wdial, hdial);
formdial(3, x, y, w, h, xdial, ydial, wdial, hdial);
return (exitobj);
}
Appendix II - Object rectangle utility
/*
>>>>>>>>>>>>>>>>>>>>>>> Object rectangle utility <<<<<<<<<<<<<<<<<<<<<<<<<
*/
VOID
objcxywh(tree, obj, p) /* get x,y,w,h for specified object */
LONG tree;
WORD obj;
GRECT *p;
{
objcoffset(tree, obj, &p->gx, &p->gy);
p->gw = LWGET(OBWIDTH(obj));
p->gh = LWGET(OBHEIGHT(obj));
}
Appendix II - Object flag utilities
/*
>>>>>>>>>>>>>>>>>>>>>>> Object flag utilities <<<<<<<<<<<<<<<<<<<<<<<<<<<
*/
VOID
undoobj(tree, which, bit) /* clear specified bit in object state */
LONG tree;
WORD which, bit;
{
WORD state;
state = LWGET(OBSTATE(which));
LWSET(OBSTATE(which), state & ~bit);
}
VOID
deselobj(tree, which) /* turn off selected bit of spcfd object*/
LONG tree;
WORD which;
{
undoobj(tree, which, SELECTED);
}
VOID
doobj(tree, which, bit) /* set specified bit in object state */
LONG tree;
WORD which, bit;
{
WORD state;
state = LWGET(OBSTATE(which));
LWSET(OBSTATE(which), state | bit);
}
VOID
selobj(tree, which) /* turn on selected bit of spcfd object */
LONG tree;
WORD which;
{
doobj(tree, which, SELECTED);
}
BOOLEAN
statep(tree, which, bit)
LONG tree;
WORD which;
WORD bit;
{
return ( (LWGET(OBSTATE(which)) & bit) != 0);
}
BOOLEAN
selectp(tree, which)
LONG tree;
WORD which;
{
return statep(tree, which, SELECTED);
}
Appendix II - Sample radio buttons after dialog
/*
>>>>>>>>>>>>>>>>>>>>>> Sample radio buttons after dialog <<<<<<<<<<<<<<<<<<<<
*/
WORD
encode(tree, ob1st, num)
LONG tree;
WORD ob1st, num;
{
for (; num--; )
if (selectp(ob1st+num))
return(num);
return (-1);
}
Appendix III - Sample C output file from RCS
/*
>>>>>>>>>>>>>>>>>>>>>>>>>> Sample C output file from RCS <<<<<<<<<<<<<<<<<<<<
*/
/* (Comments added) */
BYTE *rsstrings[] = { /* ASCII data */
"Title String",
"Exit",
"Centered Text",
"",
"",
"Butt",
"Tokyo",
"",
"Time: _:_:_",
"999999",
"",
"Time: _:_:_ ",
"999999",
"New York"};
WORD IMAG0[] = { /* Bitmap for GIMAGE */
0x7FF, 0xFFFF, 0xFF80, 0xC00,
0x0, 0xC0, 0x183F, 0xF03F,
0xF060, 0x187F, 0xF860, 0x1860,
0x187F, 0xF860, 0x1860, 0x187F,
0xF860, 0x1860, 0x187F, 0xF860,
0x1860, 0x187F, 0xF860, 0x1860,
0x187F, 0xF860, 0x1860, 0x187F,
0xF860, 0x1860, 0x187F, 0xF860,
0x1860, 0x187F, 0xF860, 0x1860,
0x187F, 0xF860, 0x1860, 0x187F,
0xF860, 0x1860, 0x183F, 0xF03F,
0xF060, 0xC00, 0x0, 0xC0,
0x7FF, 0xFFFF, 0xFF80, 0x0,
0x0, 0x0, 0x3F30, 0xC787,
0x8FE0, 0xC39, 0xCCCC, 0xCC00,
0xC36, 0xCFCC, 0xF80, 0xC30,
0xCCCD, 0xCC00, 0x3F30, 0xCCC7,
0xCFE0, 0x0, 0x0, 0x0};
WORD IMAG1[] = { /* Mask for first icon */
0x0, 0x0, 0x0, 0x0,
0x7FFE, 0x0, 0x1F, 0xFFFF,
0xFC00, 0xFF, 0xFFFF, 0xFF00,
0x3FF, 0xFFFF, 0xFFC0, 0xFFF,
0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF,
0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF,
0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF,
0xFFFC, 0xFFF, 0xFFFF, 0xFFF0,
0x3FF, 0xFFFF, 0xFFC0, 0xFF,
0xFFFF, 0xFF00, 0x1F, 0xFFFF,
0xF800, 0x0, 0x7FFE, 0x0};
WORD IMAG2[] = { /* Data for first icon */
0x0, 0x0, 0x0, 0x0,
0x3FFC, 0x0, 0xF, 0xC003,
0xF000, 0x78, 0x180, 0x1E00,
0x180, 0x180, 0x180, 0x603,
0x180, 0xC060, 0x1C00, 0x6,
0x38, 0x3000, 0x18C, 0xC,
0x60C0, 0x198, 0x306, 0x6000,
0x1B0, 0x6, 0x4000, 0x1E0,
0x2, 0xC000, 0x1C0, 0x3,
0xCFC0, 0x180, 0x3F3, 0xC000,
0x0, 0x3, 0x4000, 0x0,
0x2, 0x6000, 0x0, 0x6,
0x60C0, 0x0, 0x306, 0x3000,
0x0, 0xC, 0x1C00, 0x0,
0x38, 0x603, 0x180, 0xC060,
0x180, 0x180, 0x180, 0x78,
0x180, 0x1E00, 0xF, 0xC003,
0xF000, 0x0, 0x3FFC, 0x0};
WORD IMAG3[] = { /* Mask for second icon */
0x0, 0x0, 0x0, 0x0,
0x7FFE, 0x0, 0x1F, 0xFFFF,
0xFC00, 0xFF, 0xFFFF, 0xFF00,
0x3FF, 0xFFFF, 0xFFC0, 0xFFF,
0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF,
0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF,
0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF,
0xFFFC, 0xFFF, 0xFFFF, 0xFFF0,
0x3FF, 0xFFFF, 0xFFC0, 0xFF,
0xFFFF, 0xFF00, 0x1F, 0xFFFF,
0xF800, 0x0, 0x7FFE, 0x0};
WORD IMAG4[] = { /* Data for second icon */
0x0, 0x0, 0x0, 0x0,
0x3FFC, 0x0, 0xF, 0xC003,
0xF000, 0x78, 0x180, 0x1E00,
0x180, 0x180, 0x180, 0x603,
0x180, 0xC060, 0x1C00, 0x6,
0x38, 0x3000, 0x18C, 0xC,
0x60C0, 0x198, 0x306, 0x6000,
0x1B0, 0x6, 0x4000, 0x1E0,
0x2, 0xC000, 0x1C0, 0x3,
0xCFC0, 0x180, 0x3F3, 0xC000,
0x0, 0x3, 0x4000, 0x0,
0x2, 0x6000, 0x0, 0x6,
0x60C0, 0x0, 0x306, 0x3000,
0x0, 0xC, 0x1C00, 0x0,
0x38, 0x603, 0x180, 0xC060,
0x180, 0x180, 0x180, 0x78,
0x180, 0x1E00, 0xF, 0xC003,
0xF000, 0x0, 0x3FFC, 0x0};
LONG rsfrstr[] = { /* Free string index - unused */
0};
BITBLK rsbitblk[] = { /* First entry is index to image data */
0L, 6, 24, 0, 0, 0};
LONG rsfrimg[] = { /* Free image index - unused */
0};
ICONBLK rsiconblk[] = {
1L, 2L, 10L, 4096,0,0, 0,0,48,24, 9,24,30,8, /* First pointer is mask */
3L, 4L, 17L, 4864,0,0, 0,0,48,24, 0,24,48,8}; /* Second is data, third */
/* is to title string */
TEDINFO rstedinfo[] = {
2L, 3L, 4L, 3, 6, 2, 0x1180, 0x0, -1, 14,1, /* First pointer is text */
7L, 8L, 9L, 3, 6, 2, 0x2072, 0x0, -3, 11,1, /* Second is template */
11L, 12L, 13L, 3, 6, 0, 0x1180, 0x0, -1, 1,15, /* Third is validation */
14L, 15L, 16L, 3, 6, 1, 0x1173, 0x0, 0, 1,17};
OBJECT rsobject[] = {
-1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 18,12, /* Pointers are to: */
2, -1, -1, GSTRING, NONE, NORMAL, 0x0L, 3,1, 12,1, /* rsstrings */
3, -1, -1, GBUTTON, 0x7, NORMAL, 0x1L, 5,9, 8,1, /* rsstrings */
0, 4, 4, GBOX, NONE, NORMAL, 0xFF1172L, 3,3, 12,5,
3, -1, -1, GIMAGE, LASTOB, NORMAL, 0x0L, 3,1, 6,3, /* rsbitblk */
-1, 1, 6, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 23,12,
2, -1, -1, GTEXT, NONE, NORMAL, 0x0L, 0,1, 23,1, /* rstedinfo */
6, 3, 5, GIBOX, NONE, NORMAL, 0x1100L, 6,3, 11,5,
4, -1, -1, GBUTTON, 0x11, NORMAL, 0x5L, 0,0, 11,1, /* rsstrings */
5, -1, -1, GBUTTON, 0x11, NORMAL, 0x6L, 0,2, 11,1, /* rsstrings */
2, -1, -1, GBOXCHAR, 0x11, NORMAL, 0x43FF1400L, 0,4, 11,1,
0, -1, -1, GBOXTEXT, 0x27, NORMAL, 0x1L, 5,9, 13,1, /* rstedinfo */
-1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 32,11,
2, -1, -1, GICON, NONE, NORMAL, 0x0L, 4,1, 6,4, /* rsiconblk */
3, -1, -1, GFTEXT, EDITABLE, NORMAL, 0x2L, 12,2, 14,1, /* rstedinfo */
0, 4, 4, GFBOXTEXT, 0xE, NORMAL, 0x3L, 3,5, 25,4, /* rstedinfo */
3, -1, -1, GICON, LASTOB, NORMAL, 0x1L, 1,0, 6,4}; /* rsiconblk */
LONG rstrindex[] = { /* Points to start of trees in */
0L, /* rsobject */
5L,
12L};
struct foobar { /* Temporary structure used by */
WORD dummy; /* RSCREATE when setting up image */
WORD *image; /* pointers. */
} rsimdope[] = {
0, &IMAG0[0],
0, &IMAG1[0],
0, &IMAG2[0],
0, &IMAG3[0],
0, &IMAG4[0]};
/* Counts of structures defined */
#define NUMSTRINGS 18
#define NUMFRSTR 0
#define NUMIMAGES 5
#define NUMBB 1
#define NUMFRIMG 0
#define NUMIB 2
#define NUMTI 4
#define NUMOBS 17
#define NUMTREE 3
BYTE pname[] = "DEMO.RSC";
Appendix III - Title change utility
/*
>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Title change utility <<<<<<<<<<<<<<<<<<<<<
*/
VOID
settext(tree, obj, str)
LONG tree, str;
WORD obj;
{
LONG obspec;
obspec = LLGET(OBSPEC(obj)); /* Get TEDINFO address */
LLSET(TEPTEXT(obspec), str); /* Set new text pointer */
LWSET(TETXTLEN(obspec), LSTRLEN(str)); /* Set new length */
}
Appendix III - Text edit code segment
/*
>>>>>>>>>>>>>>>>>>>>>> Text edit code segment <<<<<<<<<<<<<<<<<<<<<<<<<<
*/
LONG tree, obspec;
BYTE text[41];
rsrcgaddr(RTREE, DIALOG, &tree); /* Get tree address */
obspec = LLGET(OBSPEC(EDITOBJ)); /* Get TEDINFO address */
LLSET(TEPTEXT(obspec), ADDR(str)); /* Set new text pointer */
LWSET(TETXTLEN(obspec), 41); /* Set max length */
text[0] = '\0'; /* Make empty string */
Appendix III - Sample 68K only source code
/*
>>>>>>>>>>>>>>>>>>>> Sample 68K only source code <<<<<<<<<<<<<<<<<<<<<<
*/
VOID
settext(tree, obj, str)
OBJECT *tree;
WORD obj;
BYTE *str;
{
TEDINFO *obspec;
obspec = (TEDINFO *) (tree + obj)->obspec;
/* Get TEDINFO address */
obspec->teptext = str; /* Set new text pointer */
obspec->tetxtlen = strlen(str); /* Set new length */
}
Appendix III - Symbol definitions
/*
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Symbol definitions <<<<<<<<<<<<<<<<<<<<<<<<<
*/
/* Window parts */
#define NAME 0x0001
#define CLOSER 0x0002
#define FULLER 0x0004
#define MOVER 0x0008
#define INFO 0x0010
#define SIZER 0x0020
#define UPARROW 0x0040
#define DNARROW 0x0080
#define VSLIDE 0x0100
#define LFARROW 0x0200
#define RTARROW 0x0400
#define HSLIDE 0x0800
#define WFKIND 1 /* windget/set parameters */
#define WFNAME 2
#define WFINFO 3
#define WFWXYWH 4
#define WFCXYWH 5
#define WFPXYWH 6
#define WFFXYWH 7
#define WFHSLIDE 8
#define WFVSLIDE 9
#define WFTOP 10
#define WFFIRSTXYWH 11
#define WFNEXTXYWH 12
#define WFNEWDESK 14
#define WFHSLSIZ 15
#define WFVSLSIZ 16
/* window messages */
#define WMREDRAW 20
#define WMTOPPED 21
#define WMCLOSED 22
#define WMFULLED 23
#define WMARROWED 24
#define WMHSLID 25
#define WMVSLID 26
#define WMSIZED 27
#define WMMOVED 28
#define WMNEWTOP 29
/* arrow messages */
#define WAUPPAGE 0
#define WADNPAGE 1
#define WAUPLINE 2
#define WADNLINE 3
#define WALFPAGE 4
#define WARTPAGE 5
#define WALFLINE 6
#define WARTLINE 7
#define RTREE 0 /* Redraw definitions */
#define ROOT 0
#define MAXDEPTH 8
/* update flags */
#define ENDUPDATE 0
#define BEGUPDATE 1
#define ENDMCTRL 2
#define BEGMCTRL 3
/* Mouse state changes */
#define MOFF 256
#define MON 257
/* Object flags */
#define NONE 0x0
#define SELECTABLE 0x1
#define DEFAULT 0x2
#define EXIT 0x4
#define EDITABLE 0x8
#define RBUTTON 0x10
/* Object states */
#define SELECTED 0x1
#define CROSSED 0x2
#define CHECKED 0x4
#define DISABLED 0x8
#define OUTLINED 0x10
#define SHADOWED 0x20
#define GBOX 20
#define GTEXT 21
#define GBOXTEXT 22
#define GIMAGE 23
#define GIBOX 25
#define GBUTTON 26
#define GBOXCHAR 27
#define GSTRING 28
#define GFTEXT 29
#define GFBOXTEXT 30
#define GICON 31
#define GTITLE 32
/* Data structures */
typedef struct grect
{
int gx;
int gy;
int gw;
int gh;
} GRECT;
typedef struct object
{
int obnext; /* -> object's next sibling */
int obhead; /* -> head of object's children */
int obtail; /* -> tail of object's children */
unsigned int obtype; /* type of object- BOX, CHAR,...*/
unsigned int obflags; /* flags */
unsigned int obstate; /* state- SELECTED, OPEN, ... */
long obspec; /* "out"- -> anything else */
int obx; /* upper left corner of object */
int oby; /* upper left corner of object */
int obwidth; /* width of obj */
int obheight; /* height of obj */
} OBJECT;
typedef struct textedinfo
{
long teptext; /* ptr to text (must be 1st) */
long teptmplt; /* ptr to template */
long tepvalid; /* ptr to validation chrs. */
int tefont; /* font */
int tejunk1; /* junk word */
int tejust; /* justification- left, right...*/
int tecolor; /* color information word */
int tejunk2; /* junk word */
int tethickness; /* border thickness */
int tetxtlen; /* length of text string */
int tetmplen; /* length of template string */
} TEDINFO;
/* "Portable" data definitions */
#define OBNEXT(x) (tree + (x) * sizeof(OBJECT) + 0)
#define OBHEAD(x) (tree + (x) * sizeof(OBJECT) + 2)
#define OBTAIL(x) (tree + (x) * sizeof(OBJECT) + 4)
#define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6)
#define OBFLAGS(x) (tree + (x) * sizeof(OBJECT) + 8)
#define OBSTATE(x) (tree + (x) * sizeof(OBJECT) + 10)
#define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12)
#define OBX(x) (tree + (x) * sizeof(OBJECT) + 16)
#define OBY(x) (tree + (x) * sizeof(OBJECT) + 18)
#define OBWIDTH(x) (tree + (x) * sizeof(OBJECT) + 20)
#define OBHEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22)
#define TEPTEXT(x) (x)
#define TETXTLEN(x) (x + 24)
Appendix IV - Sample object trees
/*
>>>>>>>>>>>>>>>>>>>>>>>>>>> Sample object trees <<<<<<<<<<<<<<<<<<<<<<<<
*/
OBJECT rsobject[] = {
-1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 18,12, /* Tree # 1 */
2, -1, -1, GSTRING, NONE, NORMAL, 0x0L, 3,1, 12,1,
3, -1, -1, GBUTTON, 0x7, NORMAL, 0x1L, 5,9, 8,1,
0, 4, 4, GBOX, NONE, NORMAL, 0xFF1172L, 3,3, 12,5,
3, -1, -1, GIMAGE, LASTOB, NORMAL, 0x0L, 3,1, 6,3,
-1, 1, 6, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 23,12, /* Tree # 2 */
2, -1, -1, GTEXT, NONE, NORMAL, 0x0L, 0,1, 23,1,
6, 3, 5, GIBOX, NONE, NORMAL, 0x1100L, 6,3, 11,5,
4, -1, -1, GBUTTON, 0x11, NORMAL, 0x5L, 0,0, 11,1,
5, -1, -1, GBUTTON, 0x11, NORMAL, 0x6L, 0,2, 11,1,
2, -1, -1, GBOXCHAR, 0x11, NORMAL, 0x43FF1400L, 0,4, 11,1,
0, -1, -1, GBOXTEXT, 0x27, NORMAL, 0x1L, 5,9, 13,1,
-1, 1, 3, GBOX, NONE, OUTLINED, 0x21100L, 0,0, 32,11, /* Tree # 3 */
2, -1, -1, GICON, NONE, NORMAL, 0x0L, 4,1, 6,4,
3, -1, -1, GFTEXT, EDITABLE, NORMAL, 0x2L, 12,2, 14,1,
0, 4, 4, GFBOXTEXT, 0xE, NORMAL, 0x3L, 3,5, 25,4,
3, -1, -1, GICON, LASTOB, NORMAL, 0x1L, 1,0, 6,4};
Appendix IV - Object tree walk utility
/*
>>>>>>>>>>>>>>>>>>>>>>>>>> Object tree walk utility <<<<<<<<<<<<<<<<<<<<<<
*/
VOID
maptree(tree, this, last, routine)
LONG tree;
WORD this, last;
WORD (*routine)();
{
WORD tmp1;
tmp1 = this; /* Initialize to impossible value: */
/* TAIL won't point to self! */
/* Look until final node, or off */
/* the end of tree */
while (this != last && this != NIL)
/* Did we 'pop' into this node */
/* for the second time? */
if (LWGET(OBTAIL(this)) != tmp1)
{
tmp1 = this; /* This is a new node */
this = NIL;
/* Apply operation, testing */
/* for rejection of sub-tree */
if ((*routine)(tree, tmp1))
this = LWGET(OBHEAD(tmp1));
/* Subtree path not taken, */
/* so traverse right */
if (this == NIL)
this = LWGET(OBNEXT(tmp1));
}
else /* Revisiting parent: */
/* No operation, move right */
{
tmp1 = this;
this = LWGET(OBNEXT(tmp1));
}
}
Appendix IV - Sample routine to use with maptree()
/*
>>>>>>>>>>>>>>>>>> Sample routine to use with maptree() <<<<<<<<<<<<<<<
*/
VOID
undoobj(tree, which, bit) /* clear specified bit in object state */
LONG tree;
WORD which, bit;
{
WORD state;
state = LWGET(OBSTATE(which));
LWSET(OBSTATE(which), state & ~bit);
}
VOID
deselobj(tree, which) /* turn off selected bit of spcfd object*/
LONG tree;
WORD which;
{
undoobj(tree, which, SELECTED);
return (TRUE);
}
Appendix IV - Sample .ICN Files
/*
>>>>>>>>>>>>>>>>>>>>>>>>>> Sample .ICN Files <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>> Save everything between >>><<< lines as CLOCK.ICN <<<<<<<<<<<<<<
*/
/* GEM Icon Definition: */
#define ICONW 0x0030
#define ICONH 0x0018
#define DATASIZE 0x0048
UWORD clock[DATASIZE] =
{ 0x0000, 0x0000, 0x0000, 0x0000,
0x3FFC, 0x0000, 0x000F, 0xC003,
0xF000, 0x0078, 0x0180, 0x1E00,
0x0180, 0x0180, 0x0180, 0x0603,
0x0180, 0xC060, 0x1C00, 0x0006,
0x0038, 0x3000, 0x018C, 0x000C,
0x60C0, 0x0198, 0x0306, 0x6000,
0x01B0, 0x0006, 0x4000, 0x01E0,
0x0002, 0xC000, 0x01C0, 0x0003,
0xCFC0, 0x0180, 0x03F3, 0xC000,
0x0000, 0x0003, 0x4000, 0x0000,
0x0002, 0x6000, 0x0000, 0x0006,
0x60C0, 0x0000, 0x0306, 0x3000,
0x0000, 0x000C, 0x1C00, 0x0000,
0x0038, 0x0603, 0x0180, 0xC060,
0x0180, 0x0180, 0x0180, 0x0078,
0x0180, 0x1E00, 0x000F, 0xC003,
0xF000, 0x0000, 0x3FFC, 0x0000
};
/*
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End of CLOCK.ICN <<<<<<<<<<<<<<<<<<<<<<<<<<
*/
/*
>>>>>>>>> Save everything between >>>><<<<< lines as CLOCKM.ICN <<<<<<<<<<
*/
/* GEM Icon Definition: */
#define ICONW 0x0030
#define ICONH 0x0018
#define DATASIZE 0x0048
UWORD clockm[DATASIZE] =
{ 0x0000, 0x0000, 0x0000, 0x0000,
0x7FFE, 0x0000, 0x001F, 0xFFFF,
0xFC00, 0x00FF, 0xFFFF, 0xFF00,
0x03FF, 0xFFFF, 0xFFC0, 0x0FFF,
0xFFFF, 0xFFF0, 0x3FFF, 0xFFFF,
0xFFFC, 0x7FFF, 0xFFFF, 0xFFFE,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0x7FFF,
0xFFFF, 0xFFFE, 0x3FFF, 0xFFFF,
0xFFFC, 0x0FFF, 0xFFFF, 0xFFF0,
0x03FF, 0xFFFF, 0xFFC0, 0x00FF,
0xFFFF, 0xFF00, 0x001F, 0xFFFF,
0xF800, 0x0000, 0x7FFE, 0x0000
};
/*
>>>>>>>>>>>>>>>>>>>>>>>>> End of CLOCKM.ICN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
*/
Appendix V - MFDB Structure
/* >>>>>>>>>>>>>>>>>>>>>>>>>>> MFDB Structure <<<<<<<<<<<<<<<<<<<<<<<<<< */
/* Memory Form Definition Block */
typedef struct fdbstr
{
long fdaddr; /* Form address */
int fdw; /* Form width in pixels */
int fdh; /* Form height in pixels */
int fdwdwidth; /* Form width in memory words */
int fdstand; /* Standard form flag */
int fdnplanes; /* Number of color planes */
int fdr1; /* Dummy locations: */
int fdr2; /* Reserved for future use */
int fdr3;
} MFDB;
Appendix V - Resource Transform Utilities
/* >>>>>>>>>>>>>>>>>>>> Resource Transform Utilities <<<<<<<<<<<<<<<<<< */
/*------------------------------*/
/* vdifix */
/*------------------------------*/
VOID
vdifix(pfd, theaddr, wb, h) /* This routine loads the MFDB */
MFDB *pfd; /* Input values are the MFDB's */
LONG theaddr; /* address, the form's address,*/
WORD wb, h; /* the form's width in bytes, */
{ /* and the height in pixels */
pfd->fww = wb >> 1;
pfd->fwp = wb << 3;
pfd->fh = h;
pfd->np = 1; /* Monochrome assumed */
pfd->mp = theaddr;
}
/*------------------------------*/
/* vditrans */
/*------------------------------*/
WORD
vditrans(saddr, swb, daddr, dwb, h) /* Transform the standard form */
LONG saddr; /* pointed at by saddr and */
UWORD swb; /* store in the form at daddr */
LONG daddr; /* Byte widths and pixel height*/
UWORD dwb; /* are given */
UWORD h;
{
MFDB src, dst; /* These are on-the-fly MFDBs */
vdifix(&src, saddr, swb, h); /* Load the source MFDB */
src.ff = TRUE; /* Set it's std form flag */
vdifix(&dst, daddr, dwb, h); /* Load the destination MFDB */
dst.ff = FALSE; /* Clear the std flag */
vrtrnfm(vdihandle, &src, &dst ); /* Call the VDI */
}
/*------------------------------*/
/* transbitblk */
/*------------------------------*/
VOID
transbitblk(obspec) /* Transform the image belonging */
LONG obspec; /* to the bitblk pointed to by */
{ /* obspec. This routine may also*/
LONG taddr; /* be used with free images */
WORD wb, hl;
if ( (taddr = LLGET(BIPDATA(obspec))) == -1L)
return; /* Get and validate image address */
wb = LWGET(BIWB(obspec)); /* Extract image dimensions */
hl = LWGET(BIHL(obspec));
vditrans(taddr, wb, taddr, wb, hl); /* Perform a transform */
} /* in place */
/*------------------------------*/
/* transobj */
/*------------------------------*/
VOID
transobj(tree, obj) /* Examine the input object. If */
LONG tree; /* it is an icon or image, trans- */
WORD obj; /* form the associated raster */
{ /* forms in place. */
WORD type, wb, hl; /* This routine may be used with */
LONG taddr, obspec; /* maptree() to transform an */
/* entire resource tree */
type = LLOBT(LWGET(OBTYPE(obj))); /* Load object type */
if ( (obspec = LLGET(OBSPEC(obj))) == -1L) /* Load and check */
return (TRUE); /* obspec pointer */
switch (type) {
case GIMAGE:
transbitblk(obspec); /* Transform image */
return (TRUE);
case GICON: /* Load icon size */
hl = LWGET(IBHICON(obspec));
wb = (LWGET(IBWICON(obspec)) + 7) >> 3;
/* Transform data */
if ( (taddr = LLGET(IBPDATA(obspec))) != -1L)
vditrans(taddr, wb, taddr, wb, hl);
/* Transform mask */
if ( (taddr = LLGET(IBPMASK(obspec))) != -1L)
vditrans(taddr, wb, taddr, wb, hl);
return (TRUE);
default:
return (TRUE);
}
}
/* >>>>>>>>>>>>>>>> Macro definitions for the code above <<<<<<<<<<<<<<< */
#define BIPDATA(x) (x)
#define BIWB(x) (x + 4)
#define BIHL(x) (x + 6)
#define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6)
#define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12)
#define IBPMASK(x) (x)
#define IBPDATA(x) (x + 4)
#define IBWICON(x) (x + 22)
#define IBHICON(x) (x + 24)
Appendix V - VDI Copy Mode Table
/* >>>>>>>>>>>>>>>>>>>>>>>> VDI Copy Mode Table <<<<<<<<<<<<<<<<<<<<<<<<< */
Symbols: N = new destination pixel value (0 or 1)
D = old destination pixel value (0 or 1)
S = source pixel value (0 or 1)
~ = Boolean not (inversion)
& = Boolean and
| = Boolean or
^ = Boolean xor (exclusive-or)
Mode Number Action
---------- ------
0 N = 0 (USE VBAR INSTEAD)
1 N = S & D
2 N = S & ~D
3 N = S (REPLACE)
4 N = ~S & D (ERASE)
5 N = D (USELESS)
6 N = S ^ D (XOR)
7 N = S | D (TRANSPARENT)
8 N = ~ (S | D)
9 N = ~ (S ^ D)
10 N = ~D (USE VBAR INSTEAD)
11 N = S | ~D
12 N = ~S
13 N = ~S | D (REVERSE TRANSPARENT)
14 N = ~ (S & D)
15 N = 1 (USE VBAR INSTEAD)
/* >>>>>>>>>>>>>>>>>>>>>>>> END OF DOWNLOAD <<<<<<<<<<<<<<<<<<<<<<<<<< */
Appendix VI - Download file for GEM column #7
/*
>>>>>>>>>>>>>>>>>>>>>> Download file for GEM column #7 <<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Sample Menu Tree <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
*/
-1, 1, 6, GIBOX, NONE, NORMAL, 0x0L, 0,0, 80,25, /* ROOT */
6, 2, 2, GBOX, NONE, NORMAL, 0x1100L, 0,0, 80,513, /* THE BAR */
1, 3, 5, GIBOX, NONE, NORMAL, 0x0L, 2,0, 20,769, /* THE ACTIVE */
4, -1, -1, GTITLE, NONE, NORMAL, 0x0L, 0,0, 6,769, /* Title #1 */
5, -1, -1, GTITLE, NONE, NORMAL, 0x1L, 6,0, 6,769, /* Title #2 */
2, -1, -1, GTITLE, NONE, NORMAL, 0x2L, 12,0, 8,769, /* Title #3 */
0, 7, 22, GIBOX, NONE, NORMAL, 0x0L, 0,769, 80,19, /* THE SCREEN */
16, 8, 15, GBOX, NONE, NORMAL, 0xFF1100L, 2,0, 20,8, /* Drop-down #1 */
9, -1, -1, GSTRING, NONE, NORMAL, 0x3L, 0,0, 19,1, /* About... entry */
10, -1, -1, GSTRING, NONE, DISABLED, 0x4L, 0,1, 20,1,
11, -1, -1, GSTRING, NONE, NORMAL, 0x5L, 0,2, 20,1, /* Desk acc entries */
12, -1, -1, GSTRING, NONE, NORMAL, 0x6L, 0,3, 20,1,
13, -1, -1, GSTRING, NONE, NORMAL, 0x7L, 0,4, 20,1,
14, -1, -1, GSTRING, NONE, NORMAL, 0x8L, 0,5, 20,1,
15, -1, -1, GSTRING, NONE, NORMAL, 0x9L, 0,6, 20,1,
7, -1, -1, GSTRING, NONE, NORMAL, 0xAL, 0,7, 20,1,
22, 17, 21, GBOX, NONE, NORMAL, 0xFF1100L, 8,0, 13,5, /* Drop-down #2 */
18, -1, -1, GSTRING, NONE, NORMAL, 0xBL, 0,0, 13,1,
19, -1, -1, GSTRING, NONE, DISABLED, 0xCL, 0,1, 13,1,
20, -1, -1, GSTRING, NONE, NORMAL, 0xDL, 0,4, 13,1,
21, -1, -1, GSTRING, NONE, NORMAL, 0xEL, 0,2, 13,1,
16, -1, -1, GSTRING, NONE, DISABLED, 0xFL, 0,3, 13,1,
6, 23, 25, GBOX, NONE, NORMAL, 0xFF1100L, 14,0, 26,3, /* Drop down #3 */
24, -1, -1, GSTRING, NONE, NORMAL, 0x10L, 0,2, 26,1,
25, -1, -1, GSTRING, NONE, NORMAL, 0x11L, 0,0, 26,1,
22, -1, -1, GSTRING, LASTOB, DISABLED, 0x12L, 0,1, 26,1
/*
>>>>>>>>>>>>>>>>>>>>>>>> Menu enable/disable utility <<<<<<<<<<<<<<<<<<<<<<
*/
/*------------------------------*/
/* undoobj */
/*------------------------------*/
VOID
undoobj(tree, which, bit)
LONG tree;
WORD which;
UWORD bit;
{
WORD state;
state = LWGET(OBSTATE(which));
LWSET(OBSTATE(which), state & ~bit);
}
/*------------------------------*/
/* enabobj */
/*------------------------------*/
WORD
enabobj(tree, which)
LONG tree;
WORD which;
{
undoobj(tree, which, (UWORD) DISABLED);
return (TRUE);
}
/*------------------------------*/
/* doobj */
/*------------------------------*/
VOID
doobj(tree, which, bit)
LONG tree;
WORD which;
UWORD bit;
{
WORD state;
state = LWGET(OBSTATE(which));
LWSET(OBSTATE(which), state | bit);
}
/*------------------------------*/
/* disabobj */
/*------------------------------*/
WORD
disabobj(tree, which)
LONG tree;
WORD which;
{
doobj(tree, which, (UWORD) DISABLED);
return (TRUE);
}
/*------------------------------*/
/* setmenu */
/*------------------------------*/
VOID
setmenu(tree, change) /* change[0] TRUE selects all entries*/
LONG tree; /* FALSE deselects all. Change list */
WORD *change; /* of items is then toggled. */
{
WORD dflt, screen, drop, obj;
dflt = *change++; /* What is default? */
screen = LWGET(OBTAIL(ROOT)); /* Get SCREEN */
drop = LWGET(OBHEAD(screen)); /* Get DESK drop-down */
/* and skip it */
for (; (drop = LWGET(OBNEXT(drop))) != screen; )
{
obj = LWGET(OBHEAD(drop));
if (obj != NIL)
if (dflt)
maptree(tree, obj, drop, enabobj);
else
maptree(tree, obj, drop, disabobj);
}
for (; *change; change++)
if (dflt)
disabobj(tree, *change);
else
enabobj(tree, *change);
}
/*
>>>>>>>>>>>>>>>>>>>>> Definitions used in this article <<<<<<<<<<<<<<<<<<<<<<
*/
#define ROOT 0
#define GIBOX 25
#define GSTRING 28
#define GTITLE 32
#define RTREE 0
#define MNSELECTED 10
#define CHECKED 0x4
#define DISABLED 0x8
#define OBNEXT(x) (tree + (x) * sizeof(OBJECT) + 0)
#define OBHEAD(x) (tree + (x) * sizeof(OBJECT) + 2)
#define OBTAIL(x) (tree + (x) * sizeof(OBJECT) + 4)
#define OBTYPE(x) (tree + (x) * sizeof(OBJECT) + 6)
#define OBFLAGS(x) (tree + (x) * sizeof(OBJECT) + 8)
#define OBSTATE(x) (tree + (x) * sizeof(OBJECT) + 10)
#define OBSPEC(x) (tree + (x) * sizeof(OBJECT) + 12)
#define OBX(x) (tree + (x) * sizeof(OBJECT) + 16)
#define OBY(x) (tree + (x) * sizeof(OBJECT) + 18)
#define OBWIDTH(x) (tree + (x) * sizeof(OBJECT) + 20)
#define OBHEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22)
#define MOFF 256
#define MON 257
Appendix VII - Routines to set clip to a GRECT
/*
>>>>>>>>>>>>>>>> Routines to set clip to a GRECT <<<<<<<<<<<<<<<<
*/
VOID
grecttoarray(area, array) /* convert x,y,w,h to upr lt x,y and */
GRECT *area; /* lwr rt x,y */
WORD *array;
{
*array++ = area->gx;
*array++ = area->gy;
*array++ = area->gx + area->gw - 1;
*array = area->gy + area->gh - 1;
}
VOID
setclip(clipflag, sarea) /* set clip to specified area */
WORD clipflag;
GRECT *sarea;
{
WORD pxy[4];
grecttoarray(sarea, pxy);
vsclip(vdihandle, clipflag, pxy);
}
Appendix VII - Routines to set attributes before output
/*
>>>>>>>>>> Routines to set attributes before output <<<<<<<<<<<<
*/
VOID
rrperim(mode, color, type, width, pxy) /* Draw a rounded */
WORD mode, color, width, *pxy; /* rectangle outline */
{
vswrmode(vdihandle, mode);
vslcolor(vdihandle, color);
vsltype(vdihandle, type);
vslwidth(vdihandle, width);
vrbox(vdihandle, pxy);
vswrmode(vdihandle, MDREPLACE);
}
VOID
plperim(mode, type, color, width, npts, pxy) /* Draw a polygonal */
/* figure */
WORD mode, type, color, width, npts, *pxy;
{
vswrmode(vdihandle, mode);
vsltype(vdihandle, type);
vslcolor(vdihandle, color);
vslwidth(vdihandle, width);
vpline(vdihandle, npts, pxy);
}
VOID /* Draw a filled polygonal area */
plfill(mode, perim, color, interior, style, npts, pxy)
WORD mode, perim, color, interior, style, npts, *pxy;
{
vswrmode(vdihandle, mode);
vsfcolor(vdihandle, color);
vsfstyle(vdihandle, style);
vsfinterior(vdihandle, interior);
vsfperimeter(vdihandle, perim);
vfillarea(vdihandle, npts, pxy);
}
VOID /* Draw a filled rectangle */
rectfill(mode, perim, color, interior, style, pxy)
WORD mode, perim, color, style, interior, *pxy;
{
vswrmode(vdihandle, mode);
vsfcolor(vdihandle, color);
vsfstyle(vdihandle, style);
vsfinterior(vdihandle, interior);
vsfperimeter(vdihandle, perim);
vrrecfl(vdihandle, pxy);
}
Appendix VIII - Demonstration of byte alignment of window interior
/*
>>>>>>>>>>> Demonstration of byte alignment of window interior <<<<<<<<<<<
*/
#define FEATURES 0x0fef /* what border features are used */
WORD msg[8]; /* message from evntmulti */
GRECT workarea; /* defines working area */
WORD whndl; /* handle for window being changed */
windcalc(1, FEATURES, msg[4], msg[5], msg[6], msg[7],
&workarea.gx, &workarea.gy, &workarea.gw,
&workarea.gh);
workarea.gx = alignx(workarea.gx);
workarea.gw = alignx(workarea.gw);
windcalc(0, FEATURES, workarea.gx, workarea.gy,
workarea.gw, workarea.gh, &msg[4], &msg[5],
&msg[6], &msg[7]);
windset(whndl, WFCXYWH, msg[4], msg[5], msg[6], msg[7]);
/*
>>>>>>>>>>>>>>>>>>>>> Subroutine for above <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
*/
WORD
alignx(x) /* forces word alignment for column position */
WORD x; /* rounding to nearest word */
{
return((x & 0xfff0) + ((x & 0x0008) ? 0x0010 : 0));
}
/*
>>>>>>>>>>>>>>>>>>>>> Standard vgtext binding <<<<<<<<<<<<<<<<<<<<<<<<<
*/
WORD
vgtext( handle, x, y, string)
WORD handle, x, y;
BYTE *string;
{
WORD i;
ptsin[0] = x;
ptsin[1] = y;
i = 0;
while (intin[i++] = *string++) /* Copy characters to intin */
; /* There is NO error checking! */
contrl[0] = 8;
contrl[1] = 1;
contrl[3] = --i;
contrl[6] = handle;
vdi();
}