[ttssh2-commit] [11017] ログダイアログオープン時、コントロールのdisableが遅れるので対策

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 10月 21日 (土) 01:08:30 JST


Revision: 11017
          https://osdn.net/projects/ttssh2/scm/svn/commits/11017
Author:   zmatsuo
Date:     2023-10-21 01:08:30 +0900 (Sat, 21 Oct 2023)
Log Message:
-----------
ログダイアログオープン時、コントロールのdisableが遅れるので対策

- コントロールの設定順を見直した
  - ファイル名の設定するのを最後にした
- タイマーの使い方を誤っていたので修正
- BOOL を bool に変更

Modified Paths:
--------------
    trunk/teraterm/teraterm/logdlg.cpp

-------------- next part --------------
Modified: trunk/teraterm/teraterm/logdlg.cpp
===================================================================
--- trunk/teraterm/teraterm/logdlg.cpp	2023-10-20 13:27:46 UTC (rev 11016)
+++ trunk/teraterm/teraterm/logdlg.cpp	2023-10-20 16:08:30 UTC (rev 11017)
@@ -52,14 +52,16 @@
 #include "logdlg.h"
 
 #define TitLog      L"Log"
+#define ID_EVENT	0
 
 typedef struct {
 	FLogDlgInfo_t *info;
 	// work
-	BOOL file_exist;
+	bool file_exist;
 	int current_bom; // \x91\xB6\x8D݂\xB7\x82\xE9\x83t\x83@\x83C\x83\x8B\x82̃G\x83\x93\x83R\x81[\x83f\x83B\x83\x93\x83O\x81i\x83t\x83@\x83C\x83\x8B\x82\xCCBOM\x82\xA9\x82画\x92\xE8\x81j
-	UINT_PTR timer;
-	BOOL enable_timer;
+	bool available_timer;
+	bool enable_timer;
+	bool on_initdialog;
 	WNDPROC proc;
 	TTTSet *pts;
 	TComVar *pcv;
@@ -103,13 +105,13 @@
  *	\x83\x8D\x83O\x83t\x83@\x83C\x83\x8B\x83`\x83F\x83b\x83N
  *
  *	@param[in]	filename
- *	@param[out]	exist	TURE/FALSE
- *	@param[out]	bom		0	no BOM (or file not exist)
+ *	@param[out]	exist	ture/false
+ *	@param[out]	bom		0	no BOM (or file not exist or too short)
  *						1	UTF-8
  *						2	UTF-16LE
  *						3	UTF-16BE
  */
-static void CheckLogFile(const wchar_t *filename, BOOL *exist, int *bom)
+static void CheckLogFile(const wchar_t *filename, bool *exist, int *bom)
 {
 	*exist = FALSE;
 	*bom = 0;
@@ -147,7 +149,7 @@
 
 static void CheckLogFile(const wchar_t *filename, LogDlgWork_t *work)
 {
-	BOOL exist;
+	bool exist;
 	int bom;
 	CheckLogFile(filename, &exist, &bom);
 	work->file_exist = exist;
@@ -229,7 +231,7 @@
 	case WM_LBUTTONDOWN:
 	case WM_RBUTTONDOWN:
 	case WM_KILLFOCUS:
-		work->enable_timer = FALSE;
+		work->enable_timer = false;
 		break;
 	}
 	return CallWindowProcW(work->proc, dlg, msg, wParam, lParam);
@@ -268,6 +270,7 @@
 	switch (Message) {
 	case WM_INITDIALOG: {
 		work = (LogDlgWork_t *)lParam;
+		work->on_initdialog = true;
 		TTTSet *pts = work->pts;
 		SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)work);
 		::DragAcceptFiles(Dialog, TRUE);
@@ -285,16 +288,6 @@
 		CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND,
 						 pts->Append == 0 ? IDC_NEW_OVERWRITE : IDC_APPEND);
 
-		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x90ݒ肷\x82\xE9
-		//   \x83t\x83@\x83C\x83\x8B\x82̃`\x83F\x83b\x83N\x81A\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82̐ݒ\xE8\x82\xE0\x8Ds\x82\xED\x82\xEA\x82\xE9
-		//		WM_COMMAND, EN_CHANGE \x82\xAA\x94\xAD\x90\xB6\x82\xB7\x82\xE9
-		wchar_t *fname = FLogGetLogFilename(work->info->filename);
-		SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
-		free(fname);
-		HWND file_edit = GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT);
-		SetWindowLongPtr(file_edit, GWLP_USERDATA, (LONG_PTR)work);
-		work->proc = (WNDPROC)SetWindowLongPtrW(file_edit, GWLP_WNDPROC, (LONG_PTR)FNameEditProc);
-
 		// timestamp
 		CheckDlgButton(Dialog, IDC_TIMESTAMP, pts->LogTimestamp == 0 ? BST_UNCHECKED : BST_CHECKED);
 
@@ -322,13 +315,26 @@
 		// text/binary radio button
 		CheckRadioButton(Dialog, IDC_FOPTBIN, IDC_FOPTTEXT, pts->LogBinary == 0 ? IDC_FOPTTEXT : IDC_FOPTBIN);
 
+		// \x83t\x83@\x83C\x83\x8B\x96\xBC\x82\xF0\x90ݒ肷\x82\xE9
+		//   \x83t\x83@\x83C\x83\x8B\x82̃`\x83F\x83b\x83N\x81A\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82̐ݒ\xE8\x82\xE0\x8Ds\x82\xED\x82\xEA\x82\xE9
+		//		WM_COMMAND, EN_CHANGE \x82\xAA\x94\xAD\x90\xB6\x82\xB7\x82\xE9
+		wchar_t *fname = FLogGetLogFilename(work->info->filename);
+		SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
+		free(fname);
+		HWND file_edit = GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT);
+		SetWindowLongPtr(file_edit, GWLP_USERDATA, (LONG_PTR)work);
+		work->proc = (WNDPROC)SetWindowLongPtrW(file_edit, GWLP_WNDPROC, (LONG_PTR)FNameEditProc);
+
 		CenterWindow(Dialog, GetParent(Dialog));
 
 		SetFocus(GetDlgItem(Dialog, IDC_FOPT_FILENAME_EDIT));
 
-		work->enable_timer = TRUE;
-		work->timer = SetTimer(Dialog, 0, 1000, NULL);
+		work->enable_timer = true;
+		work->available_timer = true;
+		SetTimer(Dialog, ID_EVENT, 1000, NULL);
 
+		work->on_initdialog = false;
+
 		return TRUE;
 	}
 
@@ -401,10 +407,10 @@
 			if (HIWORD(wParam) == EN_CHANGE){
 				wchar_t *filename;
 				hGetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, &filename);
-				const BOOL file_exist_prev = work->file_exist;
+				const bool file_exist_prev = work->file_exist;
 				CheckLogFile(filename, work);
 				free(filename);
-				if (file_exist_prev != work->file_exist) {
+				if (work->on_initdialog || file_exist_prev != work->file_exist) {
 					if (work->file_exist) {
 						// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB7\x82\xE9\x81A\x90ݒ\xE8\x82ɍ\x87\x82킹\x82ĐV\x8BK(\x8F㏑\x82\xAB)/\x92NjL\x82\xF0\x91I\x91\xF0\x82\xB7\x82\xE9
 						CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND,
@@ -414,8 +420,8 @@
 						// \x83t\x83@\x83C\x83\x8B\x82\xAA\x91\xB6\x8D݂\xB5\x82Ȃ\xA2\x81A\x90V\x8BK\x82\xF0\x91I\x91\xF0\x82\xB7\x82\xE9
 						CheckRadioButton(Dialog, IDC_NEW_OVERWRITE, IDC_APPEND, IDC_NEW_OVERWRITE);
 					}
+					ArrangeControls(Dialog, work);
 				}
-				ArrangeControls(Dialog, work);
 			}
 			break;
 		}
@@ -440,8 +446,8 @@
 	}
 	case WM_TIMER: {
 		if (!work->enable_timer) {
-			KillTimer(Dialog, work->timer);
-			work->timer = 0;
+			KillTimer(Dialog, ID_EVENT);
+			work->available_timer = false;
 			break;
 		}
 		wchar_t *fname = FLogGetLogFilename(work->info->filename);
@@ -448,12 +454,12 @@
 		SetDlgItemTextW(Dialog, IDC_FOPT_FILENAME_EDIT, fname);
 		SendDlgItemMessageW(Dialog, IDC_FOPT_FILENAME_EDIT, EM_SETSEL, 0, -1);
 		free(fname);
-		work->timer = SetTimer(Dialog, 0, 1000, NULL);
 		break;
 	}
 	case WM_DESTROY:
-		if (work->timer != 0) {
-			KillTimer(Dialog, work->timer);
+		if (work->available_timer) {
+			KillTimer(Dialog, ID_EVENT);
+			work->available_timer = false;
 		}
 		break;
 	}


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