Made access to the wnd struct thread-safe.
diff --git a/controls/button.c b/controls/button.c
index fe2f98f..6c59172 100644
--- a/controls/button.c
+++ b/controls/button.c
@@ -79,6 +79,7 @@
WPARAM wParam, LPARAM lParam )
{
RECT rect;
+ LRESULT retvalue;
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
WND *wndPtr = WIN_FindWndPtr(hWnd);
BUTTONINFO *infoPtr = (BUTTONINFO *)wndPtr->wExtra;
@@ -87,6 +88,7 @@
switch (uMsg)
{
case WM_GETDLGCODE:
+ WIN_ReleaseWndPtr(wndPtr);
switch(style)
{
case BS_PUSHBUTTON: return DLGC_BUTTON | DLGC_UNDEFPUSHBUTTON;
@@ -109,12 +111,18 @@
checkBoxWidth = bmp.bmWidth / 4;
checkBoxHeight = bmp.bmHeight / 3;
}
- if (style < 0L || style >= MAX_BTN_TYPE) return -1; /* abort */
+ if (style < 0L || style >= MAX_BTN_TYPE)
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return -1; /* abort */
+ }
infoPtr->state = BUTTON_UNCHECKED;
infoPtr->hFont = 0;
+ WIN_ReleaseWndPtr(wndPtr);
return 0;
case WM_ERASEBKGND:
+ WIN_ReleaseWndPtr(wndPtr);
return 1;
case WM_PAINT:
@@ -171,6 +179,7 @@
break;
case WM_NCHITTEST:
+ WIN_ReleaseWndPtr(wndPtr);
if(style == BS_GROUPBOX) return HTTRANSPARENT;
return DefWindowProcA( hWnd, uMsg, wParam, lParam );
@@ -178,6 +187,7 @@
DEFWND_SetText( wndPtr, (LPCSTR)lParam );
if( wndPtr->dwStyle & WS_VISIBLE )
PAINT_BUTTON( wndPtr, style, ODA_DRAWENTIRE );
+ WIN_ReleaseWndPtr(wndPtr);
return 0;
case WM_SETFONT:
@@ -187,7 +197,9 @@
break;
case WM_GETFONT:
- return infoPtr->hFont;
+ retvalue = infoPtr->hFont;
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
case WM_SETFOCUS:
infoPtr->state |= BUTTON_HASFOCUS;
@@ -219,7 +231,9 @@
case BM_GETCHECK16:
case BM_GETCHECK:
- return infoPtr->state & 3;
+ retvalue = infoPtr->state & 3;
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
case BM_SETCHECK16:
case BM_SETCHECK:
@@ -242,7 +256,9 @@
case BM_GETSTATE16:
case BM_GETSTATE:
- return infoPtr->state;
+ retvalue = infoPtr->state;
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
case BM_SETSTATE16:
case BM_SETSTATE:
@@ -260,8 +276,10 @@
break;
default:
+ WIN_ReleaseWndPtr(wndPtr);
return DefWindowProcA(hWnd, uMsg, wParam, lParam);
}
+ WIN_ReleaseWndPtr(wndPtr);
return 0;
}
@@ -522,11 +540,14 @@
start = sibling = GetNextDlgGroupItem( parent, wndPtr->hwndSelf, TRUE );
do
{
+ WND *tmpWnd;
if (!sibling) break;
+ tmpWnd = WIN_FindWndPtr(sibling);
if ((wndPtr->hwndSelf != sibling) &&
- ((WIN_FindWndPtr(sibling)->dwStyle & 0x0f) == BS_AUTORADIOBUTTON))
+ ((tmpWnd->dwStyle & 0x0f) == BS_AUTORADIOBUTTON))
SendMessageA( sibling, BM_SETCHECK, BUTTON_UNCHECKED, 0 );
sibling = GetNextDlgGroupItem( parent, sibling, FALSE );
+ WIN_ReleaseWndPtr(tmpWnd);
} while (sibling != start);
}
diff --git a/controls/combo.c b/controls/combo.c
index 47fa929..1778402 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -1286,6 +1286,7 @@
LRESULT WINAPI ComboWndProc( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
+ LRESULT retvalue;
WND* pWnd = WIN_FindWndPtr(hwnd);
if( pWnd )
@@ -1302,58 +1303,59 @@
/* System messages */
case WM_NCCREATE:
- return COMBO_NCCreate(pWnd, lParam);
-
+ retvalue = COMBO_NCCreate(pWnd, lParam);
+ goto END;
case WM_NCDESTROY:
COMBO_NCDestroy(lphc);
break;
case WM_CREATE:
- return COMBO_Create(lphc, pWnd, lParam);
+ retvalue = COMBO_Create(lphc, pWnd, lParam);
+ goto END;
case WM_PAINT:
/* wParam may contain a valid HDC! */
- return COMBO_Paint(lphc, wParam);
-
+ retvalue = COMBO_Paint(lphc, wParam);
+ goto END;
case WM_ERASEBKGND:
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_GETDLGCODE:
- return (LRESULT)(DLGC_WANTARROWS | DLGC_WANTCHARS);
-
+ retvalue = (LRESULT)(DLGC_WANTARROWS | DLGC_WANTCHARS);
+ goto END;
case WM_SIZE:
if( lphc->hWndLBox &&
!(lphc->wState & CBF_NORESIZE) ) COMBO_Size( lphc );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_SETFONT:
COMBO_Font( lphc, (HFONT16)wParam, (BOOL)lParam );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_GETFONT:
- return (LRESULT)lphc->hFont;
-
+ retvalue = (LRESULT)lphc->hFont;
+ goto END;
case WM_SETFOCUS:
if( lphc->wState & CBF_EDIT )
SetFocus( lphc->hWndEdit );
else
COMBO_SetFocus( lphc );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_KILLFOCUS:
#define hwndFocus ((HWND16)wParam)
if( !hwndFocus ||
(hwndFocus != lphc->hWndEdit && hwndFocus != lphc->hWndLBox ))
COMBO_KillFocus( lphc );
#undef hwndFocus
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_COMMAND:
- return COMBO_Command( lphc, wParam, (HWND)lParam );
-
+ retvalue = COMBO_Command( lphc, wParam, (HWND)lParam );
+ goto END;
case WM_GETTEXT:
- return COMBO_GetText( lphc, (UINT)wParam, (LPSTR)lParam );
-
+ retvalue = COMBO_GetText( lphc, (UINT)wParam, (LPSTR)lParam );
+ goto END;
case WM_SETTEXT:
case WM_GETTEXTLENGTH:
case WM_CLEAR:
@@ -1361,21 +1363,24 @@
case WM_PASTE:
case WM_COPY:
if( lphc->wState & CBF_EDIT )
- return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
- return CB_ERR;
-
+ {
+ retvalue = SendMessageA( lphc->hWndEdit, message, wParam, lParam );
+ goto END;
+ }
+ retvalue = CB_ERR;
+ goto END;
case WM_DRAWITEM:
case WM_DELETEITEM:
case WM_COMPAREITEM:
case WM_MEASUREITEM:
- return COMBO_ItemOp( lphc, message, wParam, lParam );
-
+ retvalue = COMBO_ItemOp( lphc, message, wParam, lParam );
+ goto END;
case WM_ENABLE:
if( lphc->wState & CBF_EDIT )
EnableWindow( lphc->hWndEdit, (BOOL)wParam );
EnableWindow( lphc->hWndLBox, (BOOL)wParam );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_SETREDRAW:
if( wParam )
lphc->wState &= ~CBF_NOREDRAW;
@@ -1385,8 +1390,8 @@
if( lphc->wState & CBF_EDIT )
SendMessageA( lphc->hWndEdit, message, wParam, lParam );
SendMessageA( lphc->hWndLBox, message, wParam, lParam );
- return 0;
-
+ retvalue = 0;
+ goto END;
case WM_SYSKEYDOWN:
if( KEYDATA_ALT & HIWORD(lParam) )
if( wParam == VK_UP || wParam == VK_DOWN )
@@ -1396,106 +1401,113 @@
case WM_CHAR:
case WM_KEYDOWN:
if( lphc->wState & CBF_EDIT )
- return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
+ retvalue = SendMessageA( lphc->hWndEdit, message, wParam, lParam );
else
- return SendMessageA( lphc->hWndLBox, message, wParam, lParam );
+ retvalue = SendMessageA( lphc->hWndLBox, message, wParam, lParam );
case WM_LBUTTONDOWN:
if( !(lphc->wState & CBF_FOCUSED) ) SetFocus( lphc->self->hwndSelf );
if( lphc->wState & CBF_FOCUSED ) COMBO_LButtonDown( lphc, lParam );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_LBUTTONUP:
COMBO_LButtonUp( lphc, lParam );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case WM_MOUSEMOVE:
if( lphc->wState & CBF_CAPTURE )
COMBO_MouseMove( lphc, wParam, lParam );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
/* Combo messages */
case CB_ADDSTRING16:
if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_ADDSTRING:
- return SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam);
+ goto END;
case CB_INSERTSTRING16:
wParam = (INT)(INT16)wParam;
if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_INSERTSTRING:
- return SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
+ goto END;
case CB_DELETESTRING16:
case CB_DELETESTRING:
- return SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
+ goto END;
case CB_SELECTSTRING16:
wParam = (INT)(INT16)wParam;
if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_SELECTSTRING:
- return COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam );
-
+ retvalue = COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam );
+ goto END;
case CB_FINDSTRING16:
wParam = (INT)(INT16)wParam;
if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_FINDSTRING:
- return SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
+ goto END;
case CB_FINDSTRINGEXACT16:
wParam = (INT)(INT16)wParam;
if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_FINDSTRINGEXACT:
- return SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT,
+ retvalue = SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT,
wParam, lParam );
+ goto END;
case CB_SETITEMHEIGHT16:
wParam = (INT)(INT16)wParam; /* signed integer */
case CB_SETITEMHEIGHT:
- return COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
-
+ retvalue = COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
+ goto END;
case CB_GETITEMHEIGHT16:
wParam = (INT)(INT16)wParam;
case CB_GETITEMHEIGHT:
if( (INT)wParam >= 0 ) /* listbox item */
- return SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
- return (lphc->RectEdit.bottom - lphc->RectEdit.top);
-
+ {
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
+ goto END;
+ }
+ retvalue = (lphc->RectEdit.bottom - lphc->RectEdit.top);
+ goto END;
case CB_RESETCONTENT16:
case CB_RESETCONTENT:
SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 );
CBPaintText( lphc, 0 );
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case CB_INITSTORAGE:
- return SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
+ goto END;
case CB_GETHORIZONTALEXTENT:
- return SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
+ goto END;
case CB_SETHORIZONTALEXTENT:
- return SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
+ goto END;
case CB_GETTOPINDEX:
- return SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
+ goto END;
case CB_GETLOCALE:
- return SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
+ goto END;
case CB_SETLOCALE:
- return SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
+ goto END;
case CB_GETDROPPEDWIDTH:
if( lphc->droppedWidth )
- return lphc->droppedWidth;
- return lphc->RectCombo.right - lphc->RectCombo.left -
+ {
+ retvalue = lphc->droppedWidth;
+ goto END;
+ }
+ retvalue = lphc->RectCombo.right - lphc->RectCombo.left -
(lphc->wState & CBF_EDIT) ? CBitOffset : 0;
-
+ goto END;
case CB_SETDROPPEDWIDTH:
if( (CB_GETTYPE(lphc) != CBS_SIMPLE) &&
(INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam;
- return CB_ERR;
-
+ retvalue = CB_ERR;
+ goto END;
case CB_GETDROPPEDCONTROLRECT16:
lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
if( lParam )
@@ -1504,22 +1516,23 @@
CBGetDroppedControlRect( lphc, &r );
CONV_RECT32TO16( &r, (LPRECT16)lParam );
}
- return CB_OKAY;
-
+ retvalue = CB_OKAY;
+ goto END;
case CB_GETDROPPEDCONTROLRECT:
if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
- return CB_OKAY;
-
+ retvalue = CB_OKAY;
+ goto END;
case CB_GETDROPPEDSTATE16:
case CB_GETDROPPEDSTATE:
- return (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
-
+ retvalue = (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
+ goto END;
case CB_DIR16:
lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case CB_DIR:
- return COMBO_Directory( lphc, (UINT)wParam,
+ retvalue = COMBO_Directory( lphc, (UINT)wParam,
(LPSTR)lParam, (message == CB_DIR));
+ goto END;
case CB_SHOWDROPDOWN16:
case CB_SHOWDROPDOWN:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
@@ -1533,16 +1546,16 @@
if( lphc->wState & CBF_DROPPED )
CBRollUp( lphc, FALSE, TRUE );
}
- return TRUE;
-
+ retvalue = TRUE;
+ goto END;
case CB_GETCOUNT16:
case CB_GETCOUNT:
- return SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
+ goto END;
case CB_GETCURSEL16:
case CB_GETCURSEL:
- return SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
+ goto END;
case CB_SETCURSEL16:
wParam = (INT)(INT16)wParam;
case CB_SETCURSEL:
@@ -1554,29 +1567,29 @@
CBPaintText( lphc, 0 );
lphc->wState &= ~CBF_SELCHANGE;
}
- return lParam;
-
+ retvalue = lParam;
+ goto END;
case CB_GETLBTEXT16:
wParam = (INT)(INT16)wParam;
lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
case CB_GETLBTEXT:
- return SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
+ goto END;
case CB_GETLBTEXTLEN16:
wParam = (INT)(INT16)wParam;
case CB_GETLBTEXTLEN:
- return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
+ goto END;
case CB_GETITEMDATA16:
wParam = (INT)(INT16)wParam;
case CB_GETITEMDATA:
- return SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
+ goto END;
case CB_SETITEMDATA16:
wParam = (INT)(INT16)wParam;
case CB_SETITEMDATA:
- return SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
-
+ retvalue = SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
+ goto END;
case CB_GETEDITSEL16:
wParam = lParam = 0; /* just in case */
case CB_GETEDITSEL:
@@ -1584,37 +1597,48 @@
{
INT a, b;
- return SendMessageA( lphc->hWndEdit, EM_GETSEL,
+ retvalue = SendMessageA( lphc->hWndEdit, EM_GETSEL,
(wParam) ? wParam : (WPARAM)&a,
(lParam) ? lParam : (LPARAM)&b );
+ goto END;
}
- return CB_ERR;
-
+ retvalue = CB_ERR;
+ goto END;
case CB_SETEDITSEL16:
case CB_SETEDITSEL:
if( lphc->wState & CBF_EDIT )
- return SendMessageA( lphc->hWndEdit, EM_SETSEL,
+ {
+ retvalue = SendMessageA( lphc->hWndEdit, EM_SETSEL,
(INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) );
- return CB_ERR;
-
+ goto END;
+ }
+ retvalue = CB_ERR;
+ goto END;
case CB_SETEXTENDEDUI16:
case CB_SETEXTENDEDUI:
- if( CB_GETTYPE(lphc) == CBS_SIMPLE ) return CB_ERR;
-
+ if( CB_GETTYPE(lphc) == CBS_SIMPLE )
+ {
+ retvalue = CB_ERR;
+ goto END;
+ }
if( wParam )
lphc->wState |= CBF_EUI;
else lphc->wState &= ~CBF_EUI;
- return CB_OKAY;
-
+ retvalue = CB_OKAY;
+ goto END;
case CB_GETEXTENDEDUI16:
case CB_GETEXTENDEDUI:
- return (lphc->wState & CBF_EUI) ? TRUE : FALSE;
-
+ retvalue = (lphc->wState & CBF_EUI) ? TRUE : FALSE;
+ goto END;
case (WM_USER + 0x1B):
WARN(combo, "[%04x]: undocumented msg!\n", hwnd );
}
- return DefWindowProcA(hwnd, message, wParam, lParam);
+ retvalue = DefWindowProcA(hwnd, message, wParam, lParam);
+ goto END;
}
- return CB_ERR;
+ retvalue = CB_ERR;
+END:
+ WIN_ReleaseWndPtr(pWnd);
+ return retvalue;
}
diff --git a/controls/desktop.c b/controls/desktop.c
index 96f5a34..f2573f8 100644
--- a/controls/desktop.c
+++ b/controls/desktop.c
@@ -24,8 +24,12 @@
*/
int DESKTOP_GetScreenWidth()
{
+ int retvalue;
DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
- return MONITOR_GetWidth(pDesktop->pPrimaryMonitor);
+ retvalue = MONITOR_GetWidth(pDesktop->pPrimaryMonitor);
+ WIN_ReleaseDesktop();
+ return retvalue;
+
}
/***********************************************************************
@@ -35,8 +39,12 @@
*/
int DESKTOP_GetScreenHeight()
{
+ int retvalue;
DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
- return MONITOR_GetHeight(pDesktop->pPrimaryMonitor);
+ retvalue = MONITOR_GetHeight(pDesktop->pPrimaryMonitor);
+ WIN_ReleaseDesktop();
+ return retvalue;
+
}
/***********************************************************************
@@ -46,8 +54,12 @@
*/
int DESKTOP_GetScreenDepth()
{
+ int retvalue;
DESKTOP *pDesktop = (DESKTOP *) WIN_GetDesktop()->wExtra;
- return MONITOR_GetDepth(pDesktop->pPrimaryMonitor);
+ retvalue = MONITOR_GetDepth(pDesktop->pPrimaryMonitor);
+ WIN_ReleaseDesktop();
+ return retvalue;
+
}
/***********************************************************************
@@ -119,6 +131,8 @@
if (Wnd->hrgnUpdate > 1) DeleteObject( Wnd->hrgnUpdate );
Wnd->hrgnUpdate = 0;
+ WIN_ReleaseWndPtr(Wnd);
+
GetClientRect( hwnd, &rect );
/* Paint desktop pattern (only if wall paper does not cover everything) */
@@ -173,6 +187,7 @@
LRESULT WINAPI DesktopWndProc( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
+ LRESULT retvalue;
WND *wndPtr = WIN_FindWndPtr( hwnd );
DESKTOP *desktopPtr = (DESKTOP *)wndPtr->wExtra;
@@ -187,23 +202,36 @@
desktopPtr->hbitmapWallPaper = 0;
SetDeskPattern();
SetDeskWallPaper( (LPSTR)-1 );
- return 1;
+ retvalue = 1;
+ goto END;
case WM_ERASEBKGND:
if (X11DRV_WND_GetXRootWindow(wndPtr) ==
DefaultRootWindow(display))
- return 1;
- return DESKTOP_DoEraseBkgnd( hwnd, (HDC)wParam, desktopPtr );
+ {
+ retvalue = 1;
+ goto END;
+ }
+ retvalue = DESKTOP_DoEraseBkgnd( hwnd, (HDC)wParam, desktopPtr );
+ goto END;
case WM_SYSCOMMAND:
- if ((wParam & 0xfff0) != SC_CLOSE) return 0;
+ if ((wParam & 0xfff0) != SC_CLOSE)
+ {
+ retvalue = 0;
+ goto END;
+ }
ExitWindows16( 0, 0 );
case WM_SETCURSOR:
- return (LRESULT)SetCursor16( LoadCursor16( 0, IDC_ARROW16 ) );
+ retvalue = (LRESULT)SetCursor16( LoadCursor16( 0, IDC_ARROW16 ) );
+ goto END;
}
- return 0;
+ retvalue = 0;
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
/***********************************************************************
@@ -212,11 +240,14 @@
*/
BOOL WINAPI PaintDesktop(HDC hdc)
{
+ BOOL retvalue;
HWND hwnd = GetDesktopWindow();
WND *wndPtr = WIN_FindWndPtr( hwnd );
DESKTOP *desktopPtr = (DESKTOP *)wndPtr->wExtra;
+ retvalue = DESKTOP_DoEraseBkgnd( hwnd, hdc, desktopPtr );
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
- return DESKTOP_DoEraseBkgnd( hwnd, hdc, desktopPtr );
}
/***********************************************************************
@@ -270,6 +301,7 @@
desktopPtr->bitmapSize.cx = (bmp.bmWidth != 0) ? bmp.bmWidth : 1;
desktopPtr->bitmapSize.cy = (bmp.bmHeight != 0) ? bmp.bmHeight : 1;
}
+ WIN_ReleaseDesktop();
return TRUE;
}
@@ -301,6 +333,7 @@
DeleteObject( hbitmap );
}
else desktopPtr->hbrushPattern = CreateSolidBrush( GetSysColor(COLOR_BACKGROUND) );
+ WIN_ReleaseDesktop();
return TRUE;
}
diff --git a/controls/edit.c b/controls/edit.c
index 125ed0f..0971dda 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -310,15 +310,21 @@
case WM_DESTROY:
DPRINTF_EDIT_MSG32("WM_DESTROY");
EDIT_WM_Destroy(wnd, es);
- return 0;
+ result = 0;
+ goto END;
case WM_NCCREATE:
DPRINTF_EDIT_MSG32("WM_NCCREATE");
- return EDIT_WM_NCCreate(wnd, (LPCREATESTRUCTA)lParam);
+ result = EDIT_WM_NCCreate(wnd, (LPCREATESTRUCTA)lParam);
+ goto END;
}
if (!es)
- return DefWindowProcA(hwnd, msg, wParam, lParam);
+ {
+ result = DefWindowProcA(hwnd, msg, wParam, lParam);
+ goto END;
+ }
+
EDIT_LockBuffer(wnd, es);
switch (msg) {
@@ -633,7 +639,7 @@
wnd->dwStyle &= ~ES_READONLY;
es->style &= ~ES_READONLY;
}
- return 1;
+ result = 1;
break;
case EM_SETWORDBREAKPROC16:
@@ -856,7 +862,10 @@
break;
}
EDIT_UnlockBuffer(wnd, es, FALSE);
+ END:
+ WIN_ReleaseWndPtr(wnd);
return result;
+
}
diff --git a/controls/icontitle.c b/controls/icontitle.c
index 38d5b78..82dd726 100644
--- a/controls/icontitle.c
+++ b/controls/icontitle.c
@@ -54,6 +54,7 @@
wndPtr->owner = wnd; /* MDI depends on this */
wndPtr->dwStyle &= ~(WS_CAPTION | WS_BORDER);
if( wnd->dwStyle & WS_DISABLED ) wndPtr->dwStyle |= WS_DISABLED;
+ WIN_ReleaseWndPtr(wndPtr);
return hWnd;
}
return 0;
@@ -187,24 +188,25 @@
LRESULT WINAPI IconTitleWndProc( HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{
+ LRESULT retvalue;
WND *wnd = WIN_FindWndPtr( hWnd );
switch( msg )
{
case WM_NCHITTEST:
- return HTCAPTION;
-
+ retvalue = HTCAPTION;
+ goto END;
case WM_NCMOUSEMOVE:
case WM_NCLBUTTONDBLCLK:
- return SendMessageA( wnd->owner->hwndSelf, msg, wParam, lParam );
-
+ retvalue = SendMessageA( wnd->owner->hwndSelf, msg, wParam, lParam );
+ goto END;
case WM_ACTIVATE:
if( wParam ) SetActiveWindow( wnd->owner->hwndSelf );
/* fall through */
case WM_CLOSE:
- return 0;
-
+ retvalue = 0;
+ goto END;
case WM_SHOWWINDOW:
if( wnd && wParam )
{
@@ -220,25 +222,30 @@
titleRect.right, titleRect.bottom,
SWP_NOACTIVATE | SWP_NOZORDER );
}
- return 0;
-
+ retvalue = 0;
+ goto END;
case WM_ERASEBKGND:
if( wnd )
{
- WND* iconWnd = wnd->owner;
+ WND* iconWnd = WIN_LockWndPtr(wnd->owner);
if( iconWnd->dwStyle & WS_CHILD )
lParam = SendMessageA( iconWnd->hwndSelf, WM_ISACTIVEICON, 0, 0 );
else
lParam = (iconWnd->hwndSelf == GetActiveWindow16());
+ WIN_ReleaseWndPtr(iconWnd);
if( ICONTITLE_Paint( wnd, (HDC)wParam, (BOOL)lParam ) )
ValidateRect( hWnd, NULL );
- return 1;
+ retvalue = 1;
+ goto END;
}
}
- return DefWindowProcA( hWnd, msg, wParam, lParam );
+ retvalue = DefWindowProcA( hWnd, msg, wParam, lParam );
+END:
+ WIN_ReleaseWndPtr(wnd);
+ return retvalue;
}
diff --git a/controls/listbox.c b/controls/listbox.c
index 1c17bef..a298ff9 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -2120,19 +2120,26 @@
LRESULT ret;
LB_DESCR *descr;
WND *wnd = WIN_FindWndPtr( hwnd );
+ LRESULT retvalue;
if (!wnd) return 0;
if (!(descr = *(LB_DESCR **)wnd->wExtra))
{
if (msg == WM_CREATE)
{
- if (!LISTBOX_Create( wnd, NULL )) return -1;
+ if (!LISTBOX_Create( wnd, NULL ))
+ {
+ retvalue = -1;
+ goto END;
+ }
TRACE(listbox, "creating wnd=%04x descr=%p\n",
hwnd, *(LB_DESCR **)wnd->wExtra );
- return 0;
+ retvalue = 0;
+ goto END;
}
/* Ignore all other messages before we get a WM_CREATE */
- return DefWindowProcA( hwnd, msg, wParam, lParam );
+ retvalue = DefWindowProcA( hwnd, msg, wParam, lParam );
+ goto END;
}
TRACE(listbox, "[%04x]: msg %s wp %08x lp %08lx\n",
@@ -2142,104 +2149,133 @@
case LB_RESETCONTENT16:
case LB_RESETCONTENT:
LISTBOX_ResetContent( wnd, descr );
- return 0;
+ retvalue = 0;
+ goto END;
case LB_ADDSTRING16:
if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case LB_ADDSTRING:
wParam = LISTBOX_FindStringPos( wnd, descr, (LPCSTR)lParam, FALSE );
- return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ goto END;
case LB_INSERTSTRING16:
if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
wParam = (INT)(INT16)wParam;
/* fall through */
case LB_INSERTSTRING:
- return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ goto END;
case LB_ADDFILE16:
if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case LB_ADDFILE:
wParam = LISTBOX_FindFileStrPos( wnd, descr, (LPCSTR)lParam );
- return LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ retvalue = LISTBOX_InsertString( wnd, descr, wParam, (LPCSTR)lParam );
+ goto END;
case LB_DELETESTRING16:
case LB_DELETESTRING:
- return LISTBOX_RemoveItem( wnd, descr, wParam );
+ retvalue = LISTBOX_RemoveItem( wnd, descr, wParam );
+ goto END;
case LB_GETITEMDATA16:
case LB_GETITEMDATA:
if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
- return LB_ERR;
- return descr->items[wParam].data;
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
+ retvalue = descr->items[wParam].data;
+ goto END;
case LB_SETITEMDATA16:
case LB_SETITEMDATA:
if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
- return LB_ERR;
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
descr->items[wParam].data = (DWORD)lParam;
- return LB_OKAY;
+ retvalue = LB_OKAY;
+ goto END;
case LB_GETCOUNT16:
case LB_GETCOUNT:
- return descr->nb_items;
+ retvalue = descr->nb_items;
+ goto END;
case LB_GETTEXT16:
lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case LB_GETTEXT:
- return LISTBOX_GetText( wnd, descr, wParam, (LPSTR)lParam );
+ retvalue = LISTBOX_GetText( wnd, descr, wParam, (LPSTR)lParam );
+ goto END;
case LB_GETTEXTLEN16:
/* fall through */
case LB_GETTEXTLEN:
- if (wParam >= descr->nb_items) return LB_ERR;
- return (HAS_STRINGS(descr) ? strlen(descr->items[wParam].str)
+ if (wParam >= descr->nb_items)
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
+ retvalue = (HAS_STRINGS(descr) ? strlen(descr->items[wParam].str)
: sizeof(DWORD));
+ goto END;
case LB_GETCURSEL16:
case LB_GETCURSEL:
- return descr->selected_item;
+ retvalue = descr->selected_item;
+ goto END;
case LB_GETTOPINDEX16:
case LB_GETTOPINDEX:
- return descr->top_item;
+ retvalue = descr->top_item;
+ goto END;
case LB_GETITEMHEIGHT16:
case LB_GETITEMHEIGHT:
- return LISTBOX_GetItemHeight( wnd, descr, wParam );
+ retvalue = LISTBOX_GetItemHeight( wnd, descr, wParam );
+ goto END;
case LB_SETITEMHEIGHT16:
lParam = LOWORD(lParam);
/* fall through */
case LB_SETITEMHEIGHT:
- return LISTBOX_SetItemHeight( wnd, descr, wParam, lParam );
+ retvalue = LISTBOX_SetItemHeight( wnd, descr, wParam, lParam );
+ goto END;
case LB_ITEMFROMPOINT:
{
POINT pt = { LOWORD(lParam), HIWORD(lParam) };
RECT rect = { 0, 0, descr->width, descr->height };
- return MAKELONG( LISTBOX_GetItemFromPoint(wnd, descr, pt.x, pt.y),
+ retvalue = MAKELONG( LISTBOX_GetItemFromPoint(wnd, descr, pt.x, pt.y),
PtInRect( &rect, pt ) );
+ goto END;
}
case LB_SETCARETINDEX16:
case LB_SETCARETINDEX:
- return LISTBOX_SetCaretIndex( wnd, descr, wParam, !lParam );
+ retvalue = LISTBOX_SetCaretIndex( wnd, descr, wParam, !lParam );
+ goto END;
case LB_GETCARETINDEX16:
case LB_GETCARETINDEX:
- return descr->focus_item;
+ retvalue = descr->focus_item;
+ goto END;
case LB_SETTOPINDEX16:
case LB_SETTOPINDEX:
- return LISTBOX_SetTopItem( wnd, descr, wParam, TRUE );
+ retvalue = LISTBOX_SetTopItem( wnd, descr, wParam, TRUE );
+ goto END;
case LB_SETCOLUMNWIDTH16:
case LB_SETCOLUMNWIDTH:
- return LISTBOX_SetColumnWidth( wnd, descr, wParam );
+ retvalue = LISTBOX_SetColumnWidth( wnd, descr, wParam );
+ goto END;
case LB_GETITEMRECT16:
{
@@ -2247,24 +2283,28 @@
ret = LISTBOX_GetItemRect( wnd, descr, (INT16)wParam, &rect );
CONV_RECT32TO16( &rect, (RECT16 *)PTR_SEG_TO_LIN(lParam) );
}
- return ret;
+ retvalue = ret;
+ goto END;
case LB_GETITEMRECT:
- return LISTBOX_GetItemRect( wnd, descr, wParam, (RECT *)lParam );
+ retvalue = LISTBOX_GetItemRect( wnd, descr, wParam, (RECT *)lParam );
+ goto END;
case LB_FINDSTRING16:
wParam = (INT)(INT16)wParam;
if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case LB_FINDSTRING:
- return LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, FALSE );
+ retvalue = LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, FALSE );
+ goto END;
case LB_FINDSTRINGEXACT16:
wParam = (INT)(INT16)wParam;
if (HAS_STRINGS(descr)) lParam = (LPARAM)PTR_SEG_TO_LIN(lParam);
/* fall through */
case LB_FINDSTRINGEXACT:
- return LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+ retvalue = LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+ goto END;
case LB_SELECTSTRING16:
wParam = (INT)(INT16)wParam;
@@ -2274,9 +2314,14 @@
{
INT index = LISTBOX_FindString( wnd, descr, wParam,
(LPCSTR)lParam, FALSE );
- if (index == LB_ERR) return LB_ERR;
+ if (index == LB_ERR)
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
LISTBOX_SetSelection( wnd, descr, index, TRUE, FALSE );
- return index;
+ retvalue = index;
+ goto END;
}
case LB_GETSEL16:
@@ -2284,128 +2329,171 @@
/* fall through */
case LB_GETSEL:
if (((INT)wParam < 0) || ((INT)wParam >= descr->nb_items))
- return LB_ERR;
- return descr->items[wParam].selected;
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
+ retvalue = descr->items[wParam].selected;
+ goto END;
case LB_SETSEL16:
lParam = (INT)(INT16)lParam;
/* fall through */
case LB_SETSEL:
- return LISTBOX_SetSelection( wnd, descr, lParam, wParam, FALSE );
+ retvalue = LISTBOX_SetSelection( wnd, descr, lParam, wParam, FALSE );
+ goto END;
case LB_SETCURSEL16:
wParam = (INT)(INT16)wParam;
/* fall through */
case LB_SETCURSEL:
LISTBOX_SetCaretIndex( wnd, descr, wParam, TRUE );
- return LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE );
+ retvalue = LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE );
+ goto END;
case LB_GETSELCOUNT16:
case LB_GETSELCOUNT:
- return LISTBOX_GetSelCount( wnd, descr );
+ retvalue = LISTBOX_GetSelCount( wnd, descr );
+ goto END;
case LB_GETSELITEMS16:
- return LISTBOX_GetSelItems16( wnd, descr, wParam,
+ retvalue = LISTBOX_GetSelItems16( wnd, descr, wParam,
(LPINT16)PTR_SEG_TO_LIN(lParam) );
+ goto END;
case LB_GETSELITEMS:
- return LISTBOX_GetSelItems( wnd, descr, wParam, (LPINT)lParam );
+ retvalue = LISTBOX_GetSelItems( wnd, descr, wParam, (LPINT)lParam );
+ goto END;
case LB_SELITEMRANGE16:
case LB_SELITEMRANGE:
if (LOWORD(lParam) <= HIWORD(lParam))
- return LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
+ {
+ retvalue = LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
HIWORD(lParam), wParam );
+ }
else
- return LISTBOX_SelectItemRange( wnd, descr, HIWORD(lParam),
+ {
+ retvalue = LISTBOX_SelectItemRange( wnd, descr, HIWORD(lParam),
LOWORD(lParam), wParam );
+ }
+ goto END;
case LB_SELITEMRANGEEX16:
case LB_SELITEMRANGEEX:
if ((INT)lParam >= (INT)wParam)
- return LISTBOX_SelectItemRange( wnd, descr, wParam, lParam, TRUE );
+ retvalue = LISTBOX_SelectItemRange( wnd, descr, wParam, lParam, TRUE );
else
- return LISTBOX_SelectItemRange( wnd, descr, lParam, wParam, FALSE);
+ retvalue = LISTBOX_SelectItemRange( wnd, descr, lParam, wParam, FALSE);
+ goto END;
case LB_GETHORIZONTALEXTENT16:
case LB_GETHORIZONTALEXTENT:
- return descr->horz_extent;
+ retvalue = descr->horz_extent;
+ goto END;
case LB_SETHORIZONTALEXTENT16:
case LB_SETHORIZONTALEXTENT:
- return LISTBOX_SetHorizontalExtent( wnd, descr, wParam );
+ retvalue = LISTBOX_SetHorizontalExtent( wnd, descr, wParam );
+ goto END;
case LB_GETANCHORINDEX16:
case LB_GETANCHORINDEX:
- return descr->anchor_item;
+ retvalue = descr->anchor_item;
+ goto END;
case LB_SETANCHORINDEX16:
wParam = (INT)(INT16)wParam;
/* fall through */
case LB_SETANCHORINDEX:
if (((INT)wParam < -1) || ((INT)wParam >= descr->nb_items))
- return LB_ERR;
+ {
+ retvalue = LB_ERR;
+ goto END;
+ }
descr->anchor_item = (INT)wParam;
- return LB_OKAY;
+ retvalue = LB_OKAY;
+ goto END;
case LB_DIR16:
- return LISTBOX_Directory( wnd, descr, wParam,
+ retvalue = LISTBOX_Directory( wnd, descr, wParam,
(LPCSTR)PTR_SEG_TO_LIN(lParam), FALSE );
+ goto END;
case LB_DIR:
- return LISTBOX_Directory( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+ retvalue = LISTBOX_Directory( wnd, descr, wParam, (LPCSTR)lParam, TRUE );
+ goto END;
case LB_GETLOCALE:
- return descr->locale;
+ retvalue = descr->locale;
+ goto END;
case LB_SETLOCALE:
descr->locale = (LCID)wParam; /* FIXME: should check for valid lcid */
- return LB_OKAY;
+ retvalue = LB_OKAY;
+ goto END;
case LB_INITSTORAGE:
- return LISTBOX_InitStorage( wnd, descr, wParam, (DWORD)lParam );
+ retvalue = LISTBOX_InitStorage( wnd, descr, wParam, (DWORD)lParam );
+ goto END;
case LB_SETCOUNT:
- return LISTBOX_SetCount( wnd, descr, (INT)wParam );
+ retvalue = LISTBOX_SetCount( wnd, descr, (INT)wParam );
+ goto END;
case LB_SETTABSTOPS16:
- return LISTBOX_SetTabStops( wnd, descr, (INT)(INT16)wParam,
+ retvalue = LISTBOX_SetTabStops( wnd, descr, (INT)(INT16)wParam,
(LPINT)PTR_SEG_TO_LIN(lParam), TRUE );
+ goto END;
case LB_SETTABSTOPS:
- return LISTBOX_SetTabStops( wnd, descr, wParam,
+ retvalue = LISTBOX_SetTabStops( wnd, descr, wParam,
(LPINT)lParam, FALSE );
+ goto END;
case LB_CARETON16:
case LB_CARETON:
- if (descr->caret_on) return LB_OKAY;
+ if (descr->caret_on)
+ {
+ retvalue = LB_OKAY;
+ goto END;
+ }
descr->caret_on = TRUE;
if ((descr->focus_item != -1) && (GetFocus() == wnd->hwndSelf))
LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
- return LB_OKAY;
+ retvalue = LB_OKAY;
+ goto END;
case LB_CARETOFF16:
case LB_CARETOFF:
- if (!descr->caret_on) return LB_OKAY;
+ if (!descr->caret_on)
+ {
+ retvalue = LB_OKAY;
+ goto END;
+ }
descr->caret_on = FALSE;
if ((descr->focus_item != -1) && (GetFocus() == wnd->hwndSelf))
LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
- return LB_OKAY;
+ retvalue = LB_OKAY;
+ goto END;
case WM_DESTROY:
- return LISTBOX_Destroy( wnd, descr );
+ retvalue = LISTBOX_Destroy( wnd, descr );
+ goto END;
case WM_ENABLE:
InvalidateRect( hwnd, NULL, TRUE );
- return 0;
+ retvalue = 0;
+ goto END;
case WM_SETREDRAW:
LISTBOX_SetRedraw( wnd, descr, wParam != 0 );
- return 0;
+ retvalue = 0;
+ goto END;
case WM_GETDLGCODE:
- return DLGC_WANTARROWS | DLGC_WANTCHARS;
-
+ retvalue =DLGC_WANTARROWS | DLGC_WANTCHARS;
+ goto END;
case WM_PAINT:
{
PAINTSTRUCT ps;
@@ -2414,67 +2502,67 @@
ret = LISTBOX_Paint( wnd, descr, hdc );
if( !wParam ) EndPaint( hwnd, &ps );
}
- return ret;
-
+ retvalue =ret;
+ goto END;
case WM_SIZE:
LISTBOX_UpdateSize( wnd, descr );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_GETFONT:
- return descr->font;
-
+ retvalue =descr->font;
+ goto END;
case WM_SETFONT:
LISTBOX_SetFont( wnd, descr, (HFONT)wParam );
if (lParam) InvalidateRect( wnd->hwndSelf, 0, TRUE );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_SETFOCUS:
descr->caret_on = TRUE;
if (descr->focus_item != -1)
LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
SEND_NOTIFICATION( wnd, descr, LBN_SETFOCUS );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_KILLFOCUS:
if ((descr->focus_item != -1) && descr->caret_on)
LISTBOX_RepaintItem( wnd, descr, descr->focus_item, ODA_FOCUS );
SEND_NOTIFICATION( wnd, descr, LBN_KILLFOCUS );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_HSCROLL:
- return LISTBOX_HandleHScroll( wnd, descr, wParam, lParam );
-
+ retvalue =LISTBOX_HandleHScroll( wnd, descr, wParam, lParam );
+ goto END;
case WM_VSCROLL:
- return LISTBOX_HandleVScroll( wnd, descr, wParam, lParam );
-
+ retvalue =LISTBOX_HandleVScroll( wnd, descr, wParam, lParam );
+ goto END;
case WM_LBUTTONDOWN:
- return LISTBOX_HandleLButtonDown( wnd, descr, wParam,
+ retvalue =LISTBOX_HandleLButtonDown( wnd, descr, wParam,
(INT16)LOWORD(lParam),
(INT16)HIWORD(lParam) );
-
+ goto END;
case WM_LBUTTONDBLCLK:
if (descr->style & LBS_NOTIFY)
SEND_NOTIFICATION( wnd, descr, LBN_DBLCLK );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_MOUSEMOVE:
if (GetCapture() == hwnd)
LISTBOX_HandleMouseMove( wnd, descr, (INT16)LOWORD(lParam),
(INT16)HIWORD(lParam) );
- return 0;
-
+ retvalue =0;
+ goto END;
case WM_LBUTTONUP:
- return LISTBOX_HandleLButtonUp( wnd, descr );
-
+ retvalue =LISTBOX_HandleLButtonUp( wnd, descr );
+ goto END;
case WM_KEYDOWN:
- return LISTBOX_HandleKeyDown( wnd, descr, wParam );
-
+ retvalue =LISTBOX_HandleKeyDown( wnd, descr, wParam );
+ goto END;
case WM_CHAR:
- return LISTBOX_HandleChar( wnd, descr, wParam );
-
+ retvalue =LISTBOX_HandleChar( wnd, descr, wParam );
+ goto END;
case WM_SYSTIMER:
- return LISTBOX_HandleSystemTimer( wnd, descr );
-
+ retvalue =LISTBOX_HandleSystemTimer( wnd, descr );
+ goto END;
case WM_ERASEBKGND:
if (IS_OWNERDRAW(descr))
{
@@ -2483,11 +2571,14 @@
wParam, (LPARAM)wnd->hwndSelf );
if (hbrush) FillRect( (HDC)wParam, &rect, hbrush );
}
- return 1;
-
+ retvalue =1;
+ goto END;
case WM_DROPFILES:
if( !descr->lphc )
- return SendMessageA( descr->owner, msg, wParam, lParam );
+ {
+ retvalue =SendMessageA( descr->owner, msg, wParam, lParam );
+ goto END;
+ }
break;
case WM_DROPOBJECT:
@@ -2499,22 +2590,27 @@
LPDRAGINFO dragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN( (SEGPTR)lParam );
dragInfo->l = LISTBOX_GetItemFromPoint( wnd, descr, dragInfo->pt.x,
dragInfo->pt.y );
- return SendMessageA( descr->owner, msg, wParam, lParam );
+ retvalue =SendMessageA( descr->owner, msg, wParam, lParam );
+ goto END;
}
break;
case WM_NCCREATE:
if (TWEAK_WineLook > WIN31_LOOK)
wnd->dwExStyle |= WS_EX_CLIENTEDGE;
- return DefWindowProcA( hwnd, msg, wParam, lParam );
-
+ retvalue =DefWindowProcA( hwnd, msg, wParam, lParam );
+ goto END;
default:
if ((msg >= WM_USER) && (msg < 0xc000))
WARN(listbox, "[%04x]: unknown msg %04x wp %08x lp %08lx\n",
hwnd, msg, wParam, lParam );
- return DefWindowProcA( hwnd, msg, wParam, lParam );
+ retvalue =DefWindowProcA( hwnd, msg, wParam, lParam );
+ goto END;
}
- return 0;
+ retvalue =0;
+END:
+ WIN_ReleaseWndPtr(wnd);
+ return retvalue;
}
/***********************************************************************
@@ -2533,8 +2629,10 @@
RedrawWindow( lphc->self->hwndSelf, NULL, 0,
RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW );
+ WIN_ReleaseWndPtr(wnd);
return lRet;
}
+ WIN_ReleaseWndPtr(wnd);
}
return CB_ERR;
}
@@ -2571,20 +2669,20 @@
lphc = (LPHEADCOMBO)(lpcs->lpCreateParams);
#undef lpcs
- return LISTBOX_Create( wnd, lphc );
-
+ lRet =LISTBOX_Create( wnd, lphc );
+ goto END;
case WM_LBUTTONDOWN:
- return LISTBOX_HandleLButtonDown( wnd, descr, wParam,
+ lRet =LISTBOX_HandleLButtonDown( wnd, descr, wParam,
(INT16)LOWORD(lParam), (INT16)HIWORD(lParam));
-
+ goto END;
/* avoid activation at all costs */
case WM_MOUSEACTIVATE:
- return MA_NOACTIVATE;
-
+ lRet =MA_NOACTIVATE;
+ goto END;
case WM_NCACTIVATE:
- return FALSE;
-
+ lRet =FALSE;
+ goto END;
case WM_KEYDOWN:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
{
@@ -2596,30 +2694,34 @@
&& (wParam == VK_DOWN || wParam == VK_UP)) )
{
COMBO_FlipListbox( lphc, FALSE );
- return 0;
+ lRet =0;
+ goto END;
}
}
- return LISTBOX_HandleKeyDown( wnd, descr, wParam );
+ lRet =LISTBOX_HandleKeyDown( wnd, descr, wParam );
+ goto END;
case LB_SETCURSEL16:
case LB_SETCURSEL:
lRet = ListBoxWndProc( hwnd, msg, wParam, lParam );
- return (lRet == LB_ERR) ? lRet : descr->selected_item;
-
+ lRet =(lRet == LB_ERR) ? lRet : descr->selected_item;
+ goto END;
case WM_NCDESTROY:
if( CB_GETTYPE(lphc) != CBS_SIMPLE )
lphc->hWndLBox = 0;
/* fall through */
default:
- return ListBoxWndProc( hwnd, msg, wParam, lParam );
+ lRet =ListBoxWndProc( hwnd, msg, wParam, lParam );
+ goto END;
}
}
lRet = DefWindowProcA( hwnd, msg, wParam, lParam );
TRACE(combo,"\t default on msg [%04x]\n", (UINT16)msg );
}
-
+END:
+ WIN_ReleaseWndPtr(wnd);
return lRet;
}
diff --git a/controls/menu.c b/controls/menu.c
index afe3223..3ba4f66 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -272,6 +272,37 @@
return hMenu;
}
+/***********************************************************************
+ * MENU_GetTopPopupWnd()
+ *
+ * Return the locked pointer pTopPopupWnd.
+ */
+WND *MENU_GetTopPopupWnd()
+{
+ return WIN_LockWndPtr(pTopPopupWnd);
+}
+/***********************************************************************
+ * MENU_ReleaseTopPopupWnd()
+ *
+ * Realease the locked pointer pTopPopupWnd.
+ */
+void MENU_ReleaseTopPopupWnd()
+{
+ WIN_ReleaseWndPtr(pTopPopupWnd);
+}
+/***********************************************************************
+ * MENU_DestroyTopPopupWnd()
+ *
+ * Destroy the locked pointer pTopPopupWnd.
+ */
+void MENU_DestroyTopPopupWnd()
+{
+ WND *tmpWnd = pTopPopupWnd;
+ pTopPopupWnd = NULL;
+ WIN_ReleaseWndPtr(tmpWnd);
+}
+
+
/**********************************************************************
* MENU_GetSysMenu
@@ -536,6 +567,7 @@
if (!(wndPtr = WIN_FindWndPtr( menu->hWnd ))) return NULL;
pt.x -= wndPtr->rectWindow.left;
pt.y -= wndPtr->rectWindow.top;
+ WIN_ReleaseWndPtr(wndPtr);
item = menu->items;
for (i = 0; i < menu->nItems; i++, item++)
{
@@ -565,6 +597,7 @@
{
WND* w = WIN_FindWndPtr(hwndOwner);
hmenu = GetSubMenu(w->hSysMenu, 0);
+ WIN_ReleaseWndPtr(w);
}
if (hmenu)
@@ -1212,16 +1245,24 @@
BOOL suppress_draw)
{
LPPOPUPMENU lppop;
- UINT i;
+ UINT i,retvalue;
WND *wndPtr = WIN_FindWndPtr( hwnd );
lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR( (HMENU16)wndPtr->wIDmenu );
- if (lppop == NULL || lprect == NULL) return SYSMETRICS_CYMENU;
+ if (lppop == NULL || lprect == NULL)
+ {
+ retvalue = SYSMETRICS_CYMENU;
+ goto END;
+ }
TRACE(menu,"(%04x, %p, %p); !\n",
hDC, lprect, lppop);
if (lppop->Height == 0) MENU_MenuBarCalcSize(hDC, lprect, lppop, hwnd);
lprect->bottom = lprect->top + lppop->Height;
- if (suppress_draw) return lppop->Height;
+ if (suppress_draw)
+ {
+ retvalue = lppop->Height;
+ goto END;
+ }
FillRect(hDC, lprect, GetSysColorBrush(COLOR_MENU) );
@@ -1236,13 +1277,20 @@
LineTo( hDC, lprect->right, lprect->bottom );
}
- if (lppop->nItems == 0) return SYSMETRICS_CYMENU;
+ if (lppop->nItems == 0)
+ {
+ retvalue = SYSMETRICS_CYMENU;
+ goto END;
+ }
for (i = 0; i < lppop->nItems; i++)
{
MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE,
ODA_DRAWENTIRE );
}
- return lppop->Height;
+ retvalue = lppop->Height;
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -1251,34 +1299,37 @@
*/
BOOL MENU_PatchResidentPopup( HQUEUE16 checkQueue, WND* checkWnd )
{
- if( pTopPopupWnd )
+ WND *pTPWnd = MENU_GetTopPopupWnd();
+
+ if( pTPWnd )
{
HTASK16 hTask = 0;
TRACE(menu,"patching resident popup: %04x %04x [%04x %04x]\n",
- checkQueue, checkWnd ? checkWnd->hwndSelf : 0, pTopPopupWnd->hmemTaskQ,
- pTopPopupWnd->owner ? pTopPopupWnd->owner->hwndSelf : 0);
+ checkQueue, checkWnd ? checkWnd->hwndSelf : 0, pTPWnd->hmemTaskQ,
+ pTPWnd->owner ? pTPWnd->owner->hwndSelf : 0);
switch( checkQueue )
{
case 0: /* checkWnd is the new popup owner */
if( checkWnd )
{
- pTopPopupWnd->owner = checkWnd;
- if( pTopPopupWnd->hmemTaskQ != checkWnd->hmemTaskQ )
+ pTPWnd->owner = checkWnd;
+ if( pTPWnd->hmemTaskQ != checkWnd->hmemTaskQ )
hTask = QUEUE_GetQueueTask( checkWnd->hmemTaskQ );
}
break;
case 0xFFFF: /* checkWnd is destroyed */
- if( pTopPopupWnd->owner == checkWnd )
- pTopPopupWnd->owner = NULL;
+ if( pTPWnd->owner == checkWnd )
+ pTPWnd->owner = NULL;
+ MENU_ReleaseTopPopupWnd();
return TRUE;
default: /* checkQueue is exiting */
- if( pTopPopupWnd->hmemTaskQ == checkQueue )
+ if( pTPWnd->hmemTaskQ == checkQueue )
{
- hTask = QUEUE_GetQueueTask( pTopPopupWnd->hmemTaskQ );
+ hTask = QUEUE_GetQueueTask( pTPWnd->hmemTaskQ );
hTask = TASK_GetNextTask( hTask );
}
break;
@@ -1289,13 +1340,15 @@
TDB* task = (TDB*)GlobalLock16( hTask );
if( task )
{
- pTopPopupWnd->hInstance = task->hInstance;
- pTopPopupWnd->hmemTaskQ = task->hQueue;
+ pTPWnd->hInstance = task->hInstance;
+ pTPWnd->hmemTaskQ = task->hQueue;
+ MENU_ReleaseTopPopupWnd();
return TRUE;
}
else WARN(menu,"failed to patch resident popup.\n");
}
}
+ MENU_ReleaseTopPopupWnd();
return FALSE;
}
@@ -1358,8 +1411,13 @@
WS_POPUP, x, y, width, height,
hwndOwner, 0, wndOwner->hInstance,
(LPVOID)hmenu ));
- if (!pTopPopupWnd) return FALSE;
+ if (!pTopPopupWnd)
+ {
+ WIN_ReleaseWndPtr(wndOwner);
+ return FALSE;
+ }
menu->hWnd = pTopPopupWnd->hwndSelf;
+ MENU_ReleaseTopPopupWnd();
}
else
if( uSubPWndLevel )
@@ -1370,19 +1428,25 @@
WS_POPUP, x, y, width, height,
menu->hWnd, 0, wndOwner->hInstance,
(LPVOID)hmenu );
- if( !menu->hWnd ) return FALSE;
+ if( !menu->hWnd )
+ {
+ WIN_ReleaseWndPtr(wndOwner);
+ return FALSE;
+ }
}
else /* top level popup menu window already exists */
{
- menu->hWnd = pTopPopupWnd->hwndSelf;
+ WND *pTPWnd = MENU_GetTopPopupWnd();
+ menu->hWnd = pTPWnd->hwndSelf;
MENU_PatchResidentPopup( 0, wndOwner );
- SendMessage16( pTopPopupWnd->hwndSelf, MM_SETMENUHANDLE, (WPARAM16)hmenu, 0L);
+ SendMessage16( pTPWnd->hwndSelf, MM_SETMENUHANDLE, (WPARAM16)hmenu, 0L);
/* adjust its size */
SetWindowPos( menu->hWnd, 0, x, y, width, height,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
+ MENU_ReleaseTopPopupWnd();
}
uSubPWndLevel++; /* menu level counter */
@@ -1392,6 +1456,7 @@
SetWindowPos( menu->hWnd, HWND_TOP, 0, 0, 0, 0,
SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE );
UpdateWindow( menu->hWnd );
+ WIN_ReleaseWndPtr(wndOwner);
return TRUE;
}
return FALSE;
@@ -1785,7 +1850,7 @@
MENU_HideSubPopups( hwndOwner, hsubmenu, FALSE );
MENU_SelectItem( hwndOwner, hsubmenu, NO_SELECTED_ITEM, sendMenuSelect );
- if (submenu->hWnd == pTopPopupWnd->hwndSelf )
+ if (submenu->hWnd == MENU_GetTopPopupWnd()->hwndSelf )
{
ShowWindow( submenu->hWnd, SW_HIDE );
uSubPWndLevel = 0;
@@ -1795,6 +1860,7 @@
DestroyWindow( submenu->hWnd );
submenu->hWnd = 0;
}
+ MENU_ReleaseTopPopupWnd();
}
}
@@ -1817,11 +1883,19 @@
if (!(menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenu ))) return hmenu;
if (!(wndPtr = WIN_FindWndPtr( menu->hWnd )) ||
- (menu->FocusedItem == NO_SELECTED_ITEM)) return hmenu;
+ (menu->FocusedItem == NO_SELECTED_ITEM))
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return hmenu;
+ }
item = &menu->items[menu->FocusedItem];
if (!(item->fType & MF_POPUP) ||
- (item->fState & (MF_GRAYED | MF_DISABLED))) return hmenu;
+ (item->fState & (MF_GRAYED | MF_DISABLED)))
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return hmenu;
+ }
/* message must be send before using item,
because nearly everything may by changed by the application ! */
@@ -1877,6 +1951,7 @@
rect.left, rect.top, rect.right, rect.bottom );
if (selectFirst)
MENU_MoveSelection( hwndOwner, item->hSubMenu, ITEM_NEXT );
+ WIN_ReleaseWndPtr(wndPtr);
return item->hSubMenu;
}
@@ -1908,6 +1983,7 @@
ht = ( ht == HTSYSMENU ) ? (UINT)(wndPtr->hSysMenu)
: ( ht == HTMENU ) ? (UINT)(wndPtr->wIDmenu) : 0;
+ WIN_ReleaseWndPtr(wndPtr);
}
}
return (HMENU)ht;
@@ -2135,7 +2211,10 @@
/* switch to the menu bar */
if( wndPtr->dwStyle & WS_CHILD || !wndPtr->wIDmenu )
+ {
+ WIN_ReleaseWndPtr(wndPtr);
return FALSE;
+ }
hNewMenu = wndPtr->wIDmenu;
if( vk == VK_LEFT )
@@ -2149,7 +2228,12 @@
/* switch to the system menu */
hNewMenu = wndPtr->hSysMenu;
}
- else return FALSE;
+ else
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return FALSE;
+ }
+ WIN_ReleaseWndPtr(wndPtr);
}
else /* application returned a new menu to switch to */
{
@@ -2171,8 +2255,10 @@
* try to track hNewMenu as a popup? */
TRACE(menu," -- got confused.\n");
+ WIN_ReleaseWndPtr(wndPtr);
return FALSE;
}
+ WIN_ReleaseWndPtr(wndPtr);
}
else return FALSE;
}
@@ -2702,6 +2788,7 @@
LPARAM lParam )
{
WND* wndPtr = WIN_FindWndPtr(hwnd);
+ LRESULT retvalue;
switch(message)
{
@@ -2709,11 +2796,13 @@
{
CREATESTRUCTA *cs = (CREATESTRUCTA*)lParam;
SetWindowLongA( hwnd, 0, (LONG)cs->lpCreateParams );
- return 0;
+ retvalue = 0;
+ goto END;
}
case WM_MOUSEACTIVATE: /* We don't want to be activated */
- return MA_NOACTIVATE;
+ retvalue = MA_NOACTIVATE;
+ goto END;
case WM_PAINT:
{
@@ -2722,27 +2811,30 @@
MENU_DrawPopupMenu( hwnd, ps.hdc,
(HMENU)GetWindowLongA( hwnd, 0 ) );
EndPaint( hwnd, &ps );
- return 0;
+ retvalue = 0;
+ goto END;
}
case WM_ERASEBKGND:
- return 1;
+ retvalue = 1;
+ goto END;
case WM_DESTROY:
/* zero out global pointer in case resident popup window
* was somehow destroyed. */
- if( pTopPopupWnd )
+ if(MENU_GetTopPopupWnd() )
{
if( hwnd == pTopPopupWnd->hwndSelf )
{
ERR(menu, "resident popup destroyed!\n");
- pTopPopupWnd = NULL;
+ MENU_DestroyTopPopupWnd();
uSubPWndLevel = 0;
}
else
uSubPWndLevel--;
+ MENU_ReleaseTopPopupWnd();
}
break;
@@ -2764,12 +2856,17 @@
case MM_GETMENUHANDLE:
- return *(HMENU*)wndPtr->wExtra;
+ retvalue = *(HMENU*)wndPtr->wExtra;
+ goto END;
default:
- return DefWindowProcA( hwnd, message, wParam, lParam );
+ retvalue = DefWindowProcA( hwnd, message, wParam, lParam );
+ goto END;
}
- return 0;
+ retvalue = 0;
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -2785,18 +2882,24 @@
RECT rectBar;
WND *wndPtr;
LPPOPUPMENU lppop;
+ UINT retvalue;
TRACE(menu, "HWND 0x%x, width %d, "
"at (%d, %d).\n", hwnd, menubarWidth, orgX, orgY );
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
if (!(lppop = (LPPOPUPMENU)USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu)))
+ {
+ WIN_ReleaseWndPtr(wndPtr);
return 0;
+ }
hdc = GetDCEx( hwnd, 0, DCX_CACHE | DCX_WINDOW );
SetRect(&rectBar, orgX, orgY, orgX+menubarWidth, orgY+SYSMETRICS_CYMENU);
MENU_MenuBarCalcSize( hdc, &rectBar, lppop, hwnd );
ReleaseDC( hwnd, hdc );
- return lppop->Height;
+ retvalue = lppop->Height;
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -3430,18 +3533,21 @@
if (hMenu && hMenu != MENU_DefSysPopup)
{
LPPOPUPMENU lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu);
+ WND *pTPWnd = MENU_GetTopPopupWnd();
- if( pTopPopupWnd && (hMenu == *(HMENU*)pTopPopupWnd->wExtra) )
- *(UINT*)pTopPopupWnd->wExtra = 0;
+ if( pTPWnd && (hMenu == *(HMENU*)pTPWnd->wExtra) )
+ *(UINT*)pTPWnd->wExtra = 0;
if (IS_A_MENU( lppop ))
{
lppop->wMagic = 0; /* Mark it as destroyed */
if ((lppop->wFlags & MF_POPUP) && lppop->hWnd &&
- (!pTopPopupWnd || (lppop->hWnd != pTopPopupWnd->hwndSelf)))
+ (!pTPWnd || (lppop->hWnd != pTPWnd->hwndSelf)))
DestroyWindow( lppop->hWnd );
+ MENU_ReleaseTopPopupWnd();
+
if (lppop->items) /* recursively destroy submenus */
{
int i;
@@ -3499,7 +3605,12 @@
wndPtr->hSysMenu = MENU_GetSysMenu( hWnd, (HMENU)(-1) );
if( wndPtr->hSysMenu )
- return GetSubMenu16(wndPtr->hSysMenu, 0);
+ {
+ HMENU retvalue = GetSubMenu16(wndPtr->hSysMenu, 0);
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
+ }
+ WIN_ReleaseWndPtr(wndPtr);
}
return 0;
}
@@ -3525,6 +3636,7 @@
{
if (wndPtr->hSysMenu) DestroyMenu( wndPtr->hSysMenu );
wndPtr->hSysMenu = MENU_GetSysMenu( hwnd, hMenu );
+ WIN_ReleaseWndPtr(wndPtr);
return TRUE;
}
return FALSE;
@@ -3536,10 +3648,17 @@
*/
HMENU16 WINAPI GetMenu16( HWND16 hWnd )
{
+ HMENU16 retvalue;
WND * wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr && !(wndPtr->dwStyle & WS_CHILD))
- return (HMENU16)wndPtr->wIDmenu;
- return 0;
+ {
+ retvalue = (HMENU16)wndPtr->wIDmenu;
+ goto END;
+}
+ retvalue = 0;
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -3548,10 +3667,17 @@
*/
HMENU WINAPI GetMenu( HWND hWnd )
{
+ HMENU retvalue;
WND * wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr && !(wndPtr->dwStyle & WS_CHILD))
- return (HMENU)wndPtr->wIDmenu;
- return 0;
+ {
+ retvalue = (HMENU)wndPtr->wIDmenu;
+ goto END;
+ }
+ retvalue = 0;
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -3582,7 +3708,11 @@
{
LPPOPUPMENU lpmenu;
- if (!(lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu))) return FALSE;
+ if (!(lpmenu = (LPPOPUPMENU) USER_HEAP_LIN_ADDR(hMenu)))
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return FALSE;
+ }
lpmenu->hWnd = hWnd;
lpmenu->wFlags &= ~MF_POPUP; /* Can't be a popup */
lpmenu->Height = 0; /* Make sure we recalculate the size */
@@ -3590,8 +3720,10 @@
if (IsWindowVisible(hWnd))
SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+ WIN_ReleaseWndPtr(wndPtr);
return TRUE;
}
+ WIN_ReleaseWndPtr(wndPtr);
return FALSE;
}
@@ -3639,13 +3771,19 @@
if (wndPtr && !(wndPtr->dwStyle & WS_CHILD) && wndPtr->wIDmenu)
{
lppop = (LPPOPUPMENU) USER_HEAP_LIN_ADDR((HMENU16)wndPtr->wIDmenu);
- if (lppop == NULL) return FALSE;
+ if (lppop == NULL)
+ {
+ WIN_ReleaseWndPtr(wndPtr);
+ return FALSE;
+ }
lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
+ WIN_ReleaseWndPtr(wndPtr);
return TRUE;
}
+ WIN_ReleaseWndPtr(wndPtr);
return FALSE;
}
diff --git a/controls/scroll.c b/controls/scroll.c
index b157d62..d5705cd 100644
--- a/controls/scroll.c
+++ b/controls/scroll.c
@@ -146,8 +146,11 @@
*/
static SCROLLBAR_INFO *SCROLL_GetScrollInfo( HWND hwnd, INT nBar )
{
+ SCROLLBAR_INFO *retvalue;
WND *wndPtr = WIN_FindWndPtr( hwnd );
- return SCROLL_GetPtrScrollInfo( wndPtr, nBar );
+ retvalue = SCROLL_GetPtrScrollInfo( wndPtr, nBar );
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
@@ -204,6 +207,7 @@
break;
default:
+ WIN_ReleaseWndPtr(wndPtr);
return FALSE;
}
@@ -248,6 +252,7 @@
+ pixels * (info->CurVal-info->MinVal) / (max - info->MinVal);
}
}
+ WIN_ReleaseWndPtr(wndPtr);
return vertical;
}
@@ -560,8 +565,8 @@
if (!wndPtr || !infoPtr ||
((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
- ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
- if (!WIN_IsWindowDrawable( wndPtr, FALSE )) return;
+ ((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) goto END;
+ if (!WIN_IsWindowDrawable( wndPtr, FALSE )) goto END;
vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
&arrowSize, &thumbSize, &thumbPos );
@@ -581,6 +586,8 @@
if( interior )
SCROLL_DrawInterior( hwnd, hdc, nBar, &rect, arrowSize, thumbSize,
thumbPos, infoPtr->flags, vertical, FALSE, FALSE );
+END:
+ WIN_ReleaseWndPtr(wndPtr);
}
@@ -621,11 +628,13 @@
case VK_UP: msg = SB_LINEUP; break;
case VK_DOWN: msg = SB_LINEDOWN; break;
default:
+ WIN_ReleaseWndPtr(wndPtr);
return;
}
SendMessageA( GetParent(hwnd),
(wndPtr->dwStyle & SBS_VERT) ? WM_VSCROLL : WM_HSCROLL,
msg, hwnd );
+ WIN_ReleaseWndPtr(wndPtr);
}
@@ -1383,6 +1392,7 @@
BOOL fShowH, BOOL fShowV )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
+ BOOL retvalue = FALSE;
if (!wndPtr) return FALSE;
TRACE(scroll, "hwnd=%04x bar=%d horz=%d, vert=%d\n",
@@ -1392,7 +1402,8 @@
{
case SB_CTL:
ShowWindow( hwnd, fShowH ? SW_SHOW : SW_HIDE );
- return TRUE;
+ retvalue = TRUE;
+ goto END;
case SB_BOTH:
case SB_HORZ:
@@ -1423,17 +1434,22 @@
break;
default:
- return FALSE; /* Nothing to do! */
+ retvalue = FALSE; /* Nothing to do! */
+ goto END;
}
if( fShowH || fShowV ) /* frame has been changed, let the window redraw itself */
{
SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE
| SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
- return TRUE;
+ retvalue = TRUE;
+ goto END;
}
- return FALSE; /* no frame changes */
+ retvalue = FALSE; /* no frame changes */
+END:
+ WIN_ReleaseWndPtr(wndPtr);
+ return retvalue;
}
diff --git a/controls/static.c b/controls/static.c
index c7c21d0..c7846e7 100644
--- a/controls/static.c
+++ b/controls/static.c
@@ -182,12 +182,14 @@
if (style == SS_ICON)
{
- if (cs->lpszName) {
+ if (cs->lpszName)
+ {
if (!HIWORD(cs->lpszName) || cs->lpszName[0])
STATIC_SetIcon( wndPtr,
STATIC_LoadIcon( wndPtr, cs->lpszName ));
}
- return 1;
+ lResult = 1;
+ goto END;
}
if (style == SS_BITMAP)
{
@@ -196,15 +198,18 @@
STATIC_LoadBitmap( wndPtr, cs->lpszName ));
WARN(static, "style SS_BITMAP, dwStyle is 0x%08lx\n",
wndPtr->dwStyle);
- return 1;
+ lResult = 1;
+ goto END;
}
- if (!HIWORD(cs->lpszName) && (cs->lpszName)) {
+ if (!HIWORD(cs->lpszName) && (cs->lpszName))
+ {
FIXME(static,"windowName is 0x%04x, not doing DefWindowProc\n",
- LOWORD(cs->lpszName)
- );
- return 1;
+ LOWORD(cs->lpszName));
+ lResult = 1;
+ goto END;
}
- return DefWindowProcA( hWnd, uMsg, wParam, lParam );
+ lResult = DefWindowProcA( hWnd, uMsg, wParam, lParam );
+ goto END;
}
case WM_CREATE:
if (style < 0L || style > SS_TYPEMASK)
@@ -268,8 +273,16 @@
break;
case WM_SETFONT:
- if (style == SS_ICON) return 0;
- if (style == SS_BITMAP) return 0;
+ if (style == SS_ICON)
+ {
+ lResult = 0;
+ goto END;
+ }
+ if (style == SS_BITMAP)
+ {
+ lResult = 0;
+ goto END;
+ }
infoPtr->hFont = (HFONT16)wParam;
if (LOWORD(lParam))
{
@@ -279,18 +292,22 @@
break;
case WM_GETFONT:
- return infoPtr->hFont;
+ lResult = infoPtr->hFont;
+ goto END;
case WM_NCHITTEST:
- return HTTRANSPARENT;
+ lResult = HTTRANSPARENT;
+ goto END;
case WM_GETDLGCODE:
- return DLGC_STATIC;
+ lResult = DLGC_STATIC;
+ goto END;
case STM_GETIMAGE:
case STM_GETICON16:
case STM_GETICON:
- return infoPtr->hIcon;
+ lResult = infoPtr->hIcon;
+ goto END;
case STM_SETIMAGE:
/* FIXME: handle wParam */
@@ -311,6 +328,8 @@
break;
}
+END:
+ WIN_ReleaseWndPtr(wndPtr);
return lResult;
}