load gorup?

This commit is contained in:
Brady McDermott
2023-10-24 15:43:10 -06:00
parent 2c86c796f5
commit 5e878f98cf
4 changed files with 77 additions and 40 deletions

View File

@@ -106,14 +106,19 @@ HWND CreateGroup(_In_ PGROUP pg)
if (pg == NULL) if (pg == NULL)
return NULL; return NULL;
// error checking, if we get trash don't try to
// make a group out of it
if (pg->dwSignature != GRP_SIGNATURE)
return NULL;
// allocate memory for a new group // allocate memory for a new group
pGroup = (PGROUP)malloc(CalculateGroupMemory(pg, 0)); pGroup = (PGROUP)malloc(CalculateGroupMemory(pg, 0, 0));
if (pGroup == NULL) if (pGroup == NULL)
return NULL; return NULL;
// clean up the memory if it's valid // clean up the memory if it's valid
ZeroMemory(pGroup, CalculateGroupMemory(pg, 0)); ZeroMemory(pGroup, sizeof(*pGroup));
// copy over the group structure // copy over the group structure
*pGroup = *pg; *pGroup = *pg;
@@ -157,7 +162,7 @@ HWND CreateGroup(_In_ PGROUP pg)
DestroyIcon(hIconTemp); DestroyIcon(hIconTemp);
} }
// get the group window rect // Get the group window rect
GetClientRect(hWndGroup, &rcGroupWindow); GetClientRect(hWndGroup, &rcGroupWindow);
// Create the group window ListView control // Create the group window ListView control
@@ -172,18 +177,18 @@ HWND CreateGroup(_In_ PGROUP pg)
// ((LVS_AUTOARRANGE & bAutoArrange) * LVS_AUTOARRANGE) // ((LVS_AUTOARRANGE & bAutoArrange) * LVS_AUTOARRANGE)
// resize it to fit the window // Resize it to fit the window
SetWindowPos(hWndListView, NULL, SetWindowPos(hWndListView, NULL,
rcGroupWindow.left, rcGroupWindow.top, rcGroupWindow.left, rcGroupWindow.top,
rcGroupWindow.right - rcGroupWindow.left, rcGroupWindow.right - rcGroupWindow.left,
rcGroupWindow.bottom - rcGroupWindow.top, SWP_NOZORDER); rcGroupWindow.bottom - rcGroupWindow.top, SWP_NOZORDER);
// add the explorer style because it looks good // Add the explorer style because it looks good
SetWindowTheme(hWndListView, TEXT("Explorer"), NULL); SetWindowTheme(hWndListView, TEXT("Explorer"), NULL);
// get this bad boy an image list // Get this bad boy an image list
// TODO: if cxicon/cyicon change make sure we handle that // TODO: if cxicon/cyicon change make sure we handle that
// don't require a program restart // don't require a program restart, DPI!!!
hImageList = ImageList_Create(GetSystemMetrics(SM_CXICON), hImageList = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON), ILC_COLOR32, 0, 1); GetSystemMetrics(SM_CYICON), ILC_COLOR32, 0, 1);
ListView_SetImageList(hWndListView, hImageList, LVSIL_NORMAL); ListView_SetImageList(hWndListView, hImageList, LVSIL_NORMAL);
@@ -262,7 +267,7 @@ PITEM CreateItem(_In_ HWND hWndGroup, _In_ PITEM pi)
return NULL; return NULL;
// if we reallocate memory then send the new pointer in // if we reallocate memory then send the new pointer in
pNewGroup = realloc(pGroup, CalculateGroupMemory(pGroup, 1)); pNewGroup = realloc(pGroup, CalculateGroupMemory(pGroup, 1, 0));
if (pNewGroup != NULL) if (pNewGroup != NULL)
{ {
pGroup = pNewGroup; pGroup = pNewGroup;
@@ -341,7 +346,7 @@ BOOL ExecuteItem(_In_ PITEM pi)
} }
/* * * *\ /* * * *\
SaveGroup - UpdateGroup -
Updates group information to prepare Updates group information to prepare
it for being saved. it for being saved.
ABSTRACT - ABSTRACT -
@@ -378,7 +383,7 @@ VOID UpdateGroup(_In_ PGROUP pg)
RETURNS - RETURNS -
Size in bytes that a group should take up. Size in bytes that a group should take up.
\* * * */ \* * * */
UINT CalculateGroupMemory(_In_ PGROUP pGroup, _In_ UINT cItems) UINT CalculateGroupMemory(_In_ PGROUP pGroup, _In_ UINT cItems, _In_ BOOL bLean)
{ {
UINT cbGroupSize = 0; UINT cbGroupSize = 0;
UINT cItemBlock = 0; UINT cItemBlock = 0;
@@ -391,6 +396,7 @@ UINT CalculateGroupMemory(_In_ PGROUP pGroup, _In_ UINT cItems)
// have some memory ready // have some memory ready
cItemBlock = pGroup->cItemArray + cItems; cItemBlock = pGroup->cItemArray + cItems;
if (!bLean)
// round the amount of items to the nearest but highest ITEM_BATCH_COUNT // round the amount of items to the nearest but highest ITEM_BATCH_COUNT
cItemBlock = ((cItemBlock + ITEM_BATCH_COUNT) / ITEM_BATCH_COUNT) * ITEM_BATCH_COUNT; cItemBlock = ((cItemBlock + ITEM_BATCH_COUNT) / ITEM_BATCH_COUNT) * ITEM_BATCH_COUNT;

View File

@@ -85,6 +85,6 @@ BOOL ExecuteItem(_In_ PITEM pi);
// Save/Load helper functions // Save/Load helper functions
VOID UpdateGroup(_In_ PGROUP pg); VOID UpdateGroup(_In_ PGROUP pg);
// Helper functions // Helper functions
UINT CalculateGroupMemory(_In_ PGROUP pGroup, _In_ UINT cItems); UINT CalculateGroupMemory(_In_ PGROUP pGroup, _In_ UINT cItems, _In_ BOOL bLean);
// Group Window // Group Window
LRESULT CALLBACK GroupWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK GroupWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

View File

@@ -129,7 +129,7 @@ DWORD RegistrySaveGroup(_In_ PGROUP pg)
// Save group // Save group
UpdateGroup(pg); UpdateGroup(pg);
if (!RegSetValueEx(hKeyProgramGroups, pg->szName, 0, REG_BINARY, if (!RegSetValueEx(hKeyProgramGroups, pg->szName, 0, REG_BINARY,
(const BYTE*)pg, CalculateGroupMemory(pg, 0)) == ERROR_SUCCESS) (const BYTE*)pg, sizeof(*pg)) == ERROR_SUCCESS)
dwConfigStatus = dwConfigStatus && RCE_GROUPS; dwConfigStatus = dwConfigStatus && RCE_GROUPS;
return dwConfigStatus; return dwConfigStatus;
@@ -213,22 +213,7 @@ DWORD SaveConfig(_In_ BOOL bSettings, _In_ BOOL bPos, _In_ BOOL bGroups, _In_ BO
// save each one as an individual subkey based // save each one as an individual subkey based
// on the name of the group // on the name of the group
EnumChildWindows(hWndMDIClient, &SaveWindowEnumProc, bExit); EnumChildWindows(hWndMDIClient, &SaveWindowEnumProc, (LPARAM)bExit);
/*
while ((hWndGroup = (HWND)SendMessage(hWndMDIClient,
WM_MDIGETACTIVE, 0, (LPARAM)NULL)) != NULL)
{
// save it...
dwConfigStatus = dwConfigStatus &&
RegistrySaveGroup((PGROUP)GetWindowLongPtr(hWndGroup,
GWLP_USERDATA));
// close it...
if (!RemoveGroup(hWndGroup, FALSE))
dwConfigStatus = dwConfigStatus && RCE_GROUPS;
}
*/
} }
return dwConfigStatus; return dwConfigStatus;
@@ -248,12 +233,27 @@ DWORD SaveConfig(_In_ BOOL bSettings, _In_ BOOL bPos, _In_ BOOL bGroups, _In_ BO
\* * * */ \* * * */
BOOL CALLBACK SaveWindowEnumProc(HWND hWndGroup, LPARAM lParam) BOOL CALLBACK SaveWindowEnumProc(HWND hWndGroup, LPARAM lParam)
{ {
PGROUP pNewGroup = NULL;
PGROUP pGroup = NULL;
if (hWndGroup == NULL) if (hWndGroup == NULL)
return FALSE; return FALSE;
pGroup = (PGROUP)GetWindowLongPtr(hWndGroup, GWLP_USERDATA);
if (pGroup == NULL)
return FALSE;
// lean it...
pNewGroup = realloc(pGroup, CalculateGroupMemory(pGroup, 1, 1));
if (pNewGroup != NULL)
{
pGroup = pNewGroup;
SetWindowLongPtr(hWndGroup, GWLP_USERDATA, (LONG_PTR)pGroup);
}
// save it... // save it...
if (RegistrySaveGroup((PGROUP)GetWindowLongPtr(hWndGroup, if (RegistrySaveGroup(pGroup) != RCE_SUCCESS)
GWLP_USERDATA)) != RCE_SUCCESS)
return FALSE; return FALSE;
// close it... // close it...
@@ -310,13 +310,14 @@ DWORD LoadConfig(_In_ BOOL bSettings, _In_ BOOL bPos, _In_ BOOL bGroups)
{ {
DWORD dwBufferSize = sizeof(dwSettingsMask); DWORD dwBufferSize = sizeof(dwSettingsMask);
DWORD dwType = REG_BINARY; DWORD dwType = REG_BINARY;
PGROUP pgrp = NULL; PGROUP pGroup = NULL;
UINT cbGroup = 0;
UINT cGroupKeys = 0; UINT cGroupKeys = 0;
UINT cGroupCycle = 0; UINT cGroupIndex = 0;
if (!RegQueryInfoKey(hKeyProgramGroups, NULL, NULL, NULL, if (!(RegQueryInfoKey(hKeyProgramGroups, NULL, NULL, NULL,
NULL, NULL, NULL, &cGroupKeys, NULL, NULL, NULL, &cGroupKeys,
NULL, NULL, NULL, NULL) == ERROR_SUCCESS) NULL, NULL, NULL, NULL) == ERROR_SUCCESS))
{ {
dwConfigStatus = dwConfigStatus && RCE_SETTINGS; dwConfigStatus = dwConfigStatus && RCE_SETTINGS;
@@ -325,13 +326,37 @@ DWORD LoadConfig(_In_ BOOL bSettings, _In_ BOOL bPos, _In_ BOOL bGroups)
return dwConfigStatus; return dwConfigStatus;
} }
if (cGroupKeys < 1) if (cGroupKeys > 0)
{ {
while (cGroupKeys >= cGroupCycle) while (cGroupKeys >= cGroupIndex)
{ {
WCHAR szValueName[MAX_TITLE_LENGTH] = TEXT("");
UINT cbValueName = 0;
// TODO: figure out where i'm really going to store the
// group name, if not in the group structure then in
// the name of the registry key (val 3 here)
// get the size of the group
RegEnumValue(hKeyProgramGroups, cGroupIndex, (LPWSTR)&szValueName,
&cbValueName, NULL, NULL, NULL, &cbGroup);
// allocate memory for the group
pGroup = malloc(cbGroup);
// get the group
RegQueryValueEx(hKeyProgramGroups, (LPWSTR)&szValueName, NULL, NULL,
(LPBYTE)pGroup, &cbGroup);
// load the group
CreateGroup(pGroup);
// free memory
if (pGroup)
free(pGroup);
// increment // increment
cGroupCycle++; cGroupIndex++;
} }
} }
} }

View File

@@ -35,6 +35,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_CREATE: case WM_CREATE:
{ {
// Now we can create the groups
if(LoadConfig(FALSE, FALSE, TRUE) != RCE_SUCCESS)
return FALSE;
// TODO: if loading groups fails, throw an error
return TRUE; return TRUE;
} }