Added mappings for a few messages.
Added unicode messages bit set to shortcut message mapping when
possible.
diff --git a/dlls/user/message.c b/dlls/user/message.c
index 13ab74e..f55967d 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -9,6 +9,7 @@
#include "winuser.h"
#include "winerror.h"
#include "winnls.h"
+#include "dde.h"
#include "wine/unicode.h"
#include "wine/server.h"
#include "queue.h"
@@ -58,98 +59,146 @@
};
-
/* flag for messages that contain pointers */
-/* 16 messages per entry, messages 0..15 map to bits 0..15 */
+/* 32 messages per entry, messages 0..31 map to bits 0..31 */
-#define SET(msg) (1 << ((msg) & 15))
+#define SET(msg) (1 << ((msg) & 31))
-static const unsigned short message_pointer_flags[] =
+static const unsigned int message_pointer_flags[] =
{
- /* 0x00 - 0x0f */
- SET(WM_CREATE) | SET(WM_GETTEXT) | SET(WM_SETTEXT),
- /* 0x10 - 0x1f */
- SET(WM_WININICHANGE),
- /* 0x20 - 0x2f */
- SET(WM_GETMINMAXINFO) | SET(WM_DRAWITEM) | SET(WM_MEASUREITEM) | SET(WM_DELETEITEM),
- /* 0x30 - 0x3f */
+ /* 0x00 - 0x1f */
+ SET(WM_CREATE) | SET(WM_SETTEXT) | SET(WM_GETTEXT) |
+ SET(WM_WININICHANGE) | SET(WM_DEVMODECHANGE),
+ /* 0x20 - 0x3f */
+ SET(WM_GETMINMAXINFO) | SET(WM_DRAWITEM) | SET(WM_MEASUREITEM) | SET(WM_DELETEITEM) |
SET(WM_COMPAREITEM),
- /* 0x40 - 0x4f */
- SET(WM_WINDOWPOSCHANGING) | SET(WM_WINDOWPOSCHANGED) | SET(WM_COPYDATA) | SET(WM_NOTIFY),
- /* 0x50 - 0x5f */
- SET(WM_HELP),
- /* 0x60 - 0x6f */
- 0,
- /* 0x70 - 0x7f */
+ /* 0x40 - 0x5f */
+ SET(WM_WINDOWPOSCHANGING) | SET(WM_WINDOWPOSCHANGED) | SET(WM_COPYDATA) |
+ SET(WM_NOTIFY) | SET(WM_HELP),
+ /* 0x60 - 0x7f */
SET(WM_STYLECHANGING) | SET(WM_STYLECHANGED),
- /* 0x80 - 0x8f */
+ /* 0x80 - 0x9f */
SET(WM_NCCREATE) | SET(WM_NCCALCSIZE) | SET(WM_GETDLGCODE),
- /* 0x90 - 0x9f */
- 0,
- /* 0xa0 - 0xaf */
- 0,
- /* 0xb0 - 0xbf */
+ /* 0xa0 - 0xbf */
SET(EM_GETSEL) | SET(EM_GETRECT) | SET(EM_SETRECT) | SET(EM_SETRECTNP),
- /* 0xc0 - 0xcf */
+ /* 0xc0 - 0xdf */
SET(EM_REPLACESEL) | SET(EM_GETLINE) | SET(EM_SETTABSTOPS),
- /* 0xd0 - 0xdf */
+ /* 0xe0 - 0xff */
+ SET(SBM_GETRANGE) | SET(SBM_SETSCROLLINFO) | SET(SBM_GETSCROLLINFO),
+ /* 0x100 - 0x11f */
0,
- /* 0xe0 - 0xef */
+ /* 0x120 - 0x13f */
0,
- /* 0xf0 - 0xff */
- 0,
- /* 0x100 - 0x10f */
- 0,
- /* 0x110 - 0x11f */
- 0,
- /* 0x120 - 0x12f */
- 0,
- /* 0x130 - 0x13f */
- 0,
- /* 0x140 - 0x14f */
- SET(CB_ADDSTRING) | SET(CB_DIR) | SET(CB_GETLBTEXT) | SET(CB_INSERTSTRING) |
- SET(CB_FINDSTRING) | SET(CB_SELECTSTRING),
- /* 0x150 - 0x15f */
+ /* 0x140 - 0x15f */
+ SET(CB_GETEDITSEL) | SET(CB_ADDSTRING) | SET(CB_DIR) | SET(CB_GETLBTEXT) |
+ SET(CB_INSERTSTRING) | SET(CB_FINDSTRING) | SET(CB_SELECTSTRING) |
SET(CB_GETDROPPEDCONTROLRECT) | SET(CB_FINDSTRINGEXACT),
- /* 0x160 - 0x16f */
+ /* 0x160 - 0x17f */
0,
- /* 0x170 - 0x17f */
- 0,
- /* 0x180 - 0x18f */
+ /* 0x180 - 0x19f */
SET(LB_ADDSTRING) | SET(LB_INSERTSTRING) | SET(LB_GETTEXT) | SET(LB_SELECTSTRING) |
- SET(LB_DIR) | SET(LB_FINDSTRING),
- /* 0x190 - 0x19f */
+ SET(LB_DIR) | SET(LB_FINDSTRING) |
SET(LB_GETSELITEMS) | SET(LB_SETTABSTOPS) | SET(LB_ADDFILE) | SET(LB_GETITEMRECT),
- /* 0x1a0 - 0x1af */
+ /* 0x1a0 - 0x1bf */
SET(LB_FINDSTRINGEXACT),
- /* 0x1b0 - 0x1bf */
+ /* 0x1c0 - 0x1df */
0,
- /* 0x1c0 - 0x1cf */
+ /* 0x1e0 - 0x1ff */
0,
- /* 0x1d0 - 0x1df */
- 0,
- /* 0x1e0 - 0x1ef */
- 0,
- /* 0x1f0 - 0x1ff */
- 0,
- /* 0x200 - 0x20f */
- 0,
- /* 0x210 - 0x21f */
- 0,
- /* 0x220 - 0x22f */
+ /* 0x200 - 0x21f */
+ SET(WM_NEXTMENU) | SET(WM_SIZING) | SET(WM_MOVING) | SET(WM_DEVICECHANGE),
+ /* 0x220 - 0x23f */
SET(WM_MDICREATE) | SET(WM_MDIGETACTIVE) | SET(WM_DROPOBJECT) |
- SET(WM_QUERYDROPOBJECT) | SET(WM_DRAGSELECT) | SET(WM_DRAGMOVE)
+ SET(WM_QUERYDROPOBJECT) | SET(WM_DRAGLOOP) | SET(WM_DRAGSELECT) | SET(WM_DRAGMOVE),
+ /* 0x240 - 0x25f */
+ 0,
+ /* 0x260 - 0x27f */
+ 0,
+ /* 0x280 - 0x29f */
+ 0,
+ /* 0x2a0 - 0x2bf */
+ 0,
+ /* 0x2c0 - 0x2df */
+ 0,
+ /* 0x2e0 - 0x2ff */
+ 0,
+ /* 0x300 - 0x31f */
+ SET(WM_ASKCBFORMATNAME)
};
-#undef SET
+/* flags for messages that contain Unicode strings */
+static const unsigned int message_unicode_flags[] =
+{
+ /* 0x00 - 0x1f */
+ SET(WM_CREATE) | SET(WM_SETTEXT) | SET(WM_GETTEXT) | SET(WM_GETTEXTLENGTH) |
+ SET(WM_WININICHANGE) | SET(WM_DEVMODECHANGE),
+ /* 0x20 - 0x3f */
+ SET(WM_CHARTOITEM),
+ /* 0x40 - 0x5f */
+ 0,
+ /* 0x60 - 0x7f */
+ 0,
+ /* 0x80 - 0x9f */
+ SET(WM_NCCREATE),
+ /* 0xa0 - 0xbf */
+ 0,
+ /* 0xc0 - 0xdf */
+ SET(EM_REPLACESEL) | SET(EM_GETLINE) | SET(EM_SETPASSWORDCHAR),
+ /* 0xe0 - 0xff */
+ 0,
+ /* 0x100 - 0x11f */
+ SET(WM_CHAR) | SET(WM_DEADCHAR) | SET(WM_SYSCHAR) | SET(WM_SYSDEADCHAR),
+ /* 0x120 - 0x13f */
+ SET(WM_MENUCHAR),
+ /* 0x140 - 0x15f */
+ SET(CB_ADDSTRING) | SET(CB_DIR) | SET(CB_GETLBTEXT) | SET(CB_GETLBTEXTLEN) |
+ SET(CB_INSERTSTRING) | SET(CB_FINDSTRING) | SET(CB_SELECTSTRING) | SET(CB_FINDSTRINGEXACT),
+ /* 0x160 - 0x17f */
+ 0,
+ /* 0x180 - 0x19f */
+ SET(LB_ADDSTRING) | SET(LB_INSERTSTRING) | SET(LB_GETTEXT) | SET(LB_GETTEXTLEN) |
+ SET(LB_SELECTSTRING) | SET(LB_DIR) | SET(LB_FINDSTRING) | SET(LB_ADDFILE),
+ /* 0x1a0 - 0x1bf */
+ SET(LB_FINDSTRINGEXACT),
+ /* 0x1c0 - 0x1df */
+ 0,
+ /* 0x1e0 - 0x1ff */
+ 0,
+ /* 0x200 - 0x21f */
+ 0,
+ /* 0x220 - 0x23f */
+ SET(WM_MDICREATE),
+ /* 0x240 - 0x25f */
+ 0,
+ /* 0x260 - 0x27f */
+ 0,
+ /* 0x280 - 0x29f */
+ 0,
+ /* 0x2a0 - 0x2bf */
+ 0,
+ /* 0x2c0 - 0x2df */
+ 0,
+ /* 0x2e0 - 0x2ff */
+ 0,
+ /* 0x300 - 0x31f */
+ SET(WM_PAINTCLIPBOARD) | SET(WM_SIZECLIPBOARD) | SET(WM_ASKCBFORMATNAME)
+};
/* check whether a given message type includes pointers */
inline static int is_pointer_message( UINT message )
{
if (message >= 8*sizeof(message_pointer_flags)) return FALSE;
- return (message_pointer_flags[message / 16] & (1 << (message & 15))) != 0;
+ return (message_pointer_flags[message / 32] & SET(message)) != 0;
}
+/* check whether a given message type contains Unicode (or ASCII) chars */
+inline static int is_unicode_message( UINT message )
+{
+ if (message >= 8*sizeof(message_unicode_flags)) return FALSE;
+ return (message_unicode_flags[message / 32] & SET(message)) != 0;
+}
+
+#undef SET
/* compute the total size of the packed data */
inline static size_t get_data_total_size( const struct packed_message *data )
@@ -346,9 +395,11 @@
return sizeof(*cs);
}
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
return wparam * sizeof(WCHAR);
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -414,7 +465,15 @@
case WM_GETDLGCODE:
if (lparam) push_data( data, (MSG *)lparam, sizeof(MSG) );
return sizeof(MSG);
+ case SBM_SETSCROLLINFO:
+ push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) );
+ return 0;
+ case SBM_GETSCROLLINFO:
+ push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) );
+ return sizeof(SCROLLINFO);
case EM_GETSEL:
+ case SBM_GETRANGE:
+ case CB_GETEDITSEL:
{
size_t size = 0;
if (wparam) size += sizeof(DWORD);
@@ -455,6 +514,13 @@
return (SendMessageW( hwnd, LB_GETTEXTLEN, wparam, 0 ) + 1) * sizeof(WCHAR);
case LB_GETSELITEMS:
return wparam * sizeof(UINT);
+ case WM_NEXTMENU:
+ push_data( data, (MDINEXTMENU *)lparam, sizeof(MDINEXTMENU) );
+ return sizeof(MDINEXTMENU);
+ case WM_SIZING:
+ case WM_MOVING:
+ push_data( data, (RECT *)lparam, sizeof(RECT) );
+ return sizeof(RECT);
case WM_MDICREATE:
{
MDICREATESTRUCTW *cs = (MDICREATESTRUCTW *)lparam;
@@ -466,11 +532,43 @@
case WM_MDIGETACTIVE:
if (lparam) return sizeof(BOOL);
return 0;
+
+ /* these contain an HFONT */
+ case WM_SETFONT:
+ case WM_GETFONT:
+ /* these contain an HDC */
+ case WM_PAINT:
+ case WM_ERASEBKGND:
+ case WM_ICONERASEBKGND:
+ case WM_NCPAINT:
+ case WM_CTLCOLORMSGBOX:
+ case WM_CTLCOLOREDIT:
+ case WM_CTLCOLORLISTBOX:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORSCROLLBAR:
+ case WM_CTLCOLORSTATIC:
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ /* these contain an HGLOBAL */
+ case WM_PAINTCLIPBOARD:
+ case WM_SIZECLIPBOARD:
+ case WM_DDE_INITIATE:
+ case WM_DDE_ADVISE:
+ case WM_DDE_UNADVISE:
+ case WM_DDE_DATA:
+ case WM_DDE_REQUEST:
+ case WM_DDE_POKE:
+ case WM_DDE_EXECUTE:
+ /* these contain pointers */
case WM_DROPOBJECT:
case WM_QUERYDROPOBJECT:
+ case WM_DRAGLOOP:
case WM_DRAGSELECT:
case WM_DRAGMOVE:
- FIXME("msg %x not supported yet\n",message);
+ case WM_DEVICECHANGE:
+ FIXME( "msg %x (%s) not supported yet\n", message, SPY_GetMsgName(message) );
+ data->count = -1;
return 0;
}
return 0;
@@ -511,10 +609,12 @@
break;
}
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
if (!get_buffer_space( buffer, (*wparam * sizeof(WCHAR)) )) return FALSE;
break;
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -580,7 +680,15 @@
if (!*lparam) return TRUE;
minsize = sizeof(MSG);
break;
+ case SBM_SETSCROLLINFO:
+ minsize = sizeof(SCROLLINFO);
+ break;
+ case SBM_GETSCROLLINFO:
+ if (!get_buffer_space( buffer, sizeof(SCROLLINFO ))) return FALSE;
+ break;
case EM_GETSEL:
+ case SBM_GETRANGE:
+ case CB_GETEDITSEL:
if (*wparam || *lparam)
{
if (!get_buffer_space( buffer, 2*sizeof(DWORD) )) return FALSE;
@@ -637,6 +745,15 @@
case LB_GETSELITEMS:
if (!get_buffer_space( buffer, *wparam * sizeof(UINT) )) return FALSE;
break;
+ case WM_NEXTMENU:
+ minsize = sizeof(MDINEXTMENU);
+ if (!get_buffer_space( buffer, sizeof(MDINEXTMENU) )) return FALSE;
+ break;
+ case WM_SIZING:
+ case WM_MOVING:
+ minsize = sizeof(RECT);
+ if (!get_buffer_space( buffer, sizeof(RECT) )) return FALSE;
+ break;
case WM_MDICREATE:
{
MDICREATESTRUCTW *cs = *buffer;
@@ -661,12 +778,44 @@
if (!*lparam) return TRUE;
if (!get_buffer_space( buffer, sizeof(BOOL) )) return FALSE;
break;
+
+ /* these contain an HFONT */
+ case WM_SETFONT:
+ case WM_GETFONT:
+ /* these contain an HDC */
+ case WM_PAINT:
+ case WM_ERASEBKGND:
+ case WM_ICONERASEBKGND:
+ case WM_NCPAINT:
+ case WM_CTLCOLORMSGBOX:
+ case WM_CTLCOLOREDIT:
+ case WM_CTLCOLORLISTBOX:
+ case WM_CTLCOLORBTN:
+ case WM_CTLCOLORDLG:
+ case WM_CTLCOLORSCROLLBAR:
+ case WM_CTLCOLORSTATIC:
+ case WM_PRINT:
+ case WM_PRINTCLIENT:
+ /* these contain an HGLOBAL */
+ case WM_PAINTCLIPBOARD:
+ case WM_SIZECLIPBOARD:
+ case WM_DDE_INITIATE:
+ case WM_DDE_ADVISE:
+ case WM_DDE_UNADVISE:
+ case WM_DDE_DATA:
+ case WM_DDE_REQUEST:
+ case WM_DDE_POKE:
+ case WM_DDE_EXECUTE:
+ /* these contain pointers */
case WM_DROPOBJECT:
case WM_QUERYDROPOBJECT:
+ case WM_DRAGLOOP:
case WM_DRAGSELECT:
case WM_DRAGMOVE:
- FIXME("msg %x not supported yet\n",message);
+ case WM_DEVICECHANGE:
+ FIXME( "msg %x (%s) not supported yet\n", message, SPY_GetMsgName(message) );
return FALSE;
+
default:
return TRUE; /* message doesn't need any unpacking */
}
@@ -711,9 +860,14 @@
case WM_GETDLGCODE:
if (lparam) push_data( data, (MSG *)lparam, sizeof(MSG) );
break;
+ case SBM_GETSCROLLINFO:
+ push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) );
+ break;
case EM_GETRECT:
case LB_GETITEMRECT:
case CB_GETDROPPEDCONTROLRECT:
+ case WM_SIZING:
+ case WM_MOVING:
push_data( data, (RECT *)lparam, sizeof(RECT) );
break;
case EM_GETLINE:
@@ -739,17 +893,19 @@
}
break;
case EM_GETSEL:
+ case SBM_GETRANGE:
+ case CB_GETEDITSEL:
if (wparam) push_data( data, (DWORD *)wparam, sizeof(DWORD) );
if (lparam) push_data( data, (DWORD *)lparam, sizeof(DWORD) );
break;
+ case WM_NEXTMENU:
+ push_data( data, (MDINEXTMENU *)lparam, sizeof(MDINEXTMENU) );
+ break;
case WM_MDICREATE:
push_data( data, (MDICREATESTRUCTW *)lparam, sizeof(MDICREATESTRUCTW) );
break;
- case WM_DROPOBJECT:
- case WM_QUERYDROPOBJECT:
- case WM_DRAGSELECT:
- case WM_DRAGMOVE:
- FIXME("not implemented yet\n");
+ case WM_ASKCBFORMATNAME:
+ push_data( data, (WCHAR *)lparam, (strlenW((WCHAR *)lparam) + 1) * sizeof(WCHAR) );
break;
}
}
@@ -776,6 +932,7 @@
break;
}
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
memcpy( (WCHAR *)lparam, buffer, min( wparam*sizeof(WCHAR), size ));
break;
case WM_GETMINMAXINFO:
@@ -791,9 +948,14 @@
case WM_GETDLGCODE:
if (lparam) memcpy( (MSG *)lparam, buffer, min( sizeof(MSG), size ));
break;
+ case SBM_GETSCROLLINFO:
+ memcpy( (SCROLLINFO *)lparam, buffer, min( sizeof(SCROLLINFO), size ));
+ break;
case EM_GETRECT:
case CB_GETDROPPEDCONTROLRECT:
case LB_GETITEMRECT:
+ case WM_SIZING:
+ case WM_MOVING:
memcpy( (RECT *)lparam, buffer, min( sizeof(RECT), size ));
break;
case EM_GETLINE:
@@ -807,6 +969,9 @@
case CB_GETLBTEXT:
memcpy( (WCHAR *)lparam, buffer, size );
break;
+ case WM_NEXTMENU:
+ memcpy( (MDINEXTMENU *)lparam, buffer, min( sizeof(MDINEXTMENU), size ));
+ break;
case WM_MDIGETACTIVE:
if (lparam) memcpy( (BOOL *)lparam, buffer, min( sizeof(BOOL), size ));
break;
@@ -827,6 +992,8 @@
}
break;
case EM_GETSEL:
+ case SBM_GETRANGE:
+ case CB_GETEDITSEL:
if (wparam)
{
memcpy( (DWORD *)wparam, buffer, min( sizeof(DWORD), size ));
@@ -845,12 +1012,6 @@
cs->szClass = class;
break;
}
- case WM_DROPOBJECT:
- case WM_QUERYDROPOBJECT:
- case WM_DRAGSELECT:
- case WM_DRAGMOVE:
- FIXME("not implemented yet\n");
- break;
default:
ERR( "should not happen: unexpected message %x\n", message );
break;
@@ -919,7 +1080,6 @@
static LRESULT call_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL unicode )
{
LRESULT result;
- WND *wndPtr;
WNDPROC winproc;
/* FIXME: should check for exiting queue */
@@ -941,18 +1101,16 @@
}
/* now call the window procedure */
- if (!(wndPtr = WIN_FindWndPtr( hwnd )))
- {
- WARN( "bad window %x\n", hwnd );
- return 0;
- }
- winproc = wndPtr->winproc;
- WIN_ReleaseWndPtr(wndPtr);
-
if (unicode)
+ {
+ if (!(winproc = (WNDPROC)GetWindowLongW( hwnd, GWL_WNDPROC ))) return 0;
result = CallWindowProcW( winproc, hwnd, msg, wparam, lparam );
+ }
else
+ {
+ if (!(winproc = (WNDPROC)GetWindowLongA( hwnd, GWL_WNDPROC ))) return 0;
result = CallWindowProcA( winproc, hwnd, msg, wparam, lparam );
+ }
/* and finally the WH_CALLWNDPROCRET hook */
if (HOOK_IsHooked( WH_CALLWNDPROCRET ))
@@ -1392,10 +1550,15 @@
{
/* inter-process message: need to map to Unicode */
info.type = MSG_OTHER_PROCESS;
- if (WINPROC_MapMsg32ATo32W( info.hwnd, info.msg, &info.wparam, &info.lparam ) == -1)
- return 0;
- ret = send_inter_thread_message( dest_tid, &info, &result );
- WINPROC_UnmapMsg32ATo32W( info.hwnd, info.msg, info.wparam, info.lparam );
+ if (is_unicode_message( info.msg ))
+ {
+ if (WINPROC_MapMsg32ATo32W( info.hwnd, info.msg, &info.wparam, &info.lparam ) == -1)
+ return 0;
+ ret = send_inter_thread_message( dest_tid, &info, &result );
+ result = WINPROC_UnmapMsg32ATo32W( info.hwnd, info.msg, info.wparam,
+ info.lparam, result );
+ }
+ else ret = send_inter_thread_message( dest_tid, &info, &result );
}
SPY_ExitMessage( SPY_RESULT_OK, hwnd, msg, result, wparam, lparam );
if (ret && res_ptr) *res_ptr = result;
diff --git a/include/winproc.h b/include/winproc.h
index d1602a1..97a79d5 100644
--- a/include/winproc.h
+++ b/include/winproc.h
@@ -64,8 +64,8 @@
extern INT WINPROC_MapMsg32WTo16( HWND hwnd, UINT msg32,
WPARAM wParam32, UINT16 *pmsg16,
WPARAM16 *pwparam16, LPARAM *plparam );
-extern void WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam,
- LPARAM lParam );
+extern LRESULT WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam,
+ LPARAM lParam, LRESULT result );
extern void WINPROC_UnmapMsg32WTo32A( HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam );
extern LRESULT WINPROC_UnmapMsg16To32A( HWND16 hwnd, UINT msg, WPARAM wParam,
diff --git a/windows/winproc.c b/windows/winproc.c
index 524e93a..a06e241 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -556,6 +556,7 @@
switch(msg)
{
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = (LPARAM *)HeapAlloc( GetProcessHeap(), 0,
*pwparam * sizeof(WCHAR) + sizeof(LPARAM) );
@@ -567,6 +568,7 @@
/* lparam is string (0-terminated) */
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -580,7 +582,10 @@
if(!*plparam) return 0;
*plparam = (LPARAM)HEAP_strdupAtoW( GetProcessHeap(), 0, (LPCSTR)*plparam );
return (*plparam ? 1 : -1);
-
+ case WM_GETTEXTLENGTH:
+ case CB_GETLBTEXTLEN:
+ case LB_GETTEXTLEN:
+ return 1; /* need to map result */
case WM_NCCREATE:
case WM_CREATE:
{
@@ -680,8 +685,6 @@
}
return 0;
- case WM_ASKCBFORMATNAME:
- case WM_DEVMODECHANGE:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
FIXME_(msg)("message %s (0x%x) needs translation, please report\n", SPY_GetMsgName(msg), msg );
@@ -697,11 +700,13 @@
*
* Unmap a message that was mapped from Ansi to Unicode.
*/
-void WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
+LRESULT WINPROC_UnmapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
+ LRESULT result )
{
switch(msg)
{
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = (LPARAM *)lParam - 1;
if (wParam > 0 && !WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1,
@@ -710,7 +715,11 @@
HeapFree( GetProcessHeap(), 0, ptr );
}
break;
-
+ case WM_GETTEXTLENGTH:
+ case CB_GETLBTEXTLEN:
+ case LB_GETTEXTLEN:
+ /* there may be one DBCS char for each Unicode char */
+ return result * 2;
case WM_NCCREATE:
case WM_CREATE:
{
@@ -739,6 +748,7 @@
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -795,6 +805,7 @@
}
break;
}
+ return result;
}
@@ -809,6 +820,7 @@
switch(msg)
{
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = (LPARAM *)HeapAlloc( GetProcessHeap(), 0,
*pwparam + sizeof(LPARAM) );
@@ -820,6 +832,7 @@
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -928,8 +941,6 @@
}
return 0;
- case WM_ASKCBFORMATNAME:
- case WM_DEVMODECHANGE:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
FIXME_(msg)("message %s (%04x) needs translation, please report\n",SPY_GetMsgName(msg),msg );
@@ -950,6 +961,7 @@
switch(msg)
{
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPARAM *ptr = (LPARAM *)lParam - 1;
if (wParam)
@@ -963,6 +975,7 @@
case WM_SETTEXT:
case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
case CB_DIR:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
@@ -1155,6 +1168,9 @@
return 1;
case WM_GETTEXT:
case WM_SETTEXT:
+ case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
+ case WM_ASKCBFORMATNAME:
*plparam = (LPARAM)MapSL(*plparam);
return 0;
case WM_MDICREATE:
@@ -1293,11 +1309,9 @@
*plparam = (LPARAM) idThread;
}
return 0;
- case WM_ASKCBFORMATNAME:
- case WM_DEVMODECHANGE:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
- case WM_WININICHANGE:
+ case WM_NEXTMENU:
FIXME_(msg)("message %04x needs translation\n",msg16 );
return -1;
@@ -1424,8 +1438,15 @@
{
case WM_GETTEXT:
case WM_SETTEXT:
+ case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
+ case WM_ASKCBFORMATNAME:
*plparam = (LPARAM)MapSL(*plparam);
return WINPROC_MapMsg32ATo32W( hwnd, *pmsg32, pwparam32, plparam );
+ case WM_GETTEXTLENGTH:
+ case CB_GETLBTEXTLEN:
+ case LB_GETTEXTLEN:
+ return 1; /* need to map result */
case WM_NCCREATE:
case WM_CREATE:
{
@@ -1529,8 +1550,11 @@
{
case WM_GETTEXT:
case WM_SETTEXT:
- WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam );
- break;
+ case WM_GETTEXTLENGTH:
+ case CB_GETLBTEXTLEN:
+ case LB_GETTEXTLEN:
+ case WM_ASKCBFORMATNAME:
+ return WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, result );
case WM_NCCREATE:
case WM_CREATE:
{
@@ -1862,6 +1886,7 @@
}
return 1;
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPSTR str;
*pwparam16 = (WPARAM16)min( wParam32, 0xff80 ); /* Must be < 64K */
@@ -1968,6 +1993,8 @@
*plparam = MapLS( (NMHDR *)*plparam ); /* NMHDR is already 32-bit */
return 1;
case WM_SETTEXT:
+ case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
{
LPSTR str = SEGPTR_STRDUP( (LPSTR)*plparam );
if (!str) return -1;
@@ -2009,15 +2036,14 @@
case WM_ACTIVATEAPP:
if (*plparam) *plparam = (LPARAM)THREAD_IdToTEB((DWORD) *plparam)->htask16;
return 0;
- case WM_ASKCBFORMATNAME:
- case WM_DEVMODECHANGE:
case WM_PAINTCLIPBOARD:
case WM_SIZECLIPBOARD:
- case WM_WININICHANGE:
+ case WM_NEXTMENU:
FIXME_(msg)("message %04x needs translation\n", msg32 );
return -1;
/* following messages should not be sent to 16-bit apps */
case WM_SIZING:
+ case WM_MOVING:
case WM_CAPTURECHANGED:
case WM_STYLECHANGING:
case WM_STYLECHANGED:
@@ -2056,6 +2082,8 @@
case WM_DELETEITEM:
case WM_DRAWITEM:
case WM_SETTEXT:
+ case WM_WININICHANGE:
+ case WM_DEVMODECHANGE:
SEGPTR_FREE( MapSL(p16->lParam) );
break;
@@ -2108,6 +2136,7 @@
}
break;
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPSTR str = MapSL(p16->lParam);
p16->lParam = *((LPARAM *)str - 1);
@@ -2316,6 +2345,7 @@
switch(msg)
{
case WM_GETTEXT:
+ case WM_ASKCBFORMATNAME:
{
LPSTR str = MapSL(p16->lParam);
p16->lParam = *((LPARAM *)str - 1);
@@ -2357,7 +2387,7 @@
return 0;
}
result = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
- if( unmap ) WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam );
+ if (unmap) result = WINPROC_UnmapMsg32ATo32W( hwnd, msg, wParam, lParam, result );
return result;
}