From e19711eebf112d620d8a440653602cec0f58f7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 12 Dec 2015 20:40:19 +0000 Subject: [PATCH] [CLIPBRD] Handle WM_PALETTECHANGED and WM_QUERYNEWPALETTE: realizes any palette found on the clipboard, if there is any, if it receives one of those messages. svn path=/trunk/; revision=70329 --- reactos/base/applications/clipbrd/clipbrd.c | 24 ++++++++++ reactos/base/applications/clipbrd/winutils.c | 50 ++++++++++++++++++++ reactos/base/applications/clipbrd/winutils.h | 1 + 3 files changed, 75 insertions(+) diff --git a/reactos/base/applications/clipbrd/clipbrd.c b/reactos/base/applications/clipbrd/clipbrd.c index 3a37c8df949..e7c79ea9eab 100644 --- a/reactos/base/applications/clipbrd/clipbrd.c +++ b/reactos/base/applications/clipbrd/clipbrd.c @@ -407,6 +407,30 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } + case WM_QUERYNEWPALETTE: + { + if (RealizeClipboardPalette(hWnd) != GDI_ERROR) + { + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + return TRUE; + } + return FALSE; + } + + case WM_PALETTECHANGED: + { + if ((HWND)wParam != hWnd) + { + if (RealizeClipboardPalette(hWnd) != GDI_ERROR) + { + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + } + } + break; + } + default: { return DefWindowProc(hWnd, uMsg, wParam, lParam); diff --git a/reactos/base/applications/clipbrd/winutils.c b/reactos/base/applications/clipbrd/winutils.c index 0fc98bcf849..2196fd2c68f 100644 --- a/reactos/base/applications/clipbrd/winutils.c +++ b/reactos/base/applications/clipbrd/winutils.c @@ -156,3 +156,53 @@ void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect) hEmf = GetClipboardData(CF_ENHMETAFILE); PlayEnhMetaFile(hdc, hEmf, lpRect); } + +UINT RealizeClipboardPalette(HWND hWnd) +{ + HPALETTE hPalette; + HPALETTE hOldPalette; + UINT uResult; + HDC hDevContext; + + if (!OpenClipboard(NULL)) + { + return GDI_ERROR; + } + + if (!IsClipboardFormatAvailable(CF_PALETTE)) + { + CloseClipboard(); + return GDI_ERROR; + } + + hPalette = GetClipboardData(CF_PALETTE); + if (!hPalette) + { + CloseClipboard(); + return GDI_ERROR; + } + + hDevContext = GetDC(hWnd); + if (!hDevContext) + { + CloseClipboard(); + return GDI_ERROR; + } + + hOldPalette = SelectPalette(hDevContext, hPalette, FALSE); + if (!hOldPalette) + { + ReleaseDC(hWnd, hDevContext); + CloseClipboard(); + return GDI_ERROR; + } + + uResult = RealizePalette(hDevContext); + + SelectPalette(hDevContext, hOldPalette, FALSE); + ReleaseDC(hWnd, hDevContext); + + CloseClipboard(); + + PlayEnhMetaFile(hdc, hEmf, lpRect); +} diff --git a/reactos/base/applications/clipbrd/winutils.h b/reactos/base/applications/clipbrd/winutils.h index 1dde2e015d3..ff7b5866960 100644 --- a/reactos/base/applications/clipbrd/winutils.h +++ b/reactos/base/applications/clipbrd/winutils.h @@ -15,3 +15,4 @@ void BitBltFromClipboard(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH void SetDIBitsToDeviceFromClipboard(UINT uFormat, HDC hdc, int XDest, int YDest, int XSrc, int YSrc, UINT uStartScan, UINT fuColorUse); void PlayMetaFileFromClipboard(HDC hdc, const RECT *lpRect); void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect); +UINT RealizeClipboardPalette(HWND hWnd);