ui.cpp (353edbd3) ui.cpp (69b08be0)
1/*
2 * PROJECT: ReactOS msctfime.ime
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: User Interface of msctfime.ime
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "msctfime.h"

--- 770 unchanged lines hidden (view full) ---

779LRESULT CALLBACK
780UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
781{
782 if (uMsg == WM_CREATE)
783 return -1; // FIXME
784 return 0;
785}
786
1/*
2 * PROJECT: ReactOS msctfime.ime
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: User Interface of msctfime.ime
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "msctfime.h"

--- 770 unchanged lines hidden (view full) ---

779LRESULT CALLBACK
780UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
781{
782 if (uMsg == WM_CREATE)
783 return -1; // FIXME
784 return 0;
785}
786
787/// @implemented
788HRESULT UIComposition::OnImeNotifySetCompositionWindow(CicIMCLock& imcLock)
789{
790 return UpdateCompositionRect(imcLock);
791}
792
793/// @unimplemented
794HRESULT UIComposition::UpdateCompositionRect(CicIMCLock& imcLock)
795{
796 return E_NOTIMPL;
797}
798
799/// @implemented
800INT UIComposition::GetLevelFromIMC(CicIMCLock& imcLock)
801{
802 DWORD dwStyle = imcLock.get().cfCompForm.dwStyle;
803 if (dwStyle == CFS_DEFAULT)
804 return 1;
805 if (!(dwStyle & (CFS_FORCE_POSITION | CFS_POINT | CFS_RECT)))
806 return 0;
807
808 RECT rc;
809 ::GetClientRect(imcLock.get().hWnd, &rc);
810 if (!::PtInRect(&rc, imcLock.get().cfCompForm.ptCurrentPos))
811 return 1;
812
813 INPUTCONTEXT *pIC = &imcLock.get();
814 if ((pIC->cfCompForm.dwStyle & CFS_RECT) &&
815 (pIC->cfCompForm.rcArea.top == pIC->cfCompForm.rcArea.bottom) &&
816 (pIC->cfCompForm.rcArea.left == pIC->cfCompForm.rcArea.right))
817 {
818 return 1;
819 }
820
821 return 2;
822}
823
824/// @implemented
825HRESULT UIComposition::OnImeSetContextAfter(CicIMCLock& imcLock)
826{
827 if ((!m_pDefCompFrameWindow || !::IsWindow(*m_pDefCompFrameWindow)) && !::IsWindow(m_CompStrs[0].m_hWnd))
828 {
829 m_dwUnknown56[0] &= ~0x8000;
830 return S_OK;
831 }
832
833 if (FAILED(imcLock.m_hr))
834 return imcLock.m_hr;
835
836 INT Level = GetLevelFromIMC(imcLock);
837 if ((Level == 1 || Level == 2) && (m_dwUnknown56[0] & 0x80000000) && m_dwUnknown56[1])
838 {
839 DWORD dwCompStrLen = 0;
840 UpdateShowCompWndFlag(imcLock, &dwCompStrLen);
841
842 if (Level == 1)
843 {
844 ::ShowWindow(*m_pDefCompFrameWindow, (m_bHasCompStr ? SW_SHOWNOACTIVATE : SW_HIDE));
845 }
846 else if (Level == 2 && !m_bHasCompStr && dwCompStrLen)
847 {
848 for (INT iCompStr = 0; iCompStr < 3; ++iCompStr)
849 {
850 m_CompStrs[iCompStr].m_Caret.HideCaret();
851 ::ShowWindow(m_CompStrs[iCompStr].m_Caret, SW_HIDE);
852 }
853 }
854 }
855 else
856 {
857 ::ShowWindow(*m_pDefCompFrameWindow, SW_HIDE);
858
859 for (INT iCompStr = 0; iCompStr < 3; ++iCompStr)
860 {
861 m_CompStrs[iCompStr].m_Caret.HideCaret();
862 ::ShowWindow(m_CompStrs[iCompStr].m_Caret, SW_HIDE);
863 }
864 }
865
866 return S_OK;
867}
868
787/***********************************************************************/
788
789// For GetWindowLongPtr/SetWindowLongPtr
790#define UI_GWLP_HIMC 0
791#define UI_GWLP_UI sizeof(HIMC)
792#define UI_GWLP_SIZE (UI_GWLP_UI + sizeof(UI*))
793
794/// @implemented

--- 53 unchanged lines hidden (view full) ---

848 m_pComp->OnImeSetContext(imcLock, m_hWnd, wParam, lParam);
849}
850
851/***********************************************************************/
852
853struct CIMEUIWindowHandler
854{
855 static LRESULT CALLBACK ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
869/***********************************************************************/
870
871// For GetWindowLongPtr/SetWindowLongPtr
872#define UI_GWLP_HIMC 0
873#define UI_GWLP_UI sizeof(HIMC)
874#define UI_GWLP_SIZE (UI_GWLP_UI + sizeof(UI*))
875
876/// @implemented

--- 53 unchanged lines hidden (view full) ---

930 m_pComp->OnImeSetContext(imcLock, m_hWnd, wParam, lParam);
931}
932
933/***********************************************************************/
934
935struct CIMEUIWindowHandler
936{
937 static LRESULT CALLBACK ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
856 static LRESULT CALLBACK ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM lParam);
938 static HRESULT CALLBACK ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM lParam);
857 static LRESULT CALLBACK ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam);
858 static LRESULT CALLBACK ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, LPARAM lParam);
859 static LRESULT CALLBACK ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
939 static LRESULT CALLBACK ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam);
940 static LRESULT CALLBACK ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, LPARAM lParam);
941 static LRESULT CALLBACK ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
942 static HRESULT CALLBACK ImeUIDelayedReconvertFuncCall(HWND hWnd);
943 static HRESULT CALLBACK ImeUIOnLayoutChange(LPARAM lParam);
944 static HRESULT CALLBACK ImeUIPrivateHandler(UINT uMsg, WPARAM wParam, LPARAM lParam);
945 static LRESULT CALLBACK ImeUINotifyHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
860};
861
946};
947
862/// @unimplemented
863LRESULT CALLBACK
948/// @implemented
949HRESULT CALLBACK
864CIMEUIWindowHandler::ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
865{
950CIMEUIWindowHandler::ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
951{
866 return 0; //FIXME
952 if ((BYTE)wParam == 0xFF)
953 return TRUE;
954
955 CicIMCLock imcLock((HIMC)lParam);
956 if (FAILED(imcLock.m_hr))
957 return imcLock.m_hr;
958
959 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
960 if (FAILED(imeContext.m_hr))
961 return FALSE;
962
963 HRESULT hr = E_FAIL;
964 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
965 if (pCicIC)
966 {
967 UINT keys = 0;
968 if (wParam & MK_LBUTTON)
969 keys |= 0x1;
970 if (wParam & MK_SHIFT)
971 keys |= 0x10;
972 if (wParam & MK_RBUTTON)
973 keys |= 0x2;
974 if (wParam & MK_MBUTTON)
975 keys |= 0x780000;
976 else if (wParam & MK_ALT)
977 keys |= 0xFF880000;
978 hr = pCicIC->MsImeMouseHandler(HIWORD(wParam), HIBYTE(LOWORD(wParam)), keys, imcLock);
979 }
980
981 return hr;
867}
868
982}
983
869/// @unimplemented
984/// @implemented
985HRESULT CALLBACK CIMEUIWindowHandler::ImeUIOnLayoutChange(LPARAM lParam)
986{
987 CicIMCLock imcLock((HIMC)lParam);
988 if (FAILED(imcLock.m_hr))
989 return S_OK;
990
991 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
992 if (FAILED(imeContext.m_hr))
993 return S_OK;
994
995 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
996 if (pCicIC)
997 {
998 auto pContextOwnerServices = pCicIC->m_pContextOwnerServices;
999 pContextOwnerServices->AddRef();
1000 pContextOwnerServices->OnLayoutChange();
1001 pContextOwnerServices->Release();
1002 }
1003
1004 return S_OK;
1005}
1006
1007/// @implemented
1008HRESULT CALLBACK
1009CIMEUIWindowHandler::ImeUIPrivateHandler(UINT uMsg, WPARAM wParam, LPARAM lParam)
1010{
1011 CicIMCLock imcLock((HIMC)lParam);
1012 if (FAILED(imcLock.m_hr))
1013 return imcLock.m_hr;
1014
1015 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
1016 if (FAILED(imeContext.m_hr))
1017 return imeContext.m_hr;
1018
1019 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
1020 if (pCicIC && wParam == 0x10)
1021 pCicIC->EscbClearDocFeedBuffer(imcLock, TRUE);
1022
1023 return S_OK;
1024}
1025
1026/// @implemented
870LRESULT CALLBACK
871CIMEUIWindowHandler::ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
872{
1027LRESULT CALLBACK
1028CIMEUIWindowHandler::ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, LPARAM lParam)
1029{
873 return 0; //FIXME
1030 if (!wParam)
1031 return TRUE;
1032
1033 CicIMCLock imcLock((HIMC)lParam);
1034 if (FAILED(imcLock.m_hr))
1035 return imcLock.m_hr;
1036
1037 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
1038 if (FAILED(imeContext.m_hr))
1039 return FALSE;
1040
1041 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
1042 if (!pCicIC)
1043 return FALSE;
1044
1045 if (wParam == 1)
1046 {
1047 if (lParam == 0 || lParam == 1 || lParam == 4 || lParam == 0x10000)
1048 {
1049 GUID guid = pCicIC->m_ModeBias.ConvertModeBias((DWORD)lParam);
1050 pCicIC->m_ModeBias.SetModeBias(guid);
1051
1052 pCicIC->m_dwUnknown7[2] |= 1;
1053 pCicIC->m_pContextOwnerServices->AddRef();
1054 pCicIC->m_pContextOwnerServices->OnAttributeChange(GUID_PROP_MODEBIAS);
1055 pCicIC->m_pContextOwnerServices->Release();
1056 return TRUE;
1057 }
1058 }
1059 else if (wParam == 2)
1060 {
1061 return pCicIC->m_ModeBias.ConvertModeBias(pCicIC->m_ModeBias.m_guid);
1062 }
1063
1064 return FALSE;
874}
875
1065}
1066
876/// @unimplemented
1067/// @implemented
877LRESULT CALLBACK
878CIMEUIWindowHandler::ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, LPARAM lParam)
879{
1068LRESULT CALLBACK
1069CIMEUIWindowHandler::ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, LPARAM lParam)
1070{
880 return 0; //FIXME
1071 if (wParam == 0x10000000)
1072 return TRUE;
1073
1074 HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
1075 CicIMCLock imcLock(hIMC);
1076 if (FAILED(imcLock.m_hr))
1077 return FALSE;
1078
1079 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
1080 if (FAILED(imeContext.m_hr))
1081 return FALSE;
1082
1083 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
1084 TLS *pTLS = TLS::GetTLS();
1085 if (!pCicIC || !pTLS)
1086 return FALSE;
1087
1088 auto pThreadMgr = pTLS->m_pThreadMgr;
1089 auto pProfile = pTLS->m_pProfile;
1090 if (!pThreadMgr || !pProfile)
1091 return FALSE;
1092
1093 UINT uCodePage = 0;
1094 pProfile->GetCodePageA(&uCodePage);
1095 pCicIC->SetupReconvertString(imcLock, pThreadMgr, uCodePage, WM_MSIME_RECONVERT, FALSE);
1096 pCicIC->EndReconvertString(imcLock);
1097 return TRUE;
881}
882
883/// @implemented
884LRESULT CALLBACK
885CIMEUIWindowHandler::ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
886{
887 if (uMsg == WM_MSIME_MOUSE)
888 return ImeUIMsImeMouseHandler(hWnd, wParam, lParam);

--- 11 unchanged lines hidden (view full) ---

900 if (PRIMARYLANGID(LangID) == LANG_KOREAN)
901 return FALSE;
902 }
903 return TRUE;
904 }
905 return 0;
906}
907
1098}
1099
1100/// @implemented
1101LRESULT CALLBACK
1102CIMEUIWindowHandler::ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1103{
1104 if (uMsg == WM_MSIME_MOUSE)
1105 return ImeUIMsImeMouseHandler(hWnd, wParam, lParam);

--- 11 unchanged lines hidden (view full) ---

1117 if (PRIMARYLANGID(LangID) == LANG_KOREAN)
1118 return FALSE;
1119 }
1120 return TRUE;
1121 }
1122 return 0;
1123}
1124
1125/// @implemented
1126HRESULT CALLBACK
1127CIMEUIWindowHandler::ImeUIDelayedReconvertFuncCall(HWND hWnd)
1128{
1129 HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
1130 CicIMCLock imcLock(hIMC);
1131 if (FAILED(imcLock.m_hr))
1132 return imcLock.m_hr;
1133 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
1134 if (FAILED(imeContext.m_hr))
1135 return imeContext.m_hr;
1136 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
1137 if (pCicIC)
1138 pCicIC->DelayedReconvertFuncCall(imcLock);
1139 return S_OK;
1140}
1141
908/// @unimplemented
909LRESULT CALLBACK
1142/// @unimplemented
1143LRESULT CALLBACK
1144CIMEUIWindowHandler::ImeUINotifyHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1145{
1146 HIMC hIMC = (HIMC)::GetWindowLongPtrW(hWnd, UI_GWLP_HIMC);
1147 CicIMCLock imcLock(hIMC);
1148 if (FAILED(imcLock.m_hr))
1149 return imcLock.m_hr;
1150 CicIMCCLock<CTFIMECONTEXT> imeContext(imcLock.get().hCtfImeContext);
1151 if (FAILED(imeContext.m_hr))
1152 return imeContext.m_hr;
1153
1154 CicInputContext *pCicIC = imeContext.get().m_pCicIC;
1155 if (pCicIC)
1156 {
1157 switch (wParam)
1158 {
1159 case IMN_CLOSECANDIDATE:
1160 {
1161 pCicIC->m_bCandidateOpen = FALSE;
1162 HWND hImeWnd = ::ImmGetDefaultIMEWnd(NULL);
1163 if (::IsWindow(hImeWnd))
1164 ::PostMessage(hImeWnd, WM_IME_NOTIFY, 0x10, (LPARAM)hIMC);
1165 break;
1166 }
1167 case IMN_OPENCANDIDATE:
1168 {
1169 pCicIC->m_bCandidateOpen = TRUE;
1170 pCicIC->ClearPrevCandidatePos();
1171 break;
1172 }
1173 case IMN_SETCANDIDATEPOS:
1174 {
1175 //FIXME
1176 break;
1177 }
1178 case IMN_SETCOMPOSITIONFONT:
1179 {
1180 //FIXME
1181 break;
1182 }
1183 case IMN_SETCOMPOSITIONWINDOW:
1184 {
1185 //FIXME
1186 break;
1187 }
1188 case 0xF:
1189 {
1190 CIMEUIWindowHandler::ImeUIOnLayoutChange(lParam);
1191 break;
1192 }
1193 case 0x10:
1194 {
1195 CIMEUIWindowHandler::ImeUIPrivateHandler(uMsg, 0x10, lParam);
1196 break;
1197 }
1198 case 0x13:
1199 {
1200 CIMEUIWindowHandler::ImeUIOnLayoutChange(lParam);
1201 break;
1202 }
1203 case 0x14:
1204 {
1205 //FIXME
1206 break;
1207 }
1208 case 0x16:
1209 {
1210 ::SetTimer(hWnd, 2, 100, NULL);
1211 break;
1212 }
1213 case 0x17:
1214 {
1215 return (LRESULT)hWnd;
1216 }
1217 case 0x10D:
1218 {
1219 //FIXME
1220 break;
1221 }
1222 case 0x10E:
1223 pCicIC->m_dwQueryPos = 0;
1224 break;
1225 }
1226 }
1227
1228 return 0;
1229}
1230
1231/// @implemented
1232LRESULT CALLBACK
910CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
911{
912 TLS *pTLS = TLS::GetTLS();
913 if (pTLS && (pTLS->m_dwSystemInfoFlags & IME_SYSINFO_WINLOGON))
914 {
915 if (uMsg == WM_CREATE)
916 return -1;
1233CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1234{
1235 TLS *pTLS = TLS::GetTLS();
1236 if (pTLS && (pTLS->m_dwSystemInfoFlags & IME_SYSINFO_WINLOGON))
1237 {
1238 if (uMsg == WM_CREATE)
1239 return -1;
917 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
1240 return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
918 }
919
920 switch (uMsg)
921 {
922 case WM_CREATE:
923 {
924 UI::OnCreate(hWnd);
925 break;

--- 23 unchanged lines hidden (view full) ---

949 break;
950 }
951 case WM_IME_COMPOSITION:
952 {
953 if (lParam & GCS_COMPSTR)
954 {
955 pUI->m_pComp->OnImeCompositionUpdate(imcLock);
956 ::SetTimer(hWnd, 0, 10, NULL);
1241 }
1242
1243 switch (uMsg)
1244 {
1245 case WM_CREATE:
1246 {
1247 UI::OnCreate(hWnd);
1248 break;

--- 23 unchanged lines hidden (view full) ---

1272 break;
1273 }
1274 case WM_IME_COMPOSITION:
1275 {
1276 if (lParam & GCS_COMPSTR)
1277 {
1278 pUI->m_pComp->OnImeCompositionUpdate(imcLock);
1279 ::SetTimer(hWnd, 0, 10, NULL);
957 //FIXME
1280 pUI->m_pComp->m_bInComposition = TRUE;
958 }
959 break;
960 }
961 case WM_IME_ENDCOMPOSITION:
962 {
963 ::KillTimer(hWnd, 0);
964 pUI->m_pComp->OnImeEndComposition();
965 break;
966 }
967 case WM_IME_SETCONTEXT:
968 {
969 pUI->OnImeSetContext(imcLock, wParam, lParam);
970 ::KillTimer(hWnd, 1);
971 ::SetTimer(hWnd, 1, 300, NULL);
972 break;
973 }
974 case WM_TIMER:
975 {
1281 }
1282 break;
1283 }
1284 case WM_IME_ENDCOMPOSITION:
1285 {
1286 ::KillTimer(hWnd, 0);
1287 pUI->m_pComp->OnImeEndComposition();
1288 break;
1289 }
1290 case WM_IME_SETCONTEXT:
1291 {
1292 pUI->OnImeSetContext(imcLock, wParam, lParam);
1293 ::KillTimer(hWnd, 1);
1294 ::SetTimer(hWnd, 1, 300, NULL);
1295 break;
1296 }
1297 case WM_TIMER:
1298 {
976 //FIXME
977 ::KillTimer(hWnd, wParam);
1299 switch (wParam)
1300 {
1301 case 0:
1302 ::KillTimer(hWnd, wParam);
1303 pUI->m_pComp->m_bInComposition = FALSE;
1304 pUI->m_pComp->OnImeNotifySetCompositionWindow(imcLock);
1305 break;
1306 case 1:
1307 ::KillTimer(hWnd, wParam);
1308 pUI->m_pComp->OnImeSetContextAfter(imcLock);
1309 break;
1310 case 2:
1311 ::KillTimer(hWnd, wParam);
1312 CIMEUIWindowHandler::ImeUIDelayedReconvertFuncCall(hWnd);
1313 break;
1314 default:
1315 break;
1316 }
978 break;
979 }
980 case WM_IME_NOTIFY:
981 case WM_IME_SELECT:
982 default:
983 {
984 pUI->m_pComp->OnPaintTheme(wParam);
985 break;
986 }
987 }
988 break;
989 }
990 default:
991 {
992 if (IsMsImeMessage(uMsg))
993 return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, wParam, lParam);
1317 break;
1318 }
1319 case WM_IME_NOTIFY:
1320 case WM_IME_SELECT:
1321 default:
1322 {
1323 pUI->m_pComp->OnPaintTheme(wParam);
1324 break;
1325 }
1326 }
1327 break;
1328 }
1329 default:
1330 {
1331 if (IsMsImeMessage(uMsg))
1332 return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, wParam, lParam);
994 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
1333 return ::DefWindowProcW(hWnd, uMsg, wParam, lParam);
995 }
996 }
997
998 return 0;
999}
1000
1001/***********************************************************************/
1002

--- 68 unchanged lines hidden ---
1334 }
1335 }
1336
1337 return 0;
1338}
1339
1340/***********************************************************************/
1341

--- 68 unchanged lines hidden ---