00001 #region --- License ---
00002
00003
00004
00005
00006
00007 #endregion
00008
00009 using System;
00010 using System.Collections.Generic;
00011 using System.Text;
00012
00013 using OpenTK.Graphics;
00014 using System.Runtime.InteropServices;
00015 using System.Diagnostics;
00016
00017 namespace OpenTK.Platform.Windows
00018 {
00019 internal class WinDisplayDeviceDriver : IDisplayDeviceDriver
00020 {
00021 static object display_lock = new object();
00022 static Dictionary<DisplayDevice, string> available_device_names =
00023 new Dictionary<DisplayDevice, string>();
00024
00025 #region --- Constructors ---
00026
00028 static WinDisplayDeviceDriver()
00029 {
00030 lock (display_lock)
00031 {
00032
00033
00034
00035
00036
00037
00038 DisplayDevice opentk_dev;
00039 DisplayResolution opentk_dev_current_res = null;
00040 List<DisplayResolution> opentk_dev_available_res = new List<DisplayResolution>();
00041 bool opentk_dev_primary = false;
00042 int device_count = 0, mode_count = 0;
00043
00044
00045 WindowsDisplayDevice dev1 = new WindowsDisplayDevice(), dev2 = new WindowsDisplayDevice();
00046 while (Functions.EnumDisplayDevices(null, device_count++, dev1, 0))
00047 {
00048 if ((dev1.StateFlags & DisplayDeviceStateFlags.AttachedToDesktop) == DisplayDeviceStateFlags.None)
00049 continue;
00050
00051 DeviceMode monitor_mode = new DeviceMode();
00052
00053
00054
00055 if (Functions.EnumDisplaySettingsEx(dev1.DeviceName.ToString(), DisplayModeSettingsEnum.CurrentSettings, monitor_mode, 0) ||
00056 Functions.EnumDisplaySettingsEx(dev1.DeviceName.ToString(), DisplayModeSettingsEnum.RegistrySettings, monitor_mode, 0))
00057 {
00058 opentk_dev_current_res = new DisplayResolution(
00059 monitor_mode.Position.X, monitor_mode.Position.Y,
00060 monitor_mode.PelsWidth, monitor_mode.PelsHeight,
00061 monitor_mode.BitsPerPel, monitor_mode.DisplayFrequency);
00062 opentk_dev_primary =
00063 (dev1.StateFlags & DisplayDeviceStateFlags.PrimaryDevice) != DisplayDeviceStateFlags.None;
00064 }
00065
00066 opentk_dev_available_res.Clear();
00067 mode_count = 0;
00068 while (Functions.EnumDisplaySettings(dev1.DeviceName.ToString(), mode_count++, monitor_mode))
00069 {
00070 DisplayResolution res = new DisplayResolution(
00071 monitor_mode.Position.X, monitor_mode.Position.Y,
00072 monitor_mode.PelsWidth, monitor_mode.PelsHeight,
00073 monitor_mode.BitsPerPel, monitor_mode.DisplayFrequency);
00074
00075 opentk_dev_available_res.Add(res);
00076 }
00077
00078
00079
00080
00081 opentk_dev = new DisplayDevice(
00082 opentk_dev_current_res,
00083 opentk_dev_primary,
00084 opentk_dev_available_res,
00085 opentk_dev_current_res.Bounds);
00086
00087 available_device_names.Add(opentk_dev, dev1.DeviceName);
00088 }
00089 }
00090 }
00091
00092 public WinDisplayDeviceDriver()
00093 {
00094 }
00095
00096 #endregion
00097
00098 #region --- IDisplayDeviceDriver Members ---
00099
00100 #region public bool TryChangeResolution(OpenTK.Graphics.DisplayDevice device, DisplayResolution resolution)
00101
00102 public bool TryChangeResolution(DisplayDevice device, DisplayResolution resolution)
00103 {
00104 DeviceMode mode = null;
00105
00106 if (resolution != null)
00107 {
00108 mode = new DeviceMode();
00109 mode.PelsWidth = resolution.Width;
00110 mode.PelsHeight = resolution.Height;
00111 mode.BitsPerPel = resolution.BitsPerPixel;
00112 mode.DisplayFrequency = (int)resolution.RefreshRate;
00113 mode.Fields = Constants.DM_BITSPERPEL
00114 | Constants.DM_PELSWIDTH
00115 | Constants.DM_PELSHEIGHT
00116 | Constants.DM_DISPLAYFREQUENCY;
00117 }
00118
00119 return Constants.DISP_CHANGE_SUCCESSFUL ==
00120 Functions.ChangeDisplaySettingsEx(available_device_names[device], mode, IntPtr.Zero,
00121 ChangeDisplaySettingsEnum.Fullscreen, IntPtr.Zero);
00122 }
00123
00124 #endregion
00125
00126 #region public TryRestoreResolution TryRestoreResolution(OpenTK.Graphics.DisplayDevice device)
00127
00128 public bool TryRestoreResolution(DisplayDevice device)
00129 {
00130 return TryChangeResolution(device, null);
00131 }
00132
00133 #endregion
00134
00135 #endregion
00136 }
00137 }