From 5e4fe2cf4036499038ebdb0f33bbf64536545323 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 31 Jan 2024 16:52:02 +0900 Subject: [PATCH] [MSCTF][MSUTB][SDK] Add CTrayIconWnd and CMainIconItem (#6424) Supporting Language Bar... JIRA issue: CORE-19363 - Add CTrayIconWnd, CMainIconItem, and CButtonIconItem classes. - Modify msctf.spec for TF_GetLangIcon function. - Add main icon IDI_MAINICON ("res/earth.ico"). --- dll/win32/msctf/msctf.spec | 2 +- dll/win32/msutb/lang/en-US.rc | 2 + dll/win32/msutb/msutb.cpp | 459 ++++++++++++++++++++++++++-- dll/win32/msutb/msutb.rc | 2 + dll/win32/msutb/precomp.h | 1 + dll/win32/msutb/res/earth.ico | Bin 0 -> 22382 bytes dll/win32/msutb/resource.h | 4 + sdk/include/psdk/msctf.idl | 1 + sdk/include/reactos/cicero/cicutb.h | 4 + 9 files changed, 455 insertions(+), 20 deletions(-) create mode 100644 dll/win32/msutb/res/earth.ico diff --git a/dll/win32/msctf/msctf.spec b/dll/win32/msctf/msctf.spec index 569f8701e8b..52288129e1c 100644 --- a/dll/win32/msctf/msctf.spec +++ b/dll/win32/msctf/msctf.spec @@ -18,7 +18,7 @@ @ stdcall -stub TF_DllDetachInOther() @ stdcall -stub TF_GetGlobalCompartment(ptr) @ stub TF_GetInputScope -@ stub TF_GetLangIcon +@ stdcall -stub TF_GetLangIcon(long ptr long) @ stub TF_GetMlngHKL @ stub TF_GetMlngIconIndex @ stub TF_GetThreadFlags diff --git a/dll/win32/msutb/lang/en-US.rc b/dll/win32/msutb/lang/en-US.rc index 98a9ea10f96..3c3a7a579dd 100644 --- a/dll/win32/msutb/lang/en-US.rc +++ b/dll/win32/msutb/lang/en-US.rc @@ -16,6 +16,8 @@ BEGIN IDS_IGNORE "&Ignore" IDS_YES "&Yes" IDS_NO "&No" + + IDS_RESTORELANGBAR "Restore Language Bar" IDS_MENUWND "Menu Window" IDS_LEFTCLICK "Left Click" END diff --git a/dll/win32/msutb/msutb.cpp b/dll/win32/msutb/msutb.cpp index 9a4a96e8553..26816ecb962 100644 --- a/dll/win32/msutb/msutb.cpp +++ b/dll/win32/msutb/msutb.cpp @@ -16,6 +16,10 @@ DWORD g_dwOSInfo = 0; CRITICAL_SECTION g_cs; LONG g_DllRefCount = 0; +UINT g_uTimerElapseDOACCDEFAULTACTION = 200; + +#define TIMER_ID_DOACCDEFAULTACTION 11 + EXTERN_C void __cxa_pure_virtual(void) { ERR("__cxa_pure_virtual\n"); @@ -34,6 +38,12 @@ CMsUtbModule gModule; class CCicLibMenuItem; class CTipbarAccItem; class CUTBMenuItem; +class CMainIconItem; +class CTrayIconItem; +class CTipbarWnd; +class CButtonIconItem; + +CTipbarWnd *g_pTipbarWnd = NULL; HRESULT GetGlobalCompartment(REFGUID rguid, ITfCompartment **ppComp) { @@ -98,9 +108,8 @@ void DoCloseLangbar(void) if (pLangBarMgr) { - hr = pLangBarMgr->ShowFloating(8); + hr = pLangBarMgr->ShowFloating(TF_SFT_HIDDEN); pLangBarMgr->Release(); - pLangBarMgr = NULL; } if (SUCCEEDED(hr)) @@ -453,9 +462,50 @@ public: class CTrayIconWnd { +protected: + DWORD m_dwUnknown20; + BOOL m_bBusy; + UINT m_uCallbackMessage; + UINT m_uMsg; + HWND m_hWnd; + DWORD m_dwUnknown21[2]; + HWND m_hTrayWnd; + HWND m_hNotifyWnd; + DWORD m_dwTrayWndThreadId; + DWORD m_dwUnknown22; + HWND m_hwndProgman; + DWORD m_dwProgmanThreadId; + CMainIconItem *m_pMainIconItem; + CicArray m_Items; + UINT m_uCallbackMsg; + UINT m_uNotifyIconID; + + static BOOL CALLBACK EnumChildWndProc(HWND hWnd, LPARAM lParam); + static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + public: - //FIXME - HWND GetNotifyWnd() { return NULL; }; + CTrayIconWnd(); + ~CTrayIconWnd(); + + BOOL RegisterClass(); + HWND CreateWnd(); + void DestroyWnd(); + + BOOL SetMainIcon(HKL hKL); + BOOL SetIcon(REFGUID rguid, DWORD dwUnknown24, HICON hIcon, LPCWSTR psz); + + void RemoveAllIcon(DWORD dwFlags); + void RemoveUnusedIcons(int unknown); + + CButtonIconItem *FindIconItem(REFGUID rguid); + BOOL FindTrayEtc(); + HWND GetNotifyWnd(); + BOOL OnIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); + + static CTrayIconWnd *GetThis(HWND hWnd); + static void SetThis(HWND hWnd, LPCREATESTRUCT pCS); + + void CallOnDelayMsg(); }; /***********************************************************************/ @@ -469,20 +519,50 @@ protected: DWORD m_dwIconAddOrModify; BOOL m_bIconAdded; CTrayIconWnd *m_pTrayIconWnd; - DWORD m_dw; + DWORD m_dwUnknown25; GUID m_guid; RECT m_rcMenu; POINT m_ptCursor; + friend class CTrayIconWnd; +public: CTrayIconItem(CTrayIconWnd *pTrayIconWnd); + virtual ~CTrayIconItem() { } BOOL _Init(HWND hWnd, UINT uCallbackMessage, UINT uNotifyIconID, const GUID& rguid); BOOL UpdateMenuRectPoint(); BOOL RemoveIcon(); - STDMETHOD_(BOOL, SetIcon)(HICON hIcon, LPCTSTR pszTip); - STDMETHOD_(LRESULT, OnMsg)(WPARAM wParam, LPARAM lParam) { return 0; }; - STDMETHOD_(LRESULT, OnDelayMsg)(LPARAM lParam) { return 0; }; + STDMETHOD_(BOOL, SetIcon)(HICON hIcon, LPCWSTR pszTip); + STDMETHOD_(BOOL, OnMsg)(WPARAM wParam, LPARAM lParam) { return FALSE; }; + STDMETHOD_(BOOL, OnDelayMsg)(UINT uMsg) { return 0; }; +}; + +/***********************************************************************/ + +class CButtonIconItem : public CTrayIconItem +{ +protected: + DWORD m_dwUnknown24; + HKL m_hKL; + friend class CTrayIconWnd; + +public: + CButtonIconItem(CTrayIconWnd *pWnd, DWORD dwUnknown24); + + STDMETHOD_(BOOL, OnMsg)(WPARAM wParam, LPARAM lParam) override; + STDMETHOD_(BOOL, OnDelayMsg)(UINT uMsg) override; +}; + +/***********************************************************************/ + +class CMainIconItem : public CButtonIconItem +{ +public: + CMainIconItem(CTrayIconWnd *pWnd); + + BOOL Init(HWND hWnd); + STDMETHOD_(BOOL, OnDelayMsg)(UINT uMsg) override; }; /*********************************************************************** @@ -780,7 +860,7 @@ STDMETHODIMP CCicLibMenu::AddMenuItem( pSubMenu->AddRef(); } - *m_MenuItems.Append(1) = pMenuItem; + m_MenuItems.Add(pMenuItem); return S_OK; } @@ -1429,8 +1509,8 @@ BOOL CUTBMenuWnd::StartDoAccDefaultActionTimer(CUTBMenuItem *pTarget) if (::IsWindow(m_hWnd)) { - ::KillTimer(m_hWnd, 11); - ::SetTimer(m_hWnd, 11, 200, NULL); + ::KillTimer(m_hWnd, TIMER_ID_DOACCDEFAULTACTION); + ::SetTimer(m_hWnd, TIMER_ID_DOACCDEFAULTACTION, g_uTimerElapseDOACCDEFAULTACTION, NULL); } return TRUE; @@ -1525,9 +1605,9 @@ CUTBMenuWnd::OnShowWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) STDMETHODIMP_(void) CUTBMenuWnd::OnTimer(WPARAM wParam) { - if (wParam == 11) + if (wParam == TIMER_ID_DOACCDEFAULTACTION) { - ::KillTimer(m_hWnd, 11); + ::KillTimer(m_hWnd, TIMER_ID_DOACCDEFAULTACTION); if (m_pAccessible && m_nMenuWndID) { m_pAccessible->DoDefaultActionReal(m_nMenuWndID); @@ -1633,10 +1713,10 @@ BOOL CTrayIconItem::RemoveIcon() { if (m_dwIconAddOrModify == NIM_MODIFY) { - NOTIFYICONDATA NotifyIcon = { sizeof(NotifyIcon), m_hWnd, m_uNotifyIconID }; + NOTIFYICONDATAW NotifyIcon = { sizeof(NotifyIcon), m_hWnd, m_uNotifyIconID }; NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; NotifyIcon.uCallbackMessage = m_uCallbackMessage; - ::Shell_NotifyIcon(NIM_DELETE, &NotifyIcon); + ::Shell_NotifyIconW(NIM_DELETE, &NotifyIcon); } m_dwIconAddOrModify = NIM_ADD; @@ -1644,22 +1724,22 @@ BOOL CTrayIconItem::RemoveIcon() return TRUE; } -BOOL CTrayIconItem::SetIcon(HICON hIcon, LPCTSTR pszTip) +BOOL CTrayIconItem::SetIcon(HICON hIcon, LPCWSTR pszTip) { if (!hIcon) return FALSE; - NOTIFYICONDATA NotifyIcon = { sizeof(NotifyIcon), m_hWnd, m_uNotifyIconID }; + NOTIFYICONDATAW NotifyIcon = { sizeof(NotifyIcon), m_hWnd, m_uNotifyIconID }; NotifyIcon.uFlags = NIF_ICON | NIF_MESSAGE; NotifyIcon.uCallbackMessage = m_uCallbackMessage; NotifyIcon.hIcon = hIcon; if (pszTip) { NotifyIcon.uFlags |= NIF_TIP; - StringCchCopy(NotifyIcon.szTip, _countof(NotifyIcon.szTip), pszTip); + StringCchCopyW(NotifyIcon.szTip, _countof(NotifyIcon.szTip), pszTip); } - ::Shell_NotifyIcon(m_dwIconAddOrModify, &NotifyIcon); + ::Shell_NotifyIconW(m_dwIconAddOrModify, &NotifyIcon); m_dwIconAddOrModify = NIM_MODIFY; m_bIconAdded = NIM_MODIFY; @@ -1676,6 +1756,347 @@ BOOL CTrayIconItem::UpdateMenuRectPoint() return TRUE; } +/*********************************************************************** + * CButtonIconItem + */ + +CButtonIconItem::CButtonIconItem(CTrayIconWnd *pWnd, DWORD dwUnknown24) + : CTrayIconItem(pWnd) +{ + m_dwUnknown24 = dwUnknown24; +} + +/// @unimplemented +STDMETHODIMP_(BOOL) CButtonIconItem::OnMsg(WPARAM wParam, LPARAM lParam) +{ + switch (lParam) + { + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + break; + default: + return TRUE; + } + + //FIXME + return TRUE; +} + +/// @unimplemented +STDMETHODIMP_(BOOL) CButtonIconItem::OnDelayMsg(UINT uMsg) +{ + //FIXME + return FALSE; +} + +/*********************************************************************** + * CMainIconItem + */ + +CMainIconItem::CMainIconItem(CTrayIconWnd *pWnd) + : CButtonIconItem(pWnd, 1) +{ +} + +BOOL CMainIconItem::Init(HWND hWnd) +{ + return CTrayIconItem::_Init(hWnd, WM_USER, 0, GUID_LBI_TRAYMAIN); +} + +/// @unimplemented +STDMETHODIMP_(BOOL) CMainIconItem::OnDelayMsg(UINT uMsg) +{ + if (!CButtonIconItem::OnDelayMsg(uMsg)) + return 0; + + if (uMsg == WM_LBUTTONDBLCLK) + { + //FIXME + //if (g_pTipbarWnd->m_dwUnknown20) + // g_pTipbarWnd->m_pLangBarMgr->ShowFloating(TF_SFT_SHOWNORMAL); + } + else if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN) + { + //FIXME + //g_pTipbarWnd->ShowContextMenu(m_ptCursor, &m_rcClient, uMsg == WM_RBUTTONDOWN); + } + return TRUE; +} + +/*********************************************************************** + * CTrayIconWnd + */ + +CTrayIconWnd::CTrayIconWnd() +{ + m_uCallbackMsg = WM_USER + 0x1000; + m_uNotifyIconID = 0x1000; +} + +CTrayIconWnd::~CTrayIconWnd() +{ + for (size_t iItem = 0; iItem < m_Items.size(); ++iItem) + { + auto& pItem = m_Items[iItem]; + if (pItem) + { + delete pItem; + pItem = NULL; + } + } +} + +void CTrayIconWnd::CallOnDelayMsg() +{ + for (size_t iItem = 0; iItem < m_Items.size(); ++iItem) + { + auto pItem = m_Items[iItem]; + if (pItem && m_uCallbackMessage == pItem->m_uCallbackMessage) + { + pItem->OnDelayMsg(m_uMsg); + break; + } + } +} + +HWND CTrayIconWnd::CreateWnd() +{ + m_hWnd = ::CreateWindowEx(0, TEXT("CTrayIconWndClass"), NULL, WS_DISABLED, + 0, 0, 0, 0, NULL, NULL, g_hInst, this); + FindTrayEtc(); + + m_pMainIconItem = new(cicNoThrow) CMainIconItem(this); + if (m_pMainIconItem) + { + m_pMainIconItem->Init(m_hWnd); + m_Items.Add(m_pMainIconItem); + } + + return m_hWnd; +} + +void CTrayIconWnd::DestroyWnd() +{ + ::DestroyWindow(m_hWnd); + m_hWnd = NULL; +} + +BOOL CALLBACK CTrayIconWnd::EnumChildWndProc(HWND hWnd, LPARAM lParam) +{ + CTrayIconWnd *pWnd = (CTrayIconWnd *)lParam; + + TCHAR ClassName[60]; + ::GetClassName(hWnd, ClassName, _countof(ClassName)); + if (lstrcmp(ClassName, TEXT("TrayNotifyWnd")) != 0) + return TRUE; + + pWnd->m_hNotifyWnd = hWnd; + return FALSE; +} + +CButtonIconItem *CTrayIconWnd::FindIconItem(REFGUID rguid) +{ + for (size_t iItem = 0; iItem < m_Items.size(); ++iItem) + { + auto pItem = m_Items[iItem]; + if (IsEqualGUID(rguid, pItem->m_guid)) + return pItem; + } + return NULL; +} + +BOOL CTrayIconWnd::FindTrayEtc() +{ + m_hTrayWnd = ::FindWindow(TEXT("Shell_TrayWnd"), NULL); + if (!m_hTrayWnd) + return FALSE; + + ::EnumChildWindows(m_hTrayWnd, EnumChildWndProc, (LPARAM)this); + if (!m_hNotifyWnd) + return FALSE; + m_dwTrayWndThreadId = ::GetWindowThreadProcessId(m_hTrayWnd, NULL); + m_hwndProgman = FindWindow(TEXT("Progman"), NULL); + m_dwProgmanThreadId = ::GetWindowThreadProcessId(m_hwndProgman, NULL); + return TRUE; +} + +HWND CTrayIconWnd::GetNotifyWnd() +{ + if (!::IsWindow(m_hNotifyWnd)) + FindTrayEtc(); + return m_hNotifyWnd; +} + +/// @unimplemented +BOOL CTrayIconWnd::OnIconMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + //FIXME + //if (g_pTipbarWnd) + // g_pTipbarWnd->AttachFocusThread(); + + for (size_t iItem = 0; iItem < m_Items.size(); ++iItem) + { + auto pItem = m_Items[iItem]; + if (pItem) + { + if (uMsg == pItem->m_uCallbackMessage) + { + pItem->OnMsg(wParam, lParam); + return TRUE; + } + } + } + return FALSE; +} + +BOOL CTrayIconWnd::RegisterClass() +{ + WNDCLASSEX wc = { sizeof(wc) }; + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.hInstance = g_hInst; + wc.hCursor = ::LoadCursor(NULL, (LPCTSTR)IDC_ARROW); + wc.lpfnWndProc = CTrayIconWnd::_WndProc; + wc.lpszClassName = TEXT("CTrayIconWndClass"); + ::RegisterClassEx(&wc); + return TRUE; +} + +void CTrayIconWnd::RemoveAllIcon(DWORD dwFlags) +{ + for (size_t iItem = 0; iItem < m_Items.size(); ++iItem) + { + auto pItem = m_Items[iItem]; + if (dwFlags & 0x1) + { + if (IsEqualGUID(pItem->m_guid, GUID_LBI_INATITEM) || + IsEqualGUID(pItem->m_guid, GUID_LBI_CTRL)) + { + continue; + } + } + + if (dwFlags & 0x2) + { + if (IsEqualGUID(pItem->m_guid, GUID_TFCAT_TIP_KEYBOARD)) + continue; + } + + if (pItem->m_uNotifyIconID < 0x1000) + continue; + + pItem->RemoveIcon(); + } +} + +/// @unimplemented +void CTrayIconWnd::RemoveUnusedIcons(int unknown) +{ + //FIXME +} + +BOOL CTrayIconWnd::SetIcon(REFGUID rguid, DWORD dwUnknown24, HICON hIcon, LPCWSTR psz) +{ + CButtonIconItem *pItem = FindIconItem(rguid); + if (!pItem) + { + if (!hIcon) + return FALSE; + pItem = new(cicNoThrow) CButtonIconItem(this, dwUnknown24); + if (!pItem) + return FALSE; + + pItem->_Init(m_hWnd, m_uCallbackMsg, m_uNotifyIconID, rguid); + m_uCallbackMsg += 2; + ++m_uNotifyIconID; + m_Items.Add(pItem); + } + + if (!hIcon) + return pItem->RemoveIcon(); + + return pItem->SetIcon(hIcon, psz); +} + +BOOL CTrayIconWnd::SetMainIcon(HKL hKL) +{ + if (!hKL) + { + m_pMainIconItem->RemoveIcon(); + m_pMainIconItem->m_hKL = NULL; + return TRUE; + } + + if (hKL != m_pMainIconItem->m_hKL) + { + WCHAR szText[64]; + HICON hIcon = TF_GetLangIcon(LOWORD(hKL), szText, _countof(szText)); + if (hIcon) + { + m_pMainIconItem->SetIcon(hIcon, szText); + ::DestroyIcon(hIcon); + } + else + { + ::LoadStringW(g_hInst, IDS_RESTORELANGBAR, szText, _countof(szText)); + hIcon = ::LoadIconW(g_hInst, MAKEINTRESOURCEW(IDI_MAINICON)); + m_pMainIconItem->SetIcon(hIcon, szText); + } + + m_pMainIconItem->m_hKL = hKL; + } + + return TRUE; +} + +CTrayIconWnd *CTrayIconWnd::GetThis(HWND hWnd) +{ + return (CTrayIconWnd *)::GetWindowLongPtr(hWnd, GWL_USERDATA); +} + +void CTrayIconWnd::SetThis(HWND hWnd, LPCREATESTRUCT pCS) +{ + if (pCS) + ::SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG_PTR)pCS->lpCreateParams); + else + ::SetWindowLongPtr(hWnd, GWL_USERDATA, 0); +} + +LRESULT CALLBACK +CTrayIconWnd::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CTrayIconWnd *pThis; + switch (uMsg) + { + case WM_CREATE: + CTrayIconWnd::SetThis(hWnd, (LPCREATESTRUCT)lParam); + break; + case WM_DESTROY: + ::SetWindowLongPtr(hWnd, GWL_USERDATA, 0); + break; + case WM_TIMER: + if (wParam == 100) + { + ::KillTimer(hWnd, 100); + pThis = CTrayIconWnd::GetThis(hWnd); + if (pThis) + pThis->CallOnDelayMsg(); + } + break; + default: + { + if (uMsg < WM_USER) + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); + pThis = CTrayIconWnd::GetThis(hWnd); + if (pThis && pThis->OnIconMessage(uMsg, wParam, lParam)) + break; + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); + } + } + return 0; +} + /*********************************************************************** * GetLibTls (MSUTB.@) * diff --git a/dll/win32/msutb/msutb.rc b/dll/win32/msutb/msutb.rc index 21964d264da..82ae823ce07 100644 --- a/dll/win32/msutb/msutb.rc +++ b/dll/win32/msutb/msutb.rc @@ -20,6 +20,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include +IDI_MAINICON ICON "res/earth.ico" + /* UTF-8 */ #pragma code_page(65001) diff --git a/dll/win32/msutb/precomp.h b/dll/win32/msutb/precomp.h index d198ded03f1..05b2a826e27 100644 --- a/dll/win32/msutb/precomp.h +++ b/dll/win32/msutb/precomp.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/dll/win32/msutb/res/earth.ico b/dll/win32/msutb/res/earth.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d47171f990718f9d9ce1ea5ce817f335e840919 GIT binary patch literal 22382 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