summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-01-30 23:32:22 +0100
committer couriersud <couriersud@arcor.de>2015-01-30 23:32:22 +0100
commitbd2555b7ed1cb7560bc9c50685ed8e5f617fbaeb (patch)
tree8a0c737eb93242fcae73e65f48d504a8407f8c00
parent4b4625109c8f27c9fecdc030e8a217e7ba3bc5f5 (diff)
Fixed SDL1.2 (osx, linux, windows). (nw)
-rw-r--r--src/osd/sdl/video.c103
-rw-r--r--src/osd/sdl/video.h29
2 files changed, 72 insertions, 60 deletions
diff --git a/src/osd/sdl/video.c b/src/osd/sdl/video.c
index 05b17fd45e1..a5e566982e1 100644
--- a/src/osd/sdl/video.c
+++ b/src/osd/sdl/video.c
@@ -156,12 +156,12 @@ void sdl_monitor_info::refresh()
#if defined(SDLMAME_WIN32) // Win32 version
MONITORINFOEX info;
info.cbSize = sizeof(info);
- GetMonitorInfo((HMONITOR)monitor->handle, (LPMONITORINFO)&info);
- monitor->m_dimensions.x = monitor->m_dimensions.y = 0;
- monitor->m_center_width = monitor->m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
- monitor->m_center_height = monitor->m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
+ GetMonitorInfo((HMONITOR)m_handle, (LPMONITORINFO)&info);
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = info.rcMonitor.right - info.rcMonitor.left;
+ m_center_height = m_dimensions.h = info.rcMonitor.bottom - info.rcMonitor.top;
char *temp = utf8_from_wstring(info.szDevice);
- strcpy(monitor->monitor_device, temp);
+ strcpy(m_monitor_device, temp);
osd_free(temp);
#elif defined(SDLMAME_MACOSX) // Mac OS X Core Imaging version
CGDirectDisplayID primary;
@@ -171,9 +171,10 @@ void sdl_monitor_info::refresh()
primary = CGMainDisplayID();
dbounds = CGDisplayBounds(primary);
- monitor->center_width = monitor->monitor_width = dbounds.size.width - dbounds.origin.x;
- monitor->center_height = monitor->monitor_height = dbounds.size.height - dbounds.origin.y;
- strcpy(monitor->monitor_device, "Mac OS X display");
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = dbounds.size.width - dbounds.origin.x;
+ m_center_height = m_dimensions.h = dbounds.size.height - dbounds.origin.y;
+ strcpy(m_monitor_device, "Mac OS X display");
#elif defined(SDLMAME_X11) || defined(SDLMAME_NO_X11) // X11 version
{
#if defined(SDLMAME_X11)
@@ -185,9 +186,10 @@ void sdl_monitor_info::refresh()
if ( SDL_GetWMInfo(&info) && (info.subsystem == SDL_SYSWM_X11) )
{
screen = DefaultScreen(info.info.x11.display);
- SDL_VideoDriverName(monitor->monitor_device, sizeof(monitor->monitor_device)-1);
- monitor->monitor_width = DisplayWidth(info.info.x11.display, screen);
- monitor->monitor_height = DisplayHeight(info.info.x11.display, screen);
+ SDL_VideoDriverName(m_monitor_device, sizeof(m_monitor_device)-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);
if ((XineramaIsActive(info.info.x11.display)) && video_config.restrictonemonitor)
{
@@ -196,15 +198,15 @@ void sdl_monitor_info::refresh()
xineinfo = XineramaQueryScreens(info.info.x11.display, &numscreens);
- monitor->center_width = xineinfo[0].width;
- monitor->center_height = xineinfo[0].height;
+ m_center_width = xineinfo[0].width;
+ m_center_height = xineinfo[0].height;
XFree(xineinfo);
}
else
{
- monitor->center_width = monitor->monitor_width;
- monitor->center_height = monitor->monitor_height;
+ m_center_width = m_dimensions.w;
+ m_center_height = m_dimensions.h;
}
}
else
@@ -213,7 +215,7 @@ void sdl_monitor_info::refresh()
static int first_call=0;
static int cw = 0, ch = 0;
- SDL_VideoDriverName(monitor->monitor_device, sizeof(monitor->monitor_device)-1);
+ SDL_VideoDriverName(m_monitor_device, sizeof(m_monitor_device)-1);
if (first_call==0)
{
const char *dimstr = osd_getenv(SDLENV_DESKTOPDIM);
@@ -233,7 +235,7 @@ void sdl_monitor_info::refresh()
}
if ((cw==0) || (ch==0))
{
- osd_printf_warning("WARNING: SDL_GetVideoInfo() for driver <%s> is broken.\n", monitor->monitor_device);
+ osd_printf_warning("WARNING: SDL_GetVideoInfo() for driver <%s> is broken.\n", m_monitor_device);
osd_printf_warning(" You should set SDLMAME_DESKTOPDIM to your desktop size.\n");
osd_printf_warning(" e.g. export SDLMAME_DESKTOPDIM=800x600\n");
osd_printf_warning(" Assuming 1024x768 now!\n");
@@ -242,16 +244,17 @@ void sdl_monitor_info::refresh()
}
}
}
- monitor->monitor_width = cw;
- monitor->monitor_height = ch;
- monitor->center_width = cw;
- monitor->center_height = ch;
+ m_dimensions.w = cw;
+ m_dimensions.h = ch;
+ m_center_width = cw;
+ m_center_height = ch;
}
}
#elif defined(SDLMAME_OS2) // OS2 version
- monitor->center_width = monitor->monitor_width = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
- monitor->center_height = monitor->monitor_height = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
- strcpy(monitor->monitor_device, "OS/2 display");
+ m_dimensions.x = m_dimensions.y = 0;
+ m_center_width = m_dimensions.w = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
+ m_center_height = m_dimensions.h = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
+ strcpy(m_monitor_device, "OS/2 display");
#else
#error Unknown SDLMAME_xx OS type!
#endif
@@ -260,8 +263,8 @@ void sdl_monitor_info::refresh()
static int info_shown=0;
if (!info_shown)
{
- osd_printf_verbose("SDL Device Driver : %s\n", monitor->monitor_device);
- osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", monitor->monitor_width, monitor->monitor_height);
+ osd_printf_verbose("SDL Device Driver : %s\n", m_monitor_device);
+ osd_printf_verbose("SDL Monitor Dimensions: %d x %d\n", m_dimensions.w, m_dimensions.h);
info_shown = 1;
}
}
@@ -323,7 +326,7 @@ void sdl_osd_interface::update(bool skip_redraw)
//============================================================
#if !defined(SDLMAME_WIN32) && !(SDLMAME_SDL2)
-static void add_primary_monitor(void *data)
+void sdl_monitor_info::add_primary_monitor(void *data)
{
sdl_monitor_info ***tailptr = (sdl_monitor_info ***)data;
sdl_monitor_info *monitor;
@@ -332,19 +335,19 @@ static void add_primary_monitor(void *data)
monitor = global_alloc_clear(sdl_monitor_info);
// copy in the data
- monitor->handle = 1;
+ monitor->m_handle = 1;
- sdlvideo_monitor_refresh(monitor);
+ monitor->refresh();
// guess the aspect ratio assuming square pixels
- monitor->aspect = (float)(monitor->monitor_width) / (float)(monitor->monitor_height);
+ monitor->m_aspect = (float)(monitor->m_dimensions.w) / (float)(monitor->m_dimensions.h);
// save the primary monitor handle
primary_monitor = monitor;
// hook us into the list
**tailptr = monitor;
- *tailptr = &monitor->next;
+ *tailptr = &monitor->m_next;
}
#endif
@@ -367,34 +370,22 @@ static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect,
assert(result);
(void)result; // to silence gcc 4.6
- // allocate a new monitor info
- monitor = global_alloc_clear(sdl_monitor_info);
-
- // copy in the data
+ // guess the aspect ratio assuming square pixels
+ float aspect = (float)(info.rcMonitor.right - info.rcMonitor.left) / (float)(info.rcMonitor.bottom - info.rcMonitor.top);
-#ifdef PTR64
- monitor->handle = (UINT64)handle;
-#else
- monitor->handle = (UINT32)handle;
-#endif
- monitor->monitor_width = info.rcMonitor.right - info.rcMonitor.left;
- monitor->monitor_height = info.rcMonitor.bottom - info.rcMonitor.top;
- monitor->center_width = monitor->monitor_width;
- monitor->center_height = monitor->monitor_height;
+ // allocate a new monitor info
char *temp = utf8_from_wstring(info.szDevice);
- strcpy(monitor->monitor_device, temp);
+ // copy in the data
+ monitor = global_alloc(sdl_monitor_info((UINT64) handle, temp, aspect));
osd_free(temp);
- // guess the aspect ratio assuming square pixels
- monitor->aspect = (float)(info.rcMonitor.right - info.rcMonitor.left) / (float)(info.rcMonitor.bottom - info.rcMonitor.top);
-
// save the primary monitor handle
if (info.dwFlags & MONITORINFOF_PRIMARY)
- primary_monitor = monitor;
+ sdl_monitor_info::primary_monitor = monitor;
// hook us into the list
**tailptr = monitor;
- *tailptr = &monitor->next;
+ *tailptr = &monitor->m_next;
// enumerate all the available monitors so to list their names in verbose mode
return TRUE;
@@ -449,7 +440,7 @@ void sdl_monitor_info::init()
// hook us into the list
*tailptr = monitor;
- tailptr = &monitor->next;
+ tailptr = &monitor->m_next;
}
}
osd_printf_verbose("Leave init_monitors\n");
@@ -466,7 +457,7 @@ void sdl_monitor_info::exit()
while (sdl_monitor_info::list != NULL)
{
sdl_monitor_info *temp = sdl_monitor_info::list;
- sdl_monitor_info::list = temp->next;
+ sdl_monitor_info::list = temp->next();
global_free(temp);
}
}
@@ -498,7 +489,7 @@ sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index
// look for a match in the name first
if (scrname != NULL)
{
- for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
+ for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next())
{
moncount++;
if (strcmp(scrname, monitor->device()) == 0)
@@ -508,7 +499,7 @@ sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index
// didn't find it; alternate monitors until we hit the jackpot
index %= moncount;
- for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next)
+ for (monitor = sdl_monitor_info::list; monitor != NULL; monitor = monitor->next())
if (index-- == 0)
goto finishit;
@@ -523,7 +514,7 @@ finishit:
return monitor;
}
#else
-static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
+sdl_monitor_info *sdl_monitor_info::pick_monitor(sdl_options &options, int index)
{
sdl_monitor_info *monitor;
float aspect;
@@ -536,7 +527,7 @@ static sdl_monitor_info *pick_monitor(sdl_options &options, int index)
if (aspect != 0)
{
- monitor->aspect = aspect;
+ monitor->m_aspect = aspect;
}
return monitor;
}
diff --git a/src/osd/sdl/video.h b/src/osd/sdl/video.h
index 2e5cc4f0cce..a2ab10f7ebc 100644
--- a/src/osd/sdl/video.h
+++ b/src/osd/sdl/video.h
@@ -58,10 +58,22 @@ struct sdl_mode
int height;
};
+// FIXME: This is sort of ugly ... and should be a real interface only
class sdl_monitor_info
{
public:
- sdl_monitor_info * next; // pointer to next monitor in list
+
+ sdl_monitor_info()
+ : m_next(NULL), m_handle(0), m_aspect(0.0f),
+ m_center_width(0), m_center_height(0)
+ {}
+ sdl_monitor_info(const UINT64 handle, const char *monitor_device, float aspect)
+ : m_next(NULL), m_handle(handle), m_aspect(aspect),
+ m_center_width(0), m_center_height(0)
+ {
+ strncpy(m_monitor_device, monitor_device, 64);
+ refresh();
+ }
const UINT64 handle() { return m_handle; }
const SDL_Rect &position_size() { refresh(); return m_dimensions; }
@@ -69,6 +81,7 @@ public:
const char *device() { return m_monitor_device; }
float aspect();
+
int center_width() { refresh(); return m_center_width; }
int center_height() { refresh(); return m_center_height; }
@@ -78,7 +91,18 @@ public:
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;
+
+ // FIXME: shouldn't be here - see windows enumeration callback
+ sdl_monitor_info * m_next; // pointer to next monitor in list
private:
void refresh();
@@ -89,9 +113,6 @@ private:
int m_center_width; // width of first physical screen for centering
int m_center_height; // height of first physical screen for centering
- // STATIC
- static sdl_monitor_info *primary_monitor;
- static sdl_monitor_info *list;
};