#COMPILE EXE "linkmaker.exe" #DIM ALL #RESOURCE "linkmaker.pbr" $VER = "0.2" '------------------------------------------------------------------------------ ' ** Changelog ** '------------------------------------------------------------------------------ ' - v0.2 (2025-10-07) ' o allow multiple selection in order to mass-create shortcuts ' o propose to install program as a Linux App ' o improve behavior in Linux ' - v0.1 (2025-09-29) Initial release '------------------------------------------------------------------------------ MACRO MyMsgBox(hd,m,t,st) = MessageBox(hd,m,t,st) '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #INCLUDE ONCE "WIN32API.INC" #INCLUDE ONCE "INC/SHORTCUT.INC" #INCLUDE ONCE "INC/EXE2UNIX.INC" '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ #IF NOT %DEF(%FN_EXISTS) %FN_EXISTS = -1 FUNCTION EXISTS(BYVAL fileOrFolder AS STRING) AS LONG LOCAL Dummy& Dummy& = GETATTR(fileOrFolder) FUNCTION = (ERRCLEAR = 0) END FUNCTION #ENDIF '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() LOCAL lnk AS LINKTYPE LOCAL arg AS STRING LOCAL sav AS STRING LOCAL file() AS STRING LOCAL cnt AS LONG LOCAL i AS LONG ' Create exe icon in Unix dock and Unix file explorer Me2Unix 1, 1 ' askConfirmation=%TRUE, showInAppMenu=%TRUE cnt = 1 arg = TRIM$(COMMAND$(1), ANY $SPC+$TAB+$DQ) IF arg = "/?" THEN ?EXE.NAMEX$+" v"+$VER,%MB_ICONINFORMATION,EXE.NAME$ EXIT FUNCTION END IF ' If no argument passed: select source file IF arg = "" THEN DISPLAY OPENFILE 0, , , "Create shortcut from file(s)...", "", _ CHR$("Everything (*.*)", 0, "*.*", 0), "", "", %OFN_FILEMUSTEXIST OR _ %OFN_SHOWHELP OR %OFN_NONETWORKBUTTON OR %OFN_ENABLESIZING _ OR %OFN_ALLOWMULTISELECT OR %OFN_NODEREFERENCELINKS TO arg, cnt IF arg = "" OR cnt = 0 THEN EXIT FUNCTION ' canceled by user END IF ' Split files in case of multiselect REDIM file(1 TO cnt) IF cnt = 1 THEN file(1) = TRIM$(arg, $NUL) ELSE FOR i = 1 TO cnt file(i) = PARSE$(arg,CHR$(0),1) + "\" + PARSE$(arg,CHR$(0),i+1) NEXT END IF ' 'DEBUG: ' local t as string ' t = "Selected files:"+$cr ' FOR i = 1 TO UBOUND(file) ' t += "("+format$(i)+") "+$dq+file(i)+$dq+$cr ' NEXT ' ?t,%mb_iconinformation,"debug" ' exit function ' Allow to specify target in case of single file IF cnt = 1 THEN DISPLAY SAVEFILE 0, , , "Save as:", PATHNAME$(path, arg), _ CHR$("Shortcut file (*.lnk)", 0, "*.lnk", 0), _ PATHNAME$(NAME, arg)+".lnk", "lnk", _ %OFN_PATHMUSTEXIST OR %OFN_SHOWHELP OR %OFN_NONETWORKBUTTON OR _ %OFN_ENABLESIZING OR %OFN_OVERWRITEPROMPT TO sav IF sav = "" THEN EXIT FUNCTION ' canceled by user END IF ' Create all target shortcuts FOR i = 1 TO cnt lnk.zLinkFolder = PATHNAME$(PATH, IIF$(cnt=1, sav, file(i))) lnk.zLinkName = PATHNAME$(NAMEX, IIF$(cnt=1, sav, file(i))) + IIF$(cnt=1, "", ".lnk") lnk.zExeName = file(i) lnk.zWorkDir = PATHNAME$(PATH, file(i)) WriteShortcut lnk ' And reveal their icon if they're shortcuts to .exe files IF RIGHT$(LCASE$(file(i)), 4) = ".exe" THEN FileIco2Unix IIF$(cnt=1, sav, file(i) + ".lnk"), IcoStrip2Unix(file(i)) END IF NEXT ' Select the first created shortcut in explorer/Nautilus IF IsOnUnix() THEN UnixShell "/usr/bin/nautilus " + $DQ _ + UnixPath(IIF$(cnt=1, sav, file(i) + ".lnk")) + $DQ ELSE ShellExecute BYVAL 0, "open", "explorer.exe", "/select," _ + $DQ + IIF$(cnt=1, sav, file(i) + ".lnk") + $DQ, _ BYVAL 0, %SW_SHOWNORMAL END IF END FUNCTION '------------------------------------------------------------------------------