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
April
March
February
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-devel
July 2019
----- 2025 -----
April 2025
March 2025
February 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-devel@winehq.org
65 participants
284 discussions
Start a n
N
ew thread
[PATCH v2 1/5] gdi32: Support multiple monitors in D3DKMTOpenAdapterFromGdiDisplayName.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- v2: Fix dxgi d3d12 test failure. Supersede 167505~167509. dlls/gdi32/driver.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index dcbc480376..49ed081df1 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -55,7 +55,6 @@ struct graphics_driver struct d3dkmt_adapter { D3DKMT_HANDLE handle; /* Kernel mode graphics
…
[View More]
adapter handle */ - INT ordinal; /* Graphics adapter ordinal */ struct list entry; /* List entry */ }; @@ -1339,21 +1338,20 @@ NTSTATUS WINAPI D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) */ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc ) { - static const WCHAR display1W[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','1',0}; + static const WCHAR displayW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y'}; static D3DKMT_HANDLE handle_start = 0; struct d3dkmt_adapter *adapter; + WCHAR *end; + int id; TRACE("(%p) semi-stub\n", desc); - if (!desc) + if (!desc || strncmpiW( desc->DeviceName, displayW, ARRAY_SIZE(displayW) )) return STATUS_UNSUCCESSFUL; - /* FIXME: Support multiple monitors */ - if (lstrcmpiW( desc->DeviceName, display1W )) - { - FIXME("%s is unsupported\n", wine_dbgstr_w( desc->DeviceName )); + id = strtolW( desc->DeviceName + ARRAY_SIZE(displayW), &end, 10 ) - 1; + if (*end) return STATUS_UNSUCCESSFUL; - } adapter = heap_alloc( sizeof( *adapter ) ); if (!adapter) @@ -1362,7 +1360,6 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI EnterCriticalSection( &driver_section ); /* D3DKMT_HANDLE is UINT, so we can't use pointer as handle */ adapter->handle = ++handle_start; - adapter->ordinal = 0; list_add_tail( &d3dkmt_adapters, &adapter->entry ); LeaveCriticalSection( &driver_section ); @@ -1370,7 +1367,7 @@ NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADAPTERFROMGDIDI /* FIXME: Support AdapterLuid */ desc->AdapterLuid.LowPart = 0; desc->AdapterLuid.HighPart = 0; - desc->VidPnSourceId = 0; + desc->VidPnSourceId = id; return STATUS_SUCCESS; } -- 2.20.1
[View Less]
1
0
0
0
[PATCH 1/3] ntdll/tests: Add more tests for RtlIpv4StringToAddress
by Alex Henrie
04 Jul '19
04 Jul '19
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com> --- dlls/ntdll/tests/rtl.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 62662cb438..3e1d92c3d2 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -1212,12 +1212,23 @@ static struct { "1", STATUS_SUCCESS, 1, { 0, 0, 0, 1 }, strict_diff_4,
…
[View More]
STATUS_INVALID_PARAMETER, 1, { -1 } }, { "-1", STATUS_INVALID_PARAMETER, 0, { -1 } }, + { "1.2", STATUS_SUCCESS, 3, { 1, 0, 0, 2 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 3, { -1 } }, + { "1000.2000", STATUS_INVALID_PARAMETER, 9, { -1 } }, + { "1.2.", STATUS_INVALID_PARAMETER, 4, { -1 } }, + { "1..2", STATUS_INVALID_PARAMETER, 3, { -1 } }, + { "1...2", STATUS_INVALID_PARAMETER, 3, { -1 } }, + { "1.2.3", STATUS_SUCCESS, 5, { 1, 2, 0, 3 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 5, { -1 } }, + { "1.2.3.", STATUS_INVALID_PARAMETER, 6, { -1 } }, { "203569230", STATUS_SUCCESS, 9, { 12, 34, 56, 78 }, strict_diff_4, STATUS_INVALID_PARAMETER, 9, { -1 } }, { "1.223756", STATUS_SUCCESS, 8, { 1, 3, 106, 12 }, strict_diff_4, STATUS_INVALID_PARAMETER, 8, { -1 } }, { "3.4.756", STATUS_SUCCESS, 7, { 3, 4, 2, 244 }, strict_diff_4, STATUS_INVALID_PARAMETER, 7, { -1 } }, + { "756.3.4", STATUS_INVALID_PARAMETER, 7, { -1 } }, + { "3.756.4", STATUS_INVALID_PARAMETER, 7, { -1 } }, { "3.4.756.1", STATUS_INVALID_PARAMETER, 9, { -1 } }, { "3.4.65536", STATUS_INVALID_PARAMETER, 9, { -1 } }, { "3.4.5.6.7", STATUS_INVALID_PARAMETER, 7, { -1 } }, @@ -1233,9 +1244,27 @@ static struct { ".1", STATUS_INVALID_PARAMETER, 1, { -1 } }, { ".1.", STATUS_INVALID_PARAMETER, 1, { -1 } }, { ".1.2.3", STATUS_INVALID_PARAMETER, 1, { -1 } }, + { ".1.2.3.4", STATUS_INVALID_PARAMETER, 1, { -1 } }, { "0.1.2.3", STATUS_SUCCESS, 7, { 0, 1, 2, 3 } }, { "0.1.2.3.", STATUS_INVALID_PARAMETER, 7, { -1 } }, { "[0.1.2.3]", STATUS_INVALID_PARAMETER, 0, { -1 } }, + { "0x00010203", STATUS_SUCCESS, 10, { 0, 1, 2, 3 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 2, { -1 } }, + { "0X00010203", STATUS_SUCCESS, 10, { 0, 1, 2, 3 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 2, { -1 } }, + { "0x1234", STATUS_SUCCESS, 6, { 0, 0, 18, 52 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 2, { -1 } }, + { "0x123456789", STATUS_SUCCESS, 11, { 35, 69, 103, 137 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 2, { -1 } }, + { "0x00010Q03", STATUS_SUCCESS, 7, { 0, 0, 0, 16 }, strict_diff_4 | ex_fail_4, + STATUS_INVALID_PARAMETER, 2, { -1 } }, + { "x00010203", STATUS_INVALID_PARAMETER, 0, { -1 } }, + { "1234BEEF", STATUS_SUCCESS, 4, { 0, 0, 4, 210 }, strict_diff_4 | ex_fail_4, + STATUS_INVALID_PARAMETER, 4, { -1 } }, + { "017700000001", STATUS_SUCCESS, 12, { 127, 0, 0, 1 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 1, { -1 } }, + { "0777", STATUS_SUCCESS, 4, { 0, 0, 1, 255 }, strict_diff_4, + STATUS_INVALID_PARAMETER, 1, { -1 } }, { "::1", STATUS_INVALID_PARAMETER, 0, { -1 } }, { ":1", STATUS_INVALID_PARAMETER, 0, { -1 } }, }; -- 2.22.0
[View Less]
2
3
0
0
[PATCH] gdi32/tests: Fix tests on Win10 1809 64bit.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/gdi32/tests/driver.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index b5f6f75a83..a19aba2992 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -650,7 +650,9 @@ static void test_D3DKMTCheckOcclusion(void) ShowWindow(hwnd, SW_MINIMIZE); occlusion_desc.hWnd = hwnd; status = pD3DKMTCheckOcclusion(&
…
[View More]
occlusion_desc); - ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status); + /* On Win10 1809 64bit, sometimes STATUS_GRAPHICS_PRESENT_OCCLUDED is returned, not sure why */ + ok(status == STATUS_SUCCESS || broken(status == STATUS_GRAPHICS_PRESENT_OCCLUDED), + "Got unexpected return code %#x.\n", status); ShowWindow(hwnd, SW_SHOWNORMAL); /* Invisible state doesn't affect D3DKMTCheckOcclusion */ @@ -690,7 +692,9 @@ static void test_D3DKMTCheckOcclusion(void) ShowWindow(hwnd, SW_MINIMIZE); occlusion_desc.hWnd = hwnd; status = pD3DKMTCheckOcclusion(&occlusion_desc); - ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status); + /* Broken on Win10 1809 64bit sometimes */ + ok(status == STATUS_SUCCESS || broken(status == STATUS_GRAPHICS_PRESENT_OCCLUDED), + "Got unexpected return code %#x.\n", status); ShowWindow(hwnd, SW_SHOWNORMAL); ShowWindow(hwnd, SW_HIDE); -- 2.20.1
[View Less]
1
0
0
0
[PATCH] mshtml: Fixed buffer size to WideCharToMultiByte
by Marcus Meissner
04 Jul '19
04 Jul '19
Signed-off-by: Marcus Meissner <meissner(a)suse.de> --- dlls/mshtml/tests/dom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 92c79b746f..ff7c62bdfc 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -566,7 +566,7 @@ static const elem_type_info_t elem_type_infos[] = { static int strncmp_wa(LPCWSTR strw, const char *stra, size_t len) { WCHAR buf[512]; - size_t wlen =
…
[View More]
MultiByteToWideChar(CP_ACP, 0, stra, len, buf, sizeof(buf)); + size_t wlen = MultiByteToWideChar(CP_ACP, 0, stra, len, buf, ARRAY_SIZE(buf)); return wlen == len && memcmp(strw, buf, len * sizeof(WCHAR)); } @@ -580,7 +580,7 @@ static BOOL is_prefix_wa(const WCHAR *strw, const char *prefix) int len, prefix_len; CHAR buf[512]; - len = WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL)-1; + len = WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, ARRAY_SIZE(buf), NULL, NULL)-1; prefix_len = lstrlenA(prefix); if(len < prefix_len) return FALSE; -- 2.22.0
[View Less]
2
1
0
0
[PATCH 4/5] winex11.drv: Implement X11DRV_D3DKMTSetVidPnSourceOwner.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/gdi32/tests/driver.c | 2 +- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 138 +++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index b5f6f75a83..2ea43e3025 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -600,7 +600,7 @@
…
[View More]
static void test_D3DKMTSetVidPnSourceOwner(void) if (!pD3DKMTSetVidPnSourceOwner || pD3DKMTSetVidPnSourceOwner(&set_owner_desc) == STATUS_PROCEDURE_NOT_FOUND) { - skip("D3DKMTSetVidPnSourceOwner() is unavailable.\n"); + win_skip("D3DKMTSetVidPnSourceOwner() is unavailable.\n"); return; } diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 49d334ef62..66e6e7f09a 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -472,7 +472,7 @@ static const struct gdi_dc_funcs x11drv_funcs = X11DRV_UnrealizePalette, /* pUnrealizePalette */ NULL, /* pWidenPath */ NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ - NULL, /* pD3DKMTSetVidPnSourceOwner */ + X11DRV_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */ X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */ X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 9ab948f724..d96a19f2e6 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -149,6 +149,7 @@ extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; +extern NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) DECLSPEC_HIDDEN; extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern INT X11DRV_EnumICMProfiles( PHYSDEV dev, ICMENUMPROCW proc, LPARAM lparam ) DECLSPEC_HIDDEN; extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 21807af3f1..ef973f3e48 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -42,6 +42,8 @@ #include <X11/extensions/Xrender.h> #endif +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "windef.h" #include "winbase.h" #include "winreg.h" @@ -52,6 +54,8 @@ #include "wine/unicode.h" #include "wine/debug.h" #include "wine/library.h" +#include "wine/list.h" +#include "wine/heap.h" WINE_DEFAULT_DEBUG_CHANNEL(x11drv); WINE_DECLARE_DEBUG_CHANNEL(synchronous); @@ -96,6 +100,25 @@ static int (*old_error_handler)( Display *, XErrorEvent * ); static BOOL use_xim = TRUE; static char input_style[20]; +static CRITICAL_SECTION x11drv_section; +static CRITICAL_SECTION_DEBUG critsect_debug = +{ + 0, 0, &x11drv_section, + { &critsect_debug.ProcessLocksList, &critsect_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": x11drv_section") } +}; +static CRITICAL_SECTION x11drv_section = { &critsect_debug, -1, 0, 0, 0, 0 }; + +struct d3dkmt_vidpn_source +{ + D3DKMT_VIDPNSOURCEOWNER_TYPE type; /* VidPN source owner type */ + D3DDDI_VIDEO_PRESENT_SOURCE_ID id; /* VidPN present source id */ + D3DKMT_HANDLE device; /* Kernel mode device context */ + struct list entry; /* List entry */ +}; + +static struct list d3dkmt_vidpn_sources = LIST_INIT( d3dkmt_vidpn_sources ); /* VidPN source information list */ + #define IS_OPTION_TRUE(ch) \ ((ch) == 'y' || (ch) == 'Y' || (ch) == 't' || (ch) == 'T' || (ch) == '1') #define IS_OPTION_FALSE(ch) \ @@ -739,3 +762,118 @@ BOOL CDECL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_p } return FALSE; /* let user32 handle it */ } + +/********************************************************************** + * X11DRV_D3DKMTSetVidPnSourceOwner + */ +NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) +{ + struct d3dkmt_vidpn_source *source, *source2; + NTSTATUS status = STATUS_SUCCESS; + BOOL found; + UINT i; + + TRACE("(%p)\n", desc); + + EnterCriticalSection( &x11drv_section ); + + /* Check parameters */ + for (i = 0; i < desc->VidPnSourceCount; ++i) + { + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->id == desc->pVidPnSourceId[i]) + { + /* Same device */ + if (source->device == desc->hDevice) + { + if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE + && (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED + || desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) + || (source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED + && desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE)) + { + status = STATUS_INVALID_PARAMETER; + goto done; + } + } + /* Different devices */ + else + { + if ((source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE + || source->type == D3DKMT_VIDPNSOURCEOWNER_EMULATED) + && (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE + || desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EMULATED)) + { + status = STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; + goto done; + } + } + } + } + + /* On Windows, it seems that all video present sources are owned by DMM clients, so any attempt to set + * D3DKMT_VIDPNSOURCEOWNER_SHARED come back STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE */ + if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_SHARED) + { + status = STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE; + goto done; + } + + /* FIXME: D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI unsupported */ + if (desc->pType[i] == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI || desc->pType[i] > D3DKMT_VIDPNSOURCEOWNER_EMULATED) + { + status = STATUS_INVALID_PARAMETER; + goto done; + } + } + + /* Remove owner */ + if (!desc->VidPnSourceCount && !desc->pType && !desc->pVidPnSourceId) + { + LIST_FOR_EACH_ENTRY_SAFE( source, source2, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->device == desc->hDevice) + { + list_remove( &source->entry ); + heap_free( source ); + } + } + goto done; + } + + /* Add owner */ + for (i = 0; i < desc->VidPnSourceCount; ++i) + { + found = FALSE; + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->device == desc->hDevice && source->id == desc->pVidPnSourceId[i]) + { + found = TRUE; + break; + } + } + + if (found) + source->type = desc->pType[i]; + else + { + source = heap_alloc( sizeof( *source ) ); + if (!source) + { + status = STATUS_NO_MEMORY; + goto done; + } + + source->id = desc->pVidPnSourceId[i]; + source->type = desc->pType[i]; + source->device = desc->hDevice; + list_add_tail( &d3dkmt_vidpn_sources, &source->entry ); + } + } + +done: + LeaveCriticalSection( &x11drv_section ); + return status; +} -- 2.20.1
[View Less]
2
2
0
0
[PATCH 5/5] winex11.drv: Implement X11DRV_D3DKMTCheckVidPnExclusiveOwnership.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/gdi32/tests/driver.c | 2 +- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/x11drv_main.c | 25 +++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c index 2ea43e3025..ed83a72813 100644 --- a/dlls/gdi32/tests/driver.c +++ b/dlls/gdi32/tests/driver.c @@ -376,7 +376,7 @@ static void
…
[View More]
test_D3DKMTCheckVidPnExclusiveOwnership(void) if (!pD3DKMTCheckVidPnExclusiveOwnership || pD3DKMTCheckVidPnExclusiveOwnership(NULL) == STATUS_PROCEDURE_NOT_FOUND) { - skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); + win_skip("D3DKMTCheckVidPnExclusiveOwnership() is unavailable.\n"); return; } diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 66e6e7f09a..531bff0fdb 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -471,7 +471,7 @@ static const struct gdi_dc_funcs x11drv_funcs = X11DRV_StrokePath, /* pStrokePath */ X11DRV_UnrealizePalette, /* pUnrealizePalette */ NULL, /* pWidenPath */ - NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ + X11DRV_D3DKMTCheckVidPnExclusiveOwnership, /* pD3DKMTCheckVidPnExclusiveOwnership */ X11DRV_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */ X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */ X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index d96a19f2e6..6ebf5db247 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -150,6 +150,7 @@ extern BOOL X11DRV_Arc( PHYSDEV dev, INT left, INT top, INT right, extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN; extern NTSTATUS X11DRV_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) DECLSPEC_HIDDEN; +extern NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) DECLSPEC_HIDDEN; extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern INT X11DRV_EnumICMProfiles( PHYSDEV dev, ICMENUMPROCW proc, LPARAM lparam ) DECLSPEC_HIDDEN; extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index ef973f3e48..c9b202ad0e 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -877,3 +877,28 @@ done: LeaveCriticalSection( &x11drv_section ); return status; } + +/********************************************************************** + * X11DRV_D3DKMTCheckVidPnExclusiveOwnership + */ +NTSTATUS X11DRV_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) +{ + struct d3dkmt_vidpn_source *source; + + TRACE("(%p)\n", desc); + + if (!desc || !desc->hAdapter) + return STATUS_INVALID_PARAMETER; + + EnterCriticalSection( &x11drv_section ); + LIST_FOR_EACH_ENTRY( source, &d3dkmt_vidpn_sources, struct d3dkmt_vidpn_source, entry ) + { + if (source->id == desc->VidPnSourceId && source->type == D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE) + { + LeaveCriticalSection( &x11drv_section ); + return STATUS_GRAPHICS_PRESENT_OCCLUDED; + } + } + LeaveCriticalSection( &x11drv_section ); + return STATUS_SUCCESS; +} -- 2.20.1
[View Less]
2
1
0
0
[PATCH 3/5] gdi32: Add D3DKMTCheckVidPnExclusiveOwnership stub.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- .../api-ms-win-dx-d3dkmt-l1-1-0.spec | 2 +- dlls/d3d11/d3d11.spec | 1 + dlls/gdi32/dibdrv/dc.c | 2 ++ dlls/gdi32/driver.c | 22 +++++++++++++++++++ dlls/gdi32/enhmfdrv/dc.c | 1 + dlls/gdi32/enhmfdrv/init.c | 1 + dlls/gdi32/freetype.c | 1 + dlls/gdi32/gdi32.spec
…
[View More]
| 1 + dlls/gdi32/mfdrv/init.c | 1 + dlls/gdi32/path.c | 1 + dlls/wineandroid.drv/init.c | 1 + dlls/winemac.drv/gdi.c | 1 + dlls/wineps.drv/init.c | 1 + dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/xrender.c | 1 + include/ddk/d3dkmthk.h | 1 + include/wine/gdi_driver.h | 3 ++- 17 files changed, 40 insertions(+), 2 deletions(-) diff --git a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec index c14ebc68e9..0f68d777f0 100644 --- a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec +++ b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec @@ -5,7 +5,7 @@ @ stub D3DKMTCheckMonitorPowerState @ stub D3DKMTCheckOcclusion @ stub D3DKMTCheckSharedResourceAccess -@ stub D3DKMTCheckVidPnExclusiveOwnership +@ stdcall D3DKMTCheckVidPnExclusiveOwnership(ptr) gdi32.D3DKMTCheckVidPnExclusiveOwnership @ stdcall D3DKMTCloseAdapter(ptr) gdi32.D3DKMTCloseAdapter @ stub D3DKMTConfigureSharedResource @ stub D3DKMTCreateAllocation diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec index 606ddae3e3..383ed6aa9c 100644 --- a/dlls/d3d11/d3d11.spec +++ b/dlls/d3d11/d3d11.spec @@ -5,6 +5,7 @@ @ stdcall D3D11CreateDevice(ptr long ptr long ptr long long ptr ptr ptr) @ stdcall D3D11CreateDeviceAndSwapChain(ptr long ptr long ptr long long ptr ptr ptr ptr ptr) @ stdcall D3D11On12CreateDevice(ptr long ptr long ptr long long ptr ptr ptr) +@ stdcall D3DKMTCheckVidPnExclusiveOwnership(ptr) gdi32.D3DKMTCheckVidPnExclusiveOwnership @ stdcall D3DKMTCloseAdapter(ptr) gdi32.D3DKMTCloseAdapter @ stub D3DKMTCreateAllocation @ stub D3DKMTCreateContext diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 10c3fc6f69..fe1ef1e0fc 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -520,6 +520,7 @@ const struct gdi_dc_funcs dib_driver = dibdrv_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ dibdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ @@ -1144,6 +1145,7 @@ static const struct gdi_dc_funcs window_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ windrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index 71a52ed9fc..9da7ba1734 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -753,6 +753,11 @@ static BOOL nulldrv_UnrealizePalette( HPALETTE palette ) return FALSE; } +static NTSTATUS WINAPI nulldrv_D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) +{ + return STATUS_PROCEDURE_NOT_FOUND; +} + static NTSTATUS WINAPI nulldrv_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) { return STATUS_PROCEDURE_NOT_FOUND; @@ -897,6 +902,7 @@ const struct gdi_dc_funcs null_driver = nulldrv_StrokePath, /* pStrokePath */ nulldrv_UnrealizePalette, /* pUnrealizePalette */ nulldrv_WidenPath, /* pWidenPath */ + nulldrv_D3DKMTCheckVidPnExclusiveOwnership, /* pD3DKMTCheckVidPnExclusiveOwnership */ nulldrv_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */ nulldrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ nulldrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ @@ -1473,3 +1479,19 @@ NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *des * released before showing the new window */ return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc ); } + +/****************************************************************************** + * D3DKMTCheckVidPnExclusiveOwnership [GDI32.@] + */ +NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) +{ + TRACE("(%p)\n", desc); + + if (!get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership) + return STATUS_PROCEDURE_NOT_FOUND; + + if (!desc || !desc->hAdapter) + return STATUS_INVALID_PARAMETER; + + return get_display_driver()->pD3DKMTCheckVidPnExclusiveOwnership( desc ); +} diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index 80e54685c7..450f80f6ba 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -950,6 +950,7 @@ static const struct gdi_dc_funcs emfpath_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 6938e45cbd..d13f3b2b9d 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -163,6 +163,7 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ EMFDRV_WidenPath, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index b571611c13..dceb1fae38 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -9236,6 +9236,7 @@ static const struct gdi_dc_funcs freetype_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec index 597002c9a8..4d71b75d19 100644 --- a/dlls/gdi32/gdi32.spec +++ b/dlls/gdi32/gdi32.spec @@ -80,6 +80,7 @@ @ stdcall CreateScalableFontResourceA(long str str str) @ stdcall CreateScalableFontResourceW(long wstr wstr wstr) @ stdcall CreateSolidBrush(long) +@ stdcall D3DKMTCheckVidPnExclusiveOwnership(ptr) @ stdcall D3DKMTCloseAdapter(ptr) @ stdcall D3DKMTCreateDCFromMemory(ptr) @ stdcall D3DKMTCreateDevice(ptr) diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index fb568f1838..52181cd60f 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -226,6 +226,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = MFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ MFDRV_WidenPath, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c index 23c0162f64..9a671db46c 100644 --- a/dlls/gdi32/path.c +++ b/dlls/gdi32/path.c @@ -2248,6 +2248,7 @@ const struct gdi_dc_funcs path_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index ec6c689b49..a73b025d4d 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -411,6 +411,7 @@ static const struct gdi_dc_funcs android_drv_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ ANDROID_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c index 32aeba04b4..5adf86c9de 100644 --- a/dlls/winemac.drv/gdi.c +++ b/dlls/winemac.drv/gdi.c @@ -390,6 +390,7 @@ static const struct gdi_dc_funcs macdrv_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ macdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ macdrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 2183029058..e82b0c8ee3 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -908,6 +908,7 @@ static const struct gdi_dc_funcs psdrv_funcs = PSDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index baed875ba5..49d334ef62 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -471,6 +471,7 @@ static const struct gdi_dc_funcs x11drv_funcs = X11DRV_StrokePath, /* pStrokePath */ X11DRV_UnrealizePalette, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */ X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index e8dbf27c0d..addd0ea1b1 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2284,6 +2284,7 @@ static const struct gdi_dc_funcs xrender_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTCheckVidPnExclusiveOwnership */ NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h index 05e2e65aea..717fdb3579 100644 --- a/include/ddk/d3dkmthk.h +++ b/include/ddk/d3dkmthk.h @@ -165,6 +165,7 @@ extern "C" { #endif /* __cplusplus */ +NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership(const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc); NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc); NTSTATUS WINAPI D3DKMTCreateDevice(D3DKMT_CREATEDEVICE *desc); NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc); diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index fac25349d1..8ae641b1ee 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -194,6 +194,7 @@ struct gdi_dc_funcs BOOL (*pStrokePath)(PHYSDEV); BOOL (*pUnrealizePalette)(HPALETTE); BOOL (*pWidenPath)(PHYSDEV); + NTSTATUS (*pD3DKMTCheckVidPnExclusiveOwnership)(const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *); NTSTATUS (*pD3DKMTSetVidPnSourceOwner)(const D3DKMT_SETVIDPNSOURCEOWNER *); struct opengl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT); const struct vulkan_funcs * (*wine_get_vulkan_driver)(PHYSDEV,UINT); @@ -203,7 +204,7 @@ struct gdi_dc_funcs }; /* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 50 +#define WINE_GDI_DRIVER_VERSION 51 #define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ -- 2.20.1
[View Less]
2
1
0
0
[PATCH 2/5] gdi32: Add D3DKMTSetVidPnSourceOwner stub.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
D3DKMTSetVidPnSourceOwner needs to be implemented in user drivers because we need to maintain the VidPN source ownership information list in user driver. For example, user drivers need to release the exclusive owner when a new window is moved to a monitor which already have an exclusive owner. Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- .../api-ms-win-dx-d3dkmt-l1-1-0.spec | 2 +- dlls/d3d11/d3d11.spec | 2 +- dlls/gdi32/dibdrv/dc.c
…
[View More]
| 2 ++ dlls/gdi32/driver.c | 29 +++++++++++++++++++ dlls/gdi32/enhmfdrv/dc.c | 1 + dlls/gdi32/enhmfdrv/init.c | 1 + dlls/gdi32/freetype.c | 1 + dlls/gdi32/gdi32.spec | 1 + dlls/gdi32/mfdrv/init.c | 1 + dlls/gdi32/path.c | 1 + dlls/wineandroid.drv/init.c | 1 + dlls/winemac.drv/gdi.c | 1 + dlls/wineps.drv/init.c | 1 + dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/xrender.c | 1 + include/ddk/d3dkmthk.h | 1 + include/wine/gdi_driver.h | 5 +++- 17 files changed, 49 insertions(+), 3 deletions(-) diff --git a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec index 43452cda74..c14ebc68e9 100644 --- a/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec +++ b/dlls/api-ms-win-dx-d3dkmt-l1-1-0/api-ms-win-dx-d3dkmt-l1-1-0.spec @@ -82,7 +82,7 @@ @ stub D3DKMTSetProcessSchedulingPriorityClass @ stub D3DKMTSetQueuedLimit @ stub D3DKMTSetStereoEnabled -@ stub D3DKMTSetVidPnSourceOwner +@ stdcall D3DKMTSetVidPnSourceOwner(ptr) gdi32.D3DKMTSetVidPnSourceOwner @ stub D3DKMTShareObjects @ stub D3DKMTSharedPrimaryLockNotification @ stub D3DKMTSharedPrimaryUnLockNotification diff --git a/dlls/d3d11/d3d11.spec b/dlls/d3d11/d3d11.spec index 01bc8bfebc..606ddae3e3 100644 --- a/dlls/d3d11/d3d11.spec +++ b/dlls/d3d11/d3d11.spec @@ -35,7 +35,7 @@ @ stub D3DKMTSetDisplayMode @ stub D3DKMTSetDisplayPrivateDriverFormat @ stub D3DKMTSetGammaRamp -@ stub D3DKMTSetVidPnSourceOwner +@ stdcall D3DKMTSetVidPnSourceOwner(ptr) gdi32.D3DKMTSetVidPnSourceOwner @ stub D3DKMTSignalSynchronizationObject @ stub D3DKMTUnlock @ stub D3DKMTWaitForSynchronizationObject diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index a3f84bd688..10c3fc6f69 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -520,6 +520,7 @@ const struct gdi_dc_funcs dib_driver = dibdrv_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ dibdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_DIB_DRV /* priority */ @@ -1143,6 +1144,7 @@ static const struct gdi_dc_funcs window_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ windrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_DIB_DRV + 10 /* priority */ diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index 49ed081df1..71a52ed9fc 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -753,6 +753,11 @@ static BOOL nulldrv_UnrealizePalette( HPALETTE palette ) return FALSE; } +static NTSTATUS WINAPI nulldrv_D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) +{ + return STATUS_PROCEDURE_NOT_FOUND; +} + static struct opengl_funcs *nulldrv_wine_get_wgl_driver( PHYSDEV dev, UINT version ) { return (void *)-1; @@ -892,6 +897,7 @@ const struct gdi_dc_funcs null_driver = nulldrv_StrokePath, /* pStrokePath */ nulldrv_UnrealizePalette, /* pUnrealizePalette */ nulldrv_WidenPath, /* pWidenPath */ + nulldrv_D3DKMTSetVidPnSourceOwner, /* pD3DKMTSetVidPnSourceOwner */ nulldrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ nulldrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ @@ -1422,6 +1428,7 @@ NTSTATUS WINAPI D3DKMTCreateDevice( D3DKMT_CREATEDEVICE *desc ) NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) { NTSTATUS status = STATUS_INVALID_PARAMETER; + D3DKMT_SETVIDPNSOURCEOWNER set_owner_desc; struct d3dkmt_device *device; TRACE("(%p)\n", desc); @@ -1434,6 +1441,9 @@ NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) { if (device->handle == desc->hDevice) { + memset( &set_owner_desc, 0, sizeof(set_owner_desc) ); + set_owner_desc.hDevice = desc->hDevice; + D3DKMTSetVidPnSourceOwner( &set_owner_desc ); list_remove( &device->entry ); heap_free( device ); status = STATUS_SUCCESS; @@ -1444,3 +1454,22 @@ NTSTATUS WINAPI D3DKMTDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) return status; } + +/****************************************************************************** + * D3DKMTSetVidPnSourceOwner [GDI32.@] + */ +NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) +{ + TRACE("(%p)\n", desc); + + if (!get_display_driver()->pD3DKMTSetVidPnSourceOwner) + return STATUS_PROCEDURE_NOT_FOUND; + + if (!desc || !desc->hDevice) + return STATUS_INVALID_PARAMETER; + + /* Store VidPN source ownership info in user driver because user driver needs to changes ownership sometimes. + * For example, when a new window is moved to a VidPN source with an exclusive owner, such exclusive owner will be + * released before showing the new window */ + return get_display_driver()->pD3DKMTSetVidPnSourceOwner( desc ); +} diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index 960d1b295c..80e54685c7 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -950,6 +950,7 @@ static const struct gdi_dc_funcs emfpath_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_PATH_DRV + 1 /* priority */ diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 1cd838ab8e..6938e45cbd 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -163,6 +163,7 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ EMFDRV_WidenPath, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 703dc3a997..b571611c13 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -9236,6 +9236,7 @@ static const struct gdi_dc_funcs freetype_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_FONT_DRV /* priority */ diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec index 9abd82173c..597002c9a8 100644 --- a/dlls/gdi32/gdi32.spec +++ b/dlls/gdi32/gdi32.spec @@ -88,6 +88,7 @@ @ stdcall D3DKMTEscape(ptr) @ stdcall D3DKMTOpenAdapterFromGdiDisplayName(ptr) @ stdcall D3DKMTOpenAdapterFromHdc(ptr) +@ stdcall D3DKMTSetVidPnSourceOwner(ptr) @ stdcall DPtoLP(long ptr long) @ stdcall DeleteColorSpace(long) @ stdcall DeleteDC(long) diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index 4ef509a89f..fb568f1838 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -226,6 +226,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = MFDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ MFDRV_WidenPath, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c index 8cf86ccb2e..23c0162f64 100644 --- a/dlls/gdi32/path.c +++ b/dlls/gdi32/path.c @@ -2248,6 +2248,7 @@ const struct gdi_dc_funcs path_driver = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_PATH_DRV /* priority */ diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 7a2945c80f..ec6c689b49 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -411,6 +411,7 @@ static const struct gdi_dc_funcs android_drv_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ ANDROID_wine_get_wgl_driver, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c index 7156a3c3a8..32aeba04b4 100644 --- a/dlls/winemac.drv/gdi.c +++ b/dlls/winemac.drv/gdi.c @@ -390,6 +390,7 @@ static const struct gdi_dc_funcs macdrv_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ macdrv_wine_get_wgl_driver, /* wine_get_wgl_driver */ macdrv_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index 0dff6cc868..2183029058 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -908,6 +908,7 @@ static const struct gdi_dc_funcs psdrv_funcs = PSDRV_StrokePath, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 20710cc0c9..baed875ba5 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -471,6 +471,7 @@ static const struct gdi_dc_funcs x11drv_funcs = X11DRV_StrokePath, /* pStrokePath */ X11DRV_UnrealizePalette, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ X11DRV_wine_get_wgl_driver, /* wine_get_wgl_driver */ X11DRV_wine_get_vulkan_driver, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV /* priority */ diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 61729ecf29..e8dbf27c0d 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2284,6 +2284,7 @@ static const struct gdi_dc_funcs xrender_funcs = NULL, /* pStrokePath */ NULL, /* pUnrealizePalette */ NULL, /* pWidenPath */ + NULL, /* pD3DKMTSetVidPnSourceOwner */ NULL, /* wine_get_wgl_driver */ NULL, /* wine_get_vulkan_driver */ GDI_PRIORITY_GRAPHICS_DRV + 10 /* priority */ diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h index 081758bf5d..05e2e65aea 100644 --- a/include/ddk/d3dkmthk.h +++ b/include/ddk/d3dkmthk.h @@ -171,6 +171,7 @@ NTSTATUS WINAPI D3DKMTCreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc); NTSTATUS WINAPI D3DKMTDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc); NTSTATUS WINAPI D3DKMTDestroyDevice(const D3DKMT_DESTROYDEVICE *desc); NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *desc); +NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner(const D3DKMT_SETVIDPNSOURCEOWNER *desc); #ifdef __cplusplus } diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index d3e5bcefb4..fac25349d1 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -21,6 +21,8 @@ #ifndef __WINE_WINE_GDI_DRIVER_H #define __WINE_WINE_GDI_DRIVER_H +#include "winternl.h" +#include "ddk/d3dkmthk.h" #include "wine/list.h" struct gdi_dc_funcs; @@ -192,6 +194,7 @@ struct gdi_dc_funcs BOOL (*pStrokePath)(PHYSDEV); BOOL (*pUnrealizePalette)(HPALETTE); BOOL (*pWidenPath)(PHYSDEV); + NTSTATUS (*pD3DKMTSetVidPnSourceOwner)(const D3DKMT_SETVIDPNSOURCEOWNER *); struct opengl_funcs * (*wine_get_wgl_driver)(PHYSDEV,UINT); const struct vulkan_funcs * (*wine_get_vulkan_driver)(PHYSDEV,UINT); @@ -200,7 +203,7 @@ struct gdi_dc_funcs }; /* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 49 +#define WINE_GDI_DRIVER_VERSION 50 #define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ -- 2.20.1
[View Less]
2
1
0
0
[PATCH 6/6] winemac.drv: Use generic EnumDisplayMonitors and GetMonitorInfo.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/winemac.drv/cocoa_display.m | 2 + dlls/winemac.drv/display.c | 154 +++++--------------------------------- dlls/winemac.drv/macdrv_cocoa.h | 4 + dlls/winemac.drv/winemac.drv.spec | 2 - 4 files changed, 26 insertions(+), 136 deletions(-) diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m index e1c1b0cb17..6ffb2714f8 100644 --- a/dlls/winemac.drv/cocoa_display.m +++ b/dlls/
…
[View More]
winemac.drv/cocoa_display.m @@ -654,6 +654,8 @@ int macdrv_get_monitors(uint32_t adapter_id, struct macdrv_monitor** new_monitor strcpy(monitors[monitor_count].name, "Generic Non-PnP Monitor"); monitors[monitor_count].state_flags = DISPLAY_DEVICE_ATTACHED | DISPLAY_DEVICE_ACTIVE; + monitors[monitor_count].rc_monitor = displays[j].frame; + monitors[monitor_count].rc_work = displays[j].work_frame; monitor_count++; } } diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index 5a1419511d..08067e0ad8 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -53,6 +53,9 @@ BOOL CDECL macdrv_EnumDisplaySettingsEx(LPCWSTR devname, DWORD mode, LPDEVMODEW /* Wine specific monitor properties */ DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_STATEFLAGS, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 2); +DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCMONITOR, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 3); +DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_RCWORK, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 4); +DEFINE_DEVPROPKEY(WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, 0x233a9ef3, 0xafc4, 0x4abd, 0xb5, 0x64, 0xc3, 0x2f, 0x21, 0xf1, 0x53, 0x5b, 5); static const char initial_mode_key[] = "Initial Display Mode"; static const WCHAR pixelencodingW[] = {'P','i','x','e','l','E','n','c','o','d','i','n','g',0}; @@ -63,6 +66,7 @@ static const WCHAR video_idW[] = {'V','i','d','e','o','I','D',0}; static const WCHAR symbolic_link_valueW[]= {'S','y','m','b','o','l','i','c','L','i','n','k','V','a','l','u','e',0}; static const WCHAR gpu_idW[] = {'G','P','U','I','D',0}; static const WCHAR mointor_id_fmtW[] = {'M','o','n','i','t','o','r','I','D','%','d',0}; +static const WCHAR adapter_name_fmtW[] = {'\\','\\','.','\\','D','I','S','P','L','A','Y','%','d',0}; static const WCHAR state_flagsW[] = {'S','t','a','t','e','F','l','a','g','s',0}; static const WCHAR guid_fmtW[] = { '{','%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0','2','x','%','0','2','x','-', @@ -127,18 +131,6 @@ static CRITICAL_SECTION modes_section = { &critsect_debug, -1, 0, 0, 0, 0 }; static BOOL inited_original_display_mode; - -static inline HMONITOR display_id_to_monitor(CGDirectDisplayID display_id) -{ - return (HMONITOR)(UINT_PTR)display_id; -} - -static inline CGDirectDisplayID monitor_to_display_id(HMONITOR handle) -{ - return (CGDirectDisplayID)(UINT_PTR)handle; -} - - static BOOL get_display_device_reg_key(char *key, unsigned len) { static const char display_device_guid_prop[] = "__wine_display_device_guid"; @@ -968,76 +960,6 @@ better: return ret; } - -/*********************************************************************** - * EnumDisplayMonitors (MACDRV.@) - */ -BOOL CDECL macdrv_EnumDisplayMonitors(HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPARAM lparam) -{ - struct macdrv_display *displays; - int num_displays; - int i; - BOOL ret = TRUE; - - TRACE("%p, %s, %p, %#lx\n", hdc, wine_dbgstr_rect(rect), proc, lparam); - - if (hdc) - { - POINT origin; - RECT limit; - - if (!GetDCOrgEx(hdc, &origin)) return FALSE; - if (GetClipBox(hdc, &limit) == ERROR) return FALSE; - - if (rect && !IntersectRect(&limit, &limit, rect)) return TRUE; - - if (macdrv_get_displays(&displays, &num_displays)) - return FALSE; - - for (i = 0; i < num_displays; i++) - { - RECT monrect = rect_from_cgrect(displays[i].frame); - OffsetRect(&monrect, -origin.x, -origin.y); - if (IntersectRect(&monrect, &monrect, &limit)) - { - HMONITOR monitor = display_id_to_monitor(displays[i].displayID); - TRACE("monitor %d handle %p @ %s\n", i, monitor, wine_dbgstr_rect(&monrect)); - if (!proc(monitor, hdc, &monrect, lparam)) - { - ret = FALSE; - break; - } - } - } - } - else - { - if (macdrv_get_displays(&displays, &num_displays)) - return FALSE; - - for (i = 0; i < num_displays; i++) - { - RECT monrect = rect_from_cgrect(displays[i].frame); - RECT unused; - if (!rect || IntersectRect(&unused, &monrect, rect)) - { - HMONITOR monitor = display_id_to_monitor(displays[i].displayID); - TRACE("monitor %d handle %p @ %s\n", i, monitor, wine_dbgstr_rect(&monrect)); - if (!proc(monitor, 0, &monrect, lparam)) - { - ret = FALSE; - break; - } - } - } - } - - macdrv_free_displays(displays); - - return ret; -} - - /*********************************************************************** * EnumDisplaySettingsEx (MACDRV.@) * @@ -1322,58 +1244,6 @@ done: return ret; } - -/*********************************************************************** - * GetMonitorInfo (MACDRV.@) - */ -BOOL CDECL macdrv_GetMonitorInfo(HMONITOR monitor, LPMONITORINFO info) -{ - static const WCHAR adapter_name[] = { '\\','\\','.','\\','D','I','S','P','L','A','Y','1',0 }; - struct macdrv_display *displays; - int num_displays; - CGDirectDisplayID display_id; - int i; - - TRACE("%p, %p\n", monitor, info); - - if (macdrv_get_displays(&displays, &num_displays)) - { - ERR("couldn't get display list\n"); - SetLastError(ERROR_GEN_FAILURE); - return FALSE; - } - - display_id = monitor_to_display_id(monitor); - for (i = 0; i < num_displays; i++) - { - if (displays[i].displayID == display_id) - break; - } - - if (i < num_displays) - { - info->rcMonitor = rect_from_cgrect(displays[i].frame); - info->rcWork = rect_from_cgrect(displays[i].work_frame); - - info->dwFlags = (i == 0) ? MONITORINFOF_PRIMARY : 0; - - if (info->cbSize >= sizeof(MONITORINFOEXW)) - lstrcpyW(((MONITORINFOEXW*)info)->szDevice, adapter_name); - - TRACE(" -> rcMonitor %s rcWork %s dwFlags %08x\n", wine_dbgstr_rect(&info->rcMonitor), - wine_dbgstr_rect(&info->rcWork), info->dwFlags); - } - else - { - ERR("invalid monitor handle\n"); - SetLastError(ERROR_INVALID_HANDLE); - } - - macdrv_free_displays(displays); - return (i < num_displays); -} - - /*********************************************************************** * SetDeviceGammaRamp (MACDRV.@) */ @@ -1634,6 +1504,7 @@ static BOOL macdrv_init_monitor(HDEVINFO devinfo, const struct macdrv_monitor *m WCHAR nameW[MAX_PATH]; WCHAR bufferW[MAX_PATH]; HKEY hkey; + RECT rect; BOOL ret = FALSE; /* Create GUID_DEVCLASS_MONITOR instance */ @@ -1658,6 +1529,21 @@ static BOOL macdrv_init_monitor(HDEVINFO devinfo, const struct macdrv_monitor *m if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_STATEFLAGS, DEVPROP_TYPE_UINT32, (const BYTE *)&monitor->state_flags, sizeof(monitor->state_flags), 0)) goto done; + /* RcMonitor */ + rect = rect_from_cgrect(monitor->rc_monitor); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCMONITOR, DEVPROP_TYPE_BINARY, + (const BYTE *)&rect, sizeof(rect), 0)) + goto done; + /* RcWork */ + rect = rect_from_cgrect(monitor->rc_work); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_RCWORK, DEVPROP_TYPE_BINARY, + (const BYTE *)&rect, sizeof(rect), 0)) + goto done; + /* Adapter name */ + sprintfW(bufferW, adapter_name_fmtW, video_index + 1); + if (!SetupDiSetDevicePropertyW(devinfo, &device_data, &WINE_DEVPROPKEY_MONITOR_ADAPTERNAME, DEVPROP_TYPE_STRING, + (const BYTE *)bufferW, (lstrlenW(bufferW) + 1) * sizeof(WCHAR), 0)) + goto done; ret = TRUE; done: diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 96ebb97e76..676adb435b 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -293,6 +293,10 @@ static inline CGPoint cgpoint_win_from_mac(CGPoint point) { /* Name, in UTF-8 encoding */ char name[128]; + /* as RcMonitor in MONITORINFO struct after conversion by rect_from_cgrect */ + CGRect rc_monitor; + /* as RcWork in MONITORINFO struct after conversion by rect_from_cgrect */ + CGRect rc_work; /* StateFlags in DISPLAY_DEVICE struct */ uint32_t state_flags; }; diff --git a/dlls/winemac.drv/winemac.drv.spec b/dlls/winemac.drv/winemac.drv.spec index 6fa723a690..39cf33370b 100644 --- a/dlls/winemac.drv/winemac.drv.spec +++ b/dlls/winemac.drv/winemac.drv.spec @@ -12,14 +12,12 @@ @ cdecl CreateWindow(long) macdrv_CreateWindow @ cdecl DestroyCursorIcon(long) macdrv_DestroyCursorIcon @ cdecl DestroyWindow(long) macdrv_DestroyWindow -@ cdecl EnumDisplayMonitors(long ptr ptr long) macdrv_EnumDisplayMonitors @ cdecl EnumDisplaySettingsEx(ptr long ptr long) macdrv_EnumDisplaySettingsEx @ cdecl GetCursorPos(ptr) macdrv_GetCursorPos @ cdecl GetKeyboardLayout(long) macdrv_GetKeyboardLayout @ cdecl GetKeyboardLayoutList(long ptr) macdrv_GetKeyboardLayoutList @ cdecl GetKeyboardLayoutName(ptr) macdrv_GetKeyboardLayoutName @ cdecl GetKeyNameText(long ptr long) macdrv_GetKeyNameText -@ cdecl GetMonitorInfo(long ptr) macdrv_GetMonitorInfo @ cdecl MapVirtualKeyEx(long long long) macdrv_MapVirtualKeyEx @ cdecl MsgWaitForMultipleObjectsEx(long ptr long long long) macdrv_MsgWaitForMultipleObjectsEx @ cdecl RegisterHotKey(long long long) macdrv_RegisterHotKey -- 2.15.2 (Apple Git-101.1)
[View Less]
2
1
0
0
[PATCH 5/6] winemac.drv: Handle display device change events.
by Zhiyi Zhang
04 Jul '19
04 Jul '19
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/winemac.drv/display.c | 8 ++++++-- dlls/winemac.drv/macdrv.h | 2 +- dlls/winemac.drv/macdrv_main.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c index fdb2415885..5a1419511d 100644 --- a/dlls/winemac.drv/display.c +++ b/dlls/winemac.drv/display.c @@ -945,6 +945,8 @@ better: SendMessageW(GetDesktopWindow(),
…
[View More]
WM_MACDRV_UPDATE_DESKTOP_RECT, mode_bpp, MAKELPARAM(width, height)); ret = DISP_CHANGE_SUCCESSFUL; + + macdrv_init_display_devices(TRUE); } else { @@ -1451,6 +1453,8 @@ void macdrv_displays_changed(const macdrv_event *event) free_display_mode_descriptor(desc); CGDisplayModeRelease(mode); + macdrv_init_display_devices(TRUE); + if (is_original && retina_enabled) { width *= 2; @@ -1722,7 +1726,7 @@ static void cleanup_devices(void) * * Initialize display device registry data. */ -void macdrv_init_display_devices(void) +void macdrv_init_display_devices(BOOL force) { static const WCHAR init_mutexW[] = {'d','i','s','p','l','a','y','_','d','e','v','i','c','e','_','i','n','i','t',0}; HANDLE mutex; @@ -1749,7 +1753,7 @@ void macdrv_init_display_devices(void) } /* Avoid unnecessary reinit */ - if (disposition != REG_CREATED_NEW_KEY) + if (!force && disposition != REG_CREATED_NEW_KEY) goto done; TRACE("\n"); diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 064b93a1df..a5bcfec519 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -223,7 +223,7 @@ extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP extern void macdrv_status_item_mouse_move(const macdrv_event *event) DECLSPEC_HIDDEN; extern void check_retina_status(void) DECLSPEC_HIDDEN; -extern void macdrv_init_display_devices(void) DECLSPEC_HIDDEN; +extern void macdrv_init_display_devices(BOOL force) DECLSPEC_HIDDEN; /************************************************************************** * Mac IME driver diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 038578491f..694a46b11e 100644 --- a/dlls/winemac.drv/macdrv_main.c +++ b/dlls/winemac.drv/macdrv_main.c @@ -299,7 +299,7 @@ static BOOL process_attach(void) return FALSE; } - macdrv_init_display_devices(); + macdrv_init_display_devices(FALSE); return TRUE; } -- 2.15.2 (Apple Git-101.1)
[View Less]
2
1
0
0
← Newer
1
...
17
18
19
20
21
22
23
...
29
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
Results per page:
10
25
50
100
200