[PATCH 14/17] shell32/autocomplete: Reset the contents of the AutoComplete listbox when hiding it
Gabriel Ivăncescu
gabrielopcode at gmail.com
Wed Sep 5 11:13:16 CDT 2018
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/shell32/autocomplete.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/dlls/shell32/autocomplete.c b/dlls/shell32/autocomplete.c
index 9bc617b..c5bc582 100644
--- a/dlls/shell32/autocomplete.c
+++ b/dlls/shell32/autocomplete.c
@@ -109,6 +109,14 @@ static void set_text_and_selection(IAutoCompleteImpl *This, HWND hwnd, WCHAR *te
CallWindowProcW(proc, hwnd, EM_SETSEL, start, end);
}
+static void hide_listbox(IAutoCompleteImpl *ac, HWND hwnd)
+{
+ /* hide the AutoComplete listbox but also reset its contents to avoid
+ memory use buildup for tons of edit controls with AutoComplete */
+ ShowWindow(hwnd, SW_HIDE);
+ send_to_LB(ac, hwnd, LB_RESETCONTENT, 0, 0);
+}
+
static void destroy_autocomplete_object(IAutoCompleteImpl *ac)
{
ac->hwndEdit = NULL;
@@ -137,12 +145,12 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
{
case CB_SHOWDROPDOWN:
if (This->options & ACO_AUTOSUGGEST)
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
break;
case WM_KILLFOCUS:
if ((This->options & ACO_AUTOSUGGEST) && ((HWND)wParam != This->hwndListBox))
{
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
}
return CallWindowProcW(This->wpOrigEditProc, hwnd, uMsg, wParam, lParam);
case WM_KEYDOWN:
@@ -181,7 +189,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
This->no_fwd_char = '\n'; /* CTRL+RETURN char */
if (This->options & ACO_AUTOSUGGEST)
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
heap_free(hwndText);
return 0;
}
@@ -196,13 +204,13 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
len = send_to_LB(This, hwndListBox, LB_GETTEXT, sel, (LPARAM)hwndText);
set_text_and_selection(This, hwnd, hwndText, 0, len);
This->no_fwd_char = '\r'; /* RETURN char */
- ShowWindow(hwndListBox, SW_HIDE);
+ hide_listbox(This, hwndListBox);
heap_free(hwndText);
return 0;
}
}
}
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
}
break;
case VK_UP:
@@ -267,7 +275,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
edit_proc = edit_proc == ACEditSubclassProc ? This->wpOrigEditProc : edit_proc;
len = CallWindowProcW(edit_proc, hwnd, WM_GETTEXTLENGTH, 0, 0);
if ((This->options & ACO_AUTOSUGGEST) && len == 0) {
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
return ret;
}
if (wParam != 0x16 /* ^V (paste) */)
@@ -360,7 +368,7 @@ static LRESULT APIENTRY ACEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
SWP_SHOWWINDOW );
send_to_LB(This, This->hwndListBox, WM_SETREDRAW, TRUE, 0);
} else {
- ShowWindow(This->hwndListBox, SW_HIDE);
+ hide_listbox(This, This->hwndListBox);
}
}
return ret;
@@ -400,7 +408,7 @@ static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
if ((msg = heap_alloc((len + 1)*sizeof(WCHAR)))) {
len = send_to_LB(This, hwnd, LB_GETTEXT, sel, (LPARAM)msg);
set_text_and_selection(This, This->hwndEdit, msg, 0, len);
- ShowWindow(hwnd, SW_HIDE);
+ hide_listbox(This, hwnd);
heap_free(msg);
}
break;
--
1.9.1
More information about the wine-devel
mailing list