From 1e17d02ff77657469eba1f4f53226e60fb9d4a61 Mon Sep 17 00:00:00 2001 From: anders_k Date: Fri, 28 Mar 2014 16:17:07 +0000 Subject: [PATCH] Added CreateShortcut /NoWorkingDir optional parameter git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6452 212acab6-be3b-0410-9dea-997c60f758d6 --- Docs/src/generalpurpose.but | 4 ++-- Docs/src/history.but | 2 ++ Source/exehead/exec.c | 4 ++-- Source/script.cpp | 8 ++++++-- Source/tokens.cpp | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Docs/src/generalpurpose.but b/Docs/src/generalpurpose.but index ef52348a..1d42f7a7 100644 --- a/Docs/src/generalpurpose.but +++ b/Docs/src/generalpurpose.but @@ -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). diff --git a/Docs/src/history.but b/Docs/src/history.but index e6350aa4..b27dd678 100644 --- a/Docs/src/history.but +++ b/Docs/src/history.but @@ -14,6 +14,8 @@ Released on ?, 2014 \S2{} Minor Changes +\b Added CreateShortcut /NoWorkingDir parameter + \b Added Int<32|64|Ptr> helper macros to Util.nsh \b Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index 6662bf8d..69786c2f 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -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); diff --git a/Source/script.cpp b/Source/script.cpp index 2b7ef99e..2c6b7dff 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -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)); diff --git a/Source/tokens.cpp b/Source/tokens.cpp index 79e4d76c..91282ba4 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -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},