Module: wine Branch: master Commit: 40bbe3da6ffd68f584b441069197584029a4fd63 URL: http://source.winehq.org/git/wine.git/?a=commit;h=40bbe3da6ffd68f584b4410691...
Author: Lei Zhang thestig@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);