From 50c38d2b74f3747778852117a4b1fda8222eba8c Mon Sep 17 00:00:00 2001 From: freedom Date: Sun, 23 Jul 2023 19:25:06 -0600 Subject: [PATCH] registry saves window position now, fixed saveconfig dying on savesettings (something something bit shifting) --- progmgr/progmgr.c | 15 ++++++----- progmgr/registry.c | 65 ++++++++++++++++++++++++++++++---------------- progmgr/registry.h | 1 + progmgr/wndproc.c | 10 ++++--- 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/progmgr/progmgr.c b/progmgr/progmgr.c index 03750bc..e8a90dd 100644 --- a/progmgr/progmgr.c +++ b/progmgr/progmgr.c @@ -62,7 +62,8 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi // Register the Frame Window wc.lpfnWndProc = WndProc; wc.hInstance = hAppInstance; - wc.hIcon = hProgMgrIcon = LoadImage(hAppInstance, MAKEINTRESOURCE(IDI_PROGMGR), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); + wc.hIcon = hProgMgrIcon = LoadImage(hAppInstance, MAKEINTRESOURCE(IDI_PROGMGR), IMAGE_ICON, + 0, 0, LR_DEFAULTSIZE | LR_SHARED); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND); wc.lpszMenuName = MAKEINTRESOURCE(IDM_MAIN); @@ -95,11 +96,9 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi StringCchCat(szWindowTitle, ARRAYSIZE(szWindowTitle), szUsername); } - - if (!CreateWindow(wc.lpszClassName, - szWindowTitle, - WS_OVERLAPPEDWINDOW | WS_VISIBLE, - 160, 80, 640, 480, 0, 0, hAppInstance, NULL)) + if (!CreateWindow(wc.lpszClassName, szWindowTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, + rcMainWindow.left, rcMainWindow.top, rcMainWindow.right - rcMainWindow.left, rcMainWindow.bottom - rcMainWindow.top, + 0, 0, hAppInstance, NULL)) return 2; // Load the menus... @@ -113,6 +112,10 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi UpdateChecks(bShowUsername, IDM_OPTIONS, IDM_OPTIONS_SHOWUSERNAME); UpdateChecks(bSaveSettings, IDM_OPTIONS, IDM_OPTIONS_SAVESETTINGS); + // Update settings based on their values + if (bTopMost) + SetWindowPos(hWndProgMgr, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + if (bIsDefaultShell) { // Modify the context menus since we're the default shell diff --git a/progmgr/registry.c b/progmgr/registry.c index b1957ce..a923e1f 100644 --- a/progmgr/registry.c +++ b/progmgr/registry.c @@ -119,22 +119,34 @@ BOOL IsProgMgrDefaultShell() \* * * */ BOOL SaveConfig() { - // Shrink the settings into the bitmask + BOOL bConfigStatus = TRUE; + WINDOWPLACEMENT wpProgMgr; + RECT rcWindow; + + // Shrink the settings into the bitmask and save it + // There's definitely a better way to do this but... + // I'll get to it later :) dwSettingsMask = - (bAutoArrange * PMS_AUTOARRANGE) | - (bMinOnRun * PMS_MINONRUN) | - (bTopMost * PMS_TOPMOST) | - (bShowUsername * PMS_SHOWUSERNAME) | - (bSaveSettings * PMS_SAVESETTINGS); + (bAutoArrange && PMS_AUTOARRANGE) * PMS_AUTOARRANGE | + (bMinOnRun && PMS_MINONRUN) * PMS_MINONRUN | + (bTopMost && PMS_TOPMOST) * PMS_TOPMOST | + (bShowUsername && PMS_SHOWUSERNAME) * PMS_SHOWUSERNAME | + (bSaveSettings && PMS_SAVESETTINGS) * PMS_SAVESETTINGS; - // Save settings bitmask - if (RegSetValueEx(hKeySettings, pszSettingsMask, 0, REG_DWORD, - &dwSettingsMask, sizeof(DWORD)) == ERROR_SUCCESS) - { - return TRUE; - } + if (!RegSetValueEx(hKeySettings, pszSettingsMask, 0, REG_DWORD, + &dwSettingsMask, sizeof(dwSettingsMask)) == ERROR_SUCCESS) + bConfigStatus = FALSE; + + // Get and save window position + wpProgMgr.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hWndProgMgr, &wpProgMgr); + CopyRect(&rcWindow, &wpProgMgr.rcNormalPosition); - return FALSE; + if (!RegSetValueEx(hKeySettings, pszSettingsWindow, 0, REG_BINARY, + &rcWindow, sizeof(rcWindow)) == ERROR_SUCCESS) + bConfigStatus = FALSE; + + return bConfigStatus; } /* * * *\ @@ -146,20 +158,27 @@ BOOL SaveConfig() \* * * */ BOOL LoadConfig() { + BOOL bConfigStatus = TRUE; DWORD dwType; DWORD dwBufferSize = sizeof(dwSettingsMask); + DWORD dwRectBufferSize = sizeof(rcMainWindow); // Load settings bitmask - if (RegQueryValueEx(hKeySettings, pszSettingsMask, 0, &dwType, + if (!RegQueryValueEx(hKeySettings, pszSettingsMask, 0, &dwType, &dwSettingsMask, &dwBufferSize) == ERROR_SUCCESS) - { - bAutoArrange = (dwSettingsMask & PMS_AUTOARRANGE); - bMinOnRun = (dwSettingsMask & PMS_MINONRUN); - bTopMost = (dwSettingsMask) & (PMS_TOPMOST); - bSaveSettings = (dwSettingsMask & PMS_SAVESETTINGS); - bShowUsername = (dwSettingsMask & PMS_SHOWUSERNAME); - return TRUE; - } + bConfigStatus = FALSE; + + // Apply bitmask to booleans + bAutoArrange = (dwSettingsMask & PMS_AUTOARRANGE); + bMinOnRun = (dwSettingsMask & PMS_MINONRUN); + bTopMost = (dwSettingsMask & PMS_TOPMOST); + bSaveSettings = (dwSettingsMask & PMS_SAVESETTINGS); + bShowUsername = (dwSettingsMask & PMS_SHOWUSERNAME); - return FALSE; + // Load window position... and apply it! + if (!RegQueryValueEx(hKeySettings, pszSettingsWindow, 0, &dwType, + &rcMainWindow, &dwRectBufferSize) == ERROR_SUCCESS) + bConfigStatus = FALSE; + + return bConfigStatus; } \ No newline at end of file diff --git a/progmgr/registry.h b/progmgr/registry.h index b371be7..f6eee33 100644 --- a/progmgr/registry.h +++ b/progmgr/registry.h @@ -38,6 +38,7 @@ extern BOOL bMinOnRun; extern BOOL bTopMost; extern BOOL bShowUsername; extern BOOL bSaveSettings; +extern RECT rcMainWindow; /* Function Prototypes */ BOOL InitializeRegistryKeys(VOID); diff --git a/progmgr/wndproc.c b/progmgr/wndproc.c index 0d57f56..d491c76 100644 --- a/progmgr/wndproc.c +++ b/progmgr/wndproc.c @@ -66,10 +66,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; } if (wParam == IDM_FILE_EXIT) - { - CmdProc(hWnd, wParam, lParam); - break; - } if (wParam == IDM_FILE_RUN) { CmdProc(hWnd, wParam, lParam); @@ -90,6 +86,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) PostQuitMessage(0); break; + case WM_ENDSESSION: + PostQuitMessage(0); + break; + default: WndProcDefault: return DefFrameProc(hWnd, hWndMDIClient, message, wParam, lParam); @@ -132,8 +132,10 @@ LRESULT CALLBACK CmdProc(HWND hWnd, WPARAM wParam, LPARAM lParam) case IDM_OPTIONS_TOPMOST: bTopMost = !bTopMost; + SetWindowPos(hWndProgMgr, bTopMost ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER | SWP_NOSIZE); UpdateChecks(bTopMost, IDM_OPTIONS, IDM_OPTIONS_TOPMOST); goto SaveConfig; + case IDM_OPTIONS_SHOWUSERNAME: bShowUsername = !bShowUsername; UpdateChecks(bShowUsername, IDM_OPTIONS, IDM_OPTIONS_SHOWUSERNAME);