X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/4d331a77f20f321f867f5907e2ffc06249378881..ec8679e9b667dd6de9ef29e0d01085b219901e3b:/windlg.c diff --git a/windlg.c b/windlg.c index 77db0512..71cc634b 100644 --- a/windlg.c +++ b/windlg.c @@ -431,6 +431,46 @@ static int CALLBACK LogProc (HWND hwnd, UINT msg, logbox = NULL; DestroyWindow (hwnd); return 0; + case IDN_COPY: + if (HIWORD(wParam) == BN_CLICKED || + HIWORD(wParam) == BN_DOUBLECLICKED) { + int selcount; + int *selitems; + selcount = SendDlgItemMessage(hwnd, IDN_LIST, + LB_GETSELCOUNT, 0, 0); + selitems = malloc(selcount * sizeof(int)); + if (selitems) { + int count = SendDlgItemMessage(hwnd, IDN_LIST, + LB_GETSELITEMS, + selcount, (LPARAM)selitems); + int i; + int size; + char *clipdata; + static unsigned char sel_nl[] = SEL_NL; + + size = 0; + for (i = 0; i < count; i++) + size += strlen(events[selitems[i]]) + sizeof(sel_nl); + + clipdata = malloc(size); + if (clipdata) { + char *p = clipdata; + for (i = 0; i < count; i++) { + char *q = events[selitems[i]]; + int qlen = strlen(q); + memcpy(p, q, qlen); + p += qlen; + memcpy(p, sel_nl, sizeof(sel_nl)); + p += sizeof(sel_nl); + } + write_clip(clipdata, size); + term_deselect(); + free(clipdata); + } + free(selitems); + } + } + return 0; } return 0; case WM_CLOSE: @@ -1579,9 +1619,13 @@ void logevent (char *string) { events[nevents] = smalloc(1+strlen(string)); strcpy (events[nevents], string); nevents++; - if (logbox) + if (logbox) { + int count; SendDlgItemMessage (logbox, IDN_LIST, LB_ADDSTRING, 0, (LPARAM)string); + count = SendDlgItemMessage (logbox, IDN_LIST, LB_GETCOUNT, 0, 0); + SendDlgItemMessage (logbox, IDN_LIST, LB_SETTOPINDEX, count-1, 0); + } } void showeventlog (HWND hwnd) { @@ -1664,3 +1708,64 @@ void verify_ssh_host_key(char *host, char *keystr) { RegCloseKey(rkey); } } + +/* + * Recursively delete a registry key and everything under it. + */ +static void registry_recursive_remove(HKEY key) { + DWORD i; + char name[MAX_PATH+1]; + HKEY subkey; + + i = 0; + while (RegEnumKey(key, i, name, sizeof(name)) == ERROR_SUCCESS) { + if (RegOpenKey(key, name, &subkey) == ERROR_SUCCESS) { + registry_recursive_remove(subkey); + RegCloseKey(subkey); + } + RegDeleteKey(key, name); + } +} + +/* + * Destroy all registry information associated with PuTTY. + */ +void registry_cleanup(void) { + HKEY key; + int ret; + char name[MAX_PATH+1]; + + /* + * Open the main PuTTY registry key and remove everything in it. + */ + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_POS, &key) == ERROR_SUCCESS) { + registry_recursive_remove(key); + RegCloseKey(key); + } + /* + * Now open the parent key and remove the PuTTY main key. Once + * we've done that, see if the parent key has any other + * children. + */ + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_PARENT, + &key) == ERROR_SUCCESS) { + RegDeleteKey(key, PUTTY_REG_PARENT_CHILD); + ret = RegEnumKey(key, 0, name, sizeof(name)); + RegCloseKey(key); + /* + * If the parent key had no other children, we must delete + * it in its turn. That means opening the _grandparent_ + * key. + */ + if (ret != ERROR_SUCCESS) { + if (RegOpenKey(HKEY_CURRENT_USER, PUTTY_REG_GPARENT, + &key) == ERROR_SUCCESS) { + RegDeleteKey(key, PUTTY_REG_GPARENT_CHILD); + RegCloseKey(key); + } + } + } + /* + * Now we're done. + */ +}