| 243 |
} |
} |
| 244 |
} |
} |
| 245 |
|
|
| 246 |
|
typedef struct { |
| 247 |
|
int tab_focus_entered; |
| 248 |
|
WNDPROC proc_org; |
| 249 |
|
size_t str_len; |
| 250 |
|
} username_proc_data_t; |
| 251 |
|
|
| 252 |
static LRESULT CALLBACK username_proc(HWND hWnd, UINT msg, |
static LRESULT CALLBACK username_proc(HWND hWnd, UINT msg, |
| 253 |
WPARAM wParam, LPARAM lParam) |
WPARAM wParam, LPARAM lParam) |
| 254 |
{ |
{ |
| 255 |
const WNDPROC ProcOrg = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA); |
username_proc_data_t *data = (username_proc_data_t *)GetWindowLongPtr(hWnd, GWLP_USERDATA); |
| 256 |
|
const WNDPROC ProcOrg = data->proc_org; |
| 257 |
const LRESULT result = CallWindowProc(ProcOrg, hWnd, msg, wParam, lParam); |
const LRESULT result = CallWindowProc(ProcOrg, hWnd, msg, wParam, lParam); |
| 258 |
|
|
| 259 |
|
|
| 260 |
switch (msg) { |
switch (msg) { |
| 261 |
case WM_CHAR: |
case WM_CHAR: |
| 262 |
case WM_SETTEXT: { |
case WM_SETTEXT: |
| 263 |
// ユーザー名が入力されていた場合、オプションを使うことはないので、 |
if (data->tab_focus_entered == 0) { |
| 264 |
// tabでのフォーカス移動時、オプションボタンをパスするようにする |
// ユーザー名が入力されていた場合、オプションを使うことはないので、 |
| 265 |
// 従来と同じキー操作でユーザー名とパスフレーズを入力可能とする |
// tabでのフォーカス移動時、オプションボタンをパスするようにする |
| 266 |
const HWND dlg = GetParent(hWnd); |
// 従来と同じキー操作でユーザー名とパスフレーズを入力可能とする |
| 267 |
const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); |
const int len = GetWindowTextLength(hWnd); |
| 268 |
const int len = GetWindowTextLength(hWnd); |
#if 0 |
| 269 |
LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); |
if (len > 0) { |
| 270 |
if (len > 0) { |
// ユーザー名を入力して、TABを押したときに引っかかった感じがする場合がある |
| 271 |
// 不要tabstop |
// そこで一度でも文字入力があったら、TABストップ不要に倒す |
| 272 |
style = style & (~(LONG_PTR)WS_TABSTOP); |
data->tab_focus_entered = 1; |
| 273 |
} else { |
} |
| 274 |
// 要tabstop |
#endif |
| 275 |
style = style | WS_TABSTOP; |
if ((data->str_len == 0 && len != 0) || |
| 276 |
|
(data->str_len != 0 && len == 0)) { |
| 277 |
|
// ユーザー名の文字長が 0になる or 0ではなくなる 時のみ処理 |
| 278 |
|
const HWND dlg = GetParent(hWnd); |
| 279 |
|
const HWND hWndOption = GetDlgItem(dlg, IDC_USERNAME_OPTION); |
| 280 |
|
LONG_PTR style = GetWindowLongPtr(hWndOption, GWL_STYLE); |
| 281 |
|
|
| 282 |
|
if (len > 0) { |
| 283 |
|
// 不要tabstop |
| 284 |
|
style = style & (~(LONG_PTR)WS_TABSTOP); |
| 285 |
|
} |
| 286 |
|
else { |
| 287 |
|
// 要tabstop |
| 288 |
|
style = style | WS_TABSTOP; |
| 289 |
|
} |
| 290 |
|
SetWindowLongPtr(hWndOption, GWL_STYLE, style); |
| 291 |
|
data->str_len = len; |
| 292 |
|
} |
| 293 |
} |
} |
| 294 |
SetWindowLongPtr(hWndOption, GWL_STYLE, style); |
break; |
| 295 |
} |
case WM_NCDESTROY: |
| 296 |
|
free(data); |
| 297 |
|
break; |
| 298 |
} |
} |
| 299 |
return result; |
return result; |
| 300 |
} |
} |
| 361 |
// usernameのサブクラス化 |
// usernameのサブクラス化 |
| 362 |
{ |
{ |
| 363 |
HWND hWndUserName = GetDlgItem(dlg, IDC_SSHUSERNAME); |
HWND hWndUserName = GetDlgItem(dlg, IDC_SSHUSERNAME); |
| 364 |
LONG_PTR ProcOrg = |
username_proc_data_t *data = (username_proc_data_t *)malloc(sizeof(username_proc_data_t)); |
| 365 |
SetWindowLongPtr(hWndUserName, GWLP_WNDPROC, (LONG_PTR)username_proc); |
if (data != NULL) { |
| 366 |
SetWindowLongPtr(hWndUserName, GWLP_USERDATA, ProcOrg); |
SetWindowLongPtr(hWndUserName, GWLP_USERDATA, (LONG_PTR)data); |
| 367 |
|
data->tab_focus_entered = 0; |
| 368 |
|
data->str_len = 0; |
| 369 |
|
data->proc_org = |
| 370 |
|
(WNDPROC)SetWindowLongPtr(hWndUserName, GWLP_WNDPROC, (LONG_PTR)username_proc); |
| 371 |
|
} |
| 372 |
} |
} |
| 373 |
|
|
| 374 |
if (pvar->auth_state.user != NULL) { |
if (pvar->auth_state.user != NULL) { |