[PATCH 5/5] riched20: The text host should create the text services object.

Huw Davies huw at codeweavers.com
Wed Mar 3 05:29:41 CST 2021


For now, we hold on to the editor too; this will eventually go away.

Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/riched20/editor.h  |  3 +++
 dlls/riched20/txthost.c | 30 +++++++++++++----------
 dlls/riched20/txtsrv.c  | 53 ++++++++++++++++++++++-------------------
 3 files changed, 49 insertions(+), 37 deletions(-)

diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index e226bc02921..38d99f4351a 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -377,6 +377,9 @@ BOOL ME_Undo(ME_TextEditor *editor) DECLSPEC_HIDDEN;
 BOOL ME_Redo(ME_TextEditor *editor) DECLSPEC_HIDDEN;
 void ME_EmptyUndoStack(ME_TextEditor *editor) DECLSPEC_HIDDEN;
 
+/* txtsrv.c */
+HRESULT create_text_services( IUnknown *outer, ITextHost *text_host, IUnknown **unk, BOOL emulate_10, ME_TextEditor **editor ) DECLSPEC_HIDDEN;
+
 /* writer.c */
 LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream) DECLSPEC_HIDDEN;
 LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index d0b43add364..1da34555352 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -36,6 +36,8 @@ struct host
 {
     ITextHost ITextHost_iface;
     LONG ref;
+    ITextServices *text_srv;
+    ME_TextEditor *editor; /* to be removed */
     HWND window;
     BOOL emulate_10;
     PARAFORMAT2 para_fmt;
@@ -46,7 +48,7 @@ static const ITextHostVtbl textHostVtbl;
 static BOOL listbox_registered;
 static BOOL combobox_registered;
 
-static ITextHost *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
+struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
 {
     struct host *texthost;
 
@@ -66,7 +68,7 @@ static ITextHost *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
     if (cs->style & ES_CENTER)
         texthost->para_fmt.wAlignment = PFA_CENTER;
 
-    return &texthost->ITextHost_iface;
+    return texthost;
 }
 
 static inline struct host *impl_from_ITextHost( ITextHost *iface )
@@ -104,6 +106,7 @@ static ULONG WINAPI ITextHostImpl_Release(ITextHost *iface)
     if (!ref)
     {
         SetWindowLongPtrW( host->window, 0, 0 );
+        ITextServices_Release( host->text_srv );
         CoTaskMemFree( host );
     }
     return ref;
@@ -723,24 +726,27 @@ static const char *get_msg_name( UINT msg )
 
 static BOOL create_windowed_editor( HWND hwnd, CREATESTRUCTW *create, BOOL emulate_10 )
 {
-    ITextHost *host = host_create( hwnd, create, emulate_10 );
-    ME_TextEditor *editor;
+    struct host *host = host_create( hwnd, create, emulate_10 );
+    IUnknown *unk;
+    HRESULT hr;
 
     if (!host) return FALSE;
 
-    editor = ME_MakeEditor( host, emulate_10 );
-    if (!editor)
+    hr = create_text_services( NULL, &host->ITextHost_iface, &unk, emulate_10, &host->editor );
+    if (FAILED( hr ))
     {
-        ITextHost_Release( host );
+        ITextHost_Release( &host->ITextHost_iface );
         return FALSE;
     }
+    IUnknown_QueryInterface( unk, &IID_ITextServices, (void **)&host->text_srv );
+    IUnknown_Release( unk );
 
-    editor->exStyleFlags = GetWindowLongW( hwnd, GWL_EXSTYLE );
-    editor->styleFlags |= GetWindowLongW( hwnd, GWL_STYLE ) & ES_WANTRETURN;
-    editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */
-    editor->hwndParent = create->hwndParent;
+    host->editor->exStyleFlags = GetWindowLongW( hwnd, GWL_EXSTYLE );
+    host->editor->styleFlags |= GetWindowLongW( hwnd, GWL_STYLE ) & ES_WANTRETURN;
+    host->editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */
+    host->editor->hwndParent = create->hwndParent;
 
-    SetWindowLongPtrW( hwnd, 0, (LONG_PTR)editor );
+    SetWindowLongPtrW( hwnd, 0, (LONG_PTR)host->editor );
 
     return TRUE;
 }
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index fc8d6765424..3d0eec6f769 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -368,33 +368,36 @@ static const ITextServicesVtbl textservices_vtbl =
     THISCALL(fnTextSrv_TxGetCachedSize)
 };
 
+HRESULT create_text_services( IUnknown *outer, ITextHost *text_host, IUnknown **unk, BOOL emulate_10,
+                              ME_TextEditor **editor )
+{
+    struct text_services *services;
+
+    TRACE( "%p %p --> %p\n", outer, text_host, unk );
+    if (text_host == NULL) return E_POINTER;
+
+    services = CoTaskMemAlloc( sizeof(*services) );
+    if (services == NULL) return E_OUTOFMEMORY;
+    InitializeCriticalSection( &services->csTxtSrv );
+    services->csTxtSrv.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ITextServicesImpl.csTxtSrv");
+    services->ref = 1;
+    services->host = text_host; /* Don't take a ref of the host - this would lead to a mutual dependency */
+    services->IUnknown_inner.lpVtbl = &textservices_inner_vtbl;
+    services->ITextServices_iface.lpVtbl = &textservices_vtbl;
+    services->editor = ME_MakeEditor( text_host, emulate_10 );
+    if (editor) *editor = services->editor; /* To be removed */
+
+    if (outer) services->outer_unk = outer;
+    else services->outer_unk = &services->IUnknown_inner;
+
+    *unk = &services->IUnknown_inner;
+    return S_OK;
+}
+
 /******************************************************************
  *        CreateTextServices (RICHED20.4)
  */
-HRESULT WINAPI CreateTextServices(IUnknown  *pUnkOuter, ITextHost *pITextHost, IUnknown  **ppUnk)
+HRESULT WINAPI CreateTextServices( IUnknown *outer, ITextHost *text_host, IUnknown **unk )
 {
-   struct text_services *ITextImpl;
-
-   TRACE("%p %p --> %p\n", pUnkOuter, pITextHost, ppUnk);
-   if (pITextHost == NULL)
-      return E_POINTER;
-
-   ITextImpl = CoTaskMemAlloc(sizeof(*ITextImpl));
-   if (ITextImpl == NULL)
-      return E_OUTOFMEMORY;
-   InitializeCriticalSection(&ITextImpl->csTxtSrv);
-   ITextImpl->csTxtSrv.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ITextServicesImpl.csTxtSrv");
-   ITextImpl->ref = 1;
-   ITextImpl->host = pITextHost; /* Don't take a ref of the host - this would lead to a mutual dependency */
-   ITextImpl->IUnknown_inner.lpVtbl = &textservices_inner_vtbl;
-   ITextImpl->ITextServices_iface.lpVtbl = &textservices_vtbl;
-   ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE);
-
-   if (pUnkOuter)
-      ITextImpl->outer_unk = pUnkOuter;
-   else
-      ITextImpl->outer_unk = &ITextImpl->IUnknown_inner;
-
-   *ppUnk = &ITextImpl->IUnknown_inner;
-   return S_OK;
+    return create_text_services( outer, text_host, unk, FALSE, NULL );
 }
-- 
2.23.0




More information about the wine-devel mailing list