https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f90a1956a53017de1fb9e4ea72ddda9c708db8a0

commit f90a1956a53017de1fb9e4ea72ddda9c708db8a0
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Sun Aug 27 19:41:13 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Sun Aug 27 19:41:13 2023 +0900

    [CLIPBRD] Support CF_HDROP format (#5622)
    
    This allows to see what files are being copied into clipboard.
    CORE-19140
---
 base/applications/clipbrd/clipbrd.c   |  7 +++++++
 base/applications/clipbrd/cliputils.c |  3 ++-
 base/applications/clipbrd/winutils.c  | 39 +++++++++++++++++++++++++++++++++++
 base/applications/clipbrd/winutils.h  |  1 +
 4 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/base/applications/clipbrd/clipbrd.c 
b/base/applications/clipbrd/clipbrd.c
index 6aaeaca88ea..e26f9eb2298 100644
--- a/base/applications/clipbrd/clipbrd.c
+++ b/base/applications/clipbrd/clipbrd.c
@@ -358,6 +358,13 @@ static void OnPaint(HWND hWnd, WPARAM wParam, LPARAM 
lParam)
             break;
         }
 
+        case CF_HDROP:
+        {
+            GetClientRect(hWnd, &rc);
+            HDropFromClipboard(hdc, &rc);
+            break;
+        }
+
         default:
         {
             GetClientRect(hWnd, &rc);
diff --git a/base/applications/clipbrd/cliputils.c 
b/base/applications/clipbrd/cliputils.c
index daee8439a8f..0d5e06060f3 100644
--- a/base/applications/clipbrd/cliputils.c
+++ b/base/applications/clipbrd/cliputils.c
@@ -164,7 +164,8 @@ UINT GetAutomaticClipboardFormat(void)
         CF_DSPBITMAP,
         CF_DSPMETAFILEPICT,
         CF_DSPENHMETAFILE,
-        CF_PALETTE
+        CF_PALETTE,
+        CF_HDROP
     };
 
     return GetPriorityClipboardFormat(uFormatList, ARRAYSIZE(uFormatList));
diff --git a/base/applications/clipbrd/winutils.c 
b/base/applications/clipbrd/winutils.c
index eb1cf03c2dc..d97b4fb710e 100644
--- a/base/applications/clipbrd/winutils.c
+++ b/base/applications/clipbrd/winutils.c
@@ -331,6 +331,45 @@ void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT 
*lpRect)
     PlayEnhMetaFile(hdc, hEmf, lpRect);
 }
 
+static LPWSTR AllocStrCat(LPWSTR psz, LPCWSTR cat)
+{
+    INT cch;
+    LPWSTR pszNew;
+
+    if (psz == NULL)
+        return _wcsdup(cat);
+
+    cch = lstrlenW(psz) + lstrlenW(cat) + 1;
+    pszNew = realloc(psz, cch * sizeof(WCHAR));
+    if (!pszNew)
+        return psz;
+
+    lstrcatW(pszNew, cat);
+    return pszNew;
+}
+
+void HDropFromClipboard(HDC hdc, const RECT *lpRect)
+{
+    LPWSTR pszAlloc = NULL;
+    WCHAR szFile[MAX_PATH + 2];
+    HDROP hDrop = (HDROP)GetClipboardData(CF_HDROP);
+    UINT iFile, cFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
+    RECT rc = *lpRect;
+
+    FillRect(hdc, &rc, (HBRUSH)(COLOR_WINDOW + 1));
+
+    for (iFile = 0; iFile < cFiles; ++iFile)
+    {
+        DragQueryFileW(hDrop, iFile, szFile, _countof(szFile));
+        lstrcatW(szFile, L"\r\n");
+        pszAlloc = AllocStrCat(pszAlloc, szFile);
+    }
+
+    DrawTextW(hdc, pszAlloc, -1, &rc,
+              DT_LEFT | DT_NOPREFIX | DT_EXTERNALLEADING | DT_WORD_ELLIPSIS);
+    free(pszAlloc);
+}
+
 BOOL RealizeClipboardPalette(HDC hdc)
 {
     BOOL Success;
diff --git a/base/applications/clipbrd/winutils.h 
b/base/applications/clipbrd/winutils.h
index e29ec927bc3..fe80eb148e8 100644
--- a/base/applications/clipbrd/winutils.h
+++ b/base/applications/clipbrd/winutils.h
@@ -17,4 +17,5 @@ void BitBltFromClipboard(PAINTSTRUCT ps, SCROLLSTATE state, 
DWORD dwRop);
 void SetDIBitsToDeviceFromClipboard(UINT uFormat, PAINTSTRUCT ps, SCROLLSTATE 
state, UINT fuColorUse);
 void PlayMetaFileFromClipboard(HDC hdc, const RECT *lpRect);
 void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect);
+void HDropFromClipboard(HDC hdc, const RECT *lpRect);
 BOOL RealizeClipboardPalette(HDC hdc);

Reply via email to