7m…ôcUEV\cd»«REM **** Version history ****REM v1.0 08 September 2000 Gary Ewer (gary.ewer@earthling.net)REM - Initial versionREMREM v1.1 10 January 2002 Marcell Egyed (emarcell@yahoo.com)REM - added version number to ini fileREM - introducing constants for version infoREM - added Caps Lock alert (parameters saved in ini)REM - added switch on suspension for logging in (parameters saved in ini)REMREM v1.2 15 January 2002 Marcell Egyed (emarcell@yahoo.com)REM - changed default parameter valuesREM - added Hungarian character setREM - setting high priority for the program as found atREM home.clara.net/tixy/psion/opl-tips.htmlREMREM **** version history ****REM **** TODO ****REM - Update help file to v1.2REM - Change preferences dialog to accomodate more parametersREM - include CapsView (Pascal Nicolas) functionality whenREM OPX is availableREM **** TODO ****INCLUDE "System.oxh"INCLUDE "Date.oxh"INCLUDE "const.oph"INCLUDE "nListBox.oxh"CONST KUidTwinkey&=268471043CONST VerMaj%=1CONST VerMin%=2CONST VerDate$="15 January 2002"APP Twinkey,KUidTwinkey& CAPTION "Twinkey",1 ICON "Twinkeyicon.mbm"ENDAPROC Twinkey: GLOBAL handle&(255),ev&(16),inc%,id&,picID&(1),back%,HF& GLOBAL modified%,time&,beeptime&,beepfreq&,swondelay&,x% GLOBAL capsbeeptime&,capsbeepfreq&,ind_caps_num& LOCAL previous&,ThreadID&,prevThreadID&,caps_count% LOCAL last&,Ago&,y%,sent%,cap$(3)  REM Give program a high priority SetcomputeMode:(KComputeModeOff&)  REM Prevent program from changing to low priority REM when it gets to the background SetcomputeMode:(KComputeModeDisabled&)  modified%=0 ESCAPE OFF BUSY "Initialising..." ONERR error:: REM Setting flag to recive 'switch on' event SETFLAGS KSendSwitchOnMessage&rem MeID&=GetThreadIDFromAppUID&:(KUidTwinkey&,previous&) OpenINIFile$:(KUidTwinkey&) gSETWIN (gWIDTH-300)/2,(gHEIGHT-159)/2,300,159 top:: IF EXIST(LEFT$(CMD$(1),2)+"\System\apps\Twinkey\Twinkey.mbm") PicID&(1)=gLOADBIT(LEFT$(CMD$(1),2)+"\System\apps\Twinkey\Twinkey.mbm",0,0) ELSE PicID&(1)=0 ENDIF gUSE 1 gAT 300-24,0 IF PicID&(1)=0 gBUTTON "X",2,24,24,0 ELSE gBUTTON "",2,24,24,0,PicID&(1),PicID&(1),$20 ENDIF gFONT KFontArialBold13& gAT 0,0 gBUTTON "Twinkey",2,300-24,24,0 rem ,0,0,3 gFONT KFontArialBold13& gAT 0,159-(45*3) gBUTTON "Key Setup",2,100,45,0 gAT 0,159-(45*2) gBUTTON "Preferences",2,100,45,0 gAT 0,159-45 gBUTTON "Send to"+CHR$(10)+"Background",2,100,45,0 gAT 100,24 gXBORDER 2,$42,200,159-24-24 gFONT KFontArialNormal13& gAT 110,45 gPRINT "Idea By Thomas Dunkerley" gAT 110,65 gPRINT "Programming By Gary Ewer" gAT 127,85 gPRINT "(gary.ewer@earthling.net)" gAT 110,105 gPRINT "Web: http://come.to/prosoft" gAT 110,125 gFONT KFontArialNormal11& gPRINT "Version "+gen$(VerMaj%,2)+"."+gen$(VerMin%,2)+" ("+VerDate$+")"rem gFONT KFontArialNormal11& gAT 100,159-24 gBUTTON "About",2,100,24,0 gAT 200,159-24 gBUTTON "Help",2,100,24,0 gFONT KFontArialBold13& start:: previous&=0 prevThreadID&=0 caps_count%=0 start_cap:rem inc%=1rem x%=32rem DOrem handle&(inc%)=CAPTUREKEY&:(x%,0,0)rem inc%=inc%+1rem x%=x%+1rem UNTIL x%>126 x%=0 Ago&=DTNEWDATETIME&:(2000,5,17,22,10,1,1) last&=Ago& SETFOREGROUND: BUSY OFF GIPRINT "Ready!" while 1 getevent32 ev&() sent%=0 inc%=1 if (ev&(1) AND &400)=0 AND ev&(4)<>4 AND back%=1 if ev&(4) AND 16 previous&=0 ThreadID&=GetThreadIDFromOpenDoc&:("*",previous&) if ThreadID& <> prevThreadID& prevThreadID& = ThreadID& caps_count% = 0 endif if caps_count% < ind_caps_num& BEEP -1*capsbeeptime&*32/1000,512/(FLT(capsbeepfreq&)/1000)-1 caps_count% = caps_count%+1 endif elseif caps_count% caps_count% = 0 endif  cap$=cap$+CHR$(ev&(1)) cap$=RIGHT$(cap$,2) DO if cap$=ArrayExtractColumnData$:(id&,inc%,1)+ArrayExtractColumnData$:(id&,inc%,2) previous&=0 ThreadID&=GetThreadIDFromOpenDoc&:("*",previous&)rem print DTMicrosDiff&:(last&,DTNOW&:) IF DTMINUTESDIFF&:(last&,DTNOW&:)<30 IF DTMicrosDiff&:(last&,DTNOW&:)0 BEEP -1*beeptime&*32/1000,512/(FLT(beepfreq&)/1000)-1 endif last&=Ago& cap$="" ELSE SendKeyEventToApp&:(ThreadID&,&0,ev&(1),&0,&0,&0) last&=DTNOW&: ENDIF ELSE SendKeyEventToApp&:(ThreadID&,&0,ev&(1),&0,&0,&0) last&=DTNOW&: ENDIF sent%=1rem elserem last&=Ago& endif inc%=inc%+1 UNTIL inc%>ArrayItemCount%:(id&) if sent%=0 previous&=0 ThreadID&=GetThreadIDFromOpenDoc&:("*",previous&) SendKeyEventToApp&:(ThreadID&,&0,ev&(1),&0,&0,&0) sent%=1 inc%=1 last&=DTNOW&: endif elseif (ev&(1) AND &400)=0 AND ev&(4)=4 ev&(1)=ev&(1)+$40 if ev&(1)=%E exit: elseif ev&(1)=%H gFONT KFontArialNormal11& gAT 200,159-24 gBUTTON "Help",2,100,24,1 help%:(1) gAT 200,159-24 gBUTTON "Help",2,100,24,0 gFONT KFontArialBold13& elseif ev&(1)=%A about: elseif ev&(1)=%B Setbackground: elseif ev&(1)=%S setup:(1) GOTO start:: elseif ev&(1)=%P EntryT%: endif elseif ev&(1)=&408 if ev&(6)<100 AND ev&(7)>159-(45*3) AND ev&(7)<159-(45*2) setup:(1) GOTO start:: elseif ev&(6)<100 AND ev&(7)>159-(45*2) AND ev&(7)<159-(45*1) EntryT%: elseif ev&(6)<100 AND ev&(7)>159-(45*1) Setbackground: elseif ev&(7)>159-24 AND ev&(6)<200 about: elseif ev&(7)>159-24 AND ev&(6)>200 gFONT KFontArialNormal11& gAT 200,159-24 gBUTTON "Help",2,100,24,1 help%:(1) gAT 200,159-24 gBUTTON "Help",2,100,24,0 gFONT KFontArialBold13& elseif ev&(6)>300-24 AND ev&(7)<24 exit: elseif ev&(6)<300-24 AND ev&(7)<24 gAT 0,0 gBUTTON "Twinkey",2,300-24,24,1 x%=ev&(6) y%=ev&(7) DO GETEVENT32 ev&() if ev&(1)=&408 AND ev&(4)=6 gSETWIN ev&(8)-x%,ev&(9)-y% else BREAK ENDIF UNTIL ev&(4)=1 gAT 0,0 gBUTTON "Twinkey",2,300-24,24,0 endif elseif ev&(1)=&404 IF LEFT$(GETCMD$,1)="X" exit: ENDIF elseif ev&(1)=&401 back%=0 elseif ev&(1)=&403 stop_cap: if 0<>swondelay& BUSY "Twinkey suspended" PAUSE swondelay& BUSY OFF else SETFOREGROUND: ALERT("Twinkey suspended") SETBACKGROUND: endif REM On switch on initialize the capslock indicator caps_count% = 0 start_cap:  elseif ev&(1)=&402 back%=1 endif endwh  error:: onerr off error: ONERR error:: goto top::ENDPPROC start_cap: inc%=1 x%=32 DO handle&(inc%)=CAPTUREKEY&:(x%,0,0) inc%=inc%+1 x%=x%+1 UNTIL x%>126 x%=0ENDPPROC stop_cap: inc%=1 DO CANCELCAPTUREKEY:(handle&(inc%)) inc%=inc%+1 UNTIL inc%>95ENDPPROC setup:(a%) if a%=1 gAT 0,159-(45*3) gBUTTON "Key Setup",2,100,45,1 endif stop_cap:rem inc%=1rem DOrem CANCELCAPTUREKEY:(handle&(inc%))rem inc%=inc%+1rem UNTIL inc%>95 Main: if a%=1 gAT 0,159-(45*3) gBUTTON "Key Setup",2,100,45,0 endifENDPPROC exit: gAT 300-24,0 IF PicID&(1)=0 gBUTTON "X",2,24,24,0 ELSE gBUTTON "",2,24,24,0,PicID&(1),PicID&(1),$20 ENDIF stop_cap:rem inc%=1rem DOrem CANCELCAPTUREKEY:(handle&(inc%))rem inc%=inc%+1rem UNTIL inc%>95 IF modified%=1 BUSY "Saving..." Save:(KUidTwinkey&) BUSY OFF GIPRINT "Saved" ENDIF if id& ArrayFree:(id&) endif IF HF&<>0 ONERR Closed_by_user:: EndTask&:(HF&,0) Closed_by_user:: ONERR OFF ENDIF STOPENDPPROC about: stop_cap: gFONT KFontArialNormal11& gAT 100,159-24 gBUTTON "About",2,100,24,1 dINIT "About Twinkey",1 dTEXT "","This software is Freeware." dTEXT "","If you find it useful however, please send me a" dTEXT "","postcard from your local area!" dTEXT "","My address is:" dTEXT "","Gary Ewer, 7 Sutton Park, Sutton,",2 dTEXT "","Ely, Cambs, CB6 2RP, ENGLAND",2 dTEXT "","I look forward to receiving your card ;-)",0 dBUTTONS "OK",13 LOCK ON DIALOG LOCK OFF gAT 100,159-24 gBUTTON "About",2,100,24,0 gFONT KFontArialBold13& start_cap:endpPROC error: stop_cap:rem inc%=1rem DOrem CANCELCAPTUREKEY:(handle&(inc%))rem inc%=inc%+1rem UNTIL inc%>93 BUSY OFF SETFOREGROUND: dINIT "",2 dTEXT "","Sorry. it seems an unexpected error has occured" dTEXT "","Please E-mail me at : gary.ewer@earthling.net" dTEXT "","and tell me the EXACT circumstances and the key" dTEXT "","presses that led to this error. I will also need" dTEXT "","the following additional information :" dTEXT "","",$800 dTEXT "","Twinkey Version "+gen$(VerMaj%,2)+"."+gen$(VerMin%,2) dTEXT "","There has been an "+ERRX$ dTEXT "","The error was : "+ERR$(ERR) dBUTTONS "Continue",13 OR $300,"Quit",%e LOCK ON IF DIALOG=%e STOP ENDIF LOCK OFFENDPPROC help%:(unused%) LOCAL drv$(3) drv$=LEFT$(CMD$(1),2) IF HF&<>0 ONERR closed:: SetForegroundByThread&:(HF&,0) ONERR OFF ELSE closed:: ONERR OFF IF NOT (EXIST(drv$+"\System\Apps\Twinkey\Twinkey.hlp")) GIPRINT "Help File Not Found" ELSE BUSY "Launching Help" HF&=RUNAPP&:("Data",drv$+"\System\Apps\Twinkey\Twinkey.hlp","",0) BUSY OFF ENDIF ENDIFENDPPROC Save:(AppUid&) local handle%,ret%,spare$(1),spare% local VersionMajor%,VersionMinor% VersionMajor% = VerMaj% VersionMinor% = VerMin%  handle%=CreateIniFile%:(AppUid&) if handle%<0 return handle% endif ret%=iowrite(handle%,addr(VersionMajor%),2) ret%=iowrite(handle%,addr(VersionMinor%),2) ret%=iowrite(handle%,addr(time&),4) ret%=iowrite(handle%,addr(beeptime&),4) ret%=iowrite(handle%,addr(beepfreq&),4) ret%=iowrite(handle%,addr(capsbeeptime&),4) ret%=iowrite(handle%,addr(capsbeepfreq&),4) ret%=iowrite(handle%,addr(ind_caps_num&),4) ret%=iowrite(handle%,addr(swondelay&),4) spare%=ArrayItemCount%:(id&) ret%=iowrite(handle%,addr(spare%),1) inc%=1 DO spare$=ArrayExtractColumnData$:(id&,inc%,1) ret%=iowrite(handle%,addr(spare$),2) spare$=ArrayExtractColumnData$:(id&,inc%,2) ret%=iowrite(handle%,addr(spare$),2) spare$=ArrayExtractColumnData$:(id&,inc%,3) ret%=iowrite(handle%,addr(spare$),2) inc%=inc%+1 UNTIL inc%>spare% ioclose(handle%) return ret%endpPROC CreateIniFile%:(AppUid&) local IniFile$(255),IniExt$(4),offset%(6) local handle%,ret%,uidType$(16) IniExt$=".ini" IniFile$=parse$(IniExt$,Cmd$(1),offset%()) if exist(IniFile$) delete(IniFile$) endif ret%=ioopen(handle%,IniFile$,$0302) if ret% :return ret% :endif uidType$=CheckUid$:(0,0,AppUid&) ret%=iowrite(handle%,addr(uidType$)+1,16) if ret% ioclose(handle%) return ret% endif return handle%endpPROC OpenINIFile$:(AppUid&) local handle%,ret%,spare$(3,1),spare% local IniFile$(255),IniExt$(4),offset%(6),uidType$(16) local majorver%,minorver% IniExt$=".ini" IniFile$=parse$(IniExt$,Cmd$(1),offset%()) id& = ArrayCreate&: ret%=ioopen(handle%,IniFile$,$0300) IF ret% openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(uidType$)+1,16) IF ret%<>16 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(majorver%),2) IF ret%<>2 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(minorver%),2) IF ret%<>2 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(time&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(beeptime&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(beepfreq&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF REM Read is differentiated based on version numbers IF 1 <= majorver% AND 1 <= minorver% ret%=ioread(handle%,addr(capsbeeptime&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(capsbeepfreq&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(ind_caps_num&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF  ret%=ioread(handle%,addr(swondelay&),4) IF ret%<>4 openerror:(handle%) RETURN ENDIF ENDIF  ret%=ioread(handle%,addr(spare%),1) IF ret%<>1 openerror:(handle%) RETURN ENDIF inc%=1 DO ret%=ioread(handle%,addr(spare$(1)),2) IF ret%<>2 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(spare$(2)),2) IF ret%<>2 openerror:(handle%) RETURN ENDIF ret%=ioread(handle%,addr(spare$(3)),2) IF ret%<>2 openerror:(handle%) RETURN ENDIF ArrayAddItem:(id&,spare$(1)+chr$(9)+spare$(2)+chr$(9)+spare$(3)) inc%=inc%+1 UNTIL inc%>spare% ioclose(handle%)endpPROC openerror:(handle%) LOCAL c% BUSY OFF top:: dINIT "Please Select a Key Setup" dCHOICE c%,"Setup","Scandinavian,German,French,Hungarian,I Will Choose" dBUTTONS "OK",13,"Help",%h LOCK ON IF DIALOG=%h help%:(1) GOTO top:: ENDIF LOCK OFF time&=500000 beeptime&=100 beepfreq&=1000 capsbeeptime&=60 capsbeepfreq&=1200 ind_caps_num&=8 swondelay&=10*20 middle:: IF c%=1 ArrayAddItem:(id&,"a"+chr$(9)+"o"+chr$(9)+"å") ArrayAddItem:(id&,"A"+chr$(9)+"O"+chr$(9)+"Å") ArrayAddItem:(id&,"e"+chr$(9)+"e"+chr$(9)+"æ") ArrayAddItem:(id&,"E"+chr$(9)+"E"+chr$(9)+"Æ") ArrayAddItem:(id&,"o"+chr$(9)+"/"+chr$(9)+"ø") ArrayAddItem:(id&,"O"+chr$(9)+"/"+chr$(9)+"Ø") ELSEIF c%=2 ArrayAddItem:(id&,"s"+chr$(9)+"s"+chr$(9)+"ß") ArrayAddItem:(id&,"a"+chr$(9)+""""+chr$(9)+"ä") ArrayAddItem:(id&,"A"+chr$(9)+""""+chr$(9)+"Ä") ArrayAddItem:(id&,"u"+chr$(9)+""""+chr$(9)+"ü") ArrayAddItem:(id&,"U"+chr$(9)+""""+chr$(9)+"Ü") ArrayAddItem:(id&,"o"+chr$(9)+""""+chr$(9)+"ö") ArrayAddItem:(id&,"O"+chr$(9)+""""+chr$(9)+"Ö") ELSEIF c%=3 ArrayAddItem:(id&,"a"+chr$(9)+"\"+chr$(9)+"à") ArrayAddItem:(id&,"A"+chr$(9)+"\"+chr$(9)+"À") ArrayAddItem:(id&,"s"+chr$(9)+"/"+chr$(9)+"á") ArrayAddItem:(id&,"S"+chr$(9)+"/"+chr$(9)+"Á") ArrayAddItem:(id&,"e"+chr$(9)+"/"+chr$(9)+"é") ArrayAddItem:(id&,"E"+chr$(9)+"/"+chr$(9)+"É") ArrayAddItem:(id&,"r"+chr$(9)+"\"+chr$(9)+"è") ArrayAddItem:(id&,"R"+chr$(9)+"\"+chr$(9)+"È") ArrayAddItem:(id&,"d"+chr$(9)+"^"+chr$(9)+"â") ArrayAddItem:(id&,"D"+chr$(9)+"^"+chr$(9)+"Â") ELSEIF c%=4 ArrayAddItem:(id&,"a"+chr$(9)+"a"+chr$(9)+"á") ArrayAddItem:(id&,"A"+chr$(9)+"A"+chr$(9)+"Á") ArrayAddItem:(id&,"u"+chr$(9)+"u"+chr$(9)+"ú") ArrayAddItem:(id&,"U"+chr$(9)+"U"+chr$(9)+"Ú") ArrayAddItem:(id&,"o"+chr$(9)+"o"+chr$(9)+"ó") ArrayAddItem:(id&,"O"+chr$(9)+"O"+chr$(9)+"Ó") ArrayAddItem:(id&,"e"+chr$(9)+"e"+chr$(9)+"é") ArrayAddItem:(id&,"E"+chr$(9)+"E"+chr$(9)+"É") ArrayAddItem:(id&,"i"+chr$(9)+"i"+chr$(9)+"Í") ArrayAddItem:(id&,"I"+chr$(9)+"I"+chr$(9)+"Í") ArrayAddItem:(id&,"u"+chr$(9)+"i"+chr$(9)+"ü") ArrayAddItem:(id&,"U"+chr$(9)+"I"+chr$(9)+"Ü") ArrayAddItem:(id&,"u"+chr$(9)+"7"+chr$(9)+"û") ArrayAddItem:(id&,"U"+chr$(9)+"/"+chr$(9)+"Û") ArrayAddItem:(id&,"o"+chr$(9)+"p"+chr$(9)+"ö") ArrayAddItem:(id&,"O"+chr$(9)+"P"+chr$(9)+"Ö") ArrayAddItem:(id&,"o"+chr$(9)+"9"+chr$(9)+"ô") ArrayAddItem:(id&,"O"+chr$(9)+")"+chr$(9)+"Ô") ArrayAddItem:(id&,"a"+chr$(9)+"w"+chr$(9)+"ä") ArrayAddItem:(id&,"A"+chr$(9)+"W"+chr$(9)+"Ä") ELSEIF c%=5rem ArrayAddItem:(id&,"w"+chr$(9)+"w") setup:(2) ELSE bottom:: dINIT "You Must Select a Key Setup" dCHOICE c%,"Setup","Scandinavian,German,French,I Will Choose" dBUTTONS "OK",13,"Help",%h LOCK ON IF DIALOG=%h help%:(1) GOTO bottom:: ENDIF LOCK OFF goto middle:: ENDIF ioclose(handle%) modified%=1ENDPPROC Main: LOCAL i%, count%, selected& LOCAL returned%, flags% , off%(6) top:: LBoxInit:("Setup", 1, 4) LBoxAddButton:("Entry"+CHR$(133),%E,"EntryCB","",0,0,0) LBoxAddButton:("Help",%H,"Help","",0,0,0)rem LBoxAddButton:("Add",%A OR $100,"EntryA","",0,0,0)rem LBoxAddButton:("Edit",%E OR $100,"EntryE","",0,0,0)rem LBoxAddButton:("Delete",%D OR $100,"EntryD","",0,0,0)rem LBoxAddButton:("Time Delay",%T OR $100,"EntryT","",0,0,0) LBoxAddButton:("Done",13 OR $100 ,"","",0,0,0) LBoxSetColumnFontAndWidth:(1, KFontArialNormal15&,1) LBoxSetColumnFontAndWidth:(2, KFontArialNormal15&,1) LBoxSetColumnFontAndWidth:(3, KFontArialNormal15&,1) LBoxSetSize:(120,5)rem LBoxSetPosition:(gwidth/2-75,0)  returned%=LBoxDisplay%:(id&, selected&, 1, "") rem "ConstructionCB") if ArrayItemCount%:(id&)<1 dINIT "Error" dTEXT "","You must have at least one key to capture",2 dBUTTONS "OK",13,"Help",%h LOCK ON IF DIALOG=%h help%:(1) ENDIF LOCK OFF goto top:: endifENDPPROC LBoxCallBackManager%:(item%, procedure$) ONERR CallbackError:: return @%(procedure$):(item%) CallbackError:: ONERR OFF ALERT("Callback "+ERRX$,ERR$(ERR)+" ("+GEN$(ERR,4)+")") ENDPPROC EntryCB%:(index%) LOCAL total%, ret%, NoOptions% LOCAL x%, y%, corner% LOCAL oldwin%  rem Get entry button positioning details LBoxDynamicButtonCorner:(%E, KNLBoxTopLeft%, x%, y%)  rem confirm which side of the button to rem display the pop-up  oldwin%=gidentity guse 1 if x% >=gwidth/2 corner%=KNLBoxTopRight% x%=x%-5 else LBoxDynamicButtonCorner:(%E, KNLBoxTopRight%, x%, y%) corner%=KNLBoxTopLeft% x%=x%+5 endif guse oldwin%  total%=LBoxDynamicItemCount%: REM check if item array is empty if total%=0 NoOptions%=1 endif   ret%=mPOPUP(x%,y%,corner%,"Add"+CHR$(133),%a,"Edit"+CHR$(133),%e OR ($1000 * NoOptions%),"Delete"+CHR$(133),%d OR ($1000 * NoOptions%)) if ret%<>0 @("Entry"+CHR$(ret%)):(index%) endif return KNLBoxDialogCannotExit%ENDPPROC EntryA:(index%) LOCAL entry$(255) LOCAL a$(1),b$(1),c$(1) WHILE 1 top:: dINIT "Add entry" dEDIT a$,"Change",1 dEDIT c$,"Followed By",1 dEDIT b$,"To",1 dBUTTONS "Cancel",-(27 OR $100),"OK",13 OR $100 IF DIALOG IF LEN(a$)<>1 OR LEN(b$)<>1 OR LEN(c$)<>1 dINIT "Error" dTEXT "","All Fields must contain one letter",2 dBUTTONS "OK",13 DIALOG GOTO top:: ENDIF IF HasTab:(a$,b$,c$) GIPRINT ERR$(-78),KBusyTopRight% CONTINUE ENDIF entry$=a$+CHR$(9)+c$+CHR$(9)+b$ LBoxDynamicAddItem:(entry$) LBoxDynamicSetCurrentItem:(LBoxDynamicItemCount%:) BREAK ELSE BREAK ENDIF ENDWH modified%=1ENDPPROC EntryE:(index%) LOCAL entry$(255) LOCAL a$(1),b$(1),c$(1) LOCAL bitindex&, d%, selection% a$=LBoxDynamicExtractColumnData$:(index%,1) b$=LBoxDynamicExtractColumnData$:(index%,2) c$=LBoxDynamicExtractColumnData$:(index%,3) WHILE 1 top:: dINIT "Edit entry " dEDIT a$,"Change",1 dEDIT b$,"Followed By",1 dEDIT c$,"To",1 dBUTTONS "Cancel",-(27 OR $100),"OK",13 OR $100 IF DIALOG IF LEN(a$)<>1 OR LEN(b$)<>1 OR LEN(c$)<>1 dINIT "Error" dTEXT "","All Fields must contain one letter",2 dBUTTONS "OK",13 DIALOG GOTO top:: ENDIF IF HasTab:(a$,b$,c$) GIPRINT ERR$(-78),KBusyTopRight% CONTINUE ENDIF entry$=a$+CHR$(9)+b$+CHR$(9)+c$ LBoxDynamicReplaceItem:(index%, entry$)  LBoxDynamicSetCurrentItem:(index%)  BREAK ELSE BREAK ENDIF ENDWH modified%=1ENDPPROC EntryD:(index%) LOCAL total%, newpos%, selection%, selectionCount%rem IF LBoxDynamicItemCount%:<2rem dINIT "Sorry - You must have at least one entry"rem dTEXT "","Deletion Cancelled",2rem dbuttons "OK",13rem DIALOGrem RETURNrem ENDIF dINIT "Delete item "+NUM$(index%,3)+"?" dbuttons "No",-(%N OR $100 OR $200), "Yes",%Y OR $100 OR $200 IF DIALOG LBoxDynamicDeleteItem:(index%) total%=LBoxDynamicItemCount%: REM get the item array total newpos%=MIN(index%,total%) IF newpos%<>0 REM item array is not empty LBoxDynamicSetCurrentItem:(newpos%) ENDIF ENDIF modified%=1ENDPPROC EntryT%: LOCÁL temp% stop_cap: gAT 0,159-(45*2) gBUTTON "Preferences",2,100,45,1 time&=time&/1000 swondelay&=swondelay&/20 top:: dINIT "Twinkey Preferences" dLONG time&,"Repeat interval (milli-seconds)",1,10000 dLONG beeptime&,"Twinkey beep time (milli-seconds, 0 to turn off)",0,1000 dLONG beepfreq&,"Twinkey beep freqency (Hz)",500,4000 dLONG swondelay&,"Switch on delay (seconds)",0,30 dBUTTONS "OK",13,"Help",%h+512,"Cancel",27 LOCK ON temp%=DIALOG IF temp%=%h help%:(1) goto top:: endif LOCK OFF töp2:: IF temp%<>0 dINIT "Caps Preferences" dLONG capsbeeptime&,"Caps beep time (milli-seconds)",0,1000 dLONG capsbeepfreq&,"Caps beep freqency (Hz)",500,4000 dLONG ind_caps_num&,"Number of caps-key alerts (0 to turn off)",0,200 dBUTTONS "OK",13,"Help",%h+512,"Cancel",27 LOCK ON IF DIALOG=%h help%:(1) goto top2:: endif LOCK OFF ENDIF start_cap: time&=time&*1000 swondelay&=swondelay&*20 gAT 0,159-(45*2) gBUTTON "Preferences",2,100,45,0 modified%=1ENDPPROC HasTab:(a$,b$,c$) REM check there is no tab character in the entry IF LOC(a$,CHR$(9)) RETURN ktrue%  ELSEIF LOC(b$,CHR$(9)) RETURN ktrue%  ELSEIF LOC(c$,CHR$(9)) RETURN ktrue%  ENDIFENDPÐР   \cŸUefd\c§Uefdý‚.ÆA…*TextEd.app…¯U‰6V