Revision: 8218 https://osdn.net/projects/ttssh2/scm/svn/commits/8218 Author: yutakapon Date: 2019-09-22 20:00:31 +0900 (Sun, 22 Sep 2019) Log Message: ----------- SSHユーザ認証ダイアログで、ユーザ欄からTABキーでパスフレーズ欄への移動に遅延がある問題を改善した。 Modified Paths: -------------- trunk/doc/en/html/about/history.html trunk/doc/ja/html/about/history.html trunk/ttssh2/ttxssh/auth.c -------------- next part -------------- Modified: trunk/doc/en/html/about/history.html =================================================================== --- trunk/doc/en/html/about/history.html 2019-09-22 09:40:24 UTC (rev 8217) +++ trunk/doc/en/html/about/history.html 2019-09-22 11:00:31 UTC (rev 8218) @@ -3221,6 +3221,7 @@ <li>The same messages may be included on MessageBox displaying.</li> <li>When the network is disconnected from SSH server side, an application fault may be occurred while known_hosts dialog is shown.</li> <li>SSH1: The <a href="../commandline/ttssh.html#nosecuritywarning">/nosecuritywarning</a> option does not work well.</li> + <li>The problem is improved in the user authentication dialog that the delay occurs when the focus is moved from the user name to passphrase with TAB key.</li> </ul> </li> </ul> Modified: trunk/doc/ja/html/about/history.html =================================================================== --- trunk/doc/ja/html/about/history.html 2019-09-22 09:40:24 UTC (rev 8217) +++ trunk/doc/ja/html/about/history.html 2019-09-22 11:00:31 UTC (rev 8218) @@ -3227,6 +3227,7 @@ <li>\x83\x81\x83b\x83Z\x81[\x83W\x83{\x83b\x83N\x83X\x82̕\\x8E\xA6\x82ɓ\xAF\x88ꃁ\x83b\x83Z\x81[\x83W\x82\xAA\x95\xA1\x90\x94\x8A܂܂\xEA\x82邱\x82Ƃ\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li> <li>known_hosts\x83_\x83C\x83A\x83\x8D\x83O\x82̕\\x8E\xA6\x92\x86\x82\xC9SSH\x83T\x81[\x83o\x91\xA4\x82\xA9\x82\xE7\x83l\x83b\x83g\x83\x8F\x81[\x83N\x90ؒf\x82\xB3\x82\xEA\x82\xE9\x82ƁA\x83A\x83v\x83\x8A\x82\xAA\x83N\x83\x89\x83b\x83V\x83\x85\x82\xB7\x82邱\x82Ƃ\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li> <li>SSH1: <a href="../commandline/ttssh.html#nosecuritywarning">/nosecuritywarning</a>\x83I\x83v\x83V\x83\x87\x83\x93\x82\xAA\x8B@\x94\\x82\xB5\x82Ă\xA2\x82Ȃ\xA9\x82\xC1\x82\xBD\x96\xE2\x91\xE8\x82\xF0\x8FC\x90\xB3\x82\xB5\x82\xBD\x81B</li> + <li>\x83\x86\x81[\x83U\x94F\x8F_\x83C\x83A\x83\x8D\x83O\x82ŁA\x83\x86\x81[\x83U\x97\x93\x82\xA9\x82\xE7TAB\x83L\x81[\x82Ńp\x83X\x83t\x83\x8C\x81[\x83Y\x97\x93\x82ւ̈ړ\xAE\x82ɒx\x89\x84\x82\xAA\x82\xA0\x82\xE9\x96\xE2\x91\xE8\x82\xF0\x89\xFC\x91P\x82\xB5\x82\xBD\x81B</li> </ul> </li> </ul> Modified: trunk/ttssh2/ttxssh/auth.c =================================================================== --- trunk/ttssh2/ttxssh/auth.c 2019-09-22 09:40:24 UTC (rev 8217) +++ trunk/ttssh2/ttxssh/auth.c 2019-09-22 11:00:31 UTC (rev 8218) @@ -243,31 +243,59 @@ } } +typedef struct { + int tab_focus_entered; + WNDPROC proc_org; + size_t str_len; +} username_proc_data_t; + static LRESULT CALLBACK username_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - const WNDPROC ProcOrg = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA); + username_proc_data_t *data = (username_proc_data_t *)GetWindowLongPtr(hWnd, GWLP_USERDATA); + const WNDPROC ProcOrg = data->proc_org; const LRESULT result = CallWindowProc(ProcOrg, hWnd, msg, wParam, lParam); + + switch (msg) { case WM_CHAR: - case WM_SETTEXT: { - // \x83\x86\x81[\x83U\x81[\x96\xBC\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x8Fꍇ\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x82\xF0\x8Eg\x82\xA4\x82\xB1\x82Ƃ͂Ȃ\xA2\x82̂ŁA - // tab\x82ł̃t\x83H\x81[\x83J\x83X\x88ړ\xAE\x8E\x9E\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x83{\x83^\x83\x93\x82\xF0\x83p\x83X\x82\xB7\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9 - // \x8F]\x97\x88\x82Ɠ\xAF\x82\xB6\x83L\x81[\x91\x80\x8D\xEC\x82Ń\x86\x81[\x83U\x81[\x96\xBC\x82ƃp\x83X\x83t\x83\x8C\x81[\x83Y\x82\xF0\x93\xFC\x97͉\\x82Ƃ\xB7\x82\xE9 - const HWND dlg = GetParent(hWnd); - const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); - const int len = GetWindowTextLength(hWnd); - LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); - if (len > 0) { - // \x95s\x97vtabstop - style = style & (~(LONG_PTR)WS_TABSTOP); - } else { - // \x97vtabstop - style = style | WS_TABSTOP; + case WM_SETTEXT: + if (data->tab_focus_entered == 0) { + // \x83\x86\x81[\x83U\x81[\x96\xBC\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x8Fꍇ\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x82\xF0\x8Eg\x82\xA4\x82\xB1\x82Ƃ͂Ȃ\xA2\x82̂ŁA + // tab\x82ł̃t\x83H\x81[\x83J\x83X\x88ړ\xAE\x8E\x9E\x81A\x83I\x83v\x83V\x83\x87\x83\x93\x83{\x83^\x83\x93\x82\xF0\x83p\x83X\x82\xB7\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9 + // \x8F]\x97\x88\x82Ɠ\xAF\x82\xB6\x83L\x81[\x91\x80\x8D\xEC\x82Ń\x86\x81[\x83U\x81[\x96\xBC\x82ƃp\x83X\x83t\x83\x8C\x81[\x83Y\x82\xF0\x93\xFC\x97͉\\x82Ƃ\xB7\x82\xE9 + const int len = GetWindowTextLength(hWnd); +#if 0 + if (len > 0) { + // \x83\x86\x81[\x83U\x81[\x96\xBC\x82\xF0\x93\xFC\x97͂\xB5\x82āATAB\x82\xF0\x89\x9F\x82\xB5\x82\xBD\x82Ƃ\xAB\x82Ɉ\xF8\x82\xC1\x82\xA9\x82\xA9\x82\xC1\x82\xBD\x8A\xB4\x82\xB6\x82\xAA\x82\xB7\x82\xE9\x8Fꍇ\x82\xAA\x82\xA0\x82\xE9 + // \x82\xBB\x82\xB1\x82ň\xEA\x93x\x82ł\xE0\x95\xB6\x8E\x9A\x93\xFC\x97͂\xAA\x82\xA0\x82\xC1\x82\xBD\x82\xE7\x81ATAB\x83X\x83g\x83b\x83v\x95s\x97v\x82ɓ|\x82\xB7 + data->tab_focus_entered = 1; + } +#endif + if ((data->str_len == 0 && len != 0) || + (data->str_len != 0 && len == 0)) { + // \x83\x86\x81[\x83U\x81[\x96\xBC\x82̕\xB6\x8E\x9A\x92\xB7\x82\xAA 0\x82ɂȂ\xE9 or 0\x82ł͂Ȃ\xAD\x82Ȃ\xE9 \x8E\x9E\x82̂ݏ\x88\x97\x9D + const HWND dlg = GetParent(hWnd); + const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); + LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); + + if (len > 0) { + // \x95s\x97vtabstop + style = style & (~(LONG_PTR)WS_TABSTOP); + } + else { + // \x97vtabstop + style = style | WS_TABSTOP; + } + SetWindowLongPtr(hWndOption, GWL_STYLE, style); + data->str_len = len; + } } - SetWindowLongPtr(hWndOption, GWL_STYLE, style); + break; + case WM_NCDESTROY: + free(data); + break; } - } return result; } @@ -333,9 +361,14 @@ // username\x82̃T\x83u\x83N\x83\x89\x83X\x89\xBB { HWND hWndUserName = GetDlgItem(dlg, IDC_SSHUSERNAME); - LONG_PTR ProcOrg = - SetWindowLongPtr(hWndUserName, GWLP_WNDPROC, (LONG_PTR)username_proc); - SetWindowLongPtr(hWndUserName, GWLP_USERDATA, ProcOrg); + username_proc_data_t *data = (username_proc_data_t *)malloc(sizeof(username_proc_data_t)); + if (data != NULL) { + SetWindowLongPtr(hWndUserName, GWLP_USERDATA, (LONG_PTR)data); + data->tab_focus_entered = 0; + data->str_len = 0; + data->proc_org = + (WNDPROC)SetWindowLongPtr(hWndUserName, GWLP_WNDPROC, (LONG_PTR)username_proc); + } } if (pvar->auth_state.user != NULL) {