[PATCH 1/3] comctl32: Process WM_CHAR instead of WM_KEYDOWN for numbers in datetime.
Lei Zhang
thestig at google.com
Tue Nov 25 17:09:25 CST 2008
For users with different keyboard layouts, we should handle the
WM_CHAR (what they expect to see) rather than WM_KEYDOWN. (what the
key is on a standard US quarty keyboard)
-------------- next part --------------
From f260e0312963e51a2603b44f6e9e73c6615e00fd Mon Sep 17 00:00:00 2001
From: Lei Zhang <thestig at google.com>
Date: Tue, 25 Nov 2008 14:03:36 -0800
Subject: [PATCH 1/3] 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);
--
1.5.4.5
More information about the wine-patches
mailing list