mode 1 allows entering a text, ie. [Alt]+[Space] then [W][O][R][D] should launch 'word'
It will save a file "launchy.lbn" where ever you run it from.
how can you tell the difference between a windows and console application? read the PE header I suppose
Code: Select all
;an idea for to facilitate blueznl mode 1
;mode 1 allows entering a text, ie. [Alt]+[Space] then [W][O][R][D] should launch 'word'
;quick hacky launchy app - code at line 197
Structure edge
edge.i[256]
EndStructure
Structure TrieNode;
Value.i;
Count.i;
Vertex.edge
EndStructure;
Structure Trie
*vt.i
*root.TrieNode;
EndStructure;
Declare FreeNodes(*node.TrieNode)
Declare NewTrie(*obj.Trie)
Declare FreeTrie(*this.Trie)
Declare AddTrie(*this.Trie,key.s,value.i=1)
Declare lookupTrie(*this.Trie,key.s)
Declare iEnumTrie(*this.Trie,*node.TrieNode,key.s,*fn)
Declare EnumTrie(*this.Trie,key.s,*fn.i)
Interface clsTrie
Free()
Add(key.s,item.i=1)
LookUp(key.s)
Enum(key.s,*fn.i)
EndInterface
Procedure FreeNodes(*node.TrieNode)
;Free all Trie Nodes
Protected a.i
If Not *node
ProcedureReturn;
EndIf
For a=0 To 255
FreeNodes(*node\Vertex\edge[a]);
Next
If *node
FreeMemory(*node)
EndIf
EndProcedure
Procedure NewTrie(*obj.Trie)
*obj = AllocateMemory(SizeOf(Trie))
If *obj
*obj\vt=?vt_Trie
EndIf
*obj\root = AllocateMemory(SizeOf(TrieNode))
ProcedureReturn *obj
EndProcedure
Procedure FreeTrie(*this.Trie)
;free the Trie
FreeNodes(*this\root)
FreeMemory(*this)
EndProcedure
Procedure AddTrie(*this.Trie,key.s,value.i=1)
;Add item to the Trie, value is optional
Protected *tnode.TrieNode,*node.TrieNode,len.i,tkey.i,lkey.i,pos.i
len = Len(key)
lkey.i
If Not len
ProcedureReturn;
EndIf
*node = *this\root;
While pos < Len+1
tkey = PeekB(@key+pos) & $FF
If Not *node
*node = AllocateMemory(SizeOf(TrieNode))
*tnode\Vertex\edge[lkey] = *node
EndIf
*node\count + 1
If pos = len
*node\value = value
EndIf
*tnode = *node
*node = *node\Vertex\edge[tkey]
lkey = tkey
pos+1
Wend
EndProcedure
Procedure lookupTrie(*this.Trie,key.s)
;Find the value of the key returns the value or 0
Protected *node.TrieNode,*bkey.byte,result.i
*node = *this\root
*bkey = @key
*node = *node\Vertex\edge[*bkey\b & $FF]
While *bkey\b <> 0
If Not *node
ProcedureReturn 0
EndIf
*bkey+1
result = *node\value
*node = *node\Vertex\edge[*bkey\b & $FF]
Wend
ProcedureReturn result
EndProcedure
Procedure iEnumTrie(*this.Trie,*node.TrieNode,key.s,*fn)
;internal Enum trie
Protected a.i,tkey.s
If Not *node
ProcedureReturn;
EndIf
;build the key
For a=0 To 255
If *node\Vertex\edge[a]
tkey = key + Chr(a)
iEnumTrie(*this,*node\Vertex\edge[a],tkey,*fn);
Else
tkey = key
EndIf
Next
;lookup the key
If lookupTrie(*this,tkey)
CallFunctionFast(*fn,@tkey)
key=tkey
ProcedureReturn *node
EndIf
EndProcedure
Procedure EnumTrie(*this.Trie,key.s,*fn.i)
;enumerate all the entries below given root key
Protected *node.TrieNode,*tnode.TrieNode,tkey.i,len.i,pos.i
*node = *this\root;
tkey = PeekB(@key) & $FF;
len = Len(key)
*node = *node\Vertex\edge[tkey]
;find the root
While *node
If *node
*tnode =*node
EndIf
pos+1
tkey = PeekB(@key+pos) & $FF
*node = *node\Vertex\edge[tkey]
Wend
;enum the root
While *tnode
*tnode = iEnumTrie(*this,*tnode,key,*fn)
tkey = PeekB(@key+pos) & $FF
If *tnode
*tnode = *tnode\Vertex\edge[tkey]
EndIf
Wend
EndProcedure
DataSection: vt_Trie:
Data.i @FreeTrie()
Data.i @AddTrie()
Data.i @lookupTrie()
Data.i @EnumTrie()
EndDataSection
; Hacky Test code_____________________________________________________________________
Global result.s
Procedure MyTreeCallBack(*item)
;
result + PeekS(*item) + " "
;
EndProcedure
;
Global mt.clsTrie = NewTrie(@mt)
Global Dim gApps.s(100)
Global gAppCnt,gScanDone,gappSize
Global gWinScan,gKillScan,gScanDone,gscanpos,gloaded,gTotalDriveSize.q,gScanSum.q,gmwind,gmvis
Structure fDat
file.s{256}
app.s {64}
EndStructure
Structure scaninf
mode.i
dir.s
EndStructure
Enumeration
#Window_Media
#LV_APPS
#S_APP
#M_ReScan
#PBar
#TDrive
#TFile
#TCount
#M_Help
#M_About
#M_port
EndEnumeration
Procedure addapp(filePath.s,name.s,fn)
If Not mt\LookUp(name)
If gAppCnt >= gAppSize
gAppSize + 100
ReDim gapps.s(gAppSize)
EndIf
gapps(gAppCnt) = filepath
mt\Add(name,gAppCnt)
gAppCnt+1
If IsFile(fn)
dat.fDat
dat\app = name
dat\file = filePath
FileSeek(fn,Lof(fn))
WriteData(fn,@dat,SizeOf(fdat))
EndIf
EndIf
EndProcedure
Procedure.s dirlist(dir.s,bRec,ofn):
Static strFiles.s,ct1
Protected sumf.f,tot.f
mDir=ExamineDirectory(#PB_Any,dir,"*.*")
If mDir ;And Not gKillScan
While NextDirectoryEntry(mDir)
gScanSum + DirectoryEntrySize(mDir)
If gTotalDriveSize <> 0 And gScanSum <> 0 And gWinScan
sumf = gScanSum
tot = gTotalDriveSize
Scanpos = Int((sumf / tot) * 100.0)
SetGadgetState(#pbar,Scanpos)
EndIf
If DirectoryEntryType(mDir)=#PB_DirectoryEntry_File
FN.s=DirectoryEntryName(mDir):
exe.s = GetExtensionPart(FN)
If exe = "exe"
FFN.s= dir+"\"+FN
If IsWindow(gWinScan)
SetGadgetText(#Tfile,FFN)
EndIf
ts.s = LCase(Left(FN,Len(FN)-4))
addApp(FFN,ts,ofn)
ct1+1
EndIf
Else
td$=DirectoryEntryName(mDir)
If td$<>"." And td$<>".."
If bRec=0
dirlist(Dir+"\"+td$,bRec,ofn)
EndIf
EndIf
EndIf
Wend
FinishDirectory(mDir)
EndIf
EndProcedure:
Procedure AddToDB(*scan.scaninf)
Protected filn,fn.i,ts.s,dir.s
Protected fb.q,tb.q,tfb.q,titlecount.i
dir=*scan\dir
SetErrorMode_(#SEM_FAILCRITICALERRORS)
If *scan\mode=1 Or *scan\mode=2
fn = OpenFile(-1,"launchy.lbn")
If dir = "\"
For d = 'A' To 'Z'
gScanSum=0
dir = Chr(d) + ":\"
SetGadgetText(#TDrive,dir)
GetDiskFreeSpaceEx_(dir,@fb,@TB,@TFB)
gTotalDriveSize = (TB - TFB)
dirlist(dir,0,fn)
Next
Else
drive.s = Left(dir,3)
GetDiskFreeSpaceEx_(drive,@fb,@TB,@TFB)
gTotalDriveSize = (TB - TFB)
SetGadgetText(#TDrive,drive)
dirlist(dir,0,fn)
EndIf
ElseIf *scan\mode=0
fn=ReadFile(#PB_Any,"launchy.lbn")
If fn
While Not Eof(fn)
indat.fdat ;ts=Space(512)
ReadData(fn,@indat,SizeOf(fdat))
addapp(indat\file,indat\app,0)
Wend
If IsFile(fn)
CloseFile(fn)
EndIf
EndIf
EndIf
gScanDone = 1
SetErrorMode_(0)
EndProcedure
Procedure Open_ScanGui(mode)
Protected title.s,evs.i,dir.s,scan.scaninf,result
title = "Launchy Scaner"
fn = OpenFile(-1,"launchy.lbn")
homedir.s = Left(GetCurrentDirectory(),3)
tlen = Lof(fn)
CloseFile(fn)
If tlen = 0 Or mode
If tlen = 0
result = MessageRequester("Launcy Scan - Add Links","Would like to scan your entire system?",#PB_MessageRequester_YesNo)
If result = #PB_MessageRequester_Yes
bScanAll=1
dir = "\"
EndIf
mode=1
EndIf
If Not bScanAll
dir.s = PathRequester("Please choose a directory To scan", InitialPath$)
;dir = Left(dir,Len(dir)-1)
EndIf
scan\mode = mode
scan\dir = dir
If dir <> ""
gWinScan = OpenWindow(-1, 354, 253, 492, 126, Title, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If gWinScan
ProgressBarGadget(#PBar, 5, 85, 480, 35, 0, 100, #PB_ProgressBar_Smooth)
TextGadget(#TDrive, 10, 10, 90, 30, "")
TextGadget(#TFile, 10, 50, 475, 30, "")
TextGadget(#TCount, 100, 10, 200,30,"")
EndIf
If dir <> ""
gScanDone=0
CreateThread(@AddToDB(),@scan)
Repeat
evs=WindowEvent()
Delay(0)
Until gScanDone Or evs=#WM_CLOSE
Else
If IsWindow(gWinScan)
CloseWindow(gWinScan)
EndIf
gWinScan=0
EndIf
If gScanDone
If IsWindow(gWinScan)
CloseWindow(gWinScan)
EndIf
gWinScan=0
EndIf
EndIf
Else
scan\mode = 0
scan\dir = ""
AddToDB(@scan)
EndIf
EndProcedure
Procedure UpdateList(*item)
If *item
item.s = PeekS(*item)
AddGadgetItem(#LV_APPS,-1,item)
SetGadgetState(#LV_APPS,0)
EndIf
EndProcedure
mod.scaninf
mod\dir = "\"
mod\mode = 0
AddToDB(@mod)
;Open_ScanGui(1)
Global gpt
gmwind = OpenWindow(-1,300,300,300,300,"Runner", #PB_Window_SystemMenu)
StringGadget(#S_APP,5,5,290,20,"")
ListViewGadget(#LV_APPS,5,30,290,260)
If CreateMenu(0, WindowID(gmwind)) ;
MenuTitle("Apps")
MenuItem(#M_ReScan, "Add Apps")
EndIf
AddKeyboardShortcut(gmwind, #PB_Shortcut_Down,10)
AddKeyboardShortcut(gmwind, #PB_Shortcut_Up,11)
AddKeyboardShortcut(gmwind, #PB_Shortcut_Return,12)
SetActiveGadget(#S_APP)
Repeat
EV = WaitWindowEvent()
EVG = EventGadget()
EVT = EventType()
EVW=EventWindow()
If ev
If EVW=gmwind
If EV = #PB_Event_Menu
mev = EventMenu()
Select mev
Case #M_ReScan
Open_ScanGui(2)
Case 10
If gpt < CountGadgetItems(#LV_APPS)
gpt+1
EndIf
SetGadgetState(#LV_APPS,gpt)
Case 11
If gpt > 0
gpt-1
EndIf
SetGadgetState(#LV_APPS,gpt)
Case 12
pos = GetGadgetState(#LV_APPS)
If pos >= 0
tapp.s = GetGadgetItemText(#LV_APPS,pos)
res = mt\LookUp(tapp.s)
If res
RunProgram(gapps(res))
SetActiveGadget(#S_APP)
EndIf
EndIf
EndSelect
ElseIf EV = #PB_Event_Gadget
Select EVG
Case #LV_APPS
If evt = #PB_EventType_LeftDoubleClick
pos = GetGadgetState(#LV_APPS)
tapp.s = GetGadgetItemText(#LV_APPS,pos)
res = mt\LookUp(tapp.s)
If res
RunProgram(gapps(res))
SetActiveGadget(#S_APP)
EndIf
EndIf
Case #S_APP
tapp.s = GetGadgetText(#S_APP)
If Len(tapp) > 1
ClearGadgetItems(#LV_APPS)
mt\Enum(tapp,@UpdateList())
EndIf
EndSelect
EndIf
EndIf
EndIf
Until EV = #WM_CLOSE