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 13static 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 */ 39int 40tk_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 */ 71int 72tk_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 */ 101int 102tk_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 */ 116int 117tk_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 */ 132int 133tk_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 */ 148int 149tk_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 */ 167int 168tk_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 */ 183int 184tk_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 */ 198int 199tk_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 */ 214int 215tk_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 */ 256int 257tk_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 */ 276int 277tk_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 */ 305int 306tk_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 */ 322int 323tk_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 */ 337void 338tk_usage() 339{ 340#define USAGE "\ 341usage: 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