home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2796 < prev    next >
Internet Message Format  |  1991-02-19  |  62KB

  1. From: guido@cwi.nl (Guido van Rossum)
  2. Newsgroups: alt.sources
  3. Subject: Python 0.9.1 part 04/21
  4. Message-ID: <2966@charon.cwi.nl>
  5. Date: 19 Feb 91 17:41:26 GMT
  6.  
  7. : This is a shell archive.
  8. : Extract with 'sh this_file'.
  9. :
  10. : Extract part 01 first since it makes all directories
  11. echo 'Start of pack.out, part 04 out of 21:'
  12. if test -s 'demo/sgi/gl_panel/flying/freeze.s'
  13. then echo '*** I will not over-write existing file demo/sgi/gl_panel/flying/freeze.s'
  14. else
  15. echo 'x - demo/sgi/gl_panel/flying/freeze.s'
  16. sed 's/^X//' > 'demo/sgi/gl_panel/flying/freeze.s' << 'EOF'
  17. X;;; This file was automatically generated by the panel editor.
  18. X;;; If you read it into gnu emacs, it will automagically format itself.
  19. X
  20. X(panel (prop help creator:user-panel-help)
  21. X(prop user-panel #t)
  22. X(label "frames per second")
  23. X(al (pnl_toggle_button (name "freeze")
  24. X(prop help creator:user-act-help)
  25. X(label "freeze")
  26. X(x 0.25)
  27. X(y 4.3)
  28. X(w 1.45)
  29. X(h 0.6)
  30. X(labeltype 16)
  31. X(downfunc move-then-resize)
  32. X)
  33. X(pnl_scale_chart (name "mystrip")
  34. X(prop help creator:user-act-help)
  35. X(x 0.25)
  36. X(y 0.25)
  37. X(downfunc move-then-resize)
  38. X)
  39. X)
  40. X)
  41. X;;; Local Variables:
  42. X;;; mode: scheme
  43. X;;; eval: (save-excursion (goto-char (point-min)) (kill-line 3))
  44. X;;; eval: (save-excursion (goto-char (point-min)) (replace-regexp "[ \n]*)" ")"))
  45. X;;; eval: (indent-region (point-min) (point-max) nil)
  46. X;;; eval: (progn (kill-line -3) (delete-backward-char 1) (save-buffer))
  47. X;;; End:
  48. EOF
  49. fi
  50. if test -s 'src/cstubs'
  51. then echo '*** I will not over-write existing file src/cstubs'
  52. else
  53. echo 'x - src/cstubs'
  54. sed 's/^X//' > 'src/cstubs' << 'EOF'
  55. X/*
  56. XInput used to generate the Python module "glmodule.c".
  57. XThe stub generator is a Python script called "cgen".
  58. X
  59. XEach definition must be contained on one line:
  60. X
  61. X<returntype> <name> <type> <arg> <type> <arg>
  62. X
  63. X<returntype> can be: void, short, long (XXX maybe others?)
  64. X
  65. X<type> can be: char, string, short, float, long, or double
  66. X    string indicates a null terminated string;
  67. X    if <type> is char and <arg> begins with a *, the * is stripped
  68. X    and <type> is changed into string
  69. X
  70. X<arg> has the form <mode> or <mode>[<subscript>]
  71. X    where <mode> can be
  72. X        s: arg is sent
  73. X        r: arg is received        (arg is a pointer)
  74. X    and <subscript> can be (N and I are numbers):
  75. X        N
  76. X        argI
  77. X        retval
  78. X        N*argI
  79. X        N*retval
  80. X*/
  81. X
  82. X#include <gl.h>
  83. X#include <device.h>
  84. X
  85. X#include "allobjects.h"
  86. X#include "import.h"
  87. X#include "modsupport.h"
  88. X#include "cgensupport.h"
  89. X
  90. X/*
  91. XSome stubs are too complicated for the stub generator.
  92. XWe can include manually written versions of them here.
  93. XA line starting with '%' gives the name of the function so the stub
  94. Xgenerator can include it in the table of functions.
  95. X*/
  96. X
  97. X/*
  98. Xvarray -- an array of v.. calls.
  99. XThe argument is an array (maybe list or tuple) of points.
  100. XEach point must be a tuple or list of coordinates (x, y, z).
  101. XThe points may be 2- or 3-dimensional but must all have the
  102. Xsame dimension.  Float and int values may be mixed however.
  103. XThe points are always converted to 3D double precision points
  104. Xby assuming z=0.0 if necessary (as indicated in the man page),
  105. Xand for each point v3d() is called.
  106. X*/
  107. X
  108. X% varray
  109. X
  110. Xstatic object *
  111. Xgl_varray(self, args)
  112. X    object *self;
  113. X    object *args;
  114. X{
  115. X    object *v, *w;
  116. X    int i, n, width;
  117. X    double vec[3];
  118. X    object * (*getitem) FPROTO((object *, int));
  119. X    
  120. X    if (!getiobjectarg(args, 1, 0, &v))
  121. X        return NULL;
  122. X    
  123. X    if (is_listobject(v)) {
  124. X        n = getlistsize(v);
  125. X        getitem = getlistitem;
  126. X    }
  127. X    else if (is_tupleobject(v)) {
  128. X        n = gettuplesize(v);
  129. X        getitem = gettupleitem;
  130. X    }
  131. X    else {
  132. X        err_badarg();
  133. X        return NULL;
  134. X    }
  135. X    
  136. X    if (n == 0) {
  137. X        INCREF(None);
  138. X        return None;
  139. X    }
  140. X    if (n > 0)
  141. X        w = (*getitem)(v, 0);
  142. X    
  143. X    width = 0;
  144. X    if (w == NULL) {
  145. X    }
  146. X    else if (is_listobject(w)) {
  147. X        width = getlistsize(w);
  148. X    }
  149. X    else if (is_tupleobject(w)) {
  150. X        width = gettuplesize(w);
  151. X    }
  152. X    
  153. X    switch (width) {
  154. X    case 2:
  155. X        vec[2] = 0.0;
  156. X        /* Fall through */
  157. X    case 3:
  158. X        break;
  159. X    default:
  160. X        err_badarg();
  161. X        return NULL;
  162. X    }
  163. X    
  164. X    for (i = 0; i < n; i++) {
  165. X        w = (*getitem)(v, i);
  166. X        if (!getidoublearray(w, 1, 0, width, vec))
  167. X            return NULL;
  168. X        v3d(vec);
  169. X    }
  170. X    
  171. X    INCREF(None);
  172. X    return None;
  173. X}
  174. X
  175. X/*
  176. Xvnarray, nvarray -- an array of n3f and v3f calls.
  177. XThe argument is an array (list or tuple) of pairs of points and normals.
  178. XEach pair is a tuple (NOT a list) of a point and a normal for that point.
  179. XEach point or normal must be a tuple (NOT a list) of coordinates (x, y, z).
  180. XThree coordinates must be given.  Float and int values may be mixed.
  181. XFor each pair, n3f() is called for the normal, and then v3f() is called
  182. Xfor the vector.
  183. X
  184. Xvnarray and nvarray differ only in the order of the vector and normal in
  185. Xthe pair: vnarray expects (v, n) while nvarray expects (n, v).
  186. X*/
  187. X
  188. Xstatic object *gen_nvarray(); /* Forward */
  189. X
  190. X% nvarray
  191. X
  192. Xstatic object *
  193. Xgl_nvarray(self, args)
  194. X    object *self;
  195. X    object *args;
  196. X{
  197. X    return gen_nvarray(args, 0);
  198. X}
  199. X
  200. X% vnarray
  201. X
  202. Xstatic object *
  203. Xgl_vnarray(self, args)
  204. X    object *self;
  205. X    object *args;
  206. X{
  207. X    return gen_nvarray(args, 1);
  208. X}
  209. X
  210. X/* Generic, internal version of {nv,nv}array: inorm indicates the
  211. X   argument order, 0: normal first, 1: vector first. */
  212. X
  213. Xstatic object *
  214. Xgen_nvarray(args, inorm)
  215. X    object *args;
  216. X    int inorm;
  217. X{
  218. X    object *v, *w, *wnorm, *wvec;
  219. X    int i, n;
  220. X    float norm[3], vec[3];
  221. X    object * (*getitem) FPROTO((object *, int));
  222. X    
  223. X    if (!getiobjectarg(args, 1, 0, &v))
  224. X        return NULL;
  225. X    
  226. X    if (is_listobject(v)) {
  227. X        n = getlistsize(v);
  228. X        getitem = getlistitem;
  229. X    }
  230. X    else if (is_tupleobject(v)) {
  231. X        n = gettuplesize(v);
  232. X        getitem = gettupleitem;
  233. X    }
  234. X    else {
  235. X        err_badarg();
  236. X        return NULL;
  237. X    }
  238. X    
  239. X    for (i = 0; i < n; i++) {
  240. X        w = (*getitem)(v, i);
  241. X        if (!is_tupleobject(w) || gettuplesize(w) != 2) {
  242. X            err_badarg();
  243. X            return NULL;
  244. X        }
  245. X        wnorm = gettupleitem(w, inorm);
  246. X        wvec = gettupleitem(w, 1 - inorm);
  247. X        if (!getifloatarray(wnorm, 1, 0, 3, norm) ||
  248. X            !getifloatarray(wvec, 1, 0, 3, vec))
  249. X            return NULL;
  250. X        n3f(norm);
  251. X        v3f(vec);
  252. X    }
  253. X    
  254. X    INCREF(None);
  255. X    return None;
  256. X}
  257. X
  258. X/* nurbssurface(s_knots[], t_knots[], ctl[][], s_order, t_order, type).
  259. X   The dimensions of ctl[] are computed as follows:
  260. X   [len(s_knots) - s_order], [len(t_knots) - t_order]
  261. X*/
  262. X
  263. X% nurbssurface
  264. X
  265. Xstatic object *
  266. Xgl_nurbssurface(self, args)
  267. X    object *self;
  268. X    object *args;
  269. X{
  270. X    long arg1 ;
  271. X    double * arg2 ;
  272. X    long arg3 ;
  273. X    double * arg4 ;
  274. X    double *arg5 ;
  275. X    long arg6 ;
  276. X    long arg7 ;
  277. X    long arg8 ;
  278. X    long ncoords;
  279. X    long s_byte_stride, t_byte_stride;
  280. X    long s_nctl, t_nctl;
  281. X    long s, t;
  282. X    object *v, *w, *pt;
  283. X    double *pnext;
  284. X    if (!getilongarraysize(args, 6, 0, &arg1))
  285. X        return NULL;
  286. X    if ((arg2 = NEW(double, arg1 )) == NULL) {
  287. X        return err_nomem();
  288. X    }
  289. X    if (!getidoublearray(args, 6, 0, arg1 , arg2))
  290. X        return NULL;
  291. X    if (!getilongarraysize(args, 6, 1, &arg3))
  292. X        return NULL;
  293. X    if ((arg4 = NEW(double, arg3 )) == NULL) {
  294. X        return err_nomem();
  295. X    }
  296. X    if (!getidoublearray(args, 6, 1, arg3 , arg4))
  297. X        return NULL;
  298. X    if (!getilongarg(args, 6, 3, &arg6))
  299. X        return NULL;
  300. X    if (!getilongarg(args, 6, 4, &arg7))
  301. X        return NULL;
  302. X    if (!getilongarg(args, 6, 5, &arg8))
  303. X        return NULL;
  304. X    if (arg8 == N_XYZ)
  305. X        ncoords = 3;
  306. X    else if (arg8 == N_XYZW)
  307. X        ncoords = 4;
  308. X    else {
  309. X        err_badarg();
  310. X        return NULL;
  311. X    }
  312. X    s_nctl = arg1 - arg6;
  313. X    t_nctl = arg3 - arg7;
  314. X    if (!getiobjectarg(args, 6, 2, &v))
  315. X        return NULL;
  316. X    if (!is_listobject(v) || getlistsize(v) != s_nctl) {
  317. X        err_badarg();
  318. X        return NULL;
  319. X    }
  320. X    if ((arg5 = NEW(double, s_nctl*t_nctl*ncoords )) == NULL) {
  321. X        return err_nomem();
  322. X    }
  323. X    pnext = arg5;
  324. X    for (s = 0; s < s_nctl; s++) {
  325. X        w = getlistitem(v, s);
  326. X        if (w == NULL || !is_listobject(w) ||
  327. X                    getlistsize(w) != t_nctl) {
  328. X            err_badarg();
  329. X            return NULL;
  330. X        }
  331. X        for (t = 0; t < t_nctl; t++) {
  332. X            pt = getlistitem(w, t);
  333. X            if (!getidoublearray(pt, 1, 0, ncoords, pnext))
  334. X                return NULL;
  335. X            pnext += ncoords;
  336. X        }
  337. X    }
  338. X    s_byte_stride = sizeof(double) * ncoords;
  339. X    t_byte_stride = s_byte_stride * s_nctl;
  340. X    nurbssurface( arg1 , arg2 , arg3 , arg4 ,
  341. X        s_byte_stride , t_byte_stride , arg5 , arg6 , arg7 , arg8 );
  342. X    DEL(arg2);
  343. X    DEL(arg4);
  344. X    DEL(arg5);
  345. X    INCREF(None);
  346. X    return None;
  347. X}
  348. X
  349. X/* nurbscurve(knots, ctlpoints, order, type).
  350. X   The length of ctlpoints is len(knots)-order. */
  351. X
  352. X%nurbscurve
  353. X
  354. Xstatic object *
  355. Xgl_nurbscurve(self, args)
  356. X    object *self;
  357. X    object *args;
  358. X{
  359. X    long arg1 ;
  360. X    double * arg2 ;
  361. X    long arg3 ;
  362. X    double * arg4 ;
  363. X    long arg5 ;
  364. X    long arg6 ;
  365. X    int ncoords, npoints;
  366. X    int i;
  367. X    object *v;
  368. X    double *pnext;
  369. X    if (!getilongarraysize(args, 4, 0, &arg1))
  370. X        return NULL;
  371. X    if ((arg2 = NEW(double, arg1 )) == NULL) {
  372. X        return err_nomem();
  373. X    }
  374. X    if (!getidoublearray(args, 4, 0, arg1 , arg2))
  375. X        return NULL;
  376. X    if (!getilongarg(args, 4, 2, &arg5))
  377. X        return NULL;
  378. X    if (!getilongarg(args, 4, 3, &arg6))
  379. X        return NULL;
  380. X    if (arg6 == N_ST)
  381. X        ncoords = 2;
  382. X    else if (arg6 == N_STW)
  383. X        ncoords = 3;
  384. X    else {
  385. X        err_badarg();
  386. X        return NULL;
  387. X    }
  388. X    npoints = arg1 - arg5;
  389. X    if (!getiobjectarg(args, 4, 1, &v))
  390. X        return NULL;
  391. X    if (!is_listobject(v) || getlistsize(v) != npoints) {
  392. X        err_badarg();
  393. X        return NULL;
  394. X    }
  395. X    if ((arg4 = NEW(double, npoints*ncoords )) == NULL) {
  396. X        return err_nomem();
  397. X    }
  398. X    pnext = arg4;
  399. X    for (i = 0; i < npoints; i++) {
  400. X        if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
  401. X            return NULL;
  402. X        pnext += ncoords;
  403. X    }
  404. X    arg3 = (sizeof(double)) * ncoords;
  405. X    nurbscurve( arg1 , arg2 , arg3 , arg4 , arg5 , arg6 );
  406. X    DEL(arg2);
  407. X    DEL(arg4);
  408. X    INCREF(None);
  409. X    return None;
  410. X}
  411. X
  412. X/* pwlcurve(points, type).
  413. X   Points is a list of points. Type must be N_ST. */
  414. X
  415. X%pwlcurve
  416. X
  417. Xstatic object *
  418. Xgl_pwlcurve(self, args)
  419. X    object *self;
  420. X    object *args;
  421. X{
  422. X    object *v;
  423. X    long type;
  424. X    double *data, *pnext;
  425. X    long npoints, ncoords;
  426. X    int i;
  427. X    if (!getiobjectarg(args, 2, 0, &v))
  428. X        return NULL;
  429. X    if (!getilongarg(args, 2, 1, &type))
  430. X        return NULL;
  431. X    if (!is_listobject(v)) {
  432. X        err_badarg();
  433. X        return NULL;
  434. X    }
  435. X    npoints = getlistsize(v);
  436. X    if (type == N_ST)
  437. X        ncoords = 2;
  438. X    else {
  439. X        err_badarg();
  440. X        return NULL;
  441. X    }
  442. X    if ((data = NEW(double, npoints*ncoords)) == NULL) {
  443. X        return err_nomem();
  444. X    }
  445. X    pnext = data;
  446. X    for (i = 0; i < npoints; i++) {
  447. X        if (!getidoublearray(getlistitem(v, i), 1, 0, ncoords, pnext))
  448. X            return NULL;
  449. X        pnext += ncoords;
  450. X    }
  451. X    pwlcurve(npoints, data, sizeof(double)*ncoords, type);
  452. X    DEL(data);
  453. X    INCREF(None);
  454. X    return None;
  455. X}
  456. X
  457. X
  458. X/* Picking and Selecting */
  459. X
  460. Xstatic short *pickbuffer = NULL;
  461. Xstatic long pickbuffersize;
  462. X
  463. Xstatic object *
  464. Xpick_select(args, func)
  465. X    object *args;
  466. X    void (*func)();
  467. X{
  468. X    if (!getilongarg(args, 1, 0, &pickbuffersize))
  469. X        return NULL;
  470. X    if (pickbuffer != NULL) {
  471. X        err_setstr(RuntimeError,
  472. X            "pick/gselect: already picking/selecting");
  473. X        return NULL;
  474. X    }
  475. X    if ((pickbuffer = NEW(short, pickbuffersize)) == NULL) {
  476. X        return err_nomem();
  477. X    }
  478. X    (*func)(pickbuffer, pickbuffersize);
  479. X    INCREF(None);
  480. X    return None;
  481. X}
  482. X
  483. Xstatic object *
  484. Xendpick_select(args, func)
  485. X    object *args;
  486. X    long (*func)();
  487. X{
  488. X    object *v, *w;
  489. X    int i, nhits, n;
  490. X    if (!getnoarg(args))
  491. X        return NULL;
  492. X    if (pickbuffer == NULL) {
  493. X        err_setstr(RuntimeError,
  494. X            "endpick/endselect: not in pick/select mode");
  495. X        return NULL;
  496. X    }
  497. X    nhits = (*func)(pickbuffer);
  498. X    if (nhits < 0) {
  499. X        nhits = -nhits; /* How to report buffer overflow otherwise? */
  500. X    }
  501. X    /* Scan the buffer to see how many integers */
  502. X    n = 0;
  503. X    for (; nhits > 0; nhits--) {
  504. X        n += 1 + pickbuffer[n];
  505. X    }
  506. X    v = newlistobject(n);
  507. X    if (v == NULL)
  508. X        return NULL;
  509. X    /* XXX Could do it nicer and interpret the data structure here,
  510. X       returning a list of lists. But this can be done in Python... */
  511. X    for (i = 0; i < n; i++) {
  512. X        w = newintobject((long)pickbuffer[i]);
  513. X        if (w == NULL) {
  514. X            DECREF(v);
  515. X            return NULL;
  516. X        }
  517. X        setlistitem(v, i, w);
  518. X    }
  519. X    DEL(pickbuffer);
  520. X    pickbuffer = NULL;
  521. X    return v;
  522. X}
  523. X
  524. Xextern void pick(), gselect();
  525. Xextern long endpick(), endselect();
  526. X
  527. X%pick
  528. Xstatic object *gl_pick(self, args) object *self, *args; {
  529. X    return pick_select(args, pick);
  530. X}
  531. X
  532. X%endpick
  533. Xstatic object *gl_endpick(self, args) object *self, *args; {
  534. X    return endpick_select(args, endpick);
  535. X}
  536. X
  537. X%gselect
  538. Xstatic object *gl_gselect(self, args) object *self, *args; {
  539. X    return pick_select(args, gselect);
  540. X}
  541. X
  542. X%endselect
  543. Xstatic object *gl_endselect(self, args) object *self, *args; {
  544. X    return endpick_select(args, endselect);
  545. X}
  546. X
  547. X
  548. X/* XXX The generator botches this one.  Here's a quick hack to fix it. */
  549. X
  550. X% getmatrix float r[16]
  551. X
  552. Xstatic object *
  553. Xgl_getmatrix(self, args)
  554. X    object *self;
  555. X    object *args;
  556. X{
  557. X    float arg1 [ 16 ] ;
  558. X    object *v, *w;
  559. X    int i;
  560. X    getmatrix( arg1 );
  561. X    v = newlistobject(16);
  562. X    if (v == NULL) {
  563. X        return err_nomem();
  564. X    }
  565. X    for (i = 0; i < 16; i++) {
  566. X        w = mknewfloatobject(arg1[i]);
  567. X        if (w == NULL) {
  568. X            DECREF(v);
  569. X            return NULL;
  570. X        }
  571. X        setlistitem(v, i, w);
  572. X    }
  573. X    return v;
  574. X}
  575. X
  576. X/* End of manually written stubs */
  577. X
  578. X%%
  579. X
  580. Xlong     getshade
  581. Xvoid     devport     short s long s
  582. Xvoid     rdr2i         long s long s
  583. Xvoid    rectfs         short s short s short s short s
  584. Xvoid     rects         short s short s short s short s
  585. Xvoid     rmv2i         long s long s
  586. Xvoid    noport
  587. Xvoid    popviewport
  588. Xvoid    clear
  589. Xvoid    clearhitcode
  590. Xvoid    closeobj
  591. Xvoid    cursoff
  592. Xvoid    curson
  593. Xvoid    doublebuffer
  594. Xvoid     finish
  595. Xvoid    gconfig
  596. Xvoid    ginit
  597. Xvoid    greset
  598. Xvoid    multimap
  599. Xvoid    onemap
  600. Xvoid    popattributes
  601. Xvoid    popmatrix
  602. Xvoid    pushattributes
  603. Xvoid    pushmatrix
  604. Xvoid    pushviewport
  605. Xvoid    qreset
  606. Xvoid    RGBmode
  607. Xvoid    singlebuffer
  608. Xvoid    swapbuffers
  609. Xvoid    gsync
  610. Xvoid    tpon
  611. Xvoid    tpoff
  612. Xvoid    clkon
  613. Xvoid    clkoff
  614. Xvoid    ringbell
  615. X#void    callfunc
  616. Xvoid    gbegin
  617. Xvoid    textinit
  618. Xvoid    initnames
  619. Xvoid    pclos
  620. Xvoid    popname
  621. Xvoid    spclos
  622. Xvoid    zclear
  623. Xvoid    screenspace
  624. Xvoid    reshapeviewport
  625. Xvoid    winpush
  626. Xvoid    winpop
  627. Xvoid    foreground
  628. Xvoid    endfullscrn
  629. Xvoid    endpupmode
  630. Xvoid    fullscrn
  631. Xvoid    pupmode
  632. Xvoid    winconstraints
  633. Xvoid    pagecolor     short s
  634. Xvoid    textcolor     short s
  635. Xvoid     color           short s
  636. Xvoid    curveit        short s
  637. Xvoid    font        short s
  638. Xvoid     linewidth    short s
  639. Xvoid    setlinestyle    short s
  640. Xvoid    setmap        short s
  641. Xvoid    swapinterval    short s
  642. Xvoid    writemask    short s
  643. Xvoid    textwritemask    short s
  644. Xvoid    qdevice        short s
  645. Xvoid    unqdevice    short s
  646. Xvoid    curvebasis    short s
  647. Xvoid    curveprecision    short s
  648. Xvoid    loadname    short s
  649. Xvoid    passthrough    short s
  650. Xvoid    pushname    short s
  651. Xvoid    setmonitor    short s
  652. Xvoid    setshade    short s
  653. Xvoid    setpattern    short s
  654. Xvoid    pagewritemask    short s
  655. X#
  656. Xvoid    callobj        long s
  657. Xvoid    delobj        long s
  658. Xvoid     editobj        long s
  659. Xvoid    makeobj        long s
  660. Xvoid    maketag        long s
  661. Xvoid    chunksize    long s
  662. Xvoid    compactify    long s
  663. Xvoid    deltag        long s
  664. Xvoid    lsrepeat    long s
  665. Xvoid    objinsert    long s
  666. Xvoid     objreplace    long s
  667. Xvoid    winclose    long s
  668. Xvoid    blanktime    long s
  669. Xvoid     freepup        long s
  670. X# This is not in the library!?
  671. X###void    pupcolor    long s
  672. X#
  673. Xvoid    backbuffer    long s
  674. Xvoid     frontbuffer    long s
  675. Xvoid    lsbackup    long s
  676. Xvoid    resetls        long s
  677. Xvoid    lampon        long s
  678. Xvoid    lampoff        long s
  679. Xvoid    setbell        long s
  680. Xvoid    blankscreen    long s
  681. Xvoid     depthcue    long s
  682. Xvoid    zbuffer        long s
  683. Xvoid    backface    long s
  684. X#
  685. Xvoid     cmov2i        long s long s
  686. Xvoid     draw2i        long s long s
  687. Xvoid    move2i        long s long s
  688. Xvoid    pnt2i        long s long s
  689. Xvoid     patchbasis    long s long s
  690. Xvoid     patchprecision    long s long s
  691. Xvoid    pdr2i        long s long s
  692. Xvoid    pmv2i        long s long s
  693. Xvoid    rpdr2i        long s long s
  694. Xvoid    rpmv2i        long s long s
  695. Xvoid    xfpt2i        long s long s
  696. Xvoid    objdelete    long s long s
  697. Xvoid    patchcurves    long s long s
  698. Xvoid    minsize        long s long s
  699. Xvoid     maxsize        long s long s
  700. Xvoid    keepaspect    long s long s
  701. Xvoid    prefsize    long s long s
  702. Xvoid    stepunit    long s long s
  703. Xvoid     fudge        long s long s
  704. Xvoid     winmove        long s long s
  705. X#
  706. Xvoid     attachcursor    short s short s
  707. Xvoid     deflinestyle    short s short s
  708. Xvoid     noise        short s short s
  709. Xvoid     picksize    short s short s
  710. Xvoid     qenter        short s short s
  711. Xvoid     setdepth    short s short s
  712. Xvoid     cmov2s        short s short s
  713. Xvoid     draw2s        short s    short s
  714. Xvoid     move2s        short s short s
  715. Xvoid     pdr2s        short s short s
  716. Xvoid     pmv2s        short s short s
  717. Xvoid     pnt2s        short s short s
  718. Xvoid     rdr2s        short s short s
  719. Xvoid     rmv2s        short s short s
  720. Xvoid     rpdr2s        short s short s
  721. Xvoid     rpmv2s        short s short s
  722. Xvoid     xfpt2s        short s short s
  723. X#
  724. Xvoid cmov2        float s float s
  725. Xvoid draw2        float s float s
  726. Xvoid move2        float s float s
  727. Xvoid pnt2        float s float s
  728. Xvoid pdr2        float s float s
  729. Xvoid pmv2        float s float s
  730. Xvoid rdr2        float s float s
  731. Xvoid rmv2        float s float s
  732. Xvoid rpdr2        float s float s
  733. Xvoid rpmv2        float s float s
  734. Xvoid xfpt2        float s float s
  735. X#
  736. Xvoid loadmatrix        float s[16]
  737. Xvoid multmatrix        float s[16]
  738. Xvoid crv            float s[16]
  739. Xvoid rcrv            float s[16]
  740. X#
  741. X# Methods that have strings.  
  742. X#
  743. Xvoid addtopup        long s char *s long s
  744. Xvoid charstr        char *s
  745. Xvoid getport         char *s
  746. Xlong strwidth        char *s
  747. Xlong winopen        char *s
  748. Xvoid wintitle        char *s
  749. X#
  750. X# Methods that have 1 long (# of elements) and an array 
  751. X#
  752. Xvoid polf        long s float s[3*arg1]
  753. Xvoid polf2        long s float s[2*arg1]
  754. Xvoid poly        long s float s[3*arg1]
  755. Xvoid poly2        long s float s[2*arg1]
  756. Xvoid crvn        long s float s[3*arg1]
  757. Xvoid rcrvn        long s float s[4*arg1]
  758. X#
  759. Xvoid polf2i        long s long s[2*arg1]
  760. Xvoid polfi        long s long s[3*arg1]
  761. Xvoid poly2i        long s long s[2*arg1]
  762. Xvoid polyi        long s long s[3*arg1]
  763. X#
  764. Xvoid polf2s        long s short s[2*arg1]
  765. Xvoid polfs        long s short s[3*arg1]
  766. Xvoid polys        long s short s[3*arg1]
  767. Xvoid poly2s        long s short s[2*arg1]
  768. X#
  769. Xvoid defcursor        short s short s[16]
  770. Xvoid writepixels    short s short s[arg1]
  771. Xvoid defbasis        long s float s[16]
  772. Xvoid gewrite        short s short s[arg1]
  773. X#
  774. Xvoid rotate        short s char s
  775. X# This is not in the library!?
  776. X###void setbutton        short s char s
  777. Xvoid rot        float s char s
  778. X#
  779. Xvoid circfi        long s long s long s
  780. Xvoid circi        long s long s long s
  781. Xvoid cmovi        long s long s long s
  782. Xvoid drawi        long s long s long s
  783. Xvoid movei        long s long s long s
  784. Xvoid pnti         long s long s long s
  785. Xvoid newtag        long s long s long s
  786. Xvoid pdri          long s long s long s
  787. Xvoid pmvi          long s long s long s
  788. Xvoid rdri          long s long s long s
  789. Xvoid rmvi          long s long s long s
  790. Xvoid rpdri         long s long s long s
  791. Xvoid rpmvi         long s long s long s
  792. Xvoid xfpti         long s long s long s
  793. X#
  794. Xvoid circ        float s float s float s
  795. Xvoid circf        float s float s float s
  796. Xvoid cmov        float s float s float s
  797. Xvoid draw        float s float s float s
  798. Xvoid move        float s float s float s
  799. Xvoid pnt        float s float s float s
  800. Xvoid scale        float s float s float s
  801. Xvoid translate        float s float s float s
  802. Xvoid pdr        float s float s float s
  803. Xvoid pmv        float s float s float s
  804. Xvoid rdr        float s float s float s
  805. Xvoid rmv        float s float s float s
  806. Xvoid rpdr        float s float s float s
  807. Xvoid rpmv        float s float s float s
  808. Xvoid xfpt        float s float s float s
  809. X#
  810. Xvoid RGBcolor        short s short s short s
  811. Xvoid RGBwritemask    short s short s short s
  812. Xvoid setcursor        short s short s short s
  813. Xvoid tie        short s short s short s
  814. Xvoid circfs        short s short s short s
  815. Xvoid circs        short s short s short s
  816. Xvoid cmovs        short s short s short s
  817. Xvoid draws        short s short s short s
  818. Xvoid moves        short s short s short s
  819. Xvoid pdrs        short s short s short s
  820. Xvoid pmvs        short s short s short s
  821. Xvoid pnts        short s short s short s
  822. Xvoid rdrs        short s short s short s
  823. Xvoid rmvs        short s short s short s
  824. Xvoid rpdrs        short s short s short s
  825. Xvoid rpmvs        short s short s short s
  826. Xvoid xfpts        short s short s short s
  827. Xvoid curorigin        short s short s short s
  828. Xvoid cyclemap        short s short s short s
  829. X#
  830. Xvoid patch        float s[16] float s[16] float s[16]
  831. Xvoid splf        long s float s[3*arg1] short s[arg1]
  832. Xvoid splf2        long s float s[2*arg1] short s[arg1]
  833. Xvoid splfi        long s long s[3*arg1] short s[arg1]
  834. Xvoid splf2i        long s long s[2*arg1] short s[arg1]
  835. Xvoid splfs        long s short s[3*arg1] short s[arg1]
  836. Xvoid splf2s        long s short s[2*arg1] short s[arg1]
  837. Xvoid defpattern        short s short s short s[arg2*arg2/16]
  838. X#
  839. Xvoid rpatch        float s[16] float s[16] float s[16] float s[16]
  840. X#
  841. X# routines that send 4 floats
  842. X#
  843. Xvoid ortho2        float s float s float s float s
  844. Xvoid rect        float s float s float s float s
  845. Xvoid rectf        float s float s float s float s
  846. Xvoid xfpt4        float s float s float s float s
  847. X#
  848. Xvoid textport        short s short s short s short s
  849. Xvoid mapcolor        short s short s short s short s
  850. Xvoid scrmask        short s short s short s short s
  851. Xvoid setvaluator    short s short s short s short s
  852. Xvoid viewport        short s short s short s short s
  853. Xvoid shaderange        short s short s short s short s
  854. Xvoid xfpt4s        short s short s short s short s
  855. Xvoid rectfi        long s long s long s long s
  856. Xvoid recti        long s long s long s long s
  857. Xvoid xfpt4i        long s long s long s long s
  858. Xvoid prefposition    long s long s long s long s
  859. X#
  860. Xvoid arc        float s float s float s short s short s
  861. Xvoid arcf        float s float s float s short s short s
  862. Xvoid arcfi        long s long s long s short s short s
  863. Xvoid arci        long s long s long s short s short s
  864. X#
  865. Xvoid bbox2        short s short s float s float s float s float s
  866. Xvoid bbox2i        short s short s long s long s long s long s
  867. Xvoid bbox2s        short s short s short s short s short s short s
  868. Xvoid blink        short s short s short s short s short s
  869. Xvoid ortho        float s float s float s float s float s float s
  870. Xvoid window        float s float s float s float s float s float s
  871. Xvoid lookat        float s float s float s float s float s float s short s
  872. X#
  873. Xvoid perspective    short s float s float s float s
  874. Xvoid polarview        float s short s short s short s
  875. X# XXX getichararray not supported
  876. X#void writeRGB        short s char s[arg1] char s[arg1] char s[arg1]
  877. X#
  878. Xvoid arcfs        short s short s short s short s short s
  879. Xvoid arcs        short s short s short s short s short s
  880. Xvoid rectcopy        short s short s short s short s short s short s
  881. Xvoid RGBcursor        short s short s short s short s short s short s short s
  882. X#
  883. Xlong getbutton        short s
  884. Xlong getcmmode
  885. Xlong getlsbackup
  886. Xlong getresetls
  887. Xlong getdcm
  888. Xlong getzbuffer
  889. Xlong ismex
  890. Xlong isobj        long s
  891. Xlong isqueued        short s
  892. Xlong istag        long s
  893. X#
  894. Xlong genobj
  895. Xlong gentag
  896. Xlong getbuffer
  897. Xlong getcolor
  898. Xlong getdisplaymode
  899. Xlong getfont
  900. Xlong getheight
  901. Xlong gethitcode
  902. Xlong getlstyle
  903. Xlong getlwidth
  904. Xlong getmap
  905. Xlong getplanes
  906. Xlong getwritemask
  907. Xlong qtest
  908. Xlong getlsrepeat
  909. Xlong getmonitor
  910. Xlong getopenobj
  911. Xlong getpattern
  912. Xlong winget
  913. Xlong winattach
  914. Xlong getothermonitor
  915. Xlong newpup
  916. X#
  917. Xlong getvaluator    short s
  918. Xvoid winset        long s
  919. Xlong dopup        long s
  920. Xvoid getdepth        short r short r
  921. Xvoid getcpos        short r short r
  922. Xvoid getsize        long r long r
  923. Xvoid getorigin        long r long r
  924. Xvoid getviewport    short r short r short r short r
  925. Xvoid gettp        short r short r short r short r
  926. Xvoid getgpos        float r float r float r float r
  927. Xvoid winposition    long s long s long s long s
  928. Xvoid gRGBcolor        short r short r short r
  929. Xvoid gRGBmask        short r short r short r
  930. Xvoid getscrmask    short r short r short r short r
  931. Xvoid gRGBcursor    short r short r short r short r short r short r short r short r long *
  932. Xvoid getmcolor        short s short r short r short r
  933. Xvoid mapw        long s short s short s float r float r float r float r float r float r
  934. Xvoid mapw2        long s short s short s float r float r
  935. Xvoid defrasterfont    short s short s short s Fontchar s[arg3] short s short s[4*arg5]
  936. Xlong qread        short r
  937. Xvoid getcursor        short r short r short r long r
  938. X#
  939. X#   For these we receive arrays of stuff
  940. X#
  941. Xvoid getdev         long s short s[arg1] short r[arg1]
  942. X#XXX not generated correctly yet
  943. X#void getmatrix        float r[16]
  944. Xlong readpixels        short s short r[retval]
  945. Xlong readRGB        short s char r[retval] char r[retval] char r[retval]
  946. Xlong blkqread        short s short r[arg1]
  947. X#
  948. X#   New 4D routines
  949. X#
  950. Xvoid cmode
  951. Xvoid concave        long s
  952. Xvoid curstype        long s
  953. Xvoid drawmode        long s
  954. Xvoid gammaramp        short s[256] short s[256] short s[256]
  955. Xlong getbackface
  956. Xlong getdescender
  957. Xlong getdrawmode
  958. Xlong getmmode
  959. Xlong getsm
  960. Xlong getvideo        long s
  961. Xvoid imakebackground
  962. Xvoid lmbind        short s short s
  963. Xvoid lmdef        long s long s long s float s[arg3]
  964. Xvoid mmode        long s
  965. Xvoid normal        float s[3]
  966. Xvoid overlay        long s
  967. Xvoid RGBrange        short s short s short s short s short s short s short s short s
  968. Xvoid setvideo         long s long s
  969. Xvoid shademodel        long s
  970. Xvoid underlay        long s
  971. X#
  972. X# New Personal Iris/GT Routines
  973. X#
  974. Xvoid bgnclosedline
  975. Xvoid bgnline
  976. Xvoid bgnpoint
  977. Xvoid bgnpolygon
  978. Xvoid bgnsurface
  979. Xvoid bgntmesh
  980. Xvoid bgntrim
  981. Xvoid endclosedline
  982. Xvoid endline
  983. Xvoid endpoint
  984. Xvoid endpolygon
  985. Xvoid endsurface
  986. Xvoid endtmesh
  987. Xvoid endtrim
  988. Xvoid blendfunction    long s long s
  989. Xvoid c3f        float s[3]
  990. Xvoid c3i        long  s[3]
  991. Xvoid c3s        short s[3]
  992. Xvoid c4f        float s[4]
  993. Xvoid c4i        long  s[4]
  994. Xvoid c4s        short s[4]
  995. Xvoid colorf        float s
  996. Xvoid cpack        long s
  997. Xvoid czclear        long s long s
  998. Xvoid dglclose        long s
  999. Xlong dglopen        char *s long s
  1000. Xlong getgdesc        long s
  1001. Xvoid getnurbsproperty    long s float r
  1002. Xvoid glcompat        long s long s
  1003. Xvoid iconsize         long s long s
  1004. Xvoid icontitle        char *s
  1005. Xvoid lRGBrange        short s short s short s short s short s short s long s long s
  1006. Xvoid linesmooth        long s
  1007. Xvoid lmcolor        long s
  1008. Xvoid logicop        long s
  1009. Xlong lrectread         short s short s short s short s long r[retval]
  1010. Xvoid lrectwrite        short s short s short s short s long s[(arg2-arg1+1)*(arg4-arg3+1)]
  1011. Xlong rectread         short s short s short s short s short r[retval]
  1012. Xvoid rectwrite        short s short s short s short s short s[(arg2-arg1+1)*(arg4-arg3+1)]
  1013. Xvoid lsetdepth        long s long s
  1014. Xvoid lshaderange    short s short s long s long s
  1015. Xvoid n3f        float s[3]
  1016. Xvoid noborder
  1017. Xvoid pntsmooth        long s
  1018. Xvoid readsource        long s
  1019. Xvoid rectzoom        float s float s
  1020. Xvoid sbox        float s float s float s float s
  1021. Xvoid sboxi        long s long s long s long s
  1022. Xvoid sboxs        short s short s short s short s
  1023. Xvoid sboxf        float s float s float s float s
  1024. Xvoid sboxfi        long s long s long s long s
  1025. Xvoid sboxfs        short s short s short s short s
  1026. Xvoid setnurbsproperty    long s float s
  1027. Xvoid setpup         long s long s long s
  1028. Xvoid smoothline        long s
  1029. Xvoid subpixel        long s
  1030. Xvoid swaptmesh
  1031. Xlong swinopen        long s
  1032. Xvoid v2f        float s[2]
  1033. Xvoid v2i        long  s[2]
  1034. Xvoid v2s        short s[2]
  1035. Xvoid v3f        float s[3]
  1036. Xvoid v3i        long  s[3]
  1037. Xvoid v3s        short s[3]
  1038. Xvoid v4f        float s[4]
  1039. Xvoid v4i        long  s[4]
  1040. Xvoid v4s        short s[4]
  1041. Xvoid videocmd        long s
  1042. Xlong windepth        long s
  1043. Xvoid wmpack        long s
  1044. Xvoid zdraw        long s
  1045. Xvoid zfunction        long s
  1046. Xvoid zsource        long s
  1047. Xvoid zwritemask        long s
  1048. X#
  1049. X#   uses doubles
  1050. X#
  1051. Xvoid v2d        double s[2]
  1052. Xvoid v3d        double s[3]
  1053. Xvoid v4d        double s[4]
  1054. EOF
  1055. fi
  1056. if test -s 'src/stdwinmodule.c'
  1057. then echo '*** I will not over-write existing file src/stdwinmodule.c'
  1058. else
  1059. echo 'x - src/stdwinmodule.c'
  1060. sed 's/^X//' > 'src/stdwinmodule.c' << 'EOF'
  1061. X/***********************************************************
  1062. XCopyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
  1063. XNetherlands.
  1064. X
  1065. X                        All Rights Reserved
  1066. X
  1067. XPermission to use, copy, modify, and distribute this software and its 
  1068. Xdocumentation for any purpose and without fee is hereby granted, 
  1069. Xprovided that the above copyright notice appear in all copies and that
  1070. Xboth that copyright notice and this permission notice appear in 
  1071. Xsupporting documentation, and that the names of Stichting Mathematisch
  1072. XCentrum or CWI not be used in advertising or publicity pertaining to
  1073. Xdistribution of the software without specific, written prior permission.
  1074. X
  1075. XSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
  1076. XTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  1077. XFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
  1078. XFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  1079. XWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  1080. XACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  1081. XOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  1082. X
  1083. X******************************************************************/
  1084. X
  1085. X/* Stdwin module */
  1086. X
  1087. X/* Stdwin itself is a module, not a separate object type.
  1088. X   Object types defined here:
  1089. X    wp: a window
  1090. X    dp: a drawing structure (only one can exist at a time)
  1091. X    mp: a menu
  1092. X    tp: a textedit block
  1093. X*/
  1094. X
  1095. X/* Rules for translating C stdwin function calls into Python stwin:
  1096. X   - All names drop their initial letter 'w'
  1097. X   - Functions with a window as first parameter are methods of window objects
  1098. X   - There is no equivalent for wclose(); just delete the window object
  1099. X     (all references to it!)  (XXX maybe this is a bad idea)
  1100. X   - w.begindrawing() returns a drawing object
  1101. X   - There is no equivalent for wenddrawing(win); just delete the drawing
  1102. X      object (all references to it!)  (XXX maybe this is a bad idea)
  1103. X   - Functions that may only be used inside wbegindrawing / wendddrawing
  1104. X     are methods of the drawing object; this includes the text measurement
  1105. X     functions (which however have doubles as module functions).
  1106. X   - Methods of the drawing object drop an initial 'draw' from their name
  1107. X     if they have it, e.g., wdrawline() --> d.line()
  1108. X   - The obvious type conversions: int --> intobject; string --> stringobject
  1109. X   - A text parameter followed by a length parameter is only a text (string)
  1110. X     parameter in Python
  1111. X   - A point or other pair of horizontal and vertical coordinates is always
  1112. X     a pair of integers in Python
  1113. X   - Two points forming a rectangle or endpoints of a line segment are a
  1114. X     pair of points in Python
  1115. X   - The arguments to d.elarc() are three points.
  1116. X   - The functions wgetclip() and wsetclip() are translated into
  1117. X     stdwin.getcutbuffer() and stdwin.setcutbuffer(); 'clip' is really
  1118. X     a bad word for what these functions do (clipping has a different
  1119. X     meaning in the drawing world), while cutbuffer is standard X jargon.
  1120. X     XXX This must change again in the light of changes to stdwin!
  1121. X   - For textedit, similar rules hold, but they are less strict.
  1122. X   XXX more?
  1123. X*/
  1124. X
  1125. X#include "allobjects.h"
  1126. X
  1127. X#include "modsupport.h"
  1128. X
  1129. X#include "stdwin.h"
  1130. X
  1131. X/* Window and menu object types declared here because of forward references */
  1132. X
  1133. Xtypedef struct {
  1134. X    OB_HEAD
  1135. X    object    *w_title;
  1136. X    WINDOW    *w_win;
  1137. X    object    *w_attr;    /* Attributes dictionary */
  1138. X} windowobject;
  1139. X
  1140. Xextern typeobject Windowtype;    /* Really static, forward */
  1141. X
  1142. X#define is_windowobject(wp) ((wp)->ob_type == &Windowtype)
  1143. X
  1144. Xtypedef struct {
  1145. X    OB_HEAD
  1146. X    MENU    *m_menu;
  1147. X    int     m_id;
  1148. X    object    *m_attr;    /* Attributes dictionary */
  1149. X} menuobject;
  1150. X
  1151. Xextern typeobject Menutype;    /* Really static, forward */
  1152. X
  1153. X#define is_menuobject(mp) ((mp)->ob_type == &Menutype)
  1154. X
  1155. X
  1156. X/* Strongly stdwin-specific argument handlers */
  1157. X
  1158. Xstatic int
  1159. Xgetmousedetail(v, ep)
  1160. X    object *v;
  1161. X    EVENT *ep;
  1162. X{
  1163. X    if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 4)
  1164. X        return err_badarg();
  1165. X    return getintintarg(gettupleitem(v, 0),
  1166. X                    &ep->u.where.h, &ep->u.where.v) &&
  1167. X        getintarg(gettupleitem(v, 1), &ep->u.where.clicks) &&
  1168. X        getintarg(gettupleitem(v, 2), &ep->u.where.button) &&
  1169. X        getintarg(gettupleitem(v, 3), &ep->u.where.mask);
  1170. X}
  1171. X
  1172. Xstatic int
  1173. Xgetmenudetail(v, ep)
  1174. X    object *v;
  1175. X    EVENT *ep;
  1176. X{
  1177. X    object *mp;
  1178. X    if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 2)
  1179. X        return err_badarg();
  1180. X    mp = gettupleitem(v, 0);
  1181. X    if (mp == NULL || !is_menuobject(mp))
  1182. X        return err_badarg();
  1183. X    ep->u.m.id = ((menuobject *)mp) -> m_id;
  1184. X    return getintarg(gettupleitem(v, 1), &ep->u.m.item);
  1185. X}
  1186. X
  1187. Xstatic int
  1188. Xgeteventarg(v, ep)
  1189. X    object *v;
  1190. X    EVENT *ep;
  1191. X{
  1192. X    object *wp, *detail;
  1193. X    int a[4];
  1194. X    if (v == NULL || !is_tupleobject(v) || gettuplesize(v) != 3)
  1195. X        return err_badarg();
  1196. X    if (!getintarg(gettupleitem(v, 0), &ep->type))
  1197. X        return 0;
  1198. X    wp = gettupleitem(v, 1);
  1199. X    if (wp == None)
  1200. X        ep->window = NULL;
  1201. X    else if (wp == NULL || !is_windowobject(wp))
  1202. X        return err_badarg();
  1203. X    else
  1204. X        ep->window = ((windowobject *)wp) -> w_win;
  1205. X    detail = gettupleitem(v, 2);
  1206. X    switch (ep->type) {
  1207. X    case WE_CHAR:
  1208. X        if (!is_stringobject(detail) || getstringsize(detail) != 1)
  1209. X        return err_badarg();
  1210. X        ep->u.character = getstringvalue(detail)[0];
  1211. X        return 1;
  1212. X    case WE_COMMAND:
  1213. X        return getintarg(detail, &ep->u.command);
  1214. X    case WE_DRAW:
  1215. X        if (!getrectarg(detail, a))
  1216. X            return 0;
  1217. X        ep->u.area.left = a[0];
  1218. X        ep->u.area.top = a[1];
  1219. X        ep->u.area.right = a[2];
  1220. X        ep->u.area.bottom = a[3];
  1221. X        return 1;
  1222. X    case WE_MOUSE_DOWN:
  1223. X    case WE_MOUSE_UP:
  1224. X    case WE_MOUSE_MOVE:
  1225. X        return getmousedetail(detail, ep);
  1226. X    case WE_MENU:
  1227. X        return getmenudetail(detail, ep);
  1228. X    default:
  1229. X        return 1;
  1230. X    }
  1231. X}
  1232. X
  1233. X
  1234. X/* Return construction tools */
  1235. X
  1236. Xstatic object *
  1237. Xmakepoint(a, b)
  1238. X    int a, b;
  1239. X{
  1240. X    object *v;
  1241. X    object *w;
  1242. X    if ((v = newtupleobject(2)) == NULL)
  1243. X        return NULL;
  1244. X    if ((w = newintobject((long)a)) == NULL ||
  1245. X        settupleitem(v, 0, w) != 0 ||
  1246. X        (w = newintobject((long)b)) == NULL ||
  1247. X        settupleitem(v, 1, w) != 0) {
  1248. X        DECREF(v);
  1249. X        return NULL;
  1250. X    }
  1251. X    return v;
  1252. X}
  1253. X
  1254. Xstatic object *
  1255. Xmakerect(a, b, c, d)
  1256. X    int a, b, c, d;
  1257. X{
  1258. X    object *v;
  1259. X    object *w;
  1260. X    if ((v = newtupleobject(2)) == NULL)
  1261. X        return NULL;
  1262. X    if ((w = makepoint(a, b)) == NULL ||
  1263. X        settupleitem(v, 0, w) != 0 ||
  1264. X        (w = makepoint(c, d)) == NULL ||
  1265. X        settupleitem(v, 1, w) != 0) {
  1266. X        DECREF(v);
  1267. X        return NULL;
  1268. X    }
  1269. X    return v;
  1270. X}
  1271. X
  1272. Xstatic object *
  1273. Xmakemouse(hor, ver, clicks, button, mask)
  1274. X    int hor, ver, clicks, button, mask;
  1275. X{
  1276. X    object *v;
  1277. X    object *w;
  1278. X    if ((v = newtupleobject(4)) == NULL)
  1279. X        return NULL;
  1280. X    if ((w = makepoint(hor, ver)) == NULL ||
  1281. X        settupleitem(v, 0, w) != 0 ||
  1282. X        (w = newintobject((long)clicks)) == NULL ||
  1283. X        settupleitem(v, 1, w) != 0 ||
  1284. X        (w = newintobject((long)button)) == NULL ||
  1285. X        settupleitem(v, 2, w) != 0 ||
  1286. X        (w = newintobject((long)mask)) == NULL ||
  1287. X        settupleitem(v, 3, w) != 0) {
  1288. X        DECREF(v);
  1289. X        return NULL;
  1290. X    }
  1291. X    return v;
  1292. X}
  1293. X
  1294. Xstatic object *
  1295. Xmakemenu(mp, item)
  1296. X    object *mp;
  1297. X    int item;
  1298. X{
  1299. X    object *v;
  1300. X    object *w;
  1301. X    if ((v = newtupleobject(2)) == NULL)
  1302. X        return NULL;
  1303. X    INCREF(mp);
  1304. X    if (settupleitem(v, 0, mp) != 0 ||
  1305. X        (w = newintobject((long)item)) == NULL ||
  1306. X        settupleitem(v, 1, w) != 0) {
  1307. X        DECREF(v);
  1308. X        return NULL;
  1309. X    }
  1310. X    return v;
  1311. X}
  1312. X
  1313. X
  1314. X/* Drawing objects */
  1315. X
  1316. Xtypedef struct {
  1317. X    OB_HEAD
  1318. X    windowobject    *d_ref;
  1319. X} drawingobject;
  1320. X
  1321. Xstatic drawingobject *Drawing; /* Set to current drawing object, or NULL */
  1322. X
  1323. X/* Drawing methods */
  1324. X
  1325. Xstatic void
  1326. Xdrawing_dealloc(dp)
  1327. X    drawingobject *dp;
  1328. X{
  1329. X    wenddrawing(dp->d_ref->w_win);
  1330. X    Drawing = NULL;
  1331. X    DECREF(dp->d_ref);
  1332. X    free((char *)dp);
  1333. X}
  1334. X
  1335. Xstatic object *
  1336. Xdrawing_generic(dp, args, func)
  1337. X    drawingobject *dp;
  1338. X    object *args;
  1339. X    void (*func) FPROTO((int, int, int, int));
  1340. X{
  1341. X    int a[4];
  1342. X    if (!getrectarg(args, a))
  1343. X        return NULL;
  1344. X    (*func)(a[0], a[1], a[2], a[3]);
  1345. X    INCREF(None);
  1346. X    return None;
  1347. X}
  1348. X
  1349. Xstatic object *
  1350. Xdrawing_line(dp, args)
  1351. X    drawingobject *dp;
  1352. X    object *args;
  1353. X{
  1354. X    drawing_generic(dp, args, wdrawline);
  1355. X}
  1356. X
  1357. Xstatic object *
  1358. Xdrawing_xorline(dp, args)
  1359. X    drawingobject *dp;
  1360. X    object *args;
  1361. X{
  1362. X    drawing_generic(dp, args, wxorline);
  1363. X}
  1364. X
  1365. Xstatic object *
  1366. Xdrawing_circle(dp, args)
  1367. X    drawingobject *dp;
  1368. X    object *args;
  1369. X{
  1370. X    int a[3];
  1371. X    if (!getpointintarg(args, a))
  1372. X        return NULL;
  1373. X    wdrawcircle(a[0], a[1], a[2]);
  1374. X    INCREF(None);
  1375. X    return None;
  1376. X}
  1377. X
  1378. Xstatic object *
  1379. Xdrawing_elarc(dp, args)
  1380. X    drawingobject *dp;
  1381. X    object *args;
  1382. X{
  1383. X    int a[6];
  1384. X    if (!get3pointarg(args, a))
  1385. X        return NULL;
  1386. X    wdrawelarc(a[0], a[1], a[2], a[3], a[4], a[5]);
  1387. X    INCREF(None);
  1388. X    return None;
  1389. X}
  1390. X
  1391. Xstatic object *
  1392. Xdrawing_box(dp, args)
  1393. X    drawingobject *dp;
  1394. X    object *args;
  1395. X{
  1396. X    drawing_generic(dp, args, wdrawbox);
  1397. X}
  1398. X
  1399. Xstatic object *
  1400. Xdrawing_erase(dp, args)
  1401. X    drawingobject *dp;
  1402. X    object *args;
  1403. X{
  1404. X    drawing_generic(dp, args, werase);
  1405. X}
  1406. X
  1407. Xstatic object *
  1408. Xdrawing_paint(dp, args)
  1409. X    drawingobject *dp;
  1410. X    object *args;
  1411. X{
  1412. X    drawing_generic(dp, args, wpaint);
  1413. X}
  1414. X
  1415. Xstatic object *
  1416. Xdrawing_invert(dp, args)
  1417. X    drawingobject *dp;
  1418. X    object *args;
  1419. X{
  1420. X    drawing_generic(dp, args, winvert);
  1421. X}
  1422. X
  1423. Xstatic object *
  1424. Xdrawing_cliprect(dp, args)
  1425. X    drawingobject *dp;
  1426. X    object *args;
  1427. X{
  1428. X    drawing_generic(dp, args, wcliprect);
  1429. X}
  1430. X
  1431. Xstatic object *
  1432. Xdrawing_noclip(dp, args)
  1433. X    drawingobject *dp;
  1434. X    object *args;
  1435. X{
  1436. X    if (!getnoarg(args))
  1437. X        return NULL;
  1438. X    wnoclip();
  1439. X    INCREF(None);
  1440. X    return None;
  1441. X}
  1442. X
  1443. Xstatic object *
  1444. Xdrawing_shade(dp, args)
  1445. X    drawingobject *dp;
  1446. X    object *args;
  1447. X{
  1448. X    int a[5];
  1449. X    if (!getrectintarg(args, a))
  1450. X        return NULL;
  1451. X    wshade(a[0], a[1], a[2], a[3], a[4]);
  1452. X    INCREF(None);
  1453. X    return None;
  1454. X}
  1455. X
  1456. Xstatic object *
  1457. Xdrawing_text(dp, args)
  1458. X    drawingobject *dp;
  1459. X    object *args;
  1460. X{
  1461. X    int a[2];
  1462. X    object *s;
  1463. X    if (!getpointstrarg(args, a, &s))
  1464. X        return NULL;
  1465. X    wdrawtext(a[0], a[1], getstringvalue(s), (int)getstringsize(s));
  1466. X    INCREF(None);
  1467. X    return None;
  1468. X}
  1469. X
  1470. X/* The following four are also used as stdwin functions */
  1471. X
  1472. Xstatic object *
  1473. Xdrawing_lineheight(dp, args)
  1474. X    drawingobject *dp;
  1475. X    object *args;
  1476. X{
  1477. X    if (!getnoarg(args))
  1478. X        return NULL;
  1479. X    return newintobject((long)wlineheight());
  1480. X}
  1481. X
  1482. Xstatic object *
  1483. Xdrawing_baseline(dp, args)
  1484. X    drawingobject *dp;
  1485. X    object *args;
  1486. X{
  1487. X    if (!getnoarg(args))
  1488. X        return NULL;
  1489. X    return newintobject((long)wbaseline());
  1490. X}
  1491. X
  1492. Xstatic object *
  1493. Xdrawing_textwidth(dp, args)
  1494. X    drawingobject *dp;
  1495. X    object *args;
  1496. X{
  1497. X    object *s;
  1498. X    if (!getstrarg(args, &s))
  1499. X        return NULL;
  1500. X    return newintobject(
  1501. X        (long)wtextwidth(getstringvalue(s), (int)getstringsize(s)));
  1502. X}
  1503. X
  1504. Xstatic object *
  1505. Xdrawing_textbreak(dp, args)
  1506. X    drawingobject *dp;
  1507. X    object *args;
  1508. X{
  1509. X    object *s;
  1510. X    int a;
  1511. X    if (!getstrintarg(args, &s, &a))
  1512. X        return NULL;
  1513. X    return newintobject(
  1514. X        (long)wtextbreak(getstringvalue(s), (int)getstringsize(s), a));
  1515. X}
  1516. X
  1517. Xstatic struct methodlist drawing_methods[] = {
  1518. X    {"box",        drawing_box},
  1519. X    {"circle",    drawing_circle},
  1520. X    {"cliprect",    drawing_cliprect},
  1521. X    {"elarc",    drawing_elarc},
  1522. X    {"erase",    drawing_erase},
  1523. X    {"invert",    drawing_invert},
  1524. X    {"line",    drawing_line},
  1525. X    {"noclip",    drawing_noclip},
  1526. X    {"paint",    drawing_paint},
  1527. X    {"shade",    drawing_shade},
  1528. X    {"text",    drawing_text},
  1529. X    {"xorline",    drawing_xorline},
  1530. X    
  1531. X    /* Text measuring methods: */
  1532. X    {"baseline",    drawing_baseline},
  1533. X    {"lineheight",    drawing_lineheight},
  1534. X    {"textbreak",    drawing_textbreak},
  1535. X    {"textwidth",    drawing_textwidth},
  1536. X    {NULL,        NULL}        /* sentinel */
  1537. X};
  1538. X
  1539. Xstatic object *
  1540. Xdrawing_getattr(wp, name)
  1541. X    drawingobject *wp;
  1542. X    char *name;
  1543. X{
  1544. X    return findmethod(drawing_methods, (object *)wp, name);
  1545. X}
  1546. X
  1547. Xstatic typeobject Drawingtype = {
  1548. X    OB_HEAD_INIT(&Typetype)
  1549. X    0,            /*ob_size*/
  1550. X    "drawing",        /*tp_name*/
  1551. X    sizeof(drawingobject),    /*tp_size*/
  1552. X    0,            /*tp_itemsize*/
  1553. X    /* methods */
  1554. X    drawing_dealloc,    /*tp_dealloc*/
  1555. X    0,            /*tp_print*/
  1556. X    drawing_getattr,    /*tp_getattr*/
  1557. X    0,            /*tp_setattr*/
  1558. X    0,            /*tp_compare*/
  1559. X    0,            /*tp_repr*/
  1560. X};
  1561. X
  1562. X
  1563. X/* Text(edit) objects */
  1564. X
  1565. Xtypedef struct {
  1566. X    OB_HEAD
  1567. X    TEXTEDIT    *t_text;
  1568. X    windowobject    *t_ref;
  1569. X    object        *t_attr;    /* Attributes dictionary */
  1570. X} textobject;
  1571. X
  1572. Xextern typeobject Texttype;    /* Really static, forward */
  1573. X
  1574. Xstatic textobject *
  1575. Xnewtextobject(wp, left, top, right, bottom)
  1576. X    windowobject *wp;
  1577. X    int left, top, right, bottom;
  1578. X{
  1579. X    textobject *tp;
  1580. X    tp = NEWOBJ(textobject, &Texttype);
  1581. X    if (tp == NULL)
  1582. X        return NULL;
  1583. X    tp->t_attr = NULL;
  1584. X    INCREF(wp);
  1585. X    tp->t_ref = wp;
  1586. X    tp->t_text = tecreate(wp->w_win, left, top, right, bottom);
  1587. X    if (tp->t_text == NULL) {
  1588. X        DECREF(tp);
  1589. X        return (textobject *) err_nomem();
  1590. X    }
  1591. X    return tp;
  1592. X}
  1593. X
  1594. X/* Text(edit) methods */
  1595. X
  1596. Xstatic void
  1597. Xtext_dealloc(tp)
  1598. X    textobject *tp;
  1599. X{
  1600. X    if (tp->t_text != NULL)
  1601. X        tefree(tp->t_text);
  1602. X    if (tp->t_attr != NULL)
  1603. X        DECREF(tp->t_attr);
  1604. X    DECREF(tp->t_ref);
  1605. X    DEL(tp);
  1606. X}
  1607. X
  1608. Xstatic object *
  1609. Xtext_arrow(self, args)
  1610. X    textobject *self;
  1611. X    object *args;
  1612. X{
  1613. X    int code;
  1614. X    if (!getintarg(args, &code))
  1615. X        return NULL;
  1616. X    tearrow(self->t_text, code);
  1617. X    INCREF(None);
  1618. X    return None;
  1619. X}
  1620. X
  1621. Xstatic object *
  1622. Xtext_draw(self, args)
  1623. X    textobject *self;
  1624. X    object *args;
  1625. X{
  1626. X    register TEXTEDIT *tp = self->t_text;
  1627. X    int a[4];
  1628. X    int left, top, right, bottom;
  1629. X    if (!getrectarg(args, a))
  1630. X        return NULL;
  1631. X    if (Drawing != NULL) {
  1632. X        err_setstr(RuntimeError, "not drawing");
  1633. X        return NULL;
  1634. X    }
  1635. X    /* Clip to text area and ignore if area is empty */
  1636. X    left = tegetleft(tp);
  1637. X    top = tegettop(tp);
  1638. X    right = tegetright(tp);
  1639. X    bottom = tegetbottom(tp);
  1640. X    if (a[0] < left) a[0] = left;
  1641. X    if (a[1] < top) a[1] = top;
  1642. X    if (a[2] > right) a[2] = right;
  1643. X    if (a[3] > bottom) a[3] = bottom;
  1644. X    if (a[0] < a[2] && a[1] < a[3]) {
  1645. X        /* Hide/show focus around draw call; these are undocumented,
  1646. X           but required here to get the highlighting correct.
  1647. X           The call to werase is also required for this reason.
  1648. X           Finally, this forces us to require (above) that we are NOT
  1649. X           already drawing. */
  1650. X        tehidefocus(tp);
  1651. X        wbegindrawing(self->t_ref->w_win);
  1652. X        werase(a[0], a[1], a[2], a[3]);
  1653. X        tedrawnew(tp, a[0], a[1], a[2], a[3]);
  1654. X        wenddrawing(self->t_ref->w_win);
  1655. X        teshowfocus(tp);
  1656. X    }
  1657. X    INCREF(None);
  1658. X    return None;
  1659. X}
  1660. X
  1661. Xstatic object *
  1662. Xtext_event(self, args)
  1663. X    textobject *self;
  1664. X    object *args;
  1665. X{
  1666. X    register TEXTEDIT *tp = self->t_text;
  1667. X    EVENT e;
  1668. X    if (!geteventarg(args, &e))
  1669. X        return NULL;
  1670. X    if (e.type == WE_MOUSE_DOWN) {
  1671. X        /* Cheat at the margins */
  1672. X        int width, height;
  1673. X        wgetdocsize(e.window, &width, &height);
  1674. X        if (e.u.where.h < 0 && tegetleft(tp) == 0)
  1675. X            e.u.where.h = 0;
  1676. X        else if (e.u.where.h > width && tegetright(tp) == width)
  1677. X            e.u.where.h = width;
  1678. X        if (e.u.where.v < 0 && tegettop(tp) == 0)
  1679. X            e.u.where.v = 0;
  1680. X        else if (e.u.where.v > height && tegetright(tp) == height)
  1681. X            e.u.where.v = height;
  1682. X    }
  1683. X    return newintobject((long) teevent(tp, &e));
  1684. X}
  1685. X
  1686. Xstatic object *
  1687. Xtext_getfocus(self, args)
  1688. X    textobject *self;
  1689. X    object *args;
  1690. X{
  1691. X    if (!getnoarg(args))
  1692. X        return NULL;
  1693. X    return makepoint(tegetfoc1(self->t_text), tegetfoc2(self->t_text));
  1694. X}
  1695. X
  1696. Xstatic object *
  1697. Xtext_getfocustext(self, args)
  1698. X    textobject *self;
  1699. X    object *args;
  1700. X{
  1701. X    int f1, f2;
  1702. X    char *text;
  1703. X    if (!getnoarg(args))
  1704. X        return NULL;
  1705. X    f1 = tegetfoc1(self->t_text);
  1706. X    f2 = tegetfoc2(self->t_text);
  1707. X    text = tegettext(self->t_text);
  1708. X    return newsizedstringobject(text + f1, f2-f1);
  1709. X}
  1710. X
  1711. Xstatic object *
  1712. Xtext_getrect(self, args)
  1713. X    textobject *self;
  1714. X    object *args;
  1715. X{
  1716. X    if (!getnoarg(args))
  1717. X        return NULL;
  1718. X    return makerect(tegetleft(self->t_text),
  1719. X            tegettop(self->t_text),
  1720. X            tegetright(self->t_text),
  1721. X            tegetbottom(self->t_text));
  1722. X}
  1723. X
  1724. Xstatic object *
  1725. Xtext_gettext(self, args)
  1726. X    textobject *self;
  1727. X    object *args;
  1728. X{
  1729. X    if (!getnoarg(args))
  1730. X        return NULL;
  1731. X    return newsizedstringobject(tegettext(self->t_text),
  1732. X                    tegetlen(self->t_text));
  1733. X}
  1734. X
  1735. Xstatic object *
  1736. Xtext_move(self, args)
  1737. X    textobject *self;
  1738. X    object *args;
  1739. X{
  1740. X    int a[4];
  1741. X    if (!getrectarg(args, a))
  1742. X        return NULL;
  1743. X    temovenew(self->t_text, a[0], a[1], a[2], a[3]);
  1744. X    INCREF(None);
  1745. X    return None;
  1746. X}
  1747. X
  1748. Xstatic object *
  1749. Xtext_setfocus(self, args)
  1750. X    textobject *self;
  1751. X    object *args;
  1752. X{
  1753. X    int a[2];
  1754. X    if (!getpointarg(args, a))
  1755. X        return NULL;
  1756. X    tesetfocus(self->t_text, a[0], a[1]);
  1757. X    INCREF(None);
  1758. X    return None;
  1759. X}
  1760. X
  1761. Xstatic object *
  1762. Xtext_replace(self, args)
  1763. X    textobject *self;
  1764. X    object *args;
  1765. X{
  1766. X    object *text;
  1767. X    if (!getstrarg(args, &text))
  1768. X        return NULL;
  1769. X    tereplace(self->t_text, getstringvalue(text));
  1770. X    INCREF(None);
  1771. X    return None;
  1772. X}
  1773. X
  1774. Xstatic struct methodlist text_methods[] = {
  1775. X    "arrow",    text_arrow,
  1776. X    "draw",        text_draw,
  1777. X    "event",    text_event,
  1778. X    "getfocus",    text_getfocus,
  1779. X    "getfocustext",    text_getfocustext,
  1780. X    "getrect",    text_getrect,
  1781. X    "gettext",    text_gettext,
  1782. X    "move",        text_move,
  1783. X    "replace",    text_replace,
  1784. X    "setfocus",    text_setfocus,
  1785. X    {NULL,        NULL}        /* sentinel */
  1786. X};
  1787. X
  1788. Xstatic object *
  1789. Xtext_getattr(tp, name)
  1790. X    textobject *tp;
  1791. X    char *name;
  1792. X{
  1793. X    if (tp->t_attr != NULL) {
  1794. X        object *v = dictlookup(tp->t_attr, name);
  1795. X        if (v != NULL) {
  1796. X            INCREF(v);
  1797. X            return v;
  1798. X        }
  1799. X    }
  1800. X    return findmethod(text_methods, (object *)tp, name);
  1801. X}
  1802. X
  1803. Xstatic int
  1804. Xtext_setattr(tp, name, v)
  1805. X    textobject *tp;
  1806. X    char *name;
  1807. X    object *v;
  1808. X{
  1809. X    if (tp->t_attr == NULL) {
  1810. X        tp->t_attr = newdictobject();
  1811. X        if (tp->t_attr == NULL)
  1812. X            return -1;
  1813. X    }
  1814. X    if (v == NULL)
  1815. X        return dictremove(tp->t_attr, name);
  1816. X    else
  1817. X        return dictinsert(tp->t_attr, name, v);
  1818. X}
  1819. X
  1820. Xstatic typeobject Texttype = {
  1821. X    OB_HEAD_INIT(&Typetype)
  1822. X    0,            /*ob_size*/
  1823. X    "textedit",        /*tp_name*/
  1824. X    sizeof(textobject),    /*tp_size*/
  1825. X    0,            /*tp_itemsize*/
  1826. X    /* methods */
  1827. X    text_dealloc,        /*tp_dealloc*/
  1828. X    0,            /*tp_print*/
  1829. X    text_getattr,        /*tp_getattr*/
  1830. X    text_setattr,        /*tp_setattr*/
  1831. X    0,            /*tp_compare*/
  1832. X    0,            /*tp_repr*/
  1833. X};
  1834. X
  1835. X
  1836. X/* Menu objects */
  1837. X
  1838. X#define IDOFFSET 10        /* Menu IDs we use start here */
  1839. X#define MAXNMENU 20        /* Max #menus we allow */
  1840. Xstatic menuobject *menulist[MAXNMENU];
  1841. X
  1842. Xstatic menuobject *
  1843. Xnewmenuobject(title)
  1844. X    object *title;
  1845. X{
  1846. X    int id;
  1847. X    MENU *menu;
  1848. X    menuobject *mp;
  1849. X    for (id = 0; id < MAXNMENU; id++) {
  1850. X        if (menulist[id] == NULL)
  1851. X            break;
  1852. X    }
  1853. X    if (id >= MAXNMENU)
  1854. X        return (menuobject *) err_nomem();
  1855. X    menu = wmenucreate(id + IDOFFSET, getstringvalue(title));
  1856. X    if (menu == NULL)
  1857. X        return (menuobject *) err_nomem();
  1858. X    mp = NEWOBJ(menuobject, &Menutype);
  1859. X    if (mp != NULL) {
  1860. X        mp->m_menu = menu;
  1861. X        mp->m_id = id + IDOFFSET;
  1862. X        mp->m_attr = NULL;
  1863. X        menulist[id] = mp;
  1864. X    }
  1865. X    else
  1866. X        wmenudelete(menu);
  1867. X    return mp;
  1868. X}
  1869. X
  1870. X/* Menu methods */
  1871. X
  1872. Xstatic void
  1873. Xmenu_dealloc(mp)
  1874. X    menuobject *mp;
  1875. X{
  1876. X    
  1877. X    int id = mp->m_id - IDOFFSET;
  1878. X    if (id >= 0 && id < MAXNMENU && menulist[id] == mp) {
  1879. X        menulist[id] = NULL;
  1880. X    }
  1881. X    wmenudelete(mp->m_menu);
  1882. X    if (mp->m_attr != NULL)
  1883. X        DECREF(mp->m_attr);
  1884. X    DEL(mp);
  1885. X}
  1886. X
  1887. Xstatic object *
  1888. Xmenu_additem(self, args)
  1889. X    menuobject *self;
  1890. X    object *args;
  1891. X{
  1892. X    object *text;
  1893. X    int shortcut;
  1894. X    if (is_tupleobject(args)) {
  1895. X        object *v;
  1896. X        if (!getstrstrarg(args, &text, &v))
  1897. X            return NULL;
  1898. X        if (getstringsize(v) != 1) {
  1899. X            err_badarg();
  1900. X            return NULL;
  1901. X        }
  1902. X        shortcut = *getstringvalue(v) & 0xff;
  1903. X    }
  1904. X    else {
  1905. X        if (!getstrarg(args, &text))
  1906. X            return NULL;
  1907. X        shortcut = -1;
  1908. X    }
  1909. X    wmenuadditem(self->m_menu, getstringvalue(text), shortcut);
  1910. X    INCREF(None);
  1911. X    return None;
  1912. X}
  1913. X
  1914. Xstatic object *
  1915. Xmenu_setitem(self, args)
  1916. X    menuobject *self;
  1917. X    object *args;
  1918. X{
  1919. X    int index;
  1920. X    object *text;
  1921. X    if (!getintstrarg(args, &index, &text))
  1922. X        return NULL;
  1923. X    wmenusetitem(self->m_menu, index, getstringvalue(text));
  1924. X    INCREF(None);
  1925. X    return None;
  1926. X}
  1927. X
  1928. Xstatic object *
  1929. Xmenu_enable(self, args)
  1930. X    menuobject *self;
  1931. X    object *args;
  1932. X{
  1933. X    int index;
  1934. X    int flag;
  1935. X    if (!getintintarg(args, &index, &flag))
  1936. X        return NULL;
  1937. X    wmenuenable(self->m_menu, index, flag);
  1938. X    INCREF(None);
  1939. X    return None;
  1940. X}
  1941. X
  1942. Xstatic object *
  1943. Xmenu_check(self, args)
  1944. X    menuobject *self;
  1945. X    object *args;
  1946. X{
  1947. X    int index;
  1948. X    int flag;
  1949. X    if (!getintintarg(args, &index, &flag))
  1950. X        return NULL;
  1951. X    wmenucheck(self->m_menu, index, flag);
  1952. X    INCREF(None);
  1953. X    return None;
  1954. X}
  1955. X
  1956. Xstatic struct methodlist menu_methods[] = {
  1957. X    "additem",    menu_additem,
  1958. X    "setitem",    menu_setitem,
  1959. X    "enable",    menu_enable,
  1960. X    "check",    menu_check,
  1961. X    {NULL,        NULL}        /* sentinel */
  1962. X};
  1963. X
  1964. Xstatic object *
  1965. Xmenu_getattr(mp, name)
  1966. X    menuobject *mp;
  1967. X    char *name;
  1968. X{
  1969. X    if (mp->m_attr != NULL) {
  1970. X        object *v = dictlookup(mp->m_attr, name);
  1971. X        if (v != NULL) {
  1972. X            INCREF(v);
  1973. X            return v;
  1974. X        }
  1975. X    }
  1976. X    return findmethod(menu_methods, (object *)mp, name);
  1977. X}
  1978. X
  1979. Xstatic int
  1980. Xmenu_setattr(mp, name, v)
  1981. X    menuobject *mp;
  1982. X    char *name;
  1983. X    object *v;
  1984. X{
  1985. X    if (mp->m_attr == NULL) {
  1986. X        mp->m_attr = newdictobject();
  1987. X        if (mp->m_attr == NULL)
  1988. X            return -1;
  1989. X    }
  1990. X    if (v == NULL)
  1991. X        return dictremove(mp->m_attr, name);
  1992. X    else
  1993. X        return dictinsert(mp->m_attr, name, v);
  1994. X}
  1995. X
  1996. Xstatic typeobject Menutype = {
  1997. X    OB_HEAD_INIT(&Typetype)
  1998. X    0,            /*ob_size*/
  1999. X    "menu",            /*tp_name*/
  2000. X    sizeof(menuobject),    /*tp_size*/
  2001. X    0,            /*tp_itemsize*/
  2002. X    /* methods */
  2003. X    menu_dealloc,        /*tp_dealloc*/
  2004. X    0,            /*tp_print*/
  2005. X    menu_getattr,        /*tp_getattr*/
  2006. X    menu_setattr,        /*tp_setattr*/
  2007. X    0,            /*tp_compare*/
  2008. X    0,            /*tp_repr*/
  2009. X};
  2010. X
  2011. X
  2012. X/* Windows */
  2013. X
  2014. X#define MAXNWIN 50
  2015. Xstatic windowobject *windowlist[MAXNWIN];
  2016. X
  2017. X/* Window methods */
  2018. X
  2019. Xstatic void
  2020. Xwindow_dealloc(wp)
  2021. X    windowobject *wp;
  2022. X{
  2023. X    if (wp->w_win != NULL) {
  2024. X        int tag = wgettag(wp->w_win);
  2025. X        if (tag >= 0 && tag < MAXNWIN)
  2026. X            windowlist[tag] = NULL;
  2027. X        else
  2028. X            fprintf(stderr, "XXX help! tag %d in window_dealloc\n",
  2029. X                tag);
  2030. X        wclose(wp->w_win);
  2031. X    }
  2032. X    DECREF(wp->w_title);
  2033. X    if (wp->w_attr != NULL)
  2034. X        DECREF(wp->w_attr);
  2035. X    free((char *)wp);
  2036. X}
  2037. X
  2038. Xstatic void
  2039. Xwindow_print(wp, fp, flags)
  2040. X    windowobject *wp;
  2041. X    FILE *fp;
  2042. X    int flags;
  2043. X{
  2044. X    fprintf(fp, "<window titled '%s'>", getstringvalue(wp->w_title));
  2045. X}
  2046. X
  2047. Xstatic object *
  2048. Xwindow_begindrawing(wp, args)
  2049. X    windowobject *wp;
  2050. X    object *args;
  2051. X{
  2052. X    drawingobject *dp;
  2053. X    if (!getnoarg(args))
  2054. X        return NULL;
  2055. X    if (Drawing != NULL) {
  2056. X        err_setstr(RuntimeError, "already drawing");
  2057. X        return NULL;
  2058. X    }
  2059. X    dp = NEWOBJ(drawingobject, &Drawingtype);
  2060. X    if (dp == NULL)
  2061. X        return NULL;
  2062. X    Drawing = dp;
  2063. X    INCREF(wp);
  2064. X    dp->d_ref = wp;
  2065. X    wbegindrawing(wp->w_win);
  2066. X    return (object *)dp;
  2067. X}
  2068. X
  2069. Xstatic object *
  2070. Xwindow_change(wp, args)
  2071. X    windowobject *wp;
  2072. X    object *args;
  2073. X{
  2074. X    int a[4];
  2075. X    if (!getrectarg(args, a))
  2076. X        return NULL;
  2077. X    wchange(wp->w_win, a[0], a[1], a[2], a[3]);
  2078. X    INCREF(None);
  2079. X    return None;
  2080. X}
  2081. X
  2082. Xstatic object *
  2083. Xwindow_gettitle(wp, args)
  2084. X    windowobject *wp;
  2085. X    object *args;
  2086. X{
  2087. X    if (!getnoarg(args))
  2088. X        return NULL;
  2089. X    INCREF(wp->w_title);
  2090. X    return wp->w_title;
  2091. X}
  2092. X
  2093. Xstatic object *
  2094. Xwindow_getwinsize(wp, args)
  2095. X    windowobject *wp;
  2096. X    object *args;
  2097. X{
  2098. X    int width, height;
  2099. X    if (!getnoarg(args))
  2100. X        return NULL;
  2101. X    wgetwinsize(wp->w_win, &width, &height);
  2102. X    return makepoint(width, height);
  2103. X}
  2104. X
  2105. Xstatic object *
  2106. Xwindow_getdocsize(wp, args)
  2107. X    windowobject *wp;
  2108. X    object *args;
  2109. X{
  2110. X    int width, height;
  2111. X    if (!getnoarg(args))
  2112. X        return NULL;
  2113. X    wgetdocsize(wp->w_win, &width, &height);
  2114. X    return makepoint(width, height);
  2115. X}
  2116. X
  2117. Xstatic object *
  2118. Xwindow_getorigin(wp, args)
  2119. X    windowobject *wp;
  2120. X    object *args;
  2121. X{
  2122. X    int width, height;
  2123. X    if (!getnoarg(args))
  2124. X        return NULL;
  2125. X    wgetorigin(wp->w_win, &width, &height);
  2126. X    return makepoint(width, height);
  2127. X}
  2128. X
  2129. Xstatic object *
  2130. Xwindow_scroll(wp, args)
  2131. X    windowobject *wp;
  2132. X    object *args;
  2133. X{
  2134. X    int a[6];
  2135. X    if (!getrectpointarg(args, a))
  2136. X        return NULL;
  2137. X    wscroll(wp->w_win, a[0], a[1], a[2], a[3], a[4], a[5]);
  2138. X    INCREF(None);
  2139. X    return None;
  2140. X}
  2141. X
  2142. Xstatic object *
  2143. Xwindow_setdocsize(wp, args)
  2144. X    windowobject *wp;
  2145. X    object *args;
  2146. X{
  2147. X    int a[2];
  2148. X    if (!getpointarg(args, a))
  2149. X        return NULL;
  2150. X    wsetdocsize(wp->w_win, a[0], a[1]);
  2151. X    INCREF(None);
  2152. X    return None;
  2153. X}
  2154. X
  2155. Xstatic object *
  2156. Xwindow_setorigin(wp, args)
  2157. X    windowobject *wp;
  2158. X    object *args;
  2159. X{
  2160. X    int a[2];
  2161. X    if (!getpointarg(args, a))
  2162. X        return NULL;
  2163. X    wsetorigin(wp->w_win, a[0], a[1]);
  2164. X    INCREF(None);
  2165. X    return None;
  2166. X}
  2167. X
  2168. Xstatic object *
  2169. Xwindow_settitle(wp, args)
  2170. X    windowobject *wp;
  2171. X    object *args;
  2172. X{
  2173. X    object *title;
  2174. X    if (!getstrarg(args, &title))
  2175. X        return NULL;
  2176. X    DECREF(wp->w_title);
  2177. X    INCREF(title);
  2178. X    wp->w_title = title;
  2179. X    wsettitle(wp->w_win, getstringvalue(title));
  2180. X    INCREF(None);
  2181. X    return None;
  2182. X}
  2183. X
  2184. Xstatic object *
  2185. Xwindow_show(wp, args)
  2186. X    windowobject *wp;
  2187. X    object *args;
  2188. X{
  2189. X    int a[4];
  2190. X    if (!getrectarg(args, a))
  2191. X        return NULL;
  2192. X    wshow(wp->w_win, a[0], a[1], a[2], a[3]);
  2193. X    INCREF(None);
  2194. X    return None;
  2195. X}
  2196. X
  2197. Xstatic object *
  2198. Xwindow_settimer(wp, args)
  2199. X    windowobject *wp;
  2200. X    object *args;
  2201. X{
  2202. X    int a;
  2203. X    if (!getintarg(args, &a))
  2204. X        return NULL;
  2205. X    wsettimer(wp->w_win, a);
  2206. X    INCREF(None);
  2207. X    return None;
  2208. X}
  2209. X
  2210. Xstatic object *
  2211. Xwindow_menucreate(self, args)
  2212. X    windowobject *self;
  2213. X    object *args;
  2214. X{
  2215. X    menuobject *mp;
  2216. X    object *title;
  2217. X    if (!getstrarg(args, &title))
  2218. X        return NULL;
  2219. X    wmenusetdeflocal(1);
  2220. X    mp = newmenuobject(title);
  2221. X    if (mp == NULL)
  2222. X        return NULL;
  2223. X    wmenuattach(self->w_win, mp->m_menu);
  2224. X    return (object *)mp;
  2225. X}
  2226. X
  2227. Xstatic object *
  2228. Xwindow_textcreate(self, args)
  2229. X    windowobject *self;
  2230. X    object *args;
  2231. X{
  2232. X    textobject *tp;
  2233. X    int a[4];
  2234. X    if (!getrectarg(args, a))
  2235. X        return NULL;
  2236. X    return (object *)
  2237. X        newtextobject(self, a[0], a[1], a[2], a[3]);
  2238. X}
  2239. X
  2240. Xstatic object *
  2241. Xwindow_setselection(self, args)
  2242. X    windowobject *self;
  2243. X    object *args;
  2244. X{
  2245. X    int sel;
  2246. X    object *str;
  2247. X    int ok;
  2248. X    if (!getintstrarg(args, &sel, &str))
  2249. X        return NULL;
  2250. X    ok = wsetselection(self->w_win, sel,
  2251. X        getstringvalue(str), (int)getstringsize(str));
  2252. X    return newintobject(ok);
  2253. X}
  2254. X
  2255. Xstatic object *
  2256. Xwindow_setwincursor(self, args)
  2257. X    windowobject *self;
  2258. X    object *args;
  2259. X{
  2260. X    object *str;
  2261. X    CURSOR *c;
  2262. X    if (!getstrarg(args, &str))
  2263. X        return NULL;
  2264. X    c = wfetchcursor(getstringvalue(str));
  2265. X    if (c == NULL) {
  2266. X        err_setstr(RuntimeError, "no such cursor");
  2267. X        return NULL;
  2268. X    }
  2269. X    wsetwincursor(self->w_win, c);
  2270. X    INCREF(None);
  2271. X    return None;
  2272. X}
  2273. X
  2274. Xstatic struct methodlist window_methods[] = {
  2275. X    {"begindrawing",window_begindrawing},
  2276. X    {"change",    window_change},
  2277. X    {"getdocsize",    window_getdocsize},
  2278. X    {"getorigin",    window_getorigin},
  2279. X    {"gettitle",    window_gettitle},
  2280. X    {"getwinsize",    window_getwinsize},
  2281. X    {"menucreate",    window_menucreate},
  2282. X    {"scroll",    window_scroll},
  2283. X    {"setwincursor",window_setwincursor},
  2284. X    {"setdocsize",    window_setdocsize},
  2285. X    {"setorigin",    window_setorigin},
  2286. X    {"setselection",window_setselection},
  2287. X    {"settimer",    window_settimer},
  2288. X    {"settitle",    window_settitle},
  2289. X    {"show",    window_show},
  2290. X    {"textcreate",    window_textcreate},
  2291. X    {NULL,        NULL}        /* sentinel */
  2292. X};
  2293. X
  2294. Xstatic object *
  2295. Xwindow_getattr(wp, name)
  2296. X    windowobject *wp;
  2297. X    char *name;
  2298. X{
  2299. X    if (wp->w_attr != NULL) {
  2300. X        object *v = dictlookup(wp->w_attr, name);
  2301. X        if (v != NULL) {
  2302. X            INCREF(v);
  2303. X            return v;
  2304. X        }
  2305. X    }
  2306. X    return findmethod(window_methods, (object *)wp, name);
  2307. X}
  2308. X
  2309. Xstatic int
  2310. Xwindow_setattr(wp, name, v)
  2311. X    windowobject *wp;
  2312. X    char *name;
  2313. X    object *v;
  2314. X{
  2315. X    if (wp->w_attr == NULL) {
  2316. X        wp->w_attr = newdictobject();
  2317. X        if (wp->w_attr == NULL)
  2318. X            return -1;
  2319. X    }
  2320. X    if (v == NULL)
  2321. X        return dictremove(wp->w_attr, name);
  2322. X    else
  2323. X        return dictinsert(wp->w_attr, name, v);
  2324. X}
  2325. X
  2326. Xstatic typeobject Windowtype = {
  2327. X    OB_HEAD_INIT(&Typetype)
  2328. X    0,            /*ob_size*/
  2329. X    "window",        /*tp_name*/
  2330. X    sizeof(windowobject),    /*tp_size*/
  2331. X    0,            /*tp_itemsize*/
  2332. X    /* methods */
  2333. X    window_dealloc,        /*tp_dealloc*/
  2334. X    window_print,        /*tp_print*/
  2335. X    window_getattr,        /*tp_getattr*/
  2336. X    window_setattr,        /*tp_setattr*/
  2337. X    0,            /*tp_compare*/
  2338. X    0,            /*tp_repr*/
  2339. X};
  2340. X
  2341. X/* Stdwin methods */
  2342. X
  2343. Xstatic object *
  2344. Xstdwin_open(sw, args)
  2345. X    object *sw;
  2346. X    object *args;
  2347. X{
  2348. X    int tag;
  2349. X    object *title;
  2350. X    windowobject *wp;
  2351. X    if (!getstrarg(args, &title))
  2352. X        return NULL;
  2353. X    for (tag = 0; tag < MAXNWIN; tag++) {
  2354. X        if (windowlist[tag] == NULL)
  2355. X            break;
  2356. X    }
  2357. X    if (tag >= MAXNWIN)
  2358. X        return err_nomem();
  2359. X    wp = NEWOBJ(windowobject, &Windowtype);
  2360. X    if (wp == NULL)
  2361. X        return NULL;
  2362. X    INCREF(title);
  2363. X    wp->w_title = title;
  2364. X    wp->w_win = wopen(getstringvalue(title), (void (*)()) NULL);
  2365. X    wp->w_attr = NULL;
  2366. X    if (wp->w_win == NULL) {
  2367. X        DECREF(wp);
  2368. X        return NULL;
  2369. X    }
  2370. X    windowlist[tag] = wp;
  2371. X    wsettag(wp->w_win, tag);
  2372. X    return (object *)wp;
  2373. X}
  2374. X
  2375. Xstatic object *
  2376. Xstdwin_get_poll_event(poll, args)
  2377. X    int poll;
  2378. X    object *args;
  2379. X{
  2380. X    EVENT e;
  2381. X    object *v, *w;
  2382. X    if (!getnoarg(args))
  2383. X        return NULL;
  2384. X    if (Drawing != NULL) {
  2385. X        err_setstr(RuntimeError, "cannot getevent() while drawing");
  2386. X        return NULL;
  2387. X    }
  2388. X/* again: */
  2389. X    if (poll) {
  2390. X        if (!wpollevent(&e)) {
  2391. X            INCREF(None);
  2392. X            return None;
  2393. X        }
  2394. X    }
  2395. X    else
  2396. X        wgetevent(&e);
  2397. X    if (e.type == WE_COMMAND && e.u.command == WC_CANCEL) {
  2398. X        /* Turn keyboard interrupts into exceptions */
  2399. X        err_set(KeyboardInterrupt);
  2400. X        return NULL;
  2401. X    }
  2402. X/*
  2403. X    if (e.window == NULL && (e.type == WE_COMMAND || e.type == WE_CHAR))
  2404. X        goto again;
  2405. X*/
  2406. X    if (e.type == WE_COMMAND && e.u.command == WC_CLOSE) {
  2407. X        /* Turn WC_CLOSE commands into WE_CLOSE events */
  2408. X        e.type = WE_CLOSE;
  2409. X    }
  2410. X    v = newtupleobject(3);
  2411. X    if (v == NULL)
  2412. X        return NULL;
  2413. X    if ((w = newintobject((long)e.type)) == NULL) {
  2414. X        DECREF(v);
  2415. X        return NULL;
  2416. X    }
  2417. X    settupleitem(v, 0, w);
  2418. X    if (e.window == NULL)
  2419. X        w = None;
  2420. X    else {
  2421. X        int tag = wgettag(e.window);
  2422. X        if (tag < 0 || tag >= MAXNWIN || windowlist[tag] == NULL)
  2423. X            w = None;
  2424. X        else
  2425. X            w = (object *)windowlist[tag];
  2426. X#ifdef sgi
  2427. X        /* XXX Trap for unexplained weird bug */
  2428. X        if ((long)w == (long)0x80000001) {
  2429. X            err_setstr(SystemError,
  2430. X                "bad pointer in stdwin.getevent()");
  2431. X            return NULL;
  2432. X        }
  2433. X#endif
  2434. X    }
  2435. X    INCREF(w);
  2436. X    settupleitem(v, 1, w);
  2437. X    switch (e.type) {
  2438. X    case WE_CHAR:
  2439. X        {
  2440. X            char c[1];
  2441. X            c[0] = e.u.character;
  2442. X            w = newsizedstringobject(c, 1);
  2443. X        }
  2444. X        break;
  2445. X    case WE_COMMAND:
  2446. X        w = newintobject((long)e.u.command);
  2447. X        break;
  2448. X    case WE_DRAW:
  2449. X        w = makerect(e.u.area.left, e.u.area.top,
  2450. X                e.u.area.right, e.u.area.bottom);
  2451. X        break;
  2452. X    case WE_MOUSE_DOWN:
  2453. X    case WE_MOUSE_MOVE:
  2454. X    case WE_MOUSE_UP:
  2455. X        w = makemouse(e.u.where.h, e.u.where.v,
  2456. X                e.u.where.clicks,
  2457. X                e.u.where.button,
  2458. X                e.u.where.mask);
  2459. X        break;
  2460. X    case WE_MENU:
  2461. X        if (e.u.m.id >= IDOFFSET && e.u.m.id < IDOFFSET+MAXNMENU &&
  2462. X                menulist[e.u.m.id - IDOFFSET] != NULL)
  2463. X            w = (object *)menulist[e.u.m.id - IDOFFSET];
  2464. X        else
  2465. X            w = None;
  2466. X        w = makemenu(w, e.u.m.item);
  2467. X        break;
  2468. X    case WE_LOST_SEL:
  2469. X        w = newintobject((long)e.u.sel);
  2470. X        break;
  2471. X    default:
  2472. X        w = None;
  2473. X        INCREF(w);
  2474. X        break;
  2475. X    }
  2476. X    if (w == NULL) {
  2477. X        DECREF(v);
  2478. X        return NULL;
  2479. X    }
  2480. X    settupleitem(v, 2, w);
  2481. X    return v;
  2482. X}
  2483. X
  2484. Xstatic object *
  2485. Xstdwin_getevent(sw, args)
  2486. X    object *sw;
  2487. X    object *args;
  2488. X{
  2489. X    return stdwin_get_poll_event(0, args);
  2490. X}
  2491. X
  2492. Xstatic object *
  2493. Xstdwin_pollevent(sw, args)
  2494. X    object *sw;
  2495. X    object *args;
  2496. X{
  2497. X    return stdwin_get_poll_event(1, args);
  2498. X}
  2499. X
  2500. Xstatic object *
  2501. Xstdwin_setdefwinpos(sw, args)
  2502. X    object *sw;
  2503. X    object *args;
  2504. X{
  2505. X    int a[2];
  2506. X    if (!getpointarg(args, a))
  2507. X        return NULL;
  2508. X    wsetdefwinpos(a[0], a[1]);
  2509. X    INCREF(None);
  2510. X    return None;
  2511. X}
  2512. X
  2513. Xstatic object *
  2514. Xstdwin_setdefwinsize(sw, args)
  2515. X    object *sw;
  2516. X    object *args;
  2517. X{
  2518. X    int a[2];
  2519. X    if (!getpointarg(args, a))
  2520. X        return NULL;
  2521. X    wsetdefwinsize(a[0], a[1]);
  2522. X    INCREF(None);
  2523. X    return None;
  2524. X}
  2525. X
  2526. Xstatic object *
  2527. Xstdwin_getdefwinpos(wp, args)
  2528. X    windowobject *wp;
  2529. X    object *args;
  2530. X{
  2531. X    int h, v;
  2532. X    if (!getnoarg(args))
  2533. X        return NULL;
  2534. X    wgetdefwinpos(&h, &v);
  2535. X    return makepoint(h, v);
  2536. X}
  2537. X
  2538. Xstatic object *
  2539. Xstdwin_getdefwinsize(wp, args)
  2540. X    windowobject *wp;
  2541. X    object *args;
  2542. X{
  2543. X    int width, height;
  2544. X    if (!getnoarg(args))
  2545. X        return NULL;
  2546. X    wgetdefwinsize(&width, &height);
  2547. X    return makepoint(width, height);
  2548. X}
  2549. X
  2550. Xstatic object *
  2551. Xstdwin_menucreate(self, args)
  2552. X    object *self;
  2553. X    object *args;
  2554. X{
  2555. X    object *title;
  2556. X    if (!getstrarg(args, &title))
  2557. X        return NULL;
  2558. X    wmenusetdeflocal(0);
  2559. X    return (object *)newmenuobject(title);
  2560. X}
  2561. X
  2562. Xstatic object *
  2563. Xstdwin_askfile(self, args)
  2564. X    object *self;
  2565. X    object *args;
  2566. X{
  2567. X    object *prompt, *dflt;
  2568. X    int new, ret;
  2569. X    char buf[256];
  2570. X    if (!getstrstrintarg(args, &prompt, &dflt, &new))
  2571. X        return NULL;
  2572. X    strncpy(buf, getstringvalue(dflt), sizeof buf);
  2573. X    buf[sizeof buf - 1] = '\0';
  2574. X    ret = waskfile(getstringvalue(prompt), buf, sizeof buf, new);
  2575. X    if (!ret) {
  2576. X        err_set(KeyboardInterrupt);
  2577. X        return NULL;
  2578. X    }
  2579. X    return newstringobject(buf);
  2580. X}
  2581. X
  2582. Xstatic object *
  2583. Xstdwin_askync(self, args)
  2584. X    object *self;
  2585. X    object *args;
  2586. X{
  2587. X    object *prompt;
  2588. X    int new, ret;
  2589. X    if (!getstrintarg(args, &prompt, &new))
  2590. X        return NULL;
  2591. X    ret = waskync(getstringvalue(prompt), new);
  2592. X    if (ret < 0) {
  2593. X        err_set(KeyboardInterrupt);
  2594. X        return NULL;
  2595. X    }
  2596. X    return newintobject((long)ret);
  2597. X}
  2598. X
  2599. Xstatic object *
  2600. Xstdwin_askstr(self, args)
  2601. X    object *self;
  2602. X    object *args;
  2603. X{
  2604. X    object *prompt, *dflt;
  2605. X    int ret;
  2606. X    char buf[256];
  2607. X    if (!getstrstrarg(args, &prompt, &dflt))
  2608. X        return NULL;
  2609. X    strncpy(buf, getstringvalue(dflt), sizeof buf);
  2610. X    buf[sizeof buf - 1] = '\0';
  2611. X    ret = waskstr(getstringvalue(prompt), buf, sizeof buf);
  2612. X    if (!ret) {
  2613. X        err_set(KeyboardInterrupt);
  2614. X        return NULL;
  2615. X    }
  2616. X    return newstringobject(buf);
  2617. X}
  2618. X
  2619. Xstatic object *
  2620. Xstdwin_message(self, args)
  2621. X    object *self;
  2622. X    object *args;
  2623. X{
  2624. X    object *msg;
  2625. X    if (!getstrarg(args, &msg))
  2626. X        return NULL;
  2627. X    wmessage(getstringvalue(msg));
  2628. X    INCREF(None);
  2629. X    return None;
  2630. X}
  2631. X
  2632. Xstatic object *
  2633. Xstdwin_fleep(self, args)
  2634. X    object *self;
  2635. X    object *args;
  2636. X{
  2637. X    if (!getnoarg(args))
  2638. X        return NULL;
  2639. X    wfleep();
  2640. X    INCREF(None);
  2641. X    return None;
  2642. X}
  2643. X
  2644. Xstatic object *
  2645. Xstdwin_setcutbuffer(self, args)
  2646. X    object *self;
  2647. X    object *args;
  2648. X{
  2649. X    int i;
  2650. X    object *str;
  2651. X    if (!getintstrarg(args, &i, &str))
  2652. X        return NULL;
  2653. X    wsetcutbuffer(i, getstringvalue(str), getstringsize(str));
  2654. X    INCREF(None);
  2655. X    return None;
  2656. X}
  2657. X
  2658. Xstatic object *
  2659. Xstdwin_getcutbuffer(self, args)
  2660. X    object *self;
  2661. X    object *args;
  2662. X{
  2663. X    int i;
  2664. X    char *str;
  2665. X    int len;
  2666. X    if (!getintarg(args, &i))
  2667. X        return NULL;
  2668. X    str = wgetcutbuffer(i, &len);
  2669. X    if (str == NULL) {
  2670. X        str = "";
  2671. X        len = 0;
  2672. X    }
  2673. X    return newsizedstringobject(str, len);
  2674. X}
  2675. X
  2676. Xstatic object *
  2677. Xstdwin_rotatecutbuffers(self, args)
  2678. X    object *self;
  2679. X    object *args;
  2680. X{
  2681. X    int i;
  2682. X    if (!getintarg(args, &i))
  2683. X        return NULL;
  2684. X    wrotatecutbuffers(i);
  2685. X    INCREF(None);
  2686. X    return None;
  2687. X}
  2688. X
  2689. Xstatic object *
  2690. Xstdwin_getselection(self, args)
  2691. X    object *self;
  2692. X    object *args;
  2693. X{
  2694. X    int sel;
  2695. X    char *data;
  2696. X    int len;
  2697. X    if (!getintarg(args, &sel))
  2698. X        return NULL;
  2699. X    data = wgetselection(sel, &len);
  2700. X    if (data == NULL) {
  2701. X        data = "";
  2702. X        len = 0;
  2703. X    }
  2704. X    return newsizedstringobject(data, len);
  2705. X}
  2706. X
  2707. Xstatic object *
  2708. Xstdwin_resetselection(self, args)
  2709. X    object *self;
  2710. X    object *args;
  2711. X{
  2712. X    int sel;
  2713. X    if (!getintarg(args, &sel))
  2714. X        return NULL;
  2715. X    wresetselection(sel);
  2716. X    INCREF(None);
  2717. X    return None;
  2718. X}
  2719. X
  2720. Xstatic struct methodlist stdwin_methods[] = {
  2721. X    {"askfile",        stdwin_askfile},
  2722. X    {"askstr",        stdwin_askstr},
  2723. X    {"askync",        stdwin_askync},
  2724. X    {"fleep",        stdwin_fleep},
  2725. X    {"getselection",    stdwin_getselection},
  2726. X    {"getcutbuffer",    stdwin_getcutbuffer},
  2727. X    {"getdefwinpos",    stdwin_getdefwinpos},
  2728. X    {"getdefwinsize",    stdwin_getdefwinsize},
  2729. X    {"getevent",        stdwin_getevent},
  2730. X    {"menucreate",        stdwin_menucreate},
  2731. X    {"message",        stdwin_message},
  2732. X    {"open",        stdwin_open},
  2733. X    {"pollevent",        stdwin_pollevent},
  2734. X    {"resetselection",    stdwin_resetselection},
  2735. X    {"rotatecutbuffers",    stdwin_rotatecutbuffers},
  2736. X    {"setcutbuffer",    stdwin_setcutbuffer},
  2737. X    {"setdefwinpos",    stdwin_setdefwinpos},
  2738. X    {"setdefwinsize",    stdwin_setdefwinsize},
  2739. X    
  2740. X    /* Text measuring methods borrow code from drawing objects: */
  2741. X    {"baseline",        drawing_baseline},
  2742. X    {"lineheight",        drawing_lineheight},
  2743. X    {"textbreak",        drawing_textbreak},
  2744. X    {"textwidth",        drawing_textwidth},
  2745. X    {NULL,            NULL}        /* sentinel */
  2746. X};
  2747. X
  2748. Xvoid
  2749. Xinitstdwin()
  2750. X{
  2751. X    static int inited;
  2752. X    if (!inited) {
  2753. X        winit();
  2754. X        inited = 1;
  2755. X    }
  2756. X    initmodule("stdwin", stdwin_methods);
  2757. X}
  2758. EOF
  2759. fi
  2760. echo 'Part 04 out of 21 of pack.out complete.'
  2761. exit 0
  2762.