// Window command Module QWINCOM.SR get "BRAVO.DF" get "CHAR.DF" get "GINN.DF" // Incoming Procedures external [ updatedisplay; linemark; updatelinemark; formatx; formaty; move; finddl; errhlt; backnlines; updatewindow; getvch; mapscrcp; prevscrvch; setbug; createdoce; establishww; mousedecode stripedecode pollmouse pollstripe pollkeyset initcomt splitwindow freedl createdisplay copydnww createdocm docalloc hidebug visible cpvisible getdoc wwmark updatewwmark buggedmenu menuitem resetmessage setmessage pollinput selectwholeww setsel dirflip elapsed setmenu marks locatebug stillselecting buggedsomething selectsel wipedoc bubblingww ]; // Incoming Statics external [ vturning vwindows mdoc vcp; vchremain; cpscrt; vdlhint; vulmode; rgmaccp; rgcplast; rgupdate; rgcpfirst; rgxfirst; rgbs; rgbp; rgdoc; rgdlfirst; rgdllast; rgyfirst; rgylast; rgmaxdl; rgcpfdispl; rgxlast; vrgcc; vdoc; vww; vdl; vlb; vpw; vheight; rgpctb; chcom; vstripe; comt; macww abs rghpused pbmfirstfree heightstd mpdldcb selection; selaux; rgsdoc ddoc cursorstate ; vwwcurrent vcpfirst vcplast vxfirst vxlast rgdirty xbug ybug sww sdoc ]; // Outgoing Procedures external [ modwindow divwindow delwindow newwindow ]; structure DCB: [ next word; mode bit 1; bw bit 1; htab bit 6; nwrds bit 8; sa word; slc word; ]; let divwindow(cmdcode) = wwcommand(cdivwindow,cmdcode,false,ssplit) and modwindow(cmdcode) = wwcommand(cmodwindow,cmdcode,true,sbound) and delwindow(cmdcode) = wwcommand(cdelwindow,cmdcode,false,swindow) and newwindow(cmdcode) = wwcommand(cnewwindow,cmdcode,false,snew) and wwcommand(proc, cmdcode, oksys, bugshape) = valof [ unless buggedsomething(true, -1, oksys, bugshape) do resultis 0 ; let ans = proc(cmdcode) resultis ans ] and cdivwindow(cmdcode) = valof [ while stillselecting(-1,0, false, swindow) do [ if cdelwindow(0) eq 0 then resultis 0 ; setbug(vstripe eq pollstripe(false)?ssplit, swindow) ; ] if vstripe ne pollstripe(false) % rgdoc ! vww eq docsys % rgdoc ! vww eq mdoc then resultis 0; splitwindow(ybug,rgdoc ! vww); rgcpfdispl ! vww = rgcpfirst ! vdl ; rgsdoc!vww=rgsdoc!(vww-1) bubblingww(vww, 1) vwwcurrent = vww ; vturning = true resultis 0; ] // end of cdivwindow() and cmodwindow(cmdcode) = valof [ let wwc,n,dist = nil,nil,nil; let closest = 10000; for ww = 2 to macww-2 do if abs(ybug-rgylast ! ww) ls closest then [ dist = ybug-rgylast ! ww closest = abs(dist); wwc = ww; ]; let theight = heightstd; let dl = vdl ; while stillselecting(-1,0, true, swindow) do [ let tdl = vdl; let tdoc = -1; let ty = rgylast ! wwc ; if dl eq vdl & ty ls ybug & abs(ty-ybug) ls theight then loop ; dl = vdl ; if (wwc+2 ne macww & ybug gr rgylast ! (wwc+1)) % ybug ls rgyfirst ! wwc then loop if ybug gr 773 then ybug = 773 ; rgylast ! wwc = ybug; vww = wwc + 1 ; if vww ls macww then [ establishww(vww) ; test ybug gr ty ifso rgcpfdispl ! vww = rgcpfirst ! dl; ifnot [ n = rgdlfirst ! vww - dl; vcp = rgcpfdispl ! vww ; [ n = n- backnlines(vww,vcp,n); ] repeatuntil vcp eq 0 % n eq 0 rgcpfdispl ! vww = vcp ; // rgxlast ! (rgdlfirst ! vww) =-1; ]; ]; createdisplay() vturning = true updatedisplay() ]; resultis 0; ] // end of cmodwindow and cdelwindow(cmdcode) = valof [ if cmdcode eq 0 & comt ! (pollmouse()+(vstripe-sstripe) lshift 3) ne sdelwindow then resultis -1 unless buggedsomething(true, -1, false, swindow) then resultis waitup() ; let w = vww ; let d = rgdoc ! w ; let sel = nil ; unless 2 le w & w le macww-2 & macww gr 4 do [ // %% setmessage setmessage(" That window is permanent: it can't be deleted") resultis waitup() ; ] let copyup = w eq 2 % (rgdoc!(w-1) ne d & rgdoc!(w+1) eq d); let elsewhere = -1 ; for i = macww-1 to 2 by -1 do if i ne w & rgdoc ! i eq d & (rgsdoc ! i eq rgsdoc ! w % elsewhere ls 0) then elsewhere = i ; if rgdoc ! w ne ddoc & rgdirty ! d & elsewhere ls 0 then [ setmessage(" Before deleting window, File or Cancel document") ; vwwcurrent = w resultis waitup() ] let reselect = false ; if selection >> SEL.doc eq d % selaux >> SEL.doc eq d then reselect = elsewhere; let okdel = true ; for i = rgdlfirst ! w to rgmaxdl ! w - 1 do mpdldcb ! i >> DCB.bw = 1 ; while stillselecting(-1,0, false, swindow) do if vstripe ne pollstripe(false) % vww ne w then okdel = false; for i = rgdlfirst ! w to rgmaxdl ! w - 1 do mpdldcb ! i >> DCB.bw = 0 ; unless okdel do resultis 0 ; let teodc = rgmaccp ! sdoc -1 ; if reselect then for t = 0 to 1 do [ sel = t eq 0? selaux, selection ; if sel >> SEL.doc eq d then test reselect ls 0 ifso test t eq 0 ifso selectsel(sel, sww, teodc, teodc-t) ifnot [ vwwcurrent = copyup? 3,2 ; selectsel(sel, vwwcurrent, rgcpfdispl ! vwwcurrent) ; ] ; ifnot [ sel >> SEL.ww = reselect ; vwwcurrent = reselect ; ] ]; test copyup & w+1 ne macww ifso rgyfirst ! (w+1) = rgyfirst ! w ifnot rgylast ! (w-1) = rgylast ! w; if d ne ddoc & elsewhere eq -1 then wipedoc(d) rghpused ! w = 0; for dl = rgdlfirst ! w to rgdllast ! w do [ pbmfirstfree = 1; freedl(dl); ]; for ww = w to macww-2 do copydnww(ww,ww+1); bubblingww(w, -1) macww = macww-1; createdisplay(); resultis 0; ] // end of cdelwindow and waitup() = valof [ while stillselecting(-1, 0, false, swindow) do loop ; resetmessage() ; // %% resultis 0 ] and cnewwindow(cmdcode) = valof [ while stillselecting(-1,0, false, swindow) do [ if cdelwindow(0) eq 0 then resultis 0 ; setbug(vstripe eq pollstripe(false)?snew, swindow) ; ] let tww = vww ; if vstripe ne pollstripe(false) % vdoc eq docsys % tww ge macww-1 % vdoc eq mdoc % rgdoc!tww eq rgdoc!(tww+1) then resultis 0; let tdoc = docalloc(); if tdoc eq -1 then resultis 0; createdocm(tdoc); splitwindow(ybug, tdoc); bubblingww(tww+1, 1) getdoc(tww+1,ddoc) vwwcurrent = tww+1 resultis 0 ]