mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
[BROWSEUI] Fix infinite recursion in autocomplete control
import wine commits 9c2217 and 644358, slightly tweaked to fit our code
This commit is contained in:
parent
43556bfff2
commit
5b3e84f2ef
1 changed files with 24 additions and 4 deletions
|
@ -65,8 +65,11 @@ CAutoComplete::~CAutoComplete()
|
||||||
TRACE(" destroying IAutoComplete(%p)\n", this);
|
TRACE(" destroying IAutoComplete(%p)\n", this);
|
||||||
HeapFree(GetProcessHeap(), 0, quickComplete);
|
HeapFree(GetProcessHeap(), 0, quickComplete);
|
||||||
HeapFree(GetProcessHeap(), 0, txtbackup);
|
HeapFree(GetProcessHeap(), 0, txtbackup);
|
||||||
RemovePropW(hwndEdit, autocomplete_propertyW);
|
if (wpOrigEditProc)
|
||||||
SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR)wpOrigEditProc);
|
{
|
||||||
|
SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR)wpOrigEditProc);
|
||||||
|
RemovePropW(hwndEdit, autocomplete_propertyW);
|
||||||
|
}
|
||||||
if (hwndListBox)
|
if (hwndListBox)
|
||||||
DestroyWindow(hwndListBox);
|
DestroyWindow(hwndListBox);
|
||||||
}
|
}
|
||||||
|
@ -148,10 +151,27 @@ HRESULT WINAPI CAutoComplete::Init(HWND hwndEdit, IUnknown *punkACL, LPCOLESTR p
|
||||||
|
|
||||||
this->hwndEdit = hwndEdit;
|
this->hwndEdit = hwndEdit;
|
||||||
this->initialized = TRUE;
|
this->initialized = TRUE;
|
||||||
this->wpOrigEditProc = (WNDPROC)SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR) ACEditSubclassProc);
|
|
||||||
/* Keep at least one reference to the object until the edit window is destroyed. */
|
/* Keep at least one reference to the object until the edit window is destroyed. */
|
||||||
this->AddRef();
|
this->AddRef();
|
||||||
SetPropW( this->hwndEdit, autocomplete_propertyW, (HANDLE)this );
|
|
||||||
|
/* If another AutoComplete object was previously assigned to this edit control,
|
||||||
|
release it but keep the same callback on the control, to avoid an infinite
|
||||||
|
recursive loop in ACEditSubclassProc while the property is set to this object */
|
||||||
|
CAutoComplete *prev = static_cast<CAutoComplete *>(GetPropW(hwndEdit, autocomplete_propertyW));
|
||||||
|
|
||||||
|
if (prev && prev->initialized)
|
||||||
|
{
|
||||||
|
this->wpOrigEditProc = prev->wpOrigEditProc;
|
||||||
|
SetPropW(hwndEdit, autocomplete_propertyW, this);
|
||||||
|
prev->wpOrigEditProc = NULL;
|
||||||
|
prev->Release();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetPropW( this->hwndEdit, autocomplete_propertyW, (HANDLE)this );
|
||||||
|
this->wpOrigEditProc = (WNDPROC)SetWindowLongPtrW(hwndEdit, GWLP_WNDPROC, (LONG_PTR)ACEditSubclassProc);
|
||||||
|
}
|
||||||
|
|
||||||
if (options & ACO_AUTOSUGGEST)
|
if (options & ACO_AUTOSUGGEST)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue