Made access to the wnd struct thread-safe.
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;
}