Exemple #1
0
// ITfTextInputProcessor
STDMETHODIMP TextService::Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClientId) {
	// store tsf manager & client id
	threadMgr_ = pThreadMgr;
	clientId_ = tfClientId;

	activateFlags_ = 0;
	ComQIPtr<ITfThreadMgrEx> threadMgrEx = threadMgr_;
	if(threadMgrEx) {
		threadMgrEx->GetActiveFlags(&activateFlags_);
	}

	// advice event sinks (set up event listeners)
	
	// ITfThreadMgrEventSink, ITfActiveLanguageProfileNotifySink
	ComQIPtr<ITfSource> source = threadMgr_;
	if(source) {
		source->AdviseSink(IID_ITfThreadMgrEventSink, (ITfThreadMgrEventSink *)this, &threadMgrEventSinkCookie_);
		source->AdviseSink(IID_ITfActiveLanguageProfileNotifySink, (ITfActiveLanguageProfileNotifySink *)this, &activateLanguageProfileNotifySinkCookie_);
	}

	// ITfTextEditSink,

	// ITfKeyEventSink
	ComQIPtr<ITfKeystrokeMgr> keystrokeMgr = threadMgr_;
	if(keystrokeMgr)
		keystrokeMgr->AdviseKeyEventSink(clientId_, (ITfKeyEventSink*)this, TRUE);

	// register preserved keys
	if(!preservedKeys_.empty()) {
		vector<PreservedKey>::iterator it;
		for(it = preservedKeys_.begin(); it != preservedKeys_.end(); ++it) {
			PreservedKey& preservedKey = *it;
			keystrokeMgr->PreserveKey(clientId_, preservedKey.guid, &preservedKey, NULL, 0);
		}
	}

	// ITfCompositionSink

	// ITfCompartmentEventSink
	// get current keyboard state
	if(!compartmentMonitors_.empty()) {
		vector<CompartmentMonitor>::iterator it;
		for(it = compartmentMonitors_.begin(); it != compartmentMonitors_.end(); ++it) {
			ComQIPtr<ITfSource> compartmentSource;
			if(it->isGlobal)	// global compartment
				compartmentSource = globalCompartment(it->guid);
			else 	// thread specific compartment
				compartmentSource = threadCompartment(it->guid);
			compartmentSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink*)this, &it->cookie);
		}
	}
	isKeyboardOpened_ = threadCompartmentValue(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE);

	// FIXME: under Windows 7, it seems that the keyboard is closed every time
	// our text service is activated. The value in the compartment is always empty. :-(
	// So, we open the keyboard manually here, but I'm not sure if this is the correct behavior.
	if(!isKeyboardOpened_)
		setKeyboardOpen(true);

	// initialize language bar
	::CoCreateInstance(CLSID_TF_LangBarMgr, NULL, CLSCTX_INPROC_SERVER,
                      IID_ITfLangBarMgr, (void**)&langBarMgr_);
	if(langBarMgr_) {
		langBarMgr_->AdviseEventSink(this, NULL, 0, &langBarSinkCookie_);
	}
	// Note: language bar has no effects in Win 8 immersive mode
	if(!langBarButtons_.empty()) {
		ComPtr<ITfLangBarItemMgr> langBarItemMgr;
		if(threadMgr_->QueryInterface(IID_ITfLangBarItemMgr, (void**)&langBarItemMgr) == S_OK) {
			for(vector<LangBarButton*>::iterator it = langBarButtons_.begin(); it != langBarButtons_.end(); ++it) {
				LangBarButton* button = *it;
				langBarItemMgr->AddItem(button);
			}
		}
	}

	onActivate();
	//::MessageBox(0, L"onActivate", 0, 0);
	return S_OK;
}