Skip to content

Commit ab3e000

Browse files
committed
[DESK] Fix screensaver preview drawing
Use window subclassing to override WM_PAINT message handling and use RedrawWindow function along with WS_CLIPCHILDREN style for the parent window in order to preserve screensaver drawing. CORE-15929
1 parent 092fc8e commit ab3e000

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

dll/cpl/desk/screensaver.c

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ typedef struct _DATA
2727
ScreenSaverItem ScreenSaverItems[MAX_SCREENSAVERS];
2828
PROCESS_INFORMATION PrevWindowPi;
2929
int Selection;
30+
WNDPROC OldPreviewProc;
3031
UINT ScreenSaverCount;
3132
HWND ScreenSaverPreviewParent;
3233
} DATA, *PDATA;
@@ -107,6 +108,33 @@ SelectionChanged(HWND hwndDlg, PDATA pData)
107108
}
108109

109110

111+
LRESULT CALLBACK
112+
RedrawSubclassProc(HWND hwndDlg,
113+
UINT uMsg,
114+
WPARAM wParam,
115+
LPARAM lParam)
116+
{
117+
HWND hwnd;
118+
PDATA pData;
119+
LRESULT Ret = FALSE;
120+
121+
pData = (PDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
122+
if (!pData)
123+
return Ret;
124+
125+
Ret = CallWindowProc(pData->OldPreviewProc, hwndDlg, uMsg, wParam, lParam);
126+
127+
if (uMsg == WM_PAINT)
128+
{
129+
hwnd = pData->ScreenSaverPreviewParent;
130+
if (hwnd)
131+
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);
132+
}
133+
134+
return Ret;
135+
}
136+
137+
110138
static VOID
111139
ShowScreenSaverPreview(IN LPDRAWITEMSTRUCT draw, IN PDATA pData)
112140
{
@@ -650,8 +678,16 @@ OnInitDialog(HWND hwndDlg, PDATA pData)
650678
HWND hParent = GetDlgItem(hwndDlg, IDC_SCREENS_PREVIEW);
651679
HWND hChild;
652680

681+
if (hParent != NULL)
682+
{
683+
pData->OldPreviewProc = (WNDPROC)GetWindowLongPtr(hParent, GWLP_WNDPROC);
684+
SetWindowLongPtr(hParent, GWLP_WNDPROC, (LONG_PTR)RedrawSubclassProc);
685+
SetWindowLongPtr(hParent, GWLP_USERDATA, (LONG_PTR)pData);
686+
}
687+
653688
hChild = CreateWindowEx(0, szPreviewWndClass, NULL,
654-
WS_CHILD, 0, 0, 0, 0, hParent,
689+
WS_CHILD | WS_CLIPCHILDREN,
690+
0, 0, 0, 0, hParent,
655691
NULL, hApplet, NULL);
656692
if (hChild != NULL)
657693
{
@@ -781,6 +817,9 @@ ScreenSaverPageProc(HWND hwndDlg,
781817
{
782818
if (pData->ScreenSaverPreviewParent)
783819
{
820+
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_SCREENS_PREVIEW),
821+
GWLP_WNDPROC,
822+
(LONG_PTR)pData->OldPreviewProc);
784823
DestroyWindow(pData->ScreenSaverPreviewParent);
785824
pData->ScreenSaverPreviewParent = NULL;
786825
}

0 commit comments

Comments
 (0)