From 563ff83b3bdda3c64d7f06678ab47c03cbcc619b Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 1 Mar 2015 18:31:53 +0100 Subject: Aligned monitor handling between sdl and baseline. [Couriersud] --- src/osd/modules/osdwindow.h | 6 +- src/osd/modules/render/drawd3d.c | 2 +- src/osd/modules/render/drawdd.c | 18 +++-- src/osd/modules/render/drawsdl.c | 2 +- src/osd/sdl/video.c | 140 +++++++++++++++++++-------------------- src/osd/sdl/video.h | 81 +++++++++++++++------- src/osd/sdl/window.c | 7 +- src/osd/sdl/window.h | 6 +- src/osd/windows/video.c | 90 +++++++++++-------------- src/osd/windows/video.h | 72 +++++++++++++++----- src/osd/windows/window.c | 14 ++-- src/osd/windows/window.h | 8 +-- 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; -- cgit v1.2.3