Fix repetitive monitor updates. By design, MAME has an issue setting

aspect correctly on monitor resolution changes. This needs to be
addressed separately. [Couriersud]
This commit is contained in:
couriersud 2015-04-20 23:57:44 +02:00
parent 4e4d2c8ce9
commit eb7b5c027e
5 changed files with 25 additions and 14 deletions

View File

@ -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)
{

View File

@ -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;

View File

@ -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)
{

View File

@ -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;

View File

@ -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: