[MSUTB][SDK] Add CUTBContextMenu (#6452)

Supporting Language Bar...
JIRA issue: CORE-19363
- Add some resource strings.
- Half-implement CUTBContextMenu
  class.
This commit is contained in:
Katayama Hirofumi MZ 2024-02-07 16:47:10 +09:00 committed by GitHub
parent c9c5b3d3ae
commit 7dd3308828
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 360 additions and 10 deletions

View File

@ -17,11 +17,19 @@ BEGIN
IDS_YES "&Yes"
IDS_NO "&No"
IDS_SETTINGS "S&ettings..."
IDS_RESTORELANGBAR "Restore Language Bar"
IDS_LANGUAGE "Language"
IDS_RESTORELANGBAR2 "&Restore Language Bar"
IDS_LANGUAGEBUTTON "Language Button"
IDS_TRANSPARENCY "&Transparency"
IDS_TEXTLABELS "Tex&t Labels"
IDS_MINIMIZE "&Minimize"
IDS_CLOSELANGBAR "&Close Language Bar"
IDS_EXTRAICONS "&Additional icons in taskbar"
IDS_RESTORELANGBAR2 "&Restore Language Bar"
IDS_MENUWND "Menu Window"
IDS_VERTICAL "&Vertical"
IDS_ADJUSTLANGBAND "&Adjust Language Band position"
IDS_LEFTCLICK "Left Click"
END

View File

@ -15,6 +15,7 @@ UINT g_uACP = CP_ACP;
DWORD g_dwOSInfo = 0;
CRITICAL_SECTION g_cs;
LONG g_DllRefCount = 0;
BOOL g_bWinLogon = FALSE;
BOOL g_bShowTipbar = TRUE;
BOOL g_bShowDebugMenu = FALSE;
@ -307,6 +308,60 @@ HRESULT LangBarInsertSeparator(_In_ ITfMenu *pMenu)
return pMenu->AddMenuItem(-1, TF_LBMENUF_SEPARATOR, NULL, NULL, NULL, 0, NULL);
}
// Is it a Far-East language ID?
BOOL IsFELangId(LANGID LangID)
{
switch (LangID)
{
case MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED): // Chinese (Simplified)
case MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL): // Chinese (Traditional)
case MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT): // Japanese
case MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT): // Korean
return TRUE;
default:
return FALSE;
}
}
BOOL CheckCloseMenuAvailable(void)
{
BOOL ret = FALSE;
ITfInputProcessorProfiles *pProfiles = NULL;
LANGID *pLangIds = NULL;
ULONG iItem, cItems;
if (g_fPolicyDisableCloseButton)
return FALSE;
if (g_bShowCloseMenu)
return TRUE;
if (SUCCEEDED(TF_CreateInputProcessorProfiles(&pProfiles)) &&
SUCCEEDED(pProfiles->GetLanguageList(&pLangIds, &cItems)))
{
for (iItem = 0; iItem < cItems; ++iItem)
{
if (IsFELangId(pLangIds[iItem]))
break;
}
ret = (iItem == cItems);
}
if (pLangIds)
CoTaskMemFree(pLangIds);
if (pProfiles)
pProfiles->Release();
return ret;
}
/// @unimplemented
BOOL IsTransparecyAvailable(void)
{
return FALSE;
}
BOOL InitFromReg(void)
{
DWORD dwValue;
@ -814,13 +869,38 @@ public:
CModalMenu() { }
virtual ~CModalMenu() { }
CUTBMenuItem *InsertItem(CUTBMenuWnd *pMenuUI, SIZE_T uBytes, INT nStringID);
CUTBMenuItem *InsertItem(CUTBMenuWnd *pMenuUI, INT nCommandId, INT nStringID);
void PostKey(BOOL bUp, WPARAM wParam, LPARAM lParam);
void CancelMenu();
};
/***********************************************************************/
class CTipbarThread;
class CUTBContextMenu : public CModalMenu
{
public:
CTipbarWnd *m_pTipbarWnd;
CTipbarThread *m_pTipbarThread;
public:
CUTBContextMenu(CTipbarWnd *pTipbarWnd);
BOOL Init();
CUTBMenuWnd *CreateMenuUI(BOOL bFlag);
UINT ShowPopup(
CUIFWindow *pWindow,
POINT pt,
LPCRECT prc,
BOOL bFlag);
BOOL SelectMenuItem(UINT nCommandId);
};
/***********************************************************************/
class CUTBLBarMenuItem;
class CUTBLBarMenu : public CCicLibMenu
@ -2173,7 +2253,7 @@ STDMETHODIMP_(INT) CUTBMenuItem::GetAccRole()
*/
CUTBMenuItem *
CModalMenu::InsertItem(CUTBMenuWnd *pMenuUI, SIZE_T uBytes, INT nStringID)
CModalMenu::InsertItem(CUTBMenuWnd *pMenuUI, INT nCommandId, INT nStringID)
{
CUTBMenuItem *pMenuItem = new(cicNoThrow) CUTBMenuItem(pMenuUI);
if (!pMenuItem)
@ -2183,7 +2263,7 @@ CModalMenu::InsertItem(CUTBMenuWnd *pMenuUI, SIZE_T uBytes, INT nStringID)
::LoadStringW(g_hInst, nStringID, szText, _countof(szText));
if (pMenuItem->Initialize() &&
pMenuItem->Init(uBytes, szText) &&
pMenuItem->Init(nCommandId, szText) &&
pMenuUI->InsertItem(pMenuItem))
{
return pMenuItem;
@ -2204,6 +2284,246 @@ void CModalMenu::CancelMenu()
m_pMenuUI->CancelMenu();
}
/***********************************************************************
* CUTBContextMenu
*/
CUTBContextMenu::CUTBContextMenu(CTipbarWnd *pTipbarWnd)
{
m_pTipbarWnd = pTipbarWnd;
}
/// @unimplemented
BOOL CUTBContextMenu::Init()
{
#if 0 // FIXME: m_pTipbarWnd
m_pTipbarThread = m_pTipbarWnd->m_pFocusThread;
return !!m_pTipbarThread;
#else
return TRUE;
#endif
}
/// @unimplemented
CUTBMenuWnd *CUTBContextMenu::CreateMenuUI(BOOL bFlag)
{
DWORD dwStatus = 0;
#if 0 // FIXME: m_pTipbarWnd
if (FAILED(m_pTipbarWnd->m_pLangBarMgr->GetShowFloatingStatus(&dwStatus)))
return NULL;
#endif
CUTBMenuWnd *pMenuUI = new (cicNoThrow) CUTBMenuWnd(g_hInst, g_dwMenuStyle, 0);
if (!pMenuUI)
return NULL;
pMenuUI->Initialize();
if (dwStatus & (TF_SFT_DESKBAND | TF_SFT_MINIMIZED))
{
CUTBMenuItem *pRestoreLangBar = InsertItem(pMenuUI, ID_RESTORELANGBAR, IDS_RESTORELANGBAR2);
#if 0 // FIXME: m_pTipbarWnd
if (pRestoreLangBar && !m_pTipbarWnd->m_dwUnknown20)
pRestoreLangBar->Gray(TRUE);
#endif
pRestoreLangBar = pRestoreLangBar;
}
else
{
InsertItem(pMenuUI, ID_DESKBAND, IDS_MINIMIZE);
if (bFlag)
{
if (IsTransparecyAvailable())
{
if (dwStatus & TF_LBI_BALLOON)
{
InsertItem(pMenuUI, ID_TRANS, IDS_TRANSPARENCY);
}
else
{
CUTBMenuItem *pTransparency = InsertItem(pMenuUI, ID_NOTRANS, IDS_TRANSPARENCY);
if (pTransparency)
pTransparency->Check(TRUE);
}
}
if (!(dwStatus & TF_SFT_LABELS))
{
InsertItem(pMenuUI, ID_LABELS, IDS_TEXTLABELS);
}
else
{
CUTBMenuItem *pTextLabels = InsertItem(pMenuUI, ID_NOLABELS, IDS_TEXTLABELS);
if (pTextLabels)
pTextLabels->Check(TRUE);
}
CUTBMenuItem *pVertical = InsertItem(pMenuUI, ID_VERTICAL, IDS_VERTICAL);
#if 0 // FIXME: m_pTipbarWnd
if (pVertical)
pVertical->Check(!!(m_pTipbarWnd->m_dwTipbarWndFlags & 0x800000));
#endif
pVertical = pVertical;
}
}
if (bFlag)
{
CUTBMenuItem *pExtraIcons = NULL;
if (dwStatus & TF_SFT_EXTRAICONSONMINIMIZED)
{
pExtraIcons = InsertItem(pMenuUI, ID_NOEXTRAICONS, IDS_EXTRAICONS);
if (pExtraIcons)
pExtraIcons->Check(TRUE);
}
else
{
pExtraIcons = CModalMenu::InsertItem(pMenuUI, ID_EXTRAICONS, IDS_EXTRAICONS);
}
if (pExtraIcons)
{
if (::GetKeyboardLayoutList(0, NULL) == 1)
{
pExtraIcons->Check(TRUE);
pExtraIcons->Gray(TRUE);
}
else
{
pExtraIcons->Gray(FALSE);
}
}
if (dwStatus & TF_SFT_DESKBAND)
InsertItem(pMenuUI, ID_ADJUSTDESKBAND, IDS_ADJUSTLANGBAND);
InsertItem(pMenuUI, ID_SETTINGS, IDS_SETTINGS);
if (CheckCloseMenuAvailable())
InsertItem(pMenuUI, ID_CLOSELANGBAR, IDS_CLOSELANGBAR);
}
return pMenuUI;
}
UINT
CUTBContextMenu::ShowPopup(
CUIFWindow *pWindow,
POINT pt,
LPCRECT prc,
BOOL bFlag)
{
if (g_bWinLogon)
return 0;
if (m_pMenuUI)
return -1;
m_pMenuUI = CreateMenuUI(bFlag);
if (!m_pMenuUI)
return 0;
UINT nCommandId = m_pMenuUI->ShowModalPopup(pWindow, prc, TRUE);
if (m_pMenuUI)
{
delete m_pMenuUI;
m_pMenuUI = NULL;
}
return nCommandId;
}
/// @unimplemented
BOOL CUTBContextMenu::SelectMenuItem(UINT nCommandId)
{
switch (nCommandId)
{
#if 0 // FIXME: g_pTipbarWnd
case ID_TRANS:
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_LOWTRANSPARENCY);
break;
case ID_NOTRANS:
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_NOTRANSPARENCY);
break;
case ID_LABELS:
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_LABELS);
break;
case ID_NOLABELS:
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_NOLABELS);
break;
case ID_DESKBAND:
{
m_pTipbarWnd->m_pLangBarMgr->GetShowFloatingStatus(&dwStatus);
if (dwStatus & TF_SFT_DESKBAND)
break;
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_DESKBAND);
CUTBMinimizeLangBarDlg *pDialog = new(cicNoThrow) CUTBMinimizeLangBarDlg();
if (pDialog)
{
pDialog->DoModal(m_pTipbarWnd->m_Window);
pDialog->_Release();
}
break;
}
case ID_CLOSELANGBAR:
{
CUTBCloseLangBarDlg *pDialog = new(cicNoThrow) CUTBCloseLangBarDlg();
if (pDialog)
{
BOOL bOK = pDialog->DoModal(m_pTipbarWnd->m_Window);
pDialog->_Release();
if (!bOK)
DoCloseLangbar();
}
break;
}
case ID_EXTRAICONS:
m_pTipbarWnd->m_dwTipbarWndFlags &= ~0x4000;
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_EXTRAICONSONMINIMIZED);
break;
case ID_NOEXTRAICONS:
m_pTipbarWnd->m_dwTipbarWndFlags &= ~0x4000;
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_NOEXTRAICONSONMINIMIZED);
break;
case ID_RESTORELANGBAR:
m_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_LBI_ICON);
break;
case ID_VERTICAL:
m_pTipbarWnd->SetVertical((m_pTipbarWnd->m_dwTipbarWndFlags & 0x4) ? TRUE : FALSE);
break;
case ID_ADJUSTDESKBAND:
m_pTipbarWnd->AdjustDeskBandSize(TRUE);
break;
#endif
case ID_SETTINGS:
TF_RunInputCPL();
break;
default:
break;
}
return TRUE;
}
/***********************************************************************
* CTrayIconItem
*/

View File

@ -10,13 +10,34 @@
#define IDI_MAINICON 100
#define IDS_SETTINGS 300
#define IDS_RESTORELANGBAR 308
#define IDS_LANGUAGE 309
#define IDS_LANGUAGEBUTTON 310
#define IDS_TRANSPARENCY 312
#define IDS_TEXTLABELS 313
#define IDS_MINIMIZE 314
#define IDS_CLOSELANGBAR 315
#define IDS_EXTRAICONS 318
#define IDS_RESTORELANGBAR2 321
#define IDS_MENUWND 322
#define IDS_VERTICAL 324
#define IDS_ADJUSTLANGBAND 326
#define IDS_LEFTCLICK 323
#define ID_TRANS 208
#define ID_NOTRANS 209
#define ID_LABELS 210
#define ID_NOLABELS 211
#define ID_DESKBAND 212
#define ID_CLOSELANGBAR 213
#define ID_EXTRAICONS 214
#define ID_NOEXTRAICONS 215
#define ID_RESTORELANGBAR 216
#define ID_VERTICAL 217
#define ID_ADJUSTDESKBAND 219
#define ID_SETTINGS 2000
#define IDD_CLOSELANGBAR 1001
#define IDD_MINIMIZELANGBAR 1004

View File

@ -59,14 +59,15 @@ cpp_quote("EXTERN_C HANDLE WINAPI TF_CreateCicLoadMutex(_Out_ LPBOOL pfWinLogon
cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCache(VOID);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(VOID);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_DllDetachInOther(VOID);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateCategoryMgr(ITfCategoryMgr **ppcat);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateDisplayAttributeMgr(ITfDisplayAttributeMgr **ppdam);")
cpp_quote("EXTERN_C HICON WINAPI TF_GetLangIcon(LANGID LangID, LPWSTR pszText, INT cchText);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateCategoryMgr(_Out_ ITfCategoryMgr **ppcat);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateDisplayAttributeMgr(_Out_ ITfDisplayAttributeMgr **ppdam);")
cpp_quote("EXTERN_C HICON WINAPI TF_GetLangIcon(_In_ LANGID LangID, _Out_ LPWSTR pszText, _In_ INT cchText);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_InitMlngInfo(VOID);")
cpp_quote("EXTERN_C INT WINAPI TF_MlngInfoCount(VOID);")
cpp_quote("EXTERN_C BOOL WINAPI TF_GetMlngHKL(INT iKL, HKL *phKL, LPWSTR pszText, INT cchText);")
cpp_quote("EXTERN_C INT WINAPI TF_GetMlngIconIndex(INT iKL);")
cpp_quote("EXTERN_C HICON WINAPI TF_InatExtractIcon(INT iKL);")
cpp_quote("EXTERN_C BOOL WINAPI TF_GetMlngHKL(_In_ INT iKL, _Out_ HKL *phKL, _Out_ LPWSTR pszText, _In_ INT cchText);")
cpp_quote("EXTERN_C INT WINAPI TF_GetMlngIconIndex(_In_ INT iKL);")
cpp_quote("EXTERN_C HICON WINAPI TF_InatExtractIcon(_In_ INT iKL);")
cpp_quote("EXTERN_C HRESULT WINAPI TF_RunInputCPL(VOID);")
cpp_quote("EXTERN_C const GUID GUID_PROP_TEXTOWNER;")
cpp_quote("EXTERN_C const GUID GUID_PROP_ATTRIBUTE;")