bsnes/hiro/gtk/monitor.cpp

47 lines
1.5 KiB
C++
Executable File

#if defined(Hiro_Monitor)
namespace hiro {
auto pMonitor::count() -> uint {
return gdk_display_get_n_monitors(gdk_display_get_default());
}
auto pMonitor::dpi(uint monitor) -> Position {
auto gdkMonitor = gdk_display_get_monitor(gdk_display_get_default(), monitor);
auto monitorGeometry = geometry(monitor);
auto scaleFactor = gdk_monitor_get_scale_factor(gdkMonitor);
return {
round(monitorGeometry.width() * scaleFactor / (gdk_monitor_get_width_mm(gdkMonitor) / 25.4)),
round(monitorGeometry.height() * scaleFactor / (gdk_monitor_get_height_mm(gdkMonitor) / 25.4))
};
}
auto pMonitor::geometry(uint monitor) -> Geometry {
GdkRectangle rectangle = {};
auto gdkMonitor = gdk_display_get_monitor(gdk_display_get_default(), monitor);
gdk_monitor_get_geometry(gdkMonitor, &rectangle);
return {rectangle.x, rectangle.y, rectangle.width, rectangle.height};
}
auto pMonitor::primary() -> uint {
auto display = gdk_display_get_default();
auto primary = gdk_display_get_primary_monitor(display);
// gdk_display_get_primary_monitor() returns a &GdkMonitor, but most APIs
// want an index number.
for (auto i = 1; i < gdk_display_get_n_monitors(display); i++ )
if (primary == gdk_display_get_monitor(display, i)) return i;
return 0;
}
auto pMonitor::workspace(uint monitor) -> Geometry {
auto gdkMonitor = gdk_display_get_monitor(gdk_display_get_default(), monitor);
GdkRectangle rectangle = {};
gdk_monitor_get_workarea(gdkMonitor, &rectangle);
return {rectangle.x, rectangle.y, rectangle.width, rectangle.height};
}
}
#endif