Wine-Devel
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 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
- 3 participants
- 84543 discussions
Nov. 2, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/editor.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index b54b9334265..38553f7add3 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3451,8 +3451,9 @@ static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM
int x,y;
BOOL isExact;
ME_Cursor cursor; /* The start of the clicked text. */
-
+ ME_Run *run;
ENLINK info;
+
x = (short)LOWORD(lParam);
y = (short)HIWORD(lParam);
ME_CharFromPos(editor, x, y, &cursor, &isExact);
@@ -3460,8 +3461,6 @@ static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM
if (is_link( &cursor.pRun->member.run ))
{ /* The clicked run has CFE_LINK set */
- ME_DisplayItem *di;
-
info.nmhdr.hwndFrom = NULL;
info.nmhdr.idFrom = 0;
info.nmhdr.code = EN_LINK;
@@ -3472,15 +3471,15 @@ static void ME_LinkNotify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM
/* find the first contiguous run with CFE_LINK set */
info.chrg.cpMin = ME_GetCursorOfs(&cursor);
- di = cursor.pRun;
- while (ME_PrevRun( NULL, &di, FALSE ) && is_link( &di->member.run ))
- info.chrg.cpMin -= di->member.run.len;
+ run = &cursor.pRun->member.run;
+ while ((run = run_prev( run )) && is_link( run ))
+ info.chrg.cpMin -= run->len;
/* find the last contiguous run with CFE_LINK set */
info.chrg.cpMax = ME_GetCursorOfs(&cursor) + cursor.pRun->member.run.len;
- di = cursor.pRun;
- while (ME_NextRun( NULL, &di, FALSE ) && is_link( &di->member.run ))
- info.chrg.cpMax += di->member.run.len;
+ run = &cursor.pRun->member.run;
+ while ((run = run_next( run )) && is_link( run ))
+ info.chrg.cpMax += run->len;
ITextHost_TxNotify(editor->texthost, info.nmhdr.code, &info);
}
--
2.23.0
1
0
Nov. 2, 2020
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/riched20/editor.c | 46 ++++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index c1138bd1dab..b54b9334265 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -897,13 +897,13 @@ void ME_RTFTblAttrHook(RTF_Info *info)
if (cellNum >= MAX_TABLE_CELLS)
break;
info->tableDef->cells[cellNum].rightBoundary = info->rtfParam;
- if (cellNum < MAX_TAB_STOPS) {
+ if (cellNum < MAX_TAB_STOPS)
+ {
/* Tab stops were used to store cell positions before v4.1 but v4.1
* still seems to set the tabstops without using them. */
- ME_DisplayItem *para = info->editor->pCursors[0].pPara;
- PARAFORMAT2 *pFmt = ¶->member.para.fmt;
- pFmt->rgxTabs[cellNum] &= ~0x00FFFFFF;
- pFmt->rgxTabs[cellNum] |= 0x00FFFFFF & info->rtfParam;
+ PARAFORMAT2 *fmt = &info->editor->pCursors[0].pPara->member.para.fmt;
+ fmt->rgxTabs[cellNum] &= ~0x00FFFFFF;
+ fmt->rgxTabs[cellNum] |= 0x00FFFFFF & info->rtfParam;
}
info->tableDef->numCellsDefined++;
break;
@@ -2795,7 +2795,7 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
if ((unsigned)wstr >= ' ' || wstr == '\t')
{
ME_Cursor cursor = editor->pCursors[0];
- ME_DisplayItem *para = cursor.pPara;
+ ME_Paragraph *para = &cursor.pPara->member.para;
int from, to;
BOOL ctrl_is_down = GetKeyState(VK_CONTROL) & 0x8000;
ME_GetSelectionOfs(editor, &from, &to);
@@ -2803,38 +2803,40 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode,
/* v4.1 allows tabs to be inserted with ctrl key down */
!(ctrl_is_down && !editor->bEmulateVersion10))
{
- ME_DisplayItem *para;
BOOL selected_row = FALSE;
- para = cursor.pPara;
if (ME_IsSelection(editor) &&
cursor.pRun->member.run.nCharOfs + cursor.nOffset == 0 &&
- to == ME_GetCursorOfs(&editor->pCursors[0]) &&
- para->member.para.prev_para->type == diParagraph)
+ to == ME_GetCursorOfs(&editor->pCursors[0]) && para_prev( para ))
{
- para = para->member.para.prev_para;
+ para = para_prev( para );
selected_row = TRUE;
}
- if (ME_IsInTable(para))
+ if (para_in_table( para ))
{
table_handle_tab( editor, selected_row );
ME_CommitUndo(editor);
return 0;
}
- } else if (!editor->bEmulateVersion10) { /* v4.1 */
- if (para->member.para.nFlags & MEPF_ROWEND) {
- if (from == to) {
- para = para->member.para.next_para;
- if (para->member.para.nFlags & MEPF_ROWSTART)
- para = para->member.para.next_para;
- editor->pCursors[0].pPara = para;
- editor->pCursors[0].pRun = ME_FindItemFwd(para, diRun);
+ }
+ else if (!editor->bEmulateVersion10) /* v4.1 */
+ {
+ if (para->nFlags & MEPF_ROWEND)
+ {
+ if (from == to)
+ {
+ para = para_next( para );
+ if (para->nFlags & MEPF_ROWSTART) para = para_next( para );
+ editor->pCursors[0].pPara = para_get_di( para );
+ editor->pCursors[0].pRun = run_get_di( para_first_run( para ) );
editor->pCursors[0].nOffset = 0;
editor->pCursors[1] = editor->pCursors[0];
}
}
- } else { /* v1.0 - 3.0 */
- if (ME_IsInTable(cursor.pRun) &&
+ }
+ else /* v1.0 - 3.0 */
+ {
+ if (para_in_table( para ) &&
cursor.pRun->member.run.nFlags & MERF_ENDPARA &&
from == to)
{
--
2.23.0
1
0
Nov. 1, 2020
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/appwiz.cpl/addons.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/dlls/appwiz.cpl/addons.c b/dlls/appwiz.cpl/addons.c
index dd53d9e282e..67d61ea0d22 100644
--- a/dlls/appwiz.cpl/addons.c
+++ b/dlls/appwiz.cpl/addons.c
@@ -598,21 +598,18 @@ static IInternetBindInfo InstallCallbackBindInfo = { &InstallCallbackBindInfoVtb
static void append_url_params( WCHAR *url )
{
- static const WCHAR arch_formatW[] = {'?','a','r','c','h','='};
- static const WCHAR v_formatW[] = {'&','v','='};
- static const WCHAR winevW[] = {'&','w','i','n','e','v','='};
DWORD size = INTERNET_MAX_URL_LENGTH * sizeof(WCHAR);
DWORD len = lstrlenW(url);
- memcpy(url+len, arch_formatW, sizeof(arch_formatW));
- len += ARRAY_SIZE(arch_formatW);
+ lstrcpyW(url+len, L"?arch=");
+ len += lstrlenW(L"?arch=");
len += MultiByteToWideChar(CP_ACP, 0, GECKO_ARCH, sizeof(GECKO_ARCH),
url+len, size/sizeof(WCHAR)-len)-1;
- memcpy(url+len, v_formatW, sizeof(v_formatW));
- len += ARRAY_SIZE(v_formatW);
+ lstrcpyW(url+len, L"&v=");
+ len += lstrlenW(L"&v=");
len += MultiByteToWideChar(CP_ACP, 0, addon->version, -1, url+len, size/sizeof(WCHAR)-len)-1;
- memcpy(url+len, winevW, sizeof(winevW));
- len += ARRAY_SIZE(winevW);
+ lstrcpyW(url+len, L"&winev=");
+ len += lstrlenW(L"&winev=");
MultiByteToWideChar(CP_ACP, 0, wine_get_version(), -1, url+len, size/sizeof(WCHAR)-len);
}
--
2.26.2
1
0
Nov. 1, 2020
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
---
dlls/appwiz.cpl/addons.c | 52 +++++++---------------
dlls/appwiz.cpl/appwiz.c | 96 +++++++++++++---------------------------
2 files changed, 48 insertions(+), 100 deletions(-)
diff --git a/dlls/appwiz.cpl/addons.c b/dlls/appwiz.cpl/addons.c
index 346411867c6..dd53d9e282e 100644
--- a/dlls/appwiz.cpl/addons.c
+++ b/dlls/appwiz.cpl/addons.c
@@ -109,14 +109,9 @@ static LPWSTR url = NULL;
static IBinding *dwl_binding;
static WCHAR *msi_file;
-static const WCHAR winehomedirW[] = {'W','I','N','E','H','O','M','E','D','I','R',0};
-static const WCHAR winedatadirW[] = {'W','I','N','E','D','A','T','A','D','I','R',0};
-static const WCHAR winebuilddirW[] = {'W','I','N','E','B','U','I','L','D','D','I','R',0};
-
extern const char * CDECL wine_get_version(void);
static WCHAR * (CDECL *p_wine_get_dos_file_name)(const char*);
-static const WCHAR kernel32_dllW[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0};
static BOOL sha_check(const WCHAR *file_name)
{
@@ -187,14 +182,11 @@ enum install_res {
static enum install_res install_file(const WCHAR *file_name)
{
- static const WCHAR update_cmd[] = {
- 'R','E','I','N','S','T','A','L','L','=','A','L','L',' ',
- 'R','E','I','N','S','T','A','L','L','M','O','D','E','=','v','o','m','u','s',0};
ULONG res;
res = MsiInstallProductW(file_name, NULL);
if(res == ERROR_PRODUCT_VERSION)
- res = MsiInstallProductW(file_name, update_cmd);
+ res = MsiInstallProductW(file_name, L"REINSTALL=ALL REINSTALLMODE=vomus");
if(res != ERROR_SUCCESS) {
ERR("MsiInstallProduct failed: %u\n", res);
return INSTALL_FAILED;
@@ -252,10 +244,8 @@ static HKEY open_config_key(void)
HKEY hkey, ret;
DWORD res;
- static const WCHAR wine_keyW[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e',0};
-
/* @@ Wine registry key: HKCU\Software\Wine\$config_key */
- res = RegOpenKeyW(HKEY_CURRENT_USER, wine_keyW, &hkey);
+ res = RegOpenKeyW(HKEY_CURRENT_USER, L"Software\\Wine", &hkey);
if(res != ERROR_SUCCESS)
return NULL;
@@ -298,19 +288,18 @@ static enum install_res install_from_registered_dir(void)
static enum install_res install_from_default_dir(void)
{
- static const WCHAR dotdotW[] = {'\\','.','.','\\',0};
const WCHAR *package_dir;
WCHAR *dir_buf = NULL;
enum install_res ret = INSTALL_NEXT;
- if ((package_dir = _wgetenv( winebuilddirW )))
+ if ((package_dir = _wgetenv( L"WINEBUILDDIR" )))
{
- dir_buf = heap_alloc( lstrlenW(package_dir) * sizeof(WCHAR) + sizeof(dotdotW));
+ dir_buf = heap_alloc( lstrlenW(package_dir) * sizeof(WCHAR) + sizeof(L"\\..\\") );
lstrcpyW( dir_buf, package_dir );
- lstrcatW( dir_buf, dotdotW );
+ lstrcatW( dir_buf, L"\\..\\" );
package_dir = dir_buf;
}
- else package_dir = _wgetenv( winedatadirW );
+ else package_dir = _wgetenv( L"WINEDATADIR" );
if (package_dir)
{
@@ -329,8 +318,6 @@ static enum install_res install_from_default_dir(void)
static WCHAR *get_cache_file_name(BOOL ensure_exists)
{
- static const WCHAR cacheW[] = {'\\','.','c','a','c','h','e',0};
- static const WCHAR wineW[] = {'\\','w','i','n','e',0};
const char *xdg_dir;
const WCHAR *home_dir;
WCHAR *cache_dir, *ret;
@@ -341,11 +328,11 @@ static WCHAR *get_cache_file_name(BOOL ensure_exists)
{
if (!(cache_dir = p_wine_get_dos_file_name( xdg_dir ))) return NULL;
}
- else if ((home_dir = _wgetenv( winehomedirW )))
+ else if ((home_dir = _wgetenv( L"WINEHOMEDIR" )))
{
- if (!(cache_dir = heap_alloc( lstrlenW(home_dir) * sizeof(WCHAR) + sizeof(cacheW) ))) return NULL;
+ if (!(cache_dir = heap_alloc( lstrlenW(home_dir) * sizeof(WCHAR) + sizeof(L"\\.cache") ))) return NULL;
lstrcpyW( cache_dir, home_dir );
- lstrcatW( cache_dir, cacheW );
+ lstrcatW( cache_dir, L"\\.cache" );
cache_dir[1] = '\\'; /* change \??\ into \\?\ */
}
else return NULL;
@@ -357,14 +344,14 @@ static WCHAR *get_cache_file_name(BOOL ensure_exists)
return NULL;
}
- size = lstrlenW( cache_dir ) + ARRAY_SIZE(wineW) + lstrlenW( addon->file_name ) + 1;
+ size = lstrlenW( cache_dir ) + ARRAY_SIZE(L"\\wine") + lstrlenW( addon->file_name ) + 1;
if (!(ret = heap_alloc( size * sizeof(WCHAR) )))
{
heap_free( cache_dir );
return NULL;
}
lstrcpyW( ret, cache_dir );
- lstrcatW( ret, wineW );
+ lstrcatW( ret, L"\\wine" );
heap_free( cache_dir );
if (ensure_exists && !CreateDirectoryW( ret, NULL ) && GetLastError() != ERROR_ALREADY_EXISTS)
@@ -583,18 +570,15 @@ static HRESULT WINAPI InstallCallbackBindInfo_GetBindInfo(IInternetBindInfo *ifa
static HRESULT WINAPI InstallCallbackBindInfo_GetBindString(IInternetBindInfo *iface, ULONG string_type,
WCHAR **strs, ULONG cnt, ULONG *fetched)
{
- static const WCHAR wine_addon_downloaderW[] =
- {'W','i','n','e',' ','A','d','d','o','n',' ','D','o','w','n','l','o','a','d','e','r',0};
-
switch(string_type) {
case BINDSTRING_USER_AGENT:
TRACE("BINDSTRING_USER_AGENT\n");
- *strs = CoTaskMemAlloc(sizeof(wine_addon_downloaderW));
+ *strs = CoTaskMemAlloc(sizeof(L"Wine Addon Downloader"));
if(!*strs)
return E_OUTOFMEMORY;
- memcpy(*strs, wine_addon_downloaderW, sizeof(wine_addon_downloaderW));
+ lstrcpyW(*strs, L"Wine Addon Downloader");
*fetched = 1;
return S_OK;
}
@@ -698,13 +682,11 @@ static void run_winebrowser(const WCHAR *url)
WCHAR *args;
BOOL ret;
- static const WCHAR winebrowserW[] = {'\\','w','i','n','e','b','r','o','w','s','e','r','.','e','x','e',0};
-
url_len = lstrlenW(url);
- len = GetSystemDirectoryW(app, MAX_PATH - ARRAY_SIZE(winebrowserW));
- memcpy(app+len, winebrowserW, sizeof(winebrowserW));
- len += ARRAY_SIZE(winebrowserW) - 1;
+ len = GetSystemDirectoryW(app, MAX_PATH - ARRAY_SIZE(L"\\winebrowser.exe"));
+ lstrcpyW(app+len, L"\\winebrowser.exe");
+ len += ARRAY_SIZE(L"\\winebrowser.exe") - 1;
args = heap_alloc((len+1+url_len)*sizeof(WCHAR));
if(!args)
@@ -771,7 +753,7 @@ BOOL install_addon(addon_t addon_type)
addon = addons_info+addon_type;
- p_wine_get_dos_file_name = (void*)GetProcAddress(GetModuleHandleW(kernel32_dllW), "wine_get_dos_file_name");
+ p_wine_get_dos_file_name = (void *)GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "wine_get_dos_file_name");
/*
* Try to find addon .msi file in following order:
diff --git a/dlls/appwiz.cpl/appwiz.c b/dlls/appwiz.cpl/appwiz.c
index b295e40b2f4..2bc108b63c6 100644
--- a/dlls/appwiz.cpl/appwiz.c
+++ b/dlls/appwiz.cpl/appwiz.c
@@ -80,32 +80,7 @@ HINSTANCE hInst;
static WCHAR btnRemove[MAX_STRING_LEN];
static WCHAR btnModifyRemove[MAX_STRING_LEN];
-static const WCHAR openW[] = {'o','p','e','n',0};
-
-/* names of registry keys */
-static const WCHAR BackSlashW[] = { '\\', 0 };
-static const WCHAR DisplayNameW[] = {'D','i','s','p','l','a','y','N','a','m','e',0};
-static const WCHAR DisplayIconW[] = {'D','i','s','p','l','a','y','I','c','o','n',0};
-static const WCHAR DisplayVersionW[] = {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
-static const WCHAR PublisherW[] = {'P','u','b','l','i','s','h','e','r',0};
-static const WCHAR ContactW[] = {'C','o','n','t','a','c','t',0};
-static const WCHAR HelpLinkW[] = {'H','e','l','p','L','i','n','k',0};
-static const WCHAR HelpTelephoneW[] = {'H','e','l','p','T','e','l','e','p','h','o','n','e',0};
-static const WCHAR ModifyPathW[] = {'M','o','d','i','f','y','P','a','t','h',0};
-static const WCHAR NoModifyW[] = {'N','o','M','o','d','i','f','y',0};
-static const WCHAR ReadmeW[] = {'R','e','a','d','m','e',0};
-static const WCHAR URLUpdateInfoW[] = {'U','R','L','U','p','d','a','t','e','I','n','f','o',0};
-static const WCHAR CommentsW[] = {'C','o','m','m','e','n','t','s',0};
-static const WCHAR UninstallCommandlineW[] = {'U','n','i','n','s','t','a','l','l','S','t','r','i','n','g',0};
-static const WCHAR WindowsInstallerW[] = {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0};
-static const WCHAR SystemComponentW[] = {'S','y','s','t','e','m','C','o','m','p','o','n','e','n','t',0};
-
-static const WCHAR PathUninstallW[] = {
- 'S','o','f','t','w','a','r','e','\\',
- 'M','i','c','r','o','s','o','f','t','\\',
- 'W','i','n','d','o','w','s','\\',
- 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
- 'U','n','i','n','s','t','a','l','l',0 };
+static const WCHAR PathUninstallW[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
/******************************************************************************
* Name : DllMain
@@ -184,7 +159,7 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
{
RegOpenKeyExW(root, subKeyName, 0, KEY_READ, &hkeyApp);
size = sizeof(value);
- if (!RegQueryValueExW(hkeyApp, SystemComponentW, NULL, &dwType, (LPBYTE)&value, &size)
+ if (!RegQueryValueExW(hkeyApp, L"SystemComponent", NULL, &dwType, (BYTE *)&value, &size)
&& dwType == REG_DWORD && value == 1)
{
RegCloseKey(hkeyApp);
@@ -193,22 +168,21 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
}
displen = 0;
uninstlen = 0;
- if (!RegQueryValueExW(hkeyApp, DisplayNameW, 0, 0, NULL, &displen))
+ if (!RegQueryValueExW(hkeyApp, L"DisplayName", 0, 0, NULL, &displen))
{
size = sizeof(value);
- if (!RegQueryValueExW(hkeyApp, WindowsInstallerW, NULL, &dwType, (LPBYTE)&value, &size)
+ if (!RegQueryValueExW(hkeyApp, L"WindowsInstaller", NULL, &dwType, (BYTE *)&value, &size)
&& dwType == REG_DWORD && value == 1)
{
- static const WCHAR fmtW[] = {'m','s','i','e','x','e','c',' ','/','x','%','s',0};
- int len = lstrlenW(fmtW) + lstrlenW(subKeyName);
+ int len = lstrlenW(L"msiexec /x%s") + lstrlenW(subKeyName);
if (!(command = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)))) goto err;
- wsprintfW(command, fmtW, subKeyName);
+ wsprintfW(command, L"msiexec /x%s", subKeyName);
}
- else if (!RegQueryValueExW(hkeyApp, UninstallCommandlineW, 0, 0, NULL, &uninstlen))
+ else if (!RegQueryValueExW(hkeyApp, L"UninstallString", 0, 0, NULL, &uninstlen))
{
if (!(command = HeapAlloc(GetProcessHeap(), 0, uninstlen))) goto err;
- RegQueryValueExW(hkeyApp, UninstallCommandlineW, 0, 0, (LPBYTE)command, &uninstlen);
+ RegQueryValueExW(hkeyApp, L"UninstallString", 0, 0, (BYTE *)command, &uninstlen);
}
else
{
@@ -225,12 +199,11 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
if (!info->title)
goto err;
- RegQueryValueExW(hkeyApp, DisplayNameW, 0, 0, (LPBYTE)info->title,
- &displen);
+ RegQueryValueExW(hkeyApp, L"DisplayName", 0, 0, (BYTE *)info->title, &displen);
/* now get DisplayIcon */
displen = 0;
- RegQueryValueExW(hkeyApp, DisplayIconW, 0, 0, NULL, &displen);
+ RegQueryValueExW(hkeyApp, L"DisplayIcon", 0, 0, NULL, &displen);
if (displen == 0)
info->icon = 0;
@@ -241,8 +214,7 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
if (!info->icon)
goto err;
- RegQueryValueExW(hkeyApp, DisplayIconW, 0, 0, (LPBYTE)info->icon,
- &displen);
+ RegQueryValueExW(hkeyApp, L"DisplayIcon", 0, 0, (BYTE *)info->icon, &displen);
/* separate the index from the icon name, if supplied */
iconPtr = wcschr(info->icon, ',');
@@ -254,21 +226,21 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
}
}
- info->publisher = get_reg_str(hkeyApp, PublisherW);
- info->version = get_reg_str(hkeyApp, DisplayVersionW);
- info->contact = get_reg_str(hkeyApp, ContactW);
- info->helplink = get_reg_str(hkeyApp, HelpLinkW);
- info->helptelephone = get_reg_str(hkeyApp, HelpTelephoneW);
- info->readme = get_reg_str(hkeyApp, ReadmeW);
- info->urlupdateinfo = get_reg_str(hkeyApp, URLUpdateInfoW);
- info->comments = get_reg_str(hkeyApp, CommentsW);
+ info->publisher = get_reg_str(hkeyApp, L"Publisher");
+ info->version = get_reg_str(hkeyApp, L"DisplayVersion");
+ info->contact = get_reg_str(hkeyApp, L"Contact");
+ info->helplink = get_reg_str(hkeyApp, L"HelpLink");
+ info->helptelephone = get_reg_str(hkeyApp, L"HelpTelephone");
+ info->readme = get_reg_str(hkeyApp, L"Readme");
+ info->urlupdateinfo = get_reg_str(hkeyApp, L"URLUpdateInfo");
+ info->comments = get_reg_str(hkeyApp, L"Comments");
/* Check if NoModify is set */
dwType = REG_DWORD;
dwNoModify = 0;
displen = sizeof(DWORD);
- if (RegQueryValueExW(hkeyApp, NoModifyW, NULL, &dwType, (LPBYTE)&dwNoModify, &displen)
+ if (RegQueryValueExW(hkeyApp, L"NoModify", NULL, &dwType, (BYTE *)&dwNoModify, &displen)
!= ERROR_SUCCESS)
{
dwNoModify = 0;
@@ -282,19 +254,18 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
if (!dwNoModify)
{
size = sizeof(value);
- if (!RegQueryValueExW(hkeyApp, WindowsInstallerW, NULL, &dwType, (LPBYTE)&value, &size)
+ if (!RegQueryValueExW(hkeyApp, L"WindowsInstaller", NULL, &dwType, (BYTE *)&value, &size)
&& dwType == REG_DWORD && value == 1)
{
- static const WCHAR fmtW[] = {'m','s','i','e','x','e','c',' ','/','i','%','s',0};
- int len = lstrlenW(fmtW) + lstrlenW(subKeyName);
+ int len = lstrlenW(L"msiexec /i%s") + lstrlenW(subKeyName);
if (!(info->path_modify = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)))) goto err;
- wsprintfW(info->path_modify, fmtW, subKeyName);
+ wsprintfW(info->path_modify, L"msiexec /i%s", subKeyName);
}
- else if (!RegQueryValueExW(hkeyApp, ModifyPathW, 0, 0, NULL, &displen))
+ else if (!RegQueryValueExW(hkeyApp, L"ModifyPath", 0, 0, NULL, &displen))
{
if (!(info->path_modify = HeapAlloc(GetProcessHeap(), 0, displen))) goto err;
- RegQueryValueExW(hkeyApp, ModifyPathW, 0, 0, (LPBYTE)info->path_modify, &displen);
+ RegQueryValueExW(hkeyApp, L"ModifyPath", 0, 0, (BYTE *)info->path_modify, &displen);
}
}
@@ -440,8 +411,6 @@ static void UpdateButtons(HWND hWnd)
*/
static void InstallProgram(HWND hWnd)
{
- static const WCHAR filters[] = {'%','s','%','c','*','i','n','s','t','a','l','*','.','e','x','e',';','*','s','e','t','u','p','*','.','e','x','e',';','*','.','m','s','i','%','c','%','s','%','c','*','.','e','x','e','%','c','%','s','%','c','*','.','*','%','c',0}
-;
OPENFILENAMEW ofn;
WCHAR titleW[MAX_STRING_LEN];
WCHAR filter_installs[MAX_STRING_LEN];
@@ -455,8 +424,8 @@ static void InstallProgram(HWND hWnd)
LoadStringW(hInst, IDS_FILTER_PROGRAMS, filter_programs, ARRAY_SIZE(filter_programs));
LoadStringW(hInst, IDS_FILTER_ALL, filter_all, ARRAY_SIZE(filter_all));
- swprintf( FilterBufferW, MAX_PATH, filters, filter_installs, 0, 0,
- filter_programs, 0, 0, filter_all, 0, 0 );
+ swprintf( FilterBufferW, MAX_PATH, L"%s%c*instal*.exe;*setup*.exe;*.msi%c%s%c*.exe%c%s%c*.*%c",
+ filter_installs, 0, 0, filter_programs, 0, 0, filter_all, 0, 0 );
memset(&ofn, 0, sizeof(OPENFILENAMEW));
ofn.lStructSize = sizeof(OPENFILENAMEW);
ofn.hwndOwner = hWnd;
@@ -476,7 +445,7 @@ static void InstallProgram(HWND hWnd)
SHELLEXECUTEINFOW sei;
memset(&sei, 0, sizeof(sei));
sei.cbSize = sizeof(sei);
- sei.lpVerb = openW;
+ sei.lpVerb = L"open";
sei.nShow = SW_SHOWDEFAULT;
sei.fMask = 0;
sei.lpFile = ofn.lpstrFile;
@@ -609,7 +578,7 @@ static INT_PTR CALLBACK SupportInfoDlgProc(HWND hWnd, UINT msg, WPARAM wParam, L
if (iter->id == (int) lParam)
{
lstrcpyW(key, PathUninstallW);
- lstrcatW(key, BackSlashW);
+ lstrcatW(key, L"\\");
lstrcatW(key, iter->regkey);
/* check the application's registry entries */
@@ -959,18 +928,15 @@ static void StartApplet(HWND hWnd)
static LONG start_params(const WCHAR *params)
{
- static const WCHAR install_geckoW[] = {'i','n','s','t','a','l','l','_','g','e','c','k','o',0};
- static const WCHAR install_monoW[] = {'i','n','s','t','a','l','l','_','m','o','n','o',0};
-
if(!params)
return FALSE;
- if(!wcscmp(params, install_geckoW)) {
+ if(!wcscmp(params, L"install_gecko")) {
install_addon(ADDON_GECKO);
return TRUE;
}
- if(!wcscmp(params, install_monoW)) {
+ if(!wcscmp(params, L"install_mono")) {
install_addon(ADDON_MONO);
return TRUE;
}
--
2.26.2
1
0
Nov. 1, 2020
As Nikolay Sivov incidentally noted in
https://bugs.winehq.org/show_bug.cgi?id=23726#c29
the IPersistStreamInit interface on IFont "is not supported
on anything newer and including XP." It is a E_NOINTERFACE
on 95, 98, Me and NT4 as well. It never existed on any
version of Windows, and we never should have had it either.
It was added in error by commit
d0372b4e6ea420eadcdfcb93f3d0706284adbb69.
Signed-off-by: Damjan Jovanovic <damjan.jov(a)gmail.com>
---
dlls/oleaut32/olefont.c | 91 -----------------------------------
dlls/oleaut32/tests/olefont.c | 5 ++
2 files changed, 5 insertions(+), 91 deletions(-)
1
0
Signed-off-by: Will Mainio <will.mainio(a)fastmail.com>
---
dlls/msvcrt/scanf.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 3b4686c1107..44cb0faa87e 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -615,6 +615,7 @@ _FUNCTION_ {
_CHAR_ *sptr = str;
RTL_BITMAP bitMask;
ULONG *Mask;
+ VOID *scansetLastRangeEnd;
int invert = 0; /* Set if we are NOT to find the chars */
#ifdef SECURE
unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
@@ -636,15 +637,17 @@ _FUNCTION_ {
RtlSetBits(&bitMask, ']', 1);
format++;
}
+ scansetLastRangeEnd = (VOID *)(format - 1);
while(*format && (*format != ']')) {
/* According to msdn:
* "Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]." */
- if((*format == '-') && (*(format + 1) != ']')) {
+ if((*format == '-') && ((VOID *)(format - 1) > scansetLastRangeEnd) && (*(format + 1) != ']')) {
if ((*(format - 1)) < *(format + 1))
RtlSetBits(&bitMask, *(format - 1) +1 , *(format + 1) - *(format - 1));
else
RtlSetBits(&bitMask, *(format + 1) , *(format - 1) - *(format + 1));
format++;
+ scansetLastRangeEnd = (VOID *)format;
} else
RtlSetBits(&bitMask, *format, 1);
format++;
--
2.28.0
1
1
[PATCH 3/3] msado15: Implement ADORecordsetConstruction get/put Rowset
by Alistair Leslie-Hughes Oct. 31, 2020
by Alistair Leslie-Hughes Oct. 31, 2020
Oct. 31, 2020
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msado15/recordset.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index 5ad593dce5c..2a4c23055a8 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -46,6 +46,7 @@ struct recordset
VARIANT *data;
CursorLocationEnum cursor_location;
CursorTypeEnum cursor_type;
+ IUnknown *row_set;
};
struct fields
@@ -757,6 +758,8 @@ static void close_recordset( struct recordset *recordset )
{
ULONG row, col, col_count;
+ if (recordset->row_set) IUnknown_Release(recordset->row_set);
+
if (!recordset->fields) return;
col_count = get_column_count( recordset );
@@ -1611,15 +1614,26 @@ static HRESULT WINAPI rsconstruction_Invoke(ADORecordsetConstruction *iface, DIS
static HRESULT WINAPI rsconstruction_get_Rowset(ADORecordsetConstruction *iface, IUnknown **row_set)
{
struct recordset *recordset = impl_from_ADORecordsetConstruction( iface );
- FIXME("%p, %p\n", recordset, row_set);
- return E_NOTIMPL;
+
+ TRACE("%p, %p\n", recordset, row_set);
+
+ *row_set = recordset->row_set;
+ if (recordset->row_set) IUnknown_AddRef(recordset->row_set);
+
+ return S_OK;
}
static HRESULT WINAPI rsconstruction_put_Rowset(ADORecordsetConstruction *iface, IUnknown *row_set)
{
struct recordset *recordset = impl_from_ADORecordsetConstruction( iface );
- FIXME("%p, %p\n", recordset, row_set);
- return E_NOTIMPL;
+
+ TRACE("%p, %p\n", recordset, row_set);
+
+ if (recordset->row_set) IUnknown_Release(recordset->row_set);
+ recordset->row_set = row_set;
+ if (recordset->row_set) IUnknown_AddRef(recordset->row_set);
+
+ return S_OK;
}
static HRESULT WINAPI rsconstruction_get_Chapter(ADORecordsetConstruction *iface, LONG *chapter)
@@ -1679,6 +1693,7 @@ HRESULT Recordset_create( void **obj )
recordset->index = -1;
recordset->cursor_location = adUseServer;
recordset->cursor_type = adOpenForwardOnly;
+ recordset->row_set = NULL;
*obj = &recordset->Recordset_iface;
TRACE( "returning iface %p\n", *obj );
--
2.28.0
2
2
2
1
Oct. 30, 2020
Signed-off-by: Derek Lesho <dlesho(a)codeweavers.com>
---
v9:
- Fixed sometimes issuing MEEndOfStream while responding to the last sample request.
- Add test for the previous fix.
- Add workaround in mfreadwrite tests to deal with gstreamer audio sample sizes from .wav files differing from those on windows.
---
dlls/mfplat/tests/mfplat.c | 19 +++++--
dlls/mfreadwrite/tests/mfplat.c | 16 +++++-
dlls/winegstreamer/gst_private.h | 1 +
dlls/winegstreamer/media_source.c | 94 ++++++++++++++++++++++++++++++-
dlls/winegstreamer/mfplat.c | 69 +++++++++++++++++++++++
5 files changed, 191 insertions(+), 8 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index a080035e477..b084cb29ab2 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -615,19 +615,15 @@ todo_wine
get_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL);
sample_count = 10;
- /* Request one beyond EOS, otherwise EndOfStream isn't queued. */
- for (i = 0; i <= sample_count; ++i)
+ for (i = 0; i < sample_count; ++i)
{
hr = IMFMediaStream_RequestSample(video_stream, NULL);
if (i == sample_count)
break;
-todo_wine
ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr);
if (hr != S_OK)
break;
}
- if (FAILED(hr))
- goto skip_source_tests;
for (i = 0; i < sample_count; ++i)
{
@@ -661,14 +657,25 @@ todo_wine
}
if (i == sample_count)
+ {
+ IMFMediaEvent *event;
+
+ /* MEEndOfStream isn't queued until after a one request beyond the last frame is submitted */
+ Sleep(100);
+ hr = IMFMediaEventGenerator_GetEvent((IMFMediaEventGenerator *)video_stream, MF_EVENT_FLAG_NO_WAIT, &event);
+ ok (hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaStream_RequestSample(video_stream, NULL);
+ ok (hr == S_OK || hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr);
get_event((IMFMediaEventGenerator *)video_stream, MEEndOfStream, NULL);
+ }
+
hr = IMFMediaStream_RequestSample(video_stream, NULL);
ok(hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr);
get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
-skip_source_tests:
IMFMediaStream_Release(video_stream);
IMFMediaTypeHandler_Release(handler);
IMFPresentationDescriptor_Release(descriptor);
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c
index 0e5053f905f..ef25bbcb3eb 100644
--- a/dlls/mfreadwrite/tests/mfplat.c
+++ b/dlls/mfreadwrite/tests/mfplat.c
@@ -727,7 +727,6 @@ static void test_source_reader(void)
hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, &actual_index, &stream_flags,
×tamp, &sample);
-todo_wine
ok(hr == S_OK, "Failed to get a sample, hr %#x.\n", hr);
if (hr != S_OK)
goto skip_read_sample;
@@ -753,8 +752,23 @@ todo_wine
×tamp, &sample);
ok(hr == S_OK, "Failed to get a sample, hr %#x.\n", hr);
ok(actual_index == 0, "Unexpected stream index %u\n", actual_index);
+ /* TODO: gstreamer outputs .wav sample in increments of 4096, instead of 4410 */
+todo_wine
+{
ok(stream_flags == MF_SOURCE_READERF_ENDOFSTREAM, "Unexpected stream flags %#x.\n", stream_flags);
ok(!sample, "Unexpected sample object.\n");
+}
+ if(!stream_flags)
+ {
+ IMFSample_Release(sample);
+
+ hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, 0, &actual_index, &stream_flags,
+ ×tamp, &sample);
+ ok(hr == S_OK, "Failed to get a sample, hr %#x.\n", hr);
+ ok(actual_index == 0, "Unexpected stream index %u\n", actual_index);
+ ok(stream_flags == MF_SOURCE_READERF_ENDOFSTREAM, "Unexpected stream flags %#x.\n", stream_flags);
+ ok(!sample, "Unexpected sample object.\n");
+ }
hr = IMFSourceReader_ReadSample(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, MF_SOURCE_READER_CONTROLF_DRAIN,
&actual_index, &stream_flags, ×tamp, &sample);
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 3a8020b6760..28e424439d8 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -80,6 +80,7 @@ extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj)
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj) DECLSPEC_HIDDEN;
IMFMediaType *mf_media_type_from_caps(const GstCaps *caps) DECLSPEC_HIDDEN;
GstCaps *caps_from_mf_media_type(IMFMediaType *type) DECLSPEC_HIDDEN;
+IMFSample *mf_sample_from_gst_buffer(GstBuffer *in) DECLSPEC_HIDDEN;
HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj) DECLSPEC_HIDDEN;
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 9c6e7bfd539..dbc656a24da 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -58,11 +58,13 @@ struct media_stream
STREAM_RUNNING,
} state;
DWORD stream_id;
+ BOOL eos;
};
enum source_async_op
{
SOURCE_ASYNC_START,
+ SOURCE_ASYNC_REQUEST_SAMPLE,
};
struct source_async_command
@@ -78,6 +80,11 @@ struct source_async_command
GUID format;
PROPVARIANT position;
} start;
+ struct
+ {
+ struct media_stream *stream;
+ IUnknown *token;
+ } request_sample;
} u;
};
@@ -311,6 +318,8 @@ static void start_pipeline(struct media_source *source, struct source_async_comm
GST_SEEK_TYPE_SET, position->u.hVal.QuadPart / 100, GST_SEEK_TYPE_NONE, 0);
gst_pad_push_event(stream->my_sink, seek_event);
+
+ stream->eos = FALSE;
}
if (selected)
@@ -334,6 +343,61 @@ static void start_pipeline(struct media_source *source, struct source_async_comm
gst_element_set_state(source->container, GST_STATE_PLAYING);
}
+static void dispatch_end_of_presentation(struct media_source *source)
+{
+ PROPVARIANT empty = {.vt = VT_EMPTY};
+ unsigned int i;
+
+ /* A stream has ended, check whether all have */
+ for (i = 0; i < source->stream_count; i++)
+ {
+ struct media_stream *stream = source->streams[i];
+
+ if (stream->state != STREAM_INACTIVE && !stream->eos)
+ return;
+ }
+
+ IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MEEndOfPresentation, &GUID_NULL, S_OK, &empty);
+}
+
+static void wait_on_sample(struct media_stream *stream, IUnknown *token)
+{
+ PROPVARIANT empty_var = {.vt = VT_EMPTY};
+ GstSample *gst_sample;
+ GstBuffer *buffer;
+ IMFSample *sample;
+
+ TRACE("%p, %p\n", stream, token);
+
+ g_signal_emit_by_name(stream->appsink, "pull-sample", &gst_sample);
+ if (gst_sample)
+ {
+ buffer = gst_sample_get_buffer(gst_sample);
+
+ TRACE("PTS = %llu\n", (unsigned long long int) GST_BUFFER_PTS(buffer));
+
+ sample = mf_sample_from_gst_buffer(buffer);
+ gst_sample_unref(gst_sample);
+
+ if (token)
+ IMFSample_SetUnknown(sample, &MFSampleExtension_Token, token);
+
+ IMFMediaEventQueue_QueueEventParamUnk(stream->event_queue, MEMediaSample, &GUID_NULL, S_OK, (IUnknown *)sample);
+ IMFSample_Release(sample);
+ }
+ else
+ {
+ g_object_get(stream->appsink, "eos", &stream->eos, NULL);
+ if (stream->eos)
+ {
+ if (token)
+ IUnknown_Release(token);
+ IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEEndOfStream, &GUID_NULL, S_OK, &empty_var);
+ dispatch_end_of_presentation(stream->parent_source);
+ }
+ }
+}
+
static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
{
struct media_source *source = impl_from_async_commands_callback_IMFAsyncCallback(iface);
@@ -353,6 +417,9 @@ static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFA
case SOURCE_ASYNC_START:
start_pipeline(source, command);
break;
+ case SOURCE_ASYNC_REQUEST_SAMPLE:
+ wait_on_sample(command->u.request_sample.stream, command->u.request_sample.token);
+ break;
}
IUnknown_Release(state);
@@ -640,13 +707,37 @@ static HRESULT WINAPI media_stream_GetStreamDescriptor(IMFMediaStream* iface, IM
static HRESULT WINAPI media_stream_RequestSample(IMFMediaStream *iface, IUnknown *token)
{
struct media_stream *stream = impl_from_IMFMediaStream(iface);
+ struct source_async_command *command;
+ HRESULT hr;
TRACE("(%p)->(%p)\n", iface, token);
if (stream->state == STREAM_SHUTDOWN)
return MF_E_SHUTDOWN;
- return E_NOTIMPL;
+ if (stream->state == STREAM_INACTIVE)
+ {
+ WARN("Stream isn't active\n");
+ return MF_E_MEDIA_SOURCE_WRONGSTATE;
+ }
+
+ if (stream->eos)
+ {
+ return MF_E_END_OF_STREAM;
+ }
+
+ if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_REQUEST_SAMPLE, &command)))
+ {
+ command->u.request_sample.stream = stream;
+ if (token)
+ IUnknown_AddRef(token);
+ command->u.request_sample.token = token;
+
+ /* Once pause support is added, this will need to put into a stream queue, and synchronization will need to be added*/
+ hr = MFPutWorkItem(stream->parent_source->async_commands_queue, &stream->parent_source->async_commands_callback, &command->IUnknown_iface);
+ }
+
+ return hr;
}
static const IMFMediaStreamVtbl media_stream_vtbl =
@@ -729,6 +820,7 @@ static HRESULT new_media_stream(struct media_source *source, GstPad *pad, DWORD
object->stream_id = stream_id;
object->state = STREAM_INACTIVE;
+ object->eos = FALSE;
if (FAILED(hr = MFCreateEventQueue(&object->event_queue)))
goto fail;
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index d0071cae438..3d224a5accc 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -731,3 +731,72 @@ GstCaps *caps_from_mf_media_type(IMFMediaType *type)
FIXME("Unrecognized major type %s\n", debugstr_guid(&major_type));
return NULL;
}
+
+/* IMFSample = GstBuffer
+ IMFBuffer = GstMemory */
+
+/* TODO: Future optimization could be to create a custom
+ IMFMediaBuffer wrapper around GstMemory, and to utilize
+ gst_memory_new_wrapped on IMFMediaBuffer data. However,
+ this wouldn't work if we allow the callers to allocate
+ the buffers. */
+
+IMFSample* mf_sample_from_gst_buffer(GstBuffer *gst_buffer)
+{
+ IMFMediaBuffer *mf_buffer = NULL;
+ GstMapInfo map_info = {0};
+ LONGLONG duration, time;
+ BYTE *mapped_buf = NULL;
+ IMFSample *out = NULL;
+ HRESULT hr;
+
+ if (FAILED(hr = MFCreateSample(&out)))
+ goto done;
+
+ duration = GST_BUFFER_DURATION(gst_buffer);
+ time = GST_BUFFER_PTS(gst_buffer);
+
+ if (FAILED(hr = IMFSample_SetSampleDuration(out, duration / 100)))
+ goto done;
+
+ if (FAILED(hr = IMFSample_SetSampleTime(out, time / 100)))
+ goto done;
+
+ if (!gst_buffer_map(gst_buffer, &map_info, GST_MAP_READ))
+ {
+ hr = E_FAIL;
+ goto done;
+ }
+
+ if (FAILED(hr = MFCreateMemoryBuffer(map_info.maxsize, &mf_buffer)))
+ goto done;
+
+ if (FAILED(hr = IMFMediaBuffer_Lock(mf_buffer, &mapped_buf, NULL, NULL)))
+ goto done;
+
+ memcpy(mapped_buf, map_info.data, map_info.size);
+
+ if (FAILED(hr = IMFMediaBuffer_Unlock(mf_buffer)))
+ goto done;
+
+ if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(mf_buffer, map_info.size)))
+ goto done;
+
+ if (FAILED(hr = IMFSample_AddBuffer(out, mf_buffer)))
+ goto done;
+
+done:
+ if (mf_buffer)
+ IMFMediaBuffer_Release(mf_buffer);
+ if (map_info.data)
+ gst_buffer_unmap(gst_buffer, &map_info);
+ if (FAILED(hr))
+ {
+ ERR("Failed to copy IMFSample to GstBuffer, hr = %#x\n", hr);
+ if (out)
+ IMFSample_Release(out);
+ out = NULL;
+ }
+
+ return out;
+}
--
2.28.0
2
1
[PATCH v2 7/7] wined3d: Restore display modes for all outputs when doing mode restoration.
by Zhiyi Zhang Oct. 30, 2020
by Zhiyi Zhang Oct. 30, 2020
Oct. 30, 2020
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/d3d8/tests/device.c | 30 ++++++-------
dlls/d3d9/tests/device.c | 30 ++++++-------
dlls/ddraw/ddraw.c | 2 +-
dlls/ddraw/tests/ddraw1.c | 10 ++---
dlls/ddraw/tests/ddraw2.c | 10 ++---
dlls/ddraw/tests/ddraw4.c | 10 ++---
dlls/ddraw/tests/ddraw7.c | 10 ++---
dlls/dxgi/tests/dxgi.c | 14 +++---
dlls/wined3d/directx.c | 93 +++++++++++++++++++++++++--------------
dlls/wined3d/swapchain.c | 55 +++++++++++++----------
dlls/wined3d/wined3d.spec | 1 +
include/wine/wined3d.h | 1 +
12 files changed, 151 insertions(+), 115 deletions(-)
diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index 8d33026d6e5..45cf0f20eda 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -4326,7 +4326,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
ok(ret, "Failed to get display mode.\n");
- todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
+ ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
&& devmode.dmPelsHeight == registry_mode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n",
registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, devmode.dmPelsWidth, devmode.dmPelsHeight);
@@ -4399,7 +4399,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -4434,7 +4434,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -4517,15 +4517,15 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+ ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
old_devmode.dmPelsWidth, d3ddm.Width);
- todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+ ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
old_devmode.dmPelsHeight, d3ddm.Height);
refcount = IDirect3DDevice8_Release(device);
@@ -4550,15 +4550,15 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+ ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
old_devmode.dmPelsWidth, d3ddm.Width);
- todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+ ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
old_devmode.dmPelsHeight, d3ddm.Height);
ret = restore_display_modes(original_modes, display_count);
ok(ret, "Failed to restore display modes.\n");
@@ -4576,7 +4576,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4586,7 +4586,7 @@ static void test_mode_change(void)
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
+ ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
d3ddm.Width, d3ddm.Height);
ret = restore_display_modes(original_modes, display_count);
@@ -4613,13 +4613,13 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+ ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
@@ -4645,13 +4645,13 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+ ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index 3f18678291e..2791e91a068 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -5413,7 +5413,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
ok(ret, "Failed to get display mode.\n");
- todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
+ ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
&& devmode.dmPelsHeight == registry_mode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n",
registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, devmode.dmPelsWidth, devmode.dmPelsHeight);
@@ -5486,7 +5486,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -5521,7 +5521,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -5604,15 +5604,15 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+ ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
old_devmode.dmPelsWidth, d3ddm.Width);
- todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+ ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
old_devmode.dmPelsHeight, d3ddm.Height);
refcount = IDirect3DDevice9_Release(device);
@@ -5637,15 +5637,15 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+ ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
old_devmode.dmPelsWidth, d3ddm.Width);
- todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+ ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
old_devmode.dmPelsHeight, d3ddm.Height);
ret = restore_display_modes(original_modes, display_count);
ok(ret, "Failed to restore display modes.\n");
@@ -5663,7 +5663,7 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -5673,7 +5673,7 @@ static void test_mode_change(void)
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
+ ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
d3ddm.Width, d3ddm.Height);
ret = restore_display_modes(original_modes, display_count);
@@ -5700,13 +5700,13 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+ ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
@@ -5732,13 +5732,13 @@ static void test_mode_change(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
- todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+ ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 11a16f8d535..f78d344c085 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -698,7 +698,7 @@ static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
return DDERR_NOEXCLUSIVEMODE;
}
- if (SUCCEEDED(hr = wined3d_output_set_display_mode(ddraw->wined3d_output, NULL)))
+ if (SUCCEEDED(hr = wined3d_restore_display_modes(ddraw->wined3d)))
{
ddraw->flags &= ~DDRAW_RESTORE_MODE;
if (ddraw->cooperative_level & DDSCL_EXCLUSIVE &&
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 783c1b961a0..e1a315f291f 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -3784,7 +3784,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3805,7 +3805,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3830,7 +3830,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -3860,7 +3860,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3891,7 +3891,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 23d3e0c1f02..849d510a349 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -3944,7 +3944,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3965,7 +3965,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3990,7 +3990,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4020,7 +4020,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4051,7 +4051,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 12cfbc3784f..56a4777add5 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -4172,7 +4172,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4193,7 +4193,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4218,7 +4218,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4248,7 +4248,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4279,7 +4279,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index c214cbc221e..c9ba50287be 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -3819,7 +3819,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3840,7 +3840,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3865,7 +3865,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -3895,7 +3895,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3926,7 +3926,7 @@ static void test_coop_level_mode_set_multi(void)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 4d9677b3762..e6c8e0eb8c4 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -7097,7 +7097,7 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -7196,16 +7196,16 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+ ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
hr = IDXGIOutput_GetDesc(second_output, &output_desc);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
- todo_wine ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
+ ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
old_devmode.dmPelsWidth, "Expected width %u, got %u.\n", old_devmode.dmPelsWidth,
output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left);
- todo_wine ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
+ ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
old_devmode.dmPelsHeight, "Expected height %u, got %u.\n", old_devmode.dmPelsHeight,
output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top);
@@ -7228,7 +7228,7 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
- todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+ ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
"Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -7238,10 +7238,10 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
devmode2.dmPelsWidth, devmode2.dmPelsHeight);
hr = IDXGIOutput_GetDesc(second_output, &output_desc);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
- todo_wine ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
+ ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
devmode.dmPelsWidth, "Expected width %u, got %u.\n", devmode.dmPelsWidth,
output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left);
- todo_wine ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
+ ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
devmode.dmPelsHeight, "Expected height %u, got %u.\n", devmode.dmPelsHeight,
output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index c11fa22cc38..aa257de44ee 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1320,54 +1320,79 @@ HRESULT CDECL wined3d_output_get_display_mode(const struct wined3d_output *outpu
return WINED3D_OK;
}
+HRESULT CDECL wined3d_restore_display_modes(struct wined3d *wined3d)
+{
+ unsigned int adapter_idx, output_idx;
+ struct wined3d_adapter *adapter;
+ struct wined3d_output *output;
+ DEVMODEW devmode;
+ LONG ret;
+
+ TRACE("wined3d %p.\n", wined3d);
+
+ ret = ChangeDisplaySettingsExW(NULL, NULL, NULL, 0, NULL);
+ if (ret != DISP_CHANGE_SUCCESSFUL)
+ {
+ ERR("Failed to restore all outputs to their registry display settings, error %d.\n", ret);
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ memset(&devmode, 0, sizeof(devmode));
+ devmode.dmSize = sizeof(devmode);
+ for (adapter_idx = 0; adapter_idx < wined3d->adapter_count; ++adapter_idx)
+ {
+ adapter = wined3d->adapters[adapter_idx];
+ for (output_idx = 0; output_idx < adapter->output_count; ++output_idx)
+ {
+ output = &adapter->outputs[output_idx];
+
+ if (!EnumDisplaySettingsExW(output->device_name, ENUM_CURRENT_SETTINGS, &devmode, 0))
+ {
+ ERR("Failed to read the current display mode for %s.\n",
+ wine_dbgstr_w(output->device_name));
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ output->screen_format = pixelformat_for_depth(devmode.dmBitsPerPel);
+ }
+ }
+
+ return WINED3D_OK;
+}
+
HRESULT CDECL wined3d_output_set_display_mode(struct wined3d_output *output,
const struct wined3d_display_mode *mode)
{
+ enum wined3d_format_id new_format_id;
+ const struct wined3d_format *format;
DEVMODEW new_mode, current_mode;
LONG ret;
- enum wined3d_format_id new_format_id;
TRACE("output %p, mode %p.\n", output, mode);
+ TRACE("mode %ux%u@%u %s %#x.\n", mode->width, mode->height, mode->refresh_rate,
+ debug_d3dformat(mode->format_id), mode->scanline_ordering);
memset(&new_mode, 0, sizeof(new_mode));
new_mode.dmSize = sizeof(new_mode);
memset(¤t_mode, 0, sizeof(current_mode));
current_mode.dmSize = sizeof(current_mode);
- if (mode)
+
+ format = wined3d_get_format(output->adapter, mode->format_id, WINED3D_BIND_RENDER_TARGET);
+
+ new_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ new_mode.dmBitsPerPel = format->byte_count * CHAR_BIT;
+ new_mode.dmPelsWidth = mode->width;
+ new_mode.dmPelsHeight = mode->height;
+ new_mode.dmDisplayFrequency = mode->refresh_rate;
+ if (mode->refresh_rate)
+ new_mode.dmFields |= DM_DISPLAYFREQUENCY;
+ if (mode->scanline_ordering != WINED3D_SCANLINE_ORDERING_UNKNOWN)
{
- const struct wined3d_format *format;
-
- TRACE("mode %ux%u@%u %s %#x.\n", mode->width, mode->height, mode->refresh_rate,
- debug_d3dformat(mode->format_id), mode->scanline_ordering);
-
- format = wined3d_get_format(output->adapter, mode->format_id, WINED3D_BIND_RENDER_TARGET);
-
- new_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
- new_mode.dmBitsPerPel = format->byte_count * CHAR_BIT;
- new_mode.dmPelsWidth = mode->width;
- new_mode.dmPelsHeight = mode->height;
-
- new_mode.dmDisplayFrequency = mode->refresh_rate;
- if (mode->refresh_rate)
- new_mode.dmFields |= DM_DISPLAYFREQUENCY;
-
- if (mode->scanline_ordering != WINED3D_SCANLINE_ORDERING_UNKNOWN)
- {
- new_mode.dmFields |= DM_DISPLAYFLAGS;
- if (mode->scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED)
- new_mode.u2.dmDisplayFlags |= DM_INTERLACED;
- }
- new_format_id = mode->format_id;
- }
- else
- {
- if (!EnumDisplaySettingsW(output->device_name, ENUM_REGISTRY_SETTINGS, &new_mode))
- {
- ERR("Failed to read mode from registry.\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- new_format_id = pixelformat_for_depth(new_mode.dmBitsPerPel);
+ new_mode.dmFields |= DM_DISPLAYFLAGS;
+ if (mode->scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED)
+ new_mode.u2.dmDisplayFlags |= DM_INTERLACED;
}
+ new_format_id = mode->format_id;
/* Only change the mode if necessary. */
if (!EnumDisplaySettingsW(output->device_name, ENUM_CURRENT_SETTINGS, ¤t_mode))
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 847907c6d4c..7e46e5c6150 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -28,8 +28,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
{
- struct wined3d_output *output;
- HRESULT hr = E_FAIL;
+ HRESULT hr;
UINT i;
TRACE("Destroying swapchain %p.\n", swapchain);
@@ -71,9 +70,7 @@ void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
{
if (swapchain->state.desc.auto_restore_display_mode)
{
- output = wined3d_swapchain_get_output(swapchain);
- if (!output || FAILED(hr = wined3d_output_set_display_mode(output,
- &swapchain->state.original_mode)))
+ if (FAILED(hr = wined3d_restore_display_modes(swapchain->device->wined3d)))
ERR("Failed to restore display mode, hr %#x.\n", hr);
if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
@@ -1543,8 +1540,7 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc
err:
if (displaymode_set)
{
- if (FAILED(wined3d_output_set_display_mode(desc->output,
- &swapchain->state.original_mode)))
+ if (FAILED(wined3d_restore_display_modes(device->wined3d)))
ERR("Failed to restore display mode.\n");
}
@@ -1791,13 +1787,6 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
if (!(focus_messages = device->wined3d->flags & WINED3D_FOCUS_MESSAGES))
filter = wined3d_filter_messages(window, TRUE);
- output = wined3d_swapchain_get_output(swapchain);
- if (!output)
- {
- ERR("Failed to get output from swapchain %p.\n", swapchain);
- return;
- }
-
if (activate)
{
SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
@@ -1813,6 +1802,13 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
*
* Guild Wars 1 wants a WINDOWPOSCHANGED message on the device window to
* resume drawing after a focus loss. */
+ output = wined3d_swapchain_get_output(swapchain);
+ if (!output)
+ {
+ ERR("Failed to get output from swapchain %p.\n", swapchain);
+ return;
+ }
+
if (SUCCEEDED(hr = wined3d_output_get_desc(output, &output_desc)))
SetWindowPos(window, NULL, output_desc.desktop_rect.left,
output_desc.desktop_rect.top, swapchain->state.desc.backbuffer_width,
@@ -1823,6 +1819,13 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE)
{
+ output = wined3d_swapchain_get_output(swapchain);
+ if (!output)
+ {
+ ERR("Failed to get output from swapchain %p.\n", swapchain);
+ return;
+ }
+
if (FAILED(hr = wined3d_output_set_display_mode(output,
&swapchain->state.d3d_mode)))
ERR("Failed to set display mode, hr %#x.\n", hr);
@@ -1839,8 +1842,8 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
device->restore_screensaver = FALSE;
}
- if (FAILED(hr = wined3d_output_set_display_mode(output, NULL)))
- ERR("Failed to set display mode, hr %#x.\n", hr);
+ if (FAILED(hr = wined3d_restore_display_modes(device->wined3d)))
+ ERR("Failed to restore display modes, hr %#x.\n", hr);
swapchain->reapply_mode = TRUE;
@@ -1974,9 +1977,9 @@ static HRESULT wined3d_swapchain_state_set_display_mode(struct wined3d_swapchain
if (output != state->desc.output)
{
- if (FAILED(hr = wined3d_output_set_display_mode(state->desc.output, &state->original_mode)))
+ if (FAILED(hr = wined3d_restore_display_modes(state->wined3d)))
{
- WARN("Failed to set display mode, hr %#x.\n", hr);
+ WARN("Failed to restore display modes, hr %#x.\n", hr);
return hr;
}
@@ -2199,6 +2202,9 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st
if (mode)
{
actual_mode = *mode;
+ if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
+ &actual_mode)))
+ return hr;
}
else
{
@@ -2210,16 +2216,19 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st
actual_mode.format_id = adapter_format_from_backbuffer_format(swapchain_desc->output->adapter,
swapchain_desc->backbuffer_format);
actual_mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
+ if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
+ &actual_mode)))
+ return hr;
}
else
{
- actual_mode = state->original_mode;
+ if (FAILED(hr = wined3d_restore_display_modes(state->wined3d)))
+ {
+ WARN("Failed to restore display modes for all outputs, hr %#x.\n", hr);
+ return hr;
+ }
}
}
-
- if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
- &actual_mode)))
- return hr;
}
else
{
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index e4ff1161bce..44008119a8d 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -15,6 +15,7 @@
@ cdecl wined3d_incref(ptr)
@ cdecl wined3d_register_software_device(ptr ptr)
@ cdecl wined3d_register_window(ptr ptr ptr long)
+@ cdecl wined3d_restore_display_modes(ptr)
@ cdecl wined3d_unregister_windows(ptr)
@ cdecl wined3d_adapter_get_identifier(ptr long ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 62ea3960118..4a06b511211 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2313,6 +2313,7 @@ ULONG __cdecl wined3d_incref(struct wined3d *wined3d);
HRESULT __cdecl wined3d_register_software_device(struct wined3d *wined3d, void *init_function);
BOOL __cdecl wined3d_register_window(struct wined3d *wined3d, HWND window,
struct wined3d_device *device, unsigned int flags);
+HRESULT __cdecl wined3d_restore_display_modes(struct wined3d *wined3d);
void __cdecl wined3d_unregister_windows(struct wined3d *wined3d);
HRESULT __cdecl wined3d_adapter_get_identifier(const struct wined3d_adapter *adapter,
--
2.27.0
3
2