From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- .../Input/in_wmvdrm/VideoOutputChildDDraw.cpp | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp (limited to 'Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp') diff --git a/Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp b/Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp new file mode 100644 index 00000000..511fb80a --- /dev/null +++ b/Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp @@ -0,0 +1,80 @@ +#include "main.h" +#include "VideoOutputChildDDraw.h" +#include +#include + +class MonitorFinder +{ +public: + MonitorFinder(HMONITOR hm) : m_monitor_to_find(hm), m_found_devguid(0) + {} + + HMONITOR m_monitor_to_find; + int m_found_devguid; + GUID m_devguid; +}; + +static BOOL WINAPI DDEnumCallbackEx(GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) +{ + MonitorFinder *ovo = (MonitorFinder *)lpContext; + if (ovo->m_found_devguid) return 1; + if (hm == ovo->m_monitor_to_find) + { + ovo->m_devguid = *lpGUID; + ovo->m_found_devguid = 1; + } + return 1; +} + +void VideoOutputChildDDraw::update_monitor_coords() +{ + //find the correct monitor if multiple monitor support is present + m_mon_x = 0; + m_mon_y = 0; + + HINSTANCE h = LoadLibrary(L"user32.dll"); + if (h) + { + HMONITOR (WINAPI *Mfp)(POINT pt, DWORD dwFlags) = (HMONITOR (WINAPI *)(POINT, DWORD)) GetProcAddress(h, "MonitorFromPoint"); + HMONITOR (WINAPI *Mfr)(LPCRECT lpcr, DWORD dwFlags) = (HMONITOR (WINAPI *)(LPCRECT, DWORD)) GetProcAddress(h, "MonitorFromRect"); + HMONITOR (WINAPI *Mfw)(HWND wnd, DWORD dwFlags) = (HMONITOR (WINAPI *)(HWND, DWORD)) GetProcAddress(h, "MonitorFromWindow"); + BOOL (WINAPI *Gmi)(HMONITOR mon, LPMONITORINFO lpmi) = (BOOL (WINAPI *)(HMONITOR, LPMONITORINFO)) GetProcAddress(h, "GetMonitorInfoA"); + if (Mfp && Mfr && Mfw && Gmi) + { + HMONITOR hm = Mfw(parent, 0); + if (hm) + { + HINSTANCE hdd = LoadLibrary(L"ddraw.dll"); + if (hdd) + { + typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXA)(GUID FAR *, LPSTR, LPSTR, LPVOID, HMONITOR); + typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEX)( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags); + LPDIRECTDRAWENUMERATEEX lpDDEnumEx; + lpDDEnumEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(hdd, "DirectDrawEnumerateExW"); + if (lpDDEnumEx) + { + MonitorFinder finder(hm); + + lpDDEnumEx(&DDEnumCallbackEx, &finder, DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_NONDISPLAYDEVICES); + foundGUID=!!finder.m_found_devguid; + if (foundGUID) + { + m_devguid=finder.m_devguid; + MONITORINFOEXW mi; + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + if (Gmi(hm, &mi)) + { + m_mon_x = mi.rcMonitor.left; + m_mon_y = mi.rcMonitor.top; + } + } + } + FreeLibrary(hdd); + } + } + } + FreeLibrary(h); + } +} + -- cgit