diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp')
-rw-r--r-- | Src/Plugins/Input/in_wmvdrm/VideoOutputChildDDraw.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
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 <multimon.h> +#include <ddraw.h> + +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); + } +} + |