[MSCTF] Make ITfLangBarMgr C++ (#8056)

Implementing missing features...
JIRA issue: CORE-19361
- Delete langbarmgr.c (C) and add
  langbarmgr.cpp (C++).
- Remove the legacy C
  implementation of ITfLangBarMgr.
- Add CLangBarMgr class.
This commit is contained in:
Katayama Hirofumi MZ 2025-06-02 05:07:49 +09:00 committed by GitHub
parent ddcd5f7083
commit 52ca35327e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 292 additions and 199 deletions

View file

@ -11,7 +11,6 @@ list(APPEND SOURCE
displayattributemgr.c
documentmgr.c
inputprocessor.c
langbarmgr.c
msctf.c
range.c
threadmgr.c
@ -19,6 +18,7 @@ list(APPEND SOURCE
${CMAKE_CURRENT_BINARY_DIR}/msctf_stubs.c)
list(APPEND PCH_SKIP_SOURCE
langbarmgr.cpp
mlng.cpp
utils.cpp)

View file

@ -1,198 +0,0 @@
/*
* ITfLangBarMgr implementation
*
* Copyright 2010 Justin Chevrier
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include "wine/debug.h"
#include "winbase.h"
#include "winreg.h"
#include "shlwapi.h"
#include "msctf.h"
#include "msctf_internal.h"
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
typedef struct tagLangBarMgr {
ITfLangBarMgr ITfLangBarMgr_iface;
LONG refCount;
} LangBarMgr;
static inline LangBarMgr *impl_from_ITfLangBarMgr(ITfLangBarMgr *iface)
{
return CONTAINING_RECORD(iface, LangBarMgr, ITfLangBarMgr_iface);
}
static void LangBarMgr_Destructor(LangBarMgr *This)
{
TRACE("destroying %p\n", This);
HeapFree(GetProcessHeap(),0,This);
}
static HRESULT WINAPI LangBarMgr_QueryInterface(ITfLangBarMgr *iface, REFIID iid, LPVOID *ppvOut)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
*ppvOut = NULL;
if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfLangBarMgr))
{
*ppvOut = &This->ITfLangBarMgr_iface;
}
if (*ppvOut)
{
ITfLangBarMgr_AddRef(iface);
return S_OK;
}
WARN("unsupported interface: %s\n", debugstr_guid(iid));
return E_NOINTERFACE;
}
static ULONG WINAPI LangBarMgr_AddRef(ITfLangBarMgr *iface)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
return InterlockedIncrement(&This->refCount);
}
static ULONG WINAPI LangBarMgr_Release(ITfLangBarMgr *iface)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
ULONG ret;
ret = InterlockedDecrement(&This->refCount);
if (ret == 0)
LangBarMgr_Destructor(This);
return ret;
}
/*****************************************************
* ITfLangBarMgr functions
*****************************************************/
static HRESULT WINAPI LangBarMgr_AdviseEventSink( ITfLangBarMgr* iface, ITfLangBarEventSink *pSink, HWND hwnd, DWORD dwflags, DWORD *pdwCookie)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_UnAdviseEventSink( ITfLangBarMgr* iface, DWORD dwCookie)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_GetThreadMarshalInterface( ITfLangBarMgr* iface, DWORD dwThreadId, DWORD dwType, REFIID riid, IUnknown **ppunk)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_GetThreadLangBarItemMgr( ITfLangBarMgr* iface, DWORD dwThreadId, ITfLangBarItemMgr **pplbi, DWORD *pdwThreadid)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_GetInputProcessorProfiles( ITfLangBarMgr* iface, DWORD dwThreadId, ITfInputProcessorProfiles **ppaip, DWORD *pdwThreadid)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_RestoreLastFocus( ITfLangBarMgr* iface, DWORD *dwThreadId, BOOL fPrev)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_SetModalInput( ITfLangBarMgr* iface, ITfLangBarEventSink *pSink, DWORD dwThreadId, DWORD dwFlags)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_ShowFloating( ITfLangBarMgr* iface, DWORD dwFlags)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI LangBarMgr_GetShowFloatingStatus( ITfLangBarMgr* iface, DWORD *pdwFlags)
{
LangBarMgr *This = impl_from_ITfLangBarMgr(iface);
FIXME("STUB:(%p)\n",This);
return E_NOTIMPL;
}
static const ITfLangBarMgrVtbl LangBarMgr_LangBarMgrVtbl =
{
LangBarMgr_QueryInterface,
LangBarMgr_AddRef,
LangBarMgr_Release,
LangBarMgr_AdviseEventSink,
LangBarMgr_UnAdviseEventSink,
LangBarMgr_GetThreadMarshalInterface,
LangBarMgr_GetThreadLangBarItemMgr,
LangBarMgr_GetInputProcessorProfiles,
LangBarMgr_RestoreLastFocus,
LangBarMgr_SetModalInput,
LangBarMgr_ShowFloating,
LangBarMgr_GetShowFloatingStatus
};
HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
{
LangBarMgr *This;
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
This = HeapAlloc(GetProcessHeap(),0,sizeof(LangBarMgr));
if (This == NULL)
return E_OUTOFMEMORY;
This->ITfLangBarMgr_iface.lpVtbl = &LangBarMgr_LangBarMgrVtbl;
This->refCount = 1;
*ppOut = (IUnknown *)&This->ITfLangBarMgr_iface;
TRACE("returning %p\n", *ppOut);
return S_OK;
}

View file

@ -0,0 +1,283 @@
/*
* PROJECT: ReactOS CTF
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: ITfLangBarMgr implementation
* COPYRIGHT: Copyright 2010 Justin Chevrier
* Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include <initguid.h>
#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <msctf.h>
#include <msctf_undoc.h>
// Cicero
#include <cicbase.h>
#include <cicreg.h>
#include <cicutb.h>
#include "msctf_internal.h"
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
//*****************************************************************************************
class CLangBarMgr : public ITfLangBarMgr_P
{
public:
CLangBarMgr();
virtual ~CLangBarMgr();
// ** IUnknown interface **
STDMETHODIMP QueryInterface(_In_ REFIID riid, _Out_ PVOID *ppvObj) override;
STDMETHODIMP_(ULONG) AddRef() override;
STDMETHODIMP_(ULONG) Release() override;
// ** ITfLangBarMgr interface **
STDMETHODIMP AdviseEventSink(
_In_ ITfLangBarEventSink *pSink,
_In_ HWND hwnd,
_In_ DWORD dwflags,
_In_ DWORD *pdwCookie) override;
STDMETHODIMP UnAdviseEventSink(_In_ DWORD dwCookie) override;
STDMETHODIMP GetThreadMarshalInterface(
_In_ DWORD dwThreadId,
_In_ DWORD dwType,
_In_ REFIID riid,
_Out_ IUnknown **ppunk) override;
STDMETHODIMP GetThreadLangBarItemMgr(
_In_ DWORD dwThreadId,
_Out_ ITfLangBarItemMgr **pplbie,
_Out_ DWORD *pdwThreadid) override;
STDMETHODIMP GetInputProcessorProfiles(
_In_ DWORD dwThreadId,
_Out_ ITfInputProcessorProfiles **ppaip,
_Out_ DWORD *pdwThreadid) override;
STDMETHODIMP RestoreLastFocus(_Out_ DWORD *dwThreadId, _In_ BOOL fPrev) override;
STDMETHODIMP SetModalInput(
_In_ ITfLangBarEventSink *pSink,
_In_ DWORD dwThreadId,
_In_ DWORD dwFlags) override;
STDMETHODIMP ShowFloating(_In_ DWORD dwFlags) override;
STDMETHODIMP GetShowFloatingStatus(_Out_ DWORD *pdwFlags) override;
// ** ITfLangBarMgr_P interface **
STDMETHODIMP GetPrevShowFloatingStatus(_Inout_ DWORD* pdwStatus) override;
protected:
LONG m_cRefs;
static BOOL CheckFloatingBits(_In_ DWORD dwBits);
static HRESULT s_GetShowFloatingStatus(_Out_ DWORD *pdwFlags);
static HRESULT s_ShowFloating(_In_ DWORD dwFlags);
};
// The groups of mutually exclusive TF_SFT_... bits
#define TF_SFT_VISIBILITY_GROUP \
(TF_SFT_SHOWNORMAL | TF_SFT_DOCK | TF_SFT_MINIMIZED | TF_SFT_HIDDEN | TF_SFT_DESKBAND)
#define TF_SFT_TRANSPARENCY_GROUP \
(TF_SFT_NOTRANSPARENCY | TF_SFT_LOWTRANSPARENCY | TF_SFT_HIGHTRANSPARENCY)
#define TF_SFT_LABEL_GROUP (TF_SFT_LABELS | TF_SFT_NOLABELS)
#define TF_SFT_EXTRA_ICON_GROUP (TF_SFT_EXTRAICONSONMINIMIZED | TF_SFT_NOEXTRAICONSONMINIMIZED)
static inline BOOL
IsSingleBitSet(DWORD dwValue)
{
return (dwValue != 0) && ((dwValue & (dwValue - 1)) == 0);
}
//*****************************************************************************************
CLangBarMgr::CLangBarMgr() : m_cRefs(1)
{
}
CLangBarMgr::~CLangBarMgr()
{
}
BOOL CLangBarMgr::CheckFloatingBits(_In_ DWORD dwBits)
{
return IsSingleBitSet(dwBits & TF_SFT_VISIBILITY_GROUP) &&
IsSingleBitSet(dwBits & TF_SFT_TRANSPARENCY_GROUP) &&
IsSingleBitSet(dwBits & TF_SFT_LABEL_GROUP) &&
IsSingleBitSet(dwBits & TF_SFT_EXTRA_ICON_GROUP);
}
HRESULT CLangBarMgr::s_GetShowFloatingStatus(_Out_ DWORD *pdwFlags)
{
return E_NOTIMPL;
}
HRESULT CLangBarMgr::s_ShowFloating(_In_ DWORD dwFlags)
{
return E_NOTIMPL;
}
//*****************************************************************************************
// ** IUnknown interface **
STDMETHODIMP
CLangBarMgr::QueryInterface(
_In_ REFIID riid,
_Out_ PVOID *ppvObj)
{
if (!ppvObj)
return E_INVALIDARG;
if (!IsEqualIID(riid, IID_IUnknown) &&
!IsEqualIID(riid, IID_ITfLangBarMgr) &&
!IsEqualIID(riid, IID_ITfLangBarMgr_P))
{
*ppvObj = NULL;
return E_NOINTERFACE;
}
*ppvObj = this;
AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) CLangBarMgr::AddRef()
{
return ++m_cRefs;
}
STDMETHODIMP_(ULONG) CLangBarMgr::Release()
{
if (!--m_cRefs)
{
delete this;
return 0;
}
return m_cRefs;
}
//*****************************************************************************************
// ** ITfLangBarMgr interface **
STDMETHODIMP
CLangBarMgr::AdviseEventSink(
_In_ ITfLangBarEventSink *pSink,
_In_ HWND hwnd,
_In_ DWORD dwflags,
_In_ DWORD *pdwCookie)
{
FIXME("(%p, %p, 0x%X, %p)\n", pSink, hwnd, dwflags, pdwCookie);
if (!pSink)
return E_INVALIDARG;
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::UnAdviseEventSink(
_In_ DWORD dwCookie)
{
FIXME("(0x%lX)\n", dwCookie);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::GetThreadMarshalInterface(
_In_ DWORD dwThreadId,
_In_ DWORD dwType,
_In_ REFIID riid,
_Out_ IUnknown **ppunk)
{
FIXME("(%lu, %lu, %s, %p)\n", dwThreadId, dwType, wine_dbgstr_guid(&riid), ppunk);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::GetThreadLangBarItemMgr(
_In_ DWORD dwThreadId,
_Out_ ITfLangBarItemMgr **pplbie,
_Out_ DWORD *pdwThreadid)
{
FIXME("(%lu, %p, %p)\n", dwThreadId, pplbie, pdwThreadid);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::GetInputProcessorProfiles(
_In_ DWORD dwThreadId,
_Out_ ITfInputProcessorProfiles **ppaip,
_Out_ DWORD *pdwThreadid)
{
FIXME("(%lu, %p, %p)\n", dwThreadId, ppaip, pdwThreadid);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::RestoreLastFocus(
_Out_ DWORD *dwThreadId,
_In_ BOOL fPrev)
{
FIXME("(%p, %d)\n", dwThreadId, fPrev);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::SetModalInput(
_In_ ITfLangBarEventSink *pSink,
_In_ DWORD dwThreadId,
_In_ DWORD dwFlags)
{
FIXME("(%p, %lu, 0x%lX)\n", pSink, dwThreadId, dwFlags);
return E_NOTIMPL;
}
STDMETHODIMP
CLangBarMgr::ShowFloating(
_In_ DWORD dwFlags)
{
FIXME("(0x%lX)\n", dwFlags);
if (!CheckFloatingBits(dwFlags))
return E_INVALIDARG;
return s_ShowFloating(dwFlags);
}
STDMETHODIMP
CLangBarMgr::GetShowFloatingStatus(
_Out_ DWORD *pdwFlags)
{
FIXME("(%p)\n", pdwFlags);
if (!pdwFlags)
return E_INVALIDARG;
return s_GetShowFloatingStatus(pdwFlags);
}
//*****************************************************************************************
// ** ITfLangBarMgr_P interface **
STDMETHODIMP
CLangBarMgr::GetPrevShowFloatingStatus(_Inout_ DWORD* pdwStatus)
{
FIXME("(%p)\n", pdwStatus);
if (!pdwStatus)
return E_INVALIDARG;
return E_NOTIMPL;
}
//*****************************************************************************************
EXTERN_C HRESULT
LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
{
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
CLangBarMgr *pLangBarMgr = new(cicNoThrow) CLangBarMgr();
if (!pLangBarMgr)
return E_OUTOFMEMORY;
HRESULT hr = pLangBarMgr->QueryInterface(IID_ITfLangBarMgr, (PVOID *)ppOut);
TRACE("returning %p\n", *ppOut);
pLangBarMgr->Release();
return hr;
}

View file

@ -23,6 +23,10 @@
#include "wine/list.h"
#if defined(__REACTOS__) && defined(__cplusplus)
extern "C" {
#endif
#define COOKIE_MAGIC_TMSINK 0x0010
#define COOKIE_MAGIC_CONTEXTSINK 0x0020
#define COOKIE_MAGIC_GUIDATOM 0x0030
@ -98,4 +102,8 @@ void free_sinks(struct list *sink_list) DECLSPEC_HIDDEN;
extern const WCHAR szwSystemTIPKey[] DECLSPEC_HIDDEN;
extern const WCHAR szwSystemCTFKey[] DECLSPEC_HIDDEN;
#if defined(__REACTOS__) && defined(__cplusplus)
} // extern "C"
#endif
#endif /* __WINE_MSCTF_I_H */