Annotation of 43BSD/contrib/X/xted/screen.clu, revision 1.1.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.