Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / x11graf2.c
1 /*     Loglan82 Compiler&Interpreter\r
2      Copyright (C) 1981-1993 Institute of Informatics, University of Warsaw\r
3      Copyright (C)  1993, 1994 LITA, Pau\r
4      \r
5      This program is free software; you can redistribute it and/or modify\r
6      it under the terms of the GNU General Public License as published by\r
7      the Free Software Foundation; either version 2 of the License, or\r
8      (at your option) any later version.\r
9      \r
10      This program is distributed in the hope that it will be useful,\r
11      but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13      GNU General Public License for more details.\r
14      \r
15              You should have received a copy of the GNU General Public License\r
16              along with this program; if not, write to the Free Software\r
17              Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
18 \r
19  contacts:  Andrzej.Salwicki@univ-pau.fr\r
20 \r
21 or             Andrzej Salwicki\r
22                 LITA   Departement d'Informatique\r
23                 Universite de Pau\r
24                 Avenue de l'Universite\r
25                 64000 Pau   FRANCE\r
26                  tel.  ++33 59923154    fax. ++33 59841696\r
27 \r
28 =======================================================================\r
29 */\r
30 \r
31 #define send_par(par) theMessage.data.s[cnt++]=(short)(param[par].xword);\r
32 #define send_shrt(wd) theMessage.data.s[cnt++]=(short)(wd);\r
33 #define send_word(wd) theMessage.data.s[cnt++]=(short)((wd)&0xffff); \\r
34                       theMessage.data.s[cnt++]=(short)(((wd)>>16)&0xffff);\r
35 \r
36 \r
37 #define send_sig                        \\r
38    theMessage.type=ClientMessage;       \\r
39    theMessage.format = 16;              \\r
40    theMessage.message_type = nrproc;    \\r
41    XSendEvent(theDisplay,theWindow,True,NoEventMask,&theMessage);       \\r
42    XFlush(theDisplay);\r
43 \r
44 #define nxtev do XNextEvent( theDisplay, &retEv );      \\r
45               while( retEv.type!=ClientMessage );       \\r
46               cnt = 0;\r
47 \r
48 #define rec_par(par) param[par].xword=(int)(retEv.xclient.data.s[cnt++]);\r
49 #define rec_shrt(sh) sh  = (int)(retEv.xclient.data.s[cnt++]);\r
50 #define rec_word(wd) wd  = (int)(retEv.xclient.data.s[cnt++]) & 0xffff; \\r
51                      wd |= (int)(retEv.xclient.data.s[cnt++]) << 16;\r
52 \r
53 \r
54 \r
55         case GRON :\r
56                 if ((theDisplay = XOpenDisplay(NULL)) == NULL){\r
57                    fprintf (stderr,"\nint:  Can't open display\n");\r
58                    exit(1);\r
59                 }\r
60                 myWindow = XCreateWindow(\r
61                               theDisplay,\r
62                               RootWindow(theDisplay,DefaultScreen(theDisplay)),\r
63                               0,0,1,1,0,\r
64                               CopyFromParent,InputOnly,CopyFromParent,\r
65                               0,NULL\r
66                            );\r
67                 if( (child_no=fork())==0 ){\r
68                    char me[16];\r
69                    sprintf(me,"%d",(int)myWindow);\r
70                    execlp("herc","herc",me,NULL);\r
71                 }\r
72                 graphmode = TRUE;\r
73                 curx=cury=0;\r
74                 nxtev\r
75                 rec_word(theWindow);\r
76                 break;\r
77                 \r
78         case GROFF :\r
79                 if( graphmode == FALSE )  break;\r
80                 send_sig\r
81                 child_no=0;\r
82                 graphmode = FALSE;\r
83                 break;\r
84         \r
85         case CLS :\r
86                 send_sig\r
87                 break;\r
88         \r
89 \r
90         case PUSHXY :\r
91                 xystack[stackptr].x = curx;\r
92                 xystack[stackptr].y = cury;\r
93                 xystack[stackptr].fcol = fcol;\r
94                 xystack[stackptr].bcol = bcol;\r
95                 xystack[stackptr].style= style;\r
96 \r
97                 stackptr++;\r
98                 if( stackptr == 16 ) stackptr--;\r
99 \r
100                 break;\r
101 \r
102 \r
103         case POPHXY :\r
104 \r
105                 stackptr--;\r
106                 if( stackptr < 0 ){\r
107                    stackptr = 0;\r
108                    break;\r
109                 }\r
110 \r
111                 curx = xystack[stackptr].x;\r
112                 cury = xystack[stackptr].y;\r
113                 fcol = xystack[stackptr].fcol;\r
114                 bcol = xystack[stackptr].bcol;\r
115                 style= xystack[stackptr].style;\r
116 \r
117                 cnt = 0;\r
118                 nrproc = COLOR;\r
119                 send_shrt(fcol)\r
120                 send_sig\r
121 \r
122                 cnt = 0;\r
123                 nrproc = BORDER;\r
124                 send_shrt(bcol)\r
125                 send_sig\r
126 \r
127                 cnt = 0;\r
128                 nrproc = STYLE;\r
129                 send_shrt(style)\r
130                 send_sig\r
131 \r
132                 break;\r
133 \r
134 \r
135         case POINT :\r
136                 send_par(0)\r
137                 send_par(1)\r
138                 send_sig\r
139         case MOVE :\r
140                 curx=param[0].xword;\r
141                 cury=param[1].xword;\r
142                 break;\r
143                 \r
144         case DRAW :\r
145                 send_shrt(curx)\r
146                 send_shrt(cury)\r
147                 send_par(0)\r
148                 send_par(1)\r
149                 send_sig\r
150                 curx=param[0].xword;\r
151                 cury=param[1].xword;\r
152                 break;\r
153                 \r
154         case INXPOS :\r
155                 param[0].xword = curx;\r
156                 break;\r
157         \r
158         case INYPOS :\r
159                 param[0].xword = cury;\r
160                 break;\r
161         \r
162         case HFILL :\r
163         case VFILL :\r
164                 send_shrt(curx)\r
165                 send_shrt(cury)\r
166                 send_par(0)\r
167                 send_sig\r
168                 break;\r
169                 \r
170         case HASCII :\r
171                 send_shrt(curx)\r
172                 send_shrt(cury)\r
173                 send_par(0)\r
174                 send_sig\r
175                 if( param[0].xword != 0 )  curx += 8;\r
176                 break;\r
177                 \r
178         case COLOR :\r
179                 fcol = param[0].xword;\r
180                 send_par(0)\r
181                 send_sig\r
182                 break;\r
183                 \r
184         case BORDER :\r
185                 bcol = param[0].xword;\r
186                 send_par(0)\r
187                 send_sig\r
188                 break;\r
189                 \r
190         case STYLE :\r
191                 bcol = param[0].xword;\r
192                 send_par(0)\r
193                 send_sig\r
194                 break;\r
195                 \r
196         case INPIX :\r
197                 send_par(0)\r
198                 send_par(1)\r
199                 send_sig\r
200                 curx=param[0].xword;\r
201                 cury=param[1].xword;\r
202                 nxtev\r
203                 rec_par(2)\r
204                 break;\r
205 \r
206         case OUTSTRING :\r
207                 {\r
208                    char *s= (char *)(M + strings + param[ 0 ].xword + 1);\r
209                    int signs=M[ strings + param[ 0 ].xword ];\r
210                    nrproc=HASCII;\r
211                    while( signs-- ){\r
212                       word sign=0;\r
213                       cnt = 0;\r
214                       send_shrt(curx)\r
215                       send_shrt(cury)\r
216                       send_shrt(sign)\r
217                       send_sig\r
218                       sign = (word)(*s);\r
219                       cnt = 0;\r
220                       send_shrt(curx)\r
221                       send_shrt(cury)\r
222                       send_shrt(sign)\r
223                       send_sig\r
224                       s++;\r
225                       curx+=8;\r
226                    }\r
227                 }\r
228                 break;\r
229 \r
230         case GETMAP :\r
231                 {\r
232                    word map;\r
233                    word x=param[0].xword;\r
234                    word y=param[1].xword;\r
235                    word w = x - curx + 1;\r
236                    word h = y - cury + 1;\r
237                    x = curx;\r
238                    y = cury;\r
239                    if( w <= 0 ){ w=-w; x-=w; }\r
240                    if( h <= 0 ){ h=-h; y-=h; }\r
241                    send_shrt(x)\r
242                    send_shrt(y)\r
243                    send_shrt(w)\r
244                    send_shrt(h)\r
245                    send_sig\r
246                    nxtev\r
247                    rec_word(map)\r
248                    newarry((word) 1, 3, (word)AINT, &param[ 2 ].xvirt, &am);\r
249                    M[ am+3 ] = map;\r
250                    M[ am+4 ] = w;\r
251                    M[ am+5 ] = h;\r
252                 }\r
253                 break;\r
254 \r
255         case PUTMAP :\r
256         case ORMAP :\r
257         case XORMAP :\r
258                 if (member(&param[ 0 ].xvirt, &am)){\r
259                    send_word( M[ am+3 ] )\r
260                    send_shrt(curx)\r
261                    send_shrt(cury)\r
262                    send_shrt( M[ am+4 ] )\r
263                    send_shrt( M[ am+5 ] )\r
264                    send_sig\r
265                 }else errsignal(RTEREFTN);\r
266                 break;\r
267                 \r
268 /*\r
269         case PATERN :\r
270                 patern((int *) &param[ 0 ].xword, (int *) &param[ 1 ].xword,\r
271                        (int *) &param[ 2 ].xword, (int *) &param[ 3 ].xword);\r
272                 break;\r
273                 \r
274         case INTENS :\r
275                 intens((int *) &param[ 0 ].xword);\r
276                 break;\r
277                 \r
278         case PALETT :\r
279                 pallet((int *) &param[ 0 ].xword);\r
280                 break;\r
281                 \r
282         case VIDEO :\r
283                 if (member(&param[ 0 ].xvirt, &am))\r
284                     if (M[ am ] >= 0x8000L/sizeof(word))\r
285                         video(normalize((char *) &M[ am+3 ]));\r
286                     else errsignal(RTEILLAB);\r
287                 else errsignal(RTEREFTN);\r
288                 break;\r
289 \r
290         case HPAGE :\r
291                 i = (int) param[ 1 ].xword;\r
292                 if (i == 0) graphmode = FALSE;\r
293                 else\r
294                     if (i == 1) graphmode = TRUE;\r
295                 hpage((int *) &param[ 0 ].xword, &i,\r
296                       (int *) &param[ 2 ].xword);\r
297                 break;\r
298 \r
299         case NOCARD :\r
300                 param[ 0 ].xword = nocard(NULL);\r
301                 break;\r
302 */\r
303         \r
304         case TRACK :\r
305                 send_par(0)\r
306                 send_par(1)\r
307                 send_sig\r
308                 nxtev\r
309                 rec_shrt( curx )\r
310                 rec_shrt( cury )\r
311                 break;\r
312 \r
313         case INKEY :\r
314              if( child_no == 0 ) param[ 0 ].xword = inkey();\r
315              else\r
316              {\r
317                 int keycode;\r
318                 send_sig\r
319                 nxtev\r
320                 rec_word(keycode)\r
321                 param[ 0 ].xword = keycode;\r
322              }\r
323              break;\r
324 \r
325 /*\r
326         case HFONT :\r
327                 hfont((int *) &param[ 0 ].xword, (int *) &param[ 1 ].xword);\r
328                 break;\r
329                                 \r
330         case HFONT8 :\r
331                 param[ 0 ].xword = 0;\r
332                 param[ 1 ].xword = 0;\r
333                 hfont8((int *) &param[ 0 ].xword, (int *) &param[ 1 ].xword);\r
334                 break;\r
335 */\r
336 \r
337         case CIRB :\r
338              {\r
339                 double alfa,beta,aspect,abs; word kolb,wwyp;\r
340 \r
341                 send_par(0)\r
342                 send_par(1)\r
343                 param[2].xword *= 2;\r
344                 send_par(2)\r
345                 alfa = (double)(param[3].xreal);\r
346                 beta = (double)(param[4].xreal);\r
347                 kolb = param[5].xword;\r
348                 wwyp = param[6].xword;\r
349 \r
350                 aspect = (double)(param[7].xword) / (double)(param[8].xword);\r
351                 aspect *= (double)(param[2].xword);\r
352 \r
353                 alfa = alfa / M_PI * 180.0 * 64.0 ;\r
354                 beta = beta / M_PI * 180.0 * 64.0 ;\r
355 \r
356                 abs = alfa - beta;\r
357                 if( abs < 0.0 )  abs = -abs;\r
358                 if( abs < 0.0001 )\r
359                    beta+=360.0*64.0;\r
360 \r
361                 send_shrt( (unsigned)aspect )\r
362                 send_shrt( (unsigned)alfa   )\r
363                 send_shrt( (unsigned)beta   )\r
364                 send_sig\r
365              }\r
366                 break;\r
367 \r
368 /* MOUSE */\r
369 \r
370         case INIT :\r
371                 param[ 0 ].xbool = 2;\r
372                 param[ 1 ].xbool = lbool(1);\r
373                 break;\r
374         \r
375         case STATUS :\r
376                 send_sig\r
377                 nxtev\r
378                 rec_par(0)\r
379                 rec_par(1)\r
380                 rec_par(2)\r
381                 rec_par(3)\r
382                 rec_par(4)\r
383                 break;\r
384         \r
385         case GETPRESS :\r
386         case GETRELEASE :\r
387                 send_par(0)\r
388                 send_sig\r
389                 nxtev\r
390                 rec_par(1)\r
391                 rec_par(2)\r
392                 rec_par(3)\r
393                 rec_par(4)\r
394                 rec_par(5)\r
395                 rec_par(6)\r
396                 break;\r
397         \r
398         case SHOWCURSOR :\r
399         case HIDECURSOR :\r
400         case SETPOSITION :\r
401         case SETWINDOW :\r
402         case DEFCURSOR :\r
403         case SETSPEED :\r
404         case SETMARGINS :\r
405         case SETTHRESHOLD :\r
406                 break;\r
407 \r
408         case GETMOVEMENT :\r
409                 send_sig\r
410                 nxtev\r
411                 rec_par(0)\r
412                 rec_par(1)\r
413                 break;\r
414 \r