From fd9ff56f6d366232289651fcd7ce389710ad515d Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 3 May 2006 10:35:11 +0000 Subject: [PATCH] - Bug 1451: Patch by Thomas Weidenmueller: System controls, such as comboboxes and listboxes are always unicode, even when created with CreateWindowExA. Therefore, ansi messages need to be converted to unicode and vice versa when sent to these windows. This patch fixes some(!) of these issues! Not all control messages are handled! svn path=/trunk/; revision=21780 --- reactos/dll/win32/user32/windows/message.c | 185 ++++++++++++++++-- .../subsystems/win32/win32k/ntuser/message.c | 16 +- 2 files changed, 177 insertions(+), 24 deletions(-) diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 276077788a7..51bfa418556 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -414,9 +414,44 @@ MsgiAnsiToUnicodeMessage(LPMSG UnicodeMsg, LPMSG AnsiMsg) case LB_ADDFILE: case EM_REPLACESEL: { - UNICODE_STRING UnicodeString; - RtlCreateUnicodeStringFromAsciiz(&UnicodeString, (LPSTR)AnsiMsg->lParam); - UnicodeMsg->lParam = (LPARAM)UnicodeString.Buffer; + goto ConvertLParamString; + } + + case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: + case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: + case LB_FINDSTRING: + case LB_FINDSTRINGEXACT: + case LB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) && + (dwStyle & LBS_HASSTRINGS)) + { + goto ConvertLParamString; + } + break; + } + + case CB_ADDSTRING: + case CB_INSERTSTRING: + case CB_FINDSTRING: + case CB_FINDSTRINGEXACT: + case CB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) && + (dwStyle & CBS_HASSTRINGS)) + { + UNICODE_STRING UnicodeString; + +ConvertLParamString: + RtlCreateUnicodeStringFromAsciiz(&UnicodeString, (LPSTR)AnsiMsg->lParam); + UnicodeMsg->lParam = (LPARAM)UnicodeString.Buffer; + } break; } @@ -501,12 +536,48 @@ MsgiAnsiToUnicodeCleanup(LPMSG UnicodeMsg, LPMSG AnsiMsg) case LB_ADDFILE: case EM_REPLACESEL: { - UNICODE_STRING UnicodeString; - RtlInitUnicodeString(&UnicodeString, (PCWSTR)UnicodeMsg->lParam); - RtlFreeUnicodeString(&UnicodeString); + goto FreeLParamString; + } + + case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: + case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: + case LB_FINDSTRING: + case LB_FINDSTRINGEXACT: + case LB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) && + (dwStyle & LBS_HASSTRINGS)) + { + goto FreeLParamString; + } break; } + case CB_ADDSTRING: + case CB_INSERTSTRING: + case CB_FINDSTRING: + case CB_FINDSTRINGEXACT: + case CB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) && + (dwStyle & CBS_HASSTRINGS)) + { + UNICODE_STRING UnicodeString; + +FreeLParamString: + RtlInitUnicodeString(&UnicodeString, (PCWSTR)UnicodeMsg->lParam); + RtlFreeUnicodeString(&UnicodeString); + } + break; + } + + case WM_NCCREATE: case WM_CREATE: { @@ -640,20 +711,58 @@ MsgiUnicodeToAnsiMessage(LPMSG AnsiMsg, LPMSG UnicodeMsg) break; } case WM_SETTEXT: + case CB_DIR: + case LB_DIR: + case LB_ADDFILE: { - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - RtlInitUnicodeString(&UnicodeString, (PWSTR) UnicodeMsg->lParam); - if (! NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiString, - &UnicodeString, - TRUE))) + goto ConvertLParamString; + } + + case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: + case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: + case LB_FINDSTRING: + case LB_FINDSTRINGEXACT: + case LB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) && + (dwStyle & LBS_HASSTRINGS)) { - return FALSE; + goto ConvertLParamString; } - AnsiMsg->lParam = (LPARAM) AnsiString.Buffer; break; - } - } + } + + case CB_ADDSTRING: + case CB_INSERTSTRING: + case CB_FINDSTRING: + case CB_FINDSTRINGEXACT: + case CB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) && + (dwStyle & CBS_HASSTRINGS)) + { + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + +ConvertLParamString: + RtlInitUnicodeString(&UnicodeString, (PWSTR) UnicodeMsg->lParam); + if (! NT_SUCCESS(RtlUnicodeStringToAnsiString(&AnsiString, + &UnicodeString, + TRUE))) + { + return FALSE; + } + AnsiMsg->lParam = (LPARAM) AnsiString.Buffer; + } + break; + } + } return TRUE; } @@ -671,10 +780,7 @@ MsgiUnicodeToAnsiCleanup(LPMSG AnsiMsg, LPMSG UnicodeMsg) } case WM_SETTEXT: { - ANSI_STRING AString; - RtlInitAnsiString(&AString, (PSTR) AnsiMsg->lParam); - RtlFreeAnsiString(&AString); - break; + goto FreeLParamString; } case WM_CREATE: case WM_NCCREATE: @@ -693,6 +799,45 @@ MsgiUnicodeToAnsiCleanup(LPMSG AnsiMsg, LPMSG UnicodeMsg) RtlFreeHeap(GetProcessHeap(), 0, Cs); break; } + + case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: + case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: + case LB_FINDSTRING: + case LB_FINDSTRINGEXACT: + case LB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) && + (dwStyle & LBS_HASSTRINGS)) + { + goto FreeLParamString; + } + break; + } + + case CB_ADDSTRING: + case CB_INSERTSTRING: + case CB_FINDSTRING: + case CB_FINDSTRINGEXACT: + case CB_SELECTSTRING: + { + DWORD dwStyle = GetWindowLongW(AnsiMsg->hwnd, GWL_STYLE); + if (!(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) && + (dwStyle & CBS_HASSTRINGS)) + { + ANSI_STRING AString; + +FreeLParamString: + RtlInitAnsiString(&AString, (PSTR) AnsiMsg->lParam); + RtlFreeAnsiString(&AString); + } + break; + } + } return TRUE; diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index b6005ca0e63..902861ec686 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -379,11 +379,15 @@ NtUserDispatchMessage(PNTUSERDISPATCHMESSAGEINFO UnsafeMsgInfo) MsgInfo.HandledByKernel = FALSE; Result = 0; - MsgInfo.Ansi = !Window->Unicode; if (Window->IsSystem) - MsgInfo.Proc = (Window->Unicode ? Window->WndProc : Window->WndProcExtra); + { + MsgInfo.Proc = (!MsgInfo.Ansi ? Window->WndProc : Window->WndProcExtra); + } else + { + MsgInfo.Ansi = !Window->Unicode; MsgInfo.Proc = Window->WndProc; + } } } } @@ -1565,11 +1569,15 @@ co_IntDoSendMessage(HWND hWnd, Info.Ansi = ! Window->Unicode; } - Info.Ansi = !Window->Unicode; if (Window->IsSystem) - Info.Proc = (Window->Unicode ? Window->WndProc : Window->WndProcExtra); + { + Info.Proc = (!Info.Ansi ? Window->WndProc : Window->WndProcExtra); + } else + { + Info.Ansi = !Window->Unicode; Info.Proc = Window->WndProc; + } } else { -- 2.17.1