[PATCH v3 2/5] shell32/autocomplete: Send some messages directly to the edit control's procedure

Gabriel Ivăncescu gabrielopcode at gmail.com
Sat Sep 22 09:53:43 CDT 2018


Send some of the messages directly to the edit control's window procedure
to match Windows behavior and to be able to process WM_SETTEXT.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

v3: Keep SendMessage when retrieving the text.

 dlls/shell32/autocomplete.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/dlls/shell32/autocomplete.c b/dlls/shell32/autocomplete.c
index 048a47f..2f63d88 100644
--- a/dlls/shell32/autocomplete.c
+++ b/dlls/shell32/autocomplete.c
@@ -100,6 +100,14 @@ static inline IAutoCompleteImpl *impl_from_IAutoCompleteDropDown(IAutoCompleteDr
     return CONTAINING_RECORD(iface, IAutoCompleteImpl, IAutoCompleteDropDown_iface);
 }
 
+static void set_text_and_selection(IAutoCompleteImpl *ac, HWND hwnd, WCHAR *text, WPARAM start, LPARAM end)
+{
+    /* Send it directly to the edit control to match Windows behavior */
+    WNDPROC proc = ac->wpOrigEditProc;
+    if (CallWindowProcW(proc, hwnd, WM_SETTEXT, 0, (LPARAM)text))
+        CallWindowProcW(proc, hwnd, EM_SETSEL, start, end);
+}
+
 static size_t format_quick_complete(WCHAR *dst, const WCHAR *qc, const WCHAR *str, size_t str_len)
 {
     /* Replace the first %s directly without using snprintf, to avoid
@@ -142,8 +150,7 @@ static void autoappend_str(IAutoCompleteImpl *ac, WCHAR *text, UINT len, WCHAR *
     }
     else tmp = str;
 
-    SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)tmp);
-    SendMessageW(hwnd, EM_SETSEL, len, size - 1);
+    set_text_and_selection(ac, hwnd, tmp, len, size - 1);
     if (tmp != str)
         heap_free(tmp);
 }
@@ -256,8 +263,7 @@ static LRESULT ACEditSubclassProc_KeyDown(IAutoCompleteImpl *ac, HWND hwnd, UINT
                 if ((buf = heap_alloc(sz * sizeof(WCHAR))))
                 {
                     len = format_quick_complete(buf, ac->quickComplete, text, len);
-                    SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)buf);
-                    SendMessageW(hwnd, EM_SETSEL, 0, len);
+                    set_text_and_selection(ac, hwnd, buf, 0, len);
                     heap_free(buf);
                 }
 
@@ -309,16 +315,13 @@ static LRESULT ACEditSubclassProc_KeyDown(IAutoCompleteImpl *ac, HWND hwnd, UINT
                     if (!(msg = heap_alloc((len + 1) * sizeof(WCHAR))))
                         return 0;
                     len = SendMessageW(ac->hwndListBox, LB_GETTEXT, sel, (LPARAM)msg);
-                    SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)msg);
-                    SendMessageW(hwnd, EM_SETSEL, len, len);
+                    set_text_and_selection(ac, hwnd, msg, len, len);
                     heap_free(msg);
                 }
                 else
                 {
-                    UINT len;
-                    SendMessageW(hwnd, WM_SETTEXT, 0, (LPARAM)ac->txtbackup);
-                    len = strlenW(ac->txtbackup);
-                    SendMessageW(hwnd, EM_SETSEL, len, len);
+                    UINT len = strlenW(ac->txtbackup);
+                    set_text_and_selection(ac, hwnd, ac->txtbackup, len, len);
                 }
                 return 0;
             }
@@ -409,8 +412,7 @@ static LRESULT APIENTRY ACLBoxSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam,
             if (!(msg = heap_alloc((len + 1) * sizeof(WCHAR))))
                 break;
             len = SendMessageW(hwnd, LB_GETTEXT, sel, (LPARAM)msg);
-            SendMessageW(This->hwndEdit, WM_SETTEXT, 0, (LPARAM)msg);
-            SendMessageW(This->hwndEdit, EM_SETSEL, 0, len);
+            set_text_and_selection(This, This->hwndEdit, msg, 0, len);
             ShowWindow(hwnd, SW_HIDE);
             heap_free(msg);
             break;
-- 
1.9.1




More information about the wine-devel mailing list