aboutsummaryrefslogtreecommitdiffstats
path: root/win/rfb_win32/MonitorInfo.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win/rfb_win32/MonitorInfo.cxx')
-rw-r--r--win/rfb_win32/MonitorInfo.cxx105
1 files changed, 15 insertions, 90 deletions
diff --git a/win/rfb_win32/MonitorInfo.cxx b/win/rfb_win32/MonitorInfo.cxx
index d639ac56..551017bd 100644
--- a/win/rfb_win32/MonitorInfo.cxx
+++ b/win/rfb_win32/MonitorInfo.cxx
@@ -16,7 +16,7 @@
* USA.
*/
-#include <rfb_win32/DynamicFn.h>
+#include <tchar.h>
#include <rfb_win32/MonitorInfo.h>
#include <rfb_win32/Win32Util.h>
#include <rdr/Exception.h>
@@ -36,91 +36,39 @@ using namespace win32;
static LogWriter vlog("MonitorInfo");
-// If we are building in multi-monitor support (i.e. the headers support it)
-// then do dynamic imports of the required system calls, and provide any
-// other code that wouldn't otherwise compile.
-#ifdef RFB_HAVE_MONITORINFO
-#include <tchar.h>
-typedef HMONITOR (WINAPI *_MonitorFromWindow_proto)(HWND,DWORD);
-static rfb::win32::DynamicFn<_MonitorFromWindow_proto> _MonitorFromWindow(_T("user32.dll"), "MonitorFromWindow");
-typedef HMONITOR (WINAPI *_MonitorFromRect_proto)(LPCRECT,DWORD);
-static rfb::win32::DynamicFn<_MonitorFromRect_proto> _MonitorFromRect(_T("user32.dll"), "MonitorFromRect");
-typedef BOOL (WINAPI *_GetMonitorInfo_proto)(HMONITOR,LPMONITORINFO);
-static rfb::win32::DynamicFn<_GetMonitorInfo_proto> _GetMonitorInfo(_T("user32.dll"), "GetMonitorInfoA");
-typedef BOOL (WINAPI *_EnumDisplayMonitors_proto)(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
-static rfb::win32::DynamicFn<_EnumDisplayMonitors_proto> _EnumDisplayMonitors(_T("user32.dll"), "EnumDisplayMonitors");
static void fillMonitorInfo(HMONITOR monitor, MonitorInfo* mi) {
vlog.debug("monitor=%p", monitor);
- if (!_GetMonitorInfo.isValid())
- throw rdr::Exception("no GetMonitorInfo");
memset(mi, 0, sizeof(MONITORINFOEXA));
mi->cbSize = sizeof(MONITORINFOEXA);
- if (!(*_GetMonitorInfo)(monitor, mi))
+ if (!GetMonitorInfo(monitor, mi))
throw rdr::SystemException("failed to GetMonitorInfo", GetLastError());
vlog.debug("monitor is %ld,%ld-%ld,%ld", mi->rcMonitor.left, mi->rcMonitor.top, mi->rcMonitor.right, mi->rcMonitor.bottom);
vlog.debug("work area is %ld,%ld-%ld,%ld", mi->rcWork.left, mi->rcWork.top, mi->rcWork.right, mi->rcWork.bottom);
vlog.debug("device is \"%s\"", mi->szDevice);
}
-#else
-#pragma message(" NOTE: Not building Multi-Monitor support.")
-#endif
MonitorInfo::MonitorInfo(HWND window) {
cbSize = sizeof(MonitorInfo);
szDevice[0] = 0;
-#ifdef RFB_HAVE_MONITORINFO
- try {
- if (_MonitorFromWindow.isValid()) {
- HMONITOR monitor = (*_MonitorFromWindow)(window, MONITOR_DEFAULTTONEAREST);
- if (!monitor)
- throw rdr::SystemException("failed to get monitor", GetLastError());
- fillMonitorInfo(monitor, this);
- return;
- }
- } catch (rdr::Exception& e) {
- vlog.error("%s", e.str());
- }
-#endif
-
- // Legacy fallbacks - just return the desktop settings
- vlog.debug("using legacy fall-backs");
- HWND desktop = GetDesktopWindow();
- GetWindowRect(desktop, &rcMonitor);
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
- dwFlags = 0;
+ HMONITOR monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONEAREST);
+ if (!monitor)
+ throw rdr::SystemException("failed to get monitor", GetLastError());
+ fillMonitorInfo(monitor, this);
}
MonitorInfo::MonitorInfo(const RECT& r) {
cbSize = sizeof(MonitorInfo);
szDevice[0] = 0;
-#ifdef RFB_HAVE_MONITORINFO
- try {
- if (_MonitorFromRect.isValid()) {
- HMONITOR monitor = (*_MonitorFromRect)(&r, MONITOR_DEFAULTTONEAREST);
- if (!monitor)
- throw rdr::SystemException("failed to get monitor", GetLastError());
- fillMonitorInfo(monitor, this);
- return;
- }
- } catch (rdr::Exception& e) {
- vlog.error("%s", e.str());
- }
-#endif
-
- // Legacy fallbacks - just return the desktop settings
- vlog.debug("using legacy fall-backs");
- HWND desktop = GetDesktopWindow();
- GetWindowRect(desktop, &rcMonitor);
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
- dwFlags = 0;
+ HMONITOR monitor = MonitorFromRect(&r, MONITOR_DEFAULTTONEAREST);
+ if (!monitor)
+ throw rdr::SystemException("failed to get monitor", GetLastError());
+ fillMonitorInfo(monitor, this);
}
-#ifdef RFB_HAVE_MONITORINFO
-
struct monitorByNameData {
MonitorInfo* info;
const char* monitorName;
@@ -133,7 +81,7 @@ static BOOL CALLBACK monitorByNameEnumProc(HMONITOR monitor,
monitorByNameData* data = (monitorByNameData*)d;
memset(data->info, 0, sizeof(MONITORINFOEXA));
data->info->cbSize = sizeof(MONITORINFOEXA);
- if ((*_GetMonitorInfo)(monitor, data->info)) {
+ if (GetMonitorInfo(monitor, data->info)) {
if (stricmp(data->monitorName, data->info->szDevice) == 0)
return FALSE;
}
@@ -141,44 +89,21 @@ static BOOL CALLBACK monitorByNameEnumProc(HMONITOR monitor,
return TRUE;
}
-#endif
-
MonitorInfo::MonitorInfo(const char* devName) {
-#ifdef RFB_HAVE_MONITORINFO
- if (!_EnumDisplayMonitors.isValid()) {
- vlog.debug("EnumDisplayMonitors not found");
- } else {
- monitorByNameData data;
- data.info = this;
- data.monitorName = devName;
-
- (*_EnumDisplayMonitors)(0, 0, &monitorByNameEnumProc, (LPARAM)&data);
- if (stricmp(data.monitorName, szDevice) == 0)
- return;
- }
-#endif
- // If multi-monitor is not built, or not supported by the OS,
- // or if the named monitor is not found, revert to the primary monitor.
- vlog.debug("reverting to primary monitor");
- cbSize = sizeof(MonitorInfo);
- szDevice[0] = 0;
-
- HWND desktop = GetDesktopWindow();
- GetWindowRect(desktop, &rcMonitor);
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
- dwFlags = 0;
+ monitorByNameData data;
+ data.info = this;
+ data.monitorName = devName;
+ EnumDisplayMonitors(0, 0, &monitorByNameEnumProc, (LPARAM)&data);
}
void MonitorInfo::moveTo(HWND handle) {
vlog.debug("moveTo monitor=%s", szDevice);
-#ifdef RFB_HAVE_MONITORINFO
MonitorInfo mi(handle);
if (strcmp(szDevice, mi.szDevice) != 0) {
centerWindow(handle, rcWork);
clipTo(handle);
}
-#endif
}
void MonitorInfo::clipTo(RECT* r) {