File "linkmaker.bas"
Path: /linkmaker/linkmaker.bas
File size: 4.42 KB
MIME-type:
Charset: utf-8
#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
'------------------------------------------------------------------------------