winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
May 2022
----- 2025 -----
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
907 discussions
Start a n
N
ew thread
Eric Pouech : user32: Enable compilation with long types.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 9d72487f2102bd6eb245e199e73304c67bb5d41a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=9d72487f2102bd6eb245e199…
Author: Eric Pouech <eric.pouech(a)gmail.com> Date: Tue May 31 11:38:38 2022 +0200 user32: Enable compilation with long types. Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/user32/Makefile.in | 2 +- dlls/user32/combo.c | 6 +++--- dlls/user32/cursoricon.c | 36 ++++++++++++++++---------------- dlls/user32/dde_client.c | 16 +++++++------- dlls/user32/dde_misc.c | 54 ++++++++++++++++++++++++------------------------ dlls/user32/dde_server.c | 12 +++++------ dlls/user32/dialog.c | 12 +++++------ dlls/user32/edit.c | 16 +++++++------- dlls/user32/exticon.c | 8 +++---- dlls/user32/hook.c | 12 +++++------ dlls/user32/input.c | 2 +- dlls/user32/listbox.c | 4 ++-- dlls/user32/mdi.c | 18 ++++++++-------- dlls/user32/menu.c | 26 +++++++++++------------ dlls/user32/message.c | 22 ++++++++++---------- dlls/user32/misc.c | 34 +++++++++++++++--------------- dlls/user32/msgbox.c | 4 ++-- dlls/user32/nonclient.c | 16 +++++++------- dlls/user32/rawinput.c | 10 ++++----- dlls/user32/resource.c | 2 +- dlls/user32/scroll.c | 10 ++++----- dlls/user32/static.c | 4 ++-- dlls/user32/user_main.c | 4 ++-- dlls/user32/win.c | 10 ++++----- dlls/user32/winhelp.c | 2 +- dlls/user32/winpos.c | 2 +- dlls/user32/winproc.c | 12 +++++------ dlls/user32/winstation.c | 2 +- 28 files changed, 179 insertions(+), 179 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=9d72487f2102bd6eb245…
1
0
0
0
Akihiro Sagawa : winecoreaudio: Handle MIDI running status.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: ee56317d9d08b659279c4157ff029954a662996f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ee56317d9d08b659279c4157…
Author: Akihiro Sagawa <sagawa.aki(a)gmail.com> Date: Fri May 27 23:25:42 2022 +0900 winecoreaudio: Handle MIDI running status. Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com> Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winecoreaudio.drv/coremidi.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c index bd5322cbc22..445b760be76 100644 --- a/dlls/winecoreaudio.drv/coremidi.c +++ b/dlls/winecoreaudio.drv/coremidi.c @@ -103,6 +103,7 @@ struct midi_dest MIDIOUTCAPSW caps; MIDIOPENDESC midiDesc; + BYTE runningStatus; WORD wFlags; }; @@ -598,6 +599,7 @@ static UINT midi_out_open(WORD dev_id, MIDIOPENDESC *midi_desc, UINT flags, stru return MMSYSERR_ERROR; } } + dest->runningStatus = 0; dest->wFlags = HIWORD(flags & CALLBACK_TYPEMASK); dest->midiDesc = *midi_desc; @@ -655,12 +657,30 @@ static UINT midi_out_data(WORD dev_id, UINT data) WARN("bad device ID : %d\n", dev_id); return MMSYSERR_BADDEVICEID; } + dest = dests + dev_id; bytes[0] = data & 0xff; - bytes[1] = (data >> 8) & 0xff; - bytes[2] = (data >> 16) & 0xff; + if (bytes[0] & 0x80) + { + bytes[1] = (data >> 8) & 0xff; + bytes[2] = (data >> 16) & 0xff; + if (bytes[0] < 0xF0) + dest->runningStatus = bytes[0]; + else if (bytes[0] <= 0xF7) + dest->runningStatus = 0; + } + else if (dest->runningStatus) + { + bytes[0] = dest->runningStatus; + bytes[1] = data & 0xff; + bytes[2] = (data >> 8) & 0xff; + } + else + { + FIXME("ooch %x\n", data); + return MMSYSERR_NOERROR; + } - dest = dests + dev_id; if (dest->caps.wTechnology == MOD_SYNTH) { sc = MusicDeviceMIDIEvent(dest->synth, bytes[0], bytes[1], bytes[2], 0); @@ -726,6 +746,7 @@ static UINT midi_out_long_data(WORD dev_id, MIDIHDR *hdr, UINT hdr_size, struct else if (dest->caps.wTechnology == MOD_MIDIPORT) midi_send(midi_out_port, dest->dest, (UInt8 *)hdr->lpData, hdr->dwBufferLength); + dest->runningStatus = 0; hdr->dwFlags &= ~MHDR_INQUEUE; hdr->dwFlags |= MHDR_DONE; @@ -866,6 +887,8 @@ static UINT midi_out_reset(WORD dev_id) } else FIXME("MOD_MIDIPORT\n"); + dests[dev_id].runningStatus = 0; + /* FIXME: the LongData buffers must also be returned to the app */ return MMSYSERR_NOERROR; }
1
0
0
0
Jacek Caban : win32u: Use user_callbacks for alertable NtWaitForMultipleObjects calls.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 7625e6ba20c70d59d61a73e5c2b2b5243e0e0143 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7625e6ba20c70d59d61a73e5…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Tue May 31 02:36:03 2022 +0200 win32u: Use user_callbacks for alertable NtWaitForMultipleObjects calls. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=53020
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> --- dlls/user32/user_main.c | 1 + dlls/win32u/driver.c | 7 +++++-- dlls/win32u/ntuser_private.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c index 9cd9bd60146..e470d2ad688 100644 --- a/dlls/user32/user_main.c +++ b/dlls/user32/user_main.c @@ -162,6 +162,7 @@ static const struct user_callbacks user_funcs = EndMenu, ImmProcessKey, ImmTranslateMessage, + NtWaitForMultipleObjects, free_win_ptr, MENU_GetSysMenu, MENU_IsMenuActive, diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index b4cea3d42c8..1f538d100ed 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -813,8 +813,11 @@ static NTSTATUS nulldrv_MsgWaitForMultipleObjectsEx( DWORD count, const HANDLE * { if (!count && timeout && !timeout->QuadPart) return WAIT_TIMEOUT; - return NtWaitForMultipleObjects( count, handles, !(flags & MWMO_WAITALL), - !!(flags & MWMO_ALERTABLE), timeout ); + if (!user_callbacks) + return NtWaitForMultipleObjects( count, handles, !(flags & MWMO_WAITALL), + !!(flags & MWMO_ALERTABLE), timeout ); + return user_callbacks->pNtWaitForMultipleObjects( count, handles, !(flags & MWMO_WAITALL), + !!(flags & MWMO_ALERTABLE), timeout ); } static void nulldrv_ReleaseDC( HWND hwnd, HDC hdc ) diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 931c87a6e1c..e39e3f54169 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -35,6 +35,7 @@ struct user_callbacks BOOL (WINAPI *pEndMenu)(void); BOOL (WINAPI *pImmProcessKey)(HWND, HKL, UINT, LPARAM, DWORD); BOOL (WINAPI *pImmTranslateMessage)(HWND, UINT, WPARAM, LPARAM); + NTSTATUS (WINAPI *pNtWaitForMultipleObjects)(ULONG,const HANDLE*,BOOLEAN,BOOLEAN,const LARGE_INTEGER*); void (CDECL *free_win_ptr)( struct tagWND *win ); HMENU (CDECL *get_sys_menu)( HWND hwnd, HMENU popup ); HWND (CDECL *is_menu_active)(void);
1
0
0
0
Jacek Caban : winemac: Use ClipboardWindowProc driver entry point for clipboard manager.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 2d4b85a9f7110b5b6d9ee6b28740a8a4053c040c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2d4b85a9f7110b5b6d9ee6b2…
Author: Jacek Caban <jacek(a)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(a)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.@) */
1
0
0
0
Jacek Caban : winex11: Use ClipboardWindowProc driver entry point for clipboard manager.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 6f825503d9bebc6f657396b30bb34cbc88a7142e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=6f825503d9bebc6f657396b3…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Tue May 31 14:14:03 2022 +0200 winex11: Use ClipboardWindowProc driver entry point for clipboard manager. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> --- dlls/winex11.drv/clipboard.c | 17 +++---- dlls/winex11.drv/dllmain.c | 102 ----------------------------------------- dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/unixlib.h | 11 ----- dlls/winex11.drv/window.c | 1 - dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/x11drv_main.c | 1 - 7 files changed, 9 insertions(+), 126 deletions(-) diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index f2be4386e65..da451fad57c 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -2215,7 +2215,7 @@ static void xfixes_init(void) /************************************************************************** - * clipboard_thread + * clipboard_init * * Thread running inside the desktop process to manage the clipboard */ @@ -2250,20 +2250,18 @@ static BOOL clipboard_init( HWND hwnd ) /************************************************************************** * x11drv_clipboard_message */ -NTSTATUS x11drv_clipboard_message( void *arg ) +LRESULT X11DRV_ClipboardWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { - struct clipboard_message_params *params = arg; - - switch (params->msg) + switch (msg) { case WM_NCCREATE: - return clipboard_init( params->hwnd ); + return clipboard_init( hwnd ); case WM_CLIPBOARDUPDATE: if (is_clipboard_owner) break; /* ignore our own changes */ acquire_selection( thread_init_display() ); break; case WM_RENDERFORMAT: - if (render_format( params->wparam )) rendered_formats++; + if (render_format( wparam )) rendered_formats++; break; case WM_TIMER: if (!is_clipboard_owner) break; @@ -2272,12 +2270,11 @@ NTSTATUS x11drv_clipboard_message( void *arg ) case WM_DESTROYCLIPBOARD: TRACE( "WM_DESTROYCLIPBOARD: lost ownership\n" ); is_clipboard_owner = FALSE; - NtUserKillTimer( params->hwnd, 1 ); + NtUserKillTimer( hwnd, 1 ); break; } - return NtUserMessageCall( params->hwnd, params->msg, params->wparam, params->lparam, - NULL, NtUserDefWindowProc, FALSE ); + return NtUserMessageCall( hwnd, msg, wparam, lparam, NULL, NtUserDefWindowProc, FALSE ); } diff --git a/dlls/winex11.drv/dllmain.c b/dlls/winex11.drv/dllmain.c index b06c955c2a4..e2cbd51351d 100644 --- a/dlls/winex11.drv/dllmain.c +++ b/dlls/winex11.drv/dllmain.c @@ -21,112 +21,11 @@ #include "x11drv_dll.h" #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(x11drv); - HMODULE x11drv_module = 0; static unixlib_handle_t x11drv_handle; NTSTATUS (CDECL *x11drv_unix_call)( enum x11drv_funcs code, void *params ); -/************************************************************************** - * 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_wndproc - * - * Window procedure for the clipboard manager. - */ -static LRESULT CALLBACK clipboard_wndproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) -{ - struct clipboard_message_params params; - - switch (msg) - { - case WM_NCCREATE: - case WM_CLIPBOARDUPDATE: - case WM_RENDERFORMAT: - case WM_TIMER: - case WM_DESTROYCLIPBOARD: - params.hwnd = hwnd; - params.msg = msg; - params.wparam = wp; - params.lparam = lp; - return X11DRV_CALL( clipboard_message, ¶ms ); - } - - return DefWindowProcW( hwnd, msg, wp, lp ); -} - - -/************************************************************************** - * clipboard_thread - * - * Thread running inside the desktop process to manage the clipboard - */ -static DWORD WINAPI clipboard_thread( void *arg ) -{ - static const WCHAR clipboard_classname[] = {'_','_','w','i','n','e','_','c','l','i','p','b','o','a','r','d','_','m','a','n','a','g','e','r',0}; - WNDCLASSW class; - 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 (!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; - } - - while (GetMessageW( &msg, 0, 0, 0 )) DispatchMessageW( &msg ); - return 0; -} - - -static NTSTATUS x11drv_clipboard_init( UINT arg ) -{ - DWORD id; - HANDLE thread = CreateThread( NULL, 0, clipboard_thread, NULL, 0, &id ); - - if (thread) CloseHandle( thread ); - else ERR( "failed to create clipboard thread\n" ); - return 0; -} - static NTSTATUS x11drv_load_icon( UINT id ) { @@ -137,7 +36,6 @@ static NTSTATUS x11drv_load_icon( UINT id ) typedef NTSTATUS (*callback_func)( UINT arg ); static const callback_func callback_funcs[] = { - x11drv_clipboard_init, x11drv_dnd_drop_event, x11drv_dnd_leave_event, x11drv_ime_get_cursor_pos, diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 3bdc05999f1..7c5a1acd7b6 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -425,6 +425,7 @@ static const struct user_driver_funcs x11drv_funcs = .pSetWindowText = X11DRV_SetWindowText, .pShowWindow = X11DRV_ShowWindow, .pSysCommand = X11DRV_SysCommand, + .pClipboardWindowProc = X11DRV_ClipboardWindowProc, .pUpdateClipboard = X11DRV_UpdateClipboard, .pUpdateLayeredWindow = X11DRV_UpdateLayeredWindow, .pWindowMessage = X11DRV_WindowMessage, diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index 76cfad88f4d..451c308f0cd 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -21,7 +21,6 @@ enum x11drv_funcs { - unix_clipboard_message, unix_create_desktop, unix_init, unix_systray_clear, @@ -41,15 +40,6 @@ enum x11drv_funcs extern NTSTATUS (CDECL *x11drv_unix_call)( enum x11drv_funcs code, void *params ) DECLSPEC_HIDDEN; #define X11DRV_CALL(func, params) x11drv_unix_call( unix_ ## func, params ) -/* x11drv_clipboard_message params */ -struct clipboard_message_params -{ - HWND hwnd; - UINT msg; - WPARAM wparam; - LPARAM lparam; -}; - /* x11drv_create_desktop params */ struct create_desktop_params { @@ -108,7 +98,6 @@ C_ASSERT( client_func_last <= NtUserDriverCallbackLast + 1 ); /* simplified interface for client callbacks requiring only a single UINT parameter */ enum client_callback { - client_clipboard_init, client_dnd_drop_event, client_dnd_leave_event, client_ime_get_cursor_pos, diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 07fb1515e24..5d9a93688c3 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1913,7 +1913,6 @@ BOOL X11DRV_CreateWindow( HWND hwnd ) CWOverrideRedirect | CWEventMask, &attr ); XFlush( data->display ); NtUserSetProp( hwnd, clip_window_prop, (HANDLE)data->clip_window ); - x11drv_client_call( client_clipboard_init, 0 ); X11DRV_DisplayDevices_RegisterEventHandlers(); } return TRUE; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 222d7328387..307932b0bf0 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -238,6 +238,7 @@ extern void X11DRV_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ) D extern void X11DRV_SetWindowText( HWND hwnd, LPCWSTR text ) DECLSPEC_HIDDEN; extern UINT X11DRV_ShowWindow( HWND hwnd, INT cmd, RECT *rect, UINT swp ) DECLSPEC_HIDDEN; extern LRESULT X11DRV_SysCommand( HWND hwnd, WPARAM wparam, LPARAM lparam ) DECLSPEC_HIDDEN; +extern LRESULT X11DRV_ClipboardWindowProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) DECLSPEC_HIDDEN; extern void X11DRV_UpdateClipboard(void) DECLSPEC_HIDDEN; extern BOOL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info, const RECT *window_rect ) DECLSPEC_HIDDEN; @@ -833,7 +834,6 @@ static inline BOOL is_window_rect_mapped( const RECT *rect ) /* unixlib interface */ -extern NTSTATUS x11drv_clipboard_message( void *arg ) DECLSPEC_HIDDEN; extern NTSTATUS x11drv_create_desktop( void *arg ) DECLSPEC_HIDDEN; extern NTSTATUS x11drv_systray_clear( void *arg ) DECLSPEC_HIDDEN; extern NTSTATUS x11drv_systray_dock( void *arg ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index a118757dfbe..dc987ae70a2 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -1302,7 +1302,6 @@ NTSTATUS x11drv_client_call( enum client_callback func, UINT arg ) const unixlib_entry_t __wine_unix_call_funcs[] = { - x11drv_clipboard_message, x11drv_create_desktop, x11drv_init, x11drv_systray_clear,
1
0
0
0
Jacek Caban : explorer: Create clipboard manager thread when creating a desktop.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: d8a74e5cf9f259c5ec9480e74d286c93609b8d9c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=d8a74e5cf9f259c5ec9480e7…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Tue May 31 14:11:50 2022 +0200 explorer: Create clipboard manager thread when creating a desktop. Based on winex11.drv. Drivers that don't implement ClipboardWindowProc entry point will disable it by failing to create the window. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> --- programs/explorer/Makefile.in | 2 +- programs/explorer/desktop.c | 90 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/programs/explorer/Makefile.in b/programs/explorer/Makefile.in index 5507d747bb1..3a2ddec3fd4 100644 --- a/programs/explorer/Makefile.in +++ b/programs/explorer/Makefile.in @@ -1,5 +1,5 @@ MODULE = explorer.exe -IMPORTS = rpcrt4 user32 gdi32 advapi32 +IMPORTS = rpcrt4 user32 gdi32 advapi32 win32u DELAYIMPORTS = comctl32 shell32 oleaut32 ole32 shlwapi EXTRADLLFLAGS = -mwindows -municode diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index 400cc1d560e..96673adc254 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -29,6 +29,7 @@ #include <rpc.h> #include <shlobj.h> #include <shellapi.h> +#include <ntuser.h> #include "exdisp.h" #include "wine/debug.h" @@ -618,6 +619,91 @@ static void initialize_launchers( HWND hwnd ) } } +/************************************************************************** + * 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[] = L"__wine_clipboard_"; + WCHAR buffer[MAX_PATH + ARRAY_SIZE( prefix )]; + HANDLE mutex; + + memcpy( buffer, prefix, sizeof(prefix) ); + if (!GetUserObjectInformationW( GetProcessWindowStation(), UOI_NAME, + buffer + ARRAY_SIZE( prefix ) - 1, + 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_wndproc + * + * Window procedure for the clipboard manager. + */ +static LRESULT CALLBACK clipboard_wndproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) +{ + switch (msg) + { + case WM_NCCREATE: + case WM_CLIPBOARDUPDATE: + case WM_RENDERFORMAT: + case WM_TIMER: + case WM_DESTROYCLIPBOARD: + case WM_USER: + return NtUserMessageCall( hwnd, msg, wp, lp, 0, NtUserClipboardWindowProc, FALSE ); + } + + return DefWindowProcW( hwnd, msg, wp, lp ); +} + + +/************************************************************************** + * clipboard_thread + * + * Thread running inside the desktop process to manage the clipboard + */ +static DWORD WINAPI clipboard_thread( void *arg ) +{ + static const WCHAR clipboard_classname[] = L"__wine_clipboard_manager"; + WNDCLASSW class; + ATOM atom; + MSG msg; + + if (!wait_clipboard_mutex()) return 0; + + memset( &class, 0, sizeof(class) ); + class.lpfnWndProc = clipboard_wndproc; + class.lpszClassName = clipboard_classname; + + if (!(atom = RegisterClassW( &class )) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) + { + ERR( "could not register clipboard window class err %lu\n", GetLastError() ); + return 0; + } + if (!CreateWindowW( clipboard_classname, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, NULL )) + { + TRACE( "failed to create clipboard window err %lu\n", GetLastError() ); + UnregisterClassW( MAKEINTRESOURCEW(atom), NULL ); + return 0; + } + + while (GetMessageW( &msg, 0, 0, 0 )) DispatchMessageW( &msg ); + return 0; +} + static WNDPROC desktop_orig_wndproc; /* window procedure for the desktop window */ @@ -961,6 +1047,8 @@ void manage_desktop( WCHAR *arg ) BOOL enable_shell = FALSE; void (WINAPI *pShellDDEInit)( BOOL ) = NULL; HMODULE shell32; + HANDLE thread; + DWORD id; /* get the rest of the command line (if any) */ while (*p && !is_whitespace(*p)) p++; @@ -1025,6 +1113,8 @@ void manage_desktop( WCHAR *arg ) SetWindowPos( hwnd, 0, GetSystemMetrics(SM_XVIRTUALSCREEN), GetSystemMetrics(SM_YVIRTUALSCREEN), GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN), SWP_SHOWWINDOW ); + thread = CreateThread( NULL, 0, clipboard_thread, NULL, 0, &id ); + if (thread) CloseHandle( thread ); SystemParametersInfoW( SPI_SETDESKWALLPAPER, 0, NULL, FALSE ); ClipCursor( NULL ); initialize_display_settings();
1
0
0
0
Jacek Caban : win32u: Introduce NtUserClipboardWindowProc.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 806d85529f34da0ebcf05fe6b7631849372834d8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=806d85529f34da0ebcf05fe6…
Author: Jacek Caban <jacek(a)codeweavers.com> Date: Mon May 30 21:43:17 2022 +0200 win32u: Introduce NtUserClipboardWindowProc. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> --- dlls/win32u/driver.c | 7 +++++++ dlls/win32u/message.c | 2 ++ include/ntuser.h | 5 +++-- include/wine/gdi_driver.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 4dac0760464..b4cea3d42c8 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -1099,6 +1099,11 @@ static BOOL loaderdrv_ClipCursor( const RECT *clip ) return load_driver()->pClipCursor( clip ); } +static LRESULT nulldrv_ClipboardWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) +{ + return 0; +} + static void loaderdrv_UpdateClipboard(void) { load_driver()->pUpdateClipboard(); @@ -1172,6 +1177,7 @@ static const struct user_driver_funcs lazy_load_driver = loaderdrv_SetCursorPos, loaderdrv_ClipCursor, /* clipboard functions */ + nulldrv_ClipboardWindowProc, loaderdrv_UpdateClipboard, /* display modes */ loaderdrv_ChangeDisplaySettingsEx, @@ -1247,6 +1253,7 @@ void CDECL __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT v SET_USER_FUNC(GetCursorPos); SET_USER_FUNC(SetCursorPos); SET_USER_FUNC(ClipCursor); + SET_USER_FUNC(ClipboardWindowProc); SET_USER_FUNC(UpdateClipboard); SET_USER_FUNC(ChangeDisplaySettingsEx); SET_USER_FUNC(EnumDisplaySettingsEx); diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 6bb9aa455f5..bc6db20d164 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2911,6 +2911,8 @@ LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa return send_notify_message( hwnd, msg, wparam, lparam, ansi ); case NtUserSendMessageCallback: return send_message_callback( hwnd, msg, wparam, lparam, (void *)result_info, ansi ); + case NtUserClipboardWindowProc: + return user_driver->pClipboardWindowProc( hwnd, msg, wparam, lparam ); case NtUserSpyEnter: spy_enter_message( ansi, hwnd, msg, wparam, lparam ); return 0; diff --git a/include/ntuser.h b/include/ntuser.h index 29de027a334..091d34c3a5f 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -189,8 +189,9 @@ enum NtUserSendNotifyMessage = 0x02b7, NtUserSendMessageCallback = 0x02b8, /* Wine-specific exports */ - NtUserSpyEnter = 0x0300, - NtUserSpyExit = 0x0301, + NtUserClipboardWindowProc = 0x0300, + NtUserSpyEnter = 0x0301, + NtUserSpyExit = 0x0302, }; /* NtUserThunkedMenuItemInfo codes */ diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 21fff4d4aa2..52fd6fe49d3 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -291,6 +291,7 @@ struct user_driver_funcs BOOL (*pSetCursorPos)(INT,INT); BOOL (*pClipCursor)(LPCRECT); /* clipboard functions */ + LRESULT (*pClipboardWindowProc)(HWND,UINT,WPARAM,LPARAM); void (*pUpdateClipboard)(void); /* display modes */ LONG (*pChangeDisplaySettingsEx)(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);
1
0
0
0
Stefan Dösinger : d3d9/tests: Extend color_fill_test.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: b4bf1fb7b2d205d5b141de4c917afc582c93c59d URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b4bf1fb7b2d205d5b141de4c…
Author: Stefan Dösinger <stefan(a)codeweavers.com> Date: Thu Apr 28 14:29:47 2022 +0300 d3d9/tests: Extend color_fill_test. So it covers more formats and provokes the clear-to-sysmem path with the Vulkan renderer. Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com> --- dlls/d3d9/tests/visual.c | 132 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 106 insertions(+), 26 deletions(-) diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 2913583916a..5d8fe10fc79 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -1548,10 +1548,10 @@ done: static void color_fill_test(void) { + unsigned int fill_a, expected_a; IDirect3DSurface9 *surface; IDirect3DTexture9 *texture; D3DCOLOR fill_color, color; - DWORD fill_a, expected_a; IDirect3DDevice9 *device; IDirect3D9 *d3d; ULONG refcount; @@ -1580,20 +1580,39 @@ static void color_fill_test(void) { CHECK_FILL_VALUE = 0x1, BLOCKS = 0x2, + FLOAT_VALUES = 0x4, } flags; - DWORD fill_value; + unsigned int fill_i[4]; + float fill_f[4]; } formats[] = { - {D3DFMT_A8R8G8B8, "D3DFMT_A8R8G8B8", CHECK_FILL_VALUE, 0xdeadbeef}, + {D3DFMT_A8R8G8B8, "D3DFMT_A8R8G8B8", CHECK_FILL_VALUE, + {0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef}}, /* D3DFMT_X8R8G8B8 either set X = A or X = 0, depending on the driver. */ - {D3DFMT_R5G6B5, "D3DFMT_R5G6B5", CHECK_FILL_VALUE, 0xadfdadfd}, - {D3DFMT_G16R16, "D3DFMT_G16R16", CHECK_FILL_VALUE, 0xbebeadad}, + {D3DFMT_R5G6B5, "D3DFMT_R5G6B5", CHECK_FILL_VALUE, + {0xadfdadfd, 0xadfdadfd, 0xadfdadfd, 0xadfdadfd}}, + {D3DFMT_G16R16, "D3DFMT_G16R16", CHECK_FILL_VALUE, + {0xbebeadad, 0xbebeadad, 0xbebeadad, 0xbebeadad}}, + {D3DFMT_A16B16G16R16, "D3DFMT_A16B16G16R16", CHECK_FILL_VALUE, + {0xbebeadad, 0xdedeefef, 0xbebeadad, 0xdedeefef}}, /* Real hardware reliably fills the surface with the blue channel but * the testbot fills it with 0x00. Wine incorrectly uses the alpha * channel. Don't bother checking the result because P8 surfaces are * essentially useless in d3d9. */ - {D3DFMT_P8, "D3DFMT_P8", 0, 0xefefefef}, + {D3DFMT_P8, "D3DFMT_P8", 0, + {0xefefefef, 0xefefefef, 0xefefefef, 0xefefefef}}, + /* Float formats. */ + {D3DFMT_R32F, "D3DFMT_R32F", CHECK_FILL_VALUE | FLOAT_VALUES, + {0, 0, 0, 0}, {0xad / 255.0f, 0xad / 255.0f, 0xad / 255.0f, 0xad / 255.0f}}, + {D3DFMT_A32B32G32R32F, "D3DFMT_A32B32G32R32F", CHECK_FILL_VALUE | FLOAT_VALUES, + {0, 0, 0, 0}, {0xad / 255.0f, 0xbe / 255.0f, 0xef / 255.0f, 0xde / 255.0f}}, + {D3DFMT_R16F, "D3DFMT_R16F", CHECK_FILL_VALUE, + {0x396d396d, 0x396d396d, 0x396d396d, 0x396d396d}}, + {D3DFMT_G16R16F, "D3DFMT_G16R16F", CHECK_FILL_VALUE, + {0x39f5396d, 0x39f5396d, 0x39f5396d, 0x39f5396d}}, + {D3DFMT_A16B16G16R16F, "D3DFMT_A16B16G16R16F", CHECK_FILL_VALUE, + {0x39f5396d, 0x3af63b7f, 0x39f5396d, 0x3af63b7f}}, /* Windows drivers produce different results for these formats. * No driver produces a YUV value that matches the input RGB * value, and no driver produces a proper DXT compression block. @@ -1603,17 +1622,16 @@ static void color_fill_test(void) * * The YUV tests are disabled because they produce a driver-dependent * result on Wine. - * {D3DFMT_YUY2, "D3DFMT_YUY2", BLOCKS, 0}, - * {D3DFMT_UYVY, "D3DFMT_UYVY", BLOCKS, 0}, */ - {D3DFMT_DXT1, "D3DFMT_DXT1", BLOCKS, 0x00000000}, + * {D3DFMT_YUY2, "D3DFMT_YUY2", BLOCKS}, + * {D3DFMT_UYVY, "D3DFMT_UYVY", BLOCKS}, */ + {D3DFMT_DXT1, "D3DFMT_DXT1", BLOCKS}, /* Vendor-specific formats like ATI2N are a non-issue here since they're not * supported as offscreen plain surfaces and do not support D3DUSAGE_RENDERTARGET * when created as texture. */ }; - unsigned int i; - D3DLOCKED_RECT locked_rect; - DWORD *surface_data; static const RECT rect = {4, 4, 8, 8}, rect2 = {5, 5, 7, 7}; + D3DLOCKED_RECT locked_rect; + unsigned int i, j; window = create_window(); d3d = Direct3DCreate9(D3D_SDK_VERSION); @@ -1732,22 +1750,84 @@ static void color_fill_test(void) ok(SUCCEEDED(hr), "Failed to color fill, hr %#x, fmt=%s.\n", hr, formats[i].name); } - if (formats[i].flags & CHECK_FILL_VALUE) + if (!(formats[i].flags & CHECK_FILL_VALUE)) { - hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, D3DLOCK_READONLY); - ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); - surface_data = locked_rect.pBits; - fill_a = (surface_data[0] & 0xff000000) >> 24; - expected_a = (formats[i].fill_value & 0xff000000) >> 24; - /* Windows drivers disagree on how to promote the 8 bit per channel - * input argument to 16 bit for D3DFMT_G16R16. */ - ok(color_match(surface_data[0], formats[i].fill_value, 2) && - compare_uint(expected_a, fill_a, 2), - "Expected clear value 0x%08x, got 0x%08x, fmt=%s.\n", - formats[i].fill_value, surface_data[0], formats[i].name); - hr = IDirect3DSurface9_UnlockRect(surface); - ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); + IDirect3DSurface9_Release(surface); + continue; + } + + hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0); + ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); + /* Windows drivers disagree on how to promote the 8 bit per channel + * input argument to 16 bit for D3DFMT_G16R16. */ + if (formats[i].flags & FLOAT_VALUES) + { + const struct vec4 *surface_data = locked_rect.pBits; + ok(compare_vec4(surface_data, formats[i].fill_f[0], formats[i].fill_f[1], + formats[i].fill_f[2], formats[i].fill_f[3], 1), + "Expected clear values %f %f %f %f, got %f %f %f %f, fmt=%s\n", + formats[i].fill_f[0], formats[i].fill_f[1], + formats[i].fill_f[2], formats[i].fill_f[3], + surface_data->x, surface_data->y, surface_data->z, surface_data->w, + formats[i].name); } + else + { + const unsigned int *surface_data = locked_rect.pBits; + for (j = 0; j < 4; ++j) + { + fill_a = (surface_data[j] & 0xff000000) >> 24; + expected_a = (formats[i].fill_i[j] & 0xff000000) >> 24; + ok(color_match(surface_data[j], formats[i].fill_i[j], 2) && + compare_uint(expected_a, fill_a, 2), + "Expected clear value 0x%08x, got 0x%08x, fmt=%s, j=%u.\n", + formats[i].fill_i[j], surface_data[j], formats[i].name, j); + } + } + + /* Fill the surface with something else to make sure the test below doesn't pass + * due to stale contents by accident. */ + memset(locked_rect.pBits, 0x55, locked_rect.Pitch * 32); + + hr = IDirect3DSurface9_UnlockRect(surface); + ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); + + /* Test clearing "to sysmem". Wined3d's delayed clear will perform the actual clear + * in the lock call and try to fill the sysmem buffer instead of clearing on the + * GPU and downloading it. */ + hr = IDirect3DDevice9_ColorFill(device, surface, NULL, 0xdeadbeef); + ok(SUCCEEDED(hr), "Failed to color fill, hr %#x, fmt=%s.\n", hr, formats[i].name); + hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, D3DLOCK_READONLY); + ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); + + if (formats[i].flags & FLOAT_VALUES) + { + const struct vec4 *surface_data = locked_rect.pBits; + ok(compare_vec4(surface_data, formats[i].fill_f[0], formats[i].fill_f[1], + formats[i].fill_f[2], formats[i].fill_f[3], 1), + "Expected clear values %f %f %f %f, got %f %f %f %f, fmt=%s\n", + formats[i].fill_f[0], formats[i].fill_f[1], + formats[i].fill_f[2], formats[i].fill_f[3], + surface_data->x, surface_data->y, surface_data->z, surface_data->w, + formats[i].name); + } + else + { + const unsigned int *surface_data = locked_rect.pBits; + for (j = 0; j < 4; ++j) + { + fill_a = (surface_data[j] & 0xff000000) >> 24; + expected_a = (formats[i].fill_i[j] & 0xff000000) >> 24; + ok(color_match(surface_data[j], formats[i].fill_i[j], 2) && + compare_uint(expected_a, fill_a, 2), + "Expected clear value 0x%08x, got 0x%08x, fmt=%s, j=%u.\n", + formats[i].fill_i[j], surface_data[j], formats[i].name, j); + } + } + + + hr = IDirect3DSurface9_UnlockRect(surface); + ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name); IDirect3DSurface9_Release(surface); }
1
0
0
0
Stefan Dösinger : wined3d: Store clear colors in subresources.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 8802059263c9dcddaa0a599b02dc2f239812b3b0 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=8802059263c9dcddaa0a599b…
Author: Stefan Dösinger <stefan(a)codeweavers.com> Date: Sat Apr 23 14:25:25 2022 +0300 wined3d: Store clear colors in subresources. Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com> --- dlls/wined3d/context_vk.c | 41 ++++++++++++++-- dlls/wined3d/texture.c | 103 ++++++++++++++++++++++++++++------------- dlls/wined3d/utils.c | 19 ++++++++ dlls/wined3d/wined3d_private.h | 11 +++++ 4 files changed, 136 insertions(+), 38 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=8802059263c9dcddaa0a…
1
0
0
0
Stefan Dösinger : wined3d: Handle WINED3DFMT_D32_FLOAT in wined3d_format_convert_from_float.
by Alexandre Julliard
31 May '22
31 May '22
Module: wine Branch: master Commit: 08f8eb29515e3edbe56f290aaffe11aac6980764 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=08f8eb29515e3edbe56f290a…
Author: Stefan Dösinger <stefan(a)codeweavers.com> Date: Wed May 25 14:26:54 2022 +0300 wined3d: Handle WINED3DFMT_D32_FLOAT in wined3d_format_convert_from_float. Signed-off-by: Stefan Dösinger <stefan(a)codeweavers.com> --- dlls/wined3d/utils.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 5c0f1c5e376..21b8d8a0919 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6133,8 +6133,10 @@ void wined3d_format_convert_from_float(const struct wined3d_format *format, return; } - /* 32 bit float formats. We don't handle D32_FLOAT and D32_FLOAT_S8X24_UINT for now. */ - if ((format->attrs & WINED3D_FORMAT_ATTR_FLOAT) && format->red_size == 32) + /* 32 bit float formats. We don't handle D32_FLOAT_S8X24_UINT for now. */ + if ((format->attrs & WINED3D_FORMAT_ATTR_FLOAT) + && (format->red_size == 32 || format->depth_size == 32) + && !format->stencil_size) { float *ret_f = ret;
1
0
0
0
← Newer
1
2
3
4
...
91
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Results per page:
10
25
50
100
200