Calc: Fixed Enter key
[reactos.git] / reactos / subsys / system / calc / winecalc.c
index ec521ee..55aa08f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h> // sprintf
 #include <math.h>
+#include <stdlib.h>
 
 #include <windows.h>
 #include <tchar.h>
@@ -269,6 +270,7 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
         }
 
         DestroyCalc( &calc );
+               DestroyMenus();
         PostQuitMessage( 0 );
         return 0;
 
@@ -469,7 +471,7 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
                 int len;
                 TCHAR *s;
                 HGLOBAL hGlobalMemory;
-                PSTR pGlobalMemory;
+                LPTSTR pGlobalMemory;
 
                 if (!(len = _tcslen(calc.display)))
                     return 0;
@@ -505,10 +507,10 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
         case TEXT('\x16'): // Ctrl+V Paste
             {
                 TCHAR *s;
-                int c;
+                TCHAR c;
                 int cmd = 0;
-                int size = 0;
-                int i = 0;
+                size_t size = 0;
+                size_t i = 0;
                 HGLOBAL hGlobalMemory;
                 LPTSTR pGlobalMemory;
 
@@ -2741,6 +2743,8 @@ void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT  *ps, CALC *calc, int object
     HFONT hFontOrg;
     HPEN hPen;
     HPEN hPenOrg;
+    HBRUSH hBrush;
+    HBRUSH hBrushOrg;
 
     TCHAR s2[CALC_BUF_SIZE];
 
@@ -2801,6 +2805,8 @@ void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT  *ps, CALC *calc, int object
 
     hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
     hPenOrg = SelectObject(hdc, hPen);
+    hBrush = GetSysColorBrush(COLOR_WINDOW);
+    hBrushOrg = SelectObject(hdc, hBrush);
 
     MoveToEx(hdc,
         WDISPLAY_LEFT - 1,
@@ -2814,6 +2820,7 @@ void DrawCalcText (HDC hdc, HDC hMemDC, PAINTSTRUCT  *ps, CALC *calc, int object
     Rectangle(hdc, WDISPLAY_LEFT, WDISPLAY_TOP, WDISPLAY_RIGHT, WDISPLAY_BOTTOM);
 
     SelectObject(hdc, hPenOrg);
+    SelectObject(hdc, hBrushOrg);
     DeleteObject(hPen);
 
     SetBkMode(hdc, TRANSPARENT);
@@ -2834,6 +2841,12 @@ void DestroyCalc (CALC *calc)
 {
     int i;
 
+    for (i=0;i<calc->numButtons;i++)
+        DestroyWindow(calc->cb[i].hBtn);
+}
+
+void DestroyMenus()
+{
     if (menus[MENU_STD] != 0)
         DestroyMenu(menus[MENU_STD]);
 
@@ -2842,9 +2855,6 @@ void DestroyCalc (CALC *calc)
 
     if (menus[MENU_SCIWS] != 0)
         DestroyMenu(menus[MENU_SCIWS]);
-
-    for (i=0;i<calc->numButtons;i++)
-        DestroyWindow(calc->cb[i].hBtn);
 }
 
 void calc_buffer_format(CALC *calc) {
@@ -2929,7 +2939,6 @@ void calc_buffer_format(CALC *calc) {
 void calc_buffer_display(CALC *calc) {
     TCHAR *p;
     TCHAR s[CALC_BUF_SIZE];
-    TCHAR r[CALC_BUF_SIZE] = TEXT("0");
     int point=0;
     calcfloat real;
 
@@ -2957,11 +2966,10 @@ void calc_buffer_display(CALC *calc) {
             else {
                 int i = 0;
                 int lz = 0;
-                calcfloat r;
                 int exp = 0;
 
-                r = calc_atof(calc->buffer, calc->numBase);
-                _stprintf(s, FMT_DESC_EXP, r);
+                real = calc_atof(calc->buffer, calc->numBase);
+                _stprintf(s, FMT_DESC_EXP, real);
                 // remove leading zeros in exponent
                 p = s;
                 while (*p) {
@@ -3017,13 +3025,11 @@ void calc_buffer_display(CALC *calc) {
             if (!point && calc->numBase == NBASE_DECIMAL)
                 _tcscat(s, TEXT("."));
 
-            if (*s == TEXT('.')) {
-                _tcscat(r, s);
-                _tcscpy(calc->display, r);
-            }
-            else {
-                _tcscpy(calc->display, s);
-            }
+            if (*s == TEXT('.'))
+                _tcscpy(calc->display, TEXT("0"));
+            else
+                calc->display[0] = 0;
+            _tcscat(calc->display, s);
         }
     }
     InvalidateRect(calc->hWnd, NULL, FALSE);
@@ -3073,7 +3079,7 @@ TCHAR *calc_sep(TCHAR *s)
         r[i++] = c;
         if (x++ % 3 == 0)
             r[i++] = TEXT(',');
-        if (n == -1)
+        if (n == 0)
             break;
     }
 
@@ -3406,12 +3412,11 @@ int parse(int wParam, int lParam)
                 else {
                     calc.memory = calc_atof(calc.buffer, calc.numBase);
                 }
+                return 0;
             }
-            return 0;
         }
-        break;
+        // fall through for Enter processing
 
-        // fall through for Enter processing ... but there is a bug here in Ctrl+M vs. Return
     case TEXT('='):
         {
             calcfloat r = calc.operand;