summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/windows/video.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/windows/video.c')
-rw-r--r--src/osd/windows/video.c90
1 files changed, 38 insertions, 52 deletions
diff --git a/src/osd/windows/video.c b/src/osd/windows/video.c
index cf35c0570cb..37406ff2823 100644
--- a/src/osd/windows/video.c
+++ b/src/osd/windows/video.c
@@ -41,17 +41,14 @@ osd_video_config video_config;
//============================================================
// monitor info
-win_monitor_info *win_monitor_list;
-static win_monitor_info *primary_monitor;
-
-
+osd_monitor_info *osd_monitor_info::list = NULL;
//============================================================
// PROTOTYPES
//============================================================
static void init_monitors(void);
-static win_monitor_info *pick_monitor(windows_options &options, int index);
+static osd_monitor_info *pick_monitor(windows_options &options, int index);
static void check_osd_inputs(running_machine &machine);
@@ -100,28 +97,23 @@ void windows_osd_interface::video_exit()
window_exit();
// free all of our monitor information
- while (win_monitor_list != NULL)
+ while (osd_monitor_info::list != NULL)
{
- win_monitor_info *temp = win_monitor_list;
- win_monitor_list = temp->m_next;
+ osd_monitor_info *temp = osd_monitor_info::list;
+ osd_monitor_info::list = temp->m_next;
global_free(temp);
}
}
-win_monitor_info::win_monitor_info()
- : m_next(NULL),
- m_handle(NULL),
- m_aspect(0.0f),
- m_name(NULL)
+win_monitor_info::win_monitor_info(const HMONITOR handle, const char *monitor_device, float aspect)
+ : osd_monitor_info(&m_handle, monitor_device, aspect), m_handle(handle)
{
}
win_monitor_info::~win_monitor_info()
{
- if (m_name != NULL)
- osd_free(m_name);
}
//============================================================
@@ -136,47 +128,45 @@ void win_monitor_info::refresh()
m_info.cbSize = sizeof(m_info);
result = GetMonitorInfo(m_handle, (LPMONITORINFO)&m_info);
assert(result);
- if (m_name != NULL)
- osd_free(m_name);
- m_name = utf8_from_tstring(m_info.szDevice);
+ char *temp = utf8_from_tstring(m_info.szDevice);
+
+ strncpy(m_name, temp, sizeof(m_name));
+
+ m_pos_size = RECT_to_osd_rect(m_info.rcMonitor);
+ m_usuable_pos_size = RECT_to_osd_rect(m_info.rcWork);
+ m_is_primary = ((m_info.dwFlags & MONITORINFOF_PRIMARY) != 0);
(void)result; // to silence gcc 4.6
}
//============================================================
-// winvideo_monitor_get_aspect
+// sdlvideo_monitor_get_aspect
//============================================================
-float win_monitor_info::aspect()
+float osd_monitor_info::aspect()
{
// refresh the monitor information and compute the aspect
refresh();
// FIXME: returning 0 looks odd, video_config is bad
if (video_config.keepaspect)
{
- int width, height;
- refresh();
- width = rect_width(&m_info.rcMonitor);
- height = rect_height(&m_info.rcMonitor);
- return m_aspect / ((float)width / (float)height);
+ return m_aspect / ((float)m_pos_size.width() / (float)m_pos_size.height());
}
return 0.0f;
}
-
-
//============================================================
// winvideo_monitor_from_handle
//============================================================
-win_monitor_info *win_monitor_info::monitor_from_handle(HMONITOR hmonitor)
+osd_monitor_info *win_monitor_info::monitor_from_handle(HMONITOR hmonitor)
{
- win_monitor_info *monitor;
+ osd_monitor_info *monitor;
// find the matching monitor
- for (monitor = win_monitor_list; monitor != NULL; monitor = monitor->m_next)
- if (monitor->handle() == hmonitor)
+ for (monitor = osd_monitor_info::list; monitor != NULL; monitor = monitor->m_next)
+ if (*((HMONITOR *)monitor->oshandle()) == hmonitor)
return monitor;
return NULL;
}
@@ -214,19 +204,19 @@ void windows_osd_interface::update(bool skip_redraw)
static void init_monitors(void)
{
- win_monitor_info **tailptr;
+ osd_monitor_info **tailptr;
// make a list of monitors
- win_monitor_list = NULL;
- tailptr = &win_monitor_list;
+ osd_monitor_info::list = NULL;
+ tailptr = &osd_monitor_info::list;
EnumDisplayMonitors(NULL, NULL, win_monitor_info::monitor_enum_callback, (LPARAM)&tailptr);
// if we're verbose, print the list of monitors
{
- win_monitor_info *monitor;
- for (monitor = win_monitor_list; monitor != NULL; monitor = monitor->m_next)
+ osd_monitor_info *monitor;
+ for (monitor = osd_monitor_info::list; monitor != NULL; monitor = monitor->m_next)
{
- osd_printf_verbose("Video: Monitor %p = \"%s\" %s\n", monitor->handle(), monitor->devicename(), (monitor == primary_monitor) ? "(primary)" : "");
+ osd_printf_verbose("Video: Monitor %p = \"%s\" %s\n", monitor->oshandle(), monitor->devicename(), monitor->is_primary() ? "(primary)" : "");
}
}
}
@@ -239,8 +229,8 @@ static void init_monitors(void)
BOOL CALLBACK win_monitor_info::monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data)
{
- win_monitor_info ***tailptr = (win_monitor_info ***)data;
- win_monitor_info *monitor;
+ osd_monitor_info ***tailptr = (osd_monitor_info ***)data;
+ osd_monitor_info *monitor;
MONITORINFOEX info;
BOOL result;
@@ -251,19 +241,13 @@ BOOL CALLBACK win_monitor_info::monitor_enum_callback(HMONITOR handle, HDC dc, L
(void)result; // to silence gcc 4.6
// allocate a new monitor info
- monitor = global_alloc(win_monitor_info);
-
+ monitor = global_alloc(win_monitor_info(handle, "", 1.0f));
// copy in the data
- monitor->m_handle = handle;
- monitor->m_info = info;
+ //monitor->refresh();
// guess the aspect ratio assuming square pixels
monitor->set_aspect((float)(info.rcMonitor.right - info.rcMonitor.left) / (float)(info.rcMonitor.bottom - info.rcMonitor.top));
- // save the primary monitor handle
- if (monitor->m_info.dwFlags & MONITORINFOF_PRIMARY)
- primary_monitor = monitor;
-
// hook us into the list
**tailptr = monitor;
*tailptr = &monitor->m_next;
@@ -278,10 +262,10 @@ BOOL CALLBACK win_monitor_info::monitor_enum_callback(HMONITOR handle, HDC dc, L
// pick_monitor
//============================================================
-static win_monitor_info *pick_monitor(windows_options &options, int index)
+static osd_monitor_info *pick_monitor(windows_options &options, int index)
{
const char *scrname, *scrname2;
- win_monitor_info *monitor;
+ osd_monitor_info *monitor;
int moncount = 0;
float aspect;
@@ -299,7 +283,7 @@ static win_monitor_info *pick_monitor(windows_options &options, int index)
// look for a match in the name first
if (scrname != NULL && (scrname[0] != 0))
{
- for (monitor = win_monitor_list; monitor != NULL; monitor = monitor->m_next)
+ for (monitor = osd_monitor_info::list; monitor != NULL; monitor = monitor->m_next)
{
moncount++;
if (strcmp(scrname, monitor->devicename()) == 0)
@@ -309,12 +293,14 @@ static win_monitor_info *pick_monitor(windows_options &options, int index)
// didn't find it; alternate monitors until we hit the jackpot
index %= moncount;
- for (monitor = win_monitor_list; monitor != NULL; monitor = monitor->m_next)
+ for (monitor = osd_monitor_info::list; monitor != NULL; monitor = monitor->m_next)
if (index-- == 0)
goto finishit;
// return the primary just in case all else fails
- monitor = primary_monitor;
+ for (monitor = osd_monitor_info::list; monitor != NULL; monitor = monitor->m_next)
+ if (monitor->is_primary())
+ goto finishit;
finishit:
if (aspect != 0)