From 8bf75b3634dedb21fac97be3b01111dc65928911 Mon Sep 17 00:00:00 2001 From: ramon18 Date: Thu, 10 Jul 2003 00:28:05 +0000 Subject: [PATCH] LINK, dirreq, filereq and browse button in dirpage can be opened using ENTER KEY (WM_COMMAND events forward to inner dialogs), fixed problem with focus on Close/Finish button which was generating wierd beeps if user attempted to finish the installer with ENTER key. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2707 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 154 ++++++++++---------- Contrib/StartMenu/StartMenu.c | 3 +- Plugins/InstallOptions.dll | Bin 13824 -> 13824 bytes Plugins/StartMenu.dll | Bin 6656 -> 6656 bytes Source/exehead/Ui.c | 7 + 5 files changed, 88 insertions(+), 76 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 9a150eb5..c462c7e0 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -175,6 +175,13 @@ int nRectId = 0; int nNumFields = 0; int g_done; +int FindControlIdx(UINT id) +{ + for (int nIdx = 0; nIdx < nNumFields; nIdx++) + if (id == pFields[nIdx].nControlID) + return nIdx; + return -1; +} // array of HWNDs and window styles used to make the main NSIS controls invisible while this program runs. @@ -675,23 +682,20 @@ LRESULT WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { switch (codeNotify) { case BN_CLICKED: { - for (int nIdx = 0; nIdx < nNumFields; nIdx++) { - if (id == pFields[nIdx].nControlID) { - if (pFields[nIdx].nType == FIELD_BROWSEBUTTON) { - int nParentIdx = pFields[nIdx].nParentIdx; - switch(pFields[nParentIdx].nType) { - case FIELD_FILEREQUEST: - BrowseForFile(nParentIdx); - break; - case FIELD_DIRREQUEST: - BrowseForFolder(nParentIdx); - break; - } - break; - } else if (pFields[nIdx].nType == FIELD_LINK) { - ShellExecute(hMainWindow, NULL, pFields[nIdx].pszState, NULL, NULL, SW_SHOWDEFAULT); - } + int nIdx = FindControlIdx(id); + if (pFields[nIdx].nType == FIELD_BROWSEBUTTON) { + int nParentIdx = pFields[nIdx].nParentIdx; + switch(pFields[nParentIdx].nType) { + case FIELD_FILEREQUEST: + BrowseForFile(nParentIdx); + break; + case FIELD_DIRREQUEST: + BrowseForFolder(nParentIdx); + break; } + break; + } else if (pFields[nIdx].nType == FIELD_LINK) { + ShellExecute(hMainWindow, NULL, pFields[nIdx].pszState, NULL, NULL, SW_SHOWDEFAULT); } } break; @@ -737,53 +741,48 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, case WM_DRAWITEM: { DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; - for (int nIdx = 0; nIdx < nNumFields; nIdx++) - { - if (pFields[nIdx].nControlID == lpdis->CtlID ) - { + int nIdx = FindControlIdx(lpdis->CtlID); #ifdef IO_LINK_UNDERLINED - HFONT OldFont; - LOGFONT lf; + HFONT OldFont; + LOGFONT lf; #endif - if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) || - (lpdis->itemAction & ODA_SELECT)) - DrawFocusRect(lpdis->hDC, &pFields[nIdx].rect); - + if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) || + (lpdis->itemAction & ODA_SELECT)) + DrawFocusRect(lpdis->hDC, &pFields[nIdx].rect); + #ifdef IO_LINK_UNDERLINED - GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); - lf.lfUnderline = TRUE; - OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); + GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); + lf.lfUnderline = TRUE; + OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); #endif - // Set up tranparent background - SetBkMode(lpdis->hDC, TRANSPARENT); - - if ( GetSysColorBrush(COLOR_HOTLIGHT) ) - SetTextColor(lpdis->hDC, GetSysColor(COLOR_HOTLIGHT)); - else - SetTextColor(lpdis->hDC, RGB(0,0,255)); // Win95/NT4 arrggg!!! - - GetClientRect(lpdis->hwndItem, &pFields[nIdx].rect); - // Calculate needed size of the control - DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &pFields[nIdx].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); - pFields[nIdx].rect.right += 4; - pFields[nIdx].rect.bottom = lpdis->rcItem.bottom; - // Resize but don't move - SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pFields[nIdx].rect.right - pFields[nIdx].rect.left, - pFields[nIdx].rect.bottom - pFields[nIdx].rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); - // Draw the text - lpdis->rcItem = pFields[nIdx].rect; - // Add little margin to avoid focus rect over text - lpdis->rcItem.right += 2; lpdis->rcItem.left += 2; - - if ( lpdis->itemState & ODS_HOTLIGHT ) - OutputDebugString("Hot"); - - DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); + // Set up tranparent background + SetBkMode(lpdis->hDC, TRANSPARENT); + + if ( GetSysColorBrush(COLOR_HOTLIGHT) ) + SetTextColor(lpdis->hDC, GetSysColor(COLOR_HOTLIGHT)); + else + SetTextColor(lpdis->hDC, RGB(0,0,255)); // Win95/NT4 arrggg!!! + + pFields[nIdx].rect = lpdis->rcItem; + // Calculate needed size of the control + DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &pFields[nIdx].rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); + pFields[nIdx].rect.right += 4; + pFields[nIdx].rect.bottom = lpdis->rcItem.bottom; + // Resize but don't move + SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pFields[nIdx].rect.right - pFields[nIdx].rect.left, + pFields[nIdx].rect.bottom - pFields[nIdx].rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + // Draw the text + lpdis->rcItem = pFields[nIdx].rect; + // Add little margin to avoid focus rect over text + lpdis->rcItem.right += 2; lpdis->rcItem.left += 2; + + if ( lpdis->itemState & ODS_HOTLIGHT ) + OutputDebugString("Hot"); + + DrawText(lpdis->hDC, pFields[nIdx].pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); #ifdef IO_LINK_UNDERLINED - DeleteObject(SelectObject(lpdis->hDC, OldFont)); + DeleteObject(SelectObject(lpdis->hDC, OldFont)); #endif - } - } break; } case WM_CTLCOLORSTATIC: @@ -807,31 +806,35 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, // pFields[nIdx].nParentIdx is used to store original windowproc int WINAPI StaticLINKWindowProc(HWND hWin, UINT uMsg, LPARAM wParam, WPARAM lParam) { - for (int StaticField = 0; StaticField < nNumFields; StaticField++) + int StaticField = FindControlIdx(GetDlgCtrlID(hWin)); + switch(uMsg) { - if (pFields[StaticField].nType == FIELD_LINK && hWin == pFields[StaticField].hwnd ) + case WM_ERASEBKGND: + return 0; + case WM_GETDLGCODE: + return DLGC_BUTTON|DLGC_WANTALLKEYS; + case WM_KEYDOWN: { - switch(uMsg) + if ( wParam == VK_RETURN ) + WMCommandProc(hMainWindow, pFields[StaticField].nControlID, pFields[StaticField].hwnd, BN_CLICKED); + else if ( wParam == VK_TAB ) + SendMessage(hMainWindow, WM_NEXTDLGCTL, GetKeyState(VK_SHIFT) & 0x8000, FALSE); + } + break; + case WM_SETCURSOR: + { + if ( (HWND)wParam == hWin && LOWORD(lParam) == HTCLIENT ) { - case WM_ERASEBKGND: - return 0; - case WM_SETCURSOR: + HCURSOR hCur = LoadCursor(NULL, IDC_HAND); + if ( hCur ) { - if ( (HWND)wParam == hWin && LOWORD(lParam) == HTCLIENT ) - { - HCURSOR hCur = LoadCursor(NULL, IDC_HAND); - if ( hCur ) - { - SetCursor(hCur); - return 1; // halt further processing - } - } + SetCursor(hCur); + return 1; // halt further processing } } - return CallWindowProc((WNDPROC)pFields[StaticField].nParentIdx, hWin, uMsg, wParam, lParam); } } - return 0; + return CallWindowProc((WNDPROC)pFields[StaticField].nParentIdx, hWin, uMsg, wParam, lParam); } #endif @@ -1190,7 +1193,8 @@ void showCfgDlg() { lpWndProcOld = (void *) SetWindowLong(hMainWindow,DWL_DLGPROC,(long)ParentWndProc); - SendMessage(hMainWindow, WM_NOTIFY_CUSTOM_READY, 0, 0); + // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog + SendMessage(hMainWindow, WM_NOTIFY_CUSTOM_READY, (WPARAM)hConfigWindow, 0); ShowWindow(hConfigWindow, SW_SHOWNA); SetFocus(hNextButton); diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index 6521e4ff..01792f76 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -253,7 +253,8 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) AddFolderFromReg(HKEY_LOCAL_MACHINE); AddFolderFromReg(HKEY_CURRENT_USER); - SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, 0, 0); + // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog + SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); ShowWindow(hwndDlg, SW_SHOWNA); SetFocus(GetDlgItem(hwParent, IDOK)); } diff --git a/Plugins/InstallOptions.dll b/Plugins/InstallOptions.dll index c5c2c863cc62e739409757f07a6ce57d76c1e28c..2456de388ea6fab7fcd140b77825f0dee0c74db1 100644 GIT binary patch delta 3960 zcmd^B{a;j78ozg#fk6fsg#iS|58p zPwsU#@VHu88;b2>T3O(#g*FH&TiW7VS(;gyT>_2OB6O{@&mC~}r~L=^&gXm1bDo!T zp8LFuWY^9T&ht?}cJNqa?TeFTO0=ca&j~eT=Mnc;gj&<=c*9E zE(thx1w|0v1euvi^d7_B?gFgqM;DbgvJWMzl1T|!Rq5nvRH{l>B#uPSsxruQ^rk9} zd<1o?vJ{to-4vdfeC$_@O~Kyz{@X|6yX=>o$( zbVU6-#g$v=sydI{jVzH<$>nHOByIOd(s4W5jlHB)T->Jeh#nqU^~R z;3R*iru_CaLR&1=|Auj4xjKi?N?)NkO$OPD9GXdS!BGTJQob^zk|wK2UR0&w$rQ9- zvz0uL=0<0b541cTJ(?sJqs=iTK7W-#OL!M!s0~T?GsY`|`6WXE4Qm%&@%~#%Z@QS{ z6uVcP$`|uT#QS^H9?eW|rb~(&fT;8uTv8;M_5SR?741!QkB}pTE0i!;yA~2!tSbk% z&B2aBv9F-$uv!WE;Jg~KTI(I*$D}t*CDo()SY65)P?H7cyt#Gfy;J>ojVH#BA*s?? z6pS_c&VhW1*s-{D(Ge{Hn~AxaBLCndkJ~;HGUajFO)$kiR|TV;hGA8dos~ItZW!IY z*c*>^t+0pKUpEk2TPQP0>;?anGV^FpE^x$LZM&p(#qQ75g1!rT)zS`#p}$kx<1@%| zZ+rn>rIcE3U_6kg)k3X$!Uys+q*orpJ)^~rq0m7P15S043$IGTx}V?xI7=qwv)sv8 zw-@HRpeIVEZv*Y>Rh1J2CPGRCFjkz;-!6A;vH$3pasvd-7pMwLdL5n+Tda-`>j=z9 zn&-xt!mDBDdN2x!+zA0^SgM~;4tXL@pSZypWeADFI>Z@u7qQ zh|qeXL8G};4q!9NjLS^e2{I@QYd7>s(;2y0&WhGPR1ud+_M^YVjf3$>XuJ|Pmu&{+ zrrHN#=S&FCVs z7Oe-_<5}@{pgwGiE!cWOg>#!lL7}Shb5ny&o>1@5keuK zULFm#eaA?CFELYoQMdZ8b8>Ws?sd_A9Aq2x3n7>V1p&CG3m`vT=v2z&rJW#wKdC6- zYJnMqB^Ofkyv6BTA?RL}bn*v`x66myIy_OXyDr@cKwHSjRR~__<=lASG8@VcJ}p}N z(L-Z4WnQ|1@zASEXG5d}`$->#$Ud3;AVl`dWGhP5kLLow2(<|ms8aIXv(iYF_pG$i z(tB2FsSx?}S+NJekGbCGuvNYdq$Jd)pP;yX8-1sDq_n}`RY`}W|4IJW@(#G9Yciu} zJTwUE*PBN@9+DqZ)j-j}IbfIbsJTmqZ{90eQzJPZ6S0QtEMdt|`ZOb#F( zaBXDF)ug! z&7!&9yw%)o)>xdDS(ZmF$nu)ypry}3SXWw~w63;RTQ^%yrhr+@Ji;tzDwws*I_7z%f!W4v zXWn4mX7(|MnGWV3%t_``rjNPKM6xlgo;9$OS(eRZ=derIO17G)k zb=G&ACAk<*&yC|UI5TJGoZM_~KKC%Uf~(;~uAbYt8 zL3UGiYxW1($FfgnU(W8!R`~2mcD;SFowXO)OYQ6Iwe}b6ui9Je-`j85qa9-%Qyg~3 zG{-VWg=3@R&yH=5Hyo{wZpU@UO$T%yS$n?R((N7rV^zlzdQ2~-L-i84`kY9=*@ zDx)5yR#27HGnAj&Ky9U7rFK&LsQ0OM>Nxc|^&6!$#u^iidZWRZ1vN6qSO_(;##n9K zXxwEyZ0t0iHeN9P3#uj7lw`^<(WV%40@TD#^Lyq_^G8q_7tG(8NlS#q;e!%6XZgl5 z(wb;(w!UNCZ#`tiRuvsZC(@}jMKg3RJ&P`f>hRDtbbv>-27VFMWXSq)*Ui z=<77eq%h+cilLc2W)`!6S;SN`&oTjK2h+^#Wezey=3}Uf&zP^6@0qL24dx~j!H#0b zu@=@hjh)HPV;8Y*_DOaPyN<18|HN)#x3SyVX7(+1ANxKON;mr{dy)N)y}|y`h2f0daJ@*3lDpblr?gV#=`C1*Zh delta 3919 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 bv6JjHtFrU#I%~4$>=QFaJEJ|k*q#3kJ(R}% diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index 2e6f6d79..977dc292 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -453,6 +453,7 @@ nextPage: else { if (g_flags.abort) SetFocus(m_hwndCancel); else if (g_flags.autoclose) goto nextPage; + else SetFocus(m_hwndOK); // without focus button, the system Beeps every time user press one key return 0; } @@ -499,6 +500,7 @@ nextPage: if (uMsg == WM_NOTIFY_CUSTOM_READY) { DestroyWindow(m_curwnd); + m_curwnd = (HWND)wParam; } if (uMsg == WM_CLOSE) { @@ -541,6 +543,11 @@ nextPage: } } } + else + { + // Forward WM_COMMANDs to inner dialogs, can be custom ones + SendMessage(m_curwnd, uMsg, wParam, lParam); + } } return HandleStaticBkColor(); }