Updated patches 7 and 10, added patch 11 to prevent problems with Silverlight

This commit is contained in:
Sebastian Lackner 2013-11-22 19:54:41 +01:00
parent 574b5e7cb9
commit 3c0f6ef05f
4 changed files with 297 additions and 172 deletions

View File

@ -0,0 +1,253 @@
From 8c8c8c24a8c90c292c6af2c83fd2587a04492a4f Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Fri, 22 Nov 2013 18:40:59 +0100
Subject: quartz/tests: Add tests for IVMRMonitorConfig and IVMRMonitorConfig9
interface
---
dlls/quartz/tests/videorenderer.c | 210 ++++++++++++++++++++++++++++++++++++-
1 file changed, 205 insertions(+), 5 deletions(-)
diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c
index ce1ac29..df45e1e 100644
--- a/dlls/quartz/tests/videorenderer.c
+++ b/dlls/quartz/tests/videorenderer.c
@@ -22,6 +22,9 @@
#include "wine/test.h"
#include "dshow.h"
+#include "initguid.h"
+#include "d3d9.h"
+#include "vmr9.h"
#define QI_SUCCEED(iface, riid, ppv) hr = IUnknown_QueryInterface(iface, &riid, (LPVOID*)&ppv); \
ok(hr == S_OK, "IUnknown_QueryInterface returned %x\n", hr); \
@@ -33,6 +36,8 @@
}
static IUnknown *pVideoRenderer = NULL;
+static IUnknown *pVMR7 = NULL;
+static IUnknown *pVMR9 = NULL;
static int create_video_renderer(void)
{
@@ -150,16 +155,211 @@ static void test_basefilter(void)
IBaseFilter_Release(base);
}
+static int create_vmr7(void)
+{
+ HRESULT hr;
+
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (LPVOID*)&pVMR7);
+ return (hr == S_OK && pVMR7 != NULL);
+}
+
+static void release_vmr7(void)
+{
+ HRESULT hr;
+
+ hr = IUnknown_Release(pVMR7);
+ ok(hr == 0, "IUnknown_Release failed with %x\n", hr);
+}
+
+static void test_monitorconfig7(void)
+{
+ HRESULT hr;
+ IVMRMonitorConfig *pMonitorConfig = NULL;
+ VMRGUID guid;
+ VMRMONITORINFO info[8];
+ DWORD numdev_total, numdev;
+
+ hr = IUnknown_QueryInterface(pVMR7, &IID_IVMRMonitorConfig, (LPVOID*)&pMonitorConfig);
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
+ if (!pMonitorConfig) goto out;
+
+ hr = IVMRMonitorConfig_SetMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "SetMonitor returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig_GetMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "GetMonitor returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig_SetDefaultMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "SetDefaultMonitor returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig_GetDefaultMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "GetDefaultMonitor returned %x, expected E_POINTER.\n", hr);
+
+ memset(&guid, 0, sizeof(guid));
+ guid.pGUID = NULL; /* default DirectDraw device */
+ hr = IVMRMonitorConfig_SetMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "SetMonitor failed with %x.\n", hr);
+
+ memset(&guid, 255, sizeof(guid));
+ hr = IVMRMonitorConfig_GetMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "GetMonitor failed with %x.\n", hr);
+ ok(guid.pGUID == NULL, "GetMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
+
+ memset(&guid, 0, sizeof(guid));
+ guid.pGUID = NULL; /* default DirectDraw device */
+ hr = IVMRMonitorConfig_SetDefaultMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "SetDefaultMonitor failed with %x.\n", hr);
+
+ memset(&guid, 255, sizeof(guid));
+ hr = IVMRMonitorConfig_GetDefaultMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "GetDefaultMonitor failed with %x.\n", hr);
+ ok(guid.pGUID == NULL, "GetDefaultMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
+
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, NULL);
+ ok(hr == E_POINTER, "GetAvailableMonitors returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 0, &numdev_total);
+ ok(hr == E_INVALIDARG, "GetAvailableMonitors returned %x, expected E_INVALIDARG.\n", hr);
+
+ numdev_total = 0;
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, &numdev_total);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev_total > 0, "GetAvailableMonitors returned numdev_total = %d, expected > 0.\n", numdev_total);
+
+ /* check if its possible to provide a buffer which is too small for all entries */
+ if (numdev_total > 1)
+ {
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 1, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == 1, "GetAvailableMonitors returned numdev = %d, expected 1.\n", numdev);
+ }
+
+ /* don't request information for more monitors than memory available */
+ if (numdev_total > sizeof(info)/sizeof(info[0]))
+ numdev_total = sizeof(info)/sizeof(info[0]);
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, numdev_total, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == numdev_total, "GetAvailableMonitors returned numdev = %d, expected %d.\n", numdev, numdev_total);
+
+ /* TODO: Add more tests for content of info */
+
+out:
+ if (pMonitorConfig) IVMRMonitorConfig_Release(pMonitorConfig);
+}
+
+static int create_vmr9(void)
+{
+ HRESULT hr;
+
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (LPVOID*)&pVMR9);
+ return (hr == S_OK && pVMR7 != NULL);
+}
+
+static void release_vmr9(void)
+{
+ HRESULT hr;
+
+ hr = IUnknown_Release(pVMR9);
+ ok(hr == 0, "IUnknown_Release failed with %x\n", hr);
+}
+
+static void test_monitorconfig9(void)
+{
+ HRESULT hr;
+ IVMRMonitorConfig9 *pMonitorConfig = NULL;
+ UINT uDev;
+ VMR9MonitorInfo info[8];
+ DWORD numdev_total, numdev;
+
+ hr = IUnknown_QueryInterface(pVMR9, &IID_IVMRMonitorConfig9, (LPVOID*)&pMonitorConfig);
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
+ if (!pMonitorConfig) goto out;
+
+ hr = IVMRMonitorConfig9_GetMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "GetMonitor returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig9_GetDefaultMonitor(pMonitorConfig, NULL);
+ ok(hr == E_POINTER, "GetDefaultMonitor returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig9_SetMonitor(pMonitorConfig, 0);
+ ok(hr == S_OK, "SetMonitor failed with %x.\n", hr);
+
+ uDev = 0xdeadbeef;
+ hr = IVMRMonitorConfig9_GetMonitor(pMonitorConfig, &uDev);
+ ok(hr == S_OK, "GetMonitor failed with %x.\n", hr);
+ ok(uDev == 0, "GetMonitor returned uDev = %d, expected 0.\n", uDev);
+
+ hr = IVMRMonitorConfig9_SetDefaultMonitor(pMonitorConfig, 0);
+ ok(hr == S_OK, "SetDefaultMonitor failed with %x.\n", hr);
+
+ uDev = 0xdeadbeef;
+ hr = IVMRMonitorConfig9_GetDefaultMonitor(pMonitorConfig, &uDev);
+ ok(hr == S_OK, "GetDefaultMonitor failed with %x.\n", hr);
+ ok(uDev == 0, "GetDefaultMonitor returned uDev = %d, expected 0.\n", uDev);
+
+ hr = IVMRMonitorConfig9_GetAvailableMonitors(pMonitorConfig, NULL, 0, NULL);
+ ok(hr == E_POINTER, "GetAvailableMonitors returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig9_GetAvailableMonitors(pMonitorConfig, info, 0, &numdev_total);
+ ok(hr == E_INVALIDARG, "GetAvailableMonitors returned %x, expected E_INVALIDARG.\n", hr);
+
+ numdev_total = 0;
+ hr = IVMRMonitorConfig9_GetAvailableMonitors(pMonitorConfig, NULL, 0, &numdev_total);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev_total > 0, "GetAvailableMonitors returned numdev_total = %d, expected > 0.\n", numdev_total);
+
+ /* check if its possible to provide a buffer which is too small for all entries */
+ if (numdev_total > 1)
+ {
+ hr = IVMRMonitorConfig9_GetAvailableMonitors(pMonitorConfig, info, 1, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == 1, "GetAvailableMonitors returned numdev = %d, expected 1.\n", numdev);
+ }
+
+ if (numdev_total > sizeof(info)/sizeof(info[0]))
+ numdev_total = sizeof(info)/sizeof(info[0]);
+ hr = IVMRMonitorConfig9_GetAvailableMonitors(pMonitorConfig, info, numdev_total, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == numdev_total, "GetAvailableMonitors returned numdev = %d, expected %d.\n", numdev, numdev_total);
+
+ /* TODO: Add more tests for content of info */
+
+out:
+ if (pMonitorConfig) IVMRMonitorConfig9_Release(pMonitorConfig);
+}
+
START_TEST(videorenderer)
{
CoInitialize(NULL);
- if (!create_video_renderer())
- return;
- test_query_interface();
- test_basefilter();
+ /* Video Renderer tests */
+ if (create_video_renderer())
+ {
+ test_query_interface();
+ test_basefilter();
+ release_video_renderer();
+ }else
+ skip("VideoRenderer is not available.\n");
+
+ /* Video Mixing Renderer 7 tests */
+ if (create_vmr7())
+ {
+ test_monitorconfig7();
+ release_vmr7();
+ }else
+ skip("VideoMixingRenderer7 is not available.\n");
- release_video_renderer();
+ /* Video Mixing Renderer 9 tests */
+ if (create_vmr9())
+ {
+ test_monitorconfig9();
+ release_vmr9();
+ }else
+ skip("VideoMixingRenderer9 is not available.\n");
CoUninitialize();
}
--
1.7.9.5

View File

@ -1,163 +0,0 @@
From 4c261ca7ce6d73f0820106804797dcc7f0912b62 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 11 Nov 2013 00:18:31 +0100
Subject: quartz/tests: Add tests for IVMRMonitorConfig
---
dlls/quartz/tests/Makefile.in | 1 +
dlls/quartz/tests/monitorconfig.c | 131 +++++++++++++++++++++++++++++++++++++
2 files changed, 132 insertions(+)
create mode 100644 dlls/quartz/tests/monitorconfig.c
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in
index ae5fbac..94b2f44 100644
--- a/dlls/quartz/tests/Makefile.in
+++ b/dlls/quartz/tests/Makefile.in
@@ -8,6 +8,7 @@ C_SRCS = \
filtermapper.c \
memallocator.c \
misc.c \
+ monitorconfig.c \
referenceclock.c \
videorenderer.c
diff --git a/dlls/quartz/tests/monitorconfig.c b/dlls/quartz/tests/monitorconfig.c
new file mode 100644
index 0000000..3a18460
--- /dev/null
+++ b/dlls/quartz/tests/monitorconfig.c
@@ -0,0 +1,131 @@
+/*
+ * MonitorConfig unit tests for Quartz
+ *
+ * Copyright (C) 2013 Sebastian Lackner
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "wine/test.h"
+#include "dshow.h"
+
+static void test_monitorconfig_setmonitor(void)
+{
+ HRESULT hr;
+ IUnknown *pVMR = NULL;
+ IVMRMonitorConfig *pMonitorConfig = NULL;
+ VMRGUID guid;
+
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (LPVOID*)&pVMR);
+ ok(hr == S_OK, "CoCreateInstance failed with %x.\n", hr);
+ ok(pVMR != NULL, "pVMR is NULL.\n");
+ if (!pVMR) goto out;
+
+ hr = IUnknown_QueryInterface(pVMR, &IID_IVMRMonitorConfig, (LPVOID*)&pMonitorConfig);
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
+ if (!pMonitorConfig) goto out;
+
+ memset(&guid, 0, sizeof(guid));
+ guid.pGUID = NULL; /* default DirectDraw device */
+ hr = IVMRMonitorConfig_SetMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "SetMonitor failed with %x.\n", hr);
+
+ memset(&guid, 255, sizeof(guid));
+ hr = IVMRMonitorConfig_GetMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "GetMonitor failed with %x.\n", hr);
+ ok(guid.pGUID == NULL, "GetMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
+
+ memset(&guid, 0, sizeof(guid));
+ guid.pGUID = NULL; /* default DirectDraw device */
+ hr = IVMRMonitorConfig_SetDefaultMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "SetDefaultMonitor failed with %x.\n", hr);
+
+ memset(&guid, 255, sizeof(guid));
+ hr = IVMRMonitorConfig_GetDefaultMonitor(pMonitorConfig, &guid);
+ ok(hr == S_OK, "GetDefaultMonitor failed with %x.\n", hr);
+ ok(guid.pGUID == NULL, "GetDefaultMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
+
+out:
+ if (pMonitorConfig) IVMRMonitorConfig_Release(pMonitorConfig);
+ if (pVMR) IUnknown_Release(pVMR);
+}
+
+static void test_monitorconfig_getavailablemonitors(void)
+{
+ HRESULT hr;
+ IUnknown *pVMR = NULL;
+ IVMRMonitorConfig *pMonitorConfig = NULL;
+ VMRMONITORINFO info[8];
+ DWORD numdev_total, numdev;
+
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IUnknown, (LPVOID*)&pVMR);
+ ok(hr == S_OK, "CoCreateInstance failed with %x.\n", hr);
+ ok(pVMR != NULL, "pVMR is NULL.\n");
+ if (!pVMR) goto out;
+
+ hr = IUnknown_QueryInterface(pVMR, &IID_IVMRMonitorConfig, (LPVOID*)&pMonitorConfig);
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
+ if (!pMonitorConfig) goto out;
+
+ /* call without any arguments */
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, NULL);
+ ok(hr == E_POINTER, "GetAvailableMonitors returned %x, expected E_POINTER.\n", hr);
+
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 0, &numdev_total);
+ ok(hr == E_INVALIDARG, "GetAvailableMonitors returned %x, expected E_INVALIDARG.\n", hr);
+
+ numdev_total = 0;
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, &numdev_total);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev_total > 0, "GetAvailableMonitors returned numdev_total = %d, expected > 0.\n", numdev_total);
+
+ if (numdev_total > 1)
+ {
+ /* return just the first monitor */
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 1, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == 1, "GetAvailableMonitors returned numdev = %d, expected 1.\n", numdev);
+ }
+
+ /* don't request information for more monitors than memory available */
+ if (numdev_total > sizeof(info)/sizeof(VMRMONITORINFO))
+ numdev_total = sizeof(info)/sizeof(VMRMONITORINFO);
+
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, numdev_total, &numdev);
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
+ ok(numdev == numdev_total, "GetAvailableMonitors returned numdev = %d, expected %d.\n", numdev, numdev_total);
+
+ /* TODO: Add test for content of info */
+
+out:
+ if (pMonitorConfig) IVMRMonitorConfig_Release(pMonitorConfig);
+ if (pVMR) IUnknown_Release(pVMR);
+}
+
+START_TEST(monitorconfig)
+{
+ CoInitialize(NULL);
+
+ test_monitorconfig_setmonitor();
+ test_monitorconfig_getavailablemonitors();
+
+ CoUninitialize();
+}
--
1.7.9.5

View File

@ -1,7 +1,7 @@
From c80b095c919dcc976955f258fe177a2b24fd8dea Mon Sep 17 00:00:00 2001
From 90f7d78cf1ee2bf4329b298cb24e0e5145637557 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 28 Oct 2013 00:39:17 +0100
Subject: winex11: Enable/disable windows when they are (un)mapped by foreign
Date: Fri, 22 Nov 2013 18:54:18 +0100
Subject: winex11: Enable/disable windows when they are (un)mapped by foreign
applications
---
@ -9,10 +9,10 @@ Subject: winex11: Enable/disable windows when they are (un)mapped by foreign
1 file changed, 17 insertions(+)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index df27468..9d958c0 100644
index 767c003..f39b922 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -929,6 +929,7 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
@@ -922,6 +922,7 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
{
struct x11drv_win_data *data;
@ -20,9 +20,9 @@ index df27468..9d958c0 100644
if (event->xany.window == x11drv_thread_data()->clip_window)
{
@@ -943,7 +944,12 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
@@ -936,7 +937,12 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
if (hwndFocus && IsChild( hwnd, hwndFocus ))
set_input_focus( hwnd );
set_input_focus( data );
}
+
+ is_embedded = data->embedded;
@ -33,7 +33,7 @@ index df27468..9d958c0 100644
}
@@ -952,7 +958,18 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
@@ -945,7 +951,18 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
*/
static void X11DRV_UnmapNotify( HWND hwnd, XEvent *event )
{
@ -46,7 +46,7 @@ index df27468..9d958c0 100644
+
+ is_embedded = data->embedded;
+ release_win_data( data );
+
+
+ if (is_embedded)
+ EnableWindow( hwnd, FALSE );
}

View File

@ -0,0 +1,35 @@
From c586d47aabf8741b8526579868c691e77ff5f7c8 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Thu, 21 Nov 2013 03:37:31 +0100
Subject: quartz: Workaround Silverlight problems when multiple monitors are
found
---
dlls/quartz/vmr9.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 31f3f8e..20da5b9 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -1440,7 +1440,7 @@ static HRESULT WINAPI VMR7MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig *
args.info7 = info;
args.info9 = NULL;
- args.arraysize = arraysize;
+ args.arraysize = 1; /* only return first entry */
args.numdev = 0;
EnumDisplayMonitors(NULL, NULL, get_available_monitors_proc, (LPARAM)&args);
@@ -1540,7 +1540,7 @@ static HRESULT WINAPI VMR9MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig9
args.info7 = NULL;
args.info9 = info;
- args.arraysize = arraysize;
+ args.arraysize = 1; /* only return first entry */
args.numdev = 0;
EnumDisplayMonitors(NULL, NULL, get_available_monitors_proc, (LPARAM)&args);
--
1.7.9.5