/** Clean up memory. * This is called after the X connection is closed. * Note that it is possible for this to be called more than once. */ void Destroy(void) { DestroyBackgrounds(); DestroyBorders(); DestroyClients(); DestroyClock(); DestroyColors(); DestroyCommands(); DestroyCursors(); DestroyDesktops(); #ifndef DISABLE_CONFIRM DestroyDialogs(); #endif DestroyDock(); DestroyFonts(); DestroyGroups(); DestroyHints(); DestroyIcons(); DestroyKeys(); DestroyPager(); DestroyPlacement(); DestroyPopup(); DestroyRootMenu(); DestroyScreens(); DestroySettings(); DestroySwallow(); DestroyTaskBar(); DestroyTray(); DestroyTrayButtons(); }
//Plugin extern function void __declspec(dllexport) Capture(PLUGINDATA *pd) { pd->dwSupport|=PDS_SUPPORTALL; if (pd->dwSupport & PDS_GETSUPPORT) return; if (!bInitCommon) InitCommon(pd); else if (!bInitCapture) ReadOptions(OF_CAPTURE); if (bInitCapture) { DestroyDock(hWndCaptureDlg, DKT_KEEPAUTOLOAD); //Stay in memory and show as non-active pd->nUnload=UD_NONUNLOAD_NONACTIVE; } else { InitMain(); InitCapture(); pfCapture=pd->lpPluginFunction; bCaptureDockWaitResize=pd->bOnStart; CreateDock(&hWndCaptureDlg, &dkCaptureDlg, !bCaptureDockWaitResize); //Stay in memory, and show as active pd->nUnload=UD_NONUNLOAD_ACTIVE; } }
LRESULT CALLBACK NewMainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //Capture if (uMsg == WM_CHANGECBCHAIN) { if (bInitCapture) { if (hWndNextViewer == (HWND)wParam) hWndNextViewer=(HWND)lParam; else if (hWndNextViewer && IsWindow(hWndNextViewer)) SendMessage(hWndNextViewer, uMsg, wParam, lParam); } } else if (uMsg == WM_DRAWCLIPBOARD) { if (bInitCapture) { if (hWndCaptureDlg) { if (GetFocus() != hWndCaptureEdit) { if (!cfSelAutoCopy || !IsClipboardFormatAvailable(cfSelAutoCopy)) { SendMessage(hWndCaptureEdit, EM_SETSEL, (WPARAM)0x7FFFFFFF, (LPARAM)0x7FFFFFFF); SendMessage(hMainWnd, AKD_PASTE, (WPARAM)hWndCaptureEdit, 0); SendMessage(hWndCaptureEdit, EM_SETSEL, (WPARAM)0x7FFFFFFF, (LPARAM)0x7FFFFFFF); SendMessage(hMainWnd, AKD_REPLACESELW, (WPARAM)hWndCaptureEdit, (LPARAM)wszCaptureSeparator); } } } if (hWndNextViewer && IsWindow(hWndNextViewer)) SendMessage(hWndNextViewer, uMsg, wParam, lParam); } } //PasteSerial else if (uMsg == WM_HOTKEY) { if (bInitPasteSerial) { char *szSerial=NULL; char *pSerial=NULL; HWND hWndTargetForeground; HWND hWndTargetFocus; DWORD dwTargetForeground; DWORD dwThreadCurrent; WORD wVk; int nInsertType=0; if (GetHotkeyMod(dwHotkeyDelimSkip) == LOWORD(lParam) && LOBYTE(dwHotkeyDelimSkip) == HIWORD(lParam)) nInsertType=IT_DELIM_SKIP; else if (GetHotkeyMod(dwHotkeyDelimAsTab) == LOWORD(lParam) && LOBYTE(dwHotkeyDelimAsTab) == HIWORD(lParam)) nInsertType=IT_DELIM_ASTAB; else if (GetHotkeyMod(dwHotkeyDelimAsIs) == LOWORD(lParam) && LOBYTE(dwHotkeyDelimAsIs) == HIWORD(lParam)) nInsertType=IT_DELIM_ASIS; if (nInsertType) { hWndTargetForeground=GetForegroundWindow(); dwTargetForeground=GetWindowThreadProcessId(hWndTargetForeground, NULL); dwThreadCurrent=GetCurrentThreadId(); if (dwThreadCurrent != dwTargetForeground) { if (AttachThreadInput(dwThreadCurrent, dwTargetForeground, TRUE)) { WaitForReleaseVkKeys(dwThreadCurrent, dwTargetForeground, INFINITE); if (hWndTargetFocus=GetFocus()) { //Get clipboard text { HGLOBAL hData; LPVOID pData; int nDataLen; if (OpenClipboard(NULL)) { if (hData=GetClipboardData(CF_TEXT)) { if (pData=GlobalLock(hData)) { nDataLen=lstrlenA((char *)pData) + 1; if (szSerial=(char *)GlobalAlloc(GPTR, nDataLen)) { lstrcpynA(szSerial, (char *)pData, nDataLen); } GlobalUnlock(hData); } } CloseClipboard(); } } //Post serial if (szSerial) { pSerial=szSerial; while (*pSerial && *pSerial != '\n') { if (nInsertType != IT_DELIM_ASIS) { if (*pSerial == '-' || *pSerial == ' ' || *pSerial == '\t') { if (nInsertType == IT_DELIM_ASTAB) { if (GetFocus() == hWndTargetFocus) { if (bEmulatePress) { WaitForReleaseVkKeys(dwThreadCurrent, dwTargetForeground, INFINITE); keybd_event(VK_TAB, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_TAB, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0); WaitForReleaseVkKeys(dwThreadCurrent, dwTargetForeground, INFINITE); } else SendMessage(hWndTargetFocus, WM_CHAR, '\t', 1); } } while (*++pSerial == '-' || *pSerial == ' ' || *pSerial == '\t'); hWndTargetFocus=GetFocus(); continue; } } if (bEmulatePress) { wVk=VkKeyScan(*pSerial); WaitForReleaseVkKeys(dwThreadCurrent, dwTargetForeground, INFINITE); if (HIBYTE(wVk) & 1) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0); if (HIBYTE(wVk) & 2) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0); if (HIBYTE(wVk) & 4) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(LOBYTE(wVk), 0, 0, 0); keybd_event(LOBYTE(wVk), 0, KEYEVENTF_KEYUP, 0); if (HIBYTE(wVk) & 4) keybd_event(VK_MENU, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0); if (HIBYTE(wVk) & 2) keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0); if (HIBYTE(wVk) & 1) keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0); WaitForReleaseVkKeys(dwThreadCurrent, dwTargetForeground, INFINITE); } else SendMessage(hWndTargetFocus, WM_CHAR, *pSerial, 1); ++pSerial; } GlobalFree((HGLOBAL)szSerial); szSerial=NULL; } } AttachThreadInput(dwThreadCurrent, dwTargetForeground, FALSE); } } } } } //Notifications else if (uMsg == AKDN_DOCK_RESIZE) { if (bInitCapture) { if (((DOCK *)wParam)->hWnd == dkCaptureDlg->hWnd) dwSaveFlags|=OF_CAPTURE_RECT; } } else if (uMsg == AKDN_SIZE_ONSTART) { if (bInitCapture) { if (bCaptureDockWaitResize) { bCaptureDockWaitResize=FALSE; ShowWindow(hWndCaptureDlg, SW_SHOW); dkCaptureDlg->dwFlags&=~DKF_HIDDEN; } } } if (uMsg == AKDN_MAIN_ONSTART_FINISH) { } else if (uMsg == AKDN_MAIN_ONFINISH) { NewMainProcData->NextProc(hWnd, uMsg, wParam, lParam); if (hWndCaptureDlg) { DestroyDock(hWndCaptureDlg, DKT_ONMAINFINISH); } if (bInitPasteSerial) { UninitMain(); UninitPasteSerial(); } if (bInitSelAutoCopy) { UninitMain(); UninitSelAutoCopy(); } return FALSE; } //Special messages { LRESULT lResult; if (lResult=EditParentMessages(hWnd, uMsg, wParam, lParam)) return lResult; } //Call next procedure return NewMainProcData->NextProc(hWnd, uMsg, wParam, lParam); }