Revision: 8808 https://osdn.net/projects/ttssh2/scm/svn/commits/8808 Author: zmatsuo Date: 2020-06-23 00:11:01 +0900 (Tue, 23 Jun 2020) Log Message: ----------- ブロードキャストコマンドのリアルタイム=ON時、Unicode化 - リアルタイム入力で漢字変換できるようにした - WM_UNICHAR を使ったUTF-32文字の送受ができるようになった Modified Paths: -------------- branches/broadcast/teraterm/teraterm/broadcast.cpp branches/broadcast/teraterm/teraterm/vtwin.cpp branches/broadcast/teraterm/teraterm/vtwin.h -------------- next part -------------- Modified: branches/broadcast/teraterm/teraterm/broadcast.cpp =================================================================== --- branches/broadcast/teraterm/teraterm/broadcast.cpp 2020-06-22 15:10:48 UTC (rev 8807) +++ branches/broadcast/teraterm/teraterm/broadcast.cpp 2020-06-22 15:11:01 UTC (rev 8808) @@ -51,7 +51,8 @@ #include "layer_for_unicode.h" #include "codeconv.h" #include "sendmem.h" -//#include "clipboar.h" +//#include "clipboar.h" // TODO \x8F\xC1\x82\xB7 +#include "ttime.h" #include "broadcast.h" @@ -99,8 +100,8 @@ SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_RESETCONTENT, 0, 0); do { _snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "Command%d", i); - GetPrivateProfileString("BroadcastCommands",EntName,"", - Command,sizeof(Command), historyfile); + GetPrivateProfileStringA("BroadcastCommands",EntName,"", + Command,sizeof(Command), historyfile); if (strlen(Command) > 0) { SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_ADDSTRING, 0, (LPARAM)Command); @@ -114,6 +115,12 @@ SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_SETCURSEL,0,0); } +BOOL IsUnicharSupport(HWND hwnd) +{ + LRESULT r = SendMessage(hwnd, WM_UNICHAR, UNICODE_NOCHAR, 0); + return (BOOL)r; +} + // \x83h\x83\x8D\x83b\x83v\x83_\x83E\x83\x93\x82̒\x86\x82̃G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82\xF0 // \x83T\x83u\x83N\x83\x89\x83X\x89\xBB\x82\xB7\x82邽\x82߂̃E\x83C\x83\x93\x83h\x83E\x83v\x83\x8D\x83V\x81[\x83W\x83\x83 static WNDPROC OrigBroadcastEditProc; // Original window procedure @@ -123,9 +130,11 @@ { char buf[1024]; int len; + static BOOL ime_mode = FALSE; switch (msg) { case WM_CREATE: + ime_mode = FALSE; break; case WM_DESTROY: @@ -148,7 +157,7 @@ case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: - { + if (ime_mode == FALSE) { int i; HWND hd; int count; @@ -167,18 +176,63 @@ } } } + return FALSE; } break; case WM_CHAR: // \x93\xFC\x97͂\xB5\x82\xBD\x95\xB6\x8E\x9A\x82\xAAIDC_COMMAND_EDIT\x82Ɏc\x82\xE7\x82Ȃ\xA2\x82悤\x82Ɏ̂Ă\xE9 - return FALSE; + if (ime_mode == FALSE) { + return FALSE; + } + break; + case WM_IME_NOTIFY: + switch (wParam) { + case IMN_SETOPENSTATUS: + // IME\x82\xCCOn/Off\x82\xF0\x8E擾\x82\xB7\x82\xE9 + ime_mode = GetIMEOpenStatus(dlg); + } + break; + + case WM_IME_COMPOSITION: { + if (CanUseIME()) { + size_t len; + const wchar_t *lpstr = GetConvStringW(dlg, lParam, &len); + if (lpstr != NULL) { + char32_t *strU32 = ToU32W(lpstr); + int count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0); + for (int i = 0 ; i < count ; i++) { + if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) { + HWND hwnd = GetNthWin(i); + if (hwnd != NULL) { + BOOL support_unichar = IsUnicharSupport(hwnd); + if (!support_unichar) { + for (size_t j = 0; j < len; j++) { + ::PostMessageW(hwnd, WM_CHAR, lpstr[j], 1); + } + } + else { + const char32_t *p = strU32; + while (*p != 0) { + ::PostMessageW(hwnd, WM_UNICHAR, *p, 1); + p++; + } + } + } + } + } + free((void *)lpstr); + free(strU32); + return FALSE; + } + } + break; + } default: - return _CallWindowProcW(OrigBroadcastEditProc, dlg, msg, wParam, lParam); + break; } - - return FALSE; + return _CallWindowProcW(OrigBroadcastEditProc, dlg, msg, wParam, lParam); } static void UpdateBroadcastWindowList(HWND hWnd) Modified: branches/broadcast/teraterm/teraterm/vtwin.cpp =================================================================== --- branches/broadcast/teraterm/teraterm/vtwin.cpp 2020-06-22 15:10:48 UTC (rev 8807) +++ branches/broadcast/teraterm/teraterm/vtwin.cpp 2020-06-22 15:11:01 UTC (rev 8808) @@ -1680,6 +1680,24 @@ } } +LRESULT CVTWindow::OnUniChar(WPARAM wParam, LPARAM lParam) +{ + if (wParam == UNICODE_NOCHAR) { + // \x82\xB1\x82̃\x81\x83b\x83Z\x81[\x83W\x82\xF0\x83T\x83|\x81[\x83g\x82\xB5\x82Ă\xA2\x82邩\x83e\x83X\x83g\x82ł\xAB\x82\xE9\x82悤\x82ɂ\xB7\x82邽\x82\xDF + return TRUE; + } + + char32_t u32 = (char32_t)wParam; + wchar_t strW[2]; + size_t u16_len = UTF32ToUTF16(u32, strW, _countof(strW)); + CommTextOutW(&cv, strW, u16_len); + if (ts.LocalEcho > 0) { + CommTextEchoW(&cv, strW, u16_len); + } + + return FALSE; +} + /* copy from ttset.c*/ static void WriteInt2(const char *Sect, const char *Key, const char *FName, int i1, int i2) { @@ -5723,6 +5741,9 @@ case WM_CHAR: OnChar(wp, LOWORD(lp), HIWORD(lp)); break; + case WM_UNICHAR: + retval = OnUniChar(wp, lp); + break; case WM_CLOSE: OnClose(); break; Modified: branches/broadcast/teraterm/teraterm/vtwin.h =================================================================== --- branches/broadcast/teraterm/teraterm/vtwin.h 2020-06-22 15:10:48 UTC (rev 8807) +++ branches/broadcast/teraterm/teraterm/vtwin.h 2020-06-22 15:11:01 UTC (rev 8808) @@ -98,6 +98,7 @@ virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); void OnActivate(UINT nState, HWND pWndOther, BOOL bMinimized); void OnChar(WPARAM nChar, UINT nRepCnt, UINT nFlags); + LRESULT OnUniChar(WPARAM wParam, LPARAM lParam); void OnClose(); void OnAllClose(); void OnDestroy();