From eb7b5c027e36dd61990a5e962c814c82ff69ccc5 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 20 Apr 2015 23:57:44 +0200 Subject: [PATCH] Fix repetitive monitor updates. By design, MAME has an issue setting aspect correctly on monitor resolution changes. This needs to be addressed separately. [Couriersud] --- src/osd/sdl/video.c | 2 -- src/osd/sdl/video.h | 11 ++++++----- src/osd/windows/video.c | 4 ++-- src/osd/windows/video.h | 11 ++++++----- src/osd/windows/window.c | 11 +++++++++++ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/osd/sdl/video.c b/src/osd/sdl/video.c index 71d4f779f67..3d8f6c095bb 100644 --- a/src/osd/sdl/video.c +++ b/src/osd/sdl/video.c @@ -285,8 +285,6 @@ void sdl_monitor_info::refresh() 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) { diff --git a/src/osd/sdl/video.h b/src/osd/sdl/video.h index 862988fe6ac..e79442bdd3c 100644 --- a/src/osd/sdl/video.h +++ b/src/osd/sdl/video.h @@ -115,17 +115,19 @@ public: virtual ~osd_monitor_info() { } + virtual void refresh() = 0; + 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 osd_rect &position_size() { return m_pos_size; } + const osd_rect &usuable_position_size() { return m_usuable_pos_size; } - const char *devicename() { refresh(); return m_name[0] ? m_name : "UNKNOWN"; } + const char *devicename() { 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; } + bool is_primary() { return m_is_primary; } osd_monitor_info * next() { return m_next; } // pointer to next monitor in list @@ -135,7 +137,6 @@ public: // 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; diff --git a/src/osd/windows/video.c b/src/osd/windows/video.c index ea9fa1b3a02..d87348aa9de 100644 --- a/src/osd/windows/video.c +++ b/src/osd/windows/video.c @@ -113,6 +113,7 @@ void windows_osd_interface::video_exit() 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) { + refresh(); } win_monitor_info::~win_monitor_info() @@ -138,6 +139,7 @@ void win_monitor_info::refresh() osd_free(temp); m_pos_size = RECT_to_osd_rect(m_info.rcMonitor); + printf("%d %d\n", m_pos_size.width(), m_pos_size.height()); 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 @@ -151,8 +153,6 @@ void win_monitor_info::refresh() 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) { diff --git a/src/osd/windows/video.h b/src/osd/windows/video.h index 87ce0d8527c..23ff05a7371 100644 --- a/src/osd/windows/video.h +++ b/src/osd/windows/video.h @@ -110,17 +110,19 @@ public: virtual ~osd_monitor_info() { } + virtual void refresh() = 0; + 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 osd_rect &position_size() { return m_pos_size; } + const osd_rect &usuable_position_size() { return m_usuable_pos_size; } - const char *devicename() { refresh(); return m_name[0] ? m_name : "UNKNOWN"; } + const char *devicename() { 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; } + bool is_primary() { return m_is_primary; } osd_monitor_info * next() { return m_next; } // pointer to next monitor in list @@ -130,7 +132,6 @@ public: // 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; diff --git a/src/osd/windows/window.c b/src/osd/windows/window.c index 52db665fae8..6ca2e6bb420 100644 --- a/src/osd/windows/window.c +++ b/src/osd/windows/window.c @@ -1447,6 +1447,17 @@ LRESULT CALLBACK win_window_info::video_window_proc(HWND wnd, UINT message, WPAR window->maximize_window(); break; + // maximum size set + case WM_DISPLAYCHANGE: + /* FIXME: The current codebase has an issue with setting aspect + * ratios correctly after display change. set_aspect should + * be set_forced_aspect and on a refresh this forced aspect should + * be preserved if set. If not, the standard aspect calculation + * should be used. + */ + window->m_monitor->refresh(); + break; + // set focus: if we're not the primary window, switch back // commented out ATM because this prevents us from resizing secondary windows // case WM_SETFOCUS: