Annotation of 43BSD/contrib/X/xted/input.clu, revision 1.1.1.1

1.1       root        1: input = cluster is peek,               % peek a char
                      2:                   getc,                % read a char
                      3:                   pending,             % any input ready ?
                      4:                   pending_wait,        % wait a while for input
                      5:                   copy_wait,           % wait for raster_copy done
                      6:                   push,                % push back on input
                      7:                   in_macro,            % test if in macro
                      8:                   still_macro,         % test if still macro chars
                      9:                   push_macro,          % push macro back on input
                     10:                   flush_macro,         % flush any macro input
                     11:                   bpos,                % button position
                     12:                   set_highlight,       % control highlight
                     13:                   chan,                % input chan
                     14:                   reset
                     15: 
                     16:     rep = null          % own data is what is important
                     17: 
                     18:     inputs = KeyPressed + ButtonPressed + ButtonReleased
                     19:     exposures = ExposeRegion + ExposeWindow + ExposeCopy
                     20: 
                     21:     downs = sequence[string]$["\362\361\363\366\360\365\370\370",
                     22:                              "\355\351\352\356\350\353\357\357",
                     23:                              "\354\342\344\346\341\345\347\347"]
                     24:     ups = sequence[string]$["\322\321\323\326\320\325\330\330",
                     25:                            "\315\311\312\316\310\313\317\317",
                     26:                            "\314\302\304\306\301\305\307\307"]
                     27: 
                     28:     own peeks: act
                     29:     own rstart: int
                     30:     own copies: int
                     31:     own dones: int
                     32:     own xpos: int
                     33:     own ypos: int
                     34:     own highlight: bool
                     35:     own ev: event
                     36: 
                     37:     peek = proc () returns (char)
                     38:        return(act$top(peeks))
                     39:           except when bounds: end
                     40:        c: char := getchar()
                     41:        act$addh(peeks, c)
                     42:        return(c)
                     43:        end peek
                     44: 
                     45:     getc = proc () returns (char)
                     46:        if act$empty(peeks)
                     47:           then return(getchar())
                     48:           else return(act$remh(peeks))
                     49:           end
                     50:        end getc
                     51: 
                     52:     pending = proc () returns (bool)
                     53:        return(~act$empty(peeks)  cor  cpending())
                     54:        end pending
                     55: 
                     56:     pending_wait = proc () returns (bool)
                     57:        if ~act$empty(peeks)
                     58:           then return(true)
                     59:           else for i: int in int$from_to_by(1000, 1, -1) do
                     60:                    if cpending()
                     61:                       then return(true) end
                     62:                    end
                     63:                return(false)
                     64:           end
                     65:        end pending_wait
                     66: 
                     67:     copy_wait = proc ()
                     68:        copies := copies + 1
                     69:        while copies > dones do
                     70:            x_input$mdeq(exposures, ev)
                     71:            if ev.kind = ExposeCopy
                     72:               then dones := dones + 1
                     73:               else screen$redisplay(ev.win, ev.x, ev.y, ev.x0, ev.y0)
                     74:               end
                     75:            end
                     76:        end copy_wait
                     77: 
                     78:     cpending = proc () returns (bool)
                     79:        while x_input$pending() do
                     80:            x_input$deq(ev)
                     81:            if ev.kind = KeyPressed
                     82:               then act$addh(peeks, x_keymap$getc(ev.value, ev.mask))
                     83:                       except when none: continue
                     84:                              when multi (s: string):
                     85:                                   for i: int in int$from_to_by(string$size(s), 1, -1) do
                     86:                                       act$addh(peeks, s[i])
                     87:                                       end
                     88:                              end
                     89:                    return(true)
                     90:               end
                     91:            if ev.kind = ButtonPressed
                     92:               then act$addh(peeks, downs[ev.value + 1][ev.mask / 2**12 + 1])
                     93:                    xpos, ypos := screen$position(ev.x, ev.y)
                     94:                    act$addh(peeks, esc)
                     95:                    return(true)
                     96:               end
                     97:            if ev.kind = ButtonReleased
                     98:               then act$addh(peeks, ups[ev.value + 1][ev.mask / 2**12 + 1])
                     99:                    xpos, ypos := screen$position(ev.x, ev.y)
                    100:                    act$addh(peeks, esc)
                    101:                    return(true)
                    102:               end
                    103:            if ev.kind = ExposeCopy
                    104:               then dones := dones + 1
                    105:             elseif ev.kind = UnmapWindow
                    106:               then copies := copies - 1
                    107:                    copy_wait()
                    108:                    screen$unmapped(ev.win)
                    109:             elseif ev.kind ~= MouseMoved
                    110:               then screen$redisplay(ev.win, ev.x, ev.y, ev.x0, ev.y0) end
                    111:            end
                    112:        return(false)
                    113:        end cpending
                    114: 
                    115:     getchar = proc () returns (char)
                    116:        rstart := -1
                    117:        high: bool := false
                    118:        while true do
                    119:            if highlight  cand  ~high  cand  ~x_input$pending()
                    120:               then high := true
                    121:                    screen$highlight(true)
                    122:               end
                    123:            x_input$deq(ev)
                    124:            if ev.kind = MouseMoved
                    125:               then if highlight
                    126:                       then high := true
                    127:                            screen$highlight(true)
                    128:                       end
                    129:                    continue
                    130:               end
                    131:            if high
                    132:               then high := false
                    133:                    screen$highlight(false)
                    134:               end
                    135:            if ev.kind = KeyPressed
                    136:               then return(x_keymap$getc(ev.value, ev.mask))
                    137:                       except when none: continue
                    138:                              when multi (s: string):
                    139:                                   for i: int in int$from_to_by(string$size(s), 2, -1) do
                    140:                                       act$addh(peeks, s[i])
                    141:                                       end
                    142:                                   return(s[1])
                    143:                              end
                    144:               end
                    145:            if ev.kind = ButtonPressed
                    146:               then act$addh(peeks, downs[ev.value + 1][ev.mask / 2**12 + 1])
                    147:                    xpos, ypos := screen$position(ev.x, ev.y)
                    148:                    return(esc)
                    149:               end
                    150:            if ev.kind = ButtonReleased
                    151:               then act$addh(peeks, ups[ev.value + 1][ev.mask / 2**12 + 1])
                    152:                    xpos, ypos := screen$position(ev.x, ev.y)
                    153:                    return(esc)
                    154:               end
                    155:            if ev.kind = ExposeCopy
                    156:               then dones := dones + 1
                    157:             elseif ev.kind = UnmapWindow
                    158:               then copies := copies - 1
                    159:                    copy_wait()
                    160:                    screen$unmapped(ev.win)
                    161:             else screen$redisplay(ev.win, ev.x, ev.y, ev.x0, ev.y0) end
                    162:            end
                    163:        end getchar
                    164: 
                    165:     push = proc (c: char)
                    166:        if rstart > act$size(peeks)
                    167:           then rstart := -1 end
                    168:        act$addh(peeks, c)
                    169:        end push
                    170: 
                    171:     in_macro = proc () returns (bool)
                    172:        return(rstart >= 0 cand rstart <= act$size(peeks))
                    173:        end in_macro
                    174: 
                    175:     still_macro = proc () returns (bool)
                    176:        return(rstart >= 0 cand rstart < act$size(peeks))
                    177:        end still_macro
                    178: 
                    179:     push_macro = proc (s: string)
                    180:        if ~string$empty(s)
                    181:           then z: int := act$size(peeks)
                    182:                if rstart < 0 cor rstart > z then rstart := z end
                    183:                for i: int in int$from_to_by(string$size(s), 1, -1) do
                    184:                    act$addh(peeks, s[i])
                    185:                    end
                    186:           end
                    187:        end push_macro
                    188: 
                    189:     flush_macro = proc () returns (string)
                    190:        s: string
                    191:        if rstart >= 0 cand rstart < act$size(peeks)
                    192:           then s := _cvt[_bytevec, string](
                    193:                                _bytevec$create(act$size(peeks) - rstart))
                    194:                for i: int in int$from_to(1, string$size(s)) do
                    195:                    _cvt[string, _bytevec](s)[i] := act$remh(peeks)
                    196:                    end
                    197:           else s := ""
                    198:           end
                    199:        rstart := -1
                    200:        return(s)
                    201:        end flush_macro
                    202: 
                    203:     bpos = proc () returns (int, int)
                    204:        return(xpos, ypos)
                    205:        end bpos
                    206: 
                    207:     set_highlight = proc (flag: bool)
                    208:        highlight := flag
                    209:        end set_highlight
                    210: 
                    211:     chan = proc () returns (_chan)
                    212:        return(_chan$nul())
                    213:        end chan
                    214: 
                    215:     reset = proc ()
                    216:        x_keymap$load("")
                    217:        peeks := act$new()
                    218:        rstart := -1
                    219:        copies := -1
                    220:        dones := 0
                    221:        xpos := 0
                    222:        ypos := 0
                    223:        highlight := false
                    224:        ev := x_input$empty_event()
                    225:        end reset
                    226: 
                    227:     end input

unix.superglobalmegacorp.com

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