| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- #include "./loginPopup.h"
- #include "../api.h"
- #include "../../nu/Vectors.h"
- #include "./loginNotifier.h"
- #include "./common.h"
- typedef Vector<HWND> WindowList;
- typedef struct __THREADPOPUPDATA
- {
- HHOOK hHook;
- WindowList windowList;
- } THREADPOPUPDATA;
- static size_t threadStorage = TLS_OUT_OF_INDEXES;
- typedef struct __LOGINPOPUPCREATEPARAM
- {
- LoginPopup::Creator fnCreator;
- LPARAM lParam;
- } LOGINPOPUPCREATEPARAM;
- #define IDC_NOTIFIER 10001
- //#define COLOR_TITLE COLOR_3DLIGHT
- //#define COLOR_TITLETEXT COLOR_WINDOWTEXT
- #define COLOR_CLIENT COLOR_3DFACE
- #define COLOR_CLIENTTEXT COLOR_WINDOWTEXT
- LoginPopup::LoginPopup(HWND hwnd, UINT popupType, LPCWSTR pszTitle)
- : alertType(-1), alertMessage(NULL)
- {
- buttonHeight = buttonSpace = 0;
- this->hwnd = hwnd;
- if (NULL != pszTitle)
- SetTitle(popupType, pszTitle);
- }
- LoginPopup::~LoginPopup()
- {
- RegisterPopup(hwnd, FALSE);
- if (FALSE == IS_INTRESOURCE(alertMessage))
- LoginBox_FreeString(alertMessage);
- }
- HWND LoginPopup::CreatePopup(LPCWSTR pszTemplate, HWND hParent, LPARAM param, Creator fnCreator)
- {
- if (NULL == hParent || NULL == pszTemplate || NULL == fnCreator)
- return NULL;
- LOGINPOPUPCREATEPARAM createParam;
- createParam.fnCreator = fnCreator;
- createParam.lParam = param;
-
- return WASABI_API_CREATEDIALOGPARAMW((INT)(INT_PTR)pszTemplate, hParent, LoginPopup_DialogProc, (LPARAM)&createParam);
- }
- BOOL LoginPopup::RegisterPopup(HWND hwnd, BOOL fRegister)
- {
- if (NULL == hwnd || GetWindowThreadProcessId(hwnd, NULL) != GetCurrentThreadId())
- return FALSE;
- THREADPOPUPDATA *data = NULL;
- if (TLS_OUT_OF_INDEXES == threadStorage)
- {
- if (NULL == WASABI_API_APP)
- return FALSE;
-
- threadStorage = WASABI_API_APP->AllocateThreadStorage();
- if (TLS_OUT_OF_INDEXES == threadStorage)
- return FALSE;
- }
- else
- {
- data = (THREADPOPUPDATA*)WASABI_API_APP->GetThreadStorage(threadStorage);
- }
- if (NULL == data)
- {
- data = new THREADPOPUPDATA();
- if (NULL == data) return FALSE;
- data->hHook = SetWindowsHookEx(WH_MSGFILTER, LoginPopup_MessageFilter, NULL, GetCurrentThreadId());
- if (NULL == data->hHook)
- {
- delete data;
- return FALSE;
- }
- WASABI_API_APP->SetThreadStorage(threadStorage, data);
- }
- size_t index = data->windowList.size();
- while(index--)
- {
- if (hwnd == data->windowList[index])
- {
- if (FALSE == fRegister)
- {
- data->windowList.eraseAt(index);
- if (0 == data->windowList.size())
- {
- if (NULL != data->hHook)
- UnhookWindowsHookEx(data->hHook);
- WASABI_API_APP->SetThreadStorage(threadStorage, NULL);
- delete data;
- }
- }
- return TRUE;
- }
- }
-
- if (FALSE != fRegister)
- {
- data->windowList.push_back(hwnd);
- return TRUE;
- }
- return FALSE;
- }
- BOOL LoginPopup::EnumeratePopups(HWND hHost, Enumerator callback, LPARAM param)
- {
- if (NULL == callback ||
- NULL == hHost || GetWindowThreadProcessId(hHost, NULL) != GetCurrentThreadId())
- return FALSE;
- THREADPOPUPDATA *data = (TLS_OUT_OF_INDEXES != threadStorage && NULL != WASABI_API_APP) ?
- (THREADPOPUPDATA *)WASABI_API_APP->GetThreadStorage(threadStorage) : NULL;
- if (NULL == data)
- return FALSE;
- size_t index = data->windowList.size();
- while(index--)
- {
- HWND hPopup = data->windowList[index];
- if (IsChild(hHost, hPopup) && FALSE == callback(hPopup, param))
- return FALSE;
- }
- return TRUE;
- }
- BOOL LoginPopup::AnyPopup(HWND hHost)
- {
- if (NULL == hHost || GetWindowThreadProcessId(hHost, NULL) != GetCurrentThreadId())
- return FALSE;
- THREADPOPUPDATA *data = (TLS_OUT_OF_INDEXES != threadStorage && NULL != WASABI_API_APP) ?
- (THREADPOPUPDATA *)WASABI_API_APP->GetThreadStorage(threadStorage) : NULL;
- if (NULL == data)
- return FALSE;
- size_t index = data->windowList.size();
- while(index--)
- {
- if (IsChild(hHost, data->windowList[index]))
- return TRUE;
- }
- return FALSE;
- }
- void LoginPopup::UpdateLayout(BOOL fRedraw)
- {
- RECT rect;
- GetClientRect(hwnd, &rect);
- HWND hNotifier;
- hNotifier = GetDlgItem(hwnd, IDC_NOTIFIER);
- if (NULL != hNotifier)
- {
- INT height = LoginNotifier_GetIdealHeight(hNotifier);
- SetWindowPos(hNotifier, NULL, rect.left, rect.top, rect.right - rect.left, height,
- SWP_NOACTIVATE | SWP_NOZORDER);
- }
- }
- void LoginPopup::Paint(HDC hdc, const RECT *prcPaint, BOOL fErase)
- {
- if (FALSE != fErase)
- {
- RECT clientRect;
- GetClientRect(hwnd, &clientRect);
-
- COLORREF rgbOrig, rgbPart;
- rgbOrig = GetBkColor(hdc);
- if (buttonHeight > 0)
- {
- RECT buttonRect;
- SetRect(&buttonRect,
- clientRect.left, clientRect.bottom - (2* clientMargins.bottom + buttonHeight),
- clientRect.right, clientRect.bottom);
-
- clientRect.bottom = buttonRect.top;
- buttonRect.top++;
- rgbPart = GetSysColor(COLOR_3DFACE);
- SetBkColor(hdc, rgbPart);
- ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &buttonRect, NULL, 0, NULL);
- buttonRect.bottom = buttonRect.top;
- buttonRect.top--;
- rgbPart = GetSysColor(COLOR_3DLIGHT);
- SetBkColor(hdc, rgbPart);
- ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &buttonRect, NULL, 0, NULL);
- }
- rgbPart = GetSysColor(COLOR_CLIENT);
- SetBkColor(hdc, rgbPart);
- ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &clientRect, NULL, 0, NULL);
- SetBkColor(hdc, rgbOrig);
- }
- }
- void LoginPopup::EndDialog(INT_PTR code)
- {
- DestroyWindow(hwnd);
- }
- void LoginPopup::UpdateMargins()
- {
- SetRect(&clientMargins, 8, 6, 8, 6);
- MapDialogRect(hwnd, &clientMargins);
- SetRect(&infoMargins, 6, 8, 6, 8);
- MapDialogRect(hwnd, &infoMargins);
- RECT rect;
- SetRect(&rect, 4, 15, 0, 0);
- MapDialogRect(hwnd, &rect);
- buttonHeight = rect.top;
- buttonSpace = rect.left;
- }
- void LoginPopup::SetTitle(UINT type, LPCWSTR title)
- {
- popupType = type;
-
-
- if (NULL == title || FALSE == IS_INTRESOURCE(title))
- SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)title);
- else
- {
- WCHAR szBuffer[256] = {0};
- WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)title, szBuffer, ARRAYSIZE(szBuffer));
- SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)szBuffer);
- }
- }
- void LoginPopup::UpdateTitle(BOOL playBeep)
- {
- HWND hNotifier;
- hNotifier = GetDlgItem(hwnd, IDC_NOTIFIER);
- if (NULL == hNotifier) return;
- WCHAR szBuffer[512] = {0};
- LPCWSTR text;
- UINT type;
- if (-1 != alertType && NULL != alertMessage)
- {
- type = alertType;
- text = (IS_INTRESOURCE(alertMessage)) ?
- WASABI_API_LNGSTRINGW_BUF((INT)(INT_PTR)alertMessage, szBuffer, ARRAYSIZE(szBuffer)) :
- alertMessage;
- }
- else
- {
- type = popupType;
- SendMessage(hwnd, WM_GETTEXT, (WPARAM)ARRAYSIZE(szBuffer), (LPARAM)szBuffer);
- text = szBuffer;
- }
- LoginNotifier_Notify(hNotifier, type, text);
- UINT windowStyle = GetWindowStyle(hNotifier);
- if (0 == (WS_VISIBLE & windowStyle))
- {
- ShowWindow(hNotifier, SW_SHOWNA);
- }
- if (FALSE != playBeep)
- LoginNotifier_PlayBeep(hNotifier);
- }
- void LoginPopup::SetAlert(UINT type, LPCWSTR message)
- {
- alertType = type;
-
- if (FALSE == IS_INTRESOURCE(alertMessage))
- LoginBox_FreeString(alertMessage);
- if (NULL == message)
- {
- alertMessage = NULL;
- return;
- }
- if (IS_INTRESOURCE(message))
- alertMessage = (LPWSTR)message;
- else
- alertMessage = LoginBox_CopyString(message);
- }
- void LoginPopup::RemoveAlert()
- {
- SetAlert(-1, NULL);
- }
- LRESULT LoginPopup::SendNotification(UINT code, NMHDR *pnmh)
- {
- if (NULL == pnmh) return 0L;
- HWND hParent = GetAncestor(hwnd, GA_PARENT);
- if(NULL == hParent) return 0L;
- pnmh->code = code;
- pnmh->hwndFrom = hwnd;
- pnmh->idFrom = (UINT_PTR)GetWindowLongPtr(hwnd, GWLP_ID);
-
- return SendMessage(hParent, WM_NOTIFY, (WPARAM)pnmh->idFrom, (LPARAM)pnmh);
- }
- BOOL LoginPopup::GetInfoRect(RECT *rect)
- {
- if (NULL == rect)
- return FALSE;
- LONG notifierHeight = 0;
- HWND hNotifier = GetDlgItem(hwnd, IDC_NOTIFIER);
- if (NULL != hNotifier && 0 != (WS_VISIBLE & GetWindowStyle(hNotifier)) &&
- FALSE != GetWindowRect(hNotifier, rect))
- {
- notifierHeight = rect->bottom - rect->top;
- if (notifierHeight < 0) notifierHeight = 0;
- }
- if (FALSE == GetClientRect(hwnd, rect))
- return FALSE;
- rect->left += (clientMargins.left + infoMargins.left);
- rect->right -= (clientMargins.right + infoMargins.right);
- if (0 != notifierHeight)
- rect->top += (notifierHeight + infoMargins.top);
- else
- rect->top += (clientMargins.top + infoMargins.top);
- if (buttonHeight > 0)
- rect->bottom -= (2 * clientMargins.bottom + buttonHeight + infoMargins.bottom);
- else
- rect->bottom -= (clientMargins.bottom + infoMargins.bottom);
- if (rect->right < rect->left) rect->right = rect->left;
- if (rect->bottom < rect->top) rect->bottom = rect->top;
- return TRUE;
- }
- BOOL LoginPopup::CalculateWindowRect(LONG infoWidth, LONG infoHeight, const INT *buttonList, UINT buttonCount, BOOL includeTitle, RECT *rect)
- {
- if (NULL == rect)
- return FALSE;
-
- if (infoWidth < 110) infoWidth = 110;
- if (infoHeight < 32) infoHeight = 32;
- LONG minWidth = 0;
- LONG notifierHeight = 0;
-
- HWND hNotifier = GetDlgItem(hwnd, IDC_NOTIFIER);
- if (NULL != hNotifier && 0 != (WS_VISIBLE & GetWindowStyle(hNotifier)) &&
- FALSE != GetWindowRect(hNotifier, rect))
- {
- notifierHeight = rect->bottom - rect->top;
- if (notifierHeight < 0) notifierHeight = 0;
-
- if (FALSE != includeTitle)
- {
- SIZE size;
- if (FALSE != LoginNotifier_GetIdealSize(hNotifier, &size))
- minWidth = size.cx + clientMargins.right;
- }
- }
- if (NULL != buttonList && buttonCount > 0 &&
- ((HDWP)TRUE) == LayoutButtons(NULL, buttonList, buttonCount, FALSE, rect))
- {
- LONG buttonWidth = (rect->right - rect->left) + clientMargins.left + clientMargins.right;
- if (buttonWidth > minWidth)
- minWidth = buttonWidth;
- }
- rect->left = 0;
- rect->top = 0;
- rect->right = rect->left + infoWidth;
- rect->bottom = rect->top + infoHeight;
- rect->right += (clientMargins.left + infoMargins.left + clientMargins.right + infoMargins.right);
- if ((rect->right - rect->left) < minWidth)
- rect->right = rect->left + minWidth;
-
- rect->bottom += (0 != notifierHeight) ?
- (notifierHeight + infoMargins.top) : (clientMargins.top + infoMargins.top);
- rect->bottom += (buttonHeight > 0) ?
- (2 * clientMargins.bottom + buttonHeight + infoMargins.bottom) : (clientMargins.bottom + infoMargins.bottom);
- return TRUE;
- }
- HDWP LoginPopup::LayoutButtons(HDWP hdwp, const INT *buttonList, UINT buttonCount, BOOL redraw, RECT *rectOut)
- {
- RECT rect;
- GetClientRect(hwnd, &rect);
- rect.left += clientMargins.left;
- rect.top += clientMargins.top;
- rect.right -= clientMargins.right;
- rect.bottom -= clientMargins.bottom;
- return LoginBox_LayoutButtonBar(hdwp, hwnd, buttonList, buttonCount, &rect,
- buttonHeight, buttonSpace, redraw, rectOut);
- }
- BOOL LoginPopup::GetTextSize(HWND hText, LONG width, SIZE *size)
- {
- if (NULL == hText) return FALSE;
-
- WCHAR szBuffer[4096] = {0};
- INT cchLen = (INT)SendMessage(hText, WM_GETTEXT, ARRAYSIZE(szBuffer), (LPARAM)szBuffer);
- if (0 == cchLen)
- {
- size->cx = 0;
- size->cy = 0;
- return TRUE;
- }
-
- HDC hdc = GetDCEx(hText, NULL, DCX_CACHE | DCX_WINDOW | DCX_NORESETATTRS);
- if (NULL == hdc)
- return FALSE;
- HFONT font = (HFONT)SendMessage(hText, WM_GETFONT, 0, 0L);
- HFONT fontOrig = (HFONT)SelectObject(hdc, font);
-
- BOOL resultOk;
- RECT rect;
- SetRect(&rect, 0, 0, width, 0);
- resultOk = DrawText(hdc, szBuffer, cchLen, &rect,
- DT_CALCRECT | DT_EXTERNALLEADING | DT_LEFT | DT_NOPREFIX | DT_WORDBREAK);
-
- if(FALSE != resultOk)
- {
- size->cx = (rect.right - rect.left);
- size->cy = (rect.bottom - rect.top);
- }
- SelectObject(hdc, fontOrig);
- ReleaseDC(hText, hdc);
-
- return resultOk;
- }
- BOOL LoginPopup::OnInitDialog(HWND hFocus, LPARAM param)
- {
- RegisterPopup(hwnd, TRUE);
- RECT rect;
- if (FALSE == GetWindowRect(hwnd, &rect))
- SetRectEmpty(&rect);
- idealSize.cx = rect.right - rect.left;
- idealSize.cy = rect.bottom - rect.top;
-
- HWND hNotifier = LoginNotifier_CreateWindow(0, WS_CHILD | WS_CLIPSIBLINGS, 0, 0, 0, 0, hwnd, IDC_NOTIFIER);
- if (NULL != hNotifier)
- {
- HFONT hFont = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0L);
- if (NULL != hFont)
- SendMessage(hNotifier, WM_SETFONT, (WPARAM)hFont, 0L);
- #ifdef COLOR_TITLE
- LoginNotifier_SetBkColor(hNotifier, GetSysColor(COLOR_TITLE));
- #endif //COLOR_TITLE
- #ifdef COLOR_TITLETEXT
- LoginNotifier_SetTextColor(hNotifier, GetSysColor(COLOR_TITLETEXT));
- #endif //COLOR_TITLETEXT
- UpdateTitle(FALSE);
- }
- UpdateMargins();
- UpdateLayout(FALSE);
-
- PostMessage(hwnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0L);
- return FALSE;
- }
- void LoginPopup::OnDestroy()
- {
- }
- void LoginPopup::OnWindowPosChanged(const WINDOWPOS *pwp)
- {
- if (SWP_NOSIZE != ((SWP_NOSIZE | SWP_FRAMECHANGED) & pwp->flags))
- UpdateLayout(0 == (SWP_NOREDRAW & pwp->flags));
- }
- void LoginPopup::OnCommand(UINT commandId, UINT eventType, HWND hControl)
- {
- switch(commandId)
- {
- case IDOK:
- case IDCANCEL:
- EndDialog(commandId);
- break;
- }
- }
- LRESULT LoginPopup::OnNotify(UINT controlId, const NMHDR *pnmh)
- {
- return FALSE;
- }
- void LoginPopup::OnPaint()
- {
- PAINTSTRUCT ps;
- if (BeginPaint(hwnd, &ps))
- {
- if (ps.rcPaint.left != ps.rcPaint.right)
- Paint(ps.hdc, &ps.rcPaint, ps.fErase);
- EndPaint(hwnd, &ps);
- }
- }
- void LoginPopup::OnPrintClient(HDC hdc, UINT options)
- {
- if (0 != (PRF_CLIENT & options))
- {
- RECT clientRect;
- if (GetClientRect(hwnd, &clientRect))
- Paint(hdc, &clientRect, TRUE);
- }
- }
- HBRUSH LoginPopup::OnGetStaticColor(HDC hdc, HWND hControl)
- {
- HBRUSH hb = (HBRUSH)GetSysColorBrush(COLOR_CLIENT);
- SetTextColor(hdc, GetSysColor(COLOR_CLIENTTEXT));
- SetBkColor(hdc, GetSysColor(COLOR_CLIENT));
- return hb;
- }
- void LoginPopup::OnSetFont(HFONT font, BOOL redraw)
- {
- DefDlgProc(hwnd, WM_SETFONT, (WPARAM)font, MAKELPARAM(redraw, 0));
- UpdateMargins();
- }
- void LoginPopup::OnParentNotify(UINT eventId, UINT wParam, LPARAM lParam)
- {
- }
- BOOL LoginPopup::OnUpdateWindowPos(const RECT* clientRect, RECT *rectOut)
- {
- if (NULL == clientRect || NULL == rectOut)
- return FALSE;
- LONG width = idealSize.cx;
- LONG height = idealSize.cy;
- rectOut->left = clientRect->left + ((clientRect->right - clientRect->left) - width)/2;
- rectOut->top = clientRect->top+ ((clientRect->bottom - clientRect->top) - height)/2;
- rectOut->right = rectOut->left + width;
- rectOut->bottom = rectOut->top + height;
- return TRUE;
- }
- void LoginPopup::OnPlayBeep()
- {
- LoginBox_MessageBeep(MB_ICONASTERISK);
- }
- INT_PTR LoginPopup::DialogProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG: return OnInitDialog((HWND)wParam, lParam);
- case WM_DESTROY: OnDestroy(); return TRUE;
- case WM_NOTIFY: MSGRESULT(hwnd, OnNotify((INT)wParam, (NMHDR*)lParam));
- case WM_COMMAND: OnCommand(LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return TRUE;
- case WM_WINDOWPOSCHANGED: OnWindowPosChanged((WINDOWPOS*)lParam); return TRUE;
- case WM_SIZE: return TRUE;
- case WM_SETFONT: OnSetFont((HFONT)wParam, (BOOL)LOWORD(lParam)); return TRUE;
- case WM_ERASEBKGND: MSGRESULT(hwnd, 0);
- case WM_PAINT: OnPaint(); return TRUE;
- case WM_PRINTCLIENT: OnPrintClient((HDC)wParam, (UINT)lParam); return TRUE;
- case WM_CTLCOLORSTATIC: return (INT_PTR)OnGetStaticColor((HDC)wParam, (HWND)lParam);
- case WM_PARENTNOTIFY: OnParentNotify(LOWORD(wParam), HIWORD(wParam), lParam); return TRUE;
-
- case NLPOPUP_UPDATEWNDPOS: MSGRESULT(hwnd, OnUpdateWindowPos((const RECT*)wParam, (RECT*)lParam));
- case NLPOPUP_PLAYBEEP: OnPlayBeep(); return TRUE;
- }
- return FALSE;
- }
- static INT_PTR CALLBACK LoginPopup_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- static ATOM LOGINPOPUP_PROP = 0;
- LoginPopup *popup = (LoginPopup*)GetProp(hwnd, MAKEINTATOM(LOGINPOPUP_PROP));
- if (NULL == popup)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG:
- if (0 == LOGINPOPUP_PROP)
- {
- LOGINPOPUP_PROP = GlobalAddAtomW(L"NullsoftLoginPopupProp");
- if (0 == LOGINPOPUP_PROP)
- return 0;
- }
- if (NULL != lParam)
- {
- LOGINPOPUPCREATEPARAM *create = (LOGINPOPUPCREATEPARAM*)lParam;
- lParam = create->lParam;
- if (SUCCEEDED(create->fnCreator(hwnd, lParam, &popup)))
- {
- if (FALSE == SetProp(hwnd, MAKEINTATOM(LOGINPOPUP_PROP), (HANDLE)popup))
- {
- delete(popup);
- popup = NULL;
- }
- }
- }
- if (NULL != popup)
- return popup->DialogProc(uMsg, wParam, lParam);
- break;
- }
- return 0;
- }
- INT_PTR result = popup->DialogProc(uMsg, wParam, lParam);
- if (WM_NCDESTROY == uMsg)
- {
- RemoveProp(hwnd, MAKEINTATOM(LOGINPOPUP_PROP));
- delete(popup);
- }
- return result;
- }
- static LRESULT CALLBACK LoginPopup_MessageFilter(INT code, WPARAM wParam, LPARAM lParam)
- {
- THREADPOPUPDATA *data = (NULL != WASABI_API_APP && TLS_OUT_OF_INDEXES != threadStorage) ?
- (THREADPOPUPDATA*)WASABI_API_APP->GetThreadStorage(threadStorage) : NULL;
- if (NULL == data)
- return 0;
- if (code >= 0)
- {
- MSG *pMsg = (MSG*)lParam;
- if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
- {
- if (L'C' == pMsg->wParam && 0 == (0x40000000 & pMsg->lParam) &&
- 0 != (0x8000 & GetAsyncKeyState(VK_MENU)))
- {
- pMsg->wParam = VK_ESCAPE;
- }
- if ((VK_ESCAPE == pMsg->wParam || VK_RETURN == pMsg->wParam) &&
- 0 == (0x40000000 & pMsg->lParam))
- {
- size_t index = data->windowList.size();
- while(index--)
- {
- HWND hPopup = data->windowList[index];
- if (IsChild(hPopup, pMsg->hwnd))
- {
- INT commandId;
- switch(pMsg->wParam)
- {
- case VK_ESCAPE:
- commandId = IDCANCEL;
- break;
- case VK_RETURN:
- if (0 != (DLGC_BUTTON & SendMessage(pMsg->hwnd, WM_GETDLGCODE, 0, 0L)) &&
- IsWindowVisible(pMsg->hwnd) && IsWindowEnabled(pMsg->hwnd))
- {
- commandId = (INT)(INT_PTR)GetWindowLongPtr(pMsg->hwnd, GWLP_ID);
- }
- else
- {
- commandId = (INT)(INT_PTR)SendMessage(hPopup, DM_GETDEFID, 0, 0L);
- if (DC_HASDEFID != HIWORD(commandId))
- commandId = IDOK;
- }
- break;
- }
- SendMessage(hPopup, WM_COMMAND, MAKEWPARAM(commandId, 0), (LPARAM)pMsg->hwnd);
- return 1;
- }
- }
- }
- // add mnemonic support here (http://msdn.microsoft.com/en-us/library/ms644995%28VS.85%29.aspx)
- //HWND hPopup;
- //size_t index = data->windowList.size();
- //while(index--)
- //{
- // hPopup = data->windowList[index];
- // if (pMsg->hwnd == hPopup || IsChild(hPopup, pMsg->hwnd))
- // {
- //
- // }
- //}
- }
- }
- return CallNextHookEx(data->hHook, code, wParam, lParam);
- }
|