bool DisplayManagerWin::setDisplayMode(int display, int mode)
{
  DEVMODEW modeInfo;

  if (!isValidDisplayMode(display, mode))
    return false;

  if (getModeInfo(display, mode, modeInfo))
  {
    modeInfo.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;

    LONG rc = ChangeDisplaySettingsExW((LPCWSTR)m_displayAdapters[display].utf16(), &modeInfo, NULL,
                                       CDS_FULLSCREEN, NULL);

    if (rc != DISP_CHANGE_SUCCESSFUL)
    {
      QLOG_ERROR() << "Failed to changed DisplayMode, error" << rc;
      return false;
    }
    else
    {
      return true;
    }
  }

  return false;
}
bool DisplayManagerRPI::setDisplayMode(int display, int mode)
{
  if (!isValidDisplayMode(display, mode))
    return false;

  HDMI_PROPERTY_PARAM_T property;
  property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE;
  property.param1 = (mode % 2) ? HDMI_PIXEL_CLOCK_TYPE_NTSC : HDMI_PIXEL_CLOCK_TYPE_PAL;
  property.param2 = 0;
  vc_tv_hdmi_set_property(&property);

  TV_SUPPORTED_MODE_NEW_T* tvmode = &m_modes[mode / 2];
  bool ret = vc_tv_hdmi_power_on_explicit_new(HDMI_MODE_HDMI, (HDMI_RES_GROUP_T)tvmode->group, tvmode->code) == 0;
  if (!ret)
  {
    QLOG_ERROR() << "Failed to switch display mode" << ret;
  }

  return ret;
}
bool DisplayManagerOSX::setDisplayMode(int display, int mode)
{
  if (!isValidDisplayMode(display, mode) || !m_osxDisplayModes[display])
    return false;
  
  CGDisplayModeRef displayMode =
  (CGDisplayModeRef)CFArrayGetValueAtIndex(m_osxDisplayModes[display], mode);

  CGError err = CGDisplaySetDisplayMode(m_osxDisplays[display], displayMode, nullptr);
  if (err)
  {
    QLOG_ERROR() << "CGDisplaySetDisplayMode() returned failure:" << err;
    return false;
  }

  // HACK : on OSX, switching display mode can leave dock in a state where mouse cursor
  // will not hide on top of hidden dock, so we reset it state to fix this
  OSXUtils::SetMenuBarVisible(true);
  OSXUtils::SetMenuBarVisible(false);

  return true;
}