// O W I N D O W get "BRAVO1.DF"; get "CHAR.DF"; get "SELECT.DF"; get "DISPLAY.DF"; get "DOC.DF"; get "VM.DF"; get "rn1.df" get "com.df" get "format.df" // Incoming procedures external [ HorizScroll deactivateomseq augmentomseq ValidateSel deletea SetRegionSys SplitWw stcopy; updateunderline updatedisplay; bravochar; endofkeystream; puts; tsmakegood; waitbug; setbug; formaty; min; ult; invalidatesel; docalloc; createdoce createdocm; selectwholeww; gets; errhlta; resetts; innum; outnum; abs; nobug; underline; invalidatewindow; freedl; stappend; ckdoc; remakevmtb; hpfree; confirm; deallocfn; updatewindow; max; initCnDcb; chaseCnDcb; incCnDcb; replaceCnDcb; BeamLoc; ReadClock; move; array; mpDlDld splitWindow insertWindow deleteWindow updateDlMaps ] // Incoming statics external [ vybot comno; tsread; chcom; fnts; sbstate; rgcpfirst; vdl; vww; selmain; tscorrect; macww; rgyfirst; pbmfirstfree; rgpctb; rgmaccp; rgcfn; mpfnof; macbp; rgvpa; rglastused; mpWwWwd; vYdofDl; vRtcVertInt; vfVertInt; SDld; dcpendofdoc vxleftmargstd vytop vymid ] // Outgoing procedures external [ owindowcommands; pointww; ydToDcbPrev FWwSys MoveWwSys; ] // Outgoing statics external [ vfRemove; ] // Outgoing statics static [ vfRemove; ] manifest [ mergelower = 13; ] // W I N D O W C O M M A N D S // let owindowcommands(cf) = valof [ let sel = cf>>CF.sel let dydReplace,fMergeLower,wwFirst,wwLast = 0,false,nil,nil let ab,tab = nil,nil let cwwGroup,wwNextGroup,wwEndofGroup = nil,nil,nil let wgd = vec lwgd let fgroup = nil let dYd = nil let wwdPrev,twwd,wwgroup,wwNext = nil,nil,nil,nil let wwd = nil let dcbFirst = nil; let dcbMac = nil; let dcbPrev = nil let cnDcbOld = vec lCnDcb; let cnDcbNew = vec lCnDcb let dcbWw = nil; let dcbWw1 = nil; let yloc = nil; let closest = nil; let tdoc = nil;let docWw = nil let wwclosest = nil; let tchar = nil; let ppctb = nil; let tww = nil; let tcp = nil; let wwselm = nil; let bugval = 7 let tDlist = array(maxcdcb*dcbl+1) if tDlist<<odd then tDlist = tDlist+1 let rgwcom = table [ 0;0;0;$m;0;$n;$s;0;0;0;0;$d;0;$d;$c;0 ] test tsread ifnot [ while (bugval eq 7) & endofkeystream() do bugval = rv(bug) & 7 test bugval eq 7 ifso tchar = bravochar(); ifnot [ if chcom eq $k then bugval = bugval+8; tchar = rgwcom ! bugval; puts(fnts,tchar); tsmakegood(); ] ] ifso tchar = bravochar(); if tchar eq ctrlc then [ ab<<AB.crid = 1 //Command terminated ab<<AB.nrid = 1 resultis ab ] if tchar ge $A & tchar le $Z then tchar = tchar+#40 let wwdNext = nil if chcom eq $k & bugval eq mergelower then fMergeLower = true underline(uloff,sel) updateunderline() switchon tchar into [ case $s: SetRegionSys(risysstate,103) //Split window; updatedisplay( ); if macww+1 gr maxww then [ ab<<AB.crid = 2 //Out of windows ab<<AB.nrid = 10 resultis ab ] tab = pointww($s,lv yloc) if tab ne abnil resultis tab tcp = rgcpfirst ! vdl; tww = vww; wwd = mpWwWwd!tww wwNext = tww + 1 yloc = min(yloc,(rgyfirst!wwNext-dYdWwMin)) wgd>>WGDTABLE.cww = 1 // wgd = FillInWgd(wgd,1,yloc,(rgyfirst!wwNext-yloc), // wwd>>WWD.doc,tcp,0,wwd>>WWD.fHd,wwd>>WWD.mag, // wwd>>WWD.xdUd) wgd = FillInWgd(wgd,1,yloc,(rgyfirst!wwNext-yloc), wwd>>WWD.doc,tcp,0,wwd>>WWD.fHd,100, wwd>>WWD.xdUd) SplitWw(yloc,wgd,wwNext+1) wwd = mpWwWwd!vww wwdPrev = mpWwWwd!(vww-1) wwd>>WWD.wwgroup = wwdPrev>>WWD.wwgroup if (sel>>SEL.ww eq tww) & not ult(sel>>SEL.cpfirst,tcp) then sel>>SEL.ww = tww+1; invalidatesel(sel); goto lmove1; case $n: SetRegionSys(risysstate,106) //New window; updatedisplay( ); if macww+2 gr maxww then [ ab<<AB.crid = 2 //Out of windows ab<<AB.nrid = 10 resultis ab ] tab = pointww($n,lv yloc) if tab ne abnil then resultis tab // system window tdoc = docalloc(); if (tdoc eq -1) then [ ab<<AB.crid = 2 //Out of documents - ab<<AB.nrid = 2 resultis ab ]; tww = vww if FWwSys(tww) then [ yloc = rgyfirst!tww-1 formaty(yloc) tww = vww ] cwwGroup = CwwInWgd(tww) wwEndofGroup = (mpWwWwd!tww)>>WWD.wwgroup+cwwGroup-1 if wwEndofGroup gr tww then deleteWindow(tww+1,wwEndofGroup-tww) yloc = min(yloc,(rgyfirst!(tww+1)-dydsysww-dYdWwMin)) createdocm(tdoc) wgd>>WGDTABLE.cww = 2 wgd = FillInWgd(wgd,1,yloc,dydsysww,tdoc,0,1,false,100,vxleftmargstd rshift 5) // document window tdoc = docalloc() if (tdoc eq -1) then [ ab<<AB.crid = 2 //Out of documents - ab<<AB.nrid = 2 resultis ab ]; createdocm(tdoc); wwNext = tww + 1 wgd = FillInWgd(wgd,2,yloc+dydsysww,(rgyfirst!wwNext-yloc- dydsysww),tdoc,0,0,false,100,vxleftmargstd rshift 5) SplitWw(yloc,wgd,wwNext+2); (mpWwWwd!(vww-1))>>WWD.wwgroup = vww - 1 (mpWwWwd!vww)>>WWD.wwgroup = vww - 1 (mpWwWwd!vww)>>WWD.fDirty = false; selectwholeww(sel,vww); goto lmove1; case $m: lmove: SetRegionSys(risysstate,112) //Move boundary; updatedisplay( ); unless waitbug() then [ ab<<AB.crid = 1 //Command terminated ab>>AB.nrid = 1 resultis ab ] setbug(sreset); lmove1: closest = 10000; test tsread ifso [ let tchar = gets(fnts); test tchar eq chat ifso [ tchar = gets(fnts); unless tchar eq $E do errhlta(73); resetts(); tsread = false; tscorrect = false; ] ifnot [ rv(ybugloc) = innum(fnts,8); ] ] ifnot [ puts(fnts,$y); outnum(fnts,rv ybugloc,8); puts(fnts,$,); tsmakegood(); ] yloc = rv ybugloc; for ww = 1 to macww do [ dYd = rgyfirst ! ww-yloc if abs(dYd) ls closest then [ closest = abs(dYd); wwclosest = ww; ]; ] if wwclosest eq macww resultis abnil wwFirst = wwclosest; wwLast = wwclosest if FWwSys(wwclosest-1) then wwFirst = max(1,wwclosest-1) if FWwSys(wwclosest) then wwLast = min(macww,wwclosest+1) [ test tsread ifso [ let tchar = gets(fnts); test tchar eq chat ifso [ tchar = gets(fnts); unless tchar eq $E do errhlta(73); resetts(); tsread = false; tscorrect = false; ] ifnot [ rv(ybugloc) = innum(fnts,8); ] ] ifnot if nobug( ) then [ puts(fnts,$y); outnum(fnts,rv ybugloc,8); puts(fnts,$,); tsmakegood(); break; ] yloc = (rv ybugloc); MoveWws(wwFirst,wwLast,yloc,tDlist) if tsread then break; ] repeat until vfVertInt then loop underline(ulmode1,sel) updateunderline() resultis abnil case $c: SetRegionSys(risysstate,104) //Clear window; updatedisplay( ); tab = pointww($c, lv yloc) if tab ne abnil do resultis tab tww = vww; wwd = mpWwWwd ! tww deletea(wwd>>WWD.doc,0,rgmaccp!(wwd>>WWD.doc)- dcpendofdoc-1) cwwGroup = CwwInWgd(tww) wwFirst = wwd>>WWD.wwgroup wwd = mpWwWwd ! wwFirst deletea(wwd>>WWD.doc,0,rgmaccp!(wwd>>WWD.doc)- dcpendofdoc-1) wwLast = wwFirst + cwwGroup for tww = wwFirst to wwLast do [ wwd = mpWwWwd ! tww wwd>>WWD.fDirty = false wwd>>WWD.cpFDispl = 0 wwd>>WWD.fHd = false // wwd>>WWD.mag = 100 wwd>>WWD.xdUd = xleftmargstd rshift 5 invalidatewindow(tww); ] selectwholeww(sel,vww); underline(ulmode1,sel) updateunderline() resultis abnil case $d: //WWGROUP THRU WWENDOFGROUP DESTROYED SetRegionSys(risysstate,107) //Destroy window; updatedisplay(); tab = pointww($d, lv yloc) if tab ne abnil do resultis tab tww = vww; // special case #4027 - don't want huge system window if tww le wwsys+2 then fMergeLower = true cwwGroup = CwwInWgd(tww) test FWwSys(tww) % cwwGroup eq 2 ifso //whole group [ wwd = mpWwWwd!tww wwgroup = wwd>>WWD.wwgroup dcbWw = wwd>>WWD.dcbFirst wwEndofGroup = wwgroup + cwwGroup - 1 DestroyDoc( (mpWwWwd!wwgroup)>>WWD.doc ) DestroyDoc( (mpWwWwd!wwEndofGroup)>>WWD.doc ) ] ifnot [ //single window wwgroup = tww wwEndofGroup = tww wwd = mpWwWwd!tww if wwd>>WWD.wwgroup eq tww - 1 then fMergeLower = true //1st user window dcbWw = wwd>>WWD.dcbFirst ] yloc = rgyfirst ! wwgroup wwNextGroup = wwEndofGroup + 1 if fMergeLower & wwNextGroup eq macww then fMergeLower = false if sel>>SEL.ww ge wwNextGroup then sel>>SEL.ww = sel>>SEL.ww-(wwNextGroup-wwgroup); wwdNext = mpWwWwd!wwNextGroup dcbWw1 = wwdNext>>WWD.dcbFirst dcbPrev = ydToDcbPrev(yloc,@lvCnDcbRoot) dcbFirst = dcbPrev>>DCB.next dcbMac = dcbWw1 initCnDcb(cnDcbOld,dcbFirst,1) until (cnDcbOld>>CNDCB.dcbLast)>>DCB.next eq dcbMac do chaseCnDcb(cnDcbOld,1) initCnDcb(cnDcbNew,0,0) [ let dcb = dcbFirst until dcb eq dcbMac do [ dydReplace = dydReplace + (dcb>>DCB.slc) lshift 1 dcb = dcb>>DCB.next ] ] incCnDcb(cnDcbNew,0,dydReplace,0,0,0) replaceCnDcb(cnDcbOld,cnDcbNew,dcbPrev,yloc) // for ww = wwgroup to wwEndofGroup do // (mpWwWwd!ww)>>WWD.hpUsed = 0 // for dl=wwd>>WWD.dlFirst to (mpWwWwd!(wwEndofGroup)) // >> WWD.dlLast do // [ let dld = mpDlDld(dl) // pbmfirstfree = 1; freedl(dl,dld); // ] // [ let dlMacWw = wwdNext>>WWD.dlFirst // let dlFirst = wwd>>WWD.dlFirst // let dDlMac = dlFirst-dlMacWw // test (wwgroup ls macww-1) ifso // updateDlMaps(wwgroup,dlFirst,0,dlMacWw,dlFirst) // ifnot dDlMac = 0 // let cWwDeleted = wwNextGroup-wwgroup // ****** deletewindow has all this commented code now ***** deleteWindow(wwgroup,wwNextGroup-wwgroup) // for ww = wwgroup to macww-1 do // [ // let wwd = mpWwWwd ! ww // wwd>>WWD.dlFirst = wwd>>WWD.dlFirst+dDlMac // wwd>>WWD.dlLast = wwd>>WWD.dlLast+dDlMac // ] // ] if fMergeLower then [ let cwwMove = (cwwGroup le 2) ? 1,0 MoveWws(wwgroup,wwgroup+cwwMove,yloc,tDlist) ] updatewindow(wwgroup-1) unless wwgroup eq macww then updatewindow(wwgroup) ValidateSel(sel) underline(ulmode1,sel) updateunderline() resultis abnil case $e: SetRegionSys(risysstate,205) //horiz scroll updatedisplay() augmentomseq("M*140") ab = HorizScroll(cf) deactivateomseq("M*140","M*140") resultis abnil case ctrlf: resultis abnil default: goto wcabort; ]; wcabort: underline(ulmode1,sel) updateunderline() ab<<AB.crid = 2 //Illegal window command - ab<<AB.nrid = 4 resultis ab ] // P O I N T W W // and pointww(charcom,lvyloc) = valof [ let ab,trid = nil,nil let yloc,tww = nil,nil let cgroups = 0 let cww = nil // supposed to have all special cases of pointing at windows // basically: // CLEAR - if group dirty then ask for confirm // DESTROY - if one user window & its dirty then ask // if >1 & its dirty go ahead // KILL - if group is dirty then ask // SPLIT - can't split a system window // NEW - case in owindowcoms takes care of boundary probs if charcom eq $c % charcom eq $d then [ for tww = 0 to macww do if FWwSys(tww) do cgroups = cgroups + 1 if cgroups le 3 then [ vww = 2 cww = CwwInWgd(vww) test charcom eq $c ifso resultis (CleanWindow(charcom,vww)) // can't destroy single user window ifnot if cww eq 2 then [ ab<<AB.crid = 2 ab<<AB.nrid = 6 resultis ab ] ] ] if charcom eq $c % charcom eq $d then [ trid = ((charcom eq $c) ? 104, 107) SetRegionSys(risysstate,trid,113) //Select window updatedisplay() ] unless waitbug() then [ ab<<AB.crid = 1 //Command terminated ab<<AB.nrid = 1 setbug(sreset) resultis ab ] yloc = rv ybugloc unless (yloc gr rgyfirst ! 0) & (yloc ls rgyfirst ! macww) then [ ab<<AB.crid = 2 //Mouse out of bounds ab<<AB.nrid = 0 resultis ab ] @lvyloc = yloc formaty(yloc) tww = vww if yloc ls rgyfirst ! 1 % (FWwSys(tww) & charcom eq $s) then [ ab<<AB.crid = 2 //Illegal request for system window ab<<AB.nrid = 8 resultis ab ] if charcom eq $s % charcom eq $n resultis abnil resultis (CleanWindow(charcom,vww)) ] // C L E A N W I N D O W // and CleanWindow(char,ww) = valof [ let cww = CwwInWgd(ww) let tww = ww if FWwSys(ww) then tww = ww+1 // concerned about user window // destroy - ask when one copy and it's dirty if ( (char eq $d & cww le 2) % (chcom eq $k & FWwSys(ww)) ) & ((mpWwWwd ! tww)>>WWD.fDirty) & not confirm(" ") do [ vww = ww resultis abmsg ] // clear - ask when any group window is dirty if char eq $c & ((mpWwWwd ! tww)>>WWD.fDirty) & not confirm(" ") do [ vww = ww resultis abmsg ] vww = ww resultis abnil ] // M O V E B O U N D A R Y // and moveBoundary(dlist,ww,newYdFirst,fgroup) be [ let dYd = (newYdFirst-rgyfirst ! ww+1) & (-2) let magDYd = abs(dYd) if magDYd ls 2 then return let ty1,ty2,wwShrink,wwGrow,wwfirst,wwlast = nil,nil,nil,nil,nil,nil // two types of boundaries - system on top of user, and two users // check crossings and find shrinking and growing windows test fgroup ifso // system window [ test dYd ls 0 ifso // up [ ty1 = rgyfirst!(ww-1) + dYdWwMin ty2 = rgyfirst!(ww) + dYd if ty2 ls ty1 then return wwShrink = ww - 1 wwGrow = ww + 1 ] ifnot [ // down ty1 = rgyfirst!(ww+2) - dYdWwMin ty2 = rgyfirst!ww + dYd LMOVE: if ty2 gr ty1 then return wwShrink = ww + 1 wwGrow = ww - 1 ] wwfirst = ww ; wwlast = ww + 1 ] ifnot [ // user window test dYd ls 0 ifso // up [ ty1 = rgyfirst!(ww-1) + dYdWwMin ty2 = rgyfirst!ww + dYd if ty2 ls ty1 then return wwShrink = ww - 1 wwGrow = ww ] ifnot [ // down ty1 = rgyfirst!(ww+1) - dYdWwMin ty2 = rgyfirst!ww + dYd if ty2 gr ty1 then return wwShrink = ww wwGrow = ww - 1 ] wwfirst = ww; wwlast = ww ] let cnDcbOldShrink = vec lCnDcb; let cnDcbNewShrink = vec lCnDcb let cnDcbOldGrow = vec lCnDcb; let cnDcbNewGrow = vec lCnDcb let ydOfDcb = 0 // dYd ls 0 means up; dyd gr 0 means down // have to check for system window, and keep its width constant let ydShrink = rgyfirst ! (wwShrink+1)-magDYd initCnDcb(cnDcbNewShrink,0,0) let dcbPrevShrink = nil test wwShrink eq macww ifnot [ dcbPrevShrink = ydToDcbPrev(ydShrink,dlist,lv ydOfDcb) initCnDcb(cnDcbOldShrink,dcbPrevShrink>>DCB.next,1) let dcbWwNext = (mpWwWwd ! (wwShrink+1))>>WWD.dcbFirst until (cnDcbOldShrink>>CNDCB.dcbLast)>>DCB.next eq dcbWwNext do chaseCnDcb(cnDcbOldShrink,1) let dYdSlop = ydShrink-ydOfDcb unless dYdSlop eq 0 then incCnDcb(cnDcbNewShrink,0,dYdSlop,0,0, (mpWwWwd!wwShrink)>>WWD.bw) ] ifso initCnDcb(cnDcbOldShrink,0,0) let ydGrow = rgyfirst ! (wwGrow+1) initCnDcb(cnDcbOldGrow,0,0) initCnDcb(cnDcbNewGrow,0,0) let dcbPrevGrow = nil unless wwGrow eq macww then [ dcbPrevGrow = ydToDcbPrev(ydGrow,dlist) incCnDcb(cnDcbNewGrow,0,magDYd,0,0, (mpWwWwd!wwGrow)>>WWD.bw) ] replaceCnDcb(cnDcbOldGrow,cnDcbNewGrow,dcbPrevGrow,ydGrow) replaceCnDcb(cnDcbOldShrink,cnDcbNewShrink,dcbPrevShrink,ydOfDcb) for tww = wwfirst to wwlast do rgyfirst!tww = rgyfirst!tww + dYd ] // Y D T O D C B P R E V // and ydToDcbPrev(yd,dlist,lvYdOfDcb; numargs na) = valof [ let cnDcb = vec lCnDcb initCnDcb(cnDcb,dlist,1) let dcbNext = (dlist)>>DCB.next until (dcbNext eq 0) % ((cnDcb>>CNDCB.dYd+(dcbNext>>DCB.slc lshift 1)) gr yd) do [ chaseCnDcb(cnDcb,1) dcbNext = (cnDcb>>CNDCB.dcbLast)>>DCB.next ] unless na ls 3 then @lvYdOfDcb = cnDcb>>CNDCB.dYd resultis cnDcb>>CNDCB.dcbLast; ] // C O P Y D L I S T // and copyDlist(dlistDest,dlistSrc) be [ let dcbSrc = dlistSrc; let dcbDest = dlistDest move(dcbSrc,dcbDest,dcbl) [ dcbSrc = dcbSrc>>DCB.next if dcbSrc eq 0 then break dcbDest = dcbDest+dcbl move(dcbSrc,dcbDest,dcbl) (dcbDest-dcbl)>>DCB.next = dcbDest ] repeat dcbDest>>DCB.next = 0; ] // C W W I N W G D and CwwInWgd(ww) = valof [ let wwGroup = (mpWwWwd!ww)>>WWD.wwgroup let tww = wwGroup while (mpWwWwd!tww)>>WWD.wwgroup eq wwGroup do tww = tww + 1 resultis (tww-wwGroup) ] // F W W S Y S and FWwSys(ww) = valof [ test ww eq (mpWwWwd!ww)>>WWD.wwgroup ifso resultis true ifnot resultis false ] // M O V E W W S and MoveWws(wwFirst,wwLast,ydFirstNew,tDlist) be [ let dyd = ydFirstNew - rgyfirst!wwFirst if abs(dyd) ls dYdWwMin then return let wwShrink = (dyd ls 0) ? wwFirst-1,wwLast //let dydWwShrink = 0 //let dcb = (mpWwWwd!wwShrink)>>WWD.dcbFirst //let dcbMac = (mpWwWwd!(wwLast+1))>>WWD.dcbFirst //until dcb eq dcbMac do // [ dydWwShrink = dydWwShrink + (dcb>>DCB.slc) lshift 1 // dcb = dcb>>DCB.next // ] //if wwShrink ne macww & (abs(dyd) gr (dYdWwMin +dydWwShrink )) then // dyd = dydWwShrink - dYdWwMin //if dyd eq 0 return let ydMax,dlist,fgroup = nil,nil,true test dyd ls 0 ifso [ ydMax = rgyfirst!wwShrink + dYdWwMin if rgyfirst!wwFirst eq ydMax then return if ydFirstNew ls ydMax then ydFirstNew = ydMax ] ifnot [ ydMax = rgyfirst!(wwLast+1) - dYdWwMin if rgyfirst!wwLast eq ydMax then return if ydFirstNew ge ydMax then ydFirstNew = ydMax if wwFirst ne wwLast then ydFirstNew = ydFirstNew - dydsysww ] copyDlist(tDlist,@lvCnDcbRoot) dlist = @lvCnDcbRoot @lvCnDcbRoot = tDlist vfVertInt = false until vfVertInt then loop if wwFirst eq wwLast then fgroup = false if (mpWwWwd!wwLast)>>WWD.wwgroup eq wwLast then fgroup = true moveBoundary(dlist,wwFirst,ydFirstNew,fgroup) @lvCnDcbRoot = dlist vfVertInt = false updatewindow(wwFirst-1) unless wwFirst eq macww then updatewindow(wwFirst) unless wwLast ge macww then updatewindow(wwLast) underline(ulmode1,selmain); ] and DestroyDoc(doc) be [ let pctb = rgpctb!doc hpfree(pctb) rgpctb!doc = -1 rgmaccp!doc = 0 ] and FillInWgd(wgd,i,ydFirst,dyd,doc,cpFDispl,bonw,fHd,mag,xdUd) = valof [ wgd>>WGDTABLE.ydFirst↑i = ydFirst wgd>>WGDTABLE.dyd↑i = dyd wgd>>WGDTABLE.doc↑i = doc wgd>>WGDTABLE.cpFDispl↑i = cpFDispl wgd>>WGDTABLE.bonw↑i = bonw wgd>>WGDTABLE.fHd↑i = fHd wgd>>WGDTABLE.mag↑i = mag wgd>>WGDTABLE.xdUd↑i = xdUd resultis wgd ] // M O V E W W S Y S // and MoveWwSys() be [ let tDlist = array(maxcdcb*dcbl+1) if tDlist<<odd then tDlist = tDlist+1 let ydFirstNew = vfRemove ? vytop+4, vymid+dydsysww; vfRemove = not vfRemove; if (ydFirstNew+dydsysww) ge rgyfirst ! 3 then return MoveWws(1,2,ydFirstNew,tDlist); ]