home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / EDITOR / NVI179B / NVI179B.ZIP / tk / tk_funcs.c < prev    next >
C/C++ Source or Header  |  1996-10-23  |  6KB  |  347 lines

  1. /*-
  2.  * Copyright (c) 1993, 1994
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  * Copyright (c) 1993, 1994, 1995, 1996
  5.  *    Keith Bostic.  All rights reserved.
  6.  *
  7.  * See the LICENSE file for redistribution information.
  8.  */
  9.  
  10. #include "config.h"
  11.  
  12. #ifndef lint
  13. static const char sccsid[] = "@(#)tk_funcs.c    8.11 (Berkeley) 9/23/96";
  14. #endif /* not lint */
  15.  
  16. #include <sys/types.h>
  17. #include <sys/queue.h>
  18. #include <sys/time.h>
  19.  
  20. #include <bitstring.h>
  21. #include <ctype.h>
  22. #include <signal.h>
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <termios.h>
  27. #include <unistd.h>
  28.  
  29. #include "../common/common.h"
  30. #include "../vi/vi.h"
  31. #include "tki.h"
  32.  
  33. /*
  34.  * tk_addstr --
  35.  *    Add len bytes from the string at the cursor, advancing the cursor.
  36.  *
  37.  * PUBLIC: int tk_addstr __P((SCR *, const char *, size_t));
  38.  */
  39. int
  40. tk_addstr(sp, str, len)
  41.     SCR *sp;
  42.     const char *str;
  43.     size_t len;
  44. {
  45.     TK_PRIVATE *tkp;
  46.     int iv;
  47.     char buf[20];
  48.  
  49.     iv = 0;
  50.  
  51.     tkp = TKP(sp);
  52.     if (iv)
  53.         (void)Tcl_Eval(tkp->interp, "tk_standout");
  54.  
  55.     (void)snprintf(buf, sizeof(buf), "%d ", (int)len);
  56.     if ((Tcl_VarEval(tkp->interp,
  57.         "tk_addstr ", buf, "{", str, "}", NULL) != TCL_OK))
  58.         return (1);
  59.  
  60.     if (iv)
  61.         (void)Tcl_Eval(tkp->interp, "tk_standend");
  62.     return (0);
  63. }
  64.  
  65. /*
  66.  * tk_attr --
  67.  *    Toggle a screen attribute on/off.
  68.  *
  69.  * PUBLIC: int tk_attr __P((SCR *, scr_attr_t, int));
  70.  */
  71. int
  72. tk_attr(sp, attribute, on)
  73.     SCR *sp;
  74.     scr_attr_t attribute;
  75.     int on;
  76. {
  77.     TK_PRIVATE *tkp;
  78.  
  79.     tkp = TKP(sp);
  80.     switch (attribute) {
  81.     case SA_ALTERNATE:            /* No alternate screen. */
  82.         break;
  83.     case SA_INVERSE:
  84.         if (on)
  85.             (void)Tcl_Eval(tkp->interp, "tk_standout");
  86.         else
  87.             (void)Tcl_Eval(tkp->interp, "tk_standend");
  88.         break;
  89.     default:
  90.         abort();
  91.     }
  92.     return (0);
  93. }
  94.  
  95. /*
  96.  * tk_baud --
  97.  *    Return the baud rate.
  98.  *
  99.  * PUBLIC: int tk_baud __P((SCR *, u_long *));
  100.  */
  101. int
  102. tk_baud(sp, ratep)
  103.     SCR *sp;
  104.     u_long *ratep;
  105. {
  106.     *ratep = 9600;
  107.     return (0);
  108. }
  109.  
  110. /*
  111.  * tk_bell --
  112.  *    Ring the bell/flash the screen.
  113.  *
  114.  * PUBLIC: int tk_bell __P((SCR *));
  115.  */
  116. int
  117. tk_bell(sp)
  118.     SCR *sp;
  119. {
  120.     TK_PRIVATE *tkp;
  121.  
  122.     tkp = TKP(sp);
  123.     return (Tcl_Eval(tkp->interp, "tk_flash") != TCL_OK);
  124. }
  125.  
  126. /*
  127.  * tk_clrtoeol --
  128.  *    Clear from the current cursor to the end of the line.
  129.  *
  130.  * PUBLIC: int tk_clrtoeol __P((SCR *));
  131.  */
  132. int
  133. tk_clrtoeol(sp)
  134.     SCR *sp;
  135. {
  136.     TK_PRIVATE *tkp;
  137.  
  138.     tkp = TKP(sp);
  139.     return (Tcl_Eval(tkp->interp, "tk_clrtoeol") != TCL_OK);
  140. }
  141.  
  142. /*
  143.  * tk_cursor --
  144.  *    Return the current cursor position.
  145.  *
  146.  * PUBLIC: int tk_cursor __P((SCR *, size_t *, size_t *));
  147.  */
  148. int
  149. tk_cursor(sp, yp, xp)
  150.     SCR *sp;
  151.     size_t *yp, *xp;
  152. {
  153.     TK_PRIVATE *tkp;
  154.  
  155.     tkp = TKP(sp);
  156.     *yp = (tkp->tk_cursor_row - 1) - sp->woff;
  157.     *xp = tkp->tk_cursor_col;
  158.     return (0);
  159. }
  160.  
  161. /*
  162.  * tk_deleteln --
  163.  *    Delete the current line, scrolling all lines below it.
  164.  *
  165.  * PUBLIC: int tk_deleteln __P((SCR *));
  166.  */
  167. int
  168. tk_deleteln(sp)
  169.     SCR *sp;
  170. {
  171.     TK_PRIVATE *tkp;
  172.  
  173.     tkp = TKP(sp);
  174.     return (Tcl_Eval(tkp->interp, "tk_deleteln") != TCL_OK);
  175. }
  176.  
  177. /* 
  178.  * tk_ex_adjust --
  179.  *    Adjust the screen for ex.
  180.  *
  181.  * PUBLIC: int tk_ex_adjust __P((SCR *, exadj_t));
  182.  */
  183. int
  184. tk_ex_adjust(sp, action)
  185.     SCR *sp;
  186.     exadj_t action;
  187. {
  188.     abort();
  189.     /* NOTREACHED */
  190. }
  191.  
  192. /*
  193.  * tk_insertln --
  194.  *    Push down the current line, discarding the bottom line.
  195.  *
  196.  * PUBLIC: int tk_insertln __P((SCR *));
  197.  */
  198. int
  199. tk_insertln(sp)
  200.     SCR *sp;
  201. {
  202.     TK_PRIVATE *tkp;
  203.  
  204.     tkp = TKP(sp);
  205.     return (Tcl_Eval(tkp->interp, "tk_insertln") != TCL_OK);
  206. }
  207.  
  208. /*
  209.  * tk_keyval --
  210.  *    Return the value for a special key.
  211.  *
  212.  * PUBLIC: int tk_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *));
  213.  */
  214. int
  215. tk_keyval(sp, val, chp, dnep)
  216.     SCR *sp;
  217.     scr_keyval_t val;
  218.     CHAR_T *chp;
  219.     int *dnep;
  220. {
  221.     TK_PRIVATE *tkp;
  222.  
  223.     /*
  224.      * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990,
  225.      * VWERASE is a 4BSD extension.
  226.      */
  227.     tkp = TKP(sp);
  228.     switch (val) {
  229.     case KEY_VEOF:
  230.         *dnep = (*chp = tkp->orig.c_cc[VEOF]) == _POSIX_VDISABLE;
  231.         break;
  232.     case KEY_VERASE:
  233.         *dnep = (*chp = tkp->orig.c_cc[VERASE]) == _POSIX_VDISABLE;
  234.         break;
  235.     case KEY_VKILL:
  236.         *dnep = (*chp = tkp->orig.c_cc[VKILL]) == _POSIX_VDISABLE;
  237.         break;
  238. #ifdef VWERASE
  239.     case KEY_VWERASE:
  240.         *dnep = (*chp = tkp->orig.c_cc[VWERASE]) == _POSIX_VDISABLE;
  241.         break;
  242. #endif
  243.     default:
  244.         *dnep = 1;
  245.         break;
  246.     }
  247.     return (0);
  248. }
  249.  
  250. /*
  251.  * tk_move --
  252.  *    Move the cursor.
  253.  *
  254.  * PUBLIC: int tk_move __P((SCR *, size_t, size_t));
  255.  */
  256. int
  257. tk_move(sp, lno, cno)
  258.     SCR *sp;
  259.     size_t lno, cno;
  260. {
  261.     TK_PRIVATE *tkp;
  262.     char buf[40];
  263.  
  264.     (void)snprintf(buf, sizeof(buf), "%d %d", RLNO(sp, lno), cno);
  265.  
  266.     tkp = TKP(sp);
  267.     return (Tcl_VarEval(tkp->interp, "tk_move ", buf, NULL) != TCL_OK);
  268. }
  269.  
  270. /*
  271.  * tk_refresh --
  272.  *    Refresh the screen.
  273.  *
  274.  * PUBLIC: int tk_refresh __P((SCR *, int));
  275.  */
  276. int
  277. tk_refresh(sp, repaint)
  278.     SCR *sp;
  279.     int repaint;
  280. {
  281.     TK_PRIVATE *tkp;
  282.  
  283.     /*
  284.      * If repaint is set, the editor is telling us that we don't know
  285.      * what's on the screen, so we have to repaint from scratch.
  286.      *
  287.      * XXX
  288.      * I have no idea how to do this in Tk.  My guess is that we have
  289.      * to delete all of the text and call the editor with an E_REPAINT
  290.      * event.
  291.      */
  292.     if (repaint) {
  293.     }
  294.  
  295.     tkp = TKP(sp);
  296.     return (Tcl_Eval(tkp->interp, "update idletasks") != TCL_OK);
  297. }
  298.  
  299. /*
  300.  * tk_rename --
  301.  *    Rename the file.
  302.  *
  303.  * PUBLIC: int tk_rename __P((SCR *));
  304.  */
  305. int
  306. tk_rename(sp)
  307.     SCR *sp;
  308. {
  309.     TK_PRIVATE *tkp;
  310.  
  311.     tkp = TKP(sp);
  312.     return (Tcl_VarEval(tkp->interp,
  313.         "tk_rename ", sp->frp->name, NULL) != TCL_OK);
  314. }
  315.  
  316. /*
  317.  * tk_suspend --
  318.  *    Suspend a screen.
  319.  *
  320.  * PUBLIC: int tk_suspend __P((SCR *, int *));
  321.  */
  322. int
  323. tk_suspend(sp, allowedp)
  324.     SCR *sp;
  325.     int *allowedp;
  326. {
  327.     *allowedp = 0;
  328.     return (0);
  329. }
  330.  
  331. /*
  332.  * tk_usage --
  333.  *    Print out the Tk/Tcl usage messages.
  334.  * 
  335.  * PUBLIC: void tk_usage __P((void));
  336.  */
  337. void
  338. tk_usage()
  339. {
  340. #define    USAGE "\
  341. usage: tkvi [-eFlRrSv] [-c command] [-bg color] [-fg color]\n\
  342.         [-geometry widthxheight+x+y] [-i script] [-t tag] [-w size]\n\
  343.         [file ...]\n"
  344.     (void)fprintf(stderr, "%s", USAGE);
  345. #undef    USAGE
  346. }
  347.