///////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1998 Active Voice Corporation. All Rights Reserved. // // Active Agent(r) and Unified Communications(tm) are trademarks of Active Voice Corporation. // // Other brand and product names used herein are trademarks of their respective owners. // // The entire program and user interface including the structure, sequence, selection, // and arrangement of the dialog, the exclusively "yes" and "no" choices represented // by "1" and "2," and each dialog message are protected by copyrights registered in // the United States and by international treaties. // // Protected by one or more of the following United States patents: 5,070,526, 5,488,650, // 5,434,906, 5,581,604, 5,533,102, 5,568,540, 5,625,676, 5,651,054. // // Active Voice Corporation // Seattle, Washington // USA // ///////////////////////////////////////////////////////////////////////////////////////// //// // escbutt.c - escape button control functions //// #include "winlocal.h" #include "escbutt.h" #include "trace.h" //// // private definitions //// // escbutt control struct // typedef struct ESCBUTT { WNDPROC lpfnButtWndProc; DWORD dwFlags; } ESCBUTT, FAR *LPESCBUTT; // helper functions // LRESULT DLLEXPORT CALLBACK EscButtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); //// // public functions //// // EscButtInit - initialize escape subclass from button control // (i) button control to be subclassed // (i) subclass flags // reserved must be zero // return 0 if success // int DLLEXPORT WINAPI EscButtInit(HWND hwndButt, DWORD dwFlags) { BOOL fSuccess = TRUE; WNDPROC lpfnEscButtWndProc; HGLOBAL hEscButt; LPESCBUTT lpEscButt; if (hwndButt == NULL) fSuccess = TraceFALSE(NULL); // get pointer to escape subclass window proc // else if ((lpfnEscButtWndProc = (WNDPROC) MakeProcInstance((FARPROC) EscButtWndProc, (HINSTANCE) GetWindowWordPtr(GetParent(hwndButt), GWWP_HINSTANCE))) == NULL) fSuccess = TraceFALSE(NULL); // memory is allocated such that the client app owns it // else if ((hEscButt = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(ESCBUTT))) == NULL) fSuccess = TraceFALSE(NULL); else if ((lpEscButt = GlobalLock(hEscButt)) == NULL) fSuccess = TraceFALSE(NULL); // store old window proc address // else if ((lpEscButt->lpfnButtWndProc = (WNDPROC) GetWindowLongPtr(hwndButt, GWLP_WNDPROC)) == NULL) fSuccess = TraceFALSE(NULL); // store flags // else if ((lpEscButt->dwFlags = dwFlags) != dwFlags) fSuccess = TraceFALSE(NULL); else if (GlobalUnlock(hEscButt), FALSE) ; // store old window proc address as a property of the control window // else if (!SetProp(hwndButt, TEXT("hEscButt"), hEscButt)) fSuccess = TraceFALSE(NULL); // replace old window proc with new window proc // else if ( !SetWindowLongPtr(hwndButt, GWLP_WNDPROC, (LONG_PTR) lpfnEscButtWndProc) ) fSuccess = TraceFALSE(NULL); return fSuccess ? 0 : -1; } // EscButtTerm - terminate escape subclass from button control // (i) subclassed button control // return 0 if success // int DLLEXPORT WINAPI EscButtTerm(HWND hwndButt) { BOOL fSuccess = TRUE; WNDPROC lpfnEscButtWndProc; HGLOBAL hEscButt; LPESCBUTT lpEscButt; if (hwndButt == NULL) fSuccess = TraceFALSE(NULL); // get pointer to escape subclass window proc // else if ((lpfnEscButtWndProc = (WNDPROC) GetWindowLongPtr(hwndButt, GWLP_WNDPROC)) == NULL) fSuccess = TraceFALSE(NULL); // retrieve old window proc address from window property // else if ((hEscButt = GetProp(hwndButt, TEXT("hEscButt"))) == NULL) fSuccess = TraceFALSE(NULL); else if ((lpEscButt = GlobalLock(hEscButt)) == NULL || lpEscButt->lpfnButtWndProc == NULL) fSuccess = TraceFALSE(NULL); // replace new window proc with old window proc // else if ( !SetWindowLongPtr(hwndButt, GWLP_WNDPROC, (LONG_PTR) lpEscButt->lpfnButtWndProc) ) fSuccess = TraceFALSE(NULL); else if (GlobalUnlock(hEscButt), FALSE) ; // // else if (( hEscButt = RemoveProp(hwndButt, TEXT("hEscButt"))) == NULL) fSuccess = TraceFALSE(NULL); else if (GlobalFree(hEscButt) != NULL) fSuccess = TraceFALSE(NULL); return fSuccess ? 0 : -1; } //// // helper functions //// // EscButtWndProc - window procedure for escape button control // LRESULT DLLEXPORT CALLBACK EscButtWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL fSuccess = TRUE; LRESULT lResult; HGLOBAL hEscButt; LPESCBUTT lpEscButt; // retrieve old window proc address from window property // if ((hEscButt = GetProp(hwnd, TEXT("hEscButt"))) == NULL) fSuccess = TraceFALSE(NULL); else if ((lpEscButt = GlobalLock(hEscButt)) == NULL || lpEscButt->lpfnButtWndProc == NULL) fSuccess = TraceFALSE(NULL); switch (msg) { // convert escape key messages into spacebar messages // case WM_KEYUP: case WM_KEYDOWN: case WM_CHAR: if (wParam == VK_ESCAPE) wParam = VK_SPACE; // fall through rather than break; default: { // call old window proc // if (fSuccess) lResult = CallWindowProc(lpEscButt->lpfnButtWndProc, hwnd, msg, wParam, lParam); else lResult = 0L; } break; } if (fSuccess) GlobalUnlock(hEscButt); return lResult; }