https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0d19ab0b828cd3f13da672...
commit 0d19ab0b828cd3f13da672b2a5018c966479fe90 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Thu Dec 23 19:07:42 2021 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Tue Dec 28 03:20:11 2021 +0100
[SYSDM] Some fixes when resizing the environment variables dialogs.
- Correctly handle the return values for WM_SIZING and WM_SIZE messages.
- Use NULL for hWndInsertAfter parameter of DeferWindowPos() when we don't care about the Z-order.
- Specify SWP_NOMOVE for controls that don't move during resizing.
- Fix the IDOK and IDCANCEL buttons when resizing the environment variables list dialog.
- Fix the dialog "moving" effect that happened whenever an attempt was made to resize the dialog from either of the top/left borders, or the top-right/top-left/bottom-left corners, to a size smaller than the minimal one.
- Use DWLP_USER instead of GWLP_USERDATA when storing user-specific data into the dialog, since the latter can be used internally by the Win32 dialog manager implementation. --- dll/cpl/sysdm/environment.c | 214 +++++++++++++++++++++++++++----------------- 1 file changed, 133 insertions(+), 81 deletions(-)
diff --git a/dll/cpl/sysdm/environment.c b/dll/cpl/sysdm/environment.c index 49f408af182..b648b77e775 100644 --- a/dll/cpl/sysdm/environment.c +++ b/dll/cpl/sysdm/environment.c @@ -430,7 +430,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = BeginDeferWindowPos(5);
- /* For edit control */ + /* For the edit control */ hItemWnd = GetDlgItem(hwndDlg, IDC_VARIABLE_NAME); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); @@ -439,11 +439,11 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, - rect.left, rect.top, + NULL, + 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), rect.bottom - rect.top, - SWP_NOZORDER | SWP_NOACTIVATE); + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_VARIABLE_VALUE); @@ -454,18 +454,18 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, - rect.left, rect.top, + NULL, + 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), rect.bottom - rect.top, - SWP_NOZORDER | SWP_NOACTIVATE); + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } } else if (DlgData->dwDlgID == IDD_EDIT_VARIABLE_FANCY) { hdwp = BeginDeferWindowPos(11);
- /* For list view control */ + /* For the list view control */ hItemWnd = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); @@ -474,15 +474,15 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, - rect.left, rect.top, + NULL, + 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + (cy - DlgData->cyOld), - SWP_NOZORDER | SWP_NOACTIVATE); + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); ListView_SetColumnWidth(hItemWnd, 0, (rect.right - rect.left) + (cx - DlgData->cxOld)); }
- /* For buttons */ + /* For the buttons */ hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_BROWSE_FOLDER); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); @@ -491,7 +491,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, @@ -505,12 +505,12 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, if (hdwp) { hdwp = DeferWindowPos(hdwp, - hItemWnd, - 0, - rect.left + (cx - DlgData->cxOld), - rect.top, - 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); + hItemWnd, + NULL, + rect.left + (cx - DlgData->cxOld), + rect.top, + 0, 0, + SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_EDIT); @@ -521,7 +521,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, @@ -536,7 +536,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, @@ -551,26 +551,26 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
- hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_MOVE_DOWN); - GetWindowRect(hItemWnd, &rect); - MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); + hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_MOVE_DOWN); + GetWindowRect(hItemWnd, &rect); + MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
- if (hdwp) - { - hdwp = DeferWindowPos(hdwp, - hItemWnd, - 0, - rect.left + (cx - DlgData->cxOld), - rect.top, - 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); + if (hdwp) + { + hdwp = DeferWindowPos(hdwp, + hItemWnd, + NULL, + rect.left + (cx - DlgData->cxOld), + rect.top, + 0, 0, + SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_BUTTON_EDIT_TEXT); @@ -579,9 +579,9 @@ OnEnvironmentEditDlgResize(HWND hwndDlg,
if (hdwp) { - hdwp = DeferWindowPos(hdwp, + hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top, 0, 0, @@ -597,7 +597,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, @@ -612,7 +612,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, @@ -628,7 +628,7 @@ OnEnvironmentEditDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, @@ -717,7 +717,7 @@ OnNotifyEditVariableDlg(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData, NMHDR *phdr) switch (phdr->idFrom) { case IDC_LIST_VARIABLE_VALUE: - switch(phdr->code) + switch (phdr->code) { case NM_CLICK: { @@ -769,15 +769,16 @@ EditVariableDlgProc(HWND hwndDlg, PEDIT_DIALOG_DATA DlgData; HWND hwndListView;
- DlgData = (PEDIT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + DlgData = (PEDIT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER); hwndListView = GetDlgItem(hwndDlg, IDC_LIST_VARIABLE_VALUE); + switch (uMsg) { case WM_INITDIALOG: { RECT rect;
- SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)lParam); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); DlgData = (PEDIT_DIALOG_DATA)lParam;
GetClientRect(hwndDlg, &rect); @@ -817,26 +818,56 @@ EditVariableDlgProc(HWND hwndDlg, case WM_SIZE: { OnEnvironmentEditDlgResize(hwndDlg, DlgData, LOWORD(lParam), HIWORD(lParam)); - break; + SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, 0); + return TRUE; }
case WM_SIZING: { - LPRECT pRect = (LPRECT)lParam; + /* Forbid resizing the dialog smaller than its minimal size */ + PRECT pRect = (PRECT)lParam;
- if (pRect->right - pRect->left < DlgData->cxMin) - pRect->right = pRect->left + DlgData->cxMin; + if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) + { + if (pRect->right - pRect->left < DlgData->cxMin) + pRect->left = pRect->right - DlgData->cxMin; + } + else + if ((wParam == WMSZ_RIGHT) || (wParam == WMSZ_TOPRIGHT) || (wParam == WMSZ_BOTTOMRIGHT)) + { + if (pRect->right - pRect->left < DlgData->cxMin) + pRect->right = pRect->left + DlgData->cxMin; + }
- if (pRect->bottom - pRect->top < DlgData->cyMin) - pRect->bottom = pRect->top + DlgData->cyMin; + if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) + { + if (pRect->bottom - pRect->top < DlgData->cyMin) + pRect->top = pRect->bottom - DlgData->cyMin; + } + else + if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) + { + if (pRect->bottom - pRect->top < DlgData->cyMin) + pRect->bottom = pRect->top + DlgData->cyMin; + }
- /* Make sure the normal variable edit dialog doesn't change its width */ + /* Make sure the normal variable edit dialog doesn't change its height */ if (DlgData->dwDlgID == IDD_EDIT_VARIABLE) { - if (pRect->bottom - pRect->top > DlgData->cyMin) - pRect->bottom = pRect->top + DlgData->cyMin; + if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) + { + if (pRect->bottom - pRect->top > DlgData->cyMin) + pRect->top = pRect->bottom - DlgData->cyMin; + } + else + if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) + { + if (pRect->bottom - pRect->top > DlgData->cyMin) + pRect->bottom = pRect->top + DlgData->cyMin; + } }
+ SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, TRUE); return TRUE; }
@@ -1371,7 +1402,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, else y -= (DlgData->cyOld - cy + 1) / 2;
- /* For group box control */ + /* For the group box controls */ hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_GROUP); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); @@ -1380,11 +1411,11 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, - rect.left, rect.top, + NULL, + 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, - SWP_NOZORDER | SWP_NOACTIVATE); + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); }
hItemWnd = GetDlgItem(hwndDlg, IDC_SYSTEM_VARIABLE_GROUP); @@ -1395,14 +1426,14 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left, rect.top + y, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, SWP_NOZORDER | SWP_NOACTIVATE); }
- /* For list view control */ + /* For the list view controls */ hItemWnd = GetDlgItem(hwndDlg, IDC_USER_VARIABLE_LIST); GetWindowRect(hItemWnd, &rect); MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT)); @@ -1411,11 +1442,11 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, - rect.left, rect.top, + NULL, + 0, 0, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, - SWP_NOZORDER | SWP_NOACTIVATE); + SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); Colx = ListView_GetColumnWidth(hItemWnd, 1); ListView_SetColumnWidth(hItemWnd, 1, Colx + (cx - DlgData->cxOld)); } @@ -1428,7 +1459,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left, rect.top + y, (rect.right - rect.left) + (cx - DlgData->cxOld), (rect.bottom - rect.top) + y, @@ -1446,7 +1477,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, @@ -1461,7 +1492,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, @@ -1476,7 +1507,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y, 0, 0, @@ -1491,7 +1522,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, @@ -1506,7 +1537,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, @@ -1521,7 +1552,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + y * 2, 0, 0, @@ -1536,9 +1567,9 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), - rect.top + (cy - DlgData->cyOld * 2), + rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); } @@ -1551,9 +1582,9 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), - rect.top + y * 2, + rect.top + (cy - DlgData->cyOld), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); } @@ -1567,7 +1598,7 @@ OnEnvironmentDlgResize(HWND hwndDlg, { hdwp = DeferWindowPos(hdwp, hItemWnd, - 0, + NULL, rect.left + (cx - DlgData->cxOld), rect.top + (cy - DlgData->cyOld), 0, 0, @@ -1764,7 +1795,7 @@ SetAllVars(HWND hwndDlg, static BOOL OnNotify(HWND hwndDlg, NMHDR *phdr) { - switch(phdr->code) + switch (phdr->code) { case NM_DBLCLK: if (phdr->idFrom == IDC_USER_VARIABLE_LIST || @@ -1798,7 +1829,7 @@ EnvironmentDlgProc(HWND hwndDlg, LPARAM lParam) { PENVIRONMENT_DIALOG_DATA DlgData; - DlgData = (PENVIRONMENT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + DlgData = (PENVIRONMENT_DIALOG_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg) { @@ -1812,7 +1843,7 @@ EnvironmentDlgProc(HWND hwndDlg, EndDialog(hwndDlg, 0); return (INT_PTR)TRUE; } - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)DlgData); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)DlgData);
GetClientRect(hwndDlg, &rect); DlgData->cxOld = rect.right - rect.left; @@ -1829,19 +1860,40 @@ EnvironmentDlgProc(HWND hwndDlg, case WM_SIZE: { OnEnvironmentDlgResize(hwndDlg, DlgData, LOWORD(lParam), HIWORD(lParam)); - break; + SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, 0); + return TRUE; }
case WM_SIZING: { - LPRECT pRect = (LPRECT)lParam; + /* Forbid resizing the dialog smaller than its minimal size */ + PRECT pRect = (PRECT)lParam;
- if (pRect->right - pRect->left < DlgData->cxMin) - pRect->right = pRect->left + DlgData->cxMin; + if ((wParam == WMSZ_LEFT) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_BOTTOMLEFT)) + { + if (pRect->right - pRect->left < DlgData->cxMin) + pRect->left = pRect->right - DlgData->cxMin; + } + else + if ((wParam == WMSZ_RIGHT) || (wParam == WMSZ_TOPRIGHT) || (wParam == WMSZ_BOTTOMRIGHT)) + { + if (pRect->right - pRect->left < DlgData->cxMin) + pRect->right = pRect->left + DlgData->cxMin; + }
- if (pRect->bottom - pRect->top < DlgData->cyMin) - pRect->bottom = pRect->top + DlgData->cyMin; + if ((wParam == WMSZ_TOP) || (wParam == WMSZ_TOPLEFT) || (wParam == WMSZ_TOPRIGHT)) + { + if (pRect->bottom - pRect->top < DlgData->cyMin) + pRect->top = pRect->bottom - DlgData->cyMin; + } + else + if ((wParam == WMSZ_BOTTOM) || (wParam == WMSZ_BOTTOMLEFT) || (wParam == WMSZ_BOTTOMRIGHT)) + { + if (pRect->bottom - pRect->top < DlgData->cyMin) + pRect->bottom = pRect->top + DlgData->cyMin; + }
+ SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, TRUE); return TRUE; }