Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
7686aa86
Commit
7686aa86
authored
Oct 18, 2005
by
Frank Richter
Committed by
Alexandre Julliard
Oct 18, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
When doing A->W WM_GETTEXTLENGTH, use WM_GETTEXT behind the scenes to
obtain an exact length.
parent
7886cacb
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
129 additions
and
15 deletions
+129
-15
message.c
dlls/user/message.c
+1
-1
msg16.c
dlls/user/msg16.c
+2
-1
msg.c
dlls/user/tests/msg.c
+90
-3
winproc.c
dlls/user/winproc.c
+32
-8
winproc.h
dlls/user/winproc.h
+4
-2
No files found.
dlls/user/message.c
View file @
7686aa86
...
...
@@ -2410,7 +2410,7 @@ LRESULT WINAPI SendMessageTimeoutA( HWND hwnd, UINT msg, WPARAM wparam, LPARAM l
return
0
;
ret
=
send_inter_thread_message
(
dest_tid
,
&
info
,
&
result
);
result
=
WINPROC_UnmapMsg32ATo32W
(
info
.
hwnd
,
info
.
msg
,
info
.
wparam
,
info
.
lparam
,
result
);
info
.
lparam
,
result
,
NULL
);
}
else
ret
=
send_inter_thread_message
(
dest_tid
,
&
info
,
&
result
);
}
...
...
dlls/user/msg16.c
View file @
7686aa86
...
...
@@ -75,7 +75,8 @@ LRESULT WINAPI SendMessage16( HWND16 hwnd16, UINT16 msg, WPARAM16 wparam, LPARAM
if
(
WINPROC_MapMsg16To32W
(
hwnd
,
msg
,
wparam
,
&
msg32
,
&
wparam32
,
&
lparam
)
==
-
1
)
return
0
;
result
=
WINPROC_UnmapMsg16To32W
(
hwnd
,
msg32
,
wparam32
,
lparam
,
SendMessageW
(
hwnd
,
msg32
,
wparam32
,
lparam
)
);
SendMessageW
(
hwnd
,
msg32
,
wparam32
,
lparam
),
NULL
);
}
return
result
;
}
...
...
dlls/user/tests/msg.c
View file @
7686aa86
...
...
@@ -30,6 +30,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
#include "winnls.h"
#include "wine/test.h"
...
...
@@ -4535,7 +4536,8 @@ static void test_accelerators(void)
/************* window procedures ********************/
static
LRESULT
WINAPI
MsgCheckProcA
(
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
static
LRESULT
MsgCheckProc
(
BOOL
unicode
,
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
static
long
defwndproc_counter
=
0
;
static
long
beginpaint_counter
=
0
;
...
...
@@ -4672,12 +4674,23 @@ static LRESULT WINAPI MsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPAR
}
defwndproc_counter
++
;
ret
=
DefWindowProcA
(
hwnd
,
message
,
wParam
,
lParam
);
ret
=
unicode
?
DefWindowProcW
(
hwnd
,
message
,
wParam
,
lParam
)
:
DefWindowProcA
(
hwnd
,
message
,
wParam
,
lParam
);
defwndproc_counter
--
;
return
ret
;
}
static
LRESULT
WINAPI
MsgCheckProcA
(
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
return
MsgCheckProc
(
FALSE
,
hwnd
,
message
,
wParam
,
lParam
);
}
static
LRESULT
WINAPI
MsgCheckProcW
(
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
return
MsgCheckProc
(
TRUE
,
hwnd
,
message
,
wParam
,
lParam
);
}
static
LRESULT
WINAPI
PopupMsgCheckProcA
(
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
static
long
defwndproc_counter
=
0
;
...
...
@@ -5020,6 +5033,32 @@ static LRESULT CALLBACK MsgConversionProcW(HWND hwnd, UINT uMsg, WPARAM wParam,
return
DefWindowProcW
(
hwnd
,
uMsg
,
wParam
,
lParam
);
}
static
const
struct
message
WmGetTextLengthAfromW
[]
=
{
{
WM_GETTEXTLENGTH
,
sent
},
{
WM_GETTEXT
,
sent
},
{
0
}
};
static
const
WCHAR
testWindowClassW
[]
=
{
'T'
,
'e'
,
's'
,
't'
,
'W'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
'C'
,
'l'
,
'a'
,
's'
,
's'
,
'W'
,
0
};
static
const
WCHAR
dummy_window_text
[]
=
{
'd'
,
'u'
,
'm'
,
'm'
,
'y'
,
' '
,
't'
,
'e'
,
'x'
,
't'
,
0
};
/* dummy window proc for WM_GETTEXTLENGTH test */
static
LRESULT
CALLBACK
get_text_len_proc
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wp
,
LPARAM
lp
)
{
switch
(
msg
)
{
case
WM_GETTEXTLENGTH
:
return
lstrlenW
(
dummy_window_text
)
+
37
;
/* some random length */
case
WM_GETTEXT
:
lstrcpynW
(
(
LPWSTR
)
lp
,
dummy_window_text
,
wp
);
return
lstrlenW
(
(
LPWSTR
)
lp
);
default:
return
DefWindowProcW
(
hwnd
,
msg
,
wp
,
lp
);
}
}
static
void
test_message_conversion
(
void
)
{
static
const
WCHAR
wszMsgConversionClass
[]
=
...
...
@@ -5027,7 +5066,8 @@ static void test_message_conversion(void)
WNDCLASSW
cls
;
LRESULT
lRes
;
HWND
hwnd
;
WNDPROC
wndproc
;
WNDPROC
wndproc
,
newproc
;
BOOL
ret
;
cls
.
style
=
0
;
cls
.
lpfnWndProc
=
MsgConversionProcW
;
...
...
@@ -5043,6 +5083,18 @@ static void test_message_conversion(void)
* meaningless on those platforms */
if
(
!
RegisterClassW
(
&
cls
))
return
;
cls
.
style
=
0
;
cls
.
lpfnWndProc
=
MsgCheckProcW
;
cls
.
cbClsExtra
=
0
;
cls
.
cbWndExtra
=
0
;
cls
.
hInstance
=
GetModuleHandleW
(
0
);
cls
.
hIcon
=
0
;
cls
.
hCursor
=
LoadCursorW
(
0
,
(
LPWSTR
)
IDC_ARROW
);
cls
.
hbrBackground
=
GetStockObject
(
WHITE_BRUSH
);
cls
.
lpszMenuName
=
NULL
;
cls
.
lpszClassName
=
testWindowClassW
;
if
(
!
RegisterClassW
(
&
cls
))
return
;
hwnd
=
CreateWindowExW
(
0
,
wszMsgConversionClass
,
NULL
,
WS_OVERLAPPED
,
100
,
100
,
200
,
200
,
0
,
0
,
0
,
NULL
);
ok
(
hwnd
!=
NULL
,
"Window creation failed
\n
"
);
...
...
@@ -5104,6 +5156,41 @@ static void test_message_conversion(void)
lRes
=
SendMessageCallbackW
(
hwnd
,
CB_FINDSTRINGEXACT
,
0
,
(
LPARAM
)
wszUnicode
,
NULL
,
0
);
ok
(
lRes
==
0
&&
(
GetLastError
()
==
ERROR_MESSAGE_SYNC_ONLY
||
GetLastError
()
==
ERROR_INVALID_PARAMETER
),
"SendMessageCallback on sync only message returned %ld, last error %ld
\n
"
,
lRes
,
GetLastError
());
/* Check WM_GETTEXTLENGTH A->W behaviour, whether WM_GETTEXT is also sent or not */
hwnd
=
CreateWindowW
(
testWindowClassW
,
wszUnicode
,
WS_OVERLAPPEDWINDOW
,
100
,
100
,
200
,
200
,
0
,
0
,
0
,
NULL
);
assert
(
hwnd
);
flush_sequence
();
lRes
=
SendMessageA
(
hwnd
,
WM_GETTEXTLENGTH
,
0
,
0
);
ok_sequence
(
WmGetTextLengthAfromW
,
"ANSI WM_GETTEXTLENGTH to Unicode window"
,
FALSE
);
ok
(
lRes
==
WideCharToMultiByte
(
CP_ACP
,
0
,
wszUnicode
,
lstrlenW
(
wszUnicode
),
NULL
,
0
,
NULL
,
NULL
),
"got bad length %ld
\n
"
,
lRes
);
flush_sequence
();
lRes
=
CallWindowProcA
(
(
WNDPROC
)
GetWindowLongPtrA
(
hwnd
,
GWLP_WNDPROC
),
hwnd
,
WM_GETTEXTLENGTH
,
0
,
0
);
ok_sequence
(
WmGetTextLengthAfromW
,
"ANSI WM_GETTEXTLENGTH to Unicode window"
,
FALSE
);
ok
(
lRes
==
WideCharToMultiByte
(
CP_ACP
,
0
,
wszUnicode
,
lstrlenW
(
wszUnicode
),
NULL
,
0
,
NULL
,
NULL
),
"got bad length %ld
\n
"
,
lRes
);
wndproc
=
(
WNDPROC
)
SetWindowLongPtrW
(
hwnd
,
GWLP_WNDPROC
,
(
LONG_PTR
)
get_text_len_proc
);
newproc
=
(
WNDPROC
)
GetWindowLongPtrA
(
hwnd
,
GWLP_WNDPROC
);
lRes
=
CallWindowProcA
(
newproc
,
hwnd
,
WM_GETTEXTLENGTH
,
0
,
0
);
ok
(
lRes
==
WideCharToMultiByte
(
CP_ACP
,
0
,
dummy_window_text
,
lstrlenW
(
dummy_window_text
),
NULL
,
0
,
NULL
,
NULL
),
"got bad length %ld
\n
"
,
lRes
);
SetWindowLongPtrW
(
hwnd
,
GWLP_WNDPROC
,
(
LONG_PTR
)
wndproc
);
/* restore old wnd proc */
lRes
=
CallWindowProcA
(
newproc
,
hwnd
,
WM_GETTEXTLENGTH
,
0
,
0
);
ok
(
lRes
==
WideCharToMultiByte
(
CP_ACP
,
0
,
dummy_window_text
,
lstrlenW
(
dummy_window_text
),
NULL
,
0
,
NULL
,
NULL
),
"got bad length %ld
\n
"
,
lRes
);
ret
=
DestroyWindow
(
hwnd
);
ok
(
ret
,
"DestroyWindow() error %ld
\n
"
,
GetLastError
());
}
typedef
struct
_thread_info
...
...
dlls/user/winproc.c
View file @
7686aa86
...
...
@@ -846,7 +846,7 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plpara
* Unmap a message that was mapped from Ansi to Unicode.
*/
LRESULT
WINPROC_UnmapMsg32ATo32W
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
)
LRESULT
result
,
WNDPROC
dispatch
)
{
switch
(
msg
)
{
...
...
@@ -868,8 +868,31 @@ LRESULT WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
case
WM_GETTEXTLENGTH
:
case
CB_GETLBTEXTLEN
:
case
LB_GETTEXTLEN
:
/* there may be one DBCS char for each Unicode char */
return
result
*
2
;
if
(
result
>=
0
)
{
/* Determine respective GETTEXT message */
UINT
msgGetText
=
(
msg
==
WM_GETTEXTLENGTH
)
?
WM_GETTEXT
:
((
msg
==
CB_GETLBTEXTLEN
)
?
CB_GETLBTEXT
:
LB_GETTEXT
);
/* wParam differs between the messages */
WPARAM
wp
=
(
msg
==
WM_GETTEXTLENGTH
)
?
(
WPARAM
)(
result
+
1
)
:
wParam
;
WCHAR
*
p
=
HeapAlloc
(
GetProcessHeap
(),
0
,
(
result
+
1
)
*
sizeof
(
WCHAR
));
if
(
p
)
{
LRESULT
n
;
if
(
dispatch
)
n
=
WINPROC_CallWndProc
(
dispatch
,
hwnd
,
msgGetText
,
wp
,
(
LPARAM
)
p
);
else
n
=
SendMessageW
(
hwnd
,
msgGetText
,
wp
,
(
LPARAM
)
p
);
result
=
WideCharToMultiByte
(
CP_ACP
,
0
,
p
,
n
,
NULL
,
0
,
0
,
NULL
);
HeapFree
(
GetProcessHeap
(),
0
,
p
);
}
}
break
;
case
WM_NCCREATE
:
case
WM_CREATE
:
{
...
...
@@ -1854,7 +1877,7 @@ INT WINPROC_MapMsg16To32W( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UINT *pms
* Unmap a message that was mapped from 16- to 32-bit Unicode.
*/
LRESULT
WINPROC_UnmapMsg16To32W
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
)
LRESULT
result
,
WNDPROC
dispatch
)
{
switch
(
msg
)
{
...
...
@@ -1864,7 +1887,7 @@ LRESULT WINPROC_UnmapMsg16To32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
case
CB_GETLBTEXTLEN
:
case
LB_GETTEXTLEN
:
case
WM_ASKCBFORMATNAME
:
return
WINPROC_UnmapMsg32ATo32W
(
hwnd
,
msg
,
wParam
,
lParam
,
result
);
return
WINPROC_UnmapMsg32ATo32W
(
hwnd
,
msg
,
wParam
,
lParam
,
result
,
dispatch
);
case
WM_NCCREATE
:
case
WM_CREATE
:
{
...
...
@@ -1900,7 +1923,7 @@ LRESULT WINPROC_UnmapMsg16To32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPar
LPMSG
msg32
=
(
LPMSG
)
lParam
;
WINPROC_UnmapMsg16To32W
(
hwnd
,
msg32
->
message
,
msg32
->
wParam
,
msg32
->
lParam
,
result
);
result
,
dispatch
);
HeapFree
(
GetProcessHeap
(),
0
,
msg32
);
}
break
;
...
...
@@ -2955,7 +2978,7 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC func, HWND hwnd,
return
0
;
}
result
=
WINPROC_CallWndProc
(
func
,
hwnd
,
msg
,
wParam
,
lParam
);
if
(
unmap
)
result
=
WINPROC_UnmapMsg32ATo32W
(
hwnd
,
msg
,
wParam
,
lParam
,
result
);
if
(
unmap
)
result
=
WINPROC_UnmapMsg32ATo32W
(
hwnd
,
msg
,
wParam
,
lParam
,
result
,
func
);
return
result
;
}
...
...
@@ -3099,7 +3122,8 @@ LRESULT WINAPI __wine_call_wndproc_32W( HWND16 hwnd, UINT16 msg, WPARAM16 wPara
if
(
WINPROC_MapMsg16To32W
(
hwnd32
,
msg
,
wParam
,
&
msg32
,
&
wParam32
,
&
lParam
)
==
-
1
)
return
0
;
result
=
WINPROC_CallWndProc
(
func
,
hwnd32
,
msg32
,
wParam32
,
lParam
);
return
WINPROC_UnmapMsg16To32W
(
hwnd32
,
msg32
,
wParam32
,
lParam
,
result
);
return
WINPROC_UnmapMsg16To32W
(
hwnd32
,
msg32
,
wParam32
,
lParam
,
result
,
func
);
}
...
...
dlls/user/winproc.h
View file @
7686aa86
...
...
@@ -71,11 +71,13 @@ extern INT WINPROC_MapMsg32WTo16( HWND hwnd, UINT msg32,
WPARAM
wParam32
,
UINT16
*
pmsg16
,
WPARAM16
*
pwparam16
,
LPARAM
*
plparam
);
extern
LRESULT
WINPROC_UnmapMsg32ATo32W
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
);
LPARAM
lParam
,
LRESULT
result
,
WNDPROC
dispatch
);
extern
LRESULT
WINPROC_UnmapMsg16To32A
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
);
extern
LRESULT
WINPROC_UnmapMsg16To32W
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
);
LPARAM
lParam
,
LRESULT
result
,
WNDPROC
dispatch
);
extern
void
WINPROC_UnmapMsg32ATo16
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
MSGPARAM16
*
pm16
);
extern
void
WINPROC_UnmapMsg32WTo16
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment