diff options
author | couriersud <couriersud@arcor.de> | 2015-01-30 23:32:22 +0100 |
---|---|---|
committer | couriersud <couriersud@arcor.de> | 2015-01-30 23:32:22 +0100 |
commit | bd2555b7ed1cb7560bc9c50685ed8e5f617fbaeb (patch) | |
tree | 8a0c737eb93242fcae73e65f48d504a8407f8c00 | |
parent | 4b4625109c8f27c9fecdc030e8a217e7ba3bc5f5 (diff) |
Fixed SDL1.2 (osx, linux, windows). (nw)
-rw-r--r-- | src/osd/sdl/video.c | 103 | ||||
-rw-r--r-- | src/osd/sdl/video.h | 29 |
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; }; |