Annotation of 43BSD/contrib/X/CLUlib/x_cons.clu, revision 1.1.1.1

1.1       root        1: % Copyright    Barbara Liskov    1985, 1986
                      2: 
                      3: x_cons = proc (name: string, back, border: x_pixmap, spec, defspec: string,
                      4:               minwidth, minheight, bwidth: int) returns (x_window, int, int)
                      5:     dcount = 2
                      6:     vcount = 1 + (4 * 2 * dcount)
                      7:     fcount = 1 + 4
                      8:     root: x_window := x_display$root()
                      9:     sw: int := x_display$width()
                     10:     sh: int := x_display$height()
                     11:     defwidth, defheight, defx, defy: int, defxplus, defyplus, place: bool :=
                     12:        x_geometry(spec, defspec)
                     13:     defwidth := int$max(defwidth, minwidth)
                     14:     defheight := int$max(defheight, minheight)
                     15:     if ~defxplus
                     16:        then defx := sw - defx - defwidth - 2 * bwidth end
                     17:     if ~defyplus
                     18:        then defy := sh - defy - defheight - 2 * bwidth end
                     19:     if place
                     20:        then x: x_window := x_window$create(defx, defy, defwidth, defheight,
                     21:                                           back, root, bwidth, border)
                     22:            return(x, defwidth, defheight)
                     23:        end
                     24:     prog: string := _get_xjname()
                     25:     fn: string := x_default(prog, "MakeWindow.BodyFont")
                     26:        except when not_found: fn := "8x13" end
                     27:     font: x_font := x_font$create(fn)
                     28:     fwidth, fheight: int, f, l: char, bs: int, x: bool := x_font$query(font)
                     29:     pfore: int := WhitePixel
                     30:     pback: int := BlackPixel
                     31:     if x_default(prog, "MakeWindow.ReverseVideo") = "on"
                     32:        then pfore := BlackPixel
                     33:            pback := WhitePixel
                     34:        end except when not_found: end
                     35:     bpix: int := pback
                     36:     mfore: int := pback
                     37:     mback: int := pfore
                     38:     pbw: int := int$parse(x_default(prog, "MakeWindow.BorderWidth"))
                     39:        except when not_found, overflow, bad_format: pbw := 1 end
                     40:     ibw: int := int$parse(x_default(prog, "MakeWindow.InternalBorder"))
                     41:        except when not_found, overflow, bad_format: ibw := 1 end
                     42:     freeze: bool := x_default(prog, "MakeWindow.Freeze") = "on"
                     43:        except when not_found: freeze := false end
                     44:     clip: bool := x_default(prog, "MakeWindow.ClipToScreen") = "on"
                     45:        except when not_found: clip := false end
                     46:     if x_display$cells() > 2
                     47:        then begin
                     48:                r, g, b: int := x_parse_color(
                     49:                                    x_default(prog, "MakeWindow.Foreground"))
                     50:                pfore := x_display$alloc_color(r, g, b)
                     51:                end except others: end
                     52:            begin
                     53:                r, g, b: int := x_parse_color(
                     54:                                    x_default(prog, "MakeWindow.Background"))
                     55:                pback := x_display$alloc_color(r, g, b)
                     56:                end except others: end
                     57:            begin
                     58:                r, g, b: int := x_parse_color(
                     59:                                    x_default(prog, "MakeWindow.Border"))
                     60:                bpix := x_display$alloc_color(r, g, b)
                     61:                end except others: end
                     62:            begin
                     63:                r, g, b: int := x_parse_color(
                     64:                                    x_default(prog, "MakeWindow.Mouse"))
                     65:                mfore := x_display$alloc_color(r, g, b)
                     66:                end except others: end
                     67:            begin
                     68:                r, g, b: int := x_parse_color(
                     69:                                    x_default(prog, "MakeWindow.MouseMask"))
                     70:                mback := x_display$alloc_color(r, g, b)
                     71:                end except others: end
                     72:        end
                     73:     cr: x_cursor := x_cursor$scons(cross_width, cross_height,
                     74:                                   cross, cross_mask, mback, mfore,
                     75:                                   cross_x, cross_y, GXcopy)
                     76:     events: int := ButtonPressed + ButtonReleased
                     77:     if freeze
                     78:        then events := events + MouseMoved end
                     79:     while true do
                     80:        x_window$grab_mouse(root, events, cr)
                     81:           except when error (*):
                     82:                       sleep(1)
                     83:                       continue
                     84:                  end
                     85:        break
                     86:        end
                     87:     popw: int := x_font$width(font, name) + 2 * ibw
                     88:     poph: int := fheight + 2 * ibw
                     89:     count: int := vcount
                     90:     save: x_pixmap := x_pixmap$none()
                     91:     if freeze
                     92:        then x_display$grab()
                     93:            count := fcount
                     94:            save := x_window$save_region(root, 0, 0,
                     95:                                         popw + 2 * pbw, poph + 2 * pbw)
                     96:               except when error (*): end
                     97:        end
                     98:     box: x_vlist := x_vlist$create(count)
                     99:     backmap: x_pixmap := x_pixmap$tile(pback)
                    100:     bdrmap: x_pixmap := x_pixmap$tile(bpix)
                    101:     pop: x_window := x_window$create(0, 0, popw, poph, backmap,
                    102:                                     root, pbw, bdrmap)
                    103:     x_window$map(pop)
                    104:     x_window$text(pop, name, font, pfore, pback, ibw, ibw)
                    105:     x1, y1: int, bw: x_window := x_window$query_mouse(root)
                    106:     mindim: int := 2 * bwidth - 1
                    107:     minwidth := minwidth + mindim
                    108:     minheight := minheight + mindim
                    109:     x2: int := x1 + minwidth
                    110:     y2: int := y1 + minheight
                    111:     width: int := minwidth
                    112:     height: int := minheight
                    113:     but: int := -1
                    114:     stop: bool := false
                    115:     xa: int := -1
                    116:     ya: int := -1
                    117:     xb: int := -1
                    118:     yb: int := -1
                    119:     e: event := x_input$empty_event()
                    120:     doit: bool := true
                    121:     while ~stop do
                    122:        if xb ~= int$max(x1, x2)  cor  yb ~= int$max(y1, y2)  cor
                    123:           xa ~= int$min(x1, x2)  cor  ya ~= int$min(y1, y2)
                    124:           then if freeze  cand  ~doit
                    125:                   then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1)
                    126:                   end
                    127:                xa := int$min(x1, x2)
                    128:                ya := int$min(y1, y2)
                    129:                xb := int$max(x1, x2)
                    130:                yb := int$max(y1, y2)
                    131:                for i: int in int$from_to_by(1, count, 4) do
                    132:                    x_vlist$store(box, i, xa, ya, 0)
                    133:                    if i = count
                    134:                       then break end
                    135:                    x_vlist$store(box, i + 1, xb, ya, 0)
                    136:                    x_vlist$store(box, i + 2, xb, yb, 0)
                    137:                    x_vlist$store(box, i + 3, xa, yb, 0)
                    138:                    end
                    139:                doit := true
                    140:           end
                    141:        if doit
                    142:           then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1)
                    143:                doit := ~freeze
                    144:           end
                    145:        if freeze  cor  x_input$pending()
                    146:           then x_input$deq(e)
                    147:                x2 := e.x
                    148:                y2 := e.y
                    149:                if but < 0  cand  e.kind = ButtonPressed
                    150:                   then but := e.value
                    151:                        if but = LeftButton
                    152:                           then x1 := defx
                    153:                                y1 := defy
                    154:                           else x1 := x2
                    155:                                y1 := y2
                    156:                           end
                    157:                 elseif but >= 0  cand  e.kind = ButtonReleased  cand
                    158:                        e.value = but
                    159:                   then stop := true
                    160:                 else x2, y2, bw := x_window$query_mouse(root) end
                    161:           else x2, y2, bw := x_window$query_mouse(root)
                    162:           end
                    163:        if but < 0  cor  but = RightButton
                    164:           then x1 := x2
                    165:                y1 := y2
                    166:           end
                    167:        if but = LeftButton  cor  but = RightButton
                    168:           then if clip
                    169:                   then x2 := int$min(int$max(sw - x1 - mindim - 1, 0), defwidth)
                    170:                        y2 := int$min(int$max(sh - y1 - mindim - 1, 0), defheight)
                    171:                   else x2 := defwidth
                    172:                        y2 := defheight
                    173:                   end
                    174:                x2 := x1 + x2 + mindim
                    175:                y2 := y1 + y2 + mindim
                    176:           end
                    177:        width := int$max(int$abs(x2 - x1), minwidth)
                    178:        if x2 < x1
                    179:           then x2 := x1 - width
                    180:           else x2 := x1 + width
                    181:           end
                    182:        height := int$max(int$abs(y2 - y1), minheight)
                    183:        if y2 < y1
                    184:           then y2 := y1 - height
                    185:           else y2 := y1 + height
                    186:           end
                    187:        end
                    188:     if freeze
                    189:        then x_window$draw(root, box, count, 0, 1, 1, GXinvert, 1) end
                    190:     x_window$ungrab_mouse()
                    191:     if save ~= x_pixmap$none()
                    192:        then x_window$unmap_transparent(pop)
                    193:            x_window$pixmap_put(root, save, 0, 0, popw + 2 * pbw,
                    194:                                poph + 2 * pbw, 0, 0, GXcopy, -1)
                    195:            x_pixmap$destroy(save)
                    196:        end
                    197:     x_window$destroy(pop)
                    198:     if freeze
                    199:        then x_display$ungrab() end
                    200:     x_font$destroy(font)
                    201:     x_cursor$destroy(cr)
                    202:     x_pixmap$destroy(backmap)
                    203:     x_pixmap$destroy(bdrmap)
                    204:     width := width - mindim
                    205:     height := height - mindim
                    206:     w: x_window := x_window$create(int$min(x1, x2), int$min(y1, y2),
                    207:                                   width, height, back, root, bwidth, border)
                    208:     return(w, width, height)
                    209:     end x_cons

unix.superglobalmegacorp.com

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