summaryrefslogblamecommitdiff
path: root/news/husky-msged/files/patch-curses.c
blob: 1908ac66734750efff06c4e25057e431fcdcc1dd (plain) (tree)










































































































































                                                                           
--- curses.c.orig	Wed Jan 29 00:48:13 2003
+++ curses.c	Wed Jan 29 01:37:29 2003
@@ -22,6 +22,7 @@
 #include "winsys.h"
 #include "unused.h"
 #include "keys.h"
+#include "readtc.h"
 #include "specch.h"
 
 int color;
@@ -40,6 +41,7 @@
     0
 };
 
+static int tcflags = 0;         /* what we want to extract from termcap */
 
 #define EBUFSZ 100
 static EVT EVent[EBUFSZ];	/* event circular queue */
@@ -436,6 +438,8 @@
     Key_A_5, Key_A_6, Key_A_7, Key_A_8, Key_A_9
 };
 
+void TTSendMsg(int msg, int x, int y, int msgtype);
+
 unsigned int TTGetKey(void)
 {
     int ch;
@@ -443,6 +447,11 @@
     ch = getch();
     switch (ch)
     {
+    case KEY_RESIZE:
+        term.NRow = getmaxy(stdscr);
+	term.NCol = getmaxx(stdscr);
+        TTSendMsg(1, 0, 0, WND_WM_RESIZE);
+	return -1;
     case KEY_LEFT:
         return Key_Lft;
     case KEY_RIGHT:
@@ -566,6 +575,7 @@
         case '0':
             return Key_F10;
         }
+	break;
     }
 
     if (ch >= 127)    /* Treat special characters */
@@ -611,7 +621,7 @@
     return ch;
 }
 
-void TTSendMsg(unsigned int msg, int x, int y, unsigned int msgtype)
+void TTSendMsg(int msg, int x, int y, int msgtype)
 {
     if (((ebufin + 1) % EBUFSZ) != ebufout)
     {
@@ -633,6 +643,7 @@
     meta(stdscr, TRUE);
     intrflush(stdscr, FALSE);
     raw();
+    query_termcap(tcflags);
     return 0;
 }
 
@@ -660,30 +671,47 @@
     return 0;
 }
 
+static void
+collect_events(void)
+{
+    int ch = TTGetKey();
+    if (ch < 0)
+	return;
+
+    TTSendMsg(ch, 0, 0, WND_WM_CHAR);
+}
+
 int TTGetMsg(EVT * e)
 {
-    e->msg = TTGetKey();
-    e->x = 0;
-    e->y = 0;
-    e->msgtype = WND_WM_CHAR;
+    while (ebufin == ebufout)
+	collect_events();
+
+    e->msg = EVent[ebufout].msg;
+    e->x = EVent[ebufout].x;
+    e->y = EVent[ebufout].y;
+    e->msgtype = EVent[ebufout].msgtype;
     e->id = 0;
+    ebufout = (ebufout + 1) % EBUFSZ;
     return e->msg;
 }
 
 int TTPeekQue(void)
 {
-    return kbhit();
+    if (kbhit())
+	collect_events();
+    return ebufin != ebufout;
 }
 
 void TTClearQue(void)
 {
-    while (TTPeekQue())
-        TTGetKey();
+    ebufin = ebufout;
 }
 
 int TTGetChr(void)
 {
-    return TTGetKey();
+    EVT e;
+    TTGetMsg(&e);
+    return e.msg;
 }
 
 static char ansi2curses[8] = {
@@ -754,6 +782,18 @@
         allowed_special_characters =
             (unsigned char *) malloc(l = (strlen(value) + 1));
         memcpy(allowed_special_characters, value, l);
+    }
+    else if (!strcmp(keyword,"pseudographics"))
+    {
+        if (atoi(value))
+        {
+            tcflags |= QUERY_ALTCHARSET;
+        }
+        else
+        {
+            tcflags &= ~QUERY_ALTCHARSET;
+        }
+        query_termcap(tcflags);
     }
     else
     {