|
|
1.1 ! root 1: % Copyright Barbara Liskov 1985 ! 2: ! 3: x_display = cluster is init, ! 4: root, width, height, device, protocol, planes, cells, ! 5: grab, ungrab, ! 6: alloc_color, alloc_cell, alloc_cells, ! 7: free_color, free_colors, ! 8: store_color, store_colors, query_color, lookup_color, ! 9: black, white ! 10: ! 11: rep = null ! 12: ! 13: own base: x_window ! 14: own rwidth: int ! 15: own rheight: int ! 16: own devid: int ! 17: own numproto: int ! 18: own numplanes: int ! 19: own numcells: int ! 20: own haveblack: bool ! 21: own blackp: x_pixmap ! 22: own havewhite: bool ! 23: own whitep: x_pixmap ! 24: own colbuf: _bytevec ! 25: ! 26: init = proc (display: string) signals (error(string)) ! 27: qw = sequence[_wordvec] ! 28: if string$empty(display) ! 29: then display := _environ("DISPLAY") ! 30: except when not_found: end ! 31: end ! 32: num: int := string$indexc(':', display) ! 33: if num ~= 0 ! 34: then display, num := string$substr(display, 1, num - 1), ! 35: int$parse(string$rest(display, num + 1)) ! 36: end ! 37: addrs: qw := qw$new() ! 38: if string$empty(display) cor display = "unix" ! 39: then addrs := qw$addh(addrs, ! 40: _cvt[string, _wordvec]("\001\000/dev/X" || ! 41: int$unparse(num))) ! 42: end ! 43: if string$empty(display) cor display ~= "unix" ! 44: then if string$empty(display) ! 45: then display := _host_name() end ! 46: l, r: int := host_address(display) ! 47: except when not_found, bad_address: signal error("bad host") end ! 48: addr: _wordvec := _wordvec$create(4) ! 49: _wordvec$wstore(addr, 1, 2) ! 50: num := num + 5800 ! 51: _wordvec$bstore(addr, 3, num / 2**8) ! 52: _wordvec$bstore(addr, 4, num) ! 53: _wordvec$wstore(addr, 5, r) ! 54: _wordvec$wstore(addr, 7, l) ! 55: addrs := qw$addh(addrs, addr) ! 56: end ! 57: err: string := "" ! 58: for addr: _wordvec in qw$elements(addrs) do ! 59: x_buf$init(addr) ! 60: except when error (why: string): ! 61: err := why ! 62: continue ! 63: end ! 64: err := "" ! 65: break ! 66: end ! 67: if ~string$empty(err) ! 68: then signal error(err) end ! 69: or: oreq, er: ereq := x_buf$get() ! 70: er.code := x_setup ! 71: x_buf$receive() ! 72: base := _cvt[int, x_window](x_buf$get_lp0()) ! 73: rwidth := 0 ! 74: rheight := 0 ! 75: numproto := x_buf$get_sp2() ! 76: devid := x_buf$get_sp3() ! 77: numplanes := x_buf$get_sp4() ! 78: numcells := x_buf$get_sp5() // 2**16 ! 79: haveblack := false ! 80: havewhite := false ! 81: colbuf := _bytevec$create(8) ! 82: x_input$init() ! 83: end init ! 84: ! 85: root = proc () returns (x_window) ! 86: return(base) ! 87: end root ! 88: ! 89: width = proc () returns (int) ! 90: if rwidth = 0 ! 91: then x, y, w, h, b, s, k: int, i: x_window := x_window$query(base) ! 92: rwidth := w ! 93: rheight := h ! 94: end ! 95: return(rwidth) ! 96: end width ! 97: ! 98: height = proc () returns (int) ! 99: if rheight = 0 ! 100: then x, y, w, h, b, s, k: int, i: x_window := x_window$query(base) ! 101: rwidth := w ! 102: rheight := h ! 103: end ! 104: return(rheight) ! 105: end height ! 106: ! 107: device = proc () returns (int) ! 108: return(devid) ! 109: end device ! 110: ! 111: protocol = proc () returns (int) ! 112: return(numproto) ! 113: end protocol ! 114: ! 115: planes = proc () returns (int) ! 116: return(numplanes) ! 117: end planes ! 118: ! 119: cells = proc () returns (int) ! 120: return(numcells) ! 121: end cells ! 122: ! 123: grab = proc () ! 124: or: oreq, er: ereq := x_buf$get() ! 125: er.code := x_grabserver ! 126: end grab ! 127: ! 128: ungrab = proc () ! 129: or: oreq, er: ereq := x_buf$get() ! 130: er.code := x_ungrabserver ! 131: end ungrab ! 132: ! 133: alloc_color = proc (red, green, blue: int) returns (int) ! 134: signals (error(string)) ! 135: or: oreq, er: ereq := x_buf$get() ! 136: er.code := x_getcolor ! 137: er.s0 := red ! 138: or.s1 := green ! 139: er.s2 := blue ! 140: x_buf$receive() ! 141: resignal error ! 142: return(x_buf$get_sp0() // 2**16) ! 143: end alloc_color ! 144: ! 145: alloc_cell = proc () returns (int) signals (error(string)) ! 146: or: oreq, er: ereq := x_buf$get() ! 147: er.code := x_getcolorcells ! 148: er.s0 := 1 ! 149: or.s1 := 0 ! 150: x_buf$receive() ! 151: resignal error ! 152: b: _bytevec := _bytevec$create(2) ! 153: x_buf$receive_data(b) ! 154: return(_wordvec$wfetch(b2w(b), 1)) ! 155: end alloc_cell ! 156: ! 157: alloc_cells = proc (ncolors, nplanes: int, contig: bool) ! 158: returns (pixellist, int) signals (error(string)) ! 159: or: oreq, er: ereq := x_buf$get() ! 160: if contig ! 161: then er.code := x_getcolorcells + (1 * 2**8) ! 162: else er.code := x_getcolorcells ! 163: end ! 164: er.s0 := ncolors ! 165: or.s1 := nplanes ! 166: x_buf$receive() ! 167: resignal error ! 168: mask: int := x_buf$get_sp0() // 2**16 ! 169: pixels: pixellist := pixellist$fill(1, ncolors, 0) ! 170: if ncolors > 0 ! 171: then b: _bytevec := _bytevec$create(ncolors * 2) ! 172: x_buf$receive_data(b) ! 173: for i: int in int$from_to_by(ncolors, 1, -1) do ! 174: pixels[i] := _wordvec$wfetch(b2w(b), i * 2 - 1) ! 175: end ! 176: end ! 177: return(pixels, mask) ! 178: end alloc_cells ! 179: ! 180: free_color = proc (pixel: int) ! 181: or: oreq, er: ereq := x_buf$get() ! 182: er.code := x_freecolors ! 183: or.mask := 0 ! 184: er.s0 := 1 ! 185: b: _bytevec := _bytevec$create(2) ! 186: _wordvec$wstore(b2w(b), 1, pixel) ! 187: x_buf$send_data(b, 1, 2) ! 188: end free_color ! 189: ! 190: free_colors = proc (pixels: pixellist, mask: int) ! 191: or: oreq, er: ereq := x_buf$get() ! 192: er.code := x_freecolors ! 193: or.mask := mask ! 194: er.s0 := pixellist$size(pixels) ! 195: b: _bytevec := _bytevec$create(pixellist$size(pixels) * 2) ! 196: i: int := 1 ! 197: for pixel: int in pixellist$elements(pixels) do ! 198: _wordvec$wstore(b2w(b), i, pixel) ! 199: i := i + 2 ! 200: end ! 201: x_buf$send_data(b, 1, _bytevec$size(b)) ! 202: end free_colors ! 203: ! 204: store_color = proc (pixel, red, green, blue: int) ! 205: or: oreq, er: ereq := x_buf$get() ! 206: er.code := x_storecolors ! 207: er.s0 := 1 ! 208: _wordvec$wstore(b2w(colbuf), 1, pixel) ! 209: _wordvec$wstore(b2w(colbuf), 3, red) ! 210: _wordvec$wstore(b2w(colbuf), 5, green) ! 211: _wordvec$wstore(b2w(colbuf), 7, blue) ! 212: x_buf$send_data(colbuf, 1, 8) ! 213: end store_color ! 214: ! 215: store_colors = proc (defs: colordeflist) ! 216: or: oreq, er: ereq := x_buf$get() ! 217: er.code := x_storecolors ! 218: er.s0 := colordeflist$size(defs) ! 219: z: int := colordeflist$size(defs) * 8 ! 220: if _bytevec$size(colbuf) < z ! 221: then colbuf := _bytevec$create(z) end ! 222: i: int := 1 ! 223: for def: colordef in colordeflist$elements(defs) do ! 224: _wordvec$wstore(b2w(colbuf), i, def.pixel) ! 225: _wordvec$wstore(b2w(colbuf), i + 2, def.red) ! 226: _wordvec$wstore(b2w(colbuf), i + 4, def.green) ! 227: _wordvec$wstore(b2w(colbuf), i + 6, def.blue) ! 228: i := i + 8 ! 229: end ! 230: x_buf$send_data(colbuf, 1, z) ! 231: end store_colors ! 232: ! 233: query_color = proc (pixel: int) returns (int, int, int) signals (error(string)) ! 234: or: oreq, er: ereq := x_buf$get() ! 235: er.code := x_querycolor ! 236: er.s0 := pixel ! 237: x_buf$receive() ! 238: resignal error ! 239: return(x_buf$get_sp0() // 2**16, ! 240: x_buf$get_sp1() // 2**16, ! 241: x_buf$get_sp2() // 2**16) ! 242: end query_color ! 243: ! 244: lookup_color = proc (name: string) returns (int, int, int, int, int, int) ! 245: signals (error(string)) ! 246: or: oreq, er: ereq := x_buf$get() ! 247: er.code := x_lookupcolor ! 248: er.s0 := string$size(name) ! 249: x_buf$send_data(s2b(name), 1, string$size(name)) ! 250: x_buf$receive() ! 251: resignal error ! 252: return(x_buf$get_sp0() // 2**16, ! 253: x_buf$get_sp1() // 2**16, ! 254: x_buf$get_sp2() // 2**16, ! 255: x_buf$get_sp3() // 2**16, ! 256: x_buf$get_sp4() // 2**16, ! 257: x_buf$get_sp5() // 2**16) ! 258: end lookup_color ! 259: ! 260: black = proc () returns (x_pixmap) ! 261: if ~haveblack ! 262: then blackp := x_pixmap$tile(BlackPixel) ! 263: haveblack := true ! 264: end ! 265: return(blackp) ! 266: end black ! 267: ! 268: white = proc () returns (x_pixmap) ! 269: if ~havewhite ! 270: then whitep := x_pixmap$tile(WhitePixel) ! 271: havewhite := true ! 272: end ! 273: return(whitep) ! 274: end white ! 275: ! 276: end x_display
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.