summaryrefslogtreecommitdiff
path: root/win32/nt.screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'win32/nt.screen.c')
-rw-r--r--win32/nt.screen.c539
1 files changed, 539 insertions, 0 deletions
diff --git a/win32/nt.screen.c b/win32/nt.screen.c
new file mode 100644
index 0000000000000..702591506cf59
--- /dev/null
+++ b/win32/nt.screen.c
@@ -0,0 +1,539 @@
+/*$Header: /p/tcsh/cvsroot/tcsh/win32/nt.screen.c,v 1.14 2006/03/14 01:22:57 mitr Exp $*/
+/*
+ * ed.screen.c: Editor/termcap-curses interface
+ */
+/*-
+ * Copyright (c) 1980, 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include "sh.h"
+
+
+#include "ed.h"
+#include "tc.h"
+#include "ed.defns.h"
+
+
+/* #define DEBUG_LITERAL */
+
+/*
+ * IMPORTANT NOTE: these routines are allowed to look at the current screen
+ * and the current possition assuming that it is correct. If this is not
+ * true, then the update will be WRONG! This is (should be) a valid
+ * assumption...
+ */
+
+
+
+extern int nt_getsize(int*,int*,int*);
+extern int nt_ClearEOL( void) ;
+extern void NT_ClearEOD( void) ;
+extern void NT_ClearScreen(void) ;
+extern void NT_VisibleBell(void);
+extern void NT_WrapHorizontal(void);
+
+static int GetSize(int *lins, int *cols);
+
+int DisplayWindowHSize;
+ void
+terminit(void)
+{
+ return;
+}
+
+
+
+int T_ActualWindowSize;
+
+static void ReBufferDisplay (void);
+
+
+/*ARGSUSED*/
+ void
+TellTC(void)
+{
+
+ xprintf(CGETS(7, 1, "\n\tYou're using a Windows console.\n"));
+}
+
+
+ static void
+ReBufferDisplay(void)
+{
+ register int i;
+ Char **b;
+ Char **bufp;
+ int lins,cols;
+
+ nt_getsize(&lins,&cols,&DisplayWindowHSize);
+
+ b = Display;
+ Display = NULL;
+ if (b != NULL) {
+ for (bufp = b; *bufp != NULL; bufp++)
+ xfree((ptr_t) * bufp);
+ xfree((ptr_t) b);
+ }
+ b = Vdisplay;
+ Vdisplay = NULL;
+ if (b != NULL) {
+ for (bufp = b; *bufp != NULL; bufp++)
+ xfree((ptr_t) * bufp);
+ xfree((ptr_t) b);
+ }
+ TermH = cols;
+
+ TermV = (INBUFSIZE * 4) / TermH + 1;/*FIXBUF*/
+ b = (Char **) xmalloc((size_t) (sizeof(*b) * (TermV + 1)));
+ for (i = 0; i < TermV; i++)
+ b[i] = (Char *) xmalloc((size_t) (sizeof(*b[i]) * (TermH + 1)));
+ b[TermV] = NULL;
+ Display = b;
+ b = (Char **) xmalloc((size_t) (sizeof(*b) * (TermV + 1)));
+ for (i = 0; i < TermV; i++)
+ b[i] = (Char *) xmalloc((size_t) (sizeof(*b[i]) * (TermH + 1)));
+ b[TermV] = NULL;
+ Vdisplay = b;
+}
+
+ void
+SetTC(char *what, char *how)
+{
+ int li,win,co;
+
+ nt_getsize(&li,&co,&win);
+ if (!lstrcmp(what,"li")) {
+ li = atoi(how);
+
+ }else if(!lstrcmp(what,"co")) { //set window, not buffer size
+ win = atoi(how);
+ }
+ else
+ stderror(ERR_SYSTEM, "SetTC","Sorry, this function is not supported");
+
+ ChangeSize(li,win);
+ return;
+}
+
+
+/*
+ * Print the termcap string out with variable substitution
+ */
+ void
+EchoTC(Char **v)
+{
+ Char **globbed;
+ char cv[BUFSIZE];/*FIXBUF*/
+ int verbose = 0, silent = 0;
+ static char *fmts = "%s\n", *fmtd = "%d\n";
+ int li,co;
+
+
+ setname("echotc");
+
+ v = glob_all_or_error(v);
+ globbed = v;
+ cleanup_push(globbed, blk_cleanup);
+
+ if (!v || !*v || *v[0] == '\0')
+ goto end;
+ if (v[0][0] == '-') {
+ switch (v[0][1]) {
+ case 'v':
+ verbose = 1;
+ break;
+ case 's':
+ silent = 1;
+ break;
+ default:
+ stderror(ERR_NAME | ERR_TCUSAGE);
+ break;
+ }
+ v++;
+ }
+ if (!*v || *v[0] == '\0')
+ goto end;
+ (void) StringCbCopy(cv,sizeof(cv), short2str(*v));
+
+ GetSize(&li,&co);
+
+ if(!lstrcmp(cv,"rows") || !lstrcmp(cv,"lines") ) {
+ xprintf(fmtd,T_Lines);
+ goto end;
+ }
+ else if(!lstrcmp(cv,"cols") ) {
+ xprintf(fmtd,T_ActualWindowSize);
+ goto end;
+ }
+ else if(!lstrcmp(cv,"buffer") ) {
+ xprintf(fmtd,T_Cols);
+ goto end;
+ }
+ else
+ stderror(ERR_SYSTEM, "EchoTC","Sorry, this function is not supported");
+
+end:
+ cleanup_until(globbed);
+}
+
+int GotTermCaps = 0;
+
+
+ void
+ResetArrowKeys(void)
+{
+}
+
+ void
+DefaultArrowKeys(void)
+{
+}
+
+
+ int
+SetArrowKeys(const CStr *name, XmapVal *fun, int type)
+{
+ UNREFERENCED_PARAMETER(name);
+ UNREFERENCED_PARAMETER(fun);
+ UNREFERENCED_PARAMETER(type);
+ return -1;
+}
+
+ int
+IsArrowKey(Char *name)
+{
+ UNREFERENCED_PARAMETER(name);
+ return 0;
+}
+
+ int
+ClearArrowKeys(const CStr *name)
+{
+ UNREFERENCED_PARAMETER(name);
+ return -1;
+}
+
+ void
+PrintArrowKeys(const CStr *name)
+{
+ UNREFERENCED_PARAMETER(name);
+ return;
+}
+
+
+ void
+BindArrowKeys(void)
+{
+ return;
+}
+
+#define GoodStr(ignore) 1
+ void
+SetAttributes(Char atr)
+{
+ atr &= ATTRIBUTES;
+}
+
+/* PWP 6-27-88 -- if the tty driver thinks that we can tab, we ask termcap */
+ int
+CanWeTab(void)
+{
+ return 1;
+}
+
+/* move to line <where> (first line == 0) as efficiently as possible; */
+ void
+MoveToLine(int where)
+{
+ int del;
+
+ if (where == CursorV)
+ return;
+
+ if (where > TermV) {
+#ifdef DEBUG_SCREEN
+ xprintf("MoveToLine: where is ridiculous: %d\r\n", where);
+ flush();
+#endif /* DEBUG_SCREEN */
+ return;
+ }
+
+ del = where - CursorV;
+
+ NT_MoveToLineOrChar(del, 1);
+
+ CursorV = where; /* now where is here */
+}
+
+/* move to character position (where) as efficiently as possible */
+ void
+MoveToChar(int where)
+{
+ if (where == CursorH)
+ return;
+
+ if (where >= TermH) {
+#ifdef DEBUG_SCREEN
+ xprintf("MoveToChar: where is riduculous: %d\r\n", where);
+ flush();
+#endif /* DEBUG_SCREEN */
+ return;
+ }
+
+ if (!where) { /* if where is first column */
+ //(void) putraw('\r'); /* do a CR */
+ NT_MoveToLineOrChar(where, 0);
+ flush();
+ CursorH = 0;
+ return;
+ }
+
+ NT_MoveToLineOrChar(where, 0);
+ CursorH = where; /* now where is here */
+}
+
+ void
+so_write(register Char *cp, register int n)
+{
+ if (n <= 0)
+ return; /* catch bugs */
+
+ if (n > TermH) {
+ return;
+ }
+
+ do {
+ if (*cp & LITERAL) {
+ Char *d;
+
+ for (d = litptr + (*cp++ & ~LITERAL) * LIT_FACTOR; *d;
+ d++)
+ (void) putraw(*d);
+ }
+ else
+ (void) putraw(*cp++);
+ CursorH++;
+ } while (--n);
+
+ if (CursorH >= TermH) { /* wrap? */
+ CursorH = 0;
+ CursorV++;
+ NT_WrapHorizontal();
+
+ }
+ else if(CursorH >= DisplayWindowHSize) {
+ flush();
+ NT_MoveToLineOrChar(CursorH,0);
+ }
+}
+
+
+ void
+DeleteChars(int num) /* deletes <num> characters */
+{
+ if (num <= 0)
+ return;
+
+ if (!T_CanDel) {
+#ifdef DEBUG_EDIT
+ xprintf(CGETS(7, 16, "ERROR: cannot delete\r\n"));
+#endif /* DEBUG_EDIT */
+ flush();
+ return;
+ }
+
+ if (num > TermH) {
+#ifdef DEBUG_SCREEN
+ xprintf(CGETS(7, 17, "DeletChars: num is riduculous: %d\r\n"), num);
+ flush();
+#endif /* DEBUG_SCREEN */
+ return;
+ }
+
+}
+
+/* Puts terminal in insert character mode, or inserts num characters in the
+ line */
+ void
+Insert_write(register Char *cp, register int num)
+{
+ UNREFERENCED_PARAMETER(cp);
+
+ if (num <= 0)
+ return;
+ if (!T_CanIns) {
+#ifdef DEBUG_EDIT
+ xprintf(CGETS(7, 18, "ERROR: cannot insert\r\n"));
+#endif /* DEBUG_EDIT */
+ flush();
+ return;
+ }
+
+ if (num > TermH) {
+#ifdef DEBUG_SCREEN
+ xprintf(CGETS(7, 19, "StartInsert: num is riduculous: %d\r\n"), num);
+ flush();
+#endif /* DEBUG_SCREEN */
+ return;
+ }
+
+
+}
+
+/* clear to end of line. There are num characters to clear */
+ void
+ClearEOL(int num)
+{
+
+ if (num <= 0)
+ return;
+
+ nt_ClearEOL();
+
+}
+
+ void
+ClearScreen(void)
+{ /* clear the whole screen and home */
+
+ NT_ClearScreen();
+
+}
+
+ void
+SoundBeep(void)
+{ /* produce a sound */
+ beep_cmd ();
+ if (adrof(STRnobeep))
+ return;
+
+ if (adrof(STRvisiblebell))
+ NT_VisibleBell(); /* visible bell */
+ else
+ MessageBeep(MB_ICONQUESTION);
+}
+
+ void
+ClearToBottom(void)
+{ /* clear to the bottom of the screen */
+ NT_ClearEOD();
+
+}
+
+ void
+GetTermCaps(void)
+{
+ int lins,cols;
+
+ nt_getsize(&lins,&cols,&DisplayWindowHSize);
+
+ GotTermCaps = 1;
+
+ T_Cols = cols;
+ T_Lines = lins;
+ T_ActualWindowSize = DisplayWindowHSize;
+ T_Margin = MARGIN_AUTO;
+ T_CanCEOL = 1;
+ T_CanDel = 0;
+ T_CanIns = 0;
+ T_CanUP = 1;
+
+ ReBufferDisplay();
+ ClearDisp();
+
+ return;
+}
+/* GetSize():
+ * Return the new window size in lines and cols, and
+ * true if the size was changed.
+ */
+ int
+GetSize(int *lins, int *cols)
+{
+
+ int ret = 0;
+
+ *lins = T_Lines;
+
+ *cols = T_Cols;
+
+ nt_getsize(lins,cols,&DisplayWindowHSize);
+
+ // compare the actual visible window size,but return the console buffer size
+ // this is seriously demented.
+ ret = (T_Lines != *lins || T_ActualWindowSize != DisplayWindowHSize);
+
+ T_Lines = *lins;
+ T_Cols = *cols;
+ T_ActualWindowSize = DisplayWindowHSize;
+
+ return ret;
+}
+ void
+ChangeSize(int lins, int cols)
+{
+
+ int rc = 0;
+ // here we're setting the window size, not the buffer size.
+ //
+ nt_set_size(lins,cols);
+
+ rc = GetSize(&lins,&cols);
+
+
+ ReBufferDisplay(); /* re-make display buffers */
+ ClearDisp();
+}
+ void
+PutPlusOne(Char c, int width)
+{
+ extern int OldvcV;
+
+ while (width > 1 && CursorH + width > DisplayWindowHSize)
+ PutPlusOne(' ', 1);
+ if ((c & LITERAL) != 0) {
+ Char *d;
+ for (d = litptr + (c & ~LITERAL) * LIT_FACTOR; *d; d++)
+ (void) putwraw(*d);
+ } else {
+ (void) putwraw(c);
+ }
+
+ Display[CursorV][CursorH++] = (Char) c;
+ while (--width > 0)
+ Display[CursorV][CursorH++] = CHAR_DBWIDTH;
+
+ if (CursorH >= TermH) { /* if we must overflow */
+ CursorH = 0;
+ CursorV++;
+ OldvcV++;
+ NT_WrapHorizontal();
+ }
+ else if(CursorH >= DisplayWindowHSize) {
+ NT_MoveToLineOrChar(CursorH,0);
+ }
+}