Jacek Caban : winemac: Use ClipboardWindowProc driver entry point for clipboard manager.

Alexandre Julliard julliard at winehq.org
Tue May 31 15:58:00 CDT 2022


Module: wine
Branch: master
Commit: 2d4b85a9f7110b5b6d9ee6b28740a8a4053c040c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2d4b85a9f7110b5b6d9ee6b28740a8a4053c040c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue May 31 00:23:21 2022 +0200

winemac: Use ClipboardWindowProc driver entry point for clipboard manager.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>

---

 dlls/winemac.drv/clipboard.c | 133 ++++++++++---------------------------------
 dlls/winemac.drv/gdi.c       |   2 +-
 dlls/winemac.drv/macdrv.h    |   3 +-
 dlls/winemac.drv/window.c    |  13 -----
 4 files changed, 33 insertions(+), 118 deletions(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index d431728036e..16eff401a98 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -1425,7 +1425,7 @@ static UINT *get_clipboard_formats(UINT *size)
     for (;;)
     {
         if (!(ids = malloc(*size * sizeof(*ids)))) return NULL;
-        if (GetUpdatedClipboardFormats(ids, *size, size)) break;
+        if (NtUserGetUpdatedClipboardFormats(ids, *size, size)) break;
         free(ids);
         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return NULL;
     }
@@ -1579,20 +1579,44 @@ static void update_clipboard(void)
 }
 
 
+static BOOL init_clipboard(HWND hwnd)
+{
+    struct macdrv_window_features wf;
+
+    memset(&wf, 0, sizeof(wf));
+    clipboard_cocoa_window = macdrv_create_cocoa_window(&wf, CGRectMake(100, 100, 100, 100), hwnd,
+                                                        macdrv_init_thread_data()->queue);
+    if (!clipboard_cocoa_window)
+    {
+        ERR("failed to create clipboard Cocoa window\n");
+        return FALSE;
+    }
+
+    clipboard_hwnd = hwnd;
+    clipboard_thread_id = GetCurrentThreadId();
+    NtUserAddClipboardFormatListener(clipboard_hwnd);
+    register_builtin_formats();
+    grab_win32_clipboard();
+
+    TRACE("clipboard thread %04x running\n", GetCurrentThreadId());
+    return TRUE;
+}
+
+
 /**************************************************************************
- *              clipboard_wndproc
+ *              macdrv_ClipboardWindowProc
  *
  * Window procedure for the clipboard manager.
  */
-static LRESULT CALLBACK clipboard_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
+LRESULT macdrv_ClipboardWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
 {
     switch (msg)
     {
         case WM_NCCREATE:
-            return TRUE;
+            return init_clipboard(hwnd);
         case WM_CLIPBOARDUPDATE:
             if (is_clipboard_owner) break;  /* ignore our own changes */
-            if ((LONG)(GetClipboardSequenceNumber() - last_get_seqno) <= 0) break;
+            if ((LONG)(NtUserGetClipboardSequenceNumber() - last_get_seqno) <= 0) break;
             set_mac_pasteboard_types_from_win32_clipboard();
             break;
         case WM_RENDERFORMAT:
@@ -1605,95 +1629,13 @@ static LRESULT CALLBACK clipboard_wndproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM
         case WM_DESTROYCLIPBOARD:
             TRACE("WM_DESTROYCLIPBOARD: lost ownership\n");
             is_clipboard_owner = FALSE;
-            KillTimer(hwnd, 1);
+            NtUserKillTimer(hwnd, 1);
             break;
         case WM_USER:
             update_clipboard();
             break;
     }
-    return DefWindowProcW(hwnd, msg, wp, lp);
-}
-
-
-/**************************************************************************
- *              wait_clipboard_mutex
- *
- * Make sure that there's only one clipboard thread per window station.
- */
-static BOOL wait_clipboard_mutex(void)
-{
-    static const WCHAR prefix[] = {'_','_','w','i','n','e','_','c','l','i','p','b','o','a','r','d','_'};
-    WCHAR buffer[MAX_PATH + ARRAY_SIZE(prefix)];
-    HANDLE mutex;
-
-    memcpy(buffer, prefix, sizeof(prefix));
-    if (!GetUserObjectInformationW(GetProcessWindowStation(), UOI_NAME,
-                                   buffer + ARRAY_SIZE(prefix),
-                                   sizeof(buffer) - sizeof(prefix), NULL))
-    {
-        ERR("failed to get winstation name\n");
-        return FALSE;
-    }
-    mutex = CreateMutexW(NULL, TRUE, buffer);
-    if (GetLastError() == ERROR_ALREADY_EXISTS)
-    {
-        TRACE("waiting for mutex %s\n", debugstr_w(buffer));
-        WaitForSingleObject(mutex, INFINITE);
-    }
-    return TRUE;
-}
-
-
-/**************************************************************************
- *              clipboard_thread
- *
- * Thread running inside the desktop process to manage the clipboard
- */
-static DWORD WINAPI clipboard_thread(void *arg)
-{
-    WNDCLASSW class;
-    struct macdrv_window_features wf;
-    MSG msg;
-
-    if (!wait_clipboard_mutex()) return 0;
-
-    memset(&class, 0, sizeof(class));
-    class.lpfnWndProc   = clipboard_wndproc;
-    class.lpszClassName = clipboard_classname;
-
-    if (!RegisterClassW(&class) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
-    {
-        ERR("could not register clipboard window class err %u\n", GetLastError());
-        return 0;
-    }
-    if (!(clipboard_hwnd = CreateWindowW(clipboard_classname, NULL, 0, 0, 0, 0, 0,
-                                         HWND_MESSAGE, 0, 0, NULL)))
-    {
-        ERR("failed to create clipboard window err %u\n", GetLastError());
-        return 0;
-    }
-
-    memset(&wf, 0, sizeof(wf));
-    clipboard_cocoa_window = macdrv_create_cocoa_window(&wf, CGRectMake(100, 100, 100, 100), clipboard_hwnd,
-                                                        macdrv_init_thread_data()->queue);
-    if (!clipboard_cocoa_window)
-    {
-        ERR("failed to create clipboard Cocoa window\n");
-        goto done;
-    }
-
-    clipboard_thread_id = GetCurrentThreadId();
-    NtUserAddClipboardFormatListener(clipboard_hwnd);
-    register_builtin_formats();
-    grab_win32_clipboard();
-
-    TRACE("clipboard thread %04x running\n", GetCurrentThreadId());
-    while (GetMessageW(&msg, 0, 0, 0)) DispatchMessageW(&msg);
-
-done:
-    macdrv_destroy_cocoa_window(clipboard_cocoa_window);
-    DestroyWindow(clipboard_hwnd);
-    return 0;
+    return NtUserMessageCall(hwnd, msg, wp, lp, NULL, NtUserDefWindowProc, FALSE);
 }
 
 
@@ -1804,16 +1746,3 @@ void macdrv_lost_pasteboard_ownership(HWND hwnd)
     if (!macdrv_is_pasteboard_owner(clipboard_cocoa_window))
         grab_win32_clipboard();
 }
-
-
-/**************************************************************************
- *              macdrv_init_clipboard
- */
-void macdrv_init_clipboard(void)
-{
-    DWORD id;
-    HANDLE handle = CreateThread(NULL, 0, clipboard_thread, NULL, 0, &id);
-
-    if (handle) CloseHandle(handle);
-    else ERR("failed to create clipboard thread\n");
-}
diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c
index 8d41778b472..3f83436d97a 100644
--- a/dlls/winemac.drv/gdi.c
+++ b/dlls/winemac.drv/gdi.c
@@ -266,8 +266,8 @@ static const struct user_driver_funcs macdrv_funcs =
     .pBeep = macdrv_Beep,
     .pChangeDisplaySettingsEx = macdrv_ChangeDisplaySettingsEx,
     .pClipCursor = macdrv_ClipCursor,
+    .pClipboardWindowProc = macdrv_ClipboardWindowProc,
     .pCreateDesktopWindow = macdrv_CreateDesktopWindow,
-    .pCreateWindow = macdrv_CreateWindow,
     .pDesktopWindowProc = macdrv_DesktopWindowProc,
     .pDestroyCursorIcon = macdrv_DestroyCursorIcon,
     .pDestroyWindow = macdrv_DestroyWindow,
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
index 26028247a96..9cd0509a39c 100644
--- a/dlls/winemac.drv/macdrv.h
+++ b/dlls/winemac.drv/macdrv.h
@@ -128,13 +128,13 @@ extern LONG macdrv_ChangeDisplaySettingsEx(LPCWSTR devname, LPDEVMODEW devmode,
                                            HWND hwnd, DWORD flags, LPVOID lpvoid) DECLSPEC_HIDDEN;
 extern BOOL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode,
                                          LPDEVMODEW devmode, DWORD flags) DECLSPEC_HIDDEN;
+extern LRESULT macdrv_ClipboardWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) DECLSPEC_HIDDEN;
 extern void macdrv_UpdateDisplayDevices( const struct gdi_device_manager *device_manager,
                                          BOOL force, void *param ) DECLSPEC_HIDDEN;
 extern BOOL macdrv_GetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp) DECLSPEC_HIDDEN;
 extern BOOL macdrv_SetDeviceGammaRamp(PHYSDEV dev, LPVOID ramp) DECLSPEC_HIDDEN;
 extern BOOL macdrv_ClipCursor(LPCRECT clip) DECLSPEC_HIDDEN;
 extern BOOL macdrv_CreateDesktopWindow(HWND hwnd) DECLSPEC_HIDDEN;
-extern BOOL macdrv_CreateWindow(HWND hwnd) DECLSPEC_HIDDEN;
 extern LRESULT macdrv_DesktopWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) DECLSPEC_HIDDEN;
 extern void macdrv_DestroyWindow(HWND hwnd) DECLSPEC_HIDDEN;
 extern void macdrv_SetFocus(HWND hwnd) DECLSPEC_HIDDEN;
@@ -252,7 +252,6 @@ extern HKL macdrv_get_hkl_from_source(TISInputSourceRef input_source) DECLSPEC_H
 extern void macdrv_displays_changed(const macdrv_event *event) DECLSPEC_HIDDEN;
 
 extern void macdrv_UpdateClipboard(void) DECLSPEC_HIDDEN;
-extern void macdrv_init_clipboard(void) DECLSPEC_HIDDEN;
 extern BOOL query_pasteboard_data(HWND hwnd, CFStringRef type) DECLSPEC_HIDDEN;
 extern void macdrv_lost_pasteboard_ownership(HWND hwnd) DECLSPEC_HIDDEN;
 extern const char *debugstr_format(UINT id) DECLSPEC_HIDDEN;
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c
index 59788244c22..2f473730b2f 100644
--- a/dlls/winemac.drv/window.c
+++ b/dlls/winemac.drv/window.c
@@ -1593,19 +1593,6 @@ LRESULT macdrv_DesktopWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
     return NtUserMessageCall(hwnd, msg, wp, lp, 0, NtUserDefWindowProc, FALSE);
 }
 
-/**********************************************************************
- *              CreateWindow   (MACDRV.@)
- */
-BOOL macdrv_CreateWindow(HWND hwnd)
-{
-    if (hwnd == NtUserGetDesktopWindow())
-    {
-        macdrv_init_clipboard();
-    }
-    return TRUE;
-}
-
-
 /***********************************************************************
  *              DestroyWindow   (MACDRV.@)
  */




More information about the wine-cvs mailing list