// // nuiinat.cpp // #include "private.h" #include "globals.h" #include "nuiinat.h" #include "tipbar.h" #include "resource.h" #include "inatlib.h" #include "cresstr.h" extern HINSTANCE g_hInst; extern CTipbarWnd *g_pTipbarWnd; const GUID GUID_LBI_INATITEM = { /* cdbc683a-55ce-4717-bac0-50bf44a3270c */ 0xcdbc683a, 0x55ce, 0x4717, {0xba, 0xc0, 0x50, 0xbf, 0x44, 0xa3, 0x27, 0x0c} }; //+--------------------------------------------------------------------------- // // GetIconIndexFromhKL // //---------------------------------------------------------------------------- ULONG GetIconIndexFromhKL(HKL hKL) { BOOL bFound; int nCnt = TF_MlngInfoCount(); HKL hKLTmp; int i; bFound = FALSE; for (i = 0; i < nCnt; i++) { if (!TF_GetMlngHKL(i, &hKLTmp, NULL, 0)) continue; if (hKL == hKLTmp) { bFound = TRUE; break; } } if (!bFound) { i = 0; if (!TF_GetMlngHKL(0, &hKL, NULL, 0)) return -1; } return TF_GetMlngIconIndex(i); } //+--------------------------------------------------------------------------- // // GethKLDesc // //---------------------------------------------------------------------------- BOOL GethKLDesc(HKL hKL, WCHAR *psz, UINT cch) { BOOL bFound; int nCnt = TF_MlngInfoCount(); HKL hKLTmp; int i; bFound = FALSE; for (i = 0; i < nCnt; i++) { if (!TF_GetMlngHKL(i, &hKLTmp, psz, cch)) continue; if (hKL == hKLTmp) { bFound = TRUE; break; } } if (!bFound) { i = 0; if (TF_GetMlngHKL(0, &hKL, psz, cch)) return TRUE; } return bFound ? TRUE : FALSE; } //--------------------------------------------------------------------------- // // GetFontSig() // //--------------------------------------------------------------------------- BOOL GetFontSig(HWND hwnd, HKL hKL) { LOCALESIGNATURE ls; BOOL bFontSig = 0; // // 4th param is TCHAR count but we call GetLocaleInfoA() // ~ // so we pass "sizeof(LOCALESIGNATURE) / sizeof(char)". // if( GetLocaleInfoA( (DWORD)(LOWORD(hKL)), LOCALE_FONTSIGNATURE, (LPSTR)&ls, sizeof(LOCALESIGNATURE) / sizeof(char))) { CHARSETINFO cs; HDC hdc = GetDC(hwnd); TranslateCharsetInfo((LPDWORD)UIntToPtr(GetTextCharsetInfo(hdc,NULL,0)), &cs, TCI_SRCCHARSET); DWORD fsShell = cs.fs.fsCsb[0]; ReleaseDC(hwnd, hdc); if (fsShell & ls.lsCsbSupported[0]) bFontSig = 1; } return bFontSig; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CLBarInatItem::CLBarInatItem(DWORD dwThreadId) { Dbg_MemSetThisName(TEXT("CLBarInatItem")); InitNuiInfo(CLSID_SYSTEMLANGBARITEM, GUID_LBI_INATITEM, TF_LBI_STYLE_BTN_MENU | TF_LBI_STYLE_HIDDENSTATUSCONTROL, 0, CRStr(IDS_NUI_LANGUAGE_TEXT)); SetToolTip(CRStr(IDS_NUI_LANGUAGE_TOOLTIP)); _dwThreadId = dwThreadId; _hKL = GetKeyboardLayout(dwThreadId); TF_InitMlngInfo(); int nLang = TF_MlngInfoCount(); ShowInternal((nLang > 1), FALSE); } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CLBarInatItem::~CLBarInatItem() { } //+--------------------------------------------------------------------------- // // GetIcon // //---------------------------------------------------------------------------- STDAPI CLBarInatItem::GetIcon(HICON *phIcon) { ULONG uIconIndex; HICON hIcon = NULL; uIconIndex = GetIconIndexFromhKL(_hKL); if (uIconIndex != -1) hIcon = TF_InatExtractIcon(uIconIndex); *phIcon = hIcon; return S_OK; } //+--------------------------------------------------------------------------- // // GetText // //---------------------------------------------------------------------------- STDAPI CLBarInatItem::GetText(BSTR *pbstr) { WCHAR szText[NUIBASE_TEXT_MAX]; if (!pbstr) return E_INVALIDARG; if (GethKLDesc(_hKL, szText, ARRAYSIZE(szText))) { *pbstr = SysAllocString(szText); return S_OK; } return CLBarItemButtonBase::GetText(pbstr); } //+--------------------------------------------------------------------------- // // OnLButtonUpHandler // //---------------------------------------------------------------------------- HRESULT CLBarInatItem::OnLButtonUp(const POINT pt, const RECT *prcArea) { return S_OK; } //+--------------------------------------------------------------------------- // // InitMenu // //---------------------------------------------------------------------------- STDAPI CLBarInatItem::InitMenu(ITfMenu *pMenu) { int nLang; int i; HKL hkl; WCHAR szDesc[128]; TF_InitMlngInfo(); nLang = TF_MlngInfoCount(); for (i = 0; i < nLang; i++) { if (TF_GetMlngHKL(i, &hkl, szDesc, ARRAYSIZE(szDesc))) { ULONG uIconIndex; HICON hIcon = NULL; uIconIndex = GetIconIndexFromhKL(hkl); if (uIconIndex != -1) hIcon = TF_InatExtractIcon(uIconIndex); LangBarInsertMenu(pMenu, i, szDesc, hkl == _hKL ? TRUE : FALSE, hIcon); } } if (g_pTipbarWnd && g_pTipbarWnd->GetLangBarMgr()) { DWORD dwFlags; if (SUCCEEDED(g_pTipbarWnd->GetLangBarMgr()->GetShowFloatingStatus(&dwFlags))) { if (dwFlags & (TF_SFT_MINIMIZED | TF_SFT_DESKBAND)) { LangBarInsertSeparator(pMenu); LangBarInsertMenu(pMenu, IDM_SHOWLANGBARONCMD, CRStr(IDS_RESTORE)); } } } return S_OK; } //+--------------------------------------------------------------------------- // // OnMenuSelect // //---------------------------------------------------------------------------- STDAPI CLBarInatItem::OnMenuSelect(UINT uID) { HKL hkl; if (uID == IDM_SHOWLANGBARONCMD) { if (g_pTipbarWnd && g_pTipbarWnd->GetLangBarMgr()) g_pTipbarWnd->GetLangBarMgr()->ShowFloating(TF_SFT_SHOWNORMAL); } else if (TF_GetMlngHKL(uID, &hkl, NULL, 0)) { Assert(g_pTipbarWnd); if (!g_pTipbarWnd->IsInDeskBand()) g_pTipbarWnd->RestoreLastFocus(NULL, FALSE); else g_pTipbarWnd->RestoreLastFocus(NULL, TRUE); HWND hwndFore = GetForegroundWindow(); if (_dwThreadId == GetWindowThreadProcessId(hwndFore, NULL)) { BOOL bFontSig = GetFontSig(hwndFore, hkl); PostMessage(hwndFore, WM_INPUTLANGCHANGEREQUEST, (WPARAM)bFontSig, (LPARAM)hkl); } } return S_OK; }