347 lines
5.7 KiB
C
347 lines
5.7 KiB
C
|
/*-
|
||
|
* 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
|
||
|
}
|