home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / useful / util / edit / mg / src.lzh / amiga / ttyio.c < prev    next >
C/C++ Source or Header  |  1990-05-23  |  29KB  |  1,218 lines

  1. /*
  2.  * Name:    MG 2a Amiga terminal window I/O, with all kinds o' trimmings.
  3.  * This module is 'way too big. Last Edit:    01-Dec-87
  4.  * mic@emx.cc.utexas.edu Created:    21-Apr-86 mic@emx.cc.utexas.edu
  5.  */
  6.  
  7. #undef    MANX
  8. #undef    LATTICE
  9. #include "rexx.h"
  10. #include "no_dir.h"
  11. #include "compiler.h"
  12. #include "change_font.h"
  13. #include "v11.h"
  14. #include "mouse.h"
  15. #include "no_metakey.h"
  16. #include "promptwait.h"
  17. #include "nrow.h"
  18. #include "ncol.h"
  19. #include "init_cols.h"
  20. #include "init_rows.h"
  21. #include "do_menu.h"
  22. #ifndef    NO_METAKEY
  23. #include "metabit.h"
  24. #endif
  25. #include "use_arp.h"
  26. #ifdef    USE_ARP
  27. #include <arpfunctions.h>
  28. #endif
  29.  
  30. /*
  31.  * Lots of includes.
  32.  */
  33.  
  34. #include <exec/types.h>
  35. #include <exec/nodes.h>
  36. #include <exec/lists.h>
  37. #include <exec/tasks.h>
  38. #include <exec/ports.h>
  39. #include <exec/io.h>
  40. #include <devices/console.h>
  41. #include <devices/inputevent.h>
  42. #include <libraries/dos.h>
  43. #include <libraries/dosextens.h>
  44. #include <graphics/clip.h>
  45. #include <graphics/view.h>
  46. #include <graphics/rastport.h>
  47. #include <graphics/layers.h>
  48. #include <graphics/text.h>
  49. #include <graphics/gfxbase.h>
  50. #include <intuition/intuition.h>
  51. #include <intuition/intuitionbase.h>
  52.  
  53. #undef TRUE
  54. #undef FALSE
  55. #include "def.h"        /* includes sysdef.h and ttydef.h     */
  56. #include "window.h"
  57.  
  58. #ifdef    REXX
  59. #include "key.h"
  60. #endif
  61.  
  62. #ifdef    CHANGE_FONT
  63. #include <libraries/diskfont.h>
  64. #endif
  65.  
  66. #ifdef LATTICE
  67. #ifdef    CHANGE_FONT
  68. #include <proto/diskfont.h>
  69. #endif
  70. #include <proto/exec.h>
  71. #include <proto/dos.h>
  72. #include <proto/graphics.h>
  73. #include <proto/intuition.h>
  74. #include <proto/console.h>
  75. #else
  76. #include <functions.h>
  77. #endif
  78.  
  79. #ifdef    ANSI
  80. #include <string.h>
  81. #include <stdlib.h>
  82. #endif
  83.  
  84. #ifdef USE_ARP
  85. struct ArpBase *ArpBase;
  86. #endif
  87. struct IntuitionBase *IntuitionBase;
  88. struct GfxBase *GfxBase;
  89.  
  90. #ifndef    NO_DIR
  91. extern struct Task *FindTask();
  92. static BPTR     StartLock;
  93. char            WindowTitle[MAXPATH + 20], *MyDirName;
  94. #ifndef MANX
  95. extern BPTR     DupLock(), CurrentDir();
  96. #endif
  97. #endif                /* NO_DIR */
  98. #ifdef    DO_MENU
  99. extern struct Menu *InitEmacsMenu();
  100. #endif
  101.  
  102. #ifndef    LATTICE
  103. extern int      Enable_Abort;    /* Do NOT allow abort!         */
  104. #endif
  105.  
  106. /*
  107.  * External MG functions and variables
  108.  */
  109. extern char     version[];    /* Version information         */
  110. extern int      ttrow;        /* Current cursor row         */
  111. extern int      use_metakey;    /* Do meta characters?         */
  112.  
  113. /*
  114.  * My own, internal functions
  115.  */
  116. static VOID amigaclean PROTO((void));
  117. static void setmaxima PROTO((void));
  118. static struct Screen *wbscreen PROTO((void));
  119. static void ttreopen PROTO((int resize));
  120. static int handle_kbd PROTO((int timeout));
  121. static int dispatch PROTO((struct IntuiMessage * msg));
  122. static int nextkey PROTO((void));
  123. static void qkey PROTO((short k));
  124. #ifdef    MOUSE
  125. static void qmouse PROTO((short x, short y, unsigned short qual));
  126. #endif
  127. #ifdef    DO_MENU
  128. static void qmenu PROTO((unsigned short code));
  129. #endif
  130.  
  131. #ifdef MANX
  132. /* these are in localproto.h, but this is not included for MANX3.6 */
  133. VOID    ttclose();
  134. VOID    setttysize();
  135. VOID    syscleanup();
  136. VOID    ttflush();
  137. VOID    panic();
  138. #endif
  139. /*
  140.  * Library bases (used by glue libraries)
  141.  */
  142.  
  143. #ifndef    LATTICE
  144. #ifdef    CHANGE_FONT
  145. struct DiskFontBase * DiskfontBase;
  146. #endif
  147. #endif
  148.  
  149. /*
  150.  * Intuition window and menu variables.  MG gets used a lot, because it gets
  151.  * reconfigured on the fly for the amiga-set-font and toggle-border
  152.  * operations.
  153.  */
  154.  
  155. #define WINDOWGADGETS (WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE)
  156. #define WINDOWFLAGS    (WINDOWGADGETS | ACTIVATE)
  157.  
  158. struct NewWindow MG = {
  159.     0, 0,            /* start position            */
  160.     0, 0,            /* width, height (set by ttopen) */
  161.     0, 1,            /* detail pen, block pen     */
  162. #ifdef    DO_MENU
  163.     MENUPICK |        /* If menu is used         */
  164. #endif
  165. #ifdef    MOUSE
  166.     MOUSEBUTTONS |        /* If mouse is used         */
  167. #endif
  168.     INTUITICKS | RAWKEY |
  169.     CLOSEWINDOW | NEWSIZE,    /* IDCMP flags             */
  170.     0,            /* window flags    (set by ttopen)     */
  171.     NULL,            /* pointer to first user gadget */
  172.     NULL,            /* pointer to user checkmark     */
  173.     NULL,            /* title (filled in later)     */
  174.     NULL,            /* pointer to screen (none)     */
  175.     NULL,            /* pointer to superbitmap     */
  176.     220, 40,        /* minimum size    (small!)     */
  177.     0, 0,            /* maximum size (set by ttopen)     */
  178.     WBENCHSCREEN        /* screen in which to open     */
  179. };
  180.  
  181. static short    borderless = TRUE;    /* Flag for borderless window     */
  182. static short    toggle_zooms = TRUE;    /* Does toggling border zoom?     */
  183. static int      last_top, last_left, last_height, last_width;
  184.  
  185. struct Window  *EmW = NULL;    /* Our window             */
  186. struct Screen  *EmS = NULL;    /* Our screen (usually WB)     */
  187. short           toggling = FALSE;    /* Prevent menu wiping         */
  188. #ifndef    V11
  189. struct Screen   WBInfo;        /* Info about the WB screen     */
  190. #endif
  191. struct TextFont *EmFont = NULL;    /* Our font (usually TOPAZ_xx)     */
  192.  
  193. #ifdef    DO_MENU
  194. static struct Menu *EmacsMenu = NULL;    /* Our menu         */
  195. #endif
  196.  
  197. #if    0
  198. static ULONG    class;        /* Intuition event     */
  199. static USHORT   code,        /* information     */
  200.                 qualifier;
  201. static APTR     address;
  202. static SHORT    x, y;
  203. #endif    /* 0 */
  204. static LONG     intuitionMsgMask;/* Signal Mask         */
  205.  
  206. /* * * * * * * * * * * * * console I/O * * * * * * * * * * * * * * * * */
  207.  
  208. #define    CSI    0x9b        /* Command Sequence Introducer     */
  209. #define    NOBUF    512        /* About 1/4 screen         */
  210. #define    NIBUF    256        /* Input buffer             */
  211.  
  212. static KCHAR    ibuf[NIBUF];    /* keyboard input buffer     */
  213. static int      ibufo, nibuf;    /* head, # of bytes in ibuf     */
  214.  
  215. static LONG     tickcount;    /* # intuiticks    since last char     */
  216.  
  217. static struct MsgPort *conWritePort = NULL;    /* I/O ports          */
  218. static struct IOStdReq *conWriteMsg = NULL;    /* I/O messages         */
  219. struct Library *ConsoleDevice;    /* used by RawKeyConvert */
  220. static unsigned char outbuf[NOBUF + 7];    /* output buffer     */
  221. static unsigned char *obuf;    /* first output char     */
  222. int             nobuf;        /* # of bytes in above     */
  223. int             nrow;        /* Terminal size, rows.     */
  224. int             ncol;        /* Terminal size, cols.     */
  225.  
  226. /* * * * * * * * * functions to open/reopen the window * * * * * * * * * */
  227.  
  228. /*
  229.  * Open up the virtual terminal MG communicates with. Set up the window,
  230.  * console, and menu strip.
  231.  */
  232.  
  233. ttopen()
  234. {
  235.  
  236. #ifndef    LATTICE
  237.     Enable_Abort = 0;    /* Disable ^C     */
  238. #endif
  239.  
  240.     /* Set the window size, set the flags and title, and open it */
  241.  
  242.     setmaxima();
  243.     MG.Flags = WINDOWFLAGS;
  244.     MG.Flags |= borderless ? BORDERLESS : WINDOWSIZING;
  245. #ifndef    NO_DIR
  246.     MG.Title = (UBYTE *) WindowTitle;
  247. #else
  248.     MG.Title = (UBYTE *) version;
  249. #endif
  250.  
  251.     if ((EmW = OpenWindow(&MG)) == NULL)
  252.         amigaclean();
  253.     SetFont(EmW->RPort, EmFont);
  254.  
  255.     /*
  256.      * Once the window is created, get the Intuition signal bit, set up
  257.      * the menu, and tell the virtual terminal how big it is.
  258.      */
  259.     setttysize();
  260.     intuitionMsgMask = 1L << EmW->UserPort->mp_SigBit;
  261. #ifdef    DO_MENU
  262.     if (toggling == FALSE)
  263.         EmacsMenu = InitEmacsMenu(EmW);
  264.     if (EmacsMenu == NULL)
  265.         amigaclean();
  266.     SetMenuStrip(EmW, EmacsMenu);
  267. #endif
  268.  
  269.     /*
  270.      * Attach a console device (purely for output now) to our window
  271.      */
  272.  
  273.     if ((conWritePort = CreatePort("Emacs.con.write", 0L)) == NULL)
  274.         amigaclean();
  275.     if ((conWriteMsg = CreateStdIO(conWritePort)) == NULL)
  276.         amigaclean();
  277.  
  278.     if (OpenConsole(conWriteMsg, NULL, EmW) != 0)
  279.         amigaclean();
  280.  
  281.     ConsoleDevice = (struct Library *) conWriteMsg->io_Device;
  282.     nibuf = ibufo = 0;
  283.  
  284.     return (0);
  285. }
  286.  
  287. /*
  288.  * Set up the initial state of the window.  Opens up libraries, decides how
  289.  * big the initial window should be, and whether it should be borderless.
  290.  */
  291.  
  292. VOID
  293. sysinit()
  294. {
  295. #ifndef    NO_DIR
  296.     long            len;
  297.     BPTR            MyDirLock;
  298. #endif
  299.  
  300.     GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0L);
  301.     if (GfxBase == NULL)    /* Graphics lib     */
  302.         amigaclean();
  303.  
  304.     IntuitionBase = (struct IntuitionBase *)    /* Intuition     */
  305.         OpenLibrary("intuition.library", 0L);
  306.     if (IntuitionBase == NULL)
  307.         amigaclean();
  308.  
  309. #ifdef USE_ARP
  310.     if (!(ArpBase = (struct ArpBase *) OpenLibrary("arp.library", 0L)))
  311.         panic("Compiled with USE_ARP, but arp.library not found");
  312. #endif
  313. #ifdef    REXX
  314.     openrexx();
  315. #endif
  316. #ifndef NO_DIR
  317.     /*
  318.      * The following attempt to be clever assigns the external StartLock
  319.      * to the lock on the current directory, then switches our CurrentDir
  320.      * to a duplicate of that lock so we can restore the original lock on
  321.      * exit.
  322.      */
  323.  
  324.     strcpy(WindowTitle, version);
  325.     strcat(WindowTitle, ": ");
  326.     MyDi