Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / sources / int / svga1.c
1 #include <grx.h>\r
2 #include <mousex.h>\r
3 #include "eventque.h"\r
4 \r
5 int Couleur,Fond,CurX,CurY;\r
6 int Coul[4],Pal;\r
7 int MOUSE_PRESENT =0;\r
8 \r
9 MouseEvent *evt;\r
10 EventQueue *q;\r
11 char *ret;\r
12 \r
13 void mousenit(int mo,int ke)\r
14 {\r
15   MouseEventMode(1);\r
16   MouseInit();\r
17   evt=(MouseEvent *)malloc(sizeof(MouseEvent));\r
18   MouseEventEnable(ke,mo);\r
19   MOUSE_PRESENT=1;\r
20 }\r
21 \r
22 void mouseshow(void)\r
23 {\r
24  MouseDisplayCursor();\r
25 }\r
26 \r
27 void mousehide(void)\r
28 {\r
29  MouseEraseCursor();\r
30 }\r
31 \r
32 int mouse(v,p,h,l,r,c)\r
33 unsigned int *v,*p,*h,*l,*r,*c;\r
34 {\r
35  EventRecord e;\r
36  MouseEvent *ev1;\r
37  short result=0;\r
38 \r
39  *v=0,*p=0,*h=0,*l=0,*r=0,*c=0;\r
40 \r
41  ev1=evt;\r
42  evt=(MouseEvent *)calloc(1,sizeof(MouseEvent));\r
43  MouseGetEvent(M_EVENT | M_POLL | M_NOPAINT,evt);\r
44  *p=evt->kbstat; *l=evt->key;\r
45  *h=evt->x;      *v=evt->y;\r
46  *r=evt->flags;  *c=evt->buttons;\r
47  if(ev1->kbstat!=evt->kbstat || ev1->key!=evt->key || ev1->x!=evt->x ||\r
48     ev1->y!=evt->y || ev1->flags!=evt->flags || ev1->buttons!=evt->buttons)\r
49   result=1;\r
50  free(ev1);\r
51  return(result);\r
52 }\r
53 \r
54 void afficheinteger(int x,int y,int valeur,int cf,int ce)\r
55 {\r
56  char tst[20];\r
57 \r
58  sprintf(tst,"%i",valeur);\r
59  GrTextXY(x,y,tst,ce,cf);\r
60  CurX+=8*strlen(tst);\r
61  if(CurX>GrMaxX())\r
62   {\r
63   CurX=0;\r
64   CurY+=14;\r
65   }\r
66 }\r
67 \r
68 \r
69 \r
70 int readcara(int posx,int posy,int col_f,int col_e)\r
71 {\r
72  char *t="_\0";\r
73  int a;\r
74 \r
75  while(!kbhit())\r
76   {\r
77   GrHLine(posx,posx+8,posy+13,col_f);\r
78   delay(200);\r
79   GrHLine(posx,posx+8,posy+13,col_e);\r
80   delay(100);\r
81   }\r
82  GrHLine(posx,posx+8,posy+13,col_f);\r
83  a=getxkey();\r
84  if(!a)\r
85   return(getxkey());\r
86  else\r
87   return(a);\r
88 }\r
89 \r
90 \r
91 void beep(void)\r
92 {\r
93  printf("%c\n",7);\r
94 }\r
95 \r
96 int affiche_chaine(int x,int y,int lg,char *txtd,char *txtf,int av,int *ll,int col_e,int col_f)\r
97 {\r
98  int larg;\r
99  char cara[2];\r
100 \r
101 \r
102  if(!av)\r
103   {\r
104   for(sprintf(&cara[0],"%c\0",*txtf),larg=0;txtf>=txtd;txtf--) /* affiche arriere */\r
105    {\r
106    GrTextXY(x+lg-larg,y,&cara[0],col_e,col_f);\r
107    larg+=8;\r
108    sprintf(&cara[0],"%c\0",*(txtf-1));\r
109    if((lg-larg-8)<0)\r
110     break;\r
111    }\r
112   if(txtf<=txtd)\r
113    {\r
114    *ll-=6;\r
115    return(1);\r
116    }\r
117   else\r
118    return(0);\r
119   }\r
120  else\r
121   {\r
122   for(sprintf(&cara[0],"%c\0",*txtd),larg=0;txtd<=txtf;txtd++) /* affiche avant */\r
123    {\r
124    GrTextXY(x+larg,y,&cara[0],col_e,col_f);\r
125    larg+=8;\r
126    sprintf(&cara[0],"%c\0",*(txtd+1));\r
127    if((lg-larg-8)<0)\r
128     break;\r
129    }\r
130   if(txtd<=txtf)\r
131    return(0);\r
132   else\r
133    return(1);\r
134   }\r
135 }\r
136 \r
137 int gscanfnum(int x,int y,int lg,int min,int max,int deft,int col_f,int col_e,int col_c)\r
138 {\r
139 \r
140  char t[10],a;\r
141  int larg=0,flg=0;\r
142  char *ptd,*ptc;\r
143  int i;\r
144  int cpt=0;\r
145  short chgt=0;\r
146  short signe=0;  /* par defaut 0(+) sinon 1(-) */\r
147 \r
148  ptc=ptd=&t[0];\r
149  GrFilledBox(x,y,x+lg,y+14,col_f);\r
150  sprintf(t,"%lu\0",deft);\r
151  while(*ptc!='\0') ptc++;\r
152  GrTextXY(x+lg-strlen(t)*8,y,t,col_e,col_f);\r
153  do\r
154   {\r
155   a=readcara(x+lg-8,y,col_f,col_c);\r
156   switch(a)\r
157    {\r
158    case 8:\r
159     if(ptc>ptd)\r
160      {\r
161      ptc--;\r
162      cpt--;\r
163      if(flg)\r
164       larg-=8;\r
165      *(ptc)='\0';\r
166      }\r
167     else\r
168      {\r
169      larg=0;\r
170      ptc=ptd;\r
171      beep();\r
172      }\r
173     break;\r
174    case 13:\r
175     if(ptc==ptd)\r
176      {\r
177      *ptc='\0';\r
178      a=11;\r
179      }\r
180     break;\r
181    case 43:\r
182     signe=0;\r
183     chgt=1;\r
184     if(cpt==0)\r
185      *ptc='\0';\r
186     break;\r
187    case 45:\r
188     signe=1;\r
189     chgt=1;\r
190     if(cpt==0)\r
191      *ptc='\0';\r
192     break;\r
193    default:\r
194     if(cpt<10)\r
195      {\r
196      if((a<='9') && (a>='0'))\r
197       {\r
198       *(ptc++)=a;\r
199       cpt++;\r
200       *ptc='\0';\r
201       }\r
202      }\r
203     else\r
204      beep();\r
205     break;\r
206    }\r
207   GrFilledBox(x,y,x+lg,y+14,col_f);\r
208   affiche_chaine(x,y,lg,ptd,ptc,flg,&larg,col_e,col_f);\r
209   if(chgt)\r
210    if(signe)\r
211      GrTextXY(x,y,"-",col_e,col_f);\r
212    else\r
213      GrTextXY(x,y,"+",col_e,col_f);\r
214   }\r
215  while((a!=13) && (a!=27));\r
216  if(a==13)\r
217   {\r
218   i=atol(t);\r
219   if(signe)\r
220    i=-i;\r
221   if((i<=max) && (i>=min))\r
222    return(i);\r
223   else\r
224    {\r
225    beep();\r
226    return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c));\r
227    }\r
228   }\r
229  else\r
230   return(gscanfnum(x,y,lg,min,max,deft,col_f,col_e,col_c));\r
231 }\r
232 \r
233 \r
234 /******************************************************************************/\r
235 char *gschar(int x,int y,int lg,int *lgmax,char *defaut,int col_f,int col_e,int col_c)\r
236 {\r
237 \r
238  char *ptd,*ptc,a;\r
239  int larg=0,flg=1;\r
240 \r
241  ptd=(char *)malloc(*lgmax);\r
242  ptc=ptd;\r
243  GrFilledBox(x,y,x+lg*8,y+14,col_f);\r
244  GrTextXY(x,y,defaut,col_e,col_f);\r
245  do\r
246   {\r
247   a=readcara((larg<(lg-1)*8) ? (x+larg) : (x+(lg-1)*8),y,col_f,col_c);\r
248   switch(a)\r
249    {\r
250    case 8:\r
251     if(ptc>ptd)\r
252      {\r
253      ptc--;\r
254      if(flg)\r
255       larg=(larg-8)>0 ? larg-8 : 0;\r
256      *(ptc)='\0';\r
257      }\r
258     else\r
259      {\r
260      larg=0;\r
261      ptc=ptd;\r
262      beep();\r
263      }\r
264     break;\r
265    case 13:\r
266     break;\r
267    default :\r
268     if(((ptc-ptd)/sizeof(char))<=*lgmax)\r
269      {\r
270      *(ptc++)=a;\r
271      *ptc='\0';\r
272      if(flg)\r
273       larg+=8;\r
274      }\r
275     else\r
276      beep();\r
277    }\r
278   GrFilledBox(x,y,x+lg*8,y+14,col_f);\r
279   flg=affiche_chaine(x,y,(lg-1)*8,ptd,ptc,flg,&larg,col_e,col_f);\r
280   }\r
281  while((a!=13) && (a!=27));\r
282  if((a==27) || (ptd==ptc))\r
283   {\r
284   ptc=ptd=defaut;\r
285   while(*ptc!='\0') ptc++;\r
286   }\r
287  else\r
288   *ptc='\0';\r
289  GrFilledBox(x,y,x+lg*8,y+14,col_f);\r
290  affiche_chaine(x,y,lg*8,ptd,ptc,1,&larg,col_e,col_f);\r
291  *lgmax=(ptc>ptd)? ptc-ptd+1 : 0;\r
292  return(ptd);\r
293 }\r