Annotation of 43BSD/contrib/X/xted/screen.clu, revision 1.1

1.1     ! root        1: % Physical screen hacking cluster, for editors, etc.
        !             2: 
        !             3: # extend
        !             4: 
        !             5: screen = cluster is
        !             6: 
        !             7:        % mode changing and initialization functions
        !             8:        init,                   % sets up (first time, or new terminal)
        !             9:        enter_image_mode,       % set up terminal
        !            10:        leave_image_mode,       % restores the terminal
        !            11:        destroy,                % finishes up
        !            12: 
        !            13:        % option setting functions
        !            14:        set_padding,            % pad output
        !            15:        set_scroll,             % do scrolling (if poss)
        !            16:        set_keypad_mode,        % enter/exit alternate keypad mode
        !            17:        set_highlight,          % underline/invert
        !            18:        recolor,                % change colors
        !            19: 
        !            20:        % display functions
        !            21:        clear,                  % clear screen and home up
        !            22:        display_line,           % display a line of an environment
        !            23:        redisplay_line,         % redisplay line as is
        !            24:        display_chars,          % display chars at end of line
        !            25:        update_line,            % update data to correspond with screen
        !            26:        set_cursor_pos,         % set the cursor position
        !            27:        get_cursor_pos,         % get the cursor position
        !            28:        scroll,                 % scroll a region
        !            29:        full_scroll,            % scroll entire screen
        !            30:        bell,                   % bell
        !            31:        highlight,              % highlight
        !            32:        redisplay,              % hack redisplay
        !            33:        unmapped,               % hack icon
        !            34: 
        !            35:        % information returning functions
        !            36:        position,               % pixel -> char coordinates
        !            37:        get_padding,            % padding on ?
        !            38:        get_screen_size,        % returns length and width of screen
        !            39:        fetch,                  % fetch a line
        !            40:        id_lines_poss,          % ins/del lines possible ?
        !            41:        scrolling_poss,         % full screen scrolling possible ?
        !            42:        should_id_lines,        % makes decision about ins/del lines
        !            43:        should_scroll           % makes decision about scrolling
        !            44: 
        !            45:     ldata = record[line: act,          % screen line, as chars
        !            46:                   len:  int,          % len of real string
        !            47:                   lim:  int,          % pos of last non-space char in line
        !            48:                   str:  string]       % the actual string
        !            49: 
        !            50:     % invariant property of ldatas:
        !            51:     %  size(line) = hsize - 1
        !            52:     %  len = _calc_hpos(str, string$size(str) + 1)
        !            53:     %  lim < i < hsize  =>  line[i] = ' '
        !            54:     %  the chars in line correspond to the chars in str
        !            55:     %  the chars in lines[j] correspond to the chars on the
        !            56:     %      screen on line j (the presence of an ! determined by len)
        !            57: 
        !            58:     rep     = null
        !            59:     al      = array[ldata]
        !            60: 
        !            61:     qi      = sequence[int]
        !            62:     qs      = sequence[string]
        !            63:     zapc    = array_zap[char]
        !            64:     shiftc  = array_shift[char]
        !            65:     shiftl  = array_shift[ldata]
        !            66:     repll   = array_replace[ldata]
        !            67: 
        !            68:     events = KeyPressed + ButtonPressed + ButtonReleased +
        !            69:             ExposeRegion + ExposeCopy + UnmapWindow
        !            70: 
        !            71:     own done: bool := false
        !            72: 
        !            73:     % screen data base
        !            74: 
        !            75:     own lines: al                          % array of line data
        !            76:     own holder: act                        % for display_line (new line)
        !            77:     own hlim: int                          % limit for holder
        !            78:     own temp: al                           % for scrolling
        !            79:     own xline: act                         % display_chars hack
        !            80:     own xvpos: int
        !            81:     own xhpos: int
        !            82:     own xmpos: int
        !            83: 
        !            84:     own image: bool                        % in image mode?
        !            85:     own f: x_font
        !            86:     own fheight: int
        !            87:     own fwidth: int
        !            88:     own of: x_font
        !            89:     own oheight: int
        !            90:     own owidth: int
        !            91:     own textpix: int
        !            92:     own clearpix: int
        !            93:     own planemask: int
        !            94:     own nobit: x_bitmap
        !            95:     own w: x_window
        !            96:     own ow: x_window
        !            97:     own mousepix: int
        !            98:     own mousefunc: int
        !            99:     own chpos: int
        !           100:     own cdisp: bool
        !           101:     own crcols: colordeflist
        !           102:     own hlcols: colordeflist
        !           103:     own hlmode: bool
        !           104:     own high: bool
        !           105:     own hvpos: int
        !           106:     own hhpos: int
        !           107: 
        !           108:     % terminal properties
        !           109: 
        !           110:     own vsize: int                          % # of lines (0 to vsize-1)
        !           111:     own hsize: int                          % # of cols  (0 to hsize-1)
        !           112:     own vsize1: int                         % vsize-1
        !           113:     own hsize1: int                         % hsize-1
        !           114: 
        !           115:     % cursor info (-1 means unknown)
        !           116: 
        !           117:     own vpos: int                           % current vertical pos
        !           118:     own hpos: int                           % current horizontal pos
        !           119: 
        !           120:     init = proc (options: qs)
        !           121:        if ~done
        !           122:           then lines := al$create(0)
        !           123:                holder := act$create(0)
        !           124:                hlim := -1
        !           125:                temp := al$create(0)
        !           126:                xhpos := 0
        !           127:                xmpos := -1
        !           128:                image := false
        !           129:                display: string := ""
        !           130:                myname: string := _get_xjname()
        !           131:                font: string := x_default(myname, "BodyFont")
        !           132:                   except when not_found: font := "8x13" end
        !           133:                revvid: bool := x_default(myname, "ReverseVideo") = "on"
        !           134:                   except when not_found: revvid := false end
        !           135:                bwidth: int := int$parse(x_default(myname, "BorderWidth"))
        !           136:                   except when not_found, overflow, bad_format: bwidth := 2 end
        !           137:                spec: string := "=80x24"
        !           138:                cfore: string := x_default(myname, "Foreground")
        !           139:                   except when not_found: cfore := "" end
        !           140:                cback: string := x_default(myname, "Background")
        !           141:                   except when not_found: cback := "" end
        !           142:                ccurs: string := x_default(myname, "Cursor")
        !           143:                   except when not_found: ccurs := "" end
        !           144:                chigh: string := x_default(myname, "Highlight")
        !           145:                   except when not_found: chigh := "" end
        !           146:                cbdr: string := x_default(myname, "Border")
        !           147:                   except when not_found: cbdr := "" end
        !           148:                mfore: string := x_default(myname, "Mouse")
        !           149:                   except when not_found: mfore := "" end
        !           150:                mousefunc := int$parse(x_default(myname, "MouseFunction"))
        !           151:                   except when not_found, overflow, bad_format: mousefunc := GXcopy end
        !           152:                icon: bool := x_default(myname, "BitmapIcon") = "on"
        !           153:                   except when not_found: icon := false end
        !           154:                for opt: string in qs$elements(options) do
        !           155:                    if opt = "-rv"
        !           156:                       then revvid := true
        !           157:                     elseif opt = "-i"
        !           158:                       then icon := true
        !           159:                     elseif string$indexs("-fn=", opt) = 1
        !           160:                       then font := string$rest(opt, 5)
        !           161:                     elseif string$indexs("-fg=", opt) = 1
        !           162:                       then cfore := string$rest(opt, 5)
        !           163:                     elseif string$indexs("-bg=", opt) = 1
        !           164:                       then cback := string$rest(opt, 5)
        !           165:                     elseif string$indexs("-cr=", opt) = 1
        !           166:                       then ccurs := string$rest(opt, 5)
        !           167:                     elseif string$indexs("-hl=", opt) = 1
        !           168:                       then chigh := string$rest(opt, 5)
        !           169:                     elseif string$indexs("-bd=", opt) = 1
        !           170:                       then cbdr := string$rest(opt, 5)
        !           171:                     elseif string$indexs("-ms=", opt) = 1
        !           172:                       then mfore := string$rest(opt, 5)
        !           173:                     elseif opt[1] = '='
        !           174:                       then spec := opt
        !           175:                     else if opt[1] = '-'
        !           176:                             then opt := string$rest(opt, 2) end
        !           177:                          if string$indexc(':', opt) ~= 0
        !           178:                             then display := opt
        !           179:                             else font := opt
        !           180:                             end
        !           181:                     end
        !           182:                    end
        !           183:                x_display$init(display)
        !           184:                   except when error, failure (why: string):
        !           185:                               _chan$puts(_chan$error_output(), why || "\r\n",
        !           186:                                          false)
        !           187:                               quit_()
        !           188:                          end
        !           189:                f := x_font$create(font)
        !           190:                   except when error (*):
        !           191:                               _chan$puts(_chan$error_output(), "bad font\r\n",
        !           192:                                          false)
        !           193:                               quit_()
        !           194:                          end
        !           195:                clearmap, bdrmap: x_pixmap
        !           196:                if revvid
        !           197:                   then textpix := WhitePixel
        !           198:                        bdrmap := x_display$white()
        !           199:                        clearpix := BlackPixel
        !           200:                        clearmap := x_display$black()
        !           201:                   else textpix := BlackPixel
        !           202:                        bdrmap := x_display$black()
        !           203:                        clearpix := WhitePixel
        !           204:                        clearmap := x_display$white()
        !           205:                   end
        !           206:                mousepix := textpix
        !           207:                crcols := colordeflist$new()
        !           208:                hlcols := colordeflist$new()
        !           209:                begin
        !           210:                if x_display$cells() > 2  cand
        !           211:                   (~string$empty(cfore)  cor  ~string$empty(cback) cor
        !           212:                    ~string$empty(ccurs)  cor  ~string$empty(chigh))
        !           213:                   then pixs: pixellist
        !           214:                        if string$empty(ccurs)  cand  string$empty(chigh)
        !           215:                           then pixs, planemask := x_display$alloc_cells(
        !           216:                                                       1, 1, false)
        !           217:                                clearpix := pixs[1]
        !           218:                                textpix := clearpix + planemask
        !           219:                           else pixs, planemask := x_display$alloc_cells(
        !           220:                                                       2, 1, false)
        !           221:                                clearpix := pixs[1]
        !           222:                                textpix := pixs[2]
        !           223:                           end
        !           224:                        mousepix := textpix
        !           225:                        r, g, b: int
        !           226:                        if string$empty(cback)
        !           227:                           then r, g, b := x_display$query_color(clearpix)
        !           228:                           else r, g, b := x_parse_color(cback)
        !           229:                           end
        !           230:                        x_display$store_color(clearpix, r, g, b)
        !           231:                        if ~string$empty(ccurs)  cor  ~string$empty(chigh)
        !           232:                           then x_display$store_color(textpix + planemask,
        !           233:                                                      r, g, b)
        !           234:                           end
        !           235:                        clearmap := x_pixmap$tile(clearpix)
        !           236:                        if string$empty(cfore)
        !           237:                           then r, g, b := x_display$query_color(textpix)
        !           238:                           else r, g, b := x_parse_color(cfore)
        !           239:                           end
        !           240:                        x_display$store_color(textpix, r, g, b)
        !           241:                        if ~string$empty(chigh)
        !           242:                           then hr, hg, hb: int := x_parse_color(chigh)
        !           243:                                colordeflist$addh(hlcols,
        !           244:                                                  colordef${pixel: clearpix +
        !           245:                                                                   planemask,
        !           246:                                                            red:   hr,
        !           247:                                                            green: hg,
        !           248:                                                            blue:  hb})
        !           249:                           end
        !           250:                        if ~string$empty(ccurs)
        !           251:                           then r, g, b := x_parse_color(ccurs) end
        !           252:                        colordeflist$addh(crcols,
        !           253:                                          colordef${pixel: clearpix +
        !           254:                                                           planemask,
        !           255:                                                    red:   r,
        !           256:                                                    green: g,
        !           257:                                                    blue:  b})
        !           258:                        if ~string$empty(ccurs)  cor  ~string$empty(chigh)
        !           259:                           then x_display$store_color(clearpix + planemask,
        !           260:                                                      r, g, b)
        !           261:                           end
        !           262:                   else planemask := 1
        !           263:                   end
        !           264:                if x_display$cells() > 2
        !           265:                   then if ~string$empty(cbdr)
        !           266:                           then r, g, b: int := x_parse_color(cbdr)
        !           267:                                bdrmap := x_pixmap$tile(x_display$alloc_color(
        !           268:                                                            r, g, b))
        !           269:                           end
        !           270:                        if ~string$empty(mfore)
        !           271:                           then r, g, b: int := x_parse_color(mfore)
        !           272:                                mousepix := x_display$alloc_color(r, g, b)
        !           273:                           end
        !           274:                   end
        !           275:                end except when undefined, bad_format:
        !           276:                                _chan$puts(_chan$error_output(), "bad color\r\n",
        !           277:                                           false)
        !           278:                                quit_()
        !           279:                           end
        !           280:                first, last: char
        !           281:                base: int
        !           282:                fixed: bool
        !           283:                fwidth, fheight, first, last, base, fixed := x_font$query(f)
        !           284:                w, hsize, vsize := x_tcons(myname, clearmap, bdrmap,
        !           285:                                           spec, "=80x24+1+1",
        !           286:                                           f, fwidth, fheight, 2,
        !           287:                                           6, 6, bwidth)
        !           288:                if icon
        !           289:                   then of := x_font$create("nil2")
        !           290:                        owidth, oheight, first, last, base, fixed :=
        !           291:                            x_font$query(of)
        !           292:                        ow := x_window$create(0, 0, hsize * owidth + 2,
        !           293:                                              vsize * oheight + 2, clearmap,
        !           294:                                              x_display$root(), 2, bdrmap)
        !           295:                        ow.input := events
        !           296:                        w.icon := ow
        !           297:                   else ow := x_window$none()
        !           298:                   end except when error (*):
        !           299:                                   _chan$puts(_chan$error_output(), "bad font\r\n",
        !           300:                                              false)
        !           301:                                   quit_()
        !           302:                              end
        !           303:                w.name := myname
        !           304:                x_window$set_resize(w, 2, fwidth, 2, fheight)
        !           305:                w.input := events - ExposeRegion
        !           306:                x_window$map(w)
        !           307:                w.input := events
        !           308:                new_cursor()
        !           309:                nobit := x_bitmap$none()
        !           310:                vsize1 := vsize - 1
        !           311:                hsize1 := hsize - 1
        !           312:                chpos := 0
        !           313:                cdisp := false
        !           314:                hlmode := false
        !           315:                high := false
        !           316:                done := true
        !           317:           else leave_image_mode()
        !           318:           end
        !           319:        enter_image_mode()
        !           320:        end init
        !           321: 
        !           322:     enter_image_mode = proc ()
        !           323:        if image
        !           324:           then return end
        !           325:        sx, sy, sw, sh, wb, ms, wk: int, iw: x_window := x_window$query(w)
        !           326:        hsize := int$max((sw + fwidth - 3) / fwidth, 6)
        !           327:        hsize1 := hsize - 1
        !           328:        vsize := int$max((sh + fheight - 3) / fheight, 6)
        !           329:        vsize1 := vsize - 1
        !           330:        nw: int := hsize * fwidth + 2
        !           331:        nh: int := vsize * fheight + 2
        !           332:        if nh ~= sh  cor  nw ~= sw
        !           333:           then x_window$change(w, nw, nh)
        !           334:                if ow ~= x_window$none()
        !           335:                   then x_window$change(ow, hsize * owidth + 2,
        !           336:                                        vsize * oheight + 2)
        !           337:                   end
        !           338:           end
        !           339:        output$reset()
        !           340:        vpos := -1        % force positioning
        !           341:        hpos := -1
        !           342:        image := true
        !           343:        end enter_image_mode
        !           344: 
        !           345:     leave_image_mode = proc ()
        !           346:        if image
        !           347:           then input$reset()
        !           348:                image := false
        !           349:           end
        !           350:        end leave_image_mode
        !           351: 
        !           352:     destroy = proc ()
        !           353:        leave_image_mode()
        !           354:        x_window$destroy(w)
        !           355:        done := false
        !           356:        end destroy
        !           357: 
        !           358:     set_padding = proc (b: bool)
        !           359:        end set_padding
        !           360: 
        !           361:     set_scroll = proc (b: bool)
        !           362:        end set_scroll
        !           363: 
        !           364:     set_keypad_mode = proc (b: bool) returns (bool)
        !           365:        return(false)
        !           366:        end set_keypad_mode
        !           367: 
        !           368:     set_highlight = proc (h, b: bool)
        !           369:        hlmode := b
        !           370:        if h
        !           371:           then w.input := events + MouseMoved
        !           372:                if ~colordeflist$empty(hlcols)
        !           373:                   then x_display$store_colors(hlcols) end
        !           374:           else w.input := events
        !           375:                if ~colordeflist$empty(hlcols)
        !           376:                   then x_display$store_colors(crcols) end
        !           377:           end
        !           378:        end set_highlight
        !           379: 
        !           380:     recolor = proc (white: bool) returns (bool)
        !           381:        if textpix > WhitePixel
        !           382:           then return(false) end
        !           383:        if white
        !           384:           then textpix := BlackPixel
        !           385:                clearpix := WhitePixel
        !           386:                w.background := x_display$white()
        !           387:                w.border := x_display$black()
        !           388:           else textpix := WhitePixel
        !           389:                clearpix := BlackPixel
        !           390:                w.background := x_display$black()
        !           391:                w.border := x_display$white()
        !           392:           end
        !           393:        mousepix := textpix
        !           394:        x_window$clear(w)
        !           395:        new_cursor()
        !           396:        return(true)
        !           397:        end recolor
        !           398: 
        !           399:     clear = proc ()
        !           400:        ovsize: int := al$size(lines)
        !           401:        x_window$clear(w)
        !           402:        x_flush()
        !           403:        deltav: int := vsize - ovsize
        !           404:        deltah: int := hsize1 - act$size(holder)
        !           405:        limit: int := ovsize - 1
        !           406:        if deltav < 0
        !           407:           then limit := vsize1 end
        !           408:        % clear out char arrays, and auxiliary info
        !           409:        for i: int in int$from_to(0, limit) do
        !           410:            line: ldata := lines[i]
        !           411:            lim: int := line.lim
        !           412:            chars: act := line.line
        !           413:            zapc(chars, 0, lim+1, ' ')
        !           414:            if deltah < 0
        !           415:               then act$trim(chars, 0, hsize1)
        !           416:               else for j: int in int$from_to_by(deltah, 1, -1) do
        !           417:                        act$addh(chars, ' ')
        !           418:                        end
        !           419:               end
        !           420:            line.lim := -1
        !           421:            line.len := 0
        !           422:            line.str := ""
        !           423:            end
        !           424:        if deltav < 0
        !           425:           then al$trim(lines, 0, vsize)
        !           426:           else for i: int in int$from_to_by(deltav, 1, -1) do
        !           427:                    line: ldata :=
        !           428:                        ldata${line: act$fill(0, hsize1, ' '),
        !           429:                               lim:  -1,
        !           430:                               len:  0,
        !           431:                               str:  ""}
        !           432:                    al$addh(lines, line)
        !           433:                    end
        !           434:           end
        !           435:        if deltah < 0
        !           436:           then act$trim(holder, 0, hsize1)
        !           437:                if hlim >= hsize1
        !           438:                   then hlim := hsize - 2 end
        !           439:           else for i: int in int$from_to_by(deltah, 1, -1) do
        !           440:                    act$addh(holder, ' ')
        !           441:                    end
        !           442:           end
        !           443:        vpos := -1   % force positioning
        !           444:        cdisp := false
        !           445:        set_cursor_pos(0, 0, true)
        !           446:        end clear
        !           447: 
        !           448:     display_line = proc (s: string, lpos: int) returns (bool) signals (bounds)
        !           449:        line: ldata := lines[lpos]
        !           450:           resignal bounds
        !           451:        if s = line.str
        !           452:           then return(false) end
        !           453:        if cdisp
        !           454:           then forget_cursor() end
        !           455:        new: act := holder
        !           456:        nlim, newlen: int := _calc_hpos_copy(s, new)
        !           457:        if hlim >= newlen
        !           458:           then zapc(new, newlen, hlim - newlen + 1, ' ') end
        !           459:        old: act := line.line
        !           460:        oldlen: int := line.len
        !           461:        olim: int := line.lim
        !           462:        excl: char := ' '
        !           463:        if oldlen >= hsize
        !           464:           then excl := '!' end
        !           465:        mlim: int := nlim
        !           466:        mpos: int := _diff_scan(new, old, 0, mlim)
        !           467:        if hpos ~= mpos cor vpos ~= lpos  cor  cdisp
        !           468:           then reposition(lpos, mpos) end
        !           469:        outa(new, mpos, mlim - mpos + 1)
        !           470:        hpos := mlim + 1
        !           471:        mpos := hpos
        !           472: 
        !           473:        if mlim < olim
        !           474:           then % keol needed
        !           475:                vpos := lpos
        !           476:                hpos := mpos
        !           477:                chpos := mpos
        !           478:                if excl = ' '
        !           479:                   then mlim := olim + 1
        !           480:                   else mlim := hsize
        !           481:                        excl := ' '
        !           482:                   end
        !           483:                clear_region(lpos, mpos, 1, mlim - mpos)
        !           484:           end
        !           485:        dexcl: char := ' '      % desired excl place char
        !           486:        if newlen >= hsize
        !           487:           then dexcl := '!' end
        !           488:        if dexcl ~= excl
        !           489:           then reposition(lpos, hsize1)
        !           490:                outc(dexcl)
        !           491:                hpos := hsize
        !           492:                reposition(lpos, hsize1)
        !           493:           end
        !           494:        holder := old
        !           495:        hlim := olim
        !           496:        line.line := new
        !           497:        line.lim := nlim
        !           498:        line.len := newlen
        !           499:        line.str := s
        !           500:        return(true)
        !           501:        end display_line
        !           502: 
        !           503:     redisplay_line = proc (lpos: int)
        !           504:        line: ldata := lines[lpos]
        !           505:           except when bounds: return end
        !           506:        if cdisp
        !           507:           then forget_cursor() end
        !           508:        vpos := -1
        !           509:        s: string := line.str
        !           510:        zapc(line.line, 0, hsize1, '\177')
        !           511:        if line.len >= hsize
        !           512:           then line.len := hsize1
        !           513:           else line.len := hsize
        !           514:           end
        !           515:        line.lim := hsize1
        !           516:        line.str := "\177"
        !           517:        display_line(s, lpos)
        !           518:        end redisplay_line
        !           519: 
        !           520:     display_chars = proc (nvpos, ohpos, nhpos: int, chars: act, mhpos: int)
        !           521:        xline := chars
        !           522:        xvpos := nvpos
        !           523:        if xhpos > xmpos
        !           524:           then xhpos := ohpos end
        !           525:        xmpos := nhpos
        !           526:        reposition(nvpos, ohpos)
        !           527:        outa(chars, ohpos, nhpos - ohpos)
        !           528:        hpos := nhpos
        !           529:        if nhpos < mhpos
        !           530:           then clear_region(nvpos, nhpos, 1, mhpos - nhpos) end
        !           531:        display_cursor()
        !           532:        end display_chars
        !           533: 
        !           534:     update_line = proc (s: string, lpos: int) signals (bounds)
        !           535:        xmpos := -1
        !           536:        line: ldata := lines[lpos]
        !           537:           resignal bounds
        !           538:        nlim, newlen: int := _calc_hpos_copy(s, line.line)
        !           539:        if line.lim >= newlen
        !           540:           then zapc(line.line, newlen, line.lim - newlen + 1, ' ') end
        !           541:        line.lim := nlim
        !           542:        line.len := newlen
        !           543:        line.str := s
        !           544:        end update_line
        !           545: 
        !           546:     reposition = proc (nvpos, nhpos: int)
        !           547:        if nhpos >= hsize
        !           548:           then nhpos := hsize1 end
        !           549:        if cdisp
        !           550:           then forget_cursor() end
        !           551:        if vpos ~= nvpos cor hpos ~= nhpos
        !           552:           then vpos := nvpos
        !           553:                hpos := nhpos
        !           554:                chpos := hpos
        !           555:           end
        !           556:        end reposition
        !           557: 
        !           558:     set_cursor_pos = proc (nvpos, nhpos: int, doit: bool)
        !           559:        if nhpos >= hsize
        !           560:           then nhpos := hsize1 end
        !           561:        if nvpos ~= vpos  cor  nhpos ~= hpos
        !           562:           then if cdisp
        !           563:                   then forget_cursor() end
        !           564:                vpos := nvpos
        !           565:                hpos := nhpos
        !           566:                chpos := hpos
        !           567:           end
        !           568:        if ~cdisp
        !           569:           then display_cursor() end
        !           570:        if doit
        !           571:           then x_flush() end
        !           572:        end set_cursor_pos
        !           573: 
        !           574:     forget_cursor = proc ()
        !           575:        x_window$pix_fill(w, 0, nobit, 1 + hpos * fwidth, 1 + vpos * fheight,
        !           576:                          fwidth, fheight, GXinvert, planemask)
        !           577:        cdisp := false
        !           578:        end forget_cursor
        !           579: 
        !           580:     display_cursor = proc ()
        !           581:        x_window$pix_fill(w, 0, nobit, 1 + hpos * fwidth, 1 + vpos * fheight,
        !           582:                          fwidth, fheight, GXinvert, planemask)
        !           583:        cdisp := true
        !           584:        end display_cursor
        !           585: 
        !           586:     get_cursor_pos = proc () returns (int, int)
        !           587:        return(vpos, hpos)
        !           588:        end get_cursor_pos
        !           589: 
        !           590:     position = proc (x, y: int) returns (int, int)
        !           591:        return((x - 1) / fwidth, (y - 1) / fheight)
        !           592:        end position
        !           593: 
        !           594:     get_padding = proc () returns (bool)
        !           595:        return(false)
        !           596:        end get_padding
        !           597: 
        !           598:     get_screen_size = proc () returns (int, int)
        !           599:        return(vsize, hsize)
        !           600:        end get_screen_size
        !           601: 
        !           602:     fetch = proc (lpos: int) returns (string) signals (bounds)
        !           603:        return(lines[lpos].str)
        !           604:           resignal bounds
        !           605:        end fetch
        !           606: 
        !           607:     id_lines_poss = proc () returns (bool)
        !           608:        return(true)
        !           609:        end id_lines_poss
        !           610: 
        !           611:     scrolling_poss = proc () returns (bool)
        !           612:        return(false)
        !           613:        end scrolling_poss
        !           614: 
        !           615:     should_id_lines = proc (top, bot, delta, num_saved: int) returns (bool)
        !           616:        return(num_saved > 0)
        !           617:        end should_id_lines
        !           618: 
        !           619:     scroll = proc (top, bot, delta: int)
        !           620:        d: int := int$abs(delta)
        !           621:        topd: int := top + d
        !           622:        pos: int := bot - d + 1
        !           623:        numshift: int := pos - top
        !           624:        input$copy_wait()
        !           625:        if cdisp
        !           626:           then forget_cursor() end
        !           627:        max: int := 0
        !           628:        for i: int in int$from_to(top, bot) do
        !           629:            line: ldata := lines[i]
        !           630:            if lines[i].len >= hsize
        !           631:               then max := hsize
        !           632:                    break
        !           633:               end
        !           634:            max := int$max(max, line.lim)
        !           635:            end
        !           636:        max := max + 1
        !           637:        vpos := -1
        !           638:        if delta < 0
        !           639:           then % are scrolling up
        !           640:                copy_region(topd, 0, top, 0, pos - top, max)
        !           641:                clear_region(pos, 0, d, max)
        !           642:                repll(temp, 0, al$size(temp), lines, top, d)
        !           643:                for ltemp: ldata in al$elements(temp) do
        !           644:                    zapc(ltemp.line, 0, ltemp.lim+1, ' ')
        !           645:                    ltemp.lim := -1
        !           646:                    ltemp.len := 0
        !           647:                    ltemp.str := ""
        !           648:                    end
        !           649:                shiftl(lines, topd, numshift, delta)
        !           650:                repll(lines, pos, d, temp, 0, d)
        !           651:           else % scrolling down
        !           652:                copy_region(top, 0, topd, 0, pos - top, max)
        !           653:                clear_region(top, 0, d, max)
        !           654:                repll(temp, 0, al$size(temp), lines, pos, d)
        !           655:                for ltemp: ldata in al$elements(temp) do
        !           656:                    zapc(ltemp.line, 0, ltemp.lim+1, ' ')
        !           657:                    ltemp.lim := -1
        !           658:                    ltemp.len := 0
        !           659:                    ltemp.str := ""
        !           660:                    end
        !           661:                shiftl(lines, top, numshift, delta)
        !           662:                repll(lines, top, d, temp, 0, d)
        !           663:           end
        !           664:        end scroll
        !           665: 
        !           666:     should_scroll = proc (delta, num_saved, num_saved0: int) returns (bool)
        !           667:                      signals (clear, id_lines)
        !           668:        return(false)
        !           669:        end should_scroll
        !           670: 
        !           671:     full_scroll = proc (delta: int) returns (bool)
        !           672:        return(false)
        !           673:        end full_scroll
        !           674: 
        !           675:     bell = proc ()
        !           676:        x_feep(0)
        !           677:        end bell
        !           678: 
        !           679:     highlight = proc (flag: bool)
        !           680:        if ~cdisp
        !           681:           then return end
        !           682:        if ~flag
        !           683:           then if high
        !           684:                   then dohigh(vpos, hpos, hvpos, hhpos)
        !           685:                        high := false
        !           686:                   end
        !           687:                return
        !           688:           end
        !           689:        h, v: int, sw: x_window := x_window$query_mouse(w)
        !           690:        h := int$min(int$max(0, (h - 1) / fwidth), hsize)
        !           691:        v := int$min(int$max(0, (v - 1) / fheight), vsize)
        !           692:        if h > 0  cand  ~(v = xvpos  cand  xmpos > xhpos  cand  h > xhpos)
        !           693:           then l: ldata := lines[v]
        !           694:                if h < l.len  cand  string$indexc(l.line[h - 1], " ^&!") > 0
        !           695:                   then i: int := int$max(h + 2, string$size(l.str) + 1)
        !           696:                        oh: int := h
        !           697:                        while true do
        !           698:                            h := _calc_hpos(l.str, i)
        !           699:                            if h <= oh
        !           700:                               then break end
        !           701:                            i := i - 1
        !           702:                            end
        !           703:                   end
        !           704:           end except when bounds: end
        !           705:        if ~high
        !           706:           then dohigh(vpos, hpos, v, h)
        !           707:         elseif v = hvpos  cand  h = hhpos
        !           708:           then return
        !           709:         elseif (v > vpos  cor  (v = vpos  cand  h > hpos))  cand
        !           710:                (hvpos > vpos  cor  (hvpos = vpos  cand  hhpos > hpos))
        !           711:           then dohigh(hvpos, hhpos, v, h)
        !           712:         elseif (v < vpos  cor  (v = vpos  cand  h < hpos))  cand
        !           713:                (hvpos < vpos  cor  (hvpos = vpos  cand  hhpos < hpos))
        !           714:           then dohigh(v, h, hvpos, hhpos)
        !           715:         else dohigh(vpos, hpos, hvpos, hhpos)
        !           716:              dohigh(vpos, hpos, v, h)
        !           717:         end
        !           718:        high := true
        !           719:        hvpos := v
        !           720:        hhpos := h
        !           721:        end highlight
        !           722: 
        !           723:     dohigh = proc (v1, h1, v2, h2: int)
        !           724:        if v1 = v2
        !           725:           then if h1 > h2
        !           726:                   then h1, h2 := h2, h1 end
        !           727:         elseif v1 > v2
        !           728:           then v1, v2 := v2, v1
        !           729:                h1, h2 := h2, h1
        !           730:         end
        !           731:        if h1 < 0
        !           732:           then h1 := 0
        !           733:         elseif h1 > hsize1
        !           734:           then v1 := v1 + 1
        !           735:                h1 := 0
        !           736:         end
        !           737:        if v1 < 0
        !           738:           then v1 := 0
        !           739:                h1 := 0
        !           740:         elseif v1 > vsize1
        !           741:           then v1 := vsize1
        !           742:                h1 := hsize1
        !           743:         elseif v1 = vpos  cand  h1 = hpos
        !           744:           then h1 := h1 + 1 end
        !           745:        if v2 > vsize1
        !           746:           then v2 := vsize1
        !           747:                h2 := hsize1
        !           748:         elseif h2 > hsize
        !           749:           then h2 := hsize end
        !           750:        v: int
        !           751:        if hlmode
        !           752:           then v := 1 + v1 * fheight
        !           753:           else v := (v1 + 1) * fheight
        !           754:           end
        !           755:        while v1 < v2 do
        !           756:            h: int := lines[v1].len
        !           757:            if v1 = xvpos  cand  xmpos > xhpos
        !           758:               then h := xmpos end
        !           759:            if h1 < h
        !           760:               then dohigh1(v, h1, h) end
        !           761:            v := v + fheight
        !           762:            v1 := v1 + 1
        !           763:            h1 := 0
        !           764:            end
        !           765:        h2 := int$min(h2, lines[v2].len)
        !           766:        if v2 = xvpos  cand  xmpos > xhpos
        !           767:           then h2 := xmpos end
        !           768:        if h1 < h2
        !           769:           then dohigh1(v, h1, h2) end
        !           770:        end dohigh
        !           771: 
        !           772:     dohigh1 = proc (v, h1, h2: int)
        !           773:        if hlmode
        !           774:           then x_window$pix_fill(w, 0, nobit, 1 + h1 * fwidth, v,
        !           775:                                  (h2 - h1) * fwidth, fheight, GXinvert,
        !           776:                                  planemask)
        !           777:           else x_window$line(w, 0, 1, 1,
        !           778:                              1 + h1 * fwidth, v, h2 * fwidth, v, GXinvert,
        !           779:                              planemask)
        !           780:           end
        !           781:        end dohigh1
        !           782: 
        !           783:     redisplay = proc (win: x_window, x, y, width, height: int)
        !           784:        if win ~= w
        !           785:           then return end
        !           786:        h1: int := int$max(0, (x - 1) / fwidth)
        !           787:        h2: int := (x + width - 2) / fwidth
        !           788:        if h2 < h1
        !           789:           then return end
        !           790:        v1: int := int$max(0, (y - 1) / fheight)
        !           791:        v2: int := (y + height - 2) / fheight
        !           792:        if cdisp  cand
        !           793:           vpos >= v1  cand  vpos <= v2  cand  hpos >= h1  cand  hpos <= h2
        !           794:           then clear_region(vpos, hpos, 1, 1)
        !           795:                cdisp := false
        !           796:           end
        !           797:        ovpos: int := vpos
        !           798:        ohpos: int := hpos
        !           799:        for lpos: int in int$from_to(v1, v2) do
        !           800:            line: ldata := lines[lpos]
        !           801:            if line.lim < h1
        !           802:               then continue end
        !           803:            reposition(lpos, h1)
        !           804:            outa(line.line, h1, int$min(line.lim, h2) - h1 + 1)
        !           805:            if h2 >= hsize1  cand  line.len >= hsize
        !           806:               then reposition(lpos, hsize1)
        !           807:                    outc('!')
        !           808:               end
        !           809:            end except when bounds: end
        !           810:        if xmpos > xhpos  cand  xmpos > h1  cand  xhpos <= h2  cand
        !           811:           xvpos >= v1  cand  xvpos <= v2
        !           812:           then pos: int := int$max(xhpos, h1)
        !           813:                reposition(xvpos, pos)
        !           814:                outa(xline, pos, int$min(xmpos - 1, h2) - pos + 1)
        !           815:           end
        !           816:        set_cursor_pos(ovpos, ohpos, true)
        !           817:        end redisplay
        !           818: 
        !           819:     unmapped = proc (win: x_window)
        !           820:        if win = w  cand  ow ~= x_window$none()
        !           821:           then w, ow := ow, w
        !           822:                f, of := of, f
        !           823:                fheight, oheight := oheight, fheight
        !           824:                fwidth, owidth := owidth, fwidth
        !           825:                redisplay(w, 1, 1, fwidth * hsize, fheight * vsize)
        !           826:           end
        !           827:        end unmapped
        !           828: 
        !           829:     copy_region = proc (ovpos, ohpos, nvpos, nhpos, height, width: int)
        !           830:        x_window$move_area(w, 1 + ohpos * fwidth, 1 + ovpos * fheight,
        !           831:                           width * fwidth, height * fheight,
        !           832:                           1 + nhpos * fwidth, 1 + nvpos * fheight)
        !           833:        end copy_region
        !           834: 
        !           835:     clear_region = proc (nvpos, nhpos, height, width: int)
        !           836:        x_window$pix_set(w, clearpix, 1 + nhpos * fwidth, 1 + nvpos * fheight,
        !           837:                         width * fwidth, height * fheight)
        !           838:        end clear_region
        !           839: 
        !           840:     outc = proc (c: char)
        !           841:        x_window$text(w, string$c2s(c), f, textpix, clearpix,
        !           842:                      1 + chpos * fwidth, 1 + vpos * fheight)
        !           843:        chpos := chpos + 1
        !           844:        end outc
        !           845: 
        !           846:     outa = proc (a: act, i, z: int) signals (bounds, negative_size)
        !           847:        x_window$texta(w, a, i, z, f, textpix, clearpix,
        !           848:                       1 + chpos * fwidth, 1 + vpos * fheight)
        !           849:        chpos := chpos + z
        !           850:        end outa
        !           851: 
        !           852:     new_cursor = proc ()
        !           853:        cursbits = "\003\000\005\000\011\000\021\000\041\000\101\000" ||
        !           854:                   "\201\000\001\001\001\002\301\003\111\000\225\000" ||
        !           855:                   "\223\000\040\001\040\001\300\000"
        !           856:        maskbits = "\003\000\007\000\017\000\037\000\077\000\177\000" ||
        !           857:                   "\377\000\377\001\377\003\377\003\177\000\367\000" ||
        !           858:                   "\363\000\340\001\340\001\300\000"
        !           859: 
        !           860:        cursor: x_cursor := x_cursor$scons(11, 16,
        !           861:                                           cursbits, maskbits,
        !           862:                                           clearpix, mousepix, 1, 1, mousefunc)
        !           863:        w.cursor := cursor
        !           864:        if ow ~= x_window$none()
        !           865:           then ow.cursor := cursor end
        !           866:        x_cursor$destroy(cursor)
        !           867:        end new_cursor
        !           868: 
        !           869:     end screen

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.