summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/monitor/monitor_module.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/monitor/monitor_module.h')
-rw-r--r--src/osd/modules/monitor/monitor_module.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/osd/modules/monitor/monitor_module.h b/src/osd/modules/monitor/monitor_module.h
new file mode 100644
index 00000000000..3244e7fd42b
--- /dev/null
+++ b/src/osd/modules/monitor/monitor_module.h
@@ -0,0 +1,97 @@
+// license:BSD-3-Clause
+// copyright-holders:Brad Hughes, Aaron Giles, Olivier Galibert, R. Belmont
+/*
+ * monitor_module.h
+ *
+ */
+
+#ifndef MAME_OSD_MODULES_MONITOR_MONITORMODULE_H
+#define MAME_OSD_MODULES_MONITOR_MONITORMODULE_H
+
+#include <vector>
+
+#include "modules/osdmodule.h"
+#include "modules/osdhelper.h"
+
+//============================================================
+// CONSTANTS
+//============================================================
+
+#define OSD_MONITOR_PROVIDER "monitorprovider"
+
+class monitor_module;
+class osd_window;
+
+//============================================================
+// osd_monitor_info
+//============================================================
+
+class osd_monitor_info
+{
+public:
+ osd_monitor_info(monitor_module &module, std::uint64_t handle, const char *monitor_device, float aspect)
+ : m_is_primary(false), m_name(monitor_device), m_module(module), m_handle(handle), m_aspect(aspect)
+ {
+ }
+
+ virtual ~osd_monitor_info() { }
+
+ virtual void refresh() = 0;
+
+ std::uint64_t oshandle() const { return m_handle; }
+ monitor_module& module() const { return m_module; }
+
+ const osd_rect &position_size() const { return m_pos_size; }
+ const osd_rect &usuable_position_size() const { return m_usuable_pos_size; }
+
+ const std::string &devicename() const
+ {
+ static std::string s_unknown = std::string("UNKNOWN");
+ return m_name.length() ? m_name : s_unknown;
+ }
+
+ float aspect() const { return m_aspect; }
+ float pixel_aspect() const { return m_aspect / (float(m_pos_size.width()) / float(m_pos_size.height())); }
+
+ void update_resolution(const int new_width, const int new_height) const { m_pos_size.resize(new_width, new_height); }
+ void set_aspect(const float a) { m_aspect = a; }
+ bool is_primary() const { return m_is_primary; }
+
+protected:
+ osd_rect m_pos_size;
+ osd_rect m_usuable_pos_size;
+ bool m_is_primary;
+ std::string m_name;
+private:
+ monitor_module& m_module;
+ std::uint64_t m_handle; // handle to the monitor
+ float m_aspect; // computed/configured aspect ratio of the physical device
+};
+
+//============================================================
+// monitor_module
+//============================================================
+
+class monitor_module : public osd_module
+{
+private:
+ std::vector<std::shared_ptr<osd_monitor_info>> m_list;
+
+public:
+ monitor_module(const char *type, const char *name)
+ : osd_module(type, name)
+ {
+ }
+
+ virtual ~monitor_module() { }
+
+ std::vector<std::shared_ptr<osd_monitor_info>> & list() { return m_list; }
+
+ virtual std::shared_ptr<osd_monitor_info> monitor_from_handle(std::uint64_t handle) = 0;
+ virtual std::shared_ptr<osd_monitor_info> monitor_from_rect(const osd_rect &rect) = 0;
+ virtual std::shared_ptr<osd_monitor_info> monitor_from_window(const osd_window &window) = 0;
+
+ virtual std::shared_ptr<osd_monitor_info> pick_monitor(osd_options &options, int index) = 0;
+};
+
+#endif // MAME_OSD_MODULES_MONITOR_MONITORMODULE_H