-> FILE: ESrc:Own/BKGUI.e REV: 521 --- BlizKick GUI /* History */ OPT OSVERSION=37, PREPROCESS MODULE 'tools/EasyGUI', 'tools/exceptions', 'amigalib/lists', 'utility', 'gadtools', 'libraries/gadtools', 'exec/lists', 'exec/nodes', 'dos/dos', 'dos/exall', 'dos/dosextens' MODULE 'intuition/intuition','intuition/sghooks' -> dirwalker flags ENUM DWF_RECURSIVE=1, DWF_NOSOFT=2, DWF_NOHARD=4 ENUM ERR_NONE, ERR_NEW, ERR_STR, ERR_LOCK, ERR_ADO, ERR_NODE, ERR_LIB, ERR_PATT, ERR_OK, ERR_CANCEL, ERR_BREAK RAISE ERR_NEW IF New()=NIL, ERR_STR IF String()=NIL, ERR_LOCK IF Lock()=NIL, ERR_BREAK IF CtrlC()=TRUE, -> ERR_ADO IF AllocDosObject()=NIL, ERR_LIB IF OpenLibrary()=NIL -> ERR_PATT IF ParsePatternNoCase()=-1 CONST BUF_SIZE=1024, FILENAME_SIZE=300 CONST PATTERNBUFF_SIZE=FILENAME_SIZE*2+2 ENUM DIR_NODE, POS_NODE, VOL_NODE, ASN_NODE, FILE_NODE, MAX_TYPE CONST DIRSTRLEN=6 DEF pathStr[FILENAME_SIZE]:STRING, currPath[FILENAME_SIZE]:STRING, fileStr[FILENAME_SIZE]:STRING, patternStr[FILENAME_SIZE]:STRING, patternBuff[PATTERNBUFF_SIZE]:ARRAY DEF listGad1, listGad2, listGad3, txtGad1, txtGad2, secs, micros, nameList1=NIL:PTR TO lh, nameList2=NIL:PTR TO lh, nameList3=NIL:PTR TO lh, posList=NIL:PTR TO lh, txtGadc, txtGvt, txtGv DEF f_force,f_localfast,f_quickboot,f_speedrom,f_hogwaitblit, oldSel1=-1, oldSel2=-1, oldSel3=-1 DEF gh=NIL:PTR TO guihandle DEF ksList=NIL:PTR TO lh,modList=NIL:PTR TO lh OBJECT mynode succ:PTR TO mynode pred:PTR TO mynode type:CHAR pri:CHAR name:PTR TO CHAR userptr:LONG ENDOBJECT OBJECT module filename:PTR TO CHAR enable:CHAR ENDOBJECT OBJECT kickstart filename:PTR TO CHAR version:INT revision:INT size:LONG ENDOBJECT OBJECT setdata kickstart:PTR TO mynode -> (kickstart) modules:lh -> list of mynode (module) switches:LONG ENDOBJECT /* saved set [SetName] kickstart=DEVS:rom40068 module=MoveVBR module=Preparemul module=SoftSCSI switches=$1 */ PROC main() HANDLE DEF here=NIL utilitybase:=OpenLibrary('utility.library', 37) gadtoolsbase:=OpenLibrary('gadtools.library', 37) NEW nameList1, nameList2, nameList3 newList(nameList1) newList(nameList2) newList(nameList3) addNode(nameList1, 'set1', 0, 0) addNode(nameList1, 'set2', 0, 0) addNode(nameList1, 'set3', 0, 0) /* addNode(nameList2, '34.5 256k', 0, 0) addNode(nameList2, '39.106 512k', 0, 0) addNode(nameList2, '40.68 512k', 0, 0) addNode(nameList3, '· SoftSCSI', 0, 0) addNode(nameList3, '· PrepareEmul', 0, 0) addNode(nameList3, ' Hackdisk', 0, 0) */ getksList() getmodList() gui() EXCEPT DO IF gadtoolsbase THEN CloseLibrary(gadtoolsbase) IF utilitybase THEN CloseLibrary(utilitybase) SELECT exception CASE ERR_OK PrintF('All ok\n') CASE ERR_CANCEL WriteF('Cancel\n') DEFAULT report_exception() ENDSELECT ENDPROC PROC getksList() HANDLE NEW ksList newList(ksList) dirwalker('DEVS:',DWF_RECURSIVE,{getksl_hook}) EXCEPT DO ReThrow() ENDPROC PROC getksl_hook(fib:PTR TO fileinfoblock,data) IF fib.entrytype<0 IF fib.size AND ((fib.size AND $3FFFF)=0) AND (fib.size<=$80000) IF isKickfile(fib.filename) addNodeSort(nameList2, fib.filename, 0, 0) ENDIF ENDIF ENDIF ENDPROC PROC isKickfile(name:PTR TO CHAR) DEF buf[2]:ARRAY OF LONG,fh,got IF (fh:=Open(name,MODE_OLDFILE)) got:=(Fread(fh,buf,8,1)=1) Close(fh) IF got AND ((buf[] AND $FFF8FFFF)=$11104EF9) AND (Shr(buf[1]+FileLength(name),16)=$0100) THEN RETURN TRUE ENDIF ENDPROC FALSE PROC getmodList() HANDLE NEW modList newList(modList) dirwalker('DEVS:Modules/',0,{getmodl_hook}) EXCEPT DO ReThrow() ENDPROC PROC getmodl_hook(fib:PTR TO fileinfoblock,data) DEF buf[64]:STRING IF fib.entrytype<0 IF isModulefile(fib.filename) StringF(buf,' \s',fib.filename) addNodeSort(nameList3, buf, 0, 0) ENDIF ENDIF ENDPROC PROC isModulefile(name:PTR TO CHAR) DEF sl,buf[2]:ARRAY OF LONG IF (sl:=LoadSeg(name)) CopyMem(Shl(sl,2)+4,buf,8) UnLoadSeg(sl) IF buf[]=$707A4E75 THEN RETURN TRUE ENDIF ENDPROC FALSE /* DW00 - locking of directory failed DW01 - AllocDosObject(FIB) failed DW02 - Examine() failed DW03 - ExNext() failed */ PROC dirwalker(dirname,flags,hookfunc,userdata=NIL) HANDLE DEF dirlock=NIL,fib=NIL:PTR TO fileinfoblock,state,olddir=-1 IF (dirlock:=Lock(dirname, ACCESS_READ))=NIL THEN Raise("DW00") IF (fib:=AllocDosObject(DOS_FIB,NIL))=NIL THEN Raise("DW01") IF Examine(dirlock,fib)=NIL THEN Raise("DW02") olddir:=CurrentDir(dirlock) SetIoErr(0) WHILE ExNext(dirlock,fib) state:=hookfunc(fib,userdata) EXIT state<0 IF flags AND DWF_RECURSIVE IF (fib.entrytype=ST_SOFTLINK) AND (flags AND DWF_NOSOFT) state:=0 ELSEIF (fib.entrytype=ST_LINKDIR) AND (flags AND DWF_NOHARD) state:=0 ENDIF IF state AND (fib.entrytype>=0) dirwalker(fib.filename,flags,hookfunc,userdata) ENDIF ENDIF ENDWHILE IF (IoErr()<>ERROR_NO_MORE_ENTRIES) AND (state>=0) THEN Raise("DW03") EXCEPT DO IF olddir<>-1 THEN CurrentDir(olddir) IF fib THEN FreeDosObject(DOS_FIB,fib) IF dirlock THEN UnLock(dirlock) ReThrow() ENDPROC -> GUI definition CONST SETLIST_W=10, KSLIST_W=8, MODLIST_W=9, LIST_H=10 CONST SETSTR_MAX=16, KSSTR_MAX=16, MODSTR_MAX=16 PROC gui_init(in_gh) DEF tfile[32]:STRING, cmd[64]:STRING, verstr[256]:STRING, fh, f=FALSE gh:=in_gh -> SET GLOBAL gh!! ->makeinvstr(strGad1) ->makeinvstr(strGad2) ->activategad(strGad2,gh.wnd) ->setgadgetattrs(txtGadc,[GTTX_JUSTIFICATION,GTJ_CENTER,NIL]) StringF(tfile,'T:BKGuiTmp.\h',FindTask(NIL)) StringF(cmd,'Version >\s `WHICH BlizKick` FILE FULL',tfile) IF SystemTagList(cmd,NIL)=0 IF (fh:=Open(tfile,OLDFILE)) IF Fgets(fh,verstr,256) IF StrLen(verstr)>0 THEN IF verstr[StrLen(verstr)-1]=10 THEN verstr[StrLen(verstr)-1]:=0 SetStr(verstr,StrLen(verstr)) f:=TRUE ENDIF Close(fh) ENDIF ENDIF StringF(cmd,'DELETE >NIL: \s FORCE',tfile) SystemTagList(cmd,NIL) IF Not(f) THEN StrCopy(verstr,'info not available') settxt(gh, txtGvt, 'BlizKick version') ->settxt(gh, txtGv, '1.10 (xx.xx.97)') settxt(gh, txtGv, verstr) ENDPROC PROC gui() myeasygui({gui_init},'BlizKickGUI 1.0 © 1997 Harry Sintonen', [BEVEL, ->[EQROWS, [ROWS, [COLS, txtGadc:=[TEXT,'Set',NIL,FALSE,SETLIST_W], [TEXT,'Kickstart',NIL,FALSE,KSLIST_W], [TEXT,'Modules',NIL,FALSE,MODLIST_W], [TEXT,'Switches',NIL,FALSE,0] ], [COLS, [EQROWS, listGad1:=[LISTV,{a_list1},NIL,SETLIST_W,LIST_H-4,nameList1,0,NIL,0], txtGad1:=[TEXT,NIL,NIL,TRUE,1], [COLS, [SBUTTON,{b_snew},'New'], [SBUTTON,{b_sdel},'Del'] ] ], [EQROWS, listGad2:=[LISTV,{a_list2},NIL,KSLIST_W,LIST_H-2,nameList2,0,NIL,0], txtGad2:=[TEXT,NIL,NIL,TRUE,1] ], listGad3:=[LISTV,{a_list3},NIL,MODLIST_W,LIST_H,nameList3,0,NIL,0], [ROWS, [BEVELR, [EQROWS, ->[TEXT,NIL,NIL,FALSE,1],[SPACEV], [CHECK,{c_force},'Force',f_force,FALSE],[SPACEV], [CHECK,{c_localfast},'LocalFast',f_localfast,FALSE],[SPACEV], [CHECK,{c_quickboot},'QuickBoot',f_quickboot,FALSE],[SPACEV], [CHECK,{c_speedrom},'SpeedROM',f_speedrom,FALSE],[SPACEV], [CHECK,{c_hogwaitblit},'HogWaitBlit',f_hogwaitblit,FALSE] ->[SPACEV],[TEXT,NIL,NIL,FALSE,1] ] ], txtGvt:=[TEXT,NIL,NIL,FALSE,1], txtGv:=[TEXT,'BlizKick 1.10 (04/01/97)',NIL,TRUE,1] ] ], [BAR], [COLS, [BUTTON,{b_kick},'Kick'], [SPACEH], [BUTTON,{b_save},'Save settings'], [SPACEH], [BUTTON,{b_cancel},'Cancel'] ] ] ] ) ENDPROC PROC settxt(gh:PTR TO guihandle, gadget, str, newmax=0) HANDLE DEF gad:PTR TO gadget,slen,gslen,gadstr IF gad:=findgadget(gh, gadget) IF Not(gad.gadgettype AND GTYP_REQGADGET) IF gad.userdata=NIL THEN Raise(0) IF Long(gad.userdata)>65536 THEN Raise(0) -> normally 16? gadstr:=Long(gad.userdata+4) slen:=StrLen(str)+1 IF gad.gadgettype AND GTYP_GTYPEMASK THEN Raise(0) IF gadstr gslen:=Max(StrLen(gadstr)+1, newmax) -> needs to be fixed!! ELSE gadstr:=New(gslen:=Max(slen,newmax)) PutLong(gad.userdata+4,gadstr) ENDIF -> PrintF('gslen: \d newmax: \d\n',gslen,newmax) IF gslen gui update ENDIF ENDIF EXCEPT DO ReThrow() ENDPROC /* PROC settxt(gh:PTR TO guihandle, gadget, str) DEF gad:PTR TO gadget IF gad:=findgadget(gh, gadget) IF Not(gad.gadgettype AND GTYP_REQGADGET) Gt_SetGadgetAttrsA(gad,gh.wnd,NIL,[GTTX_TEXT,str,NIL]) ENDIF ENDIF ENDPROC PROC activategad(gadget,win) DEF gad:PTR TO gadget IF gad:=findgadget(gh, gadget) IF Not(gad.gadgettype AND GTYP_REQGADGET) IF Not(gad.flags AND GFLG_DISABLED) PrintF('!!\n') IF ActivateGadget(gad,win,NIL)=0 THEN PrintF('failed!\n') ENDIF ENDIF ENDIF ENDPROC PROC makeinvstr(gadget) DEF gad:PTR TO gadget,sinfo:PTR TO stringinfo,ext:PTR TO stringextend IF gad:=findgadget(gh, gadget) IF ((gad.gadgettype AND GTYP_GTYPEMASK)=GTYP_STRGADGET) IF (gad.activation AND GACT_STRINGEXTEND) OR ((gad.flags) AND GFLG_STRINGEXTEND) sinfo:=gad.specialinfo ext:=sinfo.extension ext.pens[0]:=0; ext.pens[1]:=0 ext.activepens[0]:=0; ext.activepens[1]:=0 ENDIF ENDIF ENDIF ENDPROC */ -> GUI definition PROC asksetname(oldname) DEF s IF (s:=String(SETSTR_MAX))=NIL THEN Raise(ERR_NEW) StrCopy(s,oldname,SETSTR_MAX) myeasygui(NIL,'Set name', [BEVEL, [ROWS, [TEXT,'Name for set',NIL,FALSE,12], [STR,1,NIL,s,SETSTR_MAX,8], [BAR], [COLS, [BUTTON,1,'Ok'], [SPACEH], [BUTTON,0,'Cancel'] ] ] ] ) ENDPROC s -> Change the displayed list PROC changeList(list, sel_Ptr, listGad, changefunc=0, flags=0) HANDLE DEF realgad -> Deselect ^sel_Ptr:=-1 -> Remove list (without display glitch) setlistvlabels(gh, listGad, -1) -> Change list contents IF changefunc THEN changefunc(list) EXCEPT DO -> Reattach list setlistvlabels(gh, listGad, list) IF (flags AND 1) -> Set list to pos 0 IF realgad:=findgadget(gh, listGad) Gt_SetGadgetAttrsA(realgad, gh.wnd, NIL, [GTLV_TOP, 0, NIL]) ENDIF ENDIF ReThrow() ENDPROC -> Add a new mynode to the list PROC addNode(list, name, type, pri, userptr=NIL) HANDLE DEF node=NIL:PTR TO mynode, s=NIL NEW node IF name s:=StrCopy(String(StrLen(name)), name) ENDIF node.name:=s node.type:=type node.pri:=pri node.userptr:=userptr AddTail(list, node) EXCEPT IF node THEN END node IF s THEN DisposeLink(s) Throw(ERR_NODE,type) ENDPROC ->#define SORTDEBUG PROC addNodeSort(list:PTR TO lh, name, type, pri, userptr=NIL) HANDLE DEF node=NIL:PTR TO mynode, s=NIL, worknode:PTR TO mynode NEW node IF name s:=StrCopy(String(StrLen(name)), name) ENDIF node.name:=s node.type:=type node.pri:=pri node.userptr:=userptr worknode:=list.tailpred -> Ptr to last node #ifdef SORTDEBUG IF worknode<>list PrintF('>> "\s" tailpred: \h \s[20]\n',s,list.tailpred,list.tailpred.name) ELSE PrintF('>> "\s" tailpred: none\n',s) ENDIF #endif WHILE worknode<>list #ifdef SORTDEBUG PrintF('\h: \s[20]\n',worknode.name,worknode.name) #endif EXIT Stricmp(s,worknode.name)>0 worknode:=worknode.pred ENDWHILE #ifdef SORTDEBUG IF worknode<>list PrintF('insert: \s[20] after \s[20]\n',s,worknode.name) ELSE PrintF('insert: as first\n') ENDIF #endif Insert(list, node, IF worknode=(list+4) THEN 0 ELSE worknode) ->Insert(list, node, worknode) ->IF worknode=(list+4) THEN 0 ELSE worknode) EXCEPT IF node THEN END node IF s THEN DisposeLink(s) Throw(ERR_NODE,type) ENDPROC -> Free a list of mynodes and empty it PROC freeNodes(list:PTR TO lh, userfreefunc=NIL) DEF worknode:PTR TO mynode, nextnode worknode:=list.head -> First node WHILE nextnode:=worknode.succ IF userfreefunc THEN userfreefunc(worknode.userptr) IF worknode.name THEN DisposeLink(worknode.name) END worknode worknode:=nextnode ENDWHILE newList(list) ENDPROC -> GUI actions: PROC a_list1(info, sel) DEF node:PTR TO ln, s, m, i=0 CurrentTime({s}, {m}) node:=nameList1.head -> First node WHILE node.succ AND (i Double click ENDIF secs:=s; micros:=m; oldSel1:=sel ENDPROC PROC a_list2(info, sel) DEF node:PTR TO ln, i=0 node:=nameList2.head -> First node WHILE node.succ AND (i First node WHILE node.succ AND (i change mode ->PrintF('Change mode.\n') node.name[0]:=IF node.name[0]=" " THEN "·" ELSE " " ->list, sel_Ptr, listGad changeList(nameList3,{sel},listGad3) oldSel3:=sel ENDPROC PROC b_kick(info) IS Raise(ERR_OK) PROC b_save(info) settxt(gh, txtGad1, 'Save! :)', SETSTR_MAX) ENDPROC PROC b_cancel(info) IS Raise(ERR_CANCEL) PROC c_force(info,bool) IS f_force:=bool PROC c_localfast(info,bool) IS f_localfast:=bool PROC c_quickboot(info,bool) IS f_quickboot:=bool PROC c_speedrom(info,bool) IS f_speedrom:=bool PROC c_hogwaitblit(info,bool) IS f_hogwaitblit:=bool PROC b_snew(info) PrintF('Newname: \s\n',asksetname('')) ENDPROC PROC b_sdel(info) PrintF('Set Del\n') ENDPROC PROC setgadgetattrs(gadget,taglist) DEF realgad IF realgad:=findgadget(gh, gadget) Gt_SetGadgetAttrsA(realgad, gh.wnd, NIL, taglist) ENDIF ENDPROC -> guiinit() locks Workbench screen! :( PROC myeasygui(initcodeptr,windowtitle,gui,info=NIL,screen=NIL,textattr=NIL) HANDLE DEF res=-1,lock=0, gh=NIL:PTR TO guihandle IF Not(screen) lock:=LockPubScreen(NIL) screen:=lock ENDIF IF (gh:=guiinit(windowtitle,gui,info,screen,textattr)) IF lock THEN UnlockPubScreen(NIL,lock) IF initcodeptr THEN initcodeptr(gh) WHILE res<0 Wait(gh.sig) res:=guimessage(gh) ENDWHILE ELSE IF lock THEN UnlockPubScreen(NIL,lock) ENDIF EXCEPT DO cleangui(gh) ReThrow() ENDPROC res /* [TEXT,'BlizKick version',NIL,FALSE,1], [TEXT,'1.10 (xx.xx.97)',NIL,TRUE,1] */