Lei Zhang : comctl32: Process WM_CHAR instead of WM_KEYDOWN for numbers in datetime.

Alexandre Julliard julliard at winehq.org
Wed Nov 26 07:32:35 CST 2008


Module: wine
Branch: master
Commit: 40bbe3da6ffd68f584b441069197584029a4fd63
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=40bbe3da6ffd68f584b441069197584029a4fd63

Author: Lei Zhang <thestig at google.com>
Date:   Tue Nov 25 14:03:36 2008 -0800

comctl32: Process WM_CHAR instead of WM_KEYDOWN for numbers in datetime.

---

 dlls/comctl32/datetime.c |  165 ++++++++++++++++++++++++---------------------
 1 files changed, 88 insertions(+), 77 deletions(-)

diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c
index 2d44540..e953178 100644
--- a/dlls/comctl32/datetime.c
+++ b/dlls/comctl32/datetime.c
@@ -902,83 +902,6 @@ DATETIME_KeyDown (DATETIME_INFO *infoPtr, DWORD vkCode)
 	FIXME ("Callbacks not implemented yet\n");
     }
 
-    if (vkCode >= '0' && vkCode <= '9') {
-        /* this is a somewhat simplified version of what Windows does */
-	SYSTEMTIME *date = &infoPtr->date;
-	switch (infoPtr->fieldspec[fieldNum]) {
-	    case ONEDIGITYEAR:
-	    case TWODIGITYEAR:
-	        date->wYear = date->wYear - (date->wYear%100) +
-	                (date->wYear%10)*10 + (vkCode-'0');
-	        date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
-	                date->wDay,date->wMonth,date->wYear);
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-            case INVALIDFULLYEAR:
-	    case FULLYEAR:
-	        date->wYear = (date->wYear%1000)*10 + (vkCode-'0');
-	        date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
-	                date->wDay,date->wMonth,date->wYear);
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGITMONTH:
-	    case TWODIGITMONTH:
-	        if ((date->wMonth%10) > 1 || (vkCode-'0') > 2)
-	            date->wMonth = vkCode-'0';
-	        else
-	            date->wMonth = (date->wMonth%10)*10+vkCode-'0';
-	        date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
-	                date->wDay,date->wMonth,date->wYear);
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGITDAY:
-	    case TWODIGITDAY:
-	        /* probably better checking here would help */
-	        if ((date->wDay%10) >= 3 && (vkCode-'0') > 1)
-	            date->wDay = vkCode-'0';
-	        else
-	            date->wDay = (date->wDay%10)*10+vkCode-'0';
-	        date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
-	                date->wDay,date->wMonth,date->wYear);
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGIT12HOUR:
-	    case TWODIGIT12HOUR:
-	        if ((date->wHour%10) > 1 || (vkCode-'0') > 2)
-	            date->wHour = vkCode-'0';
-	        else
-	            date->wHour = (date->wHour%10)*10+vkCode-'0';
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGIT24HOUR:
-	    case TWODIGIT24HOUR:
-	        if ((date->wHour%10) > 2)
-	            date->wHour = vkCode-'0';
-	        else if ((date->wHour%10) == 2 && (vkCode-'0') > 3)
-	            date->wHour = vkCode-'0';
-	        else
-	            date->wHour = (date->wHour%10)*10+vkCode-'0';
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGITMINUTE:
-	    case TWODIGITMINUTE:
-	        if ((date->wMinute%10) > 5)
-	            date->wMinute = vkCode-'0';
-	        else
-	            date->wMinute = (date->wMinute%10)*10+vkCode-'0';
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	    case ONEDIGITSECOND:
-	    case TWODIGITSECOND:
-	        if ((date->wSecond%10) > 5)
-	            date->wSecond = vkCode-'0';
-	        else
-	            date->wSecond = (date->wSecond%10)*10+vkCode-'0';
-	        DATETIME_SendDateTimeChangeNotify (infoPtr);
-	        break;
-	}
-    }
-    
     switch (vkCode) {
 	case VK_ADD:
     	case VK_UP:
@@ -1026,6 +949,91 @@ DATETIME_KeyDown (DATETIME_INFO *infoPtr, DWORD vkCode)
 
 
 static LRESULT
+DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode, LPARAM keyData)
+{
+    int fieldNum = infoPtr->select & DTHT_DATEFIELD;
+
+    if (vkCode >= '0' && vkCode <= '9') {
+        /* this is a somewhat simplified version of what Windows does */
+        SYSTEMTIME *date = &infoPtr->date;
+        switch (infoPtr->fieldspec[fieldNum]) {
+            case ONEDIGITYEAR:
+            case TWODIGITYEAR:
+                date->wYear = date->wYear - (date->wYear%100) +
+                        (date->wYear%10)*10 + (vkCode-'0');
+                date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
+                        date->wDay,date->wMonth,date->wYear);
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case INVALIDFULLYEAR:
+            case FULLYEAR:
+                date->wYear = (date->wYear%1000)*10 + (vkCode-'0');
+                date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
+                        date->wDay,date->wMonth,date->wYear);
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGITMONTH:
+            case TWODIGITMONTH:
+                if ((date->wMonth%10) > 1 || (vkCode-'0') > 2)
+                    date->wMonth = vkCode-'0';
+                else
+                    date->wMonth = (date->wMonth%10)*10+vkCode-'0';
+                date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
+                        date->wDay,date->wMonth,date->wYear);
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGITDAY:
+            case TWODIGITDAY:
+                /* probably better checking here would help */
+                if ((date->wDay%10) >= 3 && (vkCode-'0') > 1)
+                    date->wDay = vkCode-'0';
+                else
+                    date->wDay = (date->wDay%10)*10+vkCode-'0';
+                date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
+                        date->wDay,date->wMonth,date->wYear);
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGIT12HOUR:
+            case TWODIGIT12HOUR:
+                if ((date->wHour%10) > 1 || (vkCode-'0') > 2)
+                    date->wHour = vkCode-'0';
+                else
+                    date->wHour = (date->wHour%10)*10+vkCode-'0';
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGIT24HOUR:
+            case TWODIGIT24HOUR:
+                if ((date->wHour%10) > 2)
+                    date->wHour = vkCode-'0';
+                else if ((date->wHour%10) == 2 && (vkCode-'0') > 3)
+                    date->wHour = vkCode-'0';
+                else
+                    date->wHour = (date->wHour%10)*10+vkCode-'0';
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGITMINUTE:
+            case TWODIGITMINUTE:
+                if ((date->wMinute%10) > 5)
+                    date->wMinute = vkCode-'0';
+                else
+                    date->wMinute = (date->wMinute%10)*10+vkCode-'0';
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+            case ONEDIGITSECOND:
+            case TWODIGITSECOND:
+                if ((date->wSecond%10) > 5)
+                    date->wSecond = vkCode-'0';
+                else
+                    date->wSecond = (date->wSecond%10)*10+vkCode-'0';
+                DATETIME_SendDateTimeChangeNotify (infoPtr);
+                break;
+        }
+    }
+    return 0;
+}
+
+
+static LRESULT
 DATETIME_VScroll (DATETIME_INFO *infoPtr, WORD wScroll)
 {
     int fieldNum = infoPtr->select & DTHT_DATEFIELD;
@@ -1341,6 +1349,9 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
     case WM_KEYDOWN:
         return DATETIME_KeyDown (infoPtr, wParam);
 
+    case WM_CHAR:
+        return DATETIME_Char (infoPtr, wParam, lParam);
+
     case WM_KILLFOCUS:
         return DATETIME_KillFocus (infoPtr, (HWND)wParam);
 




More information about the wine-cvs mailing list