Module: wine Branch: master Commit: 537877adaee0199e2f28d89c1f69c5a4fc1aeb70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=537877adaee0199e2f28d89c1f...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 24 21:09:17 2009 +0100
user32: Move handling of listbox sizes for Win 3.1 apps to the 16-bit code.
---
dlls/user.exe16/message.c | 39 +++++++++++++++++++++++++++++++++++++++ dlls/user32/listbox.c | 26 -------------------------- 2 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/dlls/user.exe16/message.c b/dlls/user.exe16/message.c index ee7fa46..b8a5190 100644 --- a/dlls/user.exe16/message.c +++ b/dlls/user.exe16/message.c @@ -584,6 +584,12 @@ static HANDLE16 convert_handle_32_to_16(UINT_PTR src, unsigned int flags) return dst; }
+static BOOL is_old_app( HWND hwnd ) +{ + HINSTANCE inst = (HINSTANCE)GetWindowLongPtrW( hwnd, GWLP_HINSTANCE ); + return inst && !((ULONG_PTR)inst >> 16) && (GetExpWinVer16(LOWORD(inst)) & 0xFF00) == 0x0300; +} + static int find_sub_menu( HMENU *hmenu, HMENU16 target ) { int i, pos, count = GetMenuItemCount( *hmenu ); @@ -2382,6 +2388,39 @@ static LRESULT listbox_proc16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
switch (msg) { + case WM_SIZE: + if (is_old_app( hwnd )) + { + DWORD style = GetWindowLongW( hwnd, GWL_STYLE ); + int width, height, remaining, item_height; + RECT rect; + + /* give a margin for error to old 16 bits programs - if we need + less than the height of the nonclient area, round to the + *next* number of items */ + + if (!(style & LBS_NOINTEGRALHEIGHT) && !(style & LBS_OWNERDRAWVARIABLE)) + { + GetClientRect( hwnd, &rect ); + width = rect.right - rect.left; + height = rect.bottom - rect.top; + item_height = wow_handlers32.listbox_proc( hwnd, LB_GETITEMHEIGHT, 0, 0, FALSE ); + remaining = item_height ? (height % item_height) : 0; + if ((height > item_height) && remaining) + { + GetWindowRect( hwnd, &rect ); + if ((item_height - remaining) <= rect.bottom - rect.top - height) + remaining = remaining - item_height; + TRACE( "[%p]: changing height %d -> %d\n", hwnd, height, height - remaining ); + SetWindowPos( hwnd, 0, 0, 0, rect.right - rect.left, + rect.bottom - rect.top - remaining, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE ); + return 0; + } + } + } + return wow_handlers32.listbox_proc( hwnd, msg, wParam, lParam, unicode ); + case LB_RESETCONTENT16: case LB_DELETESTRING16: case LB_GETITEMDATA16: diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index 983eee6..059be04 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -39,7 +39,6 @@ #include "windef.h" #include "winbase.h" #include "wingdi.h" -#include "wine/winbase16.h" #include "wine/unicode.h" #include "user_private.h" #include "controls.h" @@ -161,13 +160,6 @@ const struct builtin_class_descr COMBOLBOX_builtin_class = };
-/* check whether app is a Win 3.1 app */ -static inline BOOL is_old_app( LB_DESCR *descr ) -{ - return (GetExpWinVer16( GetWindowLongPtrW(descr->self, GWLP_HINSTANCE) ) & 0xFF00 ) == 0x0300; -} - - /*********************************************************************** * LISTBOX_GetCurrentPageSize * @@ -394,14 +386,6 @@ static void LISTBOX_UpdateSize( LB_DESCR *descr ) remaining = 0; if ((descr->height > descr->item_height) && remaining) { - if (is_old_app(descr)) - { /* give a margin for error to 16 bits programs - if we need - less than the height of the nonclient area, round to the - *next* number of items */ - int ncheight = rect.bottom - rect.top - descr->height; - if ((descr->item_height - remaining) <= ncheight) - remaining = remaining - descr->item_height; - } TRACE("[%p]: changing height %d -> %d\n", descr->self, descr->height, descr->height - remaining ); SetWindowPos( descr->self, 0, 0, 0, rect.right - rect.left, @@ -2517,16 +2501,6 @@ static BOOL LISTBOX_Create( HWND hwnd, LPHEADCOMBO lphc ) descr->locale = GetUserDefaultLCID(); descr->lphc = lphc;
- if (is_old_app(descr) && ( descr->style & ( WS_VSCROLL | WS_HSCROLL ) ) ) - { - /* Win95 document "List Box Differences" from MSDN: - If a list box in a version 3.x application has either the - WS_HSCROLL or WS_VSCROLL style, the list box receives both - horizontal and vertical scroll bars. - */ - descr->style |= WS_VSCROLL | WS_HSCROLL; - } - if( lphc ) { TRACE("[%p]: resetting owner %p -> %p\n", descr->self, descr->owner, lphc->self );