home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 09 / dflat.991 < prev    next >
Text File  |  1991-08-21  |  34KB  |  898 lines

  1. _C PROGRAMMING COLUMN_
  2. by Al Stevens
  3.  
  4. [LISTING ONE]
  5.  
  6. /* ------------ menu.h ------------- */
  7. #ifndef MENU_H
  8. #define MENU_H
  9.  
  10. /* ----------- popdown menu selection structure
  11.        one for each selection on a popdown menu --------- */
  12. struct PopDown {
  13.     char *SelectionTitle;  /* title of the selection      */
  14.     int ActionId;          /* the command executed        */
  15.     int Accelerator;       /* the accelerator key         */
  16.     int Attrib;            /* INACTIVE | CHECKED | TOGGLE */
  17.     char *help;            /* Help mnemonic               */
  18. };
  19.  
  20. /* ----------- popdown menu structure
  21.        one for each popdown menu on the menu bar -------- */
  22. typedef struct Menu {
  23.     char *Title;           /* title on the menu bar       */
  24.     void (*PrepMenu)(void *, struct Menu *); /* function  */
  25.     struct PopDown Selections[23]; /* up to 23 selections */
  26.     int Selection;         /* most recent selection       */
  27. } MENU;
  28.  
  29. /* --------- macros to define a menu bar with
  30.                  popdowns and selections ------------- */
  31. #define SEPCHAR "\xc4"
  32. #define DEFMENU(m) MENU m[]= {
  33. #define POPDOWN(ttl,func)      {ttl,func,{
  34. #define SELECTION(stxt,acc,id,attr)   {stxt,acc,id,attr,#acc},
  35. #define SEPARATOR                     {SEPCHAR},
  36. #define ENDPOPDOWN                    {NULL},0}},
  37. #define ENDMENU                {NULL} };
  38.  
  39. /* -------- menu selection attributes -------- */
  40. #define INACTIVE    1
  41. #define CHECKED     2
  42. #define TOGGLE      4
  43.  
  44. /* --------- the standard menus ---------- */
  45. extern MENU MainMenu[];
  46. extern MENU SystemMenu[];
  47. extern MENU *ActiveMenu;
  48.  
  49. int MenuHeight(struct PopDown *);
  50. int MenuWidth(struct PopDown *);
  51.  
  52. #endif
  53.  
  54.  
  55.  
  56. [LISTING TWO]
  57.  
  58. /* -------------- menus.c ------------- */
  59. #include <stdio.h>
  60. #include "dflat.h"
  61.  
  62. /* --------------------- the main menu --------------------- */
  63. DEFMENU(MainMenu)
  64.     /* --------------- the File popdown menu ----------------*/
  65.     POPDOWN(       "~File",  PrepFileMenu    )
  66.         SELECTION( "~New",        ID_NEW,          0, 0 )
  67. #ifdef INCLUDE_DIALOG_BOXES
  68.         SELECTION( "~Open...",    ID_OPEN,         0, 0 )
  69.         SEPARATOR
  70. #endif
  71.         SELECTION( "~Save",       ID_SAVE,     ALT_S, INACTIVE)
  72. #ifdef INCLUDE_DIALOG_BOXES
  73.         SELECTION( "Save ~as...", ID_SAVEAS,       0, INACTIVE)
  74. #endif
  75.         SEPARATOR
  76.         SELECTION( "~Print",      ID_PRINT,        0, INACTIVE)
  77.         SEPARATOR
  78.         SELECTION( "~DOS",        ID_DOS,          0, 0 )
  79.         SELECTION( "E~xit",       ID_EXIT,     ALT_X, 0 )
  80.     ENDPOPDOWN
  81.     /* --------------- the Edit popdown menu ----------------*/
  82.     POPDOWN(       "~Edit", PrepEditMenu    )
  83.         SELECTION( "~Undo",      ID_UNDO,  ALT_BS,    INACTIVE)
  84. #ifdef INCLUDE_CLIPBOARD
  85.         SEPARATOR
  86.         SELECTION( "Cu~t",       ID_CUT,   SHIFT_DEL, INACTIVE)
  87.         SELECTION( "~Copy",      ID_COPY,  CTRL_INS,  INACTIVE)
  88.         SELECTION( "~Paste",     ID_PASTE, SHIFT_INS, INACTIVE)
  89.         SEPARATOR
  90.         SELECTION( "Cl~ear",     ID_CLEAR, 0,         INACTIVE)
  91. #endif
  92.         SELECTION( "~Delete",    ID_DELETETEXT, DEL,  INACTIVE)
  93.         SEPARATOR
  94.         SELECTION( "Pa~ragraph", ID_PARAGRAPH,  ALT_P,INACTIVE)
  95.     ENDPOPDOWN
  96.     /* ------------- the Options popdown menu ---------------*/
  97.     POPDOWN(       "~Options", NULL     )
  98.         SELECTION( "~Insert",       ID_INSERT,     INS, TOGGLE)
  99.         SELECTION( "~Word wrap",    ID_WRAP,        0,  TOGGLE)
  100. #ifdef INCLUDE_DIALOG_BOXES
  101.         SELECTION( "~Tabs...",      ID_TABS,        0,      0 )
  102.         SEPARATOR
  103.         SELECTION( "~Display...",   ID_DISPLAY,     0,      0 )
  104. #ifdef INCLUDE_LOGGING
  105.         SEPARATOR
  106.         SELECTION( "~Log Messages       ",ID_LOG,   0,      0 )
  107. #endif
  108. #endif
  109.         SEPARATOR
  110.         SELECTION( "~Save Options", ID_SAVEOPTIONS, 0,      0 )
  111.     ENDPOPDOWN
  112.  
  113. #ifdef INCLUDE_MULTIDOCS
  114.     /* --------------- the Window popdown menu --------------*/
  115.     POPDOWN( "~Window", PrepWindowMenu        )
  116.         SELECTION(  NULL,  ID_CLOSEALL, 0, 0)
  117.         SEPARATOR
  118.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  119.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  120.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  121.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  122.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  123.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  124.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  125.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  126.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  127.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  128.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  129.         SELECTION(  "~More Windows...", ID_WINDOW, 0, 0)
  130.         SELECTION(  NULL,  ID_WINDOW, 0, 0 )
  131.     ENDPOPDOWN
  132. #endif
  133. #ifdef INCLUDE_HELP
  134.     /* --------------- the Help popdown menu ----------------*/
  135.     POPDOWN( "~Help", NULL  )
  136.         SELECTION(  "~Help for help...",  ID_HELPHELP,  0, 0 )
  137.         SELECTION(  "~Extended help...",  ID_EXTHELP,   0, 0 )
  138.         SELECTION(  "~Keys help...",      ID_KEYSHELP,  0, 0 )
  139.         SELECTION(  "Help ~index...",     ID_HELPINDEX, 0, 0 )
  140.         SEPARATOR
  141.         SELECTION(  "~About...",          ID_ABOUT,     0, 0 )
  142. #ifdef INCLUDE_RELOADHELP
  143.         SEPARATOR
  144.         SELECTION(  "~Reload Help Database",ID_LOADHELP,0, 0 )
  145. #endif
  146.     ENDPOPDOWN
  147. #endif
  148.  
  149. ENDMENU
  150.  
  151. #ifdef INCLUDE_SYSTEM_MENUS
  152. /* ------------- the System Menu --------------------- */
  153. DEFMENU(SystemMenu)
  154.     POPDOWN("System Menu", NULL)
  155.         SELECTION("~Restore",  ID_SYSRESTORE,  0,         0 )
  156.         SELECTION("~Move",     ID_SYSMOVE,     0,         0 )
  157.         SELECTION("~Size",     ID_SYSSIZE,     0,         0 )
  158.         SELECTION("Mi~nimize", ID_SYSMINIMIZE, 0,         0 )
  159.         SELECTION("Ma~ximize", ID_SYSMAXIMIZE, 0,         0 )
  160.         SEPARATOR
  161.         SELECTION("~Close",    ID_SYSCLOSE,    CTRL_F4,   0 )
  162.     ENDPOPDOWN
  163. ENDMENU
  164.  
  165. #endif
  166.  
  167.  
  168. [LISTING THREE]
  169.  
  170. /* ----------------- dialbox.h ---------------- */
  171. #ifndef DIALOG_H
  172. #define DIALOG_H
  173.  
  174. #include <stdio.h>
  175.  
  176. #define MAXCONTROLS 25
  177.  
  178. #define OFF FALSE
  179. #define ON  TRUE
  180. /* -------- dialog box and control window structure ------- */
  181. typedef struct  {
  182.     char *title;    /* window title         */
  183.     int x, y;       /* relative coordinates */
  184.     int h, w;       /* size                 */
  185. } DIALOGWINDOW;
  186. /* ------ one of these for each control window ------- */
  187. typedef struct {
  188.     DIALOGWINDOW dwnd;
  189.     int class;      /* LISTBOX, BUTTON, etc */
  190.     char *itext;    /* initialized text     */
  191.     char *vtext;    /* variable text        */
  192.     int command;    /* command code         */
  193.     char *help;     /* help mnemonic        */
  194.     int isetting;   /* initially ON or OFF  */
  195.     int setting;    /* ON or OFF            */
  196.     void *wnd;      /* window handle        */
  197. } CTLWINDOW;
  198. /* --------- one of these for each dialog box ------- */
  199. typedef struct {
  200.     char *HelpName;
  201.     DIALOGWINDOW dwnd;
  202.     CTLWINDOW ctl[MAXCONTROLS+1];
  203. } DBOX;
  204. /* -------- macros for dialog box resource compile -------- */
  205. #define DIALOGBOX(db) DBOX db={ #db,
  206. #define DB_TITLE(ttl,x,y,h,w) {ttl,x,y,h,w},{
  207. #define CONTROL(ty,tx,x,y,h,w,c) \
  208.  {{NULL,x,y,h,w},ty,tx,NULL,c,#c,(ty==BUTTON?ON:OFF),OFF,NULL},
  209. #define ENDDB }};
  210.  
  211. #define Cancel  " Cancel "
  212. #define Ok      "   OK   "
  213. #define Yes     "  Yes   "
  214. #define No      "   No   "
  215.  
  216. #endif
  217.  
  218.  
  219. [LISTING FOUR]
  220.  
  221. /* ----------- dialogs.c --------------- */
  222. #include "dflat.h"
  223.  
  224. #ifdef INCLUDE_DIALOG_BOXES
  225.  
  226. /* -------------- the File Open dialog box --------------- */
  227. DIALOGBOX( FileOpen )
  228.     DB_TITLE(        "Open File",    -1,-1,19,48)
  229.     CONTROL(TEXT,    "~Filename",     2, 1, 1, 8, ID_FILENAME)
  230.     CONTROL(EDITBOX, NULL,           13, 1, 1,29, ID_FILENAME)
  231.     CONTROL(TEXT,    "Directory:",    2, 3, 1,10, 0 )
  232.     CONTROL(TEXT,    NULL,           13, 3, 1,28, ID_PATH ) 
  233.     CONTROL(TEXT,    "F~iles",        2, 5, 1, 5, ID_FILES )
  234.     CONTROL(LISTBOX, NULL,            2, 6,11,16, ID_FILES )
  235.     CONTROL(TEXT,    "~Directories", 19, 5, 1,11, ID_DRIVE )
  236.     CONTROL(LISTBOX, NULL,           19, 6,11,16, ID_DRIVE ) 
  237.     CONTROL(BUTTON,  "   ~OK   ",    36, 7, 1, 8, ID_OK)
  238.     CONTROL(BUTTON,  " ~Cancel ",    36,10, 1, 8, ID_CANCEL)
  239.     CONTROL(BUTTON,  "  ~Help  ",    36,13, 1, 8, ID_HELP)
  240. ENDDB
  241. /* -------------- the Save As dialog box --------------- */
  242. DIALOGBOX( SaveAs )
  243.     DB_TITLE(        "Save As",    -1,-1,19,48)
  244.     CONTROL(TEXT,    "~Filename",   2, 1, 1, 8, ID_FILENAME)
  245.     CONTROL(EDITBOX, NULL,         13, 1, 1,29, ID_FILENAME)
  246.     CONTROL(TEXT,    "Directory:",  2, 3, 1,10, 0 )
  247.     CONTROL(TEXT,    NULL,         13, 3, 1,28, ID_PATH ) 
  248.     CONTROL(TEXT,    "~Directories",2, 5, 1,11, ID_DRIVE )
  249.     CONTROL(LISTBOX, NULL,          2, 6,11,16, ID_DRIVE ) 
  250.     CONTROL(BUTTON,  "   ~OK   ",  36, 7, 1, 8, ID_OK)
  251.     CONTROL(BUTTON,  " ~Cancel ",  36,10, 1, 8, ID_CANCEL)
  252.     CONTROL(BUTTON,  "  ~Help  ",  36,13, 1, 8, ID_HELP)
  253. ENDDB
  254. /* -------------- generic message dialog box --------------- */
  255. DIALOGBOX( MsgBox )
  256.     DB_TITLE(       NULL,  -1,-1, 0, 0)
  257.     CONTROL(TEXT,   NULL,   1, 1, 0, 0, 0)
  258.     CONTROL(BUTTON, NULL,   0, 0, 1, 8, ID_OK)
  259.     CONTROL(0,      NULL,   0, 0, 1, 8, ID_CANCEL)
  260. ENDDB
  261.  
  262. #ifdef INCLUDE_MULTIDOCS
  263. #define offset 4
  264. #else
  265. #define offset 0
  266. #endif
  267. /* ------------ VGA Display dialog box -------------- */
  268. DIALOGBOX( DisplayVGA )
  269.     DB_TITLE(     "Display", -1, -1, 13+offset, 34)
  270. #ifdef INCLUDE_MULTIDOCS
  271.     CONTROL(CHECKBOX,    OFF,     9, 1, 1, 3, ID_TITLE)
  272.     CONTROL(TEXT,     "~Title",  15, 1, 1, 5, ID_TITLE)
  273.     CONTROL(CHECKBOX,    OFF,     9, 2, 1, 3, ID_BORDER)
  274.     CONTROL(TEXT,     "~Border", 15, 2, 1, 6, ID_BORDER)
  275.     CONTROL(CHECKBOX,    OFF,     9, 3, 1, 3, ID_TEXTURE)
  276.     CONTROL(TEXT,     "Te~xture",15, 3, 1, 7, ID_TEXTURE)
  277. #endif
  278.     CONTROL(RADIOBUTTON, OFF,      9,1+offset,1,3,ID_COLOR)
  279.     CONTROL(TEXT,     "Co~lor",   15,1+offset,1,5,ID_COLOR)
  280.     CONTROL(RADIOBUTTON, OFF,      9,2+offset,1,3,ID_MONO)
  281.     CONTROL(TEXT,     "~Mono",    15,2+offset,1,4,ID_MONO)
  282.     CONTROL(RADIOBUTTON, OFF,      9,3+offset,1,3,ID_REVERSE)
  283.     CONTROL(TEXT,     "~Reverse", 15,3+offset,1,7,ID_REVERSE)
  284.     CONTROL(RADIOBUTTON, OFF,      9,5+offset,1,3,ID_25LINES)
  285.     CONTROL(TEXT,     "~25 Lines",15,5+offset,1,8,ID_25LINES)
  286.     CONTROL(RADIOBUTTON, OFF,      9,6+offset,1,3,ID_43LINES)
  287.     CONTROL(TEXT,     "~43 Lines",15,6+offset,1,8,ID_43LINES)
  288.     CONTROL(RADIOBUTTON, OFF,      9,7+offset,1,3,ID_50LINES)
  289.     CONTROL(TEXT,     "~50 Lines",15,7+offset,1,8,ID_50LINES)
  290.     CONTROL(BUTTON, "   ~OK   ",   2,9+offset,1,8,ID_OK)
  291.     CONTROL(BUTTON, " ~Cancel ",  12,9+offset,1,8,ID_CANCEL)
  292.     CONTROL(BUTTON, "  ~Help  ",  22,9+offset,1,8,ID_HELP)
  293. ENDDB
  294. /* ------------ EGA Display dialog box -------------- */
  295. DIALOGBOX( DisplayEGA )
  296.     DB_TITLE(     "Display", -1, -1, 12+offset, 34)
  297. #ifdef INCLUDE_MULTIDOCS
  298.     CONTROL(CHECKBOX,    OFF,     9, 1, 1, 3, ID_TITLE)
  299.     CONTROL(TEXT,     "~Title",  15, 1, 1, 5, ID_TITLE)
  300.     CONTROL(CHECKBOX,    OFF,     9, 2, 1, 3, ID_BORDER)
  301.     CONTROL(TEXT,     "~Border", 15, 2, 1, 6, ID_BORDER)
  302.     CONTROL(CHECKBOX,    OFF,     9, 3, 1, 3, ID_TEXTURE)
  303.     CONTROL(TEXT,     "Te~xture",15, 3, 1, 7, ID_TEXTURE)
  304. #endif
  305.     CONTROL(RADIOBUTTON, OFF,      9, 1+offset,1,3,ID_COLOR)
  306.     CONTROL(TEXT,     "Co~lor",   15, 1+offset,1,5,ID_COLOR)
  307.     CONTROL(RADIOBUTTON, OFF,      9, 2+offset,1,3,ID_MONO)
  308.     CONTROL(TEXT,     "~Mono",    15, 2+offset,1,4,ID_MONO)
  309.     CONTROL(RADIOBUTTON, OFF,      9, 3+offset,1,3,ID_REVERSE)
  310.     CONTROL(TEXT,     "~Reverse", 15, 3+offset,1,7,ID_REVERSE)
  311.     CONTROL(RADIOBUTTON, OFF,      9, 5+offset,1,3,ID_25LINES)
  312.     CONTROL(TEXT,     "~25 Lines",15, 5+offset,1,8,ID_25LINES)
  313.     CONTROL(RADIOBUTTON, OFF,      9, 6+offset,1,3,ID_43LINES)
  314.     CONTROL(TEXT,     "~43 Lines",15, 6+offset,1,8,ID_43LINES)
  315.     CONTROL(BUTTON, "   ~OK   ",   2, 8+offset,1,8,ID_OK)
  316.     CONTROL(BUTTON, " ~Cancel ",  12, 8+offset,1,8,ID_CANCEL)
  317.     CONTROL(BUTTON, "  ~Help  ",  22, 8+offset,1,8,ID_HELP)
  318. ENDDB
  319. /* ------------ CGA/MDA Display dialog box -------------- */
  320. DIALOGBOX( DisplayCGA )
  321.     DB_TITLE(     "Display", -1, -1, 9+offset, 34)
  322. #ifdef INCLUDE_MULTIDOCS
  323.     CONTROL(CHECKBOX,    OFF,     9, 1, 1, 3, ID_TITLE)
  324.     CONTROL(TEXT,     "~Title",  15, 1, 1, 5, ID_TITLE)
  325.     CONTROL(CHECKBOX,    OFF,     9, 2, 1, 3, ID_BORDER)
  326.     CONTROL(TEXT,     "~Border", 15, 2, 1, 6, ID_BORDER)
  327.     CONTROL(CHECKBOX,    OFF,     9, 3, 1, 3, ID_TEXTURE)
  328.     CONTROL(TEXT,     "Te~xture",15, 3, 1, 7, ID_TEXTURE)
  329. #endif
  330.     CONTROL(RADIOBUTTON, OFF,      9, 1+offset,1,3,ID_COLOR)
  331.     CONTROL(TEXT,     "Co~lor",   15, 1+offset,1,5,ID_COLOR)
  332.     CONTROL(RADIOBUTTON, OFF,      9, 2+offset,1,3,ID_MONO)
  333.     CONTROL(TEXT,     "~Mono",    15, 2+offset,1,4,ID_MONO)
  334.     CONTROL(RADIOBUTTON, OFF,      9, 3+offset,1,3,ID_REVERSE)
  335.     CONTROL(TEXT,     "~Reverse", 15, 3+offset,1,7,ID_REVERSE)
  336.     CONTROL(BUTTON, "   ~OK   ",   2, 5+offset,1,8,ID_OK)
  337.     CONTROL(BUTTON, " ~Cancel ",  12, 5+offset,1,8,ID_CANCEL)
  338.     CONTROL(BUTTON, "  ~Help  ",  22, 5+offset,1,8,ID_HELP)
  339. ENDDB
  340.  
  341. #define TS2 "~2  ─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴"
  342. #define TS4 "~4  ───┴───┴───┴───┴───┴"
  343. #define TS6 "~6  ─────┴─────┴─────┴──"
  344. #define TS8 "~8  ───────┴───────┴────"
  345. /* ------------ Tab Stops dialog box -------------- */
  346. DIALOGBOX( TabStops )
  347.     DB_TITLE(      "Editor Tab Stops", -1,-1, 10, 35)
  348.     CONTROL(RADIOBUTTON,  OFF,     2, 1, 1,  3, ID_TAB2)
  349.     CONTROL(TEXT,         TS2,     7, 1, 1, 23, ID_TAB2)
  350.     CONTROL(RADIOBUTTON,  OFF,     2, 2, 1, 11, ID_TAB4)
  351.     CONTROL(TEXT,         TS4,     7, 2, 1, 23, ID_TAB4)
  352.     CONTROL(RADIOBUTTON,  OFF,     2, 3, 1, 11, ID_TAB6)
  353.     CONTROL(TEXT,         TS6,     7, 3, 1, 23, ID_TAB6)
  354.     CONTROL(RADIOBUTTON,  OFF,     2, 4, 1, 11, ID_TAB8)
  355.     CONTROL(TEXT,         TS8,     7, 4, 1, 23, ID_TAB8)
  356.     CONTROL(BUTTON,  "   ~OK   ",  1, 6, 1,  8, ID_OK)
  357.     CONTROL(BUTTON,  " ~Cancel ", 12, 6, 1,  8, ID_CANCEL)
  358.     CONTROL(BUTTON,  "  ~Help  ", 23, 6, 1,  8, ID_HELP)
  359. ENDDB
  360. /* ------------ Windows dialog box -------------- */
  361. #ifdef INCLUDE_MULTIDOCS
  362. DIALOGBOX( Windows )
  363.     DB_TITLE(     "Windows", -1, -1, 19, 24)
  364.     CONTROL(LISTBOX, NULL,         1,  1,11, 20, ID_WINDOWLIST)
  365.     CONTROL(BUTTON,  "   ~OK   ",  2, 13, 1, 8, ID_OK)
  366.     CONTROL(BUTTON,  " ~Cancel ", 12, 13, 1, 8, ID_CANCEL)
  367.     CONTROL(BUTTON,  "  ~Help  ",  7, 15, 1, 8, ID_HELP)
  368. ENDDB
  369. #endif
  370.  
  371. #ifdef INCLUDE_LOGGING
  372. /* ------------ Message Log dialog box -------------- */
  373. DIALOGBOX( Log )
  374.     DB_TITLE(    "D-Flat Message Log", -1, -1, 18, 41)
  375.     CONTROL(TEXT,  "~Messages",   10,   1,  1,  8, ID_LOGLIST)
  376.     CONTROL(LISTBOX,    NULL,      1,   2, 14, 26, ID_LOGLIST)
  377.     CONTROL(TEXT,    "~Logging:", 29,   4,  1, 10, ID_LOGGING)
  378.     CONTROL(CHECKBOX,    OFF,     31,   5,  1,  3, ID_LOGGING)
  379.     CONTROL(BUTTON,  "   ~OK   ", 29,   7,  1,  8, ID_OK)
  380.     CONTROL(BUTTON,  " ~Cancel ", 29,  10,  1,  8, ID_CANCEL)
  381.     CONTROL(BUTTON,  "  ~Help  ", 29,  13, 1,   8, ID_HELP)
  382. ENDDB
  383. #endif
  384.  
  385. #ifdef INCLUDE_HELP
  386. /* ------------ the Help window dialog box -------------- */
  387. DIALOGBOX( HelpBox )
  388.     DB_TITLE(         NULL,       -1, -1, 0, 45)
  389.     CONTROL(TEXTBOX, NULL,         1,  1, 0, 40, ID_HELPTEXT)
  390.     CONTROL(BUTTON,  "  ~Close ",  0,  0, 1,  8, ID_CANCEL)
  391.     CONTROL(BUTTON,  "  ~Back  ", 10,  0, 1,  8, ID_BACK)
  392.     CONTROL(BUTTON,  "<< ~Prev ", 20,  0, 1,  8, ID_PREV)
  393.     CONTROL(BUTTON,  " ~Next >>", 30,  0, 1,  8, ID_NEXT)
  394. ENDDB
  395. #endif
  396. #endif
  397.  
  398.  
  399. [LISTING FIVE]
  400.  
  401. /* ----------- classes.h ------------ */
  402. /*         Class definition source file
  403.  *         Make class changes to this source file
  404.  *         Other source files will adapt
  405.  *         You must add entries to the color tables in
  406.  *         CONFIG.C for new classes.
  407.  *        Class Name  Base Class   Processor       Attribute    
  408.  *       ------------  --------- ---------------  -----------
  409.  */
  410. ClassDef(  NORMAL,      -1,      NormalProc,      0 )
  411. ClassDef(  APPLICATION, NORMAL,  ApplicationProc, VISIBLE   |
  412.                                                   SAVESELF  |
  413.                                                   CONTROLBOX )
  414. ClassDef(  TEXTBOX,     NORMAL,  TextBoxProc,     0          )
  415. ClassDef(  LISTBOX,     TEXTBOX, ListBoxProc,     0          )
  416. ClassDef(  EDITBOX,     TEXTBOX, EditBoxProc,     0          )
  417. ClassDef(  MENUBAR,     NORMAL,  MenuBarProc,     NOCLIP     )
  418. ClassDef(  POPDOWNMENU, LISTBOX, PopDownProc,     SAVESELF  |
  419.                                                   NOCLIP    |
  420.                                                   HASBORDER  )
  421. #ifdef INCLUDE_DIALOG_BOXES
  422. ClassDef(  BUTTON,      TEXTBOX, ButtonProc,      SHADOW    |
  423.                                                   NOCLIP     )
  424. ClassDef(  DIALOG,      NORMAL,  DialogProc,      SHADOW    |
  425.                                                   MOVEABLE  |
  426.                                                   CONTROLBOX|
  427.                                                   HASBORDER |
  428.                                                   NOCLIP     )
  429. ClassDef(  ERRORBOX,    DIALOG,  DialogProc,      SHADOW    |
  430.                                                   HASBORDER  )
  431. ClassDef(  MESSAGEBOX,  DIALOG,  DialogProc,      SHADOW    |
  432.                                                   HASBORDER  )
  433. #else
  434. ClassDef(  ERRORBOX,    TEXTBOX, NULL,            SHADOW    |
  435.                                                   HASBORDER  )
  436. ClassDef(  MESSAGEBOX,  TEXTBOX, NULL,            SHADOW    |
  437.                                                   HASBORDER  )
  438. #endif
  439.  
  440. #ifdef INCLUDE_HELP
  441. ClassDef(  HELPBOX,     DIALOG,  HelpBoxProc,     SHADOW    |
  442.                                                   MOVEABLE  |
  443.                                                   SAVESELF  |
  444.                                                   HASBORDER |
  445.                                                   NOCLIP    |
  446.                                                   CONTROLBOX )
  447. #endif
  448.  
  449. /* ========> Add new classes here <========  */
  450.  
  451. /* ---------- pseudo classes to create enums, etc. ---------- */
  452. ClassDef(  TITLEBAR,    -1,      NULL,            0          )
  453. ClassDef(  DUMMY,       -1,      NULL,            HASBORDER  )
  454. ClassDef(  TEXT,        -1,      NULL,            0          )
  455. ClassDef(  RADIOBUTTON, -1,      NULL,            0          )
  456. ClassDef(  CHECKBOX,    -1,      NULL,            0          )
  457.  
  458.  
  459.  
  460.  
  461. [LISTING SIX]
  462.  
  463. /* ------------- config.c ------------- */
  464. #include <conio.h>
  465. #include <string.h>
  466. #include "dflat.h"
  467.  
  468. /* ----- default colors for color video system ----- */
  469. unsigned char color[CLASSCOUNT] [4] [2] = {
  470.     /* ------------ NORMAL ------------ */
  471.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  472.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  473.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  474.     {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
  475.     /* ---------- APPLICATION --------- */
  476.    {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
  477.     {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
  478.     {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
  479.     {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
  480.     /* ------------ TEXTBOX ----------- */
  481.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  482.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  483.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  484.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  485.     /* ------------ LISTBOX ----------- */
  486.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  487.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  488.     {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
  489.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  490.     /* ----------- EDITBOX ------------ */
  491.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  492.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  493.     {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
  494.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  495.     /* ---------- MENUBAR ------------- */
  496.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  497.     {BLACK, CYAN},      /* SELECT_COLOR */
  498.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  499.     {DARKGRAY, RED}},   /* HILITE_COLOR Inactive, Shortcut (both FG) */
  500.     /* ---------- POPDOWNMENU --------- */
  501.    {{BLACK, CYAN},      /* STD_COLOR    */
  502.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  503.     {BLACK, CYAN},      /* FRAME_COLOR  */
  504.     {DARKGRAY, RED}},   /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  505. #ifdef INCLUDE_DIALOG_BOXES
  506.     /* ------------ BUTTON ------------ */
  507.    {{BLACK, CYAN},      /* STD_COLOR    */
  508.     {WHITE, CYAN},      /* SELECT_COLOR */
  509.     {BLACK, CYAN},      /* FRAME_COLOR  */
  510.     {DARKGRAY, RED}},   /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  511.     /* ------------- DIALOG ----------- */
  512.    {{LIGHTGRAY, BLUE},  /* STD_COLOR    */
  513.     {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
  514.     {LIGHTGRAY, BLUE},  /* FRAME_COLOR  */
  515.     {LIGHTGRAY, BLUE}}, /* HILITE_COLOR */
  516. #endif
  517.     /* ----------- ERRORBOX ----------- */
  518.    {{YELLOW, RED},      /* STD_COLOR    */
  519.     {YELLOW, RED},      /* SELECT_COLOR */
  520.     {YELLOW, RED},      /* FRAME_COLOR  */
  521.     {YELLOW, RED}},     /* HILITE_COLOR */
  522.     /* ----------- MESSAGEBOX --------- */
  523.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  524.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  525.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  526.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  527. #ifdef INCLUDE_HELP
  528.     /* ----------- HELPBOX ------------ */
  529.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  530.     {LIGHTGRAY, BLUE},  /* SELECT_COLOR */
  531.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  532.     {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
  533. #endif
  534.     /* ---------- TITLEBAR ------------ */
  535.    {{BLACK, CYAN},      /* STD_COLOR    */
  536.     {BLACK, CYAN},      /* SELECT_COLOR */
  537.     {BLACK, CYAN},      /* FRAME_COLOR  */
  538.     {WHITE, CYAN}},     /* HILITE_COLOR */
  539.     /* ------------ DUMMY ------------- */
  540.    {{GREEN, LIGHTGRAY}, /* STD_COLOR    */
  541.     {GREEN, LIGHTGRAY}, /* SELECT_COLOR */
  542.     {GREEN, LIGHTGRAY}, /* FRAME_COLOR  */
  543.     {GREEN, LIGHTGRAY}} /* HILITE_COLOR */
  544. };
  545. /* ----- default colors for mono video system ----- */
  546. unsigned char bw[CLASSCOUNT] [4] [2] = {
  547.     /* ------------ NORMAL ------------ */
  548.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  549.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  550.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  551.     {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
  552.     /* ---------- APPLICATION --------- */
  553.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  554.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  555.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  556.     {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
  557.     /* ------------ TEXTBOX ----------- */
  558.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  559.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  560.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  561.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  562.     /* ------------ LISTBOX ----------- */
  563.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  564.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  565.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  566.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  567.     /* ----------- EDITBOX ------------ */
  568.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  569.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  570.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  571.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  572.     /* ---------- MENUBAR ------------- */
  573.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  574.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  575.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  576.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive, Shortcut (both FG) */
  577.     /* ---------- POPDOWNMENU --------- */
  578.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  579.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  580.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  581.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  582. #ifdef INCLUDE_DIALOG_BOXES
  583.     /* ------------ BUTTON ------------ */
  584.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  585.     {WHITE, LIGHTGRAY}, /* SELECT_COLOR */
  586.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  587.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  588.     /* ------------- DIALOG ----------- */
  589.    {{LIGHTGRAY, BLACK},  /* STD_COLOR    */
  590.     {LIGHTGRAY, BLACK},  /* SELECT_COLOR */
  591.     {LIGHTGRAY, BLACK},  /* FRAME_COLOR  */
  592.     {LIGHTGRAY, BLACK}}, /* HILITE_COLOR */
  593. #endif
  594.     /* ----------- ERRORBOX ----------- */
  595.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  596.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  597.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  598.     {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
  599.     /* ----------- MESSAGEBOX --------- */
  600.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  601.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  602.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  603.     {LIGHTGRAY, BLACK}},/* HILITE_COLOR */
  604. #ifdef INCLUDE_HELP
  605.     /* ----------- HELPBOX ------------ */
  606.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  607.     {WHITE, BLACK},     /* SELECT_COLOR */
  608.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  609.     {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
  610. #endif
  611.     /* ---------- TITLEBAR ------------ */
  612.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  613.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  614.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  615.     {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
  616.     /* ------------ DUMMY ------------- */
  617.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  618.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  619.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  620.     {BLACK, LIGHTGRAY}} /* HILITE_COLOR */
  621. };
  622. /* ----- default colors for reverse mono video ----- */
  623. unsigned char reverse[CLASSCOUNT] [4] [2] = {
  624.     /* ------------ NORMAL ------------ */
  625.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  626.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  627.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  628.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  629.     /* ---------- APPLICATION --------- */
  630.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  631.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  632.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  633.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  634.     /* ------------ TEXTBOX ----------- */
  635.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  636.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  637.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  638.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  639.     /* ------------ LISTBOX ----------- */
  640.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  641.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  642.     {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
  643.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  644.     /* ----------- EDITBOX ------------ */
  645.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  646.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  647.     {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
  648.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  649.     /* ---------- MENUBAR ------------- */
  650.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  651.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  652.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  653.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive, Shortcut (both FG) */
  654.     /* ---------- POPDOWNMENU --------- */
  655.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  656.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  657.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  658.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  659. #ifdef INCLUDE_DIALOG_BOXES
  660.     /* ------------ BUTTON ------------ */
  661.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  662.     {WHITE, BLACK},     /* SELECT_COLOR */
  663.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  664.     {DARKGRAY, WHITE}}, /* HILITE_COLOR Inactive ,Shortcut (both FG) */
  665.     /* ------------- DIALOG ----------- */
  666.    {{BLACK, LIGHTGRAY},  /* STD_COLOR    */
  667.     {BLACK, LIGHTGRAY},  /* SELECT_COLOR */
  668.     {BLACK, LIGHTGRAY},  /* FRAME_COLOR  */
  669.     {BLACK, LIGHTGRAY}}, /* HILITE_COLOR */
  670. #endif
  671.     /* ----------- ERRORBOX ----------- */
  672.    {{BLACK, LIGHTGRAY},      /* STD_COLOR    */
  673.     {BLACK, LIGHTGRAY},      /* SELECT_COLOR */
  674.     {BLACK, LIGHTGRAY},      /* FRAME_COLOR  */
  675.     {BLACK, LIGHTGRAY}},     /* HILITE_COLOR */
  676.     /* ----------- MESSAGEBOX --------- */
  677.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  678.     {BLACK, LIGHTGRAY}, /* SELECT_COLOR */
  679.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  680.     {BLACK, LIGHTGRAY}},/* HILITE_COLOR */
  681. #ifdef INCLUDE_HELP
  682.     /* ----------- HELPBOX ------------ */
  683.    {{BLACK, LIGHTGRAY}, /* STD_COLOR    */
  684.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  685.     {BLACK, LIGHTGRAY}, /* FRAME_COLOR  */
  686.     {WHITE, LIGHTGRAY}},/* HILITE_COLOR */
  687. #endif
  688.     /* ---------- TITLEBAR ------------ */
  689.    {{LIGHTGRAY, BLACK},      /* STD_COLOR    */
  690.     {LIGHTGRAY, BLACK},      /* SELECT_COLOR */
  691.     {LIGHTGRAY, BLACK},      /* FRAME_COLOR  */
  692.     {LIGHTGRAY, BLACK}},     /* HILITE_COLOR */
  693.     /* ------------ DUMMY ------------- */
  694.    {{LIGHTGRAY, BLACK}, /* STD_COLOR    */
  695.     {LIGHTGRAY, BLACK}, /* SELECT_COLOR */
  696.     {LIGHTGRAY, BLACK}, /* FRAME_COLOR  */
  697.     {LIGHTGRAY, BLACK}} /* HILITE_COLOR */
  698. };
  699. #define SIGNATURE DFLAT_APPLICATION " " VERSION
  700.  
  701. /* ------ default configuration values ------- */
  702. CONFIG cfg = {
  703.     SIGNATURE,
  704.     0,               /* Color                       */
  705.     TRUE,            /* Editor Insert Mode          */
  706.     4,               /* Editor tab stops            */
  707.     TRUE,            /* Editor word wrap            */
  708.     TRUE,            /* Application Border          */
  709.     TRUE,            /* Application Title           */
  710.     TRUE,            /* Textured application window */
  711.     25               /* Number of screen lines      */
  712. };
  713. /* ------ load a configuration file from disk ------- */
  714. int LoadConfig(void)
  715. {
  716.     FILE *fp = fopen(DFLAT_APPLICATION ".cfg", "rb");
  717.     if (fp != NULL)    {
  718.         fread(cfg.version, sizeof cfg.version+1, 1, fp);
  719.         if (strcmp(cfg.version, SIGNATURE) == 0)    {
  720.             fseek(fp, 0L, SEEK_SET);
  721.             fread(&cfg, sizeof(CONFIG), 1, fp);
  722.         }
  723.         else
  724.             strcpy(cfg.version, SIGNATURE);
  725.         fclose(fp);
  726.     }
  727.     return fp != NULL;
  728. }
  729. /* ------ save a configuration file to disk ------- */
  730. void SaveConfig(void)
  731. {
  732.     FILE *fp = fopen(DFLAT_APPLICATION ".cfg", "wb");
  733.     if (fp != NULL)    {
  734.         cfg.InsertMode = GetCommandToggle(MainMenu, ID_INSERT);
  735.         cfg.WordWrap = GetCommandToggle(MainMenu, ID_WRAP);
  736.         fwrite(&cfg, sizeof(CONFIG), 1, fp);
  737.         fclose(fp);
  738.     }
  739. }
  740.  
  741.  
  742.  
  743. [LISTING SEVEN]
  744.  
  745. /* ------------- keys.c ----------- */
  746.  
  747. #include <stdio.h>
  748. #include "keys.h"
  749.  
  750. struct keys keys[] = {
  751.     {F1,        "F1"},
  752.     {F2,        "F2"},
  753.     {F3,        "F3"},
  754.     {F4,        "F4"},
  755.     {F5,        "F5"},
  756.     {F6,        "F6"},
  757.     {F7,        "F7"},
  758.     {F8,        "F8"},
  759.     {F9,        "F9"},
  760.     {F10,       "F10"},
  761.     {CTRL_F1,   "Ctrl+F1"},
  762.     {CTRL_F2,   "Ctrl+F2"},
  763.     {CTRL_F3,   "Ctrl+F3"},
  764.     {CTRL_F4,   "Ctrl+F4"},
  765.     {CTRL_F5,   "Ctrl+F5"},
  766.     {CTRL_F6,   "Ctrl+F6"},
  767.     {CTRL_F7,   "Ctrl+F7"},
  768.     {CTRL_F8,   "Ctrl+F8"},
  769.     {CTRL_F9,   "Ctrl+F9"},
  770.     {CTRL_F10,  "Ctrl+F10"},
  771.     {ALT_F1,    "Alt+F1"},
  772.     {ALT_F2,    "Alt+F2"},
  773.     {ALT_F3,    "Alt+F3"},
  774.     {ALT_F4,    "Alt+F4"},
  775.     {ALT_F5,    "Alt+F5"},
  776.     {ALT_F6,    "Alt+F6"},
  777.     {ALT_F7,    "Alt+F7"},
  778.     {ALT_F8,    "Alt+F8"},
  779.     {ALT_F9,    "Alt+F9"},
  780.     {ALT_F10,   "Alt+F10"},
  781.     {HOME,      "Home"},
  782.     {UP,        "Up"},
  783.     {PGUP,      "PgUp"},
  784.     {BS,        "BS"},
  785.     {END,       "End"},
  786.     {DN,        "Dn"},
  787.     {PGDN,      "PgDn"},
  788.     {INS,       "Ins"},
  789.     {DEL,       "Del"},
  790.     {CTRL_HOME, "Ctrl+Home"},
  791.     {CTRL_PGUP, "Ctrl+PgUp"},
  792.     {CTRL_BS,   "Ctrl+BS"},
  793.     {CTRL_END,  "Ctrl+End"},
  794.     {CTRL_PGDN, "Ctrl+PgDn"},
  795.     {SHIFT_HT,  "Shift+Tab"},
  796.     {ALT_BS,    "Alt+BS"},
  797.     {SHIFT_DEL, "Shift+Del"},
  798.     {SHIFT_INS, "Shift+Ins"},
  799.     {CTRL_INS,  "Ctrl+Ins"},
  800.     {ALT_A,     "Alt+A"},
  801.     {ALT_B,     "Alt+B"},
  802.     {ALT_C,     "Alt+C"},
  803.     {ALT_D,     "Alt+D"},
  804.     {ALT_E,     "Alt+E"},
  805.     {ALT_F,     "Alt+F"},
  806.     {ALT_G,     "Alt+G"},
  807.     {ALT_H,     "Alt+H"},
  808.     {ALT_I,     "Alt+I"},
  809.     {ALT_J,     "Alt+J"},
  810.     {ALT_K,     "Alt+K"},
  811.     {ALT_L,     "Alt+L"},
  812.     {ALT_M,     "Alt+M"},
  813.     {ALT_N,     "Alt+N"},
  814.     {ALT_O,     "Alt+O"},
  815.     {ALT_P,     "Alt+P"},
  816.     {ALT_Q,     "Alt+Q"},
  817.     {ALT_R,     "Alt+R"},
  818.     {ALT_S,     "Alt+S"},
  819.     {ALT_T,     "Alt+T"},
  820.     {ALT_U,     "Alt+U"},
  821.     {ALT_V,     "Alt+V"},
  822.     {ALT_W,     "Alt+W"},
  823.     {ALT_X,     "Alt+X"},
  824.     {ALT_Y,     "Alt+Y"},
  825.     {ALT_Z,     "Alt+Z"},
  826.     {-1,        NULL}
  827. };
  828.  
  829.  
  830.  
  831. Examplσ 1:
  832.  
  833. (a)
  834.  
  835.     typedef enum window_class    {
  836.         #define ClassDef(c,b,p,a) c,
  837.         #include "classes.h"
  838.         CLASSCOUNT
  839.     } CLASS;
  840.  
  841.  
  842. (b)
  843.  
  844.     char *ClassNames[] = {
  845.         #undef ClassDef
  846.         #define ClassDef(c,b,p,a) #c,
  847.         #include "classes.h"
  848.         NULL
  849.     };
  850.  
  851. (c)
  852.  
  853.     CLASSDEFS classdefs[] = {
  854.         #undef ClassDef
  855.         #define ClassDef(c,b,p,a) {b,p,a},
  856.         {0,0,0}
  857.         #include "classes.h"
  858.     };
  859.  
  860.  
  861.  
  862. Examplσ 2:
  863.  
  864. (a)
  865.  
  866.     KeyDef(ALT_S, 159+OFFSET, "Alt+S")
  867.  
  868. (b)
  869.  
  870.     struct keys keys[] = {
  871.         #undef KeyDef
  872.         #define KeyDef(k,v,s) {v,s},
  873.         #include "keycaps.h"
  874.         {-1,NULL}
  875.     };
  876.  
  877. (c)
  878.  
  879.     #undef KeyDef
  880. è    #define KeyDef(k,v,s) #define k v
  881.     #include "keycaps.h"
  882.  
  883.  
  884. (d)
  885.  
  886.     #undef KeyDef
  887.     #define KeyDef(k,v,s) extern const int k;
  888.     #include "keycaps.h"
  889.  
  890.  
  891. (e)
  892.  
  893.     #undef KeyDef
  894.     #define KeyDef(k,v,s) const int k = v;
  895.     #include "keycaps.h"
  896.  
  897.  
  898.