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

  1. /*
  2.  * Name:    MG 2a Commodore Amiga mouse handling Created:    Distant past
  3.  * Last edit:    28-Nov-87  mic@emx.cc.utexas.edu
  4.  */
  5.  
  6. #include "mouse.h"
  7.  
  8. #ifdef    MOUSE
  9.  
  10. #include <exec/types.h>
  11. #include <intuition/intuition.h>
  12.  
  13. #undef TRUE
  14. #undef FALSE
  15. #include "def.h"
  16. #include "line.h"
  17. #include "buffer.h"
  18. #include "window.h"
  19.  
  20.  
  21.  
  22. extern int      ttmouse();
  23. extern int      forwline();
  24. extern int      forwchar();
  25.  
  26. /* stuff for go-to-window-and-do-it functions */
  27. extern int      reposition();
  28. extern int      delfword();
  29. extern int      killline();
  30. extern int      forwdel();
  31. extern int      justone();
  32. extern int      killregion();
  33. extern int      yank();
  34. extern int      forwpage();
  35. extern int      backpage();
  36. extern int      splitwind();
  37. extern int      delwind();
  38. extern int      gotobob();
  39. extern int      gotoeob();
  40. extern int      enlargewind();
  41. extern int      shrinkwind();
  42.  
  43. #ifndef    NO_PROTO
  44. static int dottomouse PROTO((void));
  45. #endif
  46.  
  47. /*
  48.  * Handle the mouse click that's been passed by ttgetc() and position dot
  49.  * where the user pointed at.  If this is the same position where the user
  50.  * pointed the last time, set the mark, whether or not this is a true
  51.  * double-click. This isn't a true double-click, but it does most of what we
  52.  * want.
  53.  */
  54.  
  55. static USHORT   oldrow = HUGE, oldcol = HUGE;    /* last mouse click     */
  56. static USHORT   newrow, newcol;    /* next mouse click     */
  57.  
  58. amigamouse(f, n)
  59. {
  60.     if (!dottomouse())    /* sets newrow, newcol     */
  61.         return (FALSE);
  62.     if ((newrow == oldrow) && (newcol == oldcol))
  63.         setmark(FFRAND, 1);    /* double-click         */
  64.     oldrow = newrow;    /* save state         */
  65.     oldcol = newcol;
  66.     return (TRUE);
  67. }
  68.  
  69. /*
  70.  * Recenter on selected line
  71.  */
  72. mreposition(f, n)
  73. {
  74.     if (!dottomouse())
  75.         return (FALSE);
  76.     return (reposition(f, n));
  77. }
  78.  
  79. /*
  80.  * Delete word after selected char
  81.  */
  82. mdelfword(f, n)
  83. {
  84.     if (!dottomouse())
  85.         return (FALSE);
  86.     return (delfword(f, n));
  87. }
  88.  
  89. /*
  90.  * Move to selection, kill line
  91.  */
  92. mkillline(f, n)
  93. {
  94.     if (!dottomouse())
  95.         return (FALSE);
  96.     return (killline(f, n));
  97. }
  98.  
  99. /*
  100.  * Move to selection, kill word
  101.  */
  102. mforwdel(f, n)
  103. {
  104.     if (!dottomouse())
  105.         return (FALSE);
  106.     return (forwdel(f, n));
  107. }
  108.  
  109. /*
  110.  * Move to selection, kill line
  111.  */
  112. mdelwhite(f, n)
  113. {
  114.     if (!dottomouse())
  115.         return (FALSE);
  116.     return (justone(f, n));
  117. }
  118.  
  119. /*
  120.  * Set mark, move to selection, kill region.
  121.  */
  122. mkillregion(f, n)
  123. {
  124.     register struct line *p_old;
  125.     register short  o_old;
  126.  
  127.     p_old = curwp->w_markp;    /* Save old mark */
  128.     o_old = curwp->w_marko;
  129.     isetmark();        /* and set current one */
  130.     if (!dottomouse()) {
  131.         curwp->w_markp = p_old;    /* Oops - put mark back */
  132.         curwp->w_marko = o_old;
  133.         return (FALSE);
  134.     }
  135.     return (killregion(f, n));
  136. }
  137.  
  138. /*
  139.  * Move to selection, yank kill buffer
  140.  */
  141. myank(f, n)
  142. {
  143.     if (!dottomouse())
  144.         return (FALSE);
  145.     return (yank(f, n));
  146. }
  147.  
  148. /*
  149.  * Select window pointed to by mouse, then scroll down
  150.  */
  151.  
  152. mforwpage(f, n)
  153. {
  154.     if (!dottomouse())
  155.         return (FALSE);
  156.     return (forwpage(f, n));
  157. }
  158.  
  159. /*
  160.  * Select buffer, scroll page down
  161.  */
  162. mbackpage(f, n)
  163. {
  164.     if (!dottomouse())
  165.         return (FALSE);
  166.     return (backpage(f, n));
  167. }
  168.  
  169. /*
  170.  * Select the window, split it.
  171.  */
  172. msplitwind(f, n)
  173. {
  174.     if (!dottomouse())
  175.         return (FALSE);
  176.     return (splitwind(f, n));
  177. }
  178.  
  179. /*
  180.  * Select the buffer, delete it.
  181.  */
  182. mdelwind(f, n)
  183. {
  184.     if (!dottomouse())
  185.         return (FALSE);
  186.     return (delwind(f, n));
  187. }
  188.  
  189. /*
  190.  * Select window, goto beginning of buffer
  191.  */
  192. mgotobob(f, n)
  193. {
  194.     if (!dottomouse())
  195.         return (FALSE);
  196.     return (gotobob(f, n));
  197. }
  198.  
  199. /*
  200.  * Select window, go to end of buffer
  201.  */
  202. mgotoeob(f, n)
  203. {
  204.     if (!dottomouse())
  205.         return (FALSE);
  206.     return (gotoeob(f, n));
  207. }
  208.  
  209. /*
  210.  * Select window, enlarge it.
  211.  */
  212. menlargewind(f, n)
  213. {
  214.     if (!dottomouse())
  215.         return (FALSE);
  216.     return (enlargewind(f, n));
  217. }
  218.  
  219. /*
  220.  * Select window, shrink it.
  221.  */
  222. mshrinkwind(f, n)
  223. {
  224.     if (!dottomouse())
  225.         return (FALSE);
  226.     return (shrinkwind(f, n));
  227. }
  228.  
  229. /*
  230.  * Utility routine to move dot to where the user clicked.  If in mode line,
  231.  * chooses that buffer as the one to work on.
  232.  */
  233. static 
  234. dottomouse()
  235. {
  236.     register struct window *wp;
  237.     register int    dot;
  238.     register int    col;
  239.     register int    c;
  240.     int             getkey();
  241.  
  242.  
  243.     /*
  244.      * read the next 2 characters to get the col, row info, using
  245.      * getkey() to record them (or re-read them if in a macro).
  246.      */
  247.     newcol = getkey(DISSCR) - M_X_ZERO;
  248.     newrow = getkey(DISSCR) - M_Y_ZERO;
  249.  
  250.     /* find out which window was clicked in                 */
  251.     for (wp = wheadp; wp != NULL; wp = wp->w_wndp)
  252.         if ((newrow >= wp->w_toprow) &&
  253.             (newrow <= (wp->w_toprow + wp->w_ntrows)))
  254.             break;
  255.  
  256.     if (wp == NULL)        /* echo line         */
  257.         return (ABORT);
  258.     else if (newrow == wp->w_toprow + wp->w_ntrows) {    /* mode line */
  259.         curwp = wp;    /* just change buffer     */
  260.         curbp = wp->w_bufp;
  261.     } else {
  262.         /* move to selected window, move dot to top left     */
  263.         curwp = wp;
  264.         curbp = wp->w_bufp;
  265.         curwp->w_dotp = wp->w_linep;
  266.         curwp->w_doto = 0;
  267.  
  268.         /* go forward the correct # of lines          */
  269.         forwline(FFRAND, newrow - curwp->w_toprow);
  270.  
  271.         /* go forward the correct # of characters     */
  272.         /* need to count them out because of tabs     */
  273.         col = dot = 0;
  274.         while ((col < newcol) && (dot < llength(curwp->w_dotp))) {
  275.             c = lgetc(curwp->w_dotp, dot++);
  276.             if (c == CCHR('I'))
  277.                 col |= 0x07;
  278.             else if (ISCTRL(c) != FALSE)
  279.                 ++col;
  280.             ++col;
  281.         }
  282.         if (col > newcol)
  283.             dot--;    /* back up to tab/ctrl char */
  284.         forwchar(FFRAND, dot);
  285.     }
  286.     return (TRUE);
  287. }
  288.  
  289. #else
  290. #include "nullfile.h"
  291. #endif
  292.