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
e6b97ce2
Commit
e6b97ce2
authored
May 23, 2006
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
user: Reuse the fast A->W function to implement the 16->32W case.
Get rid of the no longer needed 16->32W mapping functions.
parent
26e47761
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
17 additions
and
226 deletions
+17
-226
winproc.c
dlls/user/winproc.c
+17
-226
No files found.
dlls/user/winproc.c
View file @
e6b97ce2
...
...
@@ -78,25 +78,6 @@ static inline void free_buffer( void *static_buffer, void *buffer )
if
(
buffer
!=
static_buffer
)
HeapFree
(
GetProcessHeap
(),
0
,
buffer
);
}
/* map a 16-bit pointer to a Unicode string */
inline
static
LPWSTR
map_str_16_to_32W
(
SEGPTR
str
)
{
LPWSTR
ret
;
INT
len
;
if
(
!
HIWORD
(
str
))
return
(
LPWSTR
)(
ULONG_PTR
)
LOWORD
(
str
);
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
MapSL
(
str
),
-
1
,
NULL
,
0
);
if
((
ret
=
HeapAlloc
(
GetProcessHeap
(),
0
,
len
*
sizeof
(
WCHAR
)
)))
MultiByteToWideChar
(
CP_ACP
,
0
,
MapSL
(
str
),
-
1
,
ret
,
len
);
return
ret
;
}
/* unmap a 16-bit pointer that was converted to a Unicode string */
inline
static
void
unmap_str_16_to_32W
(
LPCWSTR
str
)
{
if
(
HIWORD
(
str
))
HeapFree
(
GetProcessHeap
(),
0
,
(
void
*
)
str
);
}
/* find an existing winproc for a given 16-bit function and type */
/* FIXME: probably should do something more clever than a linear search */
static
inline
WINDOWPROC
*
find_winproc16
(
WNDPROC16
func
)
...
...
@@ -568,6 +549,20 @@ static LRESULT call_dialog_proc_Ato16( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp
return
WINPROC_CallProc32ATo16
(
call_dialog_proc16
,
hwnd
,
msg
,
wp
,
lp
,
result
,
arg
);
}
/* helper callback for 16->32W conversion */
static
LRESULT
call_window_proc_AtoW
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wp
,
LPARAM
lp
,
LRESULT
*
result
,
void
*
arg
)
{
return
WINPROC_CallProcAtoW
(
call_window_proc
,
hwnd
,
msg
,
wp
,
lp
,
result
,
arg
);
}
/* helper callback for 16->32W conversion */
static
LRESULT
call_dialog_proc_AtoW
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wp
,
LPARAM
lp
,
LRESULT
*
result
,
void
*
arg
)
{
return
WINPROC_CallProcAtoW
(
call_dialog_proc
,
hwnd
,
msg
,
wp
,
lp
,
result
,
arg
);
}
/**********************************************************************
* WINPROC_GetProc16
...
...
@@ -1181,166 +1176,6 @@ static LRESULT WINPROC_UnmapMsg16To32A( HWND hwnd, UINT msg, WPARAM wParam, LPAR
}
/**********************************************************************
* WINPROC_MapMsg16To32W
*
* Map a message from 16- to 32-bit Unicode.
* Return value is -1 on error, 0 if OK, 1 if an UnmapMsg call is needed.
*/
static
INT
WINPROC_MapMsg16To32W
(
HWND
hwnd
,
UINT16
msg16
,
WPARAM16
wParam16
,
UINT
*
pmsg32
,
WPARAM
*
pwparam32
,
LPARAM
*
plparam
)
{
*
pmsg32
=
(
UINT
)
msg16
;
*
pwparam32
=
(
WPARAM
)
wParam16
;
switch
(
msg16
)
{
case
WM_NCCREATE
:
case
WM_CREATE
:
{
CREATESTRUCT16
*
cs16
=
MapSL
(
*
plparam
);
CREATESTRUCTW
*
cs
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
cs
)
+
sizeof
(
LPARAM
)
);
if
(
!
cs
)
return
-
1
;
CREATESTRUCT16to32A
(
cs16
,
(
CREATESTRUCTA
*
)
cs
);
cs
->
lpszName
=
map_str_16_to_32W
(
cs16
->
lpszName
);
cs
->
lpszClass
=
map_str_16_to_32W
(
cs16
->
lpszClass
);
if
(
GetWindowLongW
(
hwnd
,
GWL_EXSTYLE
)
&
WS_EX_MDICHILD
)
{
MDICREATESTRUCT16
*
mdi_cs16
;
MDICREATESTRUCTW
*
mdi_cs
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
mdi_cs
));
if
(
!
mdi_cs
)
{
HeapFree
(
GetProcessHeap
(),
0
,
cs
);
return
-
1
;
}
mdi_cs16
=
(
MDICREATESTRUCT16
*
)
MapSL
(
cs16
->
lpCreateParams
);
MDICREATESTRUCT16to32A
(
mdi_cs16
,
(
MDICREATESTRUCTA
*
)
mdi_cs
);
mdi_cs
->
szTitle
=
map_str_16_to_32W
(
mdi_cs16
->
szTitle
);
mdi_cs
->
szClass
=
map_str_16_to_32W
(
mdi_cs16
->
szClass
);
cs
->
lpCreateParams
=
mdi_cs
;
}
*
(
LPARAM
*
)(
cs
+
1
)
=
*
plparam
;
/* Store the previous lParam */
*
plparam
=
(
LPARAM
)
cs
;
}
return
1
;
case
WM_MDICREATE
:
{
MDICREATESTRUCT16
*
cs16
=
MapSL
(
*
plparam
);
MDICREATESTRUCTW
*
cs
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
cs
)
+
sizeof
(
LPARAM
)
);
if
(
!
cs
)
return
-
1
;
MDICREATESTRUCT16to32A
(
cs16
,
(
MDICREATESTRUCTA
*
)
cs
);
cs
->
szTitle
=
map_str_16_to_32W
(
cs16
->
szTitle
);
cs
->
szClass
=
map_str_16_to_32W
(
cs16
->
szClass
);
*
(
LPARAM
*
)(
cs
+
1
)
=
*
plparam
;
/* Store the previous lParam */
*
plparam
=
(
LPARAM
)
cs
;
}
return
1
;
case
WM_GETDLGCODE
:
if
(
*
plparam
)
{
LPMSG16
msg16
=
MapSL
(
*
plparam
);
LPMSG
msg32
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
MSG
)
);
if
(
!
msg32
)
return
-
1
;
msg32
->
hwnd
=
WIN_Handle32
(
msg16
->
hwnd
);
msg32
->
message
=
msg16
->
message
;
msg32
->
wParam
=
msg16
->
wParam
;
msg32
->
lParam
=
msg16
->
lParam
;
msg32
->
time
=
msg16
->
time
;
msg32
->
pt
.
x
=
msg16
->
pt
.
x
;
msg32
->
pt
.
y
=
msg16
->
pt
.
y
;
switch
(
msg32
->
message
)
{
case
WM_CHAR
:
case
WM_DEADCHAR
:
case
WM_SYSCHAR
:
case
WM_SYSDEADCHAR
:
msg32
->
wParam
=
map_wparam_char_AtoW
(
msg16
->
wParam
,
1
);
break
;
}
*
plparam
=
(
LPARAM
)
msg32
;
return
1
;
}
else
return
0
;
case
WM_CHARTOITEM
:
*
pwparam32
=
MAKEWPARAM
(
map_wparam_char_AtoW
(
wParam16
,
1
),
HIWORD
(
*
plparam
)
);
*
plparam
=
(
LPARAM
)
WIN_Handle32
(
LOWORD
(
*
plparam
)
);
return
0
;
case
WM_MENUCHAR
:
*
pwparam32
=
MAKEWPARAM
(
map_wparam_char_AtoW
(
wParam16
,
1
),
LOWORD
(
*
plparam
)
);
*
plparam
=
(
LPARAM
)
HMENU_32
(
HIWORD
(
*
plparam
));
return
0
;
case
WM_CHAR
:
case
WM_DEADCHAR
:
case
WM_SYSCHAR
:
case
WM_SYSDEADCHAR
:
*
pwparam32
=
map_wparam_char_AtoW
(
wParam16
,
1
);
return
0
;
case
WM_IME_CHAR
:
*
pwparam32
=
map_wparam_char_AtoW
(
wParam16
,
2
);
return
0
;
default:
/* No Unicode translation needed */
return
WINPROC_MapMsg16To32A
(
hwnd
,
msg16
,
wParam16
,
pmsg32
,
pwparam32
,
plparam
);
}
}
/**********************************************************************
* WINPROC_UnmapMsg16To32W
*
* Unmap a message that was mapped from 16- to 32-bit Unicode.
*/
static
LRESULT
WINPROC_UnmapMsg16To32W
(
HWND
hwnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
,
LRESULT
result
)
{
switch
(
msg
)
{
case
WM_NCCREATE
:
case
WM_CREATE
:
{
CREATESTRUCTW
*
cs
=
(
CREATESTRUCTW
*
)
lParam
;
lParam
=
*
(
LPARAM
*
)(
cs
+
1
);
CREATESTRUCT32Ato16
(
(
CREATESTRUCTA
*
)
cs
,
MapSL
(
lParam
)
);
unmap_str_16_to_32W
(
cs
->
lpszName
);
unmap_str_16_to_32W
(
cs
->
lpszClass
);
if
(
GetWindowLongW
(
hwnd
,
GWL_EXSTYLE
)
&
WS_EX_MDICHILD
)
{
MDICREATESTRUCTW
*
mdi_cs
=
(
MDICREATESTRUCTW
*
)
cs
->
lpCreateParams
;
unmap_str_16_to_32W
(
mdi_cs
->
szTitle
);
unmap_str_16_to_32W
(
mdi_cs
->
szClass
);
HeapFree
(
GetProcessHeap
(),
0
,
cs
->
lpCreateParams
);
}
HeapFree
(
GetProcessHeap
(),
0
,
cs
);
}
break
;
case
WM_MDICREATE
:
{
MDICREATESTRUCTW
*
cs
=
(
MDICREATESTRUCTW
*
)
lParam
;
lParam
=
*
(
LPARAM
*
)(
cs
+
1
);
MDICREATESTRUCT32Ato16
(
(
MDICREATESTRUCTA
*
)
cs
,
MapSL
(
lParam
)
);
unmap_str_16_to_32W
(
cs
->
szTitle
);
unmap_str_16_to_32W
(
cs
->
szClass
);
HeapFree
(
GetProcessHeap
(),
0
,
cs
);
}
break
;
case
WM_GETDLGCODE
:
if
(
lParam
)
{
LPMSG
msg32
=
(
LPMSG
)
lParam
;
HeapFree
(
GetProcessHeap
(),
0
,
msg32
);
}
break
;
default:
return
WINPROC_UnmapMsg16To32A
(
hwnd
,
msg
,
wParam
,
lParam
,
result
);
}
return
result
;
}
static
HANDLE16
convert_handle_32_to_16
(
UINT
src
,
unsigned
int
flags
)
{
HANDLE16
dst
;
...
...
@@ -2660,50 +2495,6 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1
/**********************************************************************
* WINPROC_CallProc16To32W
*/
static
LRESULT
WINPROC_CallProc16To32W
(
winproc_callback_t
callback
,
HWND16
hwnd
,
UINT16
msg
,
WPARAM16
wParam
,
LPARAM
lParam
,
LRESULT
*
result
,
void
*
arg
)
{
LRESULT
ret
;
UINT
msg32
;
WPARAM
wParam32
;
HWND
hwnd32
=
WIN_Handle32
(
hwnd
);
TRACE_
(
msg
)(
"(hwnd=%p,msg=%s,wp=%08x,lp=%08lx)
\n
"
,
hwnd32
,
SPY_GetMsgName
(
msg
,
hwnd32
),
wParam
,
lParam
);
switch
(
msg
)
{
case
WM_GETTEXT
:
case
WM_ASKCBFORMATNAME
:
case
WM_SETTEXT
:
case
WM_WININICHANGE
:
case
WM_DEVMODECHANGE
:
case
CB_DIR
:
case
LB_DIR
:
case
LB_ADDFILE
:
case
EM_REPLACESEL
:
ret
=
WINPROC_CallProcAtoW
(
callback
,
hwnd32
,
msg
,
wParam
,
(
LPARAM
)
MapSL
(
lParam
),
result
,
arg
);
break
;
case
WM_GETTEXTLENGTH
:
case
CB_GETLBTEXTLEN
:
case
LB_GETTEXTLEN
:
ret
=
WINPROC_CallProcAtoW
(
callback
,
hwnd32
,
msg
,
wParam
,
lParam
,
result
,
arg
);
break
;
default:
if
(
WINPROC_MapMsg16To32W
(
hwnd32
,
msg
,
wParam
,
&
msg32
,
&
wParam32
,
&
lParam
)
==
-
1
)
return
0
;
ret
=
callback
(
hwnd32
,
msg32
,
wParam32
,
lParam
,
result
,
arg
);
*
result
=
WINPROC_UnmapMsg16To32W
(
hwnd32
,
msg32
,
wParam32
,
lParam
,
*
result
);
}
return
ret
;
}
/**********************************************************************
* __wine_call_wndproc (USER.1010)
*/
LRESULT
WINAPI
__wine_call_wndproc
(
HWND16
hwnd
,
UINT16
msg
,
WPARAM16
wParam
,
LPARAM
lParam
,
...
...
@@ -2714,7 +2505,7 @@ LRESULT WINAPI __wine_call_wndproc( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LP
if
(
proc
->
procA
)
WINPROC_CallProc16To32A
(
call_window_proc
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procA
);
else
WINPROC_CallProc16To32
W
(
call_window_proc
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procW
);
WINPROC_CallProc16To32
A
(
call_window_proc_AtoW
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procW
);
return
result
;
}
...
...
@@ -2760,7 +2551,7 @@ LRESULT WINAPI CallWindowProc16( WNDPROC16 func, HWND16 hwnd, UINT16 msg,
else
if
(
proc
->
procA
)
WINPROC_CallProc16To32A
(
call_window_proc
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procA
);
else
if
(
proc
->
procW
)
WINPROC_CallProc16To32
W
(
call_window_proc
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procW
);
WINPROC_CallProc16To32
A
(
call_window_proc_AtoW
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procW
);
else
call_window_proc16
(
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
proc16
);
...
...
@@ -2864,7 +2655,7 @@ INT_PTR WINPROC_CallDlgProc16( DLGPROC16 func, HWND16 hwnd, UINT16 msg, WPARAM16
}
else
if
(
proc
->
procW
)
{
ret
=
WINPROC_CallProc16To32
W
(
call_dialog_proc
,
hwnd
,
msg
,
wParam
,
lParam
,
ret
=
WINPROC_CallProc16To32
A
(
call_dialog_proc_AtoW
,
hwnd
,
msg
,
wParam
,
lParam
,
&
result
,
proc
->
procW
);
SetWindowLongPtrW
(
WIN_Handle32
(
hwnd
),
DWLP_MSGRESULT
,
result
);
}
...
...
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