Added CreateShortcut /NoWorkingDir optional parameter

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6452 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2014-03-28 16:17:07 +00:00
parent a864703ce9
commit 1e17d02ff7
5 changed files with 13 additions and 7 deletions

View file

@ -35,12 +35,12 @@ You should always specify an absolute path.
\S2{createshortcut} CreateShortCut
\c link.lnk target.file [parameters [icon.file [icon_index_number [start_options [keyboard_shortcut [description]]]]]]
\c [/NoWorkingDir] link.lnk target.file [parameters [icon.file [icon_index_number [start_options [keyboard_shortcut [description]]]]]]
Creates a shortcut 'link.lnk' that links to 'target.file', with optional parameters 'parameters'.
The icon used for the shortcut is 'icon.file,icon_index_number'; for default icon settings use empty strings for both icon.file and icon_index_number.
start_options should be one of: \e{SW_SHOWNORMAL}, \e{SW_SHOWMAXIMIZED}, \e{SW_SHOWMINIMIZED}, or an empty string.
keyboard_shortcut should be in the form of 'flag|c' where flag can be a combination (using |) of: \e{ALT}, \e{CONTROL}, \e{EXT}, or \e{SHIFT}. c is the character to use (a-z, A-Z, 0-9, F1-F24, etc). Note that no spaces are allowed in this string. A good example is "ALT|CONTROL|F8". $OUTDIR is used for the working directory. You can change it by using \R{setoutpath}{SetOutPath} before creating the Shortcut.
keyboard_shortcut should be in the form of 'flag|c' where flag can be a combination (using |) of: \e{ALT}, \e{CONTROL}, \e{EXT}, or \e{SHIFT}. c is the character to use (a-z, A-Z, 0-9, F1-F24, etc). Note that no spaces are allowed in this string. A good example is "ALT|CONTROL|F8". $OUTDIR is used for the working directory. You can change it by using \R{setoutpath}{SetOutPath} before creating the Shortcut or use /NoWorkingDir if you don't need to set the working directory.
description should be the description of the shortcut, or comment as it is called under XP.
The error flag is set if the shortcut cannot be created (i.e. either of the paths (link or target) does not exist, or some other error).

View file

@ -14,6 +14,8 @@ Released on ?, 2014
\S2{} Minor Changes
\b Added CreateShortcut /NoWorkingDir parameter
\b Added Int<32|64|Ptr><Op|Cmp[U]> helper macros to Util.nsh
\b Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests

View file

@ -1069,8 +1069,8 @@ static int NSISCALL ExecuteEntry(entry *entry_)
if (SUCCEEDED(hres))
{
hres = psl->lpVtbl->SetPath(psl,buf2);
psl->lpVtbl->SetWorkingDirectory(psl,state_output_directory);
if ((parm4&0xff00)>>8) psl->lpVtbl->SetShowCmd(psl,(parm4&0xff00)>>8);
if (!(parm4&0x8000)) psl->lpVtbl->SetWorkingDirectory(psl,state_output_directory);
if ((parm4&0x7f00)>>8) psl->lpVtbl->SetShowCmd(psl,(parm4&0x7f00)>>8);
psl->lpVtbl->SetHotkey(psl,(unsigned short)(parm4>>16));
if (buf3[0]) psl->lpVtbl->SetIconLocation(psl,buf3,parm4&0xff);
psl->lpVtbl->SetArguments(psl,buf0);

View file

@ -4381,13 +4381,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
#endif//!NSIS_SUPPORT_MESSAGEBOX
case TOK_CREATESHORTCUT:
#ifdef NSIS_SUPPORT_CREATESHORTCUT
{
ent.which=EW_CREATESHORTCUT;
int noLnkWorkDir=0, s;
if (!_tcsicmp(line.gettoken_str(1),_T("/NoWorkingDir"))) line.eattoken(), noLnkWorkDir++;
ent.offsets[0]=add_string(line.gettoken_str(1));
ent.offsets[1]=add_string(line.gettoken_str(2));
ent.offsets[2]=add_string(line.gettoken_str(3));
ent.offsets[3]=add_string(line.gettoken_str(4));
ent.offsets[5]=add_string(line.gettoken_str(8));
int s;
ent.offsets[4]=line.gettoken_int(5,&s)&0xff;
if (!s)
{
@ -4398,6 +4400,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
}
ent.offsets[4]=0;
}
if (noLnkWorkDir) ent.offsets[4] |= 0x8000;
if (line.getnumtokens() > 6 && *line.gettoken_str(6))
{
int tab[3]={SW_SHOWNORMAL,SW_SHOWMAXIMIZED,SW_SHOWMINNOACTIVE/*SW_SHOWMINIMIZED doesn't work*/};
@ -4407,7 +4410,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
ERROR_MSG(_T("CreateShortCut: unknown show mode \"%") NPRIs _T("\"\n"),line.gettoken_str(6));
PRINTHELP()
}
ent.offsets[4]|=tab[a]<<8;
ent.offsets[4] |= tab[a]<<8;
}
if (line.getnumtokens() > 7)
{
@ -4453,6 +4456,7 @@ int CEXEBuild::doCommand(int which_token, LineParser &line)
DefineInnerLangString(NLF_CREATE_SHORTCUT);
DefineInnerLangString(NLF_ERR_CREATING_SHORTCUT);
}
return add_entry(&ent);
#else//!NSIS_SUPPORT_CREATESHORTCUT
ERROR_MSG(_T("Error: %") NPRIs _T(" specified, NSIS_SUPPORT_CREATESHORTCUT not defined.\n"), line.gettoken_str(0));

View file

@ -58,7 +58,7 @@ static tokenType tokenlist[TOK__LAST] =
{TOK_CRCCHECK,_T("CRCCheck"),1,0,_T("(on|force|off)"),TP_GLOBAL},
{TOK_CREATEDIR,_T("CreateDirectory"),1,0,_T("directory_name"),TP_CODE},
{TOK_CREATEFONT,_T("CreateFont"),2,5,_T("$(user_var: handle output) face_name [height weight /ITALIC /UNDERLINE /STRIKE]"),TP_CODE},
{TOK_CREATESHORTCUT,_T("CreateShortCut"),2,6,_T("shortcut_name.lnk shortcut_target [parameters [icon_file [icon index [showmode [hotkey [comment]]]]]]\n showmode=(SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED)\n hotkey=(ALT|CONTROL|EXT|SHIFT)|(F1-F24|A-Z)"),TP_CODE},
{TOK_CREATESHORTCUT,_T("CreateShortCut"),2,6,_T("[/NoWorkingDir] shortcut_name.lnk shortcut_target [parameters [icon_file [icon index [showmode [hotkey [comment]]]]]]\n showmode=(SW_SHOWNORMAL|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED)\n hotkey=(ALT|CONTROL|EXT|SHIFT)|(F1-F24|A-Z)"),TP_CODE},
{TOK_DBOPTIMIZE,_T("SetDatablockOptimize"),1,0,_T("(off|on)"),TP_ALL},
{TOK_DELETEINISEC,_T("DeleteINISec"),2,0,_T("ini_file section_name"),TP_CODE},
{TOK_DELETEINISTR,_T("DeleteINIStr"),3,0,_T("ini_file section_name entry_name"),TP_CODE},