summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/windows/video.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/windows/video.h')
-rw-r--r--src/osd/windows/video.h72
1 files changed, 57 insertions, 15 deletions
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