home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / smalltk / src / winprim.c < prev   
C/C++ Source or Header  |  1991-10-12  |  10KB  |  405 lines

  1. /*
  2.     stdwin window primitives
  3.     written by tim budd, january 1989
  4. */
  5.  
  6. # include "stdwin.h"
  7. /* undefine guido's NOARGS so it doesn't conflict with mine */
  8. # undef NOARGS
  9. # include <stdio.h>
  10. # include "env.h"
  11. # include "memory.h"
  12. # include "names.h"
  13.  
  14. extern object trueobj, falseobj;
  15. extern boolean parseok;
  16. extern int initial;
  17.  
  18. /* report a fatal system error */
  19. noreturn sysError(s1, s2)
  20. char *s1, *s2;
  21. {    char buffer[1024];
  22.  
  23.     if (initial) {
  24.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  25.         }
  26.     else {
  27.         ignore sprintf(buffer,"%s %s", s1, s2);
  28.         wperror(buffer);
  29.         }
  30.     ignore abort();
  31. }
  32.  
  33. /* report a fatal system error */
  34. noreturn sysWarn(s1, s2)
  35. char *s1, *s2;
  36. {    char buffer[1024];
  37.  
  38.     if (initial) {
  39.         ignore fprintf(stderr,"%s\n%s\n", s1, s2);
  40.         }
  41.     else {
  42.         ignore sprintf(buffer,"%s %s", s1, s2);
  43.         wperror(buffer);
  44.         }
  45. }
  46.  
  47. compilWarn(selector, str1, str2)
  48. char *selector, *str1, *str2;
  49. {    char buffer[1024];
  50.  
  51.     if (initial) {
  52.         ignore fprintf(stderr,"compiler warning: Method %s : %s %s\n", 
  53.             selector, str1, str2);
  54.         }
  55.     else {
  56.         ignore sprintf(buffer,"warn: %s %s", str1, str2);
  57.         wmessage(buffer);
  58.         }
  59. }
  60.  
  61. compilError(selector, str1, str2)
  62. char *selector, *str1, *str2;
  63. {    char buffer[1024];
  64.  
  65.     if (initial) {
  66.         ignore fprintf(stderr,"compiler error: Method %s : %s %s\n", 
  67.             selector, str1, str2);
  68.         }
  69.     else {
  70.         ignore sprintf(buffer,"error: %s %s", str1, str2);
  71.         wmessage(buffer);
  72.         }
  73.     parseok = false;
  74. }
  75.  
  76. noreturn dspMethod(cp, mp)
  77. char *cp, *mp;
  78. {
  79.     /*ignore fprintf(stderr,"%s %s\n", cp, mp);*/
  80. }
  81.  
  82. givepause()
  83. {    char buffer[80];
  84.  
  85.     if (initial) {
  86.         ignore fprintf(stderr,"push return to continue\n");
  87.         ignore gets(buffer);
  88.         }
  89.     else
  90.         wmessage("wait to continue");
  91. }
  92.  
  93. static object newPoint(x, y)
  94. int x, y;
  95. {    object newObj;
  96.  
  97.     newObj = allocObject(2);
  98.     setClass(newObj, globalSymbol("Point"));
  99.     basicAtPut(newObj, 1, newInteger(x));
  100.     basicAtPut(newObj, 2, newInteger(y));
  101.     return newObj;
  102. }
  103.  
  104. /* windows and text edit buffers are maintained in
  105.    a single structure */
  106. # define WINDOWMAX 15
  107. static struct {
  108.     WINDOW *w;
  109.     TEXTEDIT *tp;
  110.     } ws[WINDOWMAX];
  111.  
  112. /* menus are maintained in a similar structure */
  113. # define MENUMAX 20
  114. static MENU *mu[MENUMAX];
  115.  
  116. /* current event record */
  117. static EVENT evrec;
  118.  
  119. static int findWindow(w)
  120. WINDOW *w;
  121. {    int i;
  122.     for (i = 0; i < WINDOWMAX; i++)
  123.         if (w == ws[i].w) return(i);
  124.     sysError("can't find window","");
  125.     return(0);
  126. }
  127.  
  128. static void drawproc(w, left, top, right, bottom)
  129. WINDOW *w;
  130. int left, top, right, bottom;
  131. {    int i;
  132.  
  133.     i = findWindow(w);
  134.     if (ws[i].tp) tedraw(ws[i].tp);
  135. }
  136.  
  137. object sysPrimitive(primitiveNumber, arguments)
  138. int primitiveNumber;
  139. object *arguments;
  140. {    int i, j, k;
  141.     int p1, p2, p3, p4;
  142.     char *c;
  143.     WINDOW *w;
  144.     object returnedObject;
  145.  
  146.     returnedObject = nilobj;
  147.  
  148.     switch(primitiveNumber) {
  149.     case 160:    /* window open */
  150.         i = intValue(arguments[0]); /* win number */
  151.         if (ws[i].w) break;    /* already open */
  152.         c = charPtr(arguments[1]);  /* title */
  153.         j = intValue(arguments[2]); /* text or not */
  154.         if (j) {
  155.             ws[i].w = w = wopen(c, drawproc);
  156.             wgetwinsize(w, &j, &k);
  157.             ws[i].tp = tecreate(w, 0, 0, j, k);
  158.             }
  159.         else {
  160.             ws[i].w = wopen(c, NULL);
  161.             ws[i].tp = 0;
  162.             }    
  163.         break;
  164.         
  165.     case 161:    /* variety of simple actions */
  166.         i = intValue(arguments[0]); /* win number */
  167.         if (! (w = ws[i].w)) break;    /* return if no open */
  168.         j = intValue(arguments[1]); /* action */
  169.         switch(j) {
  170.             case 1: ws[i].w = NULL; wclose(w); break;
  171.             case 2: wbegindrawing(w); break;
  172.             case 3: wenddrawing(w); break; 
  173.             case 4: wsetactive(w); break;
  174.             case 5: if (ws[i].tp) tedraw(ws[i].tp); break;
  175.             case 6: wgetwinsize(w, &i, &j); 
  176.                 returnedObject = newPoint(i, j); break;
  177.         }
  178.         break;
  179.  
  180.     case 162:    /* one int arg actions */
  181.         i = intValue(arguments[0]); /* win number */
  182.         if (! (w = ws[i].w)) break;    /* return if no open */
  183.         i = intValue(arguments[1]); /* action */
  184.         j = intValue(arguments[2]); /* x */
  185.         switch(i) {
  186.             case 1:  /* set timer */
  187.                 wsettimer(w, j); break;
  188.             case 2:    /* menu attach */
  189.                 wmenuattach(w, mu[j]); break;
  190.             case 3:    /* menu detach */
  191.                 wmenudetach(w, mu[j]); break;
  192.         }
  193.         break;
  194.  
  195.     case 163:    /* two int arg actions */
  196.         i = intValue(arguments[0]); /* win number */
  197.         if (! (w = ws[i].w)) break;    /* return if no open */
  198.         i = intValue(arguments[1]); /* action */
  199.         j = intValue(arguments[2]); /* x */
  200.         k = intValue(arguments[3]); /* y */
  201.         switch(i) {
  202.             case 2: wsetdocsize(w, j, k); break;
  203.             case 3: wsetorigin(w, j, k); break;
  204.         }
  205.         break;
  206.  
  207.     case 164:    /* title */
  208.         i = intValue(arguments[0]); /* win number */
  209.         if (! (w = ws[i].w)) break;    /* return if no open */
  210.         c = charPtr(arguments[1]);
  211.         wsettitle(w, c);
  212.         break;
  213.  
  214.     case 165:    /* get text */
  215.         i = intValue(arguments[0]);
  216.         if (ws[i].tp)
  217.         returnedObject = newStString(tegettext(ws[i].tp));
  218.         break;
  219.  
  220.     case 166:    /* replace text */
  221.         i = intValue(arguments[0]);
  222.         if (ws[i].tp) {
  223.             tereplace(ws[i].tp, charPtr(arguments[1]));
  224.             /* add newline */
  225.             tereplace(ws[i].tp, "\n");
  226.             }
  227.         break;
  228.  
  229.     case 170: getevent:    /* get next event */
  230.         wgetevent(&evrec);
  231.         i = findWindow(evrec.window);
  232.         if (ws[i].tp && teevent(ws[i].tp, &evrec))
  233.             goto getevent;
  234. /*fprintf(stderr,"returning event type %d %d\n", evrec.type, evrec.u.where.clicks);*/
  235.         returnedObject = newInteger(evrec.type);
  236.         break;
  237.  
  238.     case 171:    /* integer event info */
  239.         i = intValue(arguments[0]);
  240.         switch(i) {
  241.         case 1:     /* event window */
  242.             j = findWindow(evrec.window); break;
  243.         case 2:        /* event menu */
  244.             j = evrec.u.m.id; break;
  245.         case 3:        /* menu item */
  246.             j = evrec.u.m.item + 1; break;
  247.         case 4:        /* char typed */
  248.             j = evrec.u.character; break;
  249.         case 5:        /* mouse y */
  250.             j = evrec.u.where.v; break;
  251.         case 6:        /* mouse button */
  252.             j = evrec.u.where.button; break;
  253.         case 7:        /* mouse click number */
  254.             j = evrec.u.where.clicks;
  255.         case 8:        /* char typed */
  256.             j = evrec.u.character;
  257.         case 9:        /* command typed */
  258.             j = evrec.u.command;
  259.         }
  260.         returnedObject = newInteger(j);
  261.         break;
  262.  
  263.     case 172:    /* more general event info */
  264.         i = intValue(arguments[0]);
  265.         switch(i) {
  266.         case 1:        /* mouse down point */
  267.             returnedObject = newPoint(evrec.u.where.h, 
  268.                 evrec.u.where.v); 
  269.             break;
  270.         }
  271.         break;
  272.  
  273.     case 180:    /* new menu */
  274.         i = intValue(arguments[0]); /* win number */
  275.         c = charPtr(arguments[1]); /* title */
  276.         mu[i] = wmenucreate(i, c);
  277.         break;
  278.  
  279.     case 181:    /* menu item */
  280.         i = intValue(arguments[0]); /* menu number */
  281.         c = charPtr(arguments[1]); /* title */
  282.         if (isInteger(arguments[2]))
  283.             j = intValue(arguments[2]);
  284.         else j = -1;
  285.         wmenuadditem(mu[i], c, j);
  286.         break;
  287.  
  288.     case 182:    /* check menu items */
  289.         i = intValue(arguments[0]); /* menu number */
  290.         j = intValue(arguments[1]); /* item number */
  291.         k = intValue(arguments[2]); /* action */
  292.         p1 = intValue(arguments[3]); /* flag */
  293.         switch(k) {
  294.             case 1:    /* enable/disable */
  295.                 wmenuenable(mu[i],j-1,p1); break;
  296.             case 2: /* check/no check */
  297.                 wmenucheck(mu[i],j-1,p1); break;
  298.         }
  299.         break;
  300.  
  301.     case 190:    /* print text graphics */
  302.         i = intValue(arguments[0]); /* x */
  303.         j = intValue(arguments[1]); /* y */
  304.         c = charPtr(arguments[2]); /* text */
  305.         wdrawtext(i, j, c, strlen(c));
  306.         break;
  307.  
  308.     case 192:    /* points */
  309.         i = intValue(arguments[0]); /* action */
  310.         p1 = intValue(arguments[1]);
  311.         p2 = intValue(arguments[2]);
  312.         switch(i) {
  313.             case 1:  /* draw line */
  314.                 wdrawline(p1, p2); break;
  315.         }
  316.         break;
  317.  
  318.     case 193:    /* circles and the like */
  319.         i = intValue(arguments[0]); /* action */
  320.         p1 = intValue(arguments[1]);
  321.         p2 = intValue(arguments[2]);
  322.         p3 = intValue(arguments[3]);
  323.         switch(i) {
  324.             case 1:        /* draw circle */
  325.                 wdrawcircle(p1,p2,p3); break;
  326.             case 2:        /* draw char */
  327.                 wdrawchar(p1,p2,p3); break;
  328.         }
  329.         break;
  330.  
  331.     case 194:    /* rectangles */
  332.         i = intValue(arguments[0]); /* action */
  333.         p1 = intValue(arguments[1]);
  334.         p2 = intValue(arguments[2]);
  335.         p3 = intValue(arguments[3]);
  336.         p4 = intValue(arguments[4]);
  337.         switch(i) {
  338.             case 1:        /* draw box */
  339.                 wdrawbox(p1,p2,p3,p4); break;
  340.             case 2:     /* paint */
  341.                 wpaint(p1,p2,p3,p4); break;
  342.             case 3:        /* erase */
  343.                 werase(p1,p2,p3,p4); break;
  344.             case 4:        /* invert */
  345.                 winvert(p1,p2,p3,p4); break;
  346.         }
  347.         break;
  348.  
  349.     case 195:    /* shading */
  350.         i = intValue(arguments[0]); /* action */
  351.         p1 = intValue(arguments[1]);
  352.         p2 = intValue(arguments[2]);
  353.         p3 = intValue(arguments[3]);
  354.         p4 = intValue(arguments[4]);
  355.         j = intValue(arguments[5]);
  356.         switch(i) {
  357.             case 1:        /* shading */
  358.                 wshade(p1,p2,p3,p4,j); break;
  359.             }
  360.         break;
  361.  
  362.     case 200:    /* issue a message */
  363.         c = charPtr(arguments[0]);
  364.         wmessage(c);
  365.         break;
  366.  
  367.     case 201:    /* ask a question */
  368.         { char replybuffer[120];
  369.         strcpy(replybuffer, charPtr(arguments[1]));
  370.         if (waskstr(charPtr(arguments[0]), replybuffer, 120))
  371.             returnedObject = newStString(replybuffer);
  372.         }
  373.         break;
  374.     
  375.     case 202:    /* asky a binary question */
  376.         i = waskync(charPtr(arguments[0]), intValue(arguments[1]));
  377.         if (i == 1) returnedObject = trueobj;
  378.         else if (i == 0) returnedObject = falseobj;
  379.         break;
  380.  
  381.     case 203:    /* ask for a file */
  382.         { char replybuffer[120];
  383.         strcpy(replybuffer, charPtr(arguments[1]));
  384.         if (waskfile(charPtr(arguments[0]), replybuffer, 120, intValue(arguments[2])))
  385.             returnedObject = newStString(replybuffer);
  386.         }
  387.         break;
  388.  
  389.     case 204:    /* error message */
  390.         wperror(charPtr(arguments[0]));
  391.         break;
  392.         
  393.     case 205:    /* beep */
  394.         wfleep();
  395.         break;
  396.  
  397.     default:
  398.     fprintf(stderr,"primitive not implmented yet %d\n",
  399.         primitiveNumber);
  400.     sysError("primitive not done","");
  401.     }
  402.  
  403.     return returnedObject;
  404. }
  405.