[Ttssh2-commit] [8808] ブロードキャストコマンドのリアルタイム=ON時、Unicode化

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 6月 23日 (火) 00:11:02 JST


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();


Ttssh2-commit メーリングリストの案内
Back to archive index