aboutsummaryrefslogtreecommitdiff
path: root/tk/tk_funcs.c
diff options
context:
space:
mode:
Diffstat (limited to 'tk/tk_funcs.c')
-rw-r--r--tk/tk_funcs.c346
1 files changed, 346 insertions, 0 deletions
diff --git a/tk/tk_funcs.c b/tk/tk_funcs.c
new file mode 100644
index 000000000000..be2b0d96ea09
--- /dev/null
+++ b/tk/tk_funcs.c
@@ -0,0 +1,346 @@
+/*-
+ * Copyright (c) 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1993, 1994, 1995, 1996
+ * Keith Bostic. All rights reserved.
+ *
+ * See the LICENSE file for redistribution information.
+ */
+
+#include "config.h"
+
+#ifndef lint
+static const char sccsid[] = "@(#)tk_funcs.c 8.11 (Berkeley) 9/23/96";
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/queue.h>
+#include <sys/time.h>
+
+#include <bitstring.h>
+#include <ctype.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "../common/common.h"
+#include "../vi/vi.h"
+#include "tki.h"
+
+/*
+ * tk_addstr --
+ * Add len bytes from the string at the cursor, advancing the cursor.
+ *
+ * PUBLIC: int tk_addstr __P((SCR *, const char *, size_t));
+ */
+int
+tk_addstr(sp, str, len)
+ SCR *sp;
+ const char *str;
+ size_t len;
+{
+ TK_PRIVATE *tkp;
+ int iv;
+ char buf[20];
+
+ iv = 0;
+
+ tkp = TKP(sp);
+ if (iv)
+ (void)Tcl_Eval(tkp->interp, "tk_standout");
+
+ (void)snprintf(buf, sizeof(buf), "%d ", (int)len);
+ if ((Tcl_VarEval(tkp->interp,
+ "tk_addstr ", buf, "{", str, "}", NULL) != TCL_OK))
+ return (1);
+
+ if (iv)
+ (void)Tcl_Eval(tkp->interp, "tk_standend");
+ return (0);
+}
+
+/*
+ * tk_attr --
+ * Toggle a screen attribute on/off.
+ *
+ * PUBLIC: int tk_attr __P((SCR *, scr_attr_t, int));
+ */
+int
+tk_attr(sp, attribute, on)
+ SCR *sp;
+ scr_attr_t attribute;
+ int on;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ switch (attribute) {
+ case SA_ALTERNATE: /* No alternate screen. */
+ break;
+ case SA_INVERSE:
+ if (on)
+ (void)Tcl_Eval(tkp->interp, "tk_standout");
+ else
+ (void)Tcl_Eval(tkp->interp, "tk_standend");
+ break;
+ default:
+ abort();
+ }
+ return (0);
+}
+
+/*
+ * tk_baud --
+ * Return the baud rate.
+ *
+ * PUBLIC: int tk_baud __P((SCR *, u_long *));
+ */
+int
+tk_baud(sp, ratep)
+ SCR *sp;
+ u_long *ratep;
+{
+ *ratep = 9600;
+ return (0);
+}
+
+/*
+ * tk_bell --
+ * Ring the bell/flash the screen.
+ *
+ * PUBLIC: int tk_bell __P((SCR *));
+ */
+int
+tk_bell(sp)
+ SCR *sp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ return (Tcl_Eval(tkp->interp, "tk_flash") != TCL_OK);
+}
+
+/*
+ * tk_clrtoeol --
+ * Clear from the current cursor to the end of the line.
+ *
+ * PUBLIC: int tk_clrtoeol __P((SCR *));
+ */
+int
+tk_clrtoeol(sp)
+ SCR *sp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ return (Tcl_Eval(tkp->interp, "tk_clrtoeol") != TCL_OK);
+}
+
+/*
+ * tk_cursor --
+ * Return the current cursor position.
+ *
+ * PUBLIC: int tk_cursor __P((SCR *, size_t *, size_t *));
+ */
+int
+tk_cursor(sp, yp, xp)
+ SCR *sp;
+ size_t *yp, *xp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ *yp = (tkp->tk_cursor_row - 1) - sp->woff;
+ *xp = tkp->tk_cursor_col;
+ return (0);
+}
+
+/*
+ * tk_deleteln --
+ * Delete the current line, scrolling all lines below it.
+ *
+ * PUBLIC: int tk_deleteln __P((SCR *));
+ */
+int
+tk_deleteln(sp)
+ SCR *sp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ return (Tcl_Eval(tkp->interp, "tk_deleteln") != TCL_OK);
+}
+
+/*
+ * tk_ex_adjust --
+ * Adjust the screen for ex.
+ *
+ * PUBLIC: int tk_ex_adjust __P((SCR *, exadj_t));
+ */
+int
+tk_ex_adjust(sp, action)
+ SCR *sp;
+ exadj_t action;
+{
+ abort();
+ /* NOTREACHED */
+}
+
+/*
+ * tk_insertln --
+ * Push down the current line, discarding the bottom line.
+ *
+ * PUBLIC: int tk_insertln __P((SCR *));
+ */
+int
+tk_insertln(sp)
+ SCR *sp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ return (Tcl_Eval(tkp->interp, "tk_insertln") != TCL_OK);
+}
+
+/*
+ * tk_keyval --
+ * Return the value for a special key.
+ *
+ * PUBLIC: int tk_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *));
+ */
+int
+tk_keyval(sp, val, chp, dnep)
+ SCR *sp;
+ scr_keyval_t val;
+ CHAR_T *chp;
+ int *dnep;
+{
+ TK_PRIVATE *tkp;
+
+ /*
+ * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990,
+ * VWERASE is a 4BSD extension.
+ */
+ tkp = TKP(sp);
+ switch (val) {
+ case KEY_VEOF:
+ *dnep = (*chp = tkp->orig.c_cc[VEOF]) == _POSIX_VDISABLE;
+ break;
+ case KEY_VERASE:
+ *dnep = (*chp = tkp->orig.c_cc[VERASE]) == _POSIX_VDISABLE;
+ break;
+ case KEY_VKILL:
+ *dnep = (*chp = tkp->orig.c_cc[VKILL]) == _POSIX_VDISABLE;
+ break;
+#ifdef VWERASE
+ case KEY_VWERASE:
+ *dnep = (*chp = tkp->orig.c_cc[VWERASE]) == _POSIX_VDISABLE;
+ break;
+#endif
+ default:
+ *dnep = 1;
+ break;
+ }
+ return (0);
+}
+
+/*
+ * tk_move --
+ * Move the cursor.
+ *
+ * PUBLIC: int tk_move __P((SCR *, size_t, size_t));
+ */
+int
+tk_move(sp, lno, cno)
+ SCR *sp;
+ size_t lno, cno;
+{
+ TK_PRIVATE *tkp;
+ char buf[40];
+
+ (void)snprintf(buf, sizeof(buf), "%d %d", RLNO(sp, lno), cno);
+
+ tkp = TKP(sp);
+ return (Tcl_VarEval(tkp->interp, "tk_move ", buf, NULL) != TCL_OK);
+}
+
+/*
+ * tk_refresh --
+ * Refresh the screen.
+ *
+ * PUBLIC: int tk_refresh __P((SCR *, int));
+ */
+int
+tk_refresh(sp, repaint)
+ SCR *sp;
+ int repaint;
+{
+ TK_PRIVATE *tkp;
+
+ /*
+ * If repaint is set, the editor is telling us that we don't know
+ * what's on the screen, so we have to repaint from scratch.
+ *
+ * XXX
+ * I have no idea how to do this in Tk. My guess is that we have
+ * to delete all of the text and call the editor with an E_REPAINT
+ * event.
+ */
+ if (repaint) {
+ }
+
+ tkp = TKP(sp);
+ return (Tcl_Eval(tkp->interp, "update idletasks") != TCL_OK);
+}
+
+/*
+ * tk_rename --
+ * Rename the file.
+ *
+ * PUBLIC: int tk_rename __P((SCR *));
+ */
+int
+tk_rename(sp)
+ SCR *sp;
+{
+ TK_PRIVATE *tkp;
+
+ tkp = TKP(sp);
+ return (Tcl_VarEval(tkp->interp,
+ "tk_rename ", sp->frp->name, NULL) != TCL_OK);
+}
+
+/*
+ * tk_suspend --
+ * Suspend a screen.
+ *
+ * PUBLIC: int tk_suspend __P((SCR *, int *));
+ */
+int
+tk_suspend(sp, allowedp)
+ SCR *sp;
+ int *allowedp;
+{
+ *allowedp = 0;
+ return (0);
+}
+
+/*
+ * tk_usage --
+ * Print out the Tk/Tcl usage messages.
+ *
+ * PUBLIC: void tk_usage __P((void));
+ */
+void
+tk_usage()
+{
+#define USAGE "\
+usage: tkvi [-eFlRrSv] [-c command] [-bg color] [-fg color]\n\
+ [-geometry widthxheight+x+y] [-i script] [-t tag] [-w size]\n\
+ [file ...]\n"
+ (void)fprintf(stderr, "%s", USAGE);
+#undef USAGE
+}