Improved keyboard handling code
authorEric Kohl <eric.kohl@reactos.org>
Wed, 8 Mar 2000 01:49:37 +0000 (01:49 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Wed, 8 Mar 2000 01:49:37 +0000 (01:49 +0000)
Fixed problems with differnet console sizes
Started function renaming

svn path=/trunk/; revision=1034

20 files changed:
rosapps/dflat32/applicat.c
rosapps/dflat32/calendar.c
rosapps/dflat32/console.c
rosapps/dflat32/dflat.h
rosapps/dflat32/edit.c
rosapps/dflat32/helpbox.c
rosapps/dflat32/lists.c
rosapps/dflat32/makefile
rosapps/dflat32/menubar.c
rosapps/dflat32/message.c
rosapps/dflat32/msgbox.c
rosapps/dflat32/normal.c
rosapps/dflat32/popdown.c
rosapps/dflat32/readme.txt
rosapps/dflat32/rect.c
rosapps/dflat32/sysmenu.c
rosapps/dflat32/system.h
rosapps/dflat32/textbox.c
rosapps/dflat32/video.c
rosapps/dflat32/window.c

index 270cf06..89649d9 100644 (file)
@@ -2,7 +2,6 @@
 
 #include "dflat.h"
 
-static int ScreenHeight;
 static BOOL DisplayModified = FALSE;
 DFWINDOW ApplicationWindow;
 
@@ -50,9 +49,9 @@ static char Menus[9][26] =
 /* --------------- CREATE_WINDOW Message -------------- */
 static int CreateWindowMsg(DFWINDOW wnd)
 {
-    int rtn;
+       int rtn;
+
        ApplicationWindow = wnd;
-    ScreenHeight = SCREENHEIGHT;
 #ifdef INCLUDE_WINDOWOPTIONS
     if (cfg.Border)
         SetCheckBox(&Display, ID_BORDER);
@@ -386,7 +385,8 @@ static void CreateStatusBar(DFWINDOW wnd)
 /* -------- return the name of a document window ------- */
 static char *WindowName(DFWINDOW wnd)
 {
-    if (GetTitle(wnd) == NULL)    {
+    if (GetTitle(wnd) == NULL)
+    {
         if (GetClass(wnd) == DIALOG)
             return ((DBOX *)(wnd->extension))->HelpName;
         else 
@@ -518,7 +518,8 @@ static void MoreWindows(DFWINDOW wnd)
 static void ChooseWindow(DFWINDOW wnd, int WindowNo)
 {
     DFWINDOW cwnd = FirstWindow(wnd);
-       while (cwnd != NULL)    {
+       while (cwnd != NULL)
+       {
         if (GetClass(cwnd) != MENUBAR &&
                 GetClass(cwnd) != STATUSBAR)
             if (WindowNo-- == 0)
index 99a33bf..13dea84 100644 (file)
@@ -1,8 +1,6 @@
 /* ------------- calendar.c ------------- */
 #include "dflat.h"
 
-#ifndef TURBOC
-
 #define CALHEIGHT 17
 #define CALWIDTH 33
 
@@ -13,9 +11,31 @@ static DFWINDOW Cwnd;
 
 static void FixDate(void)
 {
-    /* ---- adjust Feb for leap year ---- */
-    DyMo[1] = (ttm.tm_year % 4) ? 28 : 29;
-    ttm.tm_mday = min(ttm.tm_mday, DyMo[ttm.tm_mon]);
+       /* ---- adjust Feb for leap year ---- */
+       if (ttm.tm_year % 4 == 0)
+       {
+               if (ttm.tm_year % 100 == 0)
+               {
+                       if (ttm.tm_year % 400 == 0)
+                       {
+                               DyMo[1] = 29;
+                       }
+                       else
+                       {
+                               DyMo[1] = 28;
+                       }
+               }
+               else
+               {
+                       DyMo[1] = 29;
+               }
+       }
+       else
+       {
+               DyMo[1] = 28;
+       }
+
+       ttm.tm_mday = min(ttm.tm_mday, DyMo[ttm.tm_mon]);
 }
 
 /* ---- build calendar dates array ---- */
@@ -162,4 +182,4 @@ void Calendar(DFWINDOW pwnd)
     DfSendMessage(Cwnd, SETFOCUS, TRUE, 0);
 }
 
-#endif
+/* EOF */
index a604300..9c638d1 100644 (file)
@@ -18,16 +18,31 @@ static int altconvert[] = {
 };
 #endif
 
-static int cursorpos[MAXSAVES];
-static int cursorshape[MAXSAVES];
-static int cs;
+static COORD cursorpos[MAXSAVES];
+static CONSOLE_CURSOR_INFO cursorinfo[MAXSAVES];
+static int cs = 0;
 
 
 void SwapCursorStack(void)
 {
-       if (cs > 1)     {
-               swap(cursorpos[cs-2], cursorpos[cs-1]);
-               swap(cursorshape[cs-2], cursorshape[cs-1]);
+       if (cs > 1)
+       {
+               COORD coord;
+               CONSOLE_CURSOR_INFO csi;
+
+               coord = cursorpos[cs-2];
+               cursorpos[cs-2] = cursorpos[cs-1];
+               cursorpos[cs-1] = coord;
+
+               memcpy (&csi,
+                       &cursorinfo[cs-2],
+                       sizeof(CONSOLE_CURSOR_INFO));
+               memcpy (&cursorinfo[cs-2],
+                       &cursorinfo[cs-1],
+                       sizeof(CONSOLE_CURSOR_INFO));
+               memcpy (&cursorinfo[cs-1],
+                       &csi,
+                       sizeof(CONSOLE_CURSOR_INFO));
        }
 }
 
@@ -53,6 +68,7 @@ void GetKey (PINPUT_RECORD lpBuffer)
 
 
 /* ---------- read the keyboard shift status --------- */
+
 int getshift(void)
 {
 //    regs.h.ah = 2;
@@ -82,20 +98,8 @@ void cursor(int x, int y)
        SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos);
 }
 
-/* ------ get cursor shape and position ------ */
-static void getcursor(void)
-{
-/*
-    videomode();
-    regs.h.ah = READCURSOR;
-    regs.x.bx = video_page;
-    int86(VIDEO, &regs, &regs);
-*/
-       /* FIXME */
-}
 
 /* ------- get the current cursor position ------- */
-
 void curr_cursor(int *x, int *y)
 //VOID GetCursorXY (PSHORT x, PSHORT y)
 {
@@ -111,70 +115,85 @@ void curr_cursor(int *x, int *y)
 /* ------ save the current cursor configuration ------ */
 void savecursor(void)
 {
-/*
-    if (cs < MAXSAVES)    {
-        getcursor();
-        cursorshape[cs] = regs.x.cx;
-        cursorpos[cs] = regs.x.dx;
-        cs++;
-    }
-*/
+       if (cs < MAXSAVES)
+       {
+               CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+               GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+               cursorpos[cs].X = csbi.dwCursorPosition.X;
+               cursorpos[cs].Y = csbi.dwCursorPosition.Y;
+
+               GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                                     &(cursorinfo[cs]));
+
+               cs++;
+       }
 }
 
 /* ---- restore the saved cursor configuration ---- */
 void restorecursor(void)
 {
-/*
-    if (cs)    {
-        --cs;
-        videomode();
-        regs.x.dx = cursorpos[cs];
-        regs.h.ah = SETCURSOR;
-        regs.x.bx = video_page;
-        int86(VIDEO, &regs, &regs);
-        set_cursor_type(cursorshape[cs]);
-    }
-*/
+       if (cs)
+       {
+               --cs;
+               SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE),
+                                         cursorpos[cs]);
+               SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                                     &(cursorinfo[cs]));
+       }
 }
 
 /* ------ make a normal cursor ------ */
 void normalcursor(void)
 {
-//    set_cursor_type(0x0607);
+       CONSOLE_CURSOR_INFO csi;
+
+       csi.bVisible = TRUE;
+       csi.dwSize = 5;
+       SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
 }
 
 /* ------ hide the cursor ------ */
 void hidecursor(void)
 {
-/*
-    getcursor();
-    regs.h.ch |= HIDECURSOR;
-    regs.h.ah = SETCURSORTYPE;
-    int86(VIDEO, &regs, &regs);
-*/
+       CONSOLE_CURSOR_INFO csi;
+
+       GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
+       csi.bVisible = FALSE;
+       SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
 }
 
 /* ------ unhide the cursor ------ */
 void unhidecursor(void)
 {
-/*
-    getcursor();
-    regs.h.ch &= ~HIDECURSOR;
-    regs.h.ah = SETCURSORTYPE;
-    int86(VIDEO, &regs, &regs);
-*/
+       CONSOLE_CURSOR_INFO csi;
+
+       GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
+       csi.bVisible = TRUE;
+       SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
 }
 
-/* ---- use BIOS to set the cursor type ---- */
-void set_cursor_type(unsigned t)
+/* set the cursor size (in percent) */
+void set_cursor_size (unsigned t)
 {
-/*
-    videomode();
-    regs.h.ah = SETCURSORTYPE;
-    regs.x.bx = video_page;
-    regs.x.cx = t;
-    int86(VIDEO, &regs, &regs);
-*/
+       CONSOLE_CURSOR_INFO csi;
+
+       GetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
+
+       if (t < 2)
+               csi.dwSize = 2;
+       else if (t > 90)
+               csi.dwSize = 90;
+       else
+               csi.dwSize = t;
+       SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE),
+                             &csi);
 }
 
 
index fd391a1..0d3ec41 100644 (file)
@@ -269,10 +269,10 @@ extern BOOL ClipString;
 #define DOWNSCROLLBOX  (unsigned char) '\x1f'
 #define LEFTSCROLLBOX  (unsigned char) '\x11'
 #define RIGHTSCROLLBOX (unsigned char) '\x10'
-#define SCROLLBARCHAR  (unsigned char) 176 
+#define SCROLLBARCHAR  (unsigned char) 176
 #define SCROLLBOXCHAR  (unsigned char) 178
 /* ------------------ menu characters --------------------- */
-#define CHECKMARK      (unsigned char) (SCREENHEIGHT==25?251:4)
+#define CHECKMARK      (unsigned char) '\x04' //(SCREENHEIGHT==25?251:4)
 #define CASCADEPOINTER (unsigned char) '\x10'
 /* ----------------- title bar characters ----------------- */
 #define CONTROLBOXCHAR (unsigned char) '\xf0'
@@ -285,12 +285,16 @@ extern BOOL ClipString;
 #define CHANGECOLOR  (unsigned char) 174 /* prefix to change colors  */
 #define RESETCOLOR   (unsigned char) 175 /* reset colors to default  */
 #define LISTSELECTOR   4    /* selected list box entry      */
+
 /* --------- message prototypes ----------- */
-BOOL init_messages(void);
+BOOL DfInitialize (void);
+void DfTerminate (void);
 void DfPostMessage (DFWINDOW, DFMESSAGE, PARAM, PARAM);
 int DfSendMessage (DFWINDOW, DFMESSAGE, PARAM, PARAM);
 BOOL DfDispatchMessage (void);
 void handshake(void);
+SHORT DfGetScreenHeight (void);
+SHORT DfGetScreenWidth (void);
 
 /* ---- standard window message processing prototypes ----- */
 int ApplicationProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
@@ -317,6 +321,7 @@ int ErrorBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
 int YesNoBoxProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
 int StatusBarProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
 int WatchIconProc(DFWINDOW, DFMESSAGE, PARAM, PARAM);
+
 /* ------------- normal box prototypes ------------- */
 void SetStandardColor(DFWINDOW);
 void SetReverseColor(DFWINDOW);
index 4ae2d5d..e8cbab8 100644 (file)
@@ -36,8 +36,10 @@ int main (int argc, char *argv[])
 {
        DFWINDOW wnd;
        FILE *fp;
-       if (!init_messages())
+
+       if (DfInitialize () == FALSE)
                return 1;
+
        Argv = argv;
        LoadConfig ();
 //     if (!LoadConfig())
@@ -75,6 +77,8 @@ int main (int argc, char *argv[])
        while (DfDispatchMessage ())
                ;
 
+       DfTerminate ();
+
        return 0;
 }
 
index 571193e..196f47c 100644 (file)
@@ -14,7 +14,7 @@ char *ClassNames[] = {
     NULL
 };
 
-#define MAXHEIGHT (SCREENHEIGHT-10)
+#define MAXHEIGHT (DfGetScreenHeight()-10)
 
 /* --------- linked list of help text collections -------- */
 struct helps {
@@ -691,18 +691,18 @@ static void BestFit(DFWINDOW wnd, DIALOGWINDOW *dwnd)
     /* --- compute above overlap ---- */
     above = OverLap(dwnd->h, GetTop(wnd));
     /* --- compute below overlap ---- */
-    below = OverLap(GetBottom(wnd), SCREENHEIGHT-dwnd->h);
+    below = OverLap(GetBottom(wnd), DfGetScreenHeight()-dwnd->h);
     /* --- compute right overlap ---- */
-    right = OverLap(GetRight(wnd), SCREENWIDTH-dwnd->w);
+    right = OverLap(GetRight(wnd), DfGetScreenWidth()-dwnd->w);
     /* --- compute left  overlap ---- */
     left = OverLap(dwnd->w, GetLeft(wnd));
 
     if (above < below)
         dwnd->y = max(0, GetTop(wnd)-dwnd->h-2);
     else
-        dwnd->y = min(SCREENHEIGHT-dwnd->h, GetBottom(wnd)+2);
+        dwnd->y = min(DfGetScreenHeight()-dwnd->h, GetBottom(wnd)+2);
     if (right < left)
-        dwnd->x = min(GetRight(wnd)+2, SCREENWIDTH-dwnd->w);
+        dwnd->x = min(GetRight(wnd)+2, DfGetScreenWidth()-dwnd->w);
     else
         dwnd->x = max(0, GetLeft(wnd)-dwnd->w-2);
 
index f907293..c67987a 100644 (file)
@@ -82,19 +82,22 @@ void ReFocus(DFWINDOW wnd)
 /* ---- remove a window from the linked list ---- */
 void RemoveWindow(DFWINDOW wnd)
 {
-    if (wnd != NULL)    {
+       if (wnd != NULL)
+       {
                DFWINDOW pwnd = GetParent(wnd);
-        if (PrevWindow(wnd) != NULL)
-            NextWindow(PrevWindow(wnd)) = NextWindow(wnd);
-        if (NextWindow(wnd) != NULL)
-            PrevWindow(NextWindow(wnd)) = PrevWindow(wnd);
-               if (pwnd != NULL)       {
-               if (wnd == FirstWindow(pwnd))
-               FirstWindow(pwnd) = NextWindow(wnd);
-               if (wnd == LastWindow(pwnd))
-               LastWindow(pwnd) = PrevWindow(wnd);
+
+               if (PrevWindow(wnd) != NULL)
+                       NextWindow(PrevWindow(wnd)) = NextWindow(wnd);
+               if (NextWindow(wnd) != NULL)
+                       PrevWindow(NextWindow(wnd)) = PrevWindow(wnd);
+               if (pwnd != NULL)
+               {
+                       if (wnd == FirstWindow(pwnd))
+                               FirstWindow(pwnd) = NextWindow(wnd);
+                       if (wnd == LastWindow(pwnd))
+                               LastWindow(pwnd) = PrevWindow(wnd);
                }
-    }
+       }
 }
 
 /* ---- append a window to the linked list ---- */
@@ -105,14 +108,6 @@ void AppendWindow(DFWINDOW wnd)
                DFWINDOW pwnd = GetParent(wnd);
                if (pwnd != NULL)
                {
-/*
-                       if (FirstWindow(pwnd) == NULL)
-                               FirstWindow(pwnd) = wnd;
-                       if (LastWindow(pwnd) != NULL)
-                               NextWindow(LastWindow(pwnd)) = wnd;
-                       PrevWindow(wnd) = LastWindow(pwnd);
-                       LastWindow(pwnd) = wnd;
-*/
                        if (FirstWindow(pwnd) == NULL)
                        {
                                FirstWindow(pwnd) = wnd;
@@ -130,8 +125,10 @@ void AppendWindow(DFWINDOW wnd)
        }
 }
 
-/* ----- if document windows and statusbar or menubar get the focus,
-              pass it on ------- */
+/*
+ * if document windows and statusbar or menubar get the focus,
+ * pass it on
+ */
 void SkipApplicationControls(void)
 {
        BOOL EmptyAppl = FALSE;
index 6391be0..5189d99 100644 (file)
@@ -49,7 +49,7 @@ else
 endif
 
 
-WITH_DEBUGGING=yes
+#WITH_DEBUGGING=yes
 
 include ../rules.mak
 
index 09649db..a67b1f3 100644 (file)
@@ -405,22 +405,26 @@ int MenuBarProc(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
 /* ------------- reset the MENUBAR -------------- */
 static void reset_menubar(DFWINDOW wnd)
 {
-    GetText(wnd) = DFrealloc(GetText(wnd), SCREENWIDTH+5);
-    memset(GetText(wnd), ' ', SCREENWIDTH);
+    GetText(wnd) = DFrealloc(GetText(wnd), DfGetScreenWidth()+5);
+    memset(GetText(wnd), ' ', DfGetScreenWidth());
     *(GetText(wnd)+WindowWidth(wnd)) = '\0';
 }
 
 static DFWINDOW GetDocFocus(void)
 {
        DFWINDOW wnd = ApplicationWindow;
-       if (wnd != NULL)        {
+       if (wnd != NULL)
+       {
                wnd = LastWindow(wnd);
-               while (wnd != NULL && (GetClass(wnd) == MENUBAR ||
-                                                       GetClass(wnd) == STATUSBAR))
+               while (wnd != NULL &&
+                      (GetClass(wnd) == MENUBAR ||
+                       GetClass(wnd) == STATUSBAR))
                        wnd = PrevWindow(wnd);
                if (wnd != NULL)
+               {
                        while (wnd->childfocus != NULL)
                                wnd = wnd->childfocus;
+               }
        }
        return wnd ? wnd : ApplicationWindow;
 }
index e3d865c..89b65bf 100644 (file)
@@ -1,6 +1,7 @@
 /* --------- message.c ---------- */
 
 #include "dflat.h"
+#include "system.h"
 
 static int handshaking = 0;
 
@@ -56,9 +57,21 @@ static void StopMsg(void)
        unhidecursor();
 }
 
+SHORT DfGetScreenHeight (void)
+{
+       return sScreenHeight;
+}
+
+SHORT DfGetScreenWidth (void)
+{
+       return sScreenWidth;
+}
+
 /* ------------ initialize the message system --------- */
-BOOL init_messages (VOID)
+BOOL DfInitialize (VOID)
 {
+       CONSOLE_SCREEN_BUFFER_INFO csbi;
+
        AllocTesting = TRUE;
        if (setjmp(AllocError) != 0)
        {
@@ -66,9 +79,17 @@ BOOL init_messages (VOID)
                return FALSE;
        }
 
+       /* get input and output handles */
+       hInput = GetStdHandle (STD_INPUT_HANDLE);
+       hOutput = GetStdHandle (STD_OUTPUT_HANDLE);
+
+       /* get screen size */
+       GetConsoleScreenBufferInfo (hOutput, &csbi);
+       sScreenHeight = (csbi.srWindow.Bottom - csbi.srWindow.Top) + 1;
+       sScreenWidth = (csbi.srWindow.Right - csbi.srWindow.Left) + 1;
+
        /* enable mouse events */
-       SetConsoleMode (GetStdHandle (STD_INPUT_HANDLE),
-                       ENABLE_MOUSE_INPUT);
+       SetConsoleMode (hInput, ENABLE_MOUSE_INPUT);
 
        savecursor();
        hidecursor();
@@ -88,6 +109,12 @@ BOOL init_messages (VOID)
        return TRUE;
 }
 
+
+void DfTerminate (void)
+{
+
+}
+
 /* ----- post an event and parameters to event queue ---- */
 static void PostEvent(DFMESSAGE event, int p1, int p2)
 {
@@ -163,19 +190,23 @@ static void collect_events(void)
                {
                        sk |= CTRLKEY;
                }
+               if (ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED)
+               {
+                       sk |= LEFTSHIFT + RIGHTSHIFT;
+               }
 
-#if 0
                if (sk != OldShiftKeys)
                {
                        OldShiftKeys = sk;
                        /* the shift status changed */
                        PostEvent(SHIFT_CHANGED, sk, 0);
+#if 0
                        if (sk & ALTKEY)
                                AltDown = TRUE;
                        else
                                AltDown = FALSE;
-               }
 #endif
+               }
 
                if (ir.Event.KeyEvent.uChar.AsciiChar == 0)
                {
@@ -213,6 +244,14 @@ static void collect_events(void)
                                        c = FWD;
                                        break;
 
+                               case VK_INSERT:
+                                       c = INS;
+                                       break;
+
+                               case VK_DELETE:
+                                       c = DEL;
+                                       break;
+
                                case VK_HOME:
                                        c = HOME;
                                        break;
@@ -234,7 +273,14 @@ static void collect_events(void)
                        }
                }
                else
-                       c = ir.Event.KeyEvent.uChar.AsciiChar;
+               {
+                       /* special handling of SHIFT+TAB */
+                       if (ir.Event.KeyEvent.uChar.AsciiChar == VK_TAB &&
+                           (ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED))
+                               c = SHIFT_HT;
+                       else
+                               c = ir.Event.KeyEvent.uChar.AsciiChar;
+               }
 
                PostEvent (KEYBOARD, c, sk);
        }
@@ -282,66 +328,9 @@ static void collect_events(void)
                        }
                }
        }
-
-
-#if 0
-       /* --------- keyboard events ---------- */
-       if ((sk = getshift()) != ShiftKeys)
-       {
-               ShiftKeys = sk;
-               /* ---- the shift status changed ---- */
-               PostEvent(SHIFT_CHANGED, sk, 0);
-               if (sk & ALTKEY)
-                       AltDown = TRUE;
-       }
-
-    /* ---- build keyboard events for key combinations that
-        BIOS doesn't report --------- */
-    if (sk & ALTKEY)   {
-        if (keyportvalue == 14)    {
-                       AltDown = FALSE;
-            PostEvent(KEYBOARD, ALT_BS, sk);
-        }
-        if (keyportvalue == 83)    {
-                       AltDown = FALSE;
-            PostEvent(KEYBOARD, ALT_DEL, sk);
-        }
-       }
-
-       if (sk & CTRLKEY)
-       {
-               AltDown = FALSE;
-        if (keyportvalue == 82)    {
-            PostEvent(KEYBOARD, CTRL_INS, sk);
-        }
-       }
-    /* ----------- test for keystroke ------- */
-    if (keyhit())    {
-        static int cvt[] = {SHIFT_INS,END,DN,PGDN,BS,'5',
-                        FWD,HOME,UP,PGUP};
-               INPUT_RECORD ir;
-               int c;
-
-               GetKey(&ir);
-               c = ir.Event.KeyEvent.uChar.AsciiChar;
-
-               AltDown = FALSE;
-               /* -------- convert numeric pad keys ------- */
-               if (sk & (LEFTSHIFT | RIGHTSHIFT))
-               {
-            if (c >= '0' && c <= '9')
-                c = cvt[c-'0'];
-            else if (c == '.' || c == DEL)
-                c = SHIFT_DEL;
-            else if (c == INS)
-                c = SHIFT_INS;
-               }
-               /* ------ post the keyboard event ------ */
-               PostEvent(KEYBOARD, c, sk);
-       }
-#endif
 }
 
+
 /* ----- post a message and parameters to msg queue ---- */
 void DfPostMessage(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
 {
@@ -476,9 +465,9 @@ int DfSendMessage(DFWINDOW wnd, DFMESSAGE msg, PARAM p1, PARAM p2)
                 break;
             case SHOW_CURSOR:
                 if (p1)
-                    set_cursor_type(0x0106);
+                    set_cursor_size(100);
                 else
-                    set_cursor_type(0x0607);
+                    set_cursor_size(5);
                 unhidecursor();
                 break;
 
index 8e46766..3683b6f 100644 (file)
@@ -188,23 +188,29 @@ DFWINDOW MomentaryMessage(char *msg)
 
 int MsgHeight(char *msg)
 {
-    int h = 1;
-    while ((msg = strchr(msg, '\n')) != NULL)    {
-        h++;
-        msg++;
-    }
-    return min(h, SCREENHEIGHT-10);
+       int h = 1;
+
+       while ((msg = strchr(msg, '\n')) != NULL)
+       {
+               h++;
+               msg++;
+       }
+
+       return min(h, DfGetScreenHeight ()-10);
 }
 
 int MsgWidth(char *msg)
 {
-    int w = 0;
-    char *cp = msg;
-    while ((cp = strchr(msg, '\n')) != NULL)    {
-        w = max(w, (int) (cp-msg));
-        msg = cp+1;
-    }
-    return min(max((int)strlen(msg), (int)w), SCREENWIDTH-10);
+       int w = 0;
+       char *cp = msg;
+
+       while ((cp = strchr(msg, '\n')) != NULL)
+       {
+               w = max(w, (int) (cp-msg));
+               msg = cp+1;
+       }
+
+       return min(max((int)strlen(msg), (int)w), DfGetScreenWidth()-10);
 }
 
 /* EOF */
\ No newline at end of file
index bf5f423..32740ba 100644 (file)
@@ -99,11 +99,11 @@ static BOOL KeyboardMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
                     --y;
                 break;
             case DN:
-                if (y < SCREENHEIGHT-1)
+                if (y < DfGetScreenHeight()-1)
                     y++;
                 break;
             case FWD:
-                if (x < SCREENWIDTH-1)
+                if (x < DfGetScreenWidth()-1)
                     x++;
                 break;
             case BS:
@@ -389,8 +389,8 @@ static BOOL MouseMovedMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
 {
     if (WindowMoving)    {
         int leftmost = 0, topmost = 0,
-            bottommost = SCREENHEIGHT-2,
-            rightmost = SCREENWIDTH-2;
+            bottommost = DfGetScreenHeight()-2,
+            rightmost = DfGetScreenWidth()-2;
         int x = (int) p1 - diff;
         int y = (int) p2;
         if (GetParent(wnd) != NULL &&
@@ -430,8 +430,8 @@ static void MaximizeMsg(DFWINDOW wnd)
     DFRECT rc = {0, 0, 0, 0};
     DFRECT holdrc;
     holdrc = wnd->RestoredRC;
-    rc.rt = SCREENWIDTH-1;
-    rc.bt = SCREENHEIGHT-1;
+    rc.rt = DfGetScreenWidth()-1;
+    rc.bt = DfGetScreenHeight()-1;
     if (GetParent(wnd))
         rc = ClientRect(GetParent(wnd));
     wnd->oldcondition = wnd->condition;
@@ -721,10 +721,10 @@ static DFRECT PositionIcon(DFWINDOW wnd)
 {
        DFWINDOW pwnd = GetParent(wnd);
     DFRECT rc;
-    RectLeft(rc) = SCREENWIDTH-ICONWIDTH;
-    RectTop(rc) = SCREENHEIGHT-ICONHEIGHT;
-    RectRight(rc) = SCREENWIDTH-1;
-    RectBottom(rc) = SCREENHEIGHT-1;
+    RectLeft(rc) = DfGetScreenWidth()-ICONWIDTH;
+    RectTop(rc) = DfGetScreenHeight()-ICONHEIGHT;
+    RectRight(rc) = DfGetScreenWidth()-1;
+    RectBottom(rc) = DfGetScreenHeight()-1;
     if (pwnd != NULL)    {
         DFRECT prc = WindowRect(pwnd);
                DFWINDOW cwnd = FirstWindow(pwnd);
@@ -789,8 +789,8 @@ static void sizeborder(DFWINDOW wnd, int rt, int bt)
 {
     int leftmost = GetLeft(wnd)+10;
     int topmost = GetTop(wnd)+3;
-    int bottommost = SCREENHEIGHT-1;
-    int rightmost  = SCREENWIDTH-1;
+    int bottommost = DfGetScreenHeight()-1;
+    int rightmost  = DfGetScreenWidth()-1;
     if (GetParent(wnd))    {
         bottommost = min(bottommost,
             GetClientBottom(GetParent(wnd)));
@@ -824,9 +824,9 @@ static DFRECT adjShadow(DFWINDOW wnd)
     DFRECT rc;
     rc = wnd->rc;
     if (TestAttribute(wnd, SHADOW))    {
-        if (RectRight(rc) < SCREENWIDTH-1)
-            RectRight(rc)++;           
-        if (RectBottom(rc) < SCREENHEIGHT-1)
+        if (RectRight(rc) < DfGetScreenWidth()-1)
+            RectRight(rc)++;
+        if (RectBottom(rc) < DfGetScreenHeight()-1)
             RectBottom(rc)++;
     }
     return rc;
index 4362369..b24726f 100644 (file)
@@ -8,31 +8,38 @@ static int py = -1;
 /* ------------ CREATE_WINDOW Message ------------- */
 static int CreateWindowMsg(DFWINDOW wnd)
 {
-    int rtn, adj;
-    ClearAttribute(wnd, HASTITLEBAR     |
-                        VSCROLLBAR     |
-                        MOVEABLE     |
-                        SIZEABLE     |
-                        HSCROLLBAR);
+       int rtn, adj;
+
+       ClearAttribute (wnd,
+                       HASTITLEBAR |
+                       VSCROLLBAR  |
+                       MOVEABLE    |
+                       SIZEABLE    |
+                       HSCROLLBAR);
+
        /* ------ adjust to keep popdown on screen ----- */
-       adj = SCREENHEIGHT-1-wnd->rc.bt;
-       if (adj < 0)    {
+       adj = DfGetScreenHeight()-1-wnd->rc.bt;
+       if (adj < 0)
+       {
                wnd->rc.tp += adj;
                wnd->rc.bt += adj;
        }
-       adj = SCREENWIDTH-1-wnd->rc.rt;
-       if (adj < 0)    {
+       adj = DfGetScreenWidth()-1-wnd->rc.rt;
+       if (adj < 0)
+       {
                wnd->rc.lf += adj;
                wnd->rc.rt += adj;
        }
-    rtn = BaseWndProc(POPDOWNMENU, wnd, CREATE_WINDOW, 0, 0);
-    DfSendMessage(wnd, CAPTURE_MOUSE, 0, 0);
-    DfSendMessage(wnd, CAPTURE_KEYBOARD, 0, 0);
-    DfSendMessage(NULL, SAVE_CURSOR, 0, 0);
-    DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
+
+       rtn = BaseWndProc(POPDOWNMENU, wnd, CREATE_WINDOW, 0, 0);
+       DfSendMessage(wnd, CAPTURE_MOUSE, 0, 0);
+       DfSendMessage(wnd, CAPTURE_KEYBOARD, 0, 0);
+       DfSendMessage(NULL, SAVE_CURSOR, 0, 0);
+       DfSendMessage(NULL, HIDE_CURSOR, 0, 0);
        wnd->oldFocus = inFocus;
        inFocus = wnd;
-    return rtn;
+
+       return rtn;
 }
 
 /* --------- LEFT_BUTTON Message --------- */
index 42773f8..de96a40 100644 (file)
@@ -18,7 +18,7 @@ Things that have to be fixed (incomplete list):
     collisions (e.g. CreateWindow() --> DfCreateWindow())
   - fix short dos filename buffers
   - add code to register external window classes
-  - implement recognition of current console screen size
+  - implement recognition of current console screen size (done)
   - fix remaining bugs
   - update documentation
 
index d58d4ba..15edfe7 100644 (file)
@@ -66,8 +66,8 @@ DFRECT ClientRect(void *wnd)
        {
                RectLeft(rc) = 1; // GetClientLeft((DFWINDOW)wnd);
                RectTop(rc) = 2; // GetClientTop((DFWINDOW)wnd);
-               RectRight(rc) = SCREENWIDTH - 2; // GetClientRight((DFWINDOW)wnd);
-               RectBottom(rc) = SCREENHEIGHT - 2; // GetClientBottom((DFWINDOW)wnd);
+               RectRight(rc) = DfGetScreenWidth () - 2; // GetClientRight((DFWINDOW)wnd);
+               RectBottom(rc) = DfGetScreenHeight () - 2; // GetClientBottom((DFWINDOW)wnd);
                return rc;
        }
 
@@ -95,8 +95,8 @@ DFRECT ClipRectangle(void *wnd, DFRECT rc)
 {
     DFRECT sr;
     RectLeft(sr) = RectTop(sr) = 0;
-    RectRight(sr) = SCREENWIDTH-1;
-    RectBottom(sr) = SCREENHEIGHT-1;
+    RectRight(sr) = DfGetScreenWidth()-1;
+    RectBottom(sr) = DfGetScreenHeight()-1;
     if (!TestAttribute((DFWINDOW)wnd, NOCLIP))
         while ((wnd = GetParent((DFWINDOW)wnd)) != NULL)
             rc = subRectangle(rc, ClientRect(wnd));
index a3e897b..00e4aaf 100644 (file)
@@ -53,10 +53,10 @@ void BuildSystemMenu(DFWINDOW wnd)
     ht = MenuHeight(SystemMenu.PullDown[0].Selections);
     wd = MenuWidth(SystemMenu.PullDown[0].Selections);
 
-    if (lf+wd > SCREENWIDTH-1)
-        lf = (SCREENWIDTH-1) - wd;
-    if (tp+ht > SCREENHEIGHT-2)
-        tp = (SCREENHEIGHT-2) - ht;
+    if (lf+wd > DfGetScreenWidth()-1)
+        lf = (DfGetScreenWidth()-1) - wd;
+    if (tp+ht > DfGetScreenHeight()-2)
+        tp = (DfGetScreenHeight()-2) - ht;
 
     SystemMenuWnd = DfCreateWindow(POPDOWNMENU, NULL,
                 lf,tp,ht,wd,NULL,wnd,SystemMenuProc, 0);
index 944dc7c..42136c1 100644 (file)
 #define ZEROFLAG 0x40
 #define MAXSAVES 50
 
-#define SCREENWIDTH  (80)
-#define SCREENHEIGHT (25)
+//#define SCREENWIDTH  (80)
+//#define SCREENHEIGHT (25)
+
+HANDLE hInput;
+HANDLE hOutput;
+
+SHORT sScreenHeight;
+SHORT sScreenWidth;
+
 
 /* ---------- keyboard prototypes -------- */
 int AltConvert(int);
@@ -34,7 +41,7 @@ void unhidecursor(void);
 void savecursor(void);
 void restorecursor(void);
 void normalcursor(void);
-void set_cursor_type(unsigned t);
+void set_cursor_size(unsigned t);
 void videomode(void);
 void SwapCursorStack(void);
 
index cc5fb7d..6e13bb1 100644 (file)
@@ -381,7 +381,7 @@ static void PaintMsg(DFWINDOW wnd, PARAM p1, PARAM p2)
                ClipString++;
 
     /* ----- blank line for padding ----- */
-    memset(blankline, ' ', SCREENWIDTH);
+    memset(blankline, ' ', DfGetScreenWidth());
     blankline[RectRight(rcc)+1] = '\0';
 
     /* ------- each line within rectangle ------ */
index 74385c9..5139840 100644 (file)
@@ -81,7 +81,7 @@ void PutVideoChar(int x, int y, int ch)
        COORD pos;
        DWORD dwWritten;
 
-       if (x < SCREENWIDTH && y < SCREENHEIGHT)
+       if (x < sScreenWidth && y < sScreenHeight)
        {
                pos.X = x;
                pos.Y = y;
@@ -141,7 +141,7 @@ BOOL CharInView(DFWINDOW wnd, int x, int y)
                }
                nwnd = NextWindow(nwnd);
        }
-       return (x1 < SCREENWIDTH && y1 < SCREENHEIGHT);
+       return (x1 < sScreenWidth && y1 < sScreenHeight);
 }
 
 /* -------- write a character to a window ------- */
@@ -180,7 +180,7 @@ void wputs(DFWINDOW wnd, void *s, int x, int y)
        int x2 = x1;
        int y1 = GetTop(wnd)+y;
 
-       if (x1 < SCREENWIDTH && y1 < SCREENHEIGHT && isVisible(wnd))
+       if (x1 < sScreenWidth && y1 < sScreenHeight && isVisible(wnd))
        {
                char ln[200];
                WORD attr[200];
@@ -223,8 +223,8 @@ void wputs(DFWINDOW wnd, void *s, int x, int y)
                foreground = fg;
                background = bg;
                len = (int)(cp-ln);
-               if (x1+len > SCREENWIDTH)
-                       len = SCREENWIDTH-x1;
+               if (x1+len > sScreenWidth)
+                       len = sScreenWidth-x1;
 
                if (!ClipString && !TestAttribute(wnd, NOCLIP))
                {
index 63d4bc0..8fa334d 100644 (file)
@@ -24,16 +24,16 @@ DFWINDOW DfCreateWindow(
         int base;
         /* ----- height, width = -1: fill the screen ------- */
         if (height == -1)
-            height = SCREENHEIGHT;
+            height = sScreenHeight;
         if (width == -1)
-            width = SCREENWIDTH;
+            width = sScreenWidth;
         /* ----- coordinates -1, -1 = center the window ---- */
         if (left == -1)
-            wnd->rc.lf = (SCREENWIDTH-width)/2;
+            wnd->rc.lf = (sScreenWidth-width)/2;
         else
             wnd->rc.lf = left;
         if (top == -1)
-            wnd->rc.tp = (SCREENHEIGHT-height)/2;
+            wnd->rc.tp = (sScreenHeight-height)/2;
         else
             wnd->rc.tp = top;
         wnd->attrib = attrib;
@@ -498,7 +498,9 @@ void PutWindowChar(DFWINDOW wnd, char c, int x, int y)
 
 void PutWindowLine(DFWINDOW wnd, void *s, int x, int y)
 {
-       int saved = FALSE, sv;
+       int saved = FALSE;
+       int sv = 0;
+
        if (x < ClientWidth(wnd) && y < ClientHeight(wnd))
        {
                char *en = (char *)s+ClientWidth(wnd)-x;