diff --git a/ChewingTextService/ChewingTextService.cpp b/ChewingTextService/ChewingTextService.cpp index b1dbd6e74..539387e78 100644 --- a/ChewingTextService/ChewingTextService.cpp +++ b/ChewingTextService/ChewingTextService.cpp @@ -60,7 +60,7 @@ TextService::TextService(ImeModule* module): Ime::LangBarButton* button = new Ime::LangBarButton(this, g_settingsButtonGuid); button->setTooltip(IDS_SETTINGS); button->setIcon(IDI_CONFIG); - HMENU menu = ::LoadMenuW(this->module()->hInstance(), LPCTSTR(IDR_MENU)); + HMENU menu = ::LoadMenuW(this->imeModule()->hInstance(), LPCTSTR(IDR_MENU)); HMENU popup = ::GetSubMenu(menu, 0); button->setMenu(popup); addButton(button); @@ -368,7 +368,7 @@ bool TextService::onCommand(UINT id) { case ID_ABOUT: // show about dialog if(!isImmersive()) { // only do this in desktop app mode Ime::Dialog dlg; - dlg.showModal(this->module()->hInstance(), IDD_ABOUT); + dlg.showModal(this->imeModule()->hInstance(), IDD_ABOUT); } break; case ID_WEBSITE: // visit chewing website @@ -411,7 +411,7 @@ bool TextService::onConfigure(HWND hwndParent) { Ime::PropertyDialog dlg; TypingPage* typingPage = new TypingPage(); dlg.addPage(typingPage); - dlg.showModal(this->module()->hInstance(), (LPCTSTR)IDS_CONFIG_TITLE, 0, hwndParent); + dlg.showModal(this->imeModule()->hInstance(), (LPCTSTR)IDS_CONFIG_TITLE, 0, hwndParent); return true; } diff --git a/ChewingTextService/ChewingTextService.h b/ChewingTextService/ChewingTextService.h index d7209f72b..61e005764 100644 --- a/ChewingTextService/ChewingTextService.h +++ b/ChewingTextService/ChewingTextService.h @@ -38,7 +38,7 @@ class TextService: public Ime::TextService { } Config& config() { - return static_cast(module())->config(); + return static_cast(imeModule())->config(); } bool hasCandidates() { diff --git a/libIME/ComPtr.h b/libIME/ComPtr.h index 77b497944..5810c89c9 100644 --- a/libIME/ComPtr.h +++ b/libIME/ComPtr.h @@ -15,6 +15,8 @@ class ComPtr { } ComPtr(T* p): p_(p) { + if(p_) + p_->AddRef(); } ComPtr(const ComPtr& other): p_(other.p_) { diff --git a/libIME/DisplayAttributeInfoEnum.cpp b/libIME/DisplayAttributeInfoEnum.cpp index f12df77bf..365da4361 100644 --- a/libIME/DisplayAttributeInfoEnum.cpp +++ b/libIME/DisplayAttributeInfoEnum.cpp @@ -1,17 +1,19 @@ #include "DisplayAttributeInfoEnum.h" -#include "TextService.h" +#include "DisplayAttributeProvider.h" +#include "ImeModule.h" #include using namespace Ime; -DisplayAttributeInfoEnum::DisplayAttributeInfoEnum(TextService* service): - textService_(service), +DisplayAttributeInfoEnum::DisplayAttributeInfoEnum(DisplayAttributeProvider* provider): + provider_(provider), refCount_(1) { - iterator_ = service->displayAttrInfos_.begin(); + std::list& displayAttrInfos = provider_->imeModule_->displayAttrInfos(); + iterator_ = displayAttrInfos.begin(); } DisplayAttributeInfoEnum::DisplayAttributeInfoEnum(const DisplayAttributeInfoEnum& other): - textService_(other.textService_), + provider_(other.provider_), iterator_(other.iterator_) { } @@ -56,8 +58,9 @@ STDMETHODIMP DisplayAttributeInfoEnum::Clone(IEnumTfDisplayAttributeInfo **ppEnu STDMETHODIMP DisplayAttributeInfoEnum::Next(ULONG ulCount, ITfDisplayAttributeInfo **rgInfo, ULONG *pcFetched) { ULONG i = 0; + std::list& displayAttrInfos = provider_->imeModule_->displayAttrInfos(); for(; i < ulCount; ++i) { - if(iterator_ != textService_->displayAttrInfos_.end()) { + if(iterator_ != displayAttrInfos.end()) { DisplayAttributeInfo* info = *iterator_; info->AddRef(); rgInfo[i] = info; @@ -72,12 +75,14 @@ STDMETHODIMP DisplayAttributeInfoEnum::Next(ULONG ulCount, ITfDisplayAttributeIn } STDMETHODIMP DisplayAttributeInfoEnum::Reset() { - iterator_ = textService_->displayAttrInfos_.begin(); + std::list& displayAttrInfos = provider_->imeModule_->displayAttrInfos(); + iterator_ = displayAttrInfos.begin(); return S_OK; } STDMETHODIMP DisplayAttributeInfoEnum::Skip(ULONG ulCount) { - if(iterator_ != textService_->displayAttrInfos_.end()) + std::list& displayAttrInfos = provider_->imeModule_->displayAttrInfos(); + if(iterator_ != displayAttrInfos.end()) ++iterator_; return S_OK; } diff --git a/libIME/DisplayAttributeInfoEnum.h b/libIME/DisplayAttributeInfoEnum.h index 7699fb762..b0a0498c7 100644 --- a/libIME/DisplayAttributeInfoEnum.h +++ b/libIME/DisplayAttributeInfoEnum.h @@ -8,11 +8,11 @@ namespace Ime { -class TextService; +class DisplayAttributeProvider; class DisplayAttributeInfoEnum : public IEnumTfDisplayAttributeInfo { public: - DisplayAttributeInfoEnum(TextService* service); + DisplayAttributeInfoEnum(DisplayAttributeProvider* provider); DisplayAttributeInfoEnum(const DisplayAttributeInfoEnum& other); virtual ~DisplayAttributeInfoEnum(void); @@ -30,7 +30,7 @@ class DisplayAttributeInfoEnum : public IEnumTfDisplayAttributeInfo { private: int refCount_; std::list::iterator iterator_; - ComPtr textService_; + ComPtr provider_; }; } diff --git a/libIME/DisplayAttributeProvider.cpp b/libIME/DisplayAttributeProvider.cpp new file mode 100644 index 000000000..6e8db5e25 --- /dev/null +++ b/libIME/DisplayAttributeProvider.cpp @@ -0,0 +1,69 @@ +#include "DisplayAttributeProvider.h" +#include "DisplayAttributeInfo.h" +#include "DisplayAttributeInfoEnum.h" +#include "ImeModule.h" +#include + +using namespace Ime; +using namespace std; + +DisplayAttributeProvider::DisplayAttributeProvider(ImeModule* module): + imeModule_(module), + refCount_(1) { +} + +DisplayAttributeProvider::~DisplayAttributeProvider(void) { +} + + +// COM stuff + +// IUnknown +STDMETHODIMP DisplayAttributeProvider::QueryInterface(REFIID riid, void **ppvObj) { + if (ppvObj == NULL) + return E_INVALIDARG; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfDisplayAttributeProvider)) + *ppvObj = (ITfDisplayAttributeProvider*)this; + else + *ppvObj = NULL; + + if(*ppvObj) { + AddRef(); + return S_OK; + } + return E_NOINTERFACE; +} + +// IUnknown implementation +STDMETHODIMP_(ULONG) DisplayAttributeProvider::AddRef(void) { + return ++refCount_; +} + +STDMETHODIMP_(ULONG) DisplayAttributeProvider::Release(void) { + assert(refCount_ > 0); + --refCount_; + if(0 == refCount_) + delete this; + return refCount_; +} + + +// ITfDisplayAttributeProvider +STDMETHODIMP DisplayAttributeProvider::EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum) { + *ppEnum = (IEnumTfDisplayAttributeInfo*)new DisplayAttributeInfoEnum(this); + return S_OK; +} + +STDMETHODIMP DisplayAttributeProvider::GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo **ppInfo) { + list& displayAttrInfos = imeModule_->displayAttrInfos(); + list::iterator it; + for(it = displayAttrInfos.begin(); it != displayAttrInfos.end(); ++it) { + DisplayAttributeInfo* info = *it; + if(::IsEqualGUID(info->guid(), guidInfo)) { + *ppInfo = info; + info->AddRef(); + return S_OK; + } + } + return E_INVALIDARG; +} diff --git a/libIME/DisplayAttributeProvider.h b/libIME/DisplayAttributeProvider.h new file mode 100644 index 000000000..0860de8cb --- /dev/null +++ b/libIME/DisplayAttributeProvider.h @@ -0,0 +1,41 @@ +#ifndef IME_DISPLAY_ATTRIBUTE_PROVIDER_H +#define IME_DISPLAY_ATTRIBUTE_PROVIDER_H + +#include +#include +#include "ComPtr.h" + +namespace Ime { + +class ImeModule; +class DisplayAttributeInfo; + +class DisplayAttributeProvider : public ITfDisplayAttributeProvider { +public: + + friend class DisplayAttributeInfoEnum; + + DisplayAttributeProvider(ImeModule* module); + virtual ~DisplayAttributeProvider(void); + + // COM stuff + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); + STDMETHODIMP_(ULONG) AddRef(void); + STDMETHODIMP_(ULONG) Release(void); + + // ITfDisplayAttributeProvider + STDMETHODIMP EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum); + STDMETHODIMP GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo **ppInfo); + +private: + int refCount_; + ComPtr imeModule_; +}; + +} + +#endif + + diff --git a/libIME/ImeModule.cpp b/libIME/ImeModule.cpp index e2ed595c4..7ad5e6286 100644 --- a/libIME/ImeModule.cpp +++ b/libIME/ImeModule.cpp @@ -6,6 +6,7 @@ #include #include "Window.h" #include "TextService.h" +#include "DisplayAttributeProvider.h" using namespace Ime; using namespace std; @@ -21,6 +22,16 @@ static const GUID GUID_TFCAT_TIPCAP_SYSTRAYSUPPORT = { 0x25504FB4, 0x7BAB, 0x4BC1, { 0x9C, 0x69, 0xCF, 0x81, 0x89, 0x0F, 0x0E, 0xF5 } }; #endif +// display attribute GUIDs + +// {2A2574D6-2841-4F27-82BD-D7B0F23855F8} +static const GUID g_inputDisplayAttributeGuid = +{ 0x2a2574d6, 0x2841, 0x4f27, { 0x82, 0xbd, 0xd7, 0xb0, 0xf2, 0x38, 0x55, 0xf8 } }; + +// {E1270AA5-A6B1-4112-9AC7-F5E476C3BD63} +static const GUID g_convertedDisplayAttributeGuid = +{ 0xe1270aa5, 0xa6b1, 0x4112, { 0x9a, 0xc7, 0xf5, 0xe4, 0x76, 0xc3, 0xbd, 0x63 } }; + ImeModule::ImeModule(HMODULE module, const CLSID& textServiceClsid): hInstance_(HINSTANCE(module)), @@ -28,9 +39,29 @@ ImeModule::ImeModule(HMODULE module, const CLSID& textServiceClsid): refCount_(1) { Window::registerClass(hInstance_); + + // regiser default display attributes + inputAttrib_ = new DisplayAttributeInfo(g_inputDisplayAttributeGuid); + inputAttrib_->setTextColor(COLOR_WINDOWTEXT); + inputAttrib_->setLineStyle(TF_LS_DOT); + inputAttrib_->setLineColor(COLOR_WINDOWTEXT); + displayAttrInfos_.push_back(inputAttrib_); + convertedAttrib_ = new DisplayAttributeInfo(g_convertedDisplayAttributeGuid); + displayAttrInfos_.push_back(convertedAttrib_); + + registerDisplayAttributeInfos(); } ImeModule::~ImeModule(void) { + + // display attributes + if(!displayAttrInfos_.empty()) { + list::iterator it; + for(it = displayAttrInfos_.begin(); it != displayAttrInfos_.end(); ++it) { + DisplayAttributeInfo* info = *it; + info->Release(); + } + } } // Dll entry points implementations @@ -178,6 +209,24 @@ HRESULT ImeModule::unregisterServer(const GUID& profileGuid) { return S_OK; } + +// display attributes stuff +bool ImeModule::registerDisplayAttributeInfos() { + + // register display attributes + ComPtr categoryMgr; + if(::CoCreateInstance(CLSID_TF_CategoryMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfCategoryMgr, (void**)&categoryMgr) == S_OK) { + TfGuidAtom atom; + categoryMgr->RegisterGUID(g_inputDisplayAttributeGuid, &atom); + inputAttrib_->setAtom(atom); + categoryMgr->RegisterGUID(g_convertedDisplayAttributeGuid, &atom); + convertedAttrib_->setAtom(atom); + return true; + } + return false; +} + + // COM related stuff // IUnknown @@ -218,15 +267,24 @@ STDMETHODIMP_(ULONG) ImeModule::Release(void) { // IClassFactory STDMETHODIMP ImeModule::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { - // FIXME: do we need to check riid here? - TextService* service = createTextService(); - // FIXME: we should split DisplayAttributeProvider into another class - // Otherwise, everytime a new TextService object is created just for enumerating display attributes. - // This is really a waste and may cause potential side effects. - if(service) { - service->QueryInterface(riid, ppvObj); - service->Release(); - return S_OK; + if(::IsEqualIID(riid, IID_ITfDisplayAttributeProvider)) { + DisplayAttributeProvider* provider = new DisplayAttributeProvider(this); + if(provider) { + provider->QueryInterface(riid, ppvObj); + provider->Release(); + return S_OK; + } + } + else { + TextService* service = createTextService(); + // FIXME: we should split DisplayAttributeProvider into another class + // Otherwise, everytime a new TextService object is created just for enumerating display attributes. + // This is really a waste and may cause potential side effects. + if(service) { + service->QueryInterface(riid, ppvObj); + service->Release(); + return S_OK; + } } return S_FALSE; } diff --git a/libIME/ImeModule.h b/libIME/ImeModule.h index 3447256d9..66459fa66 100644 --- a/libIME/ImeModule.h +++ b/libIME/ImeModule.h @@ -3,10 +3,12 @@ #include #include +#include namespace Ime { class TextService; +class DisplayAttributeInfo; class ImeModule: public IClassFactory { public: @@ -28,8 +30,24 @@ class ImeModule: public IClassFactory { HRESULT registerServer(wchar_t* name, const GUID& profileGuid, LANGID languageId); HRESULT unregisterServer(const GUID& profileGuid); + // should be override by IME implementors virtual TextService* createTextService() = 0; + // display attributes for composition string + std::list& displayAttrInfos() { + return displayAttrInfos_; + } + + bool registerDisplayAttributeInfos(); + + DisplayAttributeInfo* inputAttrib() { + return inputAttrib_; + } + + DisplayAttributeInfo* convertedAttrib() { + return convertedAttrib_; + } + // COM-related stuff // IUnknown @@ -47,6 +65,11 @@ class ImeModule: public IClassFactory { HINSTANCE hInstance_; CLSID textServiceClsid_; wchar_t* tooltip_; + + // display attributes + std::list displayAttrInfos_; // display attribute info + DisplayAttributeInfo* inputAttrib_; + DisplayAttributeInfo* convertedAttrib_; }; } diff --git a/libIME/LangBarButton.cpp b/libIME/LangBarButton.cpp index 1ccd84886..54ac7d69f 100644 --- a/libIME/LangBarButton.cpp +++ b/libIME/LangBarButton.cpp @@ -15,11 +15,11 @@ LangBarButton::LangBarButton(TextService* service, const GUID& guid, UINT comman icon_(NULL), refCount_(1) { - assert(service && service->module()); + assert(service && service->imeModule()); textService_->AddRef(); - info_.clsidService = service->module()->textServiceClsid(); + info_.clsidService = service->imeModule()->textServiceClsid(); info_.guidItem = guid; info_.dwStyle = style; info_.ulSort = 0; @@ -51,7 +51,7 @@ void LangBarButton::setText(const wchar_t* text) { void LangBarButton::setText(UINT stringId) { const wchar_t* str; - int len = ::LoadStringW(textService_->module()->hInstance(), stringId, (LPTSTR)&str, 0); + int len = ::LoadStringW(textService_->imeModule()->hInstance(), stringId, (LPTSTR)&str, 0); if(str) { if(len > (TF_LBI_DESC_MAXLEN - 1)) len = TF_LBI_DESC_MAXLEN - 1; @@ -75,7 +75,7 @@ void LangBarButton::setTooltip(const wchar_t* tooltip) { void LangBarButton::setTooltip(UINT tooltipId) { const wchar_t* str; - int len = ::LoadStringW(textService_->module()->hInstance(), tooltipId, (LPTSTR)&str, 0); + int len = ::LoadStringW(textService_->imeModule()->hInstance(), tooltipId, (LPTSTR)&str, 0); if(str) { tooltip_ = (wchar_t*)malloc((len + 1) * sizeof(wchar_t)); wcsncpy(tooltip_, str, len); @@ -94,7 +94,7 @@ void LangBarButton::setIcon(HICON icon) { } void LangBarButton::setIcon(UINT iconId) { - HICON icon = ::LoadIconW(textService_->module()->hInstance(), (LPCTSTR)iconId); + HICON icon = ::LoadIconW(textService_->imeModule()->hInstance(), (LPCTSTR)iconId); if(icon) setIcon(icon); } diff --git a/libIME/TextService.cpp b/libIME/TextService.cpp index 1c9fef963..113e4e4d6 100644 --- a/libIME/TextService.cpp +++ b/libIME/TextService.cpp @@ -3,6 +3,7 @@ #include "CandidateWindow.h" #include "LangBarButton.h" #include "DisplayAttributeInfoEnum.h" +#include "ImeModule.h" #include #include @@ -11,14 +12,6 @@ using namespace Ime; using namespace std; -// {2A2574D6-2841-4F27-82BD-D7B0F23855F8} -static const GUID g_inputDisplayAttributeGuid = -{ 0x2a2574d6, 0x2841, 0x4f27, { 0x82, 0xbd, 0xd7, 0xb0, 0xf2, 0x38, 0x55, 0xf8 } }; - -// {E1270AA5-A6B1-4112-9AC7-F5E476C3BD63} -static const GUID g_convertedDisplayAttributeGuid = -{ 0xe1270aa5, 0xa6b1, 0x4112, { 0x9a, 0xc7, 0xf5, 0xe4, 0x76, 0xc3, 0xbd, 0x63 } }; - TextService::TextService(ImeModule* module): module_(module), threadMgr_(NULL), @@ -30,32 +23,12 @@ TextService::TextService(ImeModule* module): composition_(NULL), candidateWindow_(NULL), refCount_(1) { - - // regiser default display attributes - inputAttrib_ = new DisplayAttributeInfo(g_inputDisplayAttributeGuid); - inputAttrib_->setTextColor(COLOR_WINDOWTEXT); - inputAttrib_->setLineStyle(TF_LS_DOT); - inputAttrib_->setLineColor(COLOR_WINDOWTEXT); - displayAttrInfos_.push_back(inputAttrib_); - convertedAttrib_ = new DisplayAttributeInfo(g_convertedDisplayAttributeGuid); - displayAttrInfos_.push_back(convertedAttrib_); - - // FIXME: we should put the display attribute provider in another class instead. - // Otherwise, the class factory needs to create a TextService object - // just to query display attributes, which is quite a waste. } TextService::~TextService(void) { if(candidateWindow_) delete candidateWindow_; - if(!displayAttrInfos_.empty()) { - for(list::iterator it; it != displayAttrInfos_.end(); ++it) { - DisplayAttributeInfo* info = *it; - info->Release(); - } - } - if(!langBarButtons_.empty()) { for(vector::iterator it = langBarButtons_.begin(); it != langBarButtons_.end(); ++it) { LangBarButton* button = *it; @@ -66,7 +39,7 @@ TextService::~TextService(void) { // public methods -ImeModule* TextService::module() const { +ImeModule* TextService::imeModule() const { return module_; } @@ -223,7 +196,7 @@ void TextService::setCompositionString(EditSession* session, const wchar_t* str, if(context->GetProperty(GUID_PROP_ATTRIBUTE, &dispAttrProp) == S_OK) { VARIANT val; val.vt = VT_I4; - val.lVal = inputAttrib_->atom(); + val.lVal = module_->inputAttrib()->atom(); dispAttrProp->SetValue(editCookie, compositionRange, &val); } } @@ -313,8 +286,6 @@ STDMETHODIMP TextService::QueryInterface(REFIID riid, void **ppvObj) { return E_INVALIDARG; if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfTextInputProcessor)) *ppvObj = (ITfTextInputProcessor*)this; - else if(IsEqualIID(riid, IID_ITfDisplayAttributeProvider)) - *ppvObj = (ITfDisplayAttributeProvider*)this; else if(IsEqualIID(riid, IID_ITfFnConfigure )) *ppvObj = (ITfFnConfigure *)this; else if(IsEqualIID(riid, IID_ITfTextEditSink)) @@ -395,16 +366,6 @@ STDMETHODIMP TextService::Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClient } } - // register display attributes - ComPtr categoryMgr; - if(::CoCreateInstance(CLSID_TF_CategoryMgr, NULL, CLSCTX_INPROC_SERVER, IID_ITfCategoryMgr, (void**)&categoryMgr) == S_OK) { - TfGuidAtom atom; - categoryMgr->RegisterGUID(g_inputDisplayAttributeGuid, &atom); - inputAttrib_->setAtom(atom); - categoryMgr->RegisterGUID(g_convertedDisplayAttributeGuid, &atom); - convertedAttrib_->setAtom(atom); - } - onActivate(); return S_OK; @@ -566,25 +527,6 @@ STDMETHODIMP TextService::OnCompositionTerminated(TfEditCookie ecWrite, ITfCompo } -// ITfDisplayAttributeProvider -STDMETHODIMP TextService::EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum) { - *ppEnum = (IEnumTfDisplayAttributeInfo*)new DisplayAttributeInfoEnum(this); - return S_OK; -} - -STDMETHODIMP TextService::GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo **ppInfo) { - list::iterator it; - for(it = displayAttrInfos_.begin(); it != displayAttrInfos_.end(); ++it) { - DisplayAttributeInfo* info = *it; - if(::IsEqualGUID(info->guid(), guidInfo)) { - *ppInfo = info; - info->AddRef(); - return S_OK; - } - } - return E_INVALIDARG; -} - // edit session handling STDMETHODIMP TextService::KeyEditSession::DoEditSession(TfEditCookie ec) { EditSession::DoEditSession(ec); diff --git a/libIME/TextService.h b/libIME/TextService.h index 8e8a62ce6..d6074e0e0 100644 --- a/libIME/TextService.h +++ b/libIME/TextService.h @@ -31,15 +31,14 @@ class TextService: public ITfThreadMgrEventSink, public ITfTextEditSink, public ITfKeyEventSink, - public ITfCompositionSink, - public ITfDisplayAttributeProvider { + public ITfCompositionSink { public: TextService(ImeModule* module); virtual ~TextService(void); // public methods - ImeModule* module() const; + ImeModule* imeModule() const; ITfThreadMgr* threadMgr() const; @@ -113,10 +112,6 @@ class TextService: STDMETHODIMP Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClientId); STDMETHODIMP Deactivate(); - // ITfDisplayAttributeProvider - STDMETHODIMP EnumDisplayAttributeInfo(IEnumTfDisplayAttributeInfo **ppEnum); - STDMETHODIMP GetDisplayAttributeInfo(REFGUID guidInfo, ITfDisplayAttributeInfo **ppInfo); - // ITfFnConfigure STDMETHODIMP Show(HWND hwndParent, LANGID langid, REFGUID rguidProfile); @@ -184,7 +179,7 @@ class TextService: }; private: - ImeModule* module_; + ComPtr module_; ComPtr threadMgr_; TfClientId clientId_; DWORD activateFlags_; @@ -199,10 +194,6 @@ class TextService: std::vector langBarButtons_; std::vector preservedKeys_; - std::list displayAttrInfos_; // display attribute info - DisplayAttributeInfo* inputAttrib_; - DisplayAttributeInfo* convertedAttrib_; - long refCount_; // reference counting };