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
'------------------------------------------------------------------------------