home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3471 < prev    next >
Internet Message Format  |  1991-06-07  |  59KB

  1. From: guido@cwi.nl (Guido van Rossum)
  2. Newsgroups: alt.sources
  3. Subject: STDWIN 0.9.6 patches, part 3/5
  4. Message-ID: <3649@charon.cwi.nl>
  5. Date: 7 Jun 91 13:32:04 GMT
  6.  
  7. Archive-name: stdwin0.9.6/patch3
  8.  
  9. *** 0.9.5/Ports/mac/stdwin.c    Thu Feb 21 10:54:56 1991
  10. --- stdwin/Ports/mac/stdwin.c    Tue May 28 22:27:01 1991
  11. ***************
  12. *** 11,16 ****
  13. --- 11,24 ----
  14.   #endif
  15.   
  16.   
  17. + /* Parameters for top left corner choice algorithm in wopen() */
  18. + #define LEFT    20    /* Initial left */
  19. + #define TOP    40    /* Initial top */
  20. + #define HINCR    20    /* Increment for left */
  21. + #define VINCR    16    /* Increment for top */
  22.   /* GLOBAL DATA. */
  23.   
  24.               /* XXX choose less obvious names */
  25. ***************
  26. *** 17,25 ****
  27.   GrafPtr screen;        /* The Mac Window Manager's GrafPort */
  28.   TEXTATTR wattr;        /* Current or default text attributes */
  29.   
  30. ! static int def_left= LEFT;
  31. ! static int def_top= TOP;
  32. ! static int def_width, def_height;
  33.   
  34.   
  35.   /* INITIALIZATION AND TERMINATION. */
  36. --- 25,38 ----
  37.   GrafPtr screen;        /* The Mac Window Manager's GrafPort */
  38.   TEXTATTR wattr;        /* Current or default text attributes */
  39.   
  40. ! static int def_left = 0;
  41. ! static int def_top = 0;
  42. ! static int def_width = 0;
  43. ! static int def_height = 0;
  44. ! static int def_horscroll = 0;
  45. ! static int def_verscroll = 1;
  46. ! static int next_left = LEFT;    /* For default placement algorithm */
  47. ! static int next_top = TOP;
  48.   
  49.   
  50.   /* INITIALIZATION AND TERMINATION. */
  51. ***************
  52. *** 85,91 ****
  53.   #ifdef MPW
  54.       set_open_hook(std_open_hook);
  55.   #endif
  56. -     wsetdefwinsize(0, 0);
  57.       set_watch();
  58.   }
  59.   
  60. --- 98,103 ----
  61. ***************
  62. *** 101,107 ****
  63.       Rect r;
  64.       r= screen->portRect;
  65.       *pwidth= r.right - r.left;
  66. !     *pheight= r.bottom - r.top;
  67.   }
  68.   
  69.   void
  70. --- 113,119 ----
  71.       Rect r;
  72.       r= screen->portRect;
  73.       *pwidth= r.right - r.left;
  74. !     *pheight= r.bottom - r.top - MENUBARHEIGHT;
  75.   }
  76.   
  77.   void
  78. ***************
  79. *** 108,120 ****
  80.   wgetscrmm(pmmwidth, pmmheight)
  81.       int *pmmwidth, *pmmheight;
  82.   {
  83. !     Rect r;
  84. !     r= screen->portRect;
  85.       /* XXX Three pixels/mm is an approximation of the truth at most */
  86. !     *pmmwidth= (r.right - r.left) / 3;
  87. !     *pmmheight= (r.bottom - r.top) / 3;
  88.   }
  89.   
  90.   /* Routine called by "Resume" button in bomb box (passed to InitDialogs).
  91.      I have yet to see a program crash where an attempted exit to the
  92.      Finder caused any harm, so I think it's safe.
  93. --- 120,139 ----
  94.   wgetscrmm(pmmwidth, pmmheight)
  95.       int *pmmwidth, *pmmheight;
  96.   {
  97. !     int width, height;
  98. !     wgetscrsize(&width, &height);
  99.       /* XXX Three pixels/mm is an approximation of the truth at most */
  100. !     *pmmwidth= width / 3;
  101. !     *pmmheight= height / 3;
  102.   }
  103.   
  104. + int
  105. + wgetmouseconfig()
  106. + {
  107. +     return WM_BUTTON1 | WM_SHIFT | WM_META | WM_LOCK | WM_OPTION;
  108. +     /* XXX Should figure out if we have a Control button as well */
  109. + }
  110.   /* Routine called by "Resume" button in bomb box (passed to InitDialogs).
  111.      I have yet to see a program crash where an attempted exit to the
  112.      Finder caused any harm, so I think it's safe.
  113. ***************
  114. *** 126,131 ****
  115. --- 145,151 ----
  116.       ExitToShell();
  117.   }
  118.   
  119.   /* WINDOWS. */
  120.   
  121.   /* Find the WINDOW pointer corresponding to a WindowPtr. */
  122. ***************
  123. *** 154,186 ****
  124.   {
  125.       WINDOW *win= ALLOC(WINDOW);
  126.       Rect r;
  127.       
  128.       if (win == NULL) {
  129. !         dprintf("wopen: ALLOC failed"); /* XXX */
  130.           return NULL;
  131.       }
  132. !     /* Find a nice position for the window. */
  133. !     if (def_left + def_width + BAR + LSLOP + RSLOP
  134. !             > screen->portRect.right) {
  135. !         def_left= LEFT;
  136. !         CLIPMAX(def_left, screen->portRect.right -
  137. !             (def_width + BAR + LSLOP + RSLOP));
  138. !         CLIPMIN(def_left, 0);
  139.       }
  140. !     if (def_top + def_height + BAR > screen->portRect.bottom) {
  141. !         def_top= TOP;
  142. !         CLIPMAX(def_top, screen->portRect.bottom -
  143. !             (def_height + BAR));
  144. !         CLIPMIN(def_top, MENUBARHEIGHT + TITLEBARHEIGHT);
  145.       }
  146.       
  147. !     SetRect(&r, def_left, def_top,
  148. !         def_left+def_width + BAR + LSLOP + RSLOP,
  149. !         def_top+def_height + BAR);
  150. !     def_left += HINCR;
  151. !     def_top += VINCR;
  152.       
  153.       win->w= NewWindow((Ptr)NULL, &r, PSTRING(title), TRUE, zoomDocProc,
  154.           (WindowPtr)(-1), TRUE, 0L);
  155.       SetWRefCon(win->w, (long)win);
  156. --- 174,270 ----
  157.   {
  158.       WINDOW *win= ALLOC(WINDOW);
  159.       Rect r;
  160. +     int width, height;        /* As seen by the user */
  161. +     int tot_width, tot_height;    /* Including slop & scroll bars */
  162. +     int left, top;            /* Window corner as seen by the user */
  163.       
  164.       if (win == NULL) {
  165. !         dprintf("wopen: ALLOC failed");
  166.           return NULL;
  167.       }
  168. !     
  169. !     /* Determine window size.
  170. !        If the program specified a size, use that, within reason --
  171. !        sizes are clipped to 0x7000 to avoid overflow in QuickDraw's
  172. !        calculations.
  173. !        Otherwise, use two-third of the screen size, but at most
  174. !        512x342 (to avoid creating gigantic windows by default on
  175. !        large screen Macs). */
  176. !     
  177. !     if (def_width <= 0) {
  178. !         width = screen->portRect.right * 2/3;
  179. !         CLIPMAX(width, 512);
  180.       }
  181. !     else {
  182. !         width = def_width;
  183. !         CLIPMAX(width, 0x7000);
  184.       }
  185. +     if (def_horscroll)
  186. +         CLIPMIN(width, 3*BAR);
  187. +     tot_width = width + LSLOP + RSLOP;
  188. +     if (def_verscroll)
  189. +         tot_width += BAR;
  190.       
  191. !     if (def_height <= 0) {
  192. !         height= screen->portRect.bottom * 2/3;
  193. !         CLIPMAX(height, 342);
  194. !     }
  195. !     else {
  196. !         height = def_height;
  197. !         CLIPMAX(height, 0x7000);
  198. !     }
  199. !     if (def_verscroll)
  200. !         CLIPMIN(height, 3*BAR);
  201. !     tot_height = height;
  202. !     if (def_horscroll)
  203. !         tot_height += BAR;
  204.       
  205. +     /* Determine window position.
  206. +        It the program specified a position, use that, but make sure
  207. +        that at least a small piece of the title bar is visible --
  208. +        so the user can recover a window that "fell off the screen".
  209. +        Exception: the title bar may hide completely under the menu
  210. +        bar, since this is the only way to get an (almost) full
  211. +        screen window.
  212. +        Otherwise, place the window a little to the right and below
  213. +        the last window placed; it it doesn't fit, move it up.
  214. +        With default placement, the window will never hide under the
  215. +        title bar. */
  216. +     
  217. +     if (def_left <= 0) {
  218. +         left = next_left;
  219. +         if (left + tot_width >= screen->portRect.right) {
  220. +             left = LEFT;
  221. +             CLIPMAX(left, screen->portRect.right - tot_width);
  222. +             CLIPMIN(left, 0);
  223. +         }
  224. +     }
  225. +     else {
  226. +         left = def_left - LSLOP;
  227. +         CLIPMAX(left, screen->portRect.right - BAR);
  228. +         CLIPMIN(left, BAR - tot_width);
  229. +     }
  230. +     
  231. +     if (def_top <= 0) {
  232. +         top = next_top;
  233. +         if (top + tot_height >= screen->portRect.bottom) {
  234. +             top = TOP;
  235. +             CLIPMAX(top, screen->portRect.bottom - tot_height);
  236. +             CLIPMIN(top, MENUBARHEIGHT + TITLEBARHEIGHT);
  237. +         }
  238. +     }
  239. +     else {
  240. +         top = def_top;
  241. +         CLIPMAX(top, screen->portRect.bottom);
  242. +         CLIPMIN(top, MENUBARHEIGHT);
  243. +     }
  244. +     
  245. +     next_left = left + HINCR;
  246. +     next_top = top + VINCR;
  247. +     
  248. +     /* Create the window now and initialize its attributes */
  249. +     
  250. +     SetRect(&r, left, top, left + tot_width, top + tot_height);
  251.       win->w= NewWindow((Ptr)NULL, &r, PSTRING(title), TRUE, zoomDocProc,
  252.           (WindowPtr)(-1), TRUE, 0L);
  253.       SetWRefCon(win->w, (long)win);
  254. ***************
  255. *** 197,205 ****
  256.       win->orgv= 0;
  257.       win->timer= 0;
  258.       win->cursor = NULL;
  259.       
  260.       initmbar(&win->mbar);
  261. !     makescrollbars(win);
  262.       
  263.       return win;
  264.   }
  265. --- 281,295 ----
  266.       win->orgv= 0;
  267.       win->timer= 0;
  268.       win->cursor = NULL;
  269. +     win->fgcolor = _w_fgcolor;
  270. +     win->bgcolor = _w_bgcolor;
  271.       
  272. +     SetPort(win->w);
  273. +     _w_usefgcolor(win->fgcolor);
  274. +     _w_usebgcolor(win->bgcolor);
  275. +     
  276.       initmbar(&win->mbar);
  277. !     makescrollbars(win, def_horscroll, def_verscroll);
  278.       
  279.       return win;
  280.   }
  281. ***************
  282. *** 230,235 ****
  283. --- 320,345 ----
  284.   }
  285.   
  286.   void
  287. + wgetwinpos(win, ph, pv)
  288. +     WINDOW *win;
  289. +     int *ph, *pv;
  290. + {
  291. +     Point p;
  292. +     GrafPtr saveport;
  293. +     
  294. +     GetPort(&saveport);
  295. +     
  296. +     SetPort(win->w);
  297. +     p.h = win->w->portRect.left + LSLOP;
  298. +     p.v = win->w->portRect.top;
  299. +     LocalToGlobal(&p);
  300. +     *ph = p.h;
  301. +     *pv = p.v;
  302. +     
  303. +     SetPort(saveport);
  304. + }
  305. + void
  306.   wsettitle(win, title)
  307.       WINDOW *win;
  308.       char *title;
  309. ***************
  310. *** 272,282 ****
  311.   wsetdefwinpos(h, v)
  312.       int h, v;
  313.   {
  314. !     /* XXX Sanity checks? Change interaction with wopen()? */
  315. !     if (h > 0)
  316. !         def_left = h;
  317. !     if (v > 0)
  318. !         def_top = v;
  319.   }
  320.   
  321.   void
  322. --- 382,389 ----
  323.   wsetdefwinpos(h, v)
  324.       int h, v;
  325.   {
  326. !     def_left = h;
  327. !     def_top = v;
  328.   }
  329.   
  330.   void
  331. ***************
  332. *** 291,312 ****
  333.   wsetdefwinsize(width, height)
  334.       int width, height;
  335.   {
  336. -     /* XXX Shouldn't this be done by wopen() instead? */
  337. -     if (width <= 0) {
  338. -         width= screen->portRect.right * 2/3;
  339. -         CLIPMAX(width, 512);
  340. -     }
  341. -     CLIPMAX(width, screen->portRect.right - BAR - LSLOP - RSLOP);
  342. -     CLIPMIN(width, MIN_WIDTH);
  343. -     
  344. -     if (height <= 0) {
  345. -         height= screen->portRect.bottom * 2/3;
  346. -         CLIPMAX(height, 342);
  347. -     }
  348. -     CLIPMAX(height, screen->portRect.bottom
  349. -         - MENUBARHEIGHT - TITLEBARHEIGHT - BAR);
  350. -     CLIPMIN(height, MIN_HEIGHT);
  351. -     
  352.       def_width= width;
  353.       def_height= height;
  354.   }
  355. --- 398,403 ----
  356. ***************
  357. *** 320,327 ****
  358.   }
  359.   
  360.   void
  361. ! wsetactive(win)
  362. !     WINDOW *win;
  363.   {
  364. !     SelectWindow(win->w);
  365.   }
  366. --- 411,427 ----
  367.   }
  368.   
  369.   void
  370. ! wsetdefscrollbars(hor, ver)
  371. !     int hor, ver;
  372.   {
  373. !     def_horscroll = hor;
  374. !     def_verscroll = ver;
  375. ! }
  376. ! void
  377. ! wgetdefscrollbars(phor, pver)
  378. !     int *phor, *pver;
  379. ! {
  380. !     *phor = def_horscroll;
  381. !     *pver = def_verscroll;
  382.   }
  383. *** 0.9.5/Ports/msdos/README    Thu Feb 28 11:30:38 1991
  384. --- stdwin/Ports/msdos/README    Tue Apr 23 15:56:24 1991
  385. ***************
  386. *** 1,4 ****
  387.   Sorry, there is no real STDWIN port for MS-DOS yet.  What you can is
  388. ! to port the alfa version with the help of the file "ptrm.c" in this
  389.   directory, which is a substitute (using the MS-DOS console driver) for
  390. ! the VTRM module used by the alfa version for all its tty I/O.
  391. --- 1,5 ----
  392.   Sorry, there is no real STDWIN port for MS-DOS yet.  What you can is
  393. ! to port the alfa version with the help of the file "vtrm.c" in this
  394.   directory, which is a substitute (using the MS-DOS console driver) for
  395. ! the VTRM module used by the alfa version for all its tty I/O (the UNIX
  396. ! version of vtrm.c is in ../vtrm).
  397. *** 0.9.5/Ports/msdos/dir.c    Wed Jun 24 13:40:34 1987
  398. --- stdwin/Ports/msdos/dir.c    Tue Apr 23 15:56:39 1991
  399. ***************
  400. *** 1,28 ****
  401.   /*
  402.    * MS-DOS version of UNIX directory access package.
  403.    * (opendir, readdir, closedir).
  404.    */
  405.   
  406. ! #include <sys/types.h>
  407. ! #include <sys/stat.h>
  408. ! #include <errno.h>
  409.   #include <dos.h>
  410. ! extern int errno;
  411. ! #define MAXPATH 64
  412.   #include "dir.h"
  413. - static char *firstf();
  414. - static char *nextf();
  415.   
  416.   typedef int bool;
  417. ! #define TRUE 1
  418. ! #define FALSE 0
  419.   #define EOS '\0'
  420. - #define NULL 0
  421.   
  422. ! static char dirpath[MAXPATH+1]= "";
  423. ! static bool busy= FALSE;
  424.   
  425.   /*
  426.    * Open a directory.
  427.    * This MS-DOS version allows only one directory to be open at a time.
  428. --- 1,38 ----
  429. + /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1990. */
  430.   /*
  431.    * MS-DOS version of UNIX directory access package.
  432.    * (opendir, readdir, closedir).
  433.    */
  434.   
  435. ! #include <stdio.h>
  436. ! #include <ctype.h>
  437. ! #include <string.h>
  438.   #include <dos.h>
  439. ! #include <errno.h>
  440. ! #include <sys\types.h>
  441. ! #include <sys\stat.h>
  442.   #include "dir.h"
  443.   
  444. + #define Visible
  445. + #define Hidden static
  446. + #define Procedure
  447.   typedef int bool;
  448. ! #define Yes ((bool) 1)
  449. ! #define No  ((bool) 0)
  450. ! #define MAXPATH 64
  451.   #define EOS '\0'
  452.   
  453. ! extern int errno;
  454. ! Hidden char *firstf();
  455. ! Hidden char *nextf();
  456.   
  457. + Hidden char dirpath[MAXPATH+1] = "";
  458. + Hidden bool busy = No;
  459.   /*
  460.    * Open a directory.
  461.    * This MS-DOS version allows only one directory to be open at a time.
  462. ***************
  463. *** 30,153 ****
  464.    * Then it only saves the file name and returns a pointer to it.
  465.    */
  466.   
  467. ! char *
  468. ! opendir(path)
  469. !     char *path;
  470.   {
  471.       struct stat buffer;
  472.   
  473.       if (dirpath[0] != EOS) {
  474. !          errno= EMFILE;
  475.            return NULL; /* Only one directory can be open at a time */
  476.       }
  477.       if (stat(path, &buffer) == -1)
  478.           return NULL; /* Directory doesn't exist */
  479.       if ((buffer.st_mode & S_IFMT) != S_IFDIR) {
  480. !         errno= ENOENT;
  481.           return NULL; /* Not a directory */
  482.       }
  483.       strcpy(dirpath, path);
  484. !     path= dirpath + strlen(dirpath);
  485.       if (path > dirpath && path[-1] != ':' && path[-1] != '/' &&
  486.               path[-1] != '\\')
  487.           *path++ = '\\';
  488.       strcpy(path, "*.*");
  489. !     busy= FALSE; /* Tell readdir this is the first time */
  490. !     return dirpath;
  491.   }
  492.   
  493.   /*
  494. -  * Close a directory.
  495. -  * We must clear the first char of dirpath to signal opendir that
  496. -  * no directory is open.
  497. -  */
  498. - closedir(dirp)
  499. -     char *dirp;
  500. - {
  501. -     dirp[0]= EOS;
  502. - }
  503. - /*
  504.    * Read the next directory entry.
  505.    */
  506.   
  507. ! struct direct *
  508. ! readdir(dp)
  509. !     char *dp;
  510.   {
  511.       static struct direct buffer;
  512.       char *p;
  513.   
  514.       if (!busy)
  515. !         p= firstf(dp);
  516.       else
  517. !         p= nextf();
  518. !     busy= (p != NULL);
  519.       if (!busy)
  520.           return NULL;
  521.       strcpy(buffer.d_name, p);
  522. !     buffer.d_namlen= strlen(p);
  523.       return &buffer;
  524.   }
  525.   
  526.   
  527.   /*
  528. !  * Low-level implementation -- access to DOS system calls FIRST and NEXT.
  529.    */
  530.   
  531. ! static char dta[64]; /* Device Transfer Area */
  532.   
  533. ! /* File attributes */
  534. ! #define READONLY    0x01
  535. ! #define HIDDEN        0x02
  536. ! #define SYSTEM        0x04
  537. ! #define VOLUMEID    0x08
  538. ! #define DIRECTORY    0x10
  539. ! #define ARCHIVE        0x20
  540.   
  541. ! #define MATCHATTR    (HIDDEN|SYSTEM|DIRECTORY)
  542.   
  543. ! static char *
  544. ! firstf(pat)
  545. !     char *pat;
  546.   {
  547. !     int flags;
  548. !     union REGS regs;
  549. !     struct SREGS segregs;
  550.   
  551. !     setdta(dta);
  552.   
  553. !     segread(&segregs);
  554. !     regs.h.ah = 0x4e;
  555. !     regs.x.cx = MATCHATTR;
  556.   #ifdef M_I86LM /* Large Model -- far pointers */
  557. !     regs.x.dx = FP_OFF(pat);
  558. !     segregs.ds = FP_SEG(pat);
  559.   #else
  560. !     regs.x.dx = (int) pat;
  561.   #endif
  562. !     flags= intdosx(®s, ®s, &segregs);
  563. !     if (regs.x.cflag)
  564. !     return NULL;
  565. !     fixfile();
  566. !     return dta + 30;
  567.   }
  568.   
  569. ! static char *
  570. ! nextf()
  571.   {
  572. !     int flags;
  573. !     union REGS regs;
  574.   
  575. !     setdta(dta);
  576.   
  577. !     regs.h.ah = 0x4f;
  578. !     flags= intdos(®s, ®s);
  579. !     if (regs.x.cflag)
  580. !     return NULL;
  581. !     fixfile();
  582. !     return dta + 30;
  583.   }
  584.   
  585.   /*
  586. --- 40,151 ----
  587.    * Then it only saves the file name and returns a pointer to it.
  588.    */
  589.   
  590. ! Visible DIR *opendir(path)
  591. !      char *path;
  592.   {
  593.       struct stat buffer;
  594.   
  595.       if (dirpath[0] != EOS) {
  596. !          errno = EMFILE;
  597.            return NULL; /* Only one directory can be open at a time */
  598.       }
  599.       if (stat(path, &buffer) == -1)
  600.           return NULL; /* Directory doesn't exist */
  601.       if ((buffer.st_mode & S_IFMT) != S_IFDIR) {
  602. !         errno = ENOENT;
  603.           return NULL; /* Not a directory */
  604.       }
  605.       strcpy(dirpath, path);
  606. !     path = dirpath + strlen(dirpath);
  607.       if (path > dirpath && path[-1] != ':' && path[-1] != '/' &&
  608.               path[-1] != '\\')
  609.           *path++ = '\\';
  610.       strcpy(path, "*.*");
  611. !     busy = No; /* Tell readdir this is the first time */
  612. !     return (DIR *) dirpath;
  613.   }
  614.   
  615.   /*
  616.    * Read the next directory entry.
  617.    */
  618.   
  619. ! Visible struct direct *readdir(dp)
  620. !      char *dp;
  621.   {
  622.       static struct direct buffer;
  623.       char *p;
  624.   
  625.       if (!busy)
  626. !         p = firstf((char *)dp);
  627.       else
  628. !         p = nextf();
  629. !     busy = (p != NULL);
  630.       if (!busy)
  631.           return NULL;
  632.       strcpy(buffer.d_name, p);
  633. !     buffer.d_namlen = strlen(p);
  634.       return &buffer;
  635.   }
  636.   
  637.   
  638.   /*
  639. !  * Close a directory.
  640. !  * We must clear the first char of dirpath to signal opendir that
  641. !  * no directory is open.
  642.    */
  643.   
  644. ! Visible Procedure closedir(dirp)
  645. !      DIR *dirp;
  646. ! {
  647. !     dirp[0] = EOS;
  648. ! }
  649.   
  650. ! /*
  651. !  * Low-level implementation -- access to DOS system calls FIRST and NEXT.
  652. !  */
  653.   
  654. ! Hidden char dta[64]; /* Device Transfer Area */
  655.   
  656. ! #define DIRATTR 0x10
  657. ! Hidden char *firstf(pat)
  658. !      char *pat;
  659.   {
  660. !     static int flags;
  661. !     union REGS regs;
  662. !     struct SREGS segregs;
  663.   
  664. !     setdta(dta);
  665.   
  666. !     segread(&segregs);
  667. !     regs.h.ah = 0x4e;
  668. !     regs.x.cx = DIRATTR;
  669.   #ifdef M_I86LM /* Large Model -- far pointers */
  670. !     regs.x.dx = FP_OFF(pat);
  671. !     segregs.ds = FP_SEG(pat);
  672.   #else
  673. !     regs.x.dx = (int) pat;
  674.   #endif
  675. !     flags = intdosx(®s, ®s, &segregs);
  676. !     if (regs.x.cflag)
  677. !       return NULL;
  678. !     fixfile();
  679. !     return dta + 30;
  680.   }
  681.   
  682. ! Hidden char *nextf()
  683.   {
  684. !     int flags;
  685. !     union REGS regs;
  686.   
  687. !     setdta(dta);
  688.   
  689. !     regs.h.ah = 0x4f;
  690. !     flags = intdos(®s, ®s);
  691. !     if (regs.x.cflag)
  692. !       return NULL;
  693. !     fixfile();
  694. !     return dta + 30;
  695.   }
  696.   
  697.   /*
  698. ***************
  699. *** 154,166 ****
  700.    * Convert the file name in the Device Transfer Area to lower case.
  701.    */
  702.   
  703. ! static
  704. ! fixfile()
  705.   {
  706.       char *cp;
  707.   
  708. !     for (cp= dta+30; *cp != EOS; ++cp)
  709. !         *cp= tolower(*cp);
  710.   }
  711.   
  712.   /*
  713. --- 152,163 ----
  714.    * Convert the file name in the Device Transfer Area to lower case.
  715.    */
  716.   
  717. ! Hidden Procedure fixfile()
  718.   {
  719.       char *cp;
  720.   
  721. !     for (cp = dta+30; *cp != EOS; ++cp)
  722. !       *cp = tolower(*cp);
  723.   }
  724.   
  725.   /*
  726. ***************
  727. *** 167,186 ****
  728.    * Tell MS-DOS where the Device Transfer Area is.
  729.    */
  730.   
  731. ! static
  732. ! setdta(dta)
  733. !     char *dta;
  734.   {
  735. !     union REGS regs;
  736. !     struct SREGS segregs;
  737.   
  738. !     segread(&segregs);
  739. !     regs.h.ah = 0x1a;
  740.   #ifdef M_I86LM /* Large Model -- far pointers */
  741. !     regs.x.dx = FP_OFF(dta);
  742. !     segregs.ds = FP_SEG(dta);
  743.   #else
  744. !     regs.x.dx = (int) dta;
  745.   #endif
  746. !     intdosx(®s, ®s, &segregs);
  747.   }
  748. --- 164,182 ----
  749.    * Tell MS-DOS where the Device Transfer Area is.
  750.    */
  751.   
  752. ! Hidden Procedure setdta(dta)
  753. !      char *dta;
  754.   {
  755. !     union REGS regs;
  756. !     struct SREGS segregs;
  757.   
  758. !     segread(&segregs);
  759. !     regs.h.ah = 0x1a;
  760.   #ifdef M_I86LM /* Large Model -- far pointers */
  761. !     regs.x.dx = FP_OFF(dta);
  762. !     segregs.ds = FP_SEG(dta);
  763.   #else
  764. !     regs.x.dx = (int) dta;
  765.   #endif
  766. !     intdosx(®s, ®s, &segregs);
  767.   }
  768. *** 0.9.5/Ports/msdos/dir.h    Wed Jun 24 13:38:30 1987
  769. --- stdwin/Ports/msdos/dir.h    Tue Apr 23 15:56:53 1991
  770. ***************
  771. *** 1,3 ****
  772. --- 1,5 ----
  773. + /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1990. */
  774.   /*
  775.    * Interface for MS-DOS version of UNIX directory access package.
  776.    * (opendir, readdir, closedir).
  777. ***************
  778. *** 10,14 ****
  779.   
  780.   typedef char DIR;
  781.   
  782. ! DIR *opendir();
  783. ! struct direct *readdir();
  784. --- 12,17 ----
  785.   
  786.   typedef char DIR;
  787.   
  788. ! extern DIR *opendir();
  789. ! extern struct direct *readdir();
  790. ! extern closedir();
  791. *** 0.9.5/Ports/msdos/lib.    Fri Sep  4 16:17:13 1987
  792. --- stdwin/Ports/msdos/lib.    Tue Apr 23 15:57:05 1991
  793. ***************
  794. *** 24,32 ****
  795.   
  796.   style.obj:
  797.   
  798. ! PTRM=        ptrm.obj
  799.   
  800. ! ptrm.obj:
  801.   
  802.   ALFA=        bind.obj draw.obj event.obj keymap.obj measure.obj \
  803.           menu.obj scroll.obj stdwin.obj syswin.obj
  804. --- 24,32 ----
  805.   
  806.   style.obj:
  807.   
  808. ! VTRM=        vtrm.obj
  809.   
  810. ! vtrm.obj:
  811.   
  812.   ALFA=        bind.obj draw.obj event.obj keymap.obj measure.obj \
  813.           menu.obj scroll.obj stdwin.obj syswin.obj
  814. ***************
  815. *** 49,52 ****
  816.   
  817.   syswin.obj: alfa.h
  818.   
  819. ! ALL=        $(TOOLS) $(TEXTEDIT) $(PTRM) $(ALFA)
  820. --- 49,52 ----
  821.   
  822.   syswin.obj: alfa.h
  823.   
  824. ! ALL=        $(TOOLS) $(TEXTEDIT) $(VTRM) $(ALFA)
  825. *** /dev/null    Fri Jun  7 14:31:40 1991
  826. --- stdwin/Ports/msdos/vtrm.c    Tue Apr 23 15:52:28 1991
  827. ***************
  828. *** 0 ****
  829. --- 1,1137 ----
  830. + /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1991. */
  831. + /*
  832. +  * ibm Pc virtual TeRMinal package.
  833. +  *
  834. +  * (Under reconstruction by Guido!)
  835. +  *
  836. +  * An implementation of the VTRM interface for MS-DOS machines.
  837. +  *
  838. +  * This code supports two modes of accessing the screen.
  839. +  * The first one (BIOS) will be used, unless the user overwrites this
  840. +  * by setting the SCREEN environment variable.
  841. +  * This variable can also be used to convey a screen size that differs
  842. +  * from the default 25 lines and 80 columns. See below.
  843. +  *
  844. +  * The two modes are:
  845. +  *
  846. +  * 1) IBM BIOS interrupt 10 hex, video io.
  847. +  *    (See IBM PC XT Technical Reference 6936833, May 1983,
  848. +  *     Appendix A, pages A46-A47).
  849. +  *    This is what you really want to use, since it's the only one that
  850. +  *    can decently scroll. It cannot insert or delete characters, so
  851. +  *    most optimisations from the unix version of vtrm.c are useless
  852. +  *    and taken out.
  853. +  *    Unfortunately, not every PC-compatible machine supports this BIOS
  854. +  *    interrupt, so for these unlucky souls there is the following escape:
  855. +  *
  856. +  * 2) The ANSI.SYS driver.
  857. +  *    (See IBM MS-DOS 6936839, Jan 1983, Version 2.00, Chapter 13.)
  858. +  *    (Some compatibles don't have a separate ANSI.SYS driver but do the
  859. +  *    same escape interpretation by default.)
  860. +  *    This works reasonably, apart from scrolling downward, or part of
  861. +  *    the screen, which is clumsy.
  862. +  *    (The ANSI standard provides an escape sequence for scrolling
  863. +  *    but ANSI.SYS does not support it, nor any other way of scrolling.)
  864. +  *
  865. +  * The rest of the interface is the same as described in the unix version,
  866. +  * with the following exceptions:
  867. +  *    - to ease coding for ansi scrolls, the terminal is supposed to
  868. +  *    contain blanks at positions that were not written yet;
  869. +  *    the unknown rubbish that is initially on the screen can
  870. +  *    only be cleared by the caller by scrolling the whole screen up
  871. +  *    by one or more lines;
  872. +  *    - the number of lines on the terminal is assumed to be 25;
  873. +  *    the number of columns is (1) determined by a BIOS function, or
  874. +  *    (2) assumed to be 80 for ANSI;
  875. +  *    the user can overwrite this by setting the environment variable:
  876. +  *
  877. +  *        SET SCREEN=BIOS y x
  878. +  *    or
  879. +  *        SET SCREEN=ANSI y x
  880. +  *
  881. +  *    where x and y are the number of lines and columns respectively.
  882. +  *
  883. +  * The lines and columns of our virtual terminal are numbered
  884. +  *    y = {0...lines-1} from top to bottom, and
  885. +  *    x = {0...cols-1} from left to right,
  886. +  * respectively.
  887. +  *
  888. +  * The Visible Procedures in this package are as described in the unix version.
  889. +  *
  890. +  */
  891. + /* Includes: */
  892. + #include <stdio.h>
  893. + #include <ctype.h>
  894. + #include <string.h>
  895. + #include <dos.h>
  896. + #include <fcntl.h>
  897. + #include <io.h>
  898. + #include "vtrm.h"
  899. + /* Style definitions: */
  900. + #define Visible
  901. + #define Hidden static
  902. + #define Procedure
  903. + typedef int bool;
  904. + typedef char *string;
  905. + typedef short intlet;
  906. + #define Yes ((bool) 1)
  907. + #define No  ((bool) 0)
  908. + /* Forward declarations: */
  909. + extern char *malloc();
  910. + /* Data definitions: */
  911. + #ifdef VTRMTRACE
  912. + #define TRACEFILE "TRACE.TRM"
  913. + Hidden FILE *vtrmfp= (FILE *) NULL;
  914. + #endif
  915. + #define STDIN_HANDLE 0
  916. + #define Undefined (-1)
  917. + #define Min(a,b) ((a) <= (b) ? (a) : (b))
  918. + /* terminal status */
  919. + Hidden int started = No;
  920. + Hidden int scr_mode = 0;
  921. + #define ANSI 'A'
  922. + #define BIOS 'B'
  923. + #define Nlines    25
  924. + #define Ncols    80
  925. + Hidden int lines = Nlines;
  926. + Hidden int cols = Ncols;
  927. + Hidden int flags = 0;
  928. + /* current standout mode */
  929. + #define Off    PLAIN
  930. + #define On    STANDOUT
  931. + Hidden int so_mode = Off;
  932. + /* current cursor position */
  933. + Hidden intlet cur_y = Undefined, cur_x = Undefined;
  934. + /* "linedata[y][x]" holds the char on the terminal,
  935. +  * "linemode[y][x]" the STANDOUT bit.
  936. +  * The STANDOUT bit tells whether the character is standing out.
  937. +  * "lenline[y]" holds the length of the line.
  938. +  * (Partially) empty lines are distinghuished by "lenline[y] < cols".
  939. +  * Unknown chars will be ' ', so the scrolling routines for ANSI
  940. +  * can use "unwritten" chars (with indent > 0 in trmputdata).
  941. +  * To make the optimising compare in putline fail, lenline[y] is initially 0.
  942. +  * The latter implies that if a line is first addressed with trmputdata,
  943. +  * any rubbish that is on the screen beyond the data that gets put, will
  944. +  * remain there.
  945. +  */
  946. + Hidden char     **linedata = 0;
  947. + Hidden char     **linemode = 0;
  948. + Hidden intlet *lenline = 0;
  949. + /* To compare the mode part of the line when the
  950. +  * mode parameter of trmputdata == NULL, we use the following:
  951. +  */
  952. + Hidden char plain[1]= {PLAIN};
  953. + /* Make the cursor invisible when trmsync() tries to move outside the screen */
  954. + Hidden bool no_cursor = No;
  955. + /*
  956. +  * Starting, Ending and (fatal) Error.
  957. +  */
  958. + Hidden bool wasbreak;
  959. + /*
  960. +  * Initialization call.
  961. +  * Determine terminal mode.
  962. +  * Start up terminal and internal administration.
  963. +  * Return Yes if succeeded, No if trouble (which doesn't apply here).
  964. +  */
  965. + Visible int trmstart(plines, pcols, pflags)
  966. +      int *plines;
  967. +      int *pcols;
  968. +      int *pflags;
  969. + {
  970. +     static char setup = No;
  971. +     int err;
  972. + #ifdef VTRMTRACE
  973. +     if (!started) vtrmfp= fopen(TRACEFILE, vtrmfp ? "a" : "w");
  974. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmstart(&li, &co, &fl);\n");
  975. + #endif
  976. +     if (started)
  977. +         return TE_TWICE;
  978. +     if (!setup) {
  979. +         err = set_screen_up();
  980. +         if (err != TE_OK)
  981. +             return err;
  982. +         setup = Yes;
  983. +     }
  984. +     err = start_trm();        /* internal administration */
  985. +     if (err != TE_OK)
  986. +         return err;
  987. +     *plines = lines;
  988. +     *pcols = cols;
  989. +     *pflags = flags;
  990. +     setmode(STDIN_HANDLE, O_BINARY); /* Don't translate CRLF to LF */
  991. +     setraw(STDIN_HANDLE, Yes);
  992. +     wasbreak = getbreak(); /* Save BREAK status; restore when done */
  993. +     setbreak(No);
  994. +     started = Yes;
  995. +     return TE_OK;
  996. + }
  997. + Hidden int set_screen_up()
  998. + {
  999. +     int height;
  1000. +     int width;
  1001. +     int get_screen_env();
  1002. +     int get_cols();
  1003. +     height = width = 0;
  1004. +     scr_mode = get_screen_env(&height, &width);
  1005. +     switch (scr_mode) {
  1006. +     case BIOS:
  1007. +     case TE_OK:
  1008. +         cols = get_cols();
  1009. +         flags = HAS_STANDOUT|CAN_SCROLL;
  1010. +         break;
  1011. +     case ANSI:
  1012. +         flags = HAS_STANDOUT;
  1013. +         break;
  1014. +     default:
  1015. +         return scr_mode; /* Error flag */
  1016. +     }
  1017. +     /* allow x and y in environment variable SCREEN to override */
  1018. +     if (height > 0)
  1019. +         lines = height;
  1020. +     if (width > 0)
  1021. +         cols = width;
  1022. +     return TE_OK;
  1023. + }
  1024. + Hidden int get_screen_env(pheight, pwidth)
  1025. +      int *pheight;
  1026. +      int *pwidth;
  1027. + {
  1028. +     string s;
  1029. +     int mode;
  1030. +     char screrr;
  1031. +     string getenv();
  1032. +     string strip();
  1033. +     string skip();
  1034. +     screrr = No;
  1035. +     s = getenv("SCREEN");
  1036. +     if (s == NULL)
  1037. +         return BIOS;
  1038. +     s = strip(s);
  1039. +     switch (*s) {
  1040. +     case '\0':
  1041. +         return BIOS;
  1042. +     case 'a':
  1043. +         mode = ANSI;
  1044. +         s = skip(s, "ansi");
  1045. +         break;
  1046. +     case 'A':
  1047. +         mode = ANSI;
  1048. +         s = skip(s, "ANSI");
  1049. +         break;
  1050. +     case 'b':
  1051. +         mode = BIOS;
  1052. +         s = skip(s, "bios");
  1053. +         break;
  1054. +     case 'B':
  1055. +         mode = BIOS;
  1056. +         s = skip(s, "BIOS");
  1057. +         break;
  1058. +     default:
  1059. +         mode = BIOS;
  1060. +         screrr = Yes;
  1061. +     }
  1062. +     /* *pheight and *pwidth were set to 0 above */
  1063. +     s = strip(s);
  1064. +     while (isdigit(*s)) {
  1065. +         *pheight = *pheight * 10 + (*s++ - '0');
  1066. +     }
  1067. +     s = strip(s);
  1068. +     while (isdigit(*s)) {
  1069. +         *pwidth = *pwidth * 10 + (*s++ -'0');
  1070. +     }
  1071. +     s = strip(s);
  1072. +     if (screrr || *s != '\0')
  1073. +         return TE_BADSCREEN;
  1074. +     return mode;
  1075. + }
  1076. + Hidden string strip(s)
  1077. +      string s;
  1078. + {
  1079. +     while (*s == ' ' || *s == '\t')
  1080. +         ++s;
  1081. +     return s;
  1082. + }
  1083. + Hidden string skip(s, pat)
  1084. +      string s;
  1085. +      string pat;
  1086. + {
  1087. +     while (*s && *s == *pat)
  1088. +         ++s, ++pat;
  1089. +     return s;
  1090. + }
  1091. + /* initialise internal administration */
  1092. + Hidden int start_trm()
  1093. + {
  1094. +     register int y;
  1095. +     if (linedata == NULL) {
  1096. +         if ((linedata = (char**) malloc(lines * sizeof(char*))) == NULL)
  1097. +             return TE_NOMEM;
  1098. +         for (y = 0; y < lines; y++) {
  1099. +             if ((linedata[y] = (char*) malloc(cols * sizeof(char))) == NULL)
  1100. +                 return TE_NOMEM;
  1101. +         }
  1102. +     }
  1103. +     if (linemode == NULL) {
  1104. +         if ((linemode = (char**) malloc(lines * sizeof(char*))) == NULL)
  1105. +             return TE_NOMEM;
  1106. +         for (y = 0; y < lines; y++) {
  1107. +             if ((linemode[y] = (char*) malloc(cols * sizeof(char))) == NULL)
  1108. +                 return TE_NOMEM;
  1109. +         }
  1110. +     }
  1111. +     if (lenline == 0) {
  1112. +         if ((lenline = (intlet *) malloc(lines * sizeof(intlet))) == NULL)
  1113. +             return TE_NOMEM;
  1114. +     }
  1115. +         
  1116. +     trmundefined();
  1117. +     return TE_OK;
  1118. + }
  1119. + /*
  1120. +  * Termination call.
  1121. +  * Beware that it might be called by a catched interrupt even in the middle
  1122. +  * of trmstart()!
  1123. +  */
  1124. + Visible Procedure trmend()
  1125. + {
  1126. + #ifdef VTRMTRACE
  1127. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmend();\n");
  1128. + #endif
  1129. +     if (started && so_mode != Off)
  1130. +         standend();
  1131. +     if (scr_mode == ANSI) {
  1132. +         fflush(stdout);
  1133. +     }
  1134. +     /* Always turn off RAW mode -- it is unlikely that anybody
  1135. +        would want to interface to COMMAND.COM in raw mode.
  1136. +        This way, if you were accidentally left in RAW mode
  1137. +        because of a crash, it will go away if you re-enter. */
  1138. +     setraw(STDIN_HANDLE, No);
  1139. +     setbreak(wasbreak);
  1140. +     started = No;
  1141. + #ifdef VTRMTRACE
  1142. +     if (vtrmfp) fclose(vtrmfp);
  1143. + #endif
  1144. + }
  1145. + /*
  1146. +  * Set all internal statuses to undefined, especially the contents of
  1147. +  * the screen, so a hard redraw will not be optimised to heaven.
  1148. +  */
  1149. + Visible Procedure trmundefined()
  1150. + {
  1151. +     register int y, x;
  1152. + #ifdef VTRMTRACE
  1153. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmundefined();\n");
  1154. + #endif
  1155. +     cur_y = cur_x = Undefined;
  1156. +     so_mode = Undefined;
  1157. +     for (y = 0; y < lines; y++) {
  1158. +         for (x = 0; x < cols; x++) {
  1159. +             linedata[y][x] = ' ';
  1160. +             linemode[y][x] = PLAIN;
  1161. +         }
  1162. +             /* they may get printed in scrolling */
  1163. +         lenline[y] = cols;
  1164. +     }
  1165. + }
  1166. + #ifdef VTRMTRACE
  1167. + Hidden Procedure check_started(m)
  1168. +      char *m;
  1169. + {
  1170. +     if (!started) {
  1171. +         trmend();
  1172. +         if (vtrmfp) fprintf(vtrmfp, "Not started: %s\n", m);
  1173. +         exit(TE_TWICE);
  1174. +     }
  1175. + }
  1176. + #else
  1177. + #define check_started(m) /*empty*/
  1178. + #endif
  1179. + /*
  1180. +  * Sensing the cursor.
  1181. +  * (NOT IMPLEMENTED, since there is no way to locally move the cursor.)
  1182. +  */
  1183. + /*
  1184. +  * Sense the current (y, x) cursor position, after a possible manual
  1185. +  * change by the user with local cursor motions.
  1186. +  * If the terminal cannot be asked for the current cursor position,
  1187. +  * or if the string returned by the terminal is garbled,
  1188. +  * the position is made Undefined.
  1189. +  */
  1190. + Visible Procedure trmsense(sense, format, py, px)
  1191. +      string sense;
  1192. +      string format;
  1193. +      int *py;
  1194. +      int *px;
  1195. + {
  1196. + #ifdef VTRMTRACE
  1197. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmsense(&yy, &xx);\n");
  1198. + #endif
  1199. +     check_started("trmsense called outside trmstart/trmend");
  1200. + /*    *py = *px = Undefined;
  1201. +  *
  1202. +  *
  1203. +  *    if (flags&CAN_SENSE && getpos(py, px)) {
  1204. +  *        if (*py < 0 || lines <= *py || *px < 0 || cols <= *px)
  1205. +  *            *py = *px = Undefined;
  1206. +  *    }
  1207. +  */
  1208. +     *py = *px= Undefined;
  1209. + }
  1210. + /*
  1211. +  * Putting data on the screen.
  1212. +  */
  1213. + /*
  1214. +  * Fill screen area with given "data".
  1215. +  * Characters for which the corresponding chars in "mode" have the value
  1216. +  * STANDOUT must be put in inverse video.
  1217. +  */
  1218. + Visible Procedure trmputdata(yfirst, ylast, indent, data, mode)
  1219. +      int yfirst;
  1220. +      int ylast;
  1221. +      register int indent;
  1222. +      register string data;
  1223. +      string mode;
  1224. + {
  1225. +     register int y;
  1226. +     int x, len, lendata, space;
  1227. + #ifdef VTRMTRACE
  1228. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmputdata(%d, %d, %d, \"%s\");\n",
  1229. +                 yfirst, ylast, indent, data);
  1230. + #endif
  1231. +     check_started("trmputdata called outside trmstart/trmend");
  1232. +     if (yfirst < 0)
  1233. +         yfirst = 0;
  1234. +     if (ylast >= lines)
  1235. +         ylast = lines-1;
  1236. +     space = cols*(ylast-yfirst+1) - indent;
  1237. +     if (space <= 0)
  1238. +         return;
  1239. +     yfirst += indent/cols;
  1240. +     indent %= cols;
  1241. +     y = yfirst;
  1242. +     if (data) {
  1243. +         x = indent;
  1244. +         lendata = strlen(data);
  1245. +         if (ylast == lines-1 && lendata >= space)
  1246. +             lendata = space - 1;
  1247. +         len = Min(lendata, cols-x);
  1248. +         while (/*** len > 0 && ***/ y <= ylast) {
  1249. +             put_line(y, x, data, mode, len);
  1250. +             y++;
  1251. +             lendata -= len;
  1252. +             if (lendata > 0) {
  1253. +                 x = 0;
  1254. +                 data += len;
  1255. +                 if (mode != NULL)
  1256. +                     mode += len;
  1257. +                 len = Min(lendata, cols);
  1258. +             }
  1259. +             else
  1260. +                 break;
  1261. +         }
  1262. +     }
  1263. +     if (y <= ylast)
  1264. +         clear_lines(y, ylast);
  1265. + }
  1266. + /*
  1267. +  * We will try to get the picture:
  1268. +  *
  1269. +  *            op>>>>>>>>>>>op                       oq
  1270. +  *            ^         ^                       ^
  1271. +  *         <xskip><-----m1----><---------------od-------------------->
  1272. +  *   OLD:   "You're in a maze of twisty little pieces of code, all alike"
  1273. +  *   NEW:       "in a maze of little twisting pieces of code, all alike"
  1274. +  *            <-----m1----><----------------nd--------------------->
  1275. +  *            ^         ^                     ^
  1276. +  *            np>>>>>>>>>>>np                     nq
  1277. +  * where
  1278. +  *    op, oq, np, nq are pointers to start and end of Old and New data,
  1279. +  * and
  1280. +  *    xskip = length of indent to be skipped,
  1281. +  *    m1 = length of Matching part at start,
  1282. +  *    od = length of Differing end on screen,
  1283. +  *    nd = length of Differing end in data to be put.
  1284. +  */
  1285. + Hidden int put_line(y, xskip, data, mode, len)
  1286. +      int y;
  1287. +      int xskip;
  1288. +      string data;
  1289. +      string mode;
  1290. +      int len;
  1291. + {
  1292. +     register char *op, *oq, *mp;
  1293. +     char *np, *nq, *mo;
  1294. +     int m1, od, nd, delta;
  1295. +     /* Bugfix GvR 19-June-87: */
  1296. +     while (lenline[y] < xskip) {
  1297. +         linedata[y][lenline[y]] = ' ';
  1298. +         linemode[y][lenline[y]] = PLAIN;
  1299. +         lenline[y]++;
  1300. +     }
  1301. +     
  1302. +     /* calculate the magic parameters */
  1303. +     op = &linedata[y][xskip];
  1304. +     oq = &linedata[y][lenline[y]-1];
  1305. +     mp = &linemode[y][xskip];
  1306. +     np = data;
  1307. +     nq = data + len - 1;
  1308. +     mo = (mode != NULL ? mode : plain);
  1309. +     m1 = 0;
  1310. +     while (*op == *np && *mp == *mo && op <= oq && np <= nq) {
  1311. +         op++, np++, mp++, m1++;
  1312. +         if (mode != NULL) mo++;
  1313. +     }
  1314. +     od = oq - op + 1;
  1315. +     nd = nq - np + 1;
  1316. +     /* now we have the picture above */
  1317. +     if (od==0 && nd==0)
  1318. +         return;
  1319. +     delta = nd - od;
  1320. +     move(y, xskip + m1);
  1321. +     if (nd > 0) {
  1322. +         mo= (mode != NULL ? mode+(np-data) : NULL);
  1323. +         put_str(np, mo, nd);
  1324. +     }
  1325. +     if (delta < 0) {
  1326. +         clr_to_eol();
  1327. +         return;
  1328. +     }
  1329. +     lenline[y] = xskip + len;
  1330. +     if (cur_x == cols) {
  1331. +         cur_y++;
  1332. +         cur_x = 0;
  1333. +     }
  1334. + }
  1335. + /*
  1336. +  * Scrolling (part of) the screen up (or down, dy<0).
  1337. +  */
  1338. + Visible Procedure trmscrollup(yfirst, ylast, by)
  1339. +      register int yfirst;
  1340. +      register int ylast;
  1341. +      register int by;
  1342. + {
  1343. + #ifdef VTRMTRACE
  1344. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmscrollup(%d, %d, %d);\n", yfirst, ylast, by);
  1345. + #endif
  1346. +     check_started("trmscrollup called outside trmstart/trmend");
  1347. +     if (by == 0)
  1348. +         return;
  1349. +     if (yfirst < 0)
  1350. +         yfirst = 0;
  1351. +     if (ylast >= lines)
  1352. +         ylast = lines-1;
  1353. +     if (yfirst > ylast)
  1354. +         return;
  1355. +     if (so_mode != Off)
  1356. +         standend();
  1357. +     if (by > 0 && yfirst + by > ylast
  1358. +         ||
  1359. +         by < 0 && yfirst - by > ylast)
  1360. +     {
  1361. +         clear_lines(yfirst, ylast);
  1362. +         return;
  1363. +     }
  1364. +     switch (scr_mode) {
  1365. +     case BIOS:
  1366. +         biosscrollup(yfirst, ylast, by);
  1367. +         break;
  1368. +     case ANSI:
  1369. +         if (by > 0 && yfirst == 0) {
  1370. +             lf_scroll(ylast, by);
  1371. +         }
  1372. +         else if (by > 0) {
  1373. +             move_lines(yfirst+by, yfirst, ylast-yfirst+1-by, 1);
  1374. +             clear_lines(ylast-by+1, ylast);
  1375. +         }
  1376. +         else {
  1377. +             move_lines(ylast+by, ylast, ylast-yfirst+1+by, -1);
  1378. +             clear_lines(yfirst, yfirst-by-1);
  1379. +         }
  1380. +         break;
  1381. +     }
  1382. + }
  1383. + /*
  1384. +  * Synchronization, move cursor to given position (or previous if < 0).
  1385. +  */
  1386. + Visible Procedure trmsync(y, x)
  1387. +      int y;
  1388. +      int x;
  1389. + {
  1390. + #ifdef VTRMTRACE
  1391. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmsync(%d, %d);\n", y, x);
  1392. + #endif
  1393. +     check_started("trmsync called outside trmstart/trmend");
  1394. +     if (0 <= y && y < lines && 0 <= x && x < cols) {
  1395. +         move(y, x);
  1396. +     }
  1397. +     fflush(stdout);
  1398. + }
  1399. + /*
  1400. +  * Send a bell, visible if possible.
  1401. +  */
  1402. + Visible Procedure trmbell() {
  1403. + #ifdef VTRMTRACE
  1404. +     if (vtrmfp) fprintf(vtrmfp, "\ttrmbell();\n");
  1405. + #endif
  1406. +     check_started("trmbell called outside trmstart/trmend");
  1407. +     ring_bell();
  1408. + }
  1409. + /*
  1410. +  * Now for the real work: here are all low level routines that really
  1411. +  * differ for BIOS or ANSI mode.
  1412. +  */
  1413. + /*
  1414. +  * BIOS video io is called by generating an 8086 software interrupt,
  1415. +  * using lattice's int86() function.
  1416. +  * To ease coding, all routines fill in the apropriate parameters in regs,
  1417. +  * and then call bios10(code), where code is to be placed in ah.
  1418. +  */
  1419. + Hidden union REGS regs, outregs;
  1420. + /* A macro for speed  */
  1421. + #define bios10(code) (regs.h.ah = (code), int86(0x10, ®s, ®s))
  1422. + #define nbios10(code) (regs.h.ah = (code), int86(0x10, ®s, &outregs))
  1423. + /* Video attributes: (see the BASIC manual) (used for standout mode) */
  1424. + Hidden int video_attr;
  1425. + #define V_NORMAL 7
  1426. + #define V_STANDOUT (7<<4)
  1427. + /* Some BIOS only routines */
  1428. + Hidden get_cols()
  1429. + {
  1430. +     bios10(15);
  1431. +     return regs.h.ah;
  1432. + }
  1433. + /*
  1434. +  * ANSI escape sequences
  1435. +  */
  1436. + #define A_CUP    "\033[%d;%dH"   /* cursor position */
  1437. + #define A_SGR0    "\033[0m"       /* set graphics rendition to normal */
  1438. + #define A_SGR7    "\033[7m"       /* set graphics rendition to standout */
  1439. + #define A_ED    "\033[2J"       /* erase display (and cursor home) */
  1440. + #define A_EL    "\033[K"        /* erase (to end of) line */
  1441. + /*
  1442. +  * The following routine is the time bottleneck, I believe!
  1443. +  */
  1444. + Hidden Procedure put_str(data, mode, n)
  1445. +      char *data;
  1446. +      char *mode;
  1447. +      int n;
  1448. + {
  1449. +     register char c, mo, so;
  1450. +     so = so_mode;
  1451. +     if (scr_mode == BIOS) {
  1452. +         regs.x.cx = 1;    /* repition count */
  1453. +         regs.h.bh = 0;    /* page number */
  1454. +         regs.h.bl = video_attr;
  1455. +         while (--n >= 0) {
  1456. +             c = *data++;
  1457. +             mo= (mode != NULL ? *mode++ : PLAIN);
  1458. +             if (mo != so) {
  1459. +                 so= mo;
  1460. +                 so ? standout() : standend();
  1461. +                 regs.h.bl = video_attr;
  1462. +             }
  1463. +             regs.h.al = c /* &CHAR */;
  1464. +             nbios10(9);
  1465. +             if (cur_x >= cols-1) {
  1466. +                 linedata[cur_y][cols-1] = c;
  1467. +                 linemode[cur_y][cols-1] = mo;
  1468. +                 continue;
  1469. +             }
  1470. +             regs.h.dh = cur_y;
  1471. +             regs.h.dl = cur_x + 1;
  1472. +             nbios10(2);
  1473. +             linedata[cur_y][cur_x] = c;
  1474. +             linemode[cur_y][cur_x]= mo;
  1475. +             cur_x++;
  1476. +         }
  1477. +     }
  1478. +     else {
  1479. +         while (--n >= 0) {
  1480. +             c = *data++;
  1481. +             mo= (mode != NULL ? *mode++ : PLAIN);
  1482. +             if (mo != so) {
  1483. +                 so= mo;
  1484. +                 so ? standout() : standend();
  1485. +             }
  1486. +             putch(c);
  1487. +             linedata[cur_y][cur_x] = c;
  1488. +             linemode[cur_y][cur_x]= mo;
  1489. +             cur_x++;
  1490. +         }
  1491. +     }
  1492. + }
  1493. + /*
  1494. +  * Move to position y,x on the screen
  1495. +  */
  1496. + Hidden Procedure move(y, x)
  1497. +      int y;
  1498. +      int x;
  1499. + {
  1500. +     if (scr_mode != BIOS && cur_y == y && cur_x == x)
  1501. +         return;
  1502. +     switch (scr_mode) {
  1503. +     case BIOS:
  1504. +         regs.h.dh = y;
  1505. +         regs.h.dl = x;
  1506. +         regs.h.bh = 0; /* Page; must be 0 for graphics */
  1507. +         bios10(2);
  1508. +         break;
  1509. +     case ANSI:
  1510. +         cprintf(A_CUP, y+1, x+1);
  1511. +         break;
  1512. +     }
  1513. +     cur_y = y;
  1514. +     cur_x = x;
  1515. + }
  1516. + Hidden Procedure standout()
  1517. + {
  1518. +     so_mode = On;
  1519. +     switch (scr_mode) {
  1520. +     case BIOS:
  1521. +         video_attr = V_STANDOUT;
  1522. +         break;
  1523. +     case ANSI:
  1524. +         cputs(A_SGR7);
  1525. +         break;
  1526. +     }
  1527. + }
  1528. + Hidden Procedure standend()
  1529. + {
  1530. +     so_mode = Off;
  1531. +     switch (scr_mode) {
  1532. +     case BIOS:
  1533. +         video_attr = V_NORMAL;
  1534. +         break;
  1535. +     case ANSI:
  1536. +         cputs(A_SGR0);
  1537. +         break;
  1538. +     }
  1539. + }
  1540. + Hidden Procedure clear_lines(yfirst, ylast)
  1541. +      int yfirst;
  1542. +      int ylast;
  1543. + {
  1544. +     register int y;
  1545. +     if (scr_mode == BIOS) {
  1546. +         regs.h.al = 0;    /* scroll with al = 0 means blank window */
  1547. +         regs.h.ch = yfirst;
  1548. +         regs.h.cl = 0;
  1549. +         regs.h.dh = ylast;
  1550. +         regs.h.dl = cols-1;
  1551. +         regs.h.bh = V_NORMAL;
  1552. +         bios10(6);
  1553. +         for (y = yfirst; y <= ylast; y++)
  1554. +             lenline[y] = 0;
  1555. +         return;
  1556. +     }
  1557. +     /* scr_mode == ANSI */
  1558. +     if (yfirst == 0 && ylast == lines-1) {
  1559. +         if (so_mode == On)
  1560. +             standend();
  1561. +         move(0, 0);        /* since some ANSI'd don't move */
  1562. +         cputs(A_ED);
  1563. +         cur_y = cur_x = 0;
  1564. +         for (y = yfirst; y < ylast; y++)
  1565. +             lenline[y] = 0;
  1566. +         return;
  1567. +     }
  1568. +     for (y = yfirst; y <= ylast; y++) {
  1569. +         if (lenline[y] > 0) {
  1570. +             move(y, 0);
  1571. +             clr_to_eol();
  1572. +         }
  1573. +     }
  1574. + }
  1575. + Hidden Procedure clr_to_eol()
  1576. + {
  1577. +     if (so_mode == On)
  1578. +         standend();
  1579. +     switch (scr_mode) {
  1580. +     case BIOS:
  1581. +         regs.h.bh = 0;    /* page */
  1582. +         regs.x.cx = lenline[cur_y] - cur_x;
  1583. +         regs.h.al = ' ';
  1584. +         regs.h.bl = V_NORMAL;
  1585. +         bios10(9);
  1586. +         break;
  1587. +     case ANSI:
  1588. +         cputs(A_EL);
  1589. +         break;
  1590. +     }
  1591. +     lenline[cur_y] = cur_x;
  1592. + }
  1593. + /* scrolling for BIOS */
  1594. + Hidden Procedure biosscrollup(yfirst, ylast, by)
  1595. +      int yfirst;
  1596. +      int ylast;
  1597. +      int by;
  1598. + {
  1599. +     regs.h.al = (by < 0 ? -by : by);
  1600. +     regs.h.ch = yfirst;
  1601. +     regs.h.cl = 0;
  1602. +     regs.h.dh = ylast;
  1603. +     regs.h.dl = cols-1;
  1604. +     regs.h.bh= V_NORMAL;
  1605. +     bios10(by < 0 ? 7 : 6);
  1606. +     cur_y = cur_x = Undefined;
  1607. +     if (by > 0)
  1608. +         scr_lines(yfirst, ylast, by, 1);
  1609. +     else
  1610. +         scr_lines(ylast, yfirst, -by, -1);
  1611. + }
  1612. + /* Reset internal administration accordingly */
  1613. + Hidden Procedure scr_lines(yfrom, yto, n, dy)
  1614. +      int yfrom;
  1615. +      int yto;
  1616. +      int n;
  1617. +      int dy;
  1618. + {
  1619. +     register int y, x;
  1620. +     char *savedata;
  1621. +     char *savemode;
  1622. +     while (n-- > 0) {
  1623. +         savedata = linedata[yfrom];
  1624. +         savemode= linemode[yfrom];
  1625. +         for (y = yfrom; y != yto; y += dy) {
  1626. +             linedata[y] = linedata[y+dy];
  1627. +             linemode[y] = linemode[y+dy];
  1628. +             lenline[y] = lenline[y+dy];
  1629. +         }
  1630. +         linedata[yto] = savedata;
  1631. +         linemode[yto] = savemode;
  1632. +         for (x = 0; x < cols; x++ ) {
  1633. +             linedata[yto][x] = ' ';
  1634. +             linemode[yto][x] = PLAIN;
  1635. +         }
  1636. +         lenline[yto] = 0;
  1637. +     }
  1638. + }
  1639. + Hidden Procedure lf_scroll(yto, by)
  1640. +      int yto;
  1641. +      int by;
  1642. + {
  1643. +     register int n = by;
  1644. +     move(lines-1, 0);
  1645. +     while (n-- > 0) {
  1646. +         putch('\n');
  1647. +     }
  1648. +     scr_lines(0, lines-1, by, 1);
  1649. +     move_lines(lines-1-by, lines-1, lines-1-yto, -1);
  1650. +     clear_lines(yto-by+1, yto);
  1651. + }
  1652. + /* for dumb scrolling, uses and updates internal administration */
  1653. + Hidden Procedure move_lines(yfrom, yto, n, dy)
  1654. +      int yfrom;
  1655. +      int yto;
  1656. +      int n;
  1657. +      int dy;
  1658. + {
  1659. +     while (n-- > 0) {
  1660. +         put_line(yto, 0, linedata[yfrom], linemode[yfrom], lenline[yfrom]);
  1661. +         yfrom += dy;
  1662. +         yto += dy;
  1663. +     }
  1664. + }
  1665. + Hidden Procedure ring_bell()
  1666. + {
  1667. +     switch (scr_mode) {
  1668. +     case BIOS:
  1669. +         regs.h.al = '\007';
  1670. +         regs.h.bl = V_NORMAL;
  1671. +         bios10(14);
  1672. +         break;
  1673. +     case ANSI:
  1674. +         putch('\007');
  1675. +         break;
  1676. +     }
  1677. + }
  1678. + /*
  1679. +  * Show the current internal statuses of the screen on vtrmfp.
  1680. +  * For debugging only.
  1681. +  */
  1682. + #ifdef SHOW
  1683. + Visible Procedure trmshow(s)
  1684. +      char *s;
  1685. + {
  1686. +     int y, x;
  1687. +     if (!vtrmfp)
  1688. +         return;
  1689. +     fprintf(vtrmfp, "<<< %s >>>\n", s);
  1690. +     for (y = 0; y < lines; y++) {
  1691. +         for (x = 0; x <= lenline[y] /*** && x < cols ***/ ; x++) {
  1692. +             fputc(linedata[y][x], vtrmfp);
  1693. +         }
  1694. +         fputc('\n', vtrmfp);
  1695. +         for (x = 0; x <= lenline[y] && x < cols-1; x++) {
  1696. +             if (linemode[y][x] == STANDOUT)
  1697. +                 fputc('-', vtrmfp);
  1698. +             else
  1699. +                 fputc(' ', vtrmfp);
  1700. +         }
  1701. +         fputc('\n', vtrmfp);
  1702. +     }
  1703. +     fprintf(vtrmfp, "CUR_Y = %d, CUR_X = %d.\n", cur_y, cur_x);
  1704. +     fflush(vtrmfp);
  1705. + }
  1706. + #endif
  1707. + /*
  1708. +  * Interrupt handling.
  1709. +  *
  1710. +  * (This has not properly been tested, nor is it clear that
  1711. +  * this interface is what we want.  Anyway, it's here for you
  1712. +  * to experiment with.  What does it do, you may ask?
  1713. +  * Assume an interactive program which reads its characters
  1714. +  * through trminput.  Assume ^C is the interrupt character.
  1715. +  * Normally, ^C is treated just like any other character: when
  1716. +  * typed, it turns up in the input.  The program may understand
  1717. +  * input ^C as "quit from the current mode".
  1718. +  * Occasionally, the program goes into a long period of computation.
  1719. +  * Now it would be uninterruptible, except if it calls a routine,
  1720. +  * say pollinterrupt(), at times in its computational loop;
  1721. +  * pollinterrupt() magically looks ahead in the input queue, 
  1722. +  * via trmavail() and trminput(), and if it sees a ^C, discards all input
  1723. +  * before that point and returns Yes.  It also sets a flag, so that
  1724. +  * the interupt "sticks around" until either trminput or trmavail
  1725. +  * is called.  It is undefined whether typing ^C several times in
  1726. +  * a row is seen as one interrupt, or an interrupt followed by input
  1727. +  * of ^C's.  A program should be prepared for either.)
  1728. +  */
  1729. + #ifdef NOT_USED
  1730. + extern bool intrflag;
  1731. + bool trminterrupt()
  1732. + {
  1733. +     /* Force a check for ^C which will call handler. */
  1734. +     /* (This does a ^C check even if stdin is in RAW mode. */
  1735. +     (void) kbhit();
  1736. +     return intrflag;
  1737. + }
  1738. + #endif /* NOT_USED */
  1739. + /* Definitions for DOS function calls. */
  1740. + #define IOCTL        0x44
  1741. + #define IOCTL_GETDATA    0x4400
  1742. + #define IOCTL_SETDATA    0x4401
  1743. + #define DEVICEBIT    0x80
  1744. + #define RAWBIT        0x20
  1745. + #define BREAKCK        0x33
  1746. + #define GET        0x00
  1747. + #define SET        0x01
  1748. + #define IOCTL_GETSTS    0x4406
  1749. + /*
  1750. +  * Terminal input without echo.
  1751. +  */
  1752. + Visible int trminput()
  1753. + {
  1754. +     char c;
  1755. + #ifdef NOT_USED
  1756. +     intrflag= No;
  1757. + #endif
  1758. +     /* Assume stdin is in RAW mode; this turns echo and ^C checks off. */
  1759. +     if (read(STDIN_HANDLE, &c, 1) < 1)
  1760. +         return -1;
  1761. +     else
  1762. +         return c;
  1763. + }
  1764. + /*
  1765. +  * Check for character available.
  1766. +  *
  1767. +  */
  1768. + Visible bool trmavail()
  1769. + {
  1770. + #ifdef NOT_USED
  1771. +     intrflag= No;
  1772. + #endif
  1773. +     regs.x.ax = IOCTL_GETSTS;
  1774. +     regs.x.bx = STDIN_HANDLE;
  1775. +     intdos(®s, ®s);
  1776. +     if (regs.x.cflag)
  1777. +         return -1; /* Error */
  1778. +     return regs.h.al != 0;
  1779. + }
  1780. + /* Issue an IOCTL to turn RAW for a device on or off. */
  1781. + Hidden Procedure setraw(handle, raw)
  1782. +      int handle;
  1783. +      bool raw;
  1784. + {
  1785. +     regs.x.ax = IOCTL_GETDATA;
  1786. +     regs.x.bx = handle;
  1787. +     intdos(®s, ®s);
  1788. +     if (regs.x.cflag || !(regs.h.dl & DEVICEBIT))
  1789. +         return; /* Error or not a device -- ignore it */
  1790. +     regs.h.dh = 0;
  1791. +     if (raw)
  1792. +         regs.h.dl |= RAWBIT;
  1793. +     else
  1794. +         regs.h.dl &= ~RAWBIT;
  1795. +     regs.x.ax = IOCTL_SETDATA;
  1796. +     intdos(®s, ®s);
  1797. +     /* Ignore errors */
  1798. + }
  1799. + /* Get the raw bit of a device. */
  1800. + Hidden int getraw(handle)
  1801. +      int handle;
  1802. + {
  1803. +     regs.x.ax = IOCTL_GETDATA;
  1804. +     regs.x.bx = handle;
  1805. +     intdos(®s, ®s);
  1806. +     return !regs.x.cflag &&
  1807. +         (regs.h.dh & (DEVICEBIT|RAWBIT)) == (DEVICEBIT|RAWBIT);
  1808. + }
  1809. + /* Set the break status. */
  1810. + Hidden Procedure setbreak(on)
  1811. +      bool on;
  1812. + {
  1813. +     bdos(BREAKCK, on, SET);
  1814. + }
  1815. + /* Get the break status. */
  1816. + Hidden int getbreak()
  1817. + {
  1818. +     regs.x.ax = (BREAKCK << 8) | GET;
  1819. +     intdos(®s, ®s);
  1820. +     return regs.h.dl;
  1821. + }
  1822. + Visible int trmsuspend()
  1823. + {
  1824. +     return spawnlp(P_WAIT, "COMMAND.COM", NULL) == 0;
  1825. + }
  1826. *** /dev/null    Fri Jun  7 14:31:40 1991
  1827. --- stdwin/Ports/vtrm/os.h    Tue May 14 13:45:59 1991
  1828. ***************
  1829. *** 0 ****
  1830. --- 1,33 ----
  1831. + /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1991. */
  1832. + /* Auto-configuration file for vtrm.
  1833. +    Edit this if you have portability problems. */
  1834. + #include <stdio.h>
  1835. + #include <ctype.h>
  1836. + #include <string.h>        /* Or <strings.h> for 4.2 BSD */
  1837. + /* is this a termio system ? */
  1838. + #ifdef SYSV
  1839. + #define HAS_TERMIO
  1840. + #endif
  1841. + /* 4.2 BSD select() system call available ? */
  1842. + #ifndef SYSV
  1843. + #define HAS_SELECT
  1844. + #endif
  1845. + /* can #include <signal.h> ? */
  1846. + #define SIGNAL
  1847. + #ifdef SIGNAL
  1848. + #define SIGTYPE void
  1849. + /* type returned by signal handler function: (used to be int) */
  1850. + #endif
  1851. + /* can #include <setjmp.h> ? */
  1852. + #define SETJMP
  1853. + /* VOID is used in casts only, for quieter lint */
  1854. + /* make it empty if your compiler doesn't have void */
  1855. + #define VOID (void)
  1856. *** 0.9.5/Ports/x11/dialog.c    Thu Oct 18 13:58:40 1990
  1857. --- stdwin/Ports/x11/dialog.c    Wed Apr  3 22:10:08 1991
  1858. ***************
  1859. *** 3,8 ****
  1860. --- 3,16 ----
  1861.   #include "x11.h"
  1862.   #include "llevent.h"
  1863.   
  1864. + /* Forward static function declarations */
  1865. + static int dialog _ARGS((char *, char *, int, int, int));
  1866. + static void addbutton _ARGS((int, char *, int, bool, int, int, int, int));
  1867. + static int dialogeventloop _ARGS((int));
  1868. + static int charcode _ARGS((XKeyEvent *));
  1869. + static bool addchar _ARGS((int));
  1870.   /* The kinds of dialogs we know */
  1871.   
  1872.   #define MESSAGEKIND    0
  1873. ***************
  1874. *** 76,81 ****
  1875. --- 84,97 ----
  1876.   static int promptwidth;
  1877.   static int buttonwidth;
  1878.   
  1879. + /* Forward static function declarations */
  1880. + static bool buttonevent _ARGS((struct button *, XEvent *));
  1881. + static void drawbutton _ARGS((struct button *));
  1882. + static void hilitebutton _ARGS((struct button *, bool));
  1883. + static void gettext _ARGS((char *, int));
  1884. + static void killbuttons _ARGS((void));
  1885.   /* Dialog routine.
  1886.      Create the window and subwindows, then engage in interaction.
  1887.      Return the proper return value for waskync or waskstr.
  1888. ***************
  1889. *** 191,200 ****
  1890.       
  1891.       /* Create the box window and its GC */
  1892.       
  1893. !     fg= _wgetpixel("menuForeground", "Foreground",
  1894. !                         BlackPixelOfScreen(_ws));
  1895. !     bg= _wgetpixel("menuBackground", "Background",
  1896. !                         WhitePixelOfScreen(_ws));
  1897.       box.border= 2*IBORDER;
  1898.       (void) _wcreate(&box, RootWindowOfScreen(_ws), 0, FALSE, fg, bg);
  1899.       _wsaveunder(&box, True);
  1900. --- 207,214 ----
  1901.       
  1902.       /* Create the box window and its GC */
  1903.       
  1904. !     fg = _wgetpixel("menuForeground", "MenuForeground", _w_fgcolor);
  1905. !     bg = _wgetpixel("menuBackground", "MenuBackground", _w_bgcolor);
  1906.       box.border= 2*IBORDER;
  1907.       (void) _wcreate(&box, RootWindowOfScreen(_ws), 0, FALSE, fg, bg);
  1908.       _wsaveunder(&box, True);
  1909. ***************
  1910. *** 201,206 ****
  1911. --- 215,221 ----
  1912.       XSelectInput(_wd, box.wid,
  1913.           ExposureMask|KeyPressMask|StructureNotifyMask);
  1914.       b_gc= _wgcreate(box.wid, _wf->fid, fg, bg);
  1915. +     XSetPlaneMask(_wd, b_gc, fg ^ bg);
  1916.       
  1917.       /* Keep window managers happy:
  1918.          a name for WM's that insist on displaying a window title;
  1919. ***************
  1920. *** 330,336 ****
  1921.   
  1922.   /* Add a command button */
  1923.   
  1924. ! static
  1925.   addbutton(type, text, ret, def, x, y, width, height)
  1926.       int type;
  1927.       char *text;
  1928. --- 345,351 ----
  1929.   
  1930.   /* Add a command button */
  1931.   
  1932. ! static void
  1933.   addbutton(type, text, ret, def, x, y, width, height)
  1934.       int type;
  1935.       char *text;
  1936. ***************
  1937. *** 559,565 ****
  1938.   
  1939.   /* Draw procedure to draw a command button or text item */
  1940.   
  1941. ! static
  1942.   drawbutton(bp)
  1943.       struct button *bp;
  1944.   {
  1945. --- 574,580 ----
  1946.   
  1947.   /* Draw procedure to draw a command button or text item */
  1948.   
  1949. ! static void
  1950.   drawbutton(bp)
  1951.       struct button *bp;
  1952.   {
  1953. ***************
  1954. *** 590,596 ****
  1955.   
  1956.   /* Highlight or unhighlight a command button */
  1957.   
  1958. ! static
  1959.   hilitebutton(bp, hilite)
  1960.       struct button *bp;
  1961.       bool hilite;
  1962. --- 605,611 ----
  1963.   
  1964.   /* Highlight or unhighlight a command button */
  1965.   
  1966. ! static void
  1967.   hilitebutton(bp, hilite)
  1968.       struct button *bp;
  1969.       bool hilite;
  1970. ***************
  1971. *** 604,610 ****
  1972.   
  1973.   /* Extract the text from the text item */
  1974.   
  1975. ! static
  1976.   gettext(buf, len)
  1977.       char *buf;
  1978.       int len;
  1979. --- 619,625 ----
  1980.   
  1981.   /* Extract the text from the text item */
  1982.   
  1983. ! static void
  1984.   gettext(buf, len)
  1985.       char *buf;
  1986.       int len;
  1987. ***************
  1988. *** 619,625 ****
  1989.   
  1990.   /* Destroy all buttons and associated data structures */
  1991.   
  1992. ! static
  1993.   killbuttons()
  1994.   {
  1995.       int i;
  1996. --- 634,640 ----
  1997.   
  1998.   /* Destroy all buttons and associated data structures */
  1999.   
  2000. ! static void
  2001.   killbuttons()
  2002.   {
  2003.       int i;
  2004. *** 0.9.5/Ports/x11/draw.c    Thu Oct 18 13:58:40 1990
  2005. --- stdwin/Ports/x11/draw.c    Tue May 14 13:47:44 1991
  2006. ***************
  2007. *** 6,29 ****
  2008.   
  2009.   static Window wid;
  2010.   static GC gc;
  2011. ! static unsigned long fg, bg;
  2012.   
  2013. - /* Start using the given Window ID, GC, fg and bg.
  2014. -    (I had hoped to use this from the Dialog and Menu modules,
  2015. -    but this hope didn't come true.) */
  2016. - static void
  2017. - _wusewgc(awid, agc, afg, abg)
  2018. -     Window awid;
  2019. -     GC agc;
  2020. -     unsigned long afg, abg;
  2021. - {
  2022. -     wid= awid;
  2023. -     gc= agc;
  2024. -     fg= afg;
  2025. -     bg= abg;
  2026. - }
  2027.   /* Put the current font's ID in the current GC, if non-null.
  2028.      Called by _wfontswitch. */
  2029.   
  2030. --- 6,13 ----
  2031.   
  2032.   static Window wid;
  2033.   static GC gc;
  2034. ! COLOR _w_fgcolor, _w_bgcolor;
  2035.   
  2036.   /* Put the current font's ID in the current GC, if non-null.
  2037.      Called by _wfontswitch. */
  2038.   
  2039. ***************
  2040. *** 43,48 ****
  2041. --- 27,33 ----
  2042.      should occur. */
  2043.   
  2044.   static TEXTATTR saveattr;
  2045. + static COLOR savefgcolor, savebgcolor;
  2046.   
  2047.   void
  2048.   wbegindrawing(win)
  2049. ***************
  2050. *** 51,58 ****
  2051.       _wtrace(4, "wbegindrawing(win = 0x%lx)", (long)win);
  2052.       if (wid != 0)
  2053.           _werror("recursive wbegindrawing");
  2054. !     _wusewgc(win->wa.wid, win->gca, win->fga, win->bga);
  2055.       saveattr= wattr;
  2056.       wsettextattr(&win->attr);
  2057.       if (win->caretshown)
  2058.           _winvertcaret(win); /* Hide caret temporarily */
  2059. --- 36,50 ----
  2060.       _wtrace(4, "wbegindrawing(win = 0x%lx)", (long)win);
  2061.       if (wid != 0)
  2062.           _werror("recursive wbegindrawing");
  2063. !     savefgcolor = _w_fgcolor;
  2064. !     savebgcolor = _w_bgcolor;
  2065.       saveattr= wattr;
  2066. +     wid = win->wa.wid;
  2067. +     gc = win->gca;
  2068. +     _w_fgcolor = win->fga;
  2069. +     _w_bgcolor = win->bga;
  2070. +     XSetForeground(_wd, gc, (unsigned long) _w_fgcolor);
  2071. +     XSetBackground(_wd, gc, (unsigned long) _w_bgcolor);
  2072.       wsettextattr(&win->attr);
  2073.       if (win->caretshown)
  2074.           _winvertcaret(win); /* Hide caret temporarily */
  2075. ***************
  2076. *** 68,76 ****
  2077.       if (wid != win->wa.wid)
  2078.           _werror("wrong call to enddrawing");
  2079.       else {
  2080.           if (win->caretshown)
  2081.               _winvertcaret(win); /* Put it back on */
  2082. !         _wusewgc((Window)0, (GC)0, 0L, 0L); /* Clear all */
  2083.           wsettextattr(&saveattr);
  2084.           XFlush(_wd);
  2085.       }
  2086. --- 60,74 ----
  2087.       if (wid != win->wa.wid)
  2088.           _werror("wrong call to enddrawing");
  2089.       else {
  2090. +         wnoclip();
  2091.           if (win->caretshown)
  2092.               _winvertcaret(win); /* Put it back on */
  2093. !         _w_fgcolor = savefgcolor;
  2094. !         _w_bgcolor = savebgcolor;
  2095. !         XSetForeground(_wd, gc, (unsigned long) _w_fgcolor);
  2096. !         XSetBackground(_wd, gc, (unsigned long) _w_bgcolor);
  2097. !         wid = 0;
  2098. !         gc = 0;
  2099.           wsettextattr(&saveattr);
  2100.           XFlush(_wd);
  2101.       }
  2102. ***************
  2103. *** 230,237 ****
  2104. --- 228,237 ----
  2105.       _wtrace(7, "wxorline((h1,v1)=(%d,%d), (h2,v2)=(%d,%d))",
  2106.           h1, v1, h2, v2);
  2107.       XSetFunction(_wd, gc, GXinvert);
  2108. +     XSetPlaneMask(_wd, gc, _w_fgcolor ^ _w_bgcolor);
  2109.       XDrawLine(_wd, wid, gc, h1, v1, h2, v2);
  2110.       XSetFunction(_wd, gc, GXcopy);
  2111. +     XSetPlaneMask(_wd, gc, AllPlanes);
  2112.   }
  2113.   
  2114.   /* Draw a rectangle *inside* the given coordinate box */
  2115. ***************
  2116. *** 259,267 ****
  2117.          Can't set function to GXclear because it doesn't work
  2118.          with color.  So we fill with the background color. */
  2119.       
  2120. !     XSetForeground(_wd, gc, bg);
  2121.       XFillRectangle(_wd, wid, gc, left, top, right-left, bottom-top);
  2122. !     XSetForeground(_wd, gc, fg);
  2123.   }
  2124.   
  2125.   /* Invert the bits in the given rectangle.
  2126. --- 259,267 ----
  2127.          Can't set function to GXclear because it doesn't work
  2128.          with color.  So we fill with the background color. */
  2129.       
  2130. !     XSetForeground(_wd, gc, (unsigned long) _w_bgcolor);
  2131.       XFillRectangle(_wd, wid, gc, left, top, right-left, bottom-top);
  2132. !     XSetForeground(_wd, gc, (unsigned long) _w_fgcolor);
  2133.   }
  2134.   
  2135.   /* Invert the bits in the given rectangle.
  2136. ***************
  2137. *** 275,282 ****
  2138.       
  2139.       if (left >= right || top >= bottom)
  2140.           return;
  2141. !     
  2142.       _winvert(wid, gc, left, top, right-left, bottom-top);
  2143.   }
  2144.   
  2145.   /* Paint a given rectangle black */
  2146. --- 275,287 ----
  2147.       
  2148.       if (left >= right || top >= bottom)
  2149.           return;
  2150. !     /* _winvert assumes the plane mask is the XOR of fg and bg color;
  2151. !        this is no longer standard now we support colors... */
  2152. !     XSetPlaneMask(_wd, gc, _w_fgcolor ^ _w_bgcolor);
  2153.       _winvert(wid, gc, left, top, right-left, bottom-top);
  2154. +     XSetPlaneMask(_wd, gc, AllPlanes);
  2155.   }
  2156.   
  2157.   /* Paint a given rectangle black */
  2158. ***************
  2159. *** 318,327 ****
  2160.       int radius;
  2161.   {
  2162.       _wtrace(7, "wdrawcircle(h=%d, v=%d, radius=%d)", h, v, radius);
  2163. !     XDrawArc(_wd, wid, gc, h-radius, v-radius, 2*radius, 2*radius,
  2164.           0, 360*64);
  2165.   }
  2166.   
  2167.   /* Draw an elliptical arc.
  2168.      The begin and end angles are specified in degrees (I'm not sure this
  2169.      is a good idea, but I don't like X's degrees*64 either...).
  2170. --- 323,360 ----
  2171.       int radius;
  2172.   {
  2173.       _wtrace(7, "wdrawcircle(h=%d, v=%d, radius=%d)", h, v, radius);
  2174. !     XDrawArc(_wd, wid, gc, h-radius, v-radius, 2*radius-1, 2*radius-1,
  2175.           0, 360*64);
  2176.   }
  2177.   
  2178. + /* Fill a circle with given center and radius */
  2179. + void
  2180. + wfillcircle(h, v, radius)
  2181. +     int h, v;
  2182. +     int radius;
  2183. + {
  2184. +     _wtrace(7, "wfillcircle(h=%d, v=%d, radius=%d)", h, v, radius);
  2185. +     XFillArc(_wd, wid, gc, h-radius, v-radius, 2*radius-1, 2*radius-1,
  2186. +         0, 360*64);
  2187. + }
  2188. + /* Invert a circle with given center and radius */
  2189. + void
  2190. + wxorcircle(h, v, radius)
  2191. +     int h, v;
  2192. +     int radius;
  2193. + {
  2194. +     _wtrace(7, "wfillcircle(h=%d, v=%d, radius=%d)", h, v, radius);
  2195. +     XSetFunction(_wd, gc, GXinvert);
  2196. +     XSetPlaneMask(_wd, gc, _w_fgcolor ^ _w_bgcolor);
  2197. +     XFillArc(_wd, wid, gc, h-radius, v-radius, 2*radius-1, 2*radius-1,
  2198. +         0, 360*64);
  2199. +     XSetFunction(_wd, gc, GXcopy);
  2200. +     XSetPlaneMask(_wd, gc, AllPlanes);
  2201. + }
  2202.   /* Draw an elliptical arc.
  2203.      The begin and end angles are specified in degrees (I'm not sure this
  2204.      is a good idea, but I don't like X's degrees*64 either...).
  2205. ***************
  2206. *** 336,345 ****
  2207.   {
  2208.       _wtrace(7, "wdrawelarc(%d, %d, %d, %d, %d, %d)",
  2209.           h, v, hhalf, vhalf, angle1, angle2);
  2210. !     XDrawArc(_wd, wid, gc, h-hhalf, v-vhalf, 2*hhalf, 2*vhalf,
  2211.           angle1*64, angle2*64);
  2212.   }
  2213.   
  2214.   /* Clip drawing output to a rectangle. */
  2215.   
  2216.   void
  2217. --- 369,449 ----
  2218.   {
  2219.       _wtrace(7, "wdrawelarc(%d, %d, %d, %d, %d, %d)",
  2220.           h, v, hhalf, vhalf, angle1, angle2);
  2221. !     XDrawArc(_wd, wid, gc, h-hhalf, v-vhalf, 2*hhalf-1, 2*vhalf-1,
  2222.           angle1*64, angle2*64);
  2223.   }
  2224.   
  2225. + /* Fill an elliptical arc segment */
  2226. + void
  2227. + wfillelarc(h, v, hhalf, vhalf, angle1, angle2)
  2228. +     int h, v;        /* Center */
  2229. +     int hhalf, vhalf;    /* Half axes */
  2230. +     int angle1, angle2;    /* Begin, end angle */
  2231. + {
  2232. +     _wtrace(7, "wfillelarc(%d, %d, %d, %d, %d, %d)",
  2233. +         h, v, hhalf, vhalf, angle1, angle2);
  2234. +     XFillArc(_wd, wid, gc, h-hhalf, v-vhalf, 2*hhalf-1, 2*vhalf-1,
  2235. +         angle1*64, angle2*64);
  2236. + }
  2237. + /* Invert an elliptical arc segment */
  2238. + void
  2239. + wxorelarc(h, v, hhalf, vhalf, angle1, angle2)
  2240. +     int h, v;        /* Center */
  2241. +     int hhalf, vhalf;    /* Half axes */
  2242. +     int angle1, angle2;    /* Begin, end angle */
  2243. + {
  2244. +     _wtrace(7, "wfillelarc(%d, %d, %d, %d, %d, %d)",
  2245. +         h, v, hhalf, vhalf, angle1, angle2);
  2246. +     XSetFunction(_wd, gc, GXinvert);
  2247. +     XSetPlaneMask(_wd, gc, _w_fgcolor ^ _w_bgcolor);
  2248. +     XFillArc(_wd, wid, gc, h-hhalf, v-vhalf, 2*hhalf-1, 2*vhalf-1,
  2249. +         angle1*64, angle2*64);
  2250. +     XSetFunction(_wd, gc, GXcopy);
  2251. +     XSetPlaneMask(_wd, gc, AllPlanes);
  2252. + }
  2253. + /* Draw n-1 lines connecting n points */
  2254. + void
  2255. + wdrawpoly(n, points)
  2256. +     int n;
  2257. +     POINT *points;
  2258. + {
  2259. +     _wtrace(7, "wdrawpoly(%d, ...)", n);
  2260. +     XDrawLines(_wd, wid, gc, (XPoint *)points, n, CoordModeOrigin);
  2261. + }
  2262. + /* Fill a polygon given by n points (may be self-intersecting) */
  2263. + void
  2264. + wfillpoly(n, points)
  2265. +     int n;
  2266. +     POINT *points;
  2267. + {
  2268. +     _wtrace(7, "wfillpoly(%d, ...)", n);
  2269. +     XFillPolygon(_wd, wid, gc, (XPoint *)points, n,
  2270. +              Complex, CoordModeOrigin);
  2271. + }
  2272. + /* Invert a polygon given by n points (may be self-intersecting) */
  2273. + void
  2274. + wxorpoly(n, points)
  2275. +     int n;
  2276. +     POINT *points;
  2277. + {
  2278. +     _wtrace(7, "wfillpoly(%d, ...)", n);
  2279. +     XSetFunction(_wd, gc, GXinvert);
  2280. +     XSetPlaneMask(_wd, gc, _w_fgcolor ^ _w_bgcolor);
  2281. +     XFillPolygon(_wd, wid, gc, (XPoint *)points, n,
  2282. +              Complex, CoordModeOrigin);
  2283. +     XSetFunction(_wd, gc, GXcopy);
  2284. +     XSetPlaneMask(_wd, gc, AllPlanes);
  2285. + }
  2286.   /* Clip drawing output to a rectangle. */
  2287.   
  2288.   void
  2289. ***************
  2290. *** 362,365 ****
  2291. --- 466,518 ----
  2292.   wnoclip()
  2293.   {
  2294.       XSetClipMask(_wd, gc, None);
  2295. + }
  2296. + /* Color stuff. */
  2297. + void
  2298. + _w_initcolors()
  2299. + {
  2300. +     _w_fgcolor = _wgetpixel("foreground", "Foreground",
  2301. +                         BlackPixelOfScreen(_ws));
  2302. +     _w_bgcolor = _wgetpixel("background", "Background",
  2303. +                         WhitePixelOfScreen(_ws));
  2304. +     
  2305. +     /* Swap the pixel values if 'reverse' specified */
  2306. +     if (_wgetbool("reverse", "Reverse", 0)) {
  2307. +         unsigned long temp= _w_fgcolor;
  2308. +         _w_fgcolor = _w_bgcolor;
  2309. +         _w_bgcolor = temp;
  2310. +     }
  2311. + }
  2312. + COLOR
  2313. + wgetfgcolor()
  2314. + {
  2315. +     return _w_fgcolor;
  2316. + }
  2317. + COLOR
  2318. + wgetbgcolor()
  2319. + {
  2320. +     return _w_bgcolor;
  2321. + }
  2322. + void
  2323. + wsetfgcolor(color)
  2324. +     COLOR color;
  2325. + {
  2326. +     _w_fgcolor = color;
  2327. +     if (gc != 0)
  2328. +         XSetForeground(_wd, gc, (unsigned long) _w_fgcolor);
  2329. + }
  2330. + void
  2331. + wsetbgcolor(color)
  2332. +     COLOR color;
  2333. + {
  2334. +     _w_bgcolor = color;
  2335. +     if (gc != 0)
  2336. +         XSetBackground(_wd, gc, (unsigned long) _w_bgcolor);
  2337.   }
  2338.