summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-03-01 18:31:53 +0100
committer couriersud <couriersud@arcor.de>2015-03-01 18:31:53 +0100
commit563ff83b3bdda3c64d7f06678ab47c03cbcc619b (patch)
treeee38c56712b386ae1a146d4822c9529a96eb947a
parentc8e16cc06d301e121ed42e7205bc7ba9185e8e18 (diff)
Aligned monitor handling between sdl and baseline. [Couriersud]
-rw-r--r--src/osd/modules/osdwindow.h6
-rw-r--r--src/osd/modules/render/drawd3d.c2
-rw-r--r--src/osd/modules/render/drawdd.c18
-rw-r--r--src/osd/modules/render/drawsdl.c2
-rw-r--r--src/osd/sdl/video.c140
-rw-r--r--src/osd/sdl/video.h81
-rw-r--r--src/osd/sdl/window.c7
-rw-r--r--src/osd/sdl/window.h6
-rw-r--r--src/osd/windows/video.c90
-rw-r--r--src/osd/windows/video.h72
-rw-r--r--src/osd/windows/window.c14
-rw-r--r--src/osd/windows/window.h8
12 files changed, 256 insertions, 190 deletions
diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h
index 3edb10f997e..993866984a2 100644
--- a/src/osd/modules/osdwindow.h
+++ b/src/osd/modules/osdwindow.h
@@ -55,17 +55,17 @@ public:
#ifdef OSD_SDL
virtual osd_dim blit_surface_size() = 0;
- virtual sdl_monitor_info *monitor() const = 0;
+ virtual osd_monitor_info *monitor() const = 0;
#if (SDLMAME_SDL2)
virtual SDL_Window *sdl_window() = 0;
#else
virtual SDL_Surface *sdl_surface() = 0;
#endif
#else
- virtual win_monitor_info *monitor() const = 0;
+ virtual osd_monitor_info *monitor() const = 0;
virtual bool win_has_menu() = 0;
// FIXME: cann we replace winwindow_video_window_monitor(NULL) with monitor() ?
- virtual win_monitor_info *winwindow_video_window_monitor(const osd_rect *proposed) = 0;
+ virtual osd_monitor_info *winwindow_video_window_monitor(const osd_rect *proposed) = 0;
// window handle and info
HWND m_hwnd;
diff --git a/src/osd/modules/render/drawd3d.c b/src/osd/modules/render/drawd3d.c
index fb56ccea8e8..575d0888ea9 100644
--- a/src/osd/modules/render/drawd3d.c
+++ b/src/osd/modules/render/drawd3d.c
@@ -1266,7 +1266,7 @@ int renderer::get_adapter_for_monitor()
HMONITOR curmonitor = (*d3dintf->d3d.get_adapter_monitor)(d3dintf, adapternum);
// if we match the proposed monitor, this is it
- if (curmonitor == window().monitor()->handle())
+ if (curmonitor == *((HMONITOR *)window().monitor()->oshandle()))
{
return adapternum;
}
diff --git a/src/osd/modules/render/drawdd.c b/src/osd/modules/render/drawdd.c
index 0c1965a56df..01abda6ad6d 100644
--- a/src/osd/modules/render/drawdd.c
+++ b/src/osd/modules/render/drawdd.c
@@ -94,7 +94,7 @@ private:
// video modes
int config_adapter_mode();
- void get_adapter_for_monitor(win_monitor_info *monitor);
+ void get_adapter_for_monitor(osd_monitor_info *monitor);
void pick_best_mode();
// various
@@ -130,7 +130,7 @@ private:
/* monitor_enum_info holds information during a monitor enumeration */
struct monitor_enum_info
{
- win_monitor_info * monitor; // pointer to monitor we want
+ osd_monitor_info * monitor; // pointer to monitor we want
GUID guid; // GUID of the one we found
GUID * guid_ptr; // pointer to our GUID
int foundit; // TRUE if we found what we wanted
@@ -263,11 +263,17 @@ int renderer_dd::create()
{
// configure the adapter for the mode we want
if (config_adapter_mode())
+ {
+ osd_printf_error("Unable to configure adapter.\n");
goto error;
+ }
// create the ddraw object
if (ddraw_create())
+ {
+ osd_printf_error("Unable to create ddraw object.\n");
goto error;
+ }
return 0;
@@ -855,7 +861,7 @@ void renderer_dd::compute_blit_surface_size()
// compute the appropriate visible area if we're trying to keepaspect
if (video_config.keepaspect)
{
- win_monitor_info *monitor = window().winwindow_video_window_monitor(NULL);
+ osd_monitor_info *monitor = window().winwindow_video_window_monitor(NULL);
window().target()->compute_visible_area(target_width, target_height, monitor->aspect(), window().target()->orientation(), target_width, target_height);
desired_aspect = (float)target_width / (float)target_height;
}
@@ -945,7 +951,7 @@ void renderer_dd::calc_fullscreen_margins(DWORD desc_width, DWORD desc_height, R
void renderer_dd::blit_to_primary(int srcwidth, int srcheight)
{
IDirectDrawSurface7 *target = (back != NULL) ? back : primary;
- win_monitor_info *monitor = window().winwindow_video_window_monitor(NULL);
+ osd_monitor_info *monitor = window().winwindow_video_window_monitor(NULL);
DDBLTFX blitfx = { sizeof(DDBLTFX) };
RECT clear, outer, dest, source;
INT32 dstwidth, dstheight;
@@ -1161,7 +1167,7 @@ static BOOL WINAPI monitor_enum_callback(GUID FAR *guid, LPSTR description, LPST
monitor_enum_info *einfo = (monitor_enum_info *)context;
// do we match the desired monitor?
- if (hmonitor == einfo->monitor->handle() || (hmonitor == NULL && einfo->monitor->is_primary()))
+ if (hmonitor == *((HMONITOR *)einfo->monitor->oshandle()) || (hmonitor == NULL && einfo->monitor->is_primary()))
{
einfo->guid_ptr = (guid != NULL) ? &einfo->guid : NULL;
if (guid != NULL)
@@ -1177,7 +1183,7 @@ static BOOL WINAPI monitor_enum_callback(GUID FAR *guid, LPSTR description, LPST
// get_adapter_for_monitor
//============================================================
-void renderer_dd::get_adapter_for_monitor(win_monitor_info *monitor)
+void renderer_dd::get_adapter_for_monitor(osd_monitor_info *monitor)
{
monitor_enum_info einfo;
HRESULT result;
diff --git a/src/osd/modules/render/drawsdl.c b/src/osd/modules/render/drawsdl.c
index 453a139702f..0b66dff8db7 100644
--- a/src/osd/modules/render/drawsdl.c
+++ b/src/osd/modules/render/drawsdl.c
@@ -271,7 +271,7 @@ void sdl_info::setup_texture(const osd_dim &size)
UINT32 fmt;
// Determine preferred pixelformat and set up yuv if necessary
- SDL_GetCurrentDisplayMode(window().monitor()->handle(), &mode);
+ SDL_GetCurrentDisplayMode(*((UINT64 *)window().monitor()->handle()), &mode);
if (m_yuv_bitmap)
{
diff --git a/src/osd/sdl/video.c b/src/osd/sdl/video.c
index 0cda12238fb..c679952b69a 100644
--- a/src/osd/sdl/video.c
+++ b/src/osd/sdl/video.c
@@ -63,8 +63,7 @@
osd_video_config video_config;
-sdl_monitor_info *sdl_monitor_info::primary_monitor = NULL;
-sdl_monitor_info *sdl_monitor_info::list = NULL;
+osd_monitor_info *osd_monitor_info::list = NULL;
//============================================================
// LOCAL VARIABLES
@@ -133,7 +132,12 @@ void sdl_osd_interface::video_exit()
//============================================================
// sdlvideo_monitor_refresh
//============================================================
-
+#if defined(SDLMAME_WIN32) // Win32 version
+inline osd_rect RECT_to_osd_rect(const RECT &r)
+{
+ return osd_rect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+}
+#endif
void sdl_monitor_info::refresh()
{
#if (SDLMAME_SDL2)
@@ -144,18 +148,21 @@ void sdl_monitor_info::refresh()
#else
SDL_GetCurrentDisplayMode(m_handle, &dmode);
#endif
- SDL_GetDisplayBounds(m_handle, &m_dimensions);
+ SDL_Rect dimensions;
+ SDL_GetDisplayBounds(m_handle, &dimensions);
+
+ m_pos_size = SDL_Rect_to_osd_rect(dimensions);
+ m_usuable_pos_size = SDL_Rect_to_osd_rect(dimensions);
+ m_is_primary = (m_handle == 0);
- // FIXME: Use SDL_GetDisplayBounds(monitor->handle, &tt) to update monitor_x
- // SDL_Rect tt;
#else
#if defined(SDLMAME_WIN32) // Win32 version
MONITORINFOEX info;
info.cbSize = sizeof(info);
GetMonitorInfo((HMONITOR)m_handle, (LPMONITORINFO)&info);
- m_dimensions.x = m_dimensions.y = 0;
- m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
- m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
+ m_pos_size = RECT_to_osd_rect(info.rcMonitor);
+ m_usuable_pos_size = RECT_to_osd_rect(info.rcWork);
+ m_is_primary = ((info.dwFlags & MONITORINFOF_PRIMARY) != 0);
char *temp = utf8_from_wstring(info.szDevice);
strncpy(m_name, temp, ARRAY_LENGTH(m_name) - 1);
osd_free(temp);
@@ -167,9 +174,9 @@ void sdl_monitor_info::refresh()
primary = CGMainDisplayID();
dbounds = CGDisplayBounds(primary);
- m_dimensions.x = m_dimensions.y = 0;
- m_dimensions.w = dbounds.size.width - dbounds.origin.x;
- m_dimensions.h = dbounds.size.height - dbounds.origin.y;
+ m_is_primary = (m_handle == 0);
+ m_pos_size = osd_rect(0, 0, dbounds.size.width - dbounds.origin.x, dbounds.size.height - dbounds.origin.y);
+ m_usuable_pos_size = m_pos_size;
strncpy(m_name, "Mac OS X display", ARRAY_LENGTH(m_name) - 1);
#elif defined(SDLMAME_X11) || defined(SDLMAME_NO_X11) // X11 version
{
@@ -183,9 +190,9 @@ void sdl_monitor_info::refresh()
{
screen = DefaultScreen(info.info.x11.display);
SDL_VideoDriverName(m_name, ARRAY_LENGTH(m_name) - 1);
- m_dimensions.x = m_dimensions.y = 0;
- m_dimensions.w = DisplayWidth(info.info.x11.display, screen);
- m_dimensions.h = DisplayHeight(info.info.x11.display, screen);
+ m_pos_size = osd_rect(0, 0,
+ DisplayWidth(info.info.x11.display, screen),
+ DisplayHeight(info.info.x11.display, screen));
/* FIXME: If Xinerame is used we should compile a list of monitors
* like we do for other targets and ignore SDL.
@@ -197,11 +204,12 @@ void sdl_monitor_info::refresh()
xineinfo = XineramaQueryScreens(info.info.x11.display, &numscreens);
- m_dimensions.w = xineinfo[0].width;
- m_dimensions.h = xineinfo[0].height;
+ m_pos_size = osd_rect(0, 0, xineinfo[0].width, xineinfo[0].height);
XFree(xineinfo);
}
+ m_usuable_pos_size = m_pos_size;
+ m_is_primary = (m_handle == 0);
}
else
#endif // defined(SDLMAME_X11)
@@ -238,14 +246,17 @@ void sdl_monitor_info::refresh()
}
}
}
- m_dimensions.w = cw;
- m_dimensions.h = ch;
+ m_pos_size = osd_rect(0, 0, cw, ch);
+ m_usuable_pos_size = m_pos_size;
+ m_is_primary = (m_handle == 0);
}
}
#elif defined(SDLMAME_OS2) // OS2 version
- m_dimensions.x = m_dimensions.y = 0;
- m_dimensions.w = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
- m_dimensions.h = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
+ m_pos_size = osd_rect(0, 0,
+ WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ),
+ WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) );
+ m_usuable_pos_size = m_pos_size;
+ m_is_primary = (m_handle == 0);
strncpy(m_name, "OS/2 display", ARRAY_LENGTH(m_name) - 1);
#else
#error Unknown SDLMAME_xx OS type!
@@ -256,7 +267,7 @@ void sdl_monitor_info::refresh()
if (!info_shown)
{
osd_printf_verbose("SDL Device Driver : %s\n", m_name);
- osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", m_dimensions.w, m_dimensions.h);
+ osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", m_pos_size.width(), m_pos_size.height());
info_shown = 1;
}
}
@@ -269,14 +280,14 @@ void sdl_monitor_info::refresh()
// sdlvideo_monitor_get_aspect
//============================================================
-float sdl_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)
{
- return m_aspect / ((float)m_dimensions.w / (float)m_dimensions.h);
+ return m_aspect / ((float)m_pos_size.width() / (float)m_pos_size.height());
}
return 0.0f;
}
@@ -320,26 +331,20 @@ void sdl_osd_interface::update(bool skip_redraw)
#if !defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
void sdl_monitor_info::add_primary_monitor(void *data)
{
- sdl_monitor_info ***tailptr = (sdl_monitor_info ***)data;
- sdl_monitor_info *monitor;
+ // make a list of monitors
+ osd_monitor_info::list = NULL;
+ osd_monitor_info **tailptr = &sdl_monitor_info::list;
// allocate a new monitor info
- monitor = global_alloc_clear(sdl_monitor_info);
-
- // copy in the data
- monitor->m_handle = 1;
-
- monitor->refresh();
+ osd_monitor_info *monitor = global_alloc_clear(sdl_monitor_info(0, "", 1.0f));
+ //monitor->refresh();
// guess the aspect ratio assuming square pixels
- monitor->m_aspect = (float)(monitor->m_dimensions.w) / (float)(monitor->m_dimensions.h);
-
- // save the primary monitor handle
- primary_monitor = monitor;
+ monitor->set_aspect((float)(monitor->position_size().width()) / (float)(monitor->position_size().height()));
// hook us into the list
- **tailptr = monitor;
- *tailptr = &monitor->m_next;
+ *tailptr = monitor;
+ //tailptr = &monitor->m_next;
}
#endif
@@ -349,10 +354,10 @@ void sdl_monitor_info::add_primary_monitor(void *data)
//============================================================
#if defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
-static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data)
+BOOL CALLBACK sdl_monitor_info::monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data)
{
- sdl_monitor_info ***tailptr = (sdl_monitor_info ***)data;
- sdl_monitor_info *monitor;
+ osd_monitor_info ***tailptr = (osd_monitor_info ***)data;
+ osd_monitor_info *monitor;
MONITORINFOEX info;
BOOL result;
@@ -371,10 +376,6 @@ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect,
monitor = global_alloc(sdl_monitor_info((UINT64) handle, temp, aspect));
osd_free(temp);
- // save the primary monitor handle
- if (info.dwFlags & MONITORINFOF_PRIMARY)
- sdl_monitor_info::primary_monitor = monitor;
-
// hook us into the list
**tailptr = monitor;
*tailptr = &monitor->m_next;
@@ -391,42 +392,34 @@ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect,
void sdl_monitor_info::init()
{
- sdl_monitor_info **tailptr;
+ osd_monitor_info **tailptr;
// make a list of monitors
- sdl_monitor_info::list = NULL;
- tailptr = &sdl_monitor_info::list;
+ osd_monitor_info::list = NULL;
+ tailptr = &osd_monitor_info::list;
#if (SDLMAME_SDL2)
{
- int i, monx = 0;
+ int i;
osd_printf_verbose("Enter init_monitors\n");
for (i = 0; i < SDL_GetNumVideoDisplays(); i++)
{
sdl_monitor_info *monitor;
- SDL_DisplayMode dmode;
+
+ char temp[64];
+ snprintf(temp, sizeof(temp)-1, "%s%d", OSDOPTION_SCREEN,i);
// allocate a new monitor info
- monitor = global_alloc_clear(sdl_monitor_info);
- monitor->m_handle = i;
- snprintf(monitor->m_name, sizeof(monitor->m_name)-1, "%s%d", OSDOPTION_SCREEN,i);
+ monitor = global_alloc_clear(sdl_monitor_info(i, temp, 1.0f));
- SDL_GetDesktopDisplayMode(i, &dmode);
- SDL_GetDisplayBounds(i, &monitor->m_dimensions);
+ osd_printf_verbose("Adding monitor %s (%d x %d)\n", monitor->devicename(),
+ monitor->position_size().width(), monitor->position_size().height());
// guess the aspect ratio assuming square pixels
- monitor->m_aspect = (float)(dmode.w) / (float)(dmode.h);
-
- osd_printf_verbose("Adding monitor %s (%d x %d)\n", monitor->m_name, dmode.w, dmode.h);
-
- monx += dmode.w;
-
- // save the primary monitor handle
- if (i == 0)
- primary_monitor = monitor;
+ monitor->set_aspect((float)(monitor->position_size().width()) / (float)(monitor->position_size().height()));
// hook us into the list
*tailptr = monitor;
@@ -446,7 +439,7 @@ void sdl_monitor_info::exit()
// free all of our monitor information
while (sdl_monitor_info::list != NULL)
{
- sdl_monitor_info *temp = sdl_monitor_info::list;
+ osd_monitor_info *temp = sdl_monitor_info::list;
sdl_monitor_info::list = temp->next();
global_free(temp);
}
@@ -458,9 +451,9 @@ void sdl_monitor_info::exit()
//============================================================
#if (SDLMAME_SDL2) || defined(SDLMAME_WIN32)
-sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index)
+osd_monitor_info *osd_monitor_info::pick_monitor(sdl_options &options, int index)
{
- sdl_monitor_info *monitor;
+ osd_monitor_info *monitor;
const char *scrname, *scrname2;
int moncount = 0;
float aspect;
@@ -494,8 +487,11 @@ sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index
goto finishit;
// return the primary just in case all else fails
- monitor = primary_monitor;
+ for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next())
+ if (monitor->is_primary())
+ goto finishit;
+ // FIXME: FatalError?
finishit:
if (aspect != 0)
{
@@ -504,16 +500,16 @@ finishit:
return monitor;
}
#else
-sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index)
+osd_monitor_info *osd_monitor_info::pick_monitor(sdl_options &options, int index)
{
- sdl_monitor_info *monitor;
+ osd_monitor_info *monitor;
float aspect;
// get the aspect ratio
aspect = get_aspect(options.aspect(), options.aspect(index), TRUE);
// return the primary just in case all else fails
- monitor = primary_monitor;
+ monitor = osd_monitor_info::list;
if (aspect != 0)
{
diff --git a/src/osd/sdl/video.h b/src/osd/sdl/video.h
index d8d521284b4..f6eb37ea036 100644
--- a/src/osd/sdl/video.h
+++ b/src/osd/sdl/video.h
@@ -73,6 +73,10 @@ private:
class osd_rect
{
public:
+ osd_rect()
+ : m_x(0), m_y(0), m_d(0,0)
+ {
+ }
osd_rect(const int x, const int y, const int &w, const int &h)
: m_x(x), m_y(y), m_d(w,h)
{
@@ -105,53 +109,84 @@ inline osd_rect SDL_Rect_to_osd_rect(const SDL_Rect &r)
return osd_rect(r.x, r.y, r.w, r.h);
}
-// FIXME: This is sort of ugly ... and should be a real interface only
-class sdl_monitor_info
+class osd_monitor_info
{
public:
- sdl_monitor_info()
- : m_next(NULL), m_handle(0), m_aspect(0.0f)
- {}
- sdl_monitor_info(const UINT64 handle, const char *monitor_device, float aspect)
+#if 0
+ osd_monitor_info()
+ : m_next(NULL), m_handle(NULL), m_aspect(0.0f)
+ {
+ strcpy(m_name, "");
+ }
+#endif
+ osd_monitor_info(void *handle, const char *monitor_device, float aspect)
: m_next(NULL), m_handle(handle), m_aspect(aspect)
{
strncpy(m_name, monitor_device, ARRAY_LENGTH(m_name) - 1);
- refresh();
}
- const UINT64 handle() { return m_handle; }
- const osd_rect position_size() { refresh(); return SDL_Rect_to_osd_rect(m_dimensions); }
- const osd_rect usuable_position_size() { refresh(); return SDL_Rect_to_osd_rect(m_dimensions); }
+ virtual ~osd_monitor_info() { }
+
+ const void *handle() { return m_handle; }
+
+ const osd_rect &position_size() { refresh(); return m_pos_size; }
+ const osd_rect &usuable_position_size() { refresh(); return m_usuable_pos_size; }
const char *devicename() { refresh(); return m_name[0] ? m_name : "UNKNOWN"; }
float aspect();
void set_aspect(const float a) { m_aspect = a; }
+ bool is_primary() { refresh(); return m_is_primary; }
+
+ osd_monitor_info * next() { return m_next; } // pointer to next monitor in list
+
+ static osd_monitor_info *pick_monitor(sdl_options &options, int index);
+ static osd_monitor_info *list;
+
+ // FIXME: should be private!
+ osd_monitor_info *m_next; // pointer to next monitor in list
+protected:
+ virtual void refresh() = 0;
+ osd_rect m_pos_size;
+ osd_rect m_usuable_pos_size;
+ bool m_is_primary;
+ char m_name[64];
+private:
+
+ void * m_handle; // handle to the monitor
+ float m_aspect; // computed/configured aspect ratio of the physical device
+};
+
+
+class sdl_monitor_info : public osd_monitor_info
+{
+public:
+#if 0
+ sdl_monitor_info()
+ : m_next(NULL), m_handle(0), m_aspect(0.0f)
+ {}
+#endif
+ sdl_monitor_info(const UINT64 handle, const char *monitor_device, float aspect)
+ : osd_monitor_info(&m_handle, monitor_device, aspect), m_handle(handle)
+ {
+ refresh();
+ }
// STATIC
static void init();
static void exit();
- static sdl_monitor_info *pick_monitor(sdl_options &options, int index);
#if !defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
static void add_primary_monitor(void *data);
#endif
-
- sdl_monitor_info * next() { return m_next; } // pointer to next monitor in list
-
- // STATIC
- static sdl_monitor_info *primary_monitor;
- static sdl_monitor_info *list;
-
- sdl_monitor_info * m_next; // pointer to next monitor in list
+#if defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
+ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data);
+#endif
private:
- void refresh();
+ void virtual refresh();
UINT64 m_handle; // handle to the monitor
- SDL_Rect m_dimensions;
- char m_name[64];
- float m_aspect; // computed/configured aspect ratio of the physical device
};
struct osd_video_config
diff --git a/src/osd/sdl/window.c b/src/osd/sdl/window.c
index 65ade6d73ea..eca8831bb39 100644
--- a/src/osd/sdl/window.c
+++ b/src/osd/sdl/window.c
@@ -865,7 +865,8 @@ osd_dim sdl_window_info::pick_best_mode()
minimum_height -= 4;
}
- num = SDL_GetNumDisplayModes(m_monitor->handle());
+ // FIXME: this should be provided by monitor !
+ num = SDL_GetNumDisplayModes(*((UINT64 *)m_monitor->handle()));
if (num == 0)
{
@@ -877,7 +878,7 @@ osd_dim sdl_window_info::pick_best_mode()
for (i = 0; i < num; ++i)
{
SDL_DisplayMode mode;
- SDL_GetDisplayMode(m_monitor->handle(), i, &mode);
+ SDL_GetDisplayMode(*((UINT64 *)m_monitor->handle()), i, &mode);
// compute initial score based on difference between target and current
size_score = 1.0f / (1.0f + fabsf((INT32)mode.w - target_width) + fabsf((INT32)mode.h - target_height));
@@ -1392,7 +1393,7 @@ osd_rect sdl_window_info::constrain_to_aspect_ratio(const osd_rect &rect, int ad
INT32 viswidth, visheight;
INT32 adjwidth, adjheight;
float pixel_aspect;
- sdl_monitor_info *monitor = m_monitor;
+ osd_monitor_info *monitor = m_monitor;
// get the pixel aspect ratio for the target monitor
pixel_aspect = monitor->aspect();
diff --git a/src/osd/sdl/window.h b/src/osd/sdl/window.h
index fe8ec9a7498..da9f4d95fc1 100644
--- a/src/osd/sdl/window.h
+++ b/src/osd/sdl/window.h
@@ -35,7 +35,7 @@ typedef UINT32 HashT;
class sdl_window_info : public osd_window
{
public:
- sdl_window_info(running_machine &a_machine, int index, sdl_monitor_info *a_monitor,
+ sdl_window_info(running_machine &a_machine, int index, osd_monitor_info *a_monitor,
const osd_window_config *config)
: osd_window(), m_next(NULL),
// Following three are used by input code to defer resizes
@@ -94,7 +94,7 @@ public:
int xy_to_render_target(int x, int y, int *xt, int *yt);
running_machine &machine() const { return m_machine; }
- sdl_monitor_info *monitor() const { return m_monitor; }
+ osd_monitor_info *monitor() const { return m_monitor; }
int fullscreen() const { return m_fullscreen; }
render_target *target() { return m_target; }
@@ -164,7 +164,7 @@ private:
// Pointer to machine
running_machine & m_machine;
// monitor info
- sdl_monitor_info * m_monitor;
+ osd_monitor_info * m_monitor;
int m_fullscreen;
int m_index;
osd_renderer * m_renderer;
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)
diff --git a/src/osd/windows/video.h b/src/osd/windows/video.h
index 6aefe981152..057ae70df69 100644
--- a/src/osd/windows/video.h
+++ b/src/osd/windows/video.h
@@ -54,6 +54,10 @@ private:
class osd_rect
{
public:
+ osd_rect()
+ : m_x(0), m_y(0), m_d(0,0)
+ {
+ }
osd_rect(const int x, const int y, const int &w, const int &h)
: m_x(x), m_y(y), m_d(w,h)
{
@@ -86,38 +90,76 @@ inline osd_rect RECT_to_osd_rect(const RECT &r)
return osd_rect(r.left, r.top, r.right - r.left, r.bottom - r.top);
}
-class win_monitor_info
+class osd_monitor_info
{
public:
- win_monitor_info();
- virtual ~win_monitor_info();
- void refresh();
+#if 0
+ osd_monitor_info()
+ : m_next(NULL), m_handle(NULL), m_aspect(0.0f)
+ {
+ strcpy(m_name, "");
+ }
+#endif
+ osd_monitor_info(void *handle, const char *monitor_device, float aspect)
+ : m_next(NULL), m_handle(handle), m_aspect(aspect)
+ {
+ strncpy(m_name, monitor_device, ARRAY_LENGTH(m_name) - 1);
+ }
- const HMONITOR handle() { return m_handle; }
- // position_size is used only by draw_dd renderer
- const osd_rect position_size() { refresh(); return RECT_to_osd_rect(m_info.rcMonitor); }
- const osd_rect usuable_position_size() { refresh(); return RECT_to_osd_rect(m_info.rcWork); }
- bool is_primary() { return (m_info.dwFlags & MONITORINFOF_PRIMARY) != 0; }
- const char *devicename() { refresh(); return (m_name != NULL) ? m_name : "UNKNOWN"; }
+ virtual ~osd_monitor_info() { }
+
+ const void *oshandle() { return m_handle; }
+
+ const osd_rect &position_size() { refresh(); return m_pos_size; }
+ const osd_rect &usuable_position_size() { refresh(); return m_usuable_pos_size; }
+
+ const char *devicename() { refresh(); return m_name[0] ? m_name : "UNKNOWN"; }
float aspect();
void set_aspect(const float a) { m_aspect = a; }
+ bool is_primary() { refresh(); return m_is_primary; }
- win_monitor_info * m_next; // pointer to next monitor in list
+ osd_monitor_info * next() { return m_next; } // pointer to next monitor in list
+
+#ifdef OSD_SDL
+ static osd_monitor_info *pick_monitor(sdl_options &options, int index);
+#endif
+ static osd_monitor_info *list;
+
+ // FIXME: should be private!
+ osd_monitor_info *m_next; // pointer to next monitor in list
+protected:
+ virtual void refresh() = 0;
+ osd_rect m_pos_size;
+ osd_rect m_usuable_pos_size;
+ bool m_is_primary;
+ char m_name[64];
+private:
+
+ void * m_handle; // handle to the monitor
+ float m_aspect; // computed/configured aspect ratio of the physical device
+};
+
+class win_monitor_info : public osd_monitor_info
+{
+public:
+ win_monitor_info(const HMONITOR handle, const char *monitor_device, float aspect);
+ virtual ~win_monitor_info();
+
+ virtual void refresh();
// static
static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data);
- static win_monitor_info *monitor_from_handle(HMONITOR monitor);
+ static osd_monitor_info *monitor_from_handle(HMONITOR monitor);
+
+ HMONITOR handle() { return m_handle; }
private:
HMONITOR m_handle; // handle to the monitor
MONITORINFOEX m_info; // most recently retrieved info
-
- float m_aspect; // computed/configured aspect ratio of the physical device
- char * m_name;
};
struct osd_video_config
diff --git a/src/osd/windows/window.c b/src/osd/windows/window.c
index d634d7e0448..52db665fae8 100644
--- a/src/osd/windows/window.c
+++ b/src/osd/windows/window.c
@@ -646,7 +646,7 @@ void winwindow_update_cursor_state(running_machine &machine)
// (main thread)
//============================================================
-void win_window_info::create(running_machine &machine, int index, win_monitor_info *monitor, const osd_window_config *config)
+void win_window_info::create(running_machine &machine, int index, osd_monitor_info *monitor, const osd_window_config *config)
{
win_window_info *window, *win;
@@ -833,9 +833,9 @@ void win_window_info::update()
// (window thread)
//============================================================
-win_monitor_info *win_window_info::winwindow_video_window_monitor(const osd_rect *proposed)
+osd_monitor_info *win_window_info::winwindow_video_window_monitor(const osd_rect *proposed)
{
- win_monitor_info *monitor;
+ osd_monitor_info *monitor;
// in window mode, find the nearest
if (!m_fullscreen)
@@ -858,7 +858,7 @@ win_monitor_info *win_window_info::winwindow_video_window_monitor(const osd_rect
monitor = m_monitor;
// make sure we're up-to-date
- monitor->refresh();
+ //monitor->refresh();
return monitor;
}
@@ -1523,7 +1523,7 @@ osd_rect win_window_info::constrain_to_aspect_ratio(const osd_rect &rect, int ad
INT32 viswidth, visheight;
INT32 adjwidth, adjheight;
float pixel_aspect;
- win_monitor_info *monitor = winwindow_video_window_monitor(&rect);
+ osd_monitor_info *monitor = winwindow_video_window_monitor(&rect);
assert(GetCurrentThreadId() == window_threadid);
@@ -1686,7 +1686,7 @@ osd_dim win_window_info::get_max_bounds(int constrain)
//assert(GetCurrentThreadId() == window_threadid);
// compute the maximum client area
- m_monitor->refresh();
+ //m_monitor->refresh();
osd_rect maximum = m_monitor->usuable_position_size();
// clamp to the window's max
@@ -1823,7 +1823,7 @@ void win_window_info::adjust_window_position_after_major_change()
// in full screen, make sure it covers the primary display
else
{
- win_monitor_info *monitor = winwindow_video_window_monitor(NULL);
+ osd_monitor_info *monitor = winwindow_video_window_monitor(NULL);
newrect = monitor->position_size();
}
diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h
index bb7fb779aa2..10a871d2f5f 100644
--- a/src/osd/windows/window.h
+++ b/src/osd/windows/window.h
@@ -46,7 +46,7 @@ public:
void update();
- win_monitor_info *winwindow_video_window_monitor(const osd_rect *proposed);
+ osd_monitor_info *winwindow_video_window_monitor(const osd_rect *proposed);
bool win_has_menu()
{
@@ -60,13 +60,13 @@ public:
return osd_dim(client.right - client.left, client.bottom - client.top);
}
- win_monitor_info *monitor() const { return m_monitor; }
+ osd_monitor_info *monitor() const { return m_monitor; }
void destroy();
// static
- static void create(running_machine &machine, int index, win_monitor_info *monitor, const osd_window_config *config);
+ static void create(running_machine &machine, int index, osd_monitor_info *monitor, const osd_window_config *config);
// static callbacks
@@ -86,7 +86,7 @@ public:
int m_ismaximized;
// monitor info
- win_monitor_info * m_monitor;
+ osd_monitor_info * m_monitor;
int m_fullscreen;
int m_fullscreen_safe;
float m_aspect;