// // QuickRes.h // #include #include #include "QuickRes.rc" #include "stdlib.h" #include "tchar.h" #define ODS OutputDebugString #define TRAY_MSG WM_USER+1 #define TRAY_ID 42 // // Global Quickres bit flags // #define QF_SHOWRESTART 0x0001 // Show modes that require a restart #define QF_UPDATEREG 0x0002 // update registry with new devmode #define QF_REMMODES 0x0004 // Remember good/bad modes in registry #define QF_SORT_BYBPP 0x0008 // if not set, we sort by Resolution #define QF_HIDE_4BPP 0x0010 // Hide 4Bpp mode if 8Bpp of same res exists #define QF_SHOWTESTED 0x0020 // Show tested/passing modes only #define QF_SHOWFREQS 0x0040 // Show Frequencies (disabled on Win95) // // fGoodModes (below) depends on these values for these flags // Changing these constants requires rewriting the fGoodModes macro // #define MODE_INVALID 0 // Devmode is not visible #define MODE_VALID 1 // Devmode looks good #define MODE_UNTESTED 2 // Haven't tried it yet #define MODE_BESTHZ 3 // Best Hz for given res/bpp #define RESOURCE_STRINGLEN 512 // Guess at largest resource string length #define KEEP_RES_TIMEOUT 15 // how long before reverting to old devmode #define INT_FORMAT_TO_5_DIGITS 10 // Need 3+ more bytes : "%d" -> "12345" // Being safe here (add 10 bytes) // // Constant strings in registry & for starting properties // #define REGSTR_SOFTWARE TEXT("Software\\Microsoft") #define REGSTR_QUICKRES TEXT("Software\\Microsoft\\QuickRes") #define QUICKRES_KEY TEXT("QuickRes") #define DISPLAYPROPERTIES TEXT("rundll32 shell32.dll,Control_RunDLL desk.cpl,,3") #define REGDEVMODES TEXT("GoodDevmodes") #define REGBPP TEXT("BPP") #define REGFLAGS TEXT("Flags") #ifdef UNICODE #define ENUMDISPLAYDEVICES "EnumDisplayDevicesW" #define ENUMDISPLAYSETTINGSEX "EnumDisplaySettingsExW" #else #define ENUMDISPLAYDEVICES "EnumDisplayDevicesA" #define ENUMDISPLAYSETTINGSEX "EnumDisplaySettingsExA" #endif // // Each devmode has 4 additional properties. // typedef struct _DEVMODEINFO { DEVMODE dm; UINT uFreqMenu; UINT uMenuItem; UINT uCDSTest; UINT uValidMode; } DEVMODEINFO, *LPDEVMODEINFO; // // Per monitor information : // devicename, monitorname // devmode menu and freq submenus built on the fly // iModes : number of devmodes // pModes : array of devmodes display can handle // pCurrentdm : pointer (in pModes) to current devmode // bPrimary : primary or not? // typedef struct _QRMONITORINFO { LPTSTR DeviceName; LPTSTR MonitorName; LPTSTR PrimaryMonitorName; HMENU ModeMenu; HMENU *FreqMenu; INT iModes; LPDEVMODEINFO pModes; LPDEVMODEINFO pCurrentdm; BOOL bPrimary; BOOL bAttached; } QRMONITORINFO, *LPQRMONITORINFO; // // prototypes // // quickres.c // HMENU GetModeMenu ( INT, BOOL ); HMENU GetMonitorMenu ( BOOL ); BOOL BuildDevmodeList ( VOID ); BOOL TrayMessage( HWND, DWORD, UINT, HICON ); int MsgBox( int, UINT, UINT ); VOID CheckMenuItemCurrentMode( INT ); PDEVMODE GetCurrentDevMode( INT, PDEVMODE ); LPTSTR GetResourceString( UINT ); VOID DestroyModeMenu( INT, BOOL, BOOL ); VOID AppendMainMenu( VOID ); INT_PTR FAR PASCAL KeepNewResDlgProc( HWND, UINT, WPARAM, LPARAM ); INT_PTR FAR PASCAL NTOptionsDlgProc( HWND, UINT, WPARAM, LPARAM ); INT_PTR FAR PASCAL W95OptionsDlgProc( HWND, UINT, WPARAM, LPARAM ); // // registry.c // VOID SetDevmodeFlags ( INT, BOOL ); VOID GetDevmodeFlags ( INT ); VOID SetQuickResFlags( VOID ); VOID GetQuickResFlags( VOID ); VOID SetRegistryValue( LPTSTR, UINT, PVOID, UINT ); VOID SaveAllSettings ( VOID ); // //Macros // #define fShowModesThatNeedRestart (QuickResFlags & QF_SHOWRESTART) #define fUpdateReg (QuickResFlags & QF_UPDATEREG) #define fRememberModes (QuickResFlags & QF_REMMODES) #define fSortByBPP (QuickResFlags & QF_SORT_BYBPP) #define fHide4BppModes (QuickResFlags & QF_HIDE_4BPP) #define fShowTestedModes (QuickResFlags & QF_SHOWTESTED) #define fShowFreqs (QuickResFlags & QF_SHOWFREQS) // // Devmode info // #define BPP(x) ((x)->dmBitsPerPel) #define XRES(x) ((x)->dmPelsWidth) #define YRES(x) ((x)->dmPelsHeight) #define HZ(x) ((x)->dmDisplayFrequency) #define FREQMENU(x) ((x)->uFreqMenu) #define MENUITEM(x) ((x)->uMenuItem) #define CDSTEST(x) ((x)->uCDSTest) #define VALIDMODE(x) ((x)->uValidMode) // // Must leave MODE_VALID=1, MODE_BESTHZ=3. // Other MODE_* constants should be even #define fGoodMode(x) ((x)->uValidMode & 0x1)