1 /* we_wind.c */
2 /* Copyright (C) 1993 Fred Kruse */
3 /* This is free software; you can redistribute it and/or */
4 /* modify it under the terms of the */
5 /* GNU General Public License, see the file COPYING. */
6
7 #include "messages.h"
8 #include "edit.h"
9
10 #define MAXSVSTR 20
11
12 int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw);
13
14 /* break string into multiple line to fit into windows
15
16 REM: Caller has to free returned vector!!!
17 */
StringToStringArray(char * str,int * maxLen,int minWidth,int * anzahl)18 char **StringToStringArray(char *str, int *maxLen, int minWidth, int *anzahl)
19 {
20 int i, j, k, anz = 0, mxlen = 0, max = 0.8 * MAXSCOL;
21 char **s = MALLOC(sizeof(char*));
22
23 for (k = 0, i = 0; str[i]; i++)
24 {
25 if((i-k) == max || str[i] == '\n')
26 {
27 j = i-1;
28 if (str[i] != '\n')
29 for (; j > 0 && !isspace(str[j]); j--)
30 ;
31 if(j > k)
32 i = j;
33 anz++;
34 s = REALLOC(s, anz * sizeof(char *));
35 s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
36 for (j = k; j <= i; j++)
37 s[anz-1][j-k] = str[j];
38 if (isspace(str[j-1]))
39 j--;
40 if (mxlen < (j-k))
41 mxlen = j - k;
42 s[anz-1][j-k] = '\0';
43 k = i+1;
44 }
45 }
46 anz++;
47 s = REALLOC(s, anz * sizeof(char *));
48 s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
49 for (j = k; j <= i; j++)
50 s[anz-1][j-k] = str[j];
51 if (mxlen < (j-k))
52 mxlen = j - k;
53 if (mxlen < minWidth)
54 mxlen = minWidth;
55
56 *maxLen = mxlen;
57 *anzahl = anz;
58
59 return (s);
60 }
61
62 /*
63 Print error message */
e_error(char * text,int sw,FARBE * f)64 int e_error(char *text, int sw, FARBE *f)
65 {
66 PIC *pic = NULL;
67 int len, i, xa, xe, ya = 8, ye = 14;
68 char *header = NULL;
69
70 fk_cursor(0);
71 WpeMouseChangeShape(WpeErrorShape);
72 if ((len = strlen((char *)text)) < 20 ) len = 20;
73 xa = (80-len)/2 - 2;
74 xe = 82 - (80-len)/2;
75 if (sw == -1) header = "Message";
76 else if (sw == 0) header = "Error";
77 else if (sw == 1) header = "Serious Error";
78 else if (sw == 2) header = "Fatal Error";
79
80 if (sw < 2) pic = e_std_kst(xa, ya, xe, ye, header, 1, f->nr.fb, f->nt.fb, f->ne.fb);
81 if (sw == 2 || pic == NULL)
82 {
83 pic = e_open_view(xa, ya, xe, ye, 0, 0);
84 e_std_rahmen(xa, ya, xe, ye, header, 1, 0, 0);
85 }
86 if (sw < 2)
87 {
88 e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
89 ya + 2, text, f->nt.fb, 0, 0, 0, 0);
90 e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", f->nz.fb, 1, -1,
91 f->ns.fb, f->nt.fb);
92 }
93 else
94 {
95 e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
96 ya + 2, text, 112, 0, 0, 0, 0);
97 e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", 32, 1, -1, 46, 112);
98 }
99 do
100 {
101 #if MOUSE
102 if ((i = e_toupper(e_getch())) == -1)
103 i = e_er_mouse(xa+3, ya,(xe+xa-4)/2, ya+4);
104 #else
105 i = e_toupper(e_getch());
106 #endif
107 } while (i != WPE_ESC && i != WPE_CR && i != 'O');
108 WpeMouseRestoreShape();
109 if (pic != NULL) e_close_view(pic, 1);
110 else e_cls(0, ' ');
111 fk_cursor(1);
112 if (sw == 1) e_quit(WpeEditor->f[WpeEditor->mxedt]);
113 if (sw > 0) WpeExit(sw);
114 return(sw);
115 }
116
117 /* message with selection */
e_message(int sw,char * str,FENSTER * f)118 int e_message(int sw, char *str, FENSTER *f)
119 {
120 int i, ret, mxlen = 0, anz = 0;
121 char **s;
122 W_OPTSTR *o = e_init_opt_kst(f);
123
124 if (!o)
125 return(-1);
126
127 s = StringToStringArray(str, &mxlen, 22, &anz);
128
129 o->ye = MAXSLNS - 6;
130 o->ya = o->ye - anz - 5;
131 o->xa = (MAXSCOL - mxlen - 6)/2;
132 o->xe = o->xa + mxlen + 6;
133
134 o->bgsw = 0;
135 o->name = "Message";
136 for (i = 0; i < anz; i++)
137 {
138 e_add_txtstr((o->xe-o->xa-strlen(s[i]))/2, 2+i, s[i], o);
139 FREE(s[i]);
140 }
141 FREE(s);
142 if (!sw)
143 {
144 o->crsw = AltO;
145 e_add_bttstr((o->xe-o->xa-4)/2, o->ye-o->ya-2, 0, AltO, "Ok", NULL, o);
146 }
147 else
148 {
149 o->crsw = AltY;
150 e_add_bttstr(4, o->ye-o->ya-2, 0, AltY, "Yes", NULL, o);
151 e_add_bttstr((o->xe-o->xa-2)/2, o->ye-o->ya-2, 0, AltN, "No", NULL, o);
152 e_add_bttstr(o->xe-o->xa-9, o->ye-o->ya-2, -1, WPE_ESC, "Cancel", NULL, o);
153 }
154 ret = e_opt_kst(o);
155 freeostr(o);
156 return(ret == WPE_ESC ? WPE_ESC : (ret == AltN ? 'N' : 'Y'));
157 }
158
159 /* First opening of a window */
e_firstl(FENSTER * f,int sw)160 void e_firstl(FENSTER *f, int sw)
161 {
162 f->pic = NULL;
163 f->pic = e_ed_kst(f, f->pic, sw);
164 if (f->pic == NULL)
165 e_error(e_msg[ERR_LOWMEM], 1, f->fb);
166 }
167
168 /* Writing of the file type */
e_pr_filetype(FENSTER * f)169 int e_pr_filetype(FENSTER *f)
170 {
171 int frb = f->fb->es.fb;
172
173 e_pr_char(f->a.x+2, f->e.y, 'A', frb);
174 if (f->ins == 0 || f->ins == 2)
175 e_pr_char(f->a.x+16, f->e.y, 'O', frb);
176 else if (f->ins == 8)
177 e_pr_char(f->a.x+16, f->e.y, 'R', frb);
178 else
179 e_pr_char(f->a.x+16, f->e.y, 'I', frb);
180 if (f->ins > 1)
181 e_pr_char(f->a.x+17, f->e.y, 'S', frb);
182 else
183 e_pr_char(f->a.x+17, f->e.y, 'L', frb);
184 return(0);
185 }
186
187 /* open section of screen and save background */
e_open_view(int xa,int ya,int xe,int ye,int col,int sw)188 PIC *e_open_view(int xa, int ya, int xe, int ye, int col, int sw)
189 {
190 PIC *pic = MALLOC(sizeof(PIC));
191 int i, j;
192
193 if (pic == NULL) return(NULL);
194 pic->a.x = xa;
195 pic->a.y = ya;
196 #ifndef NEWSTYLE
197 if(!WpeIsXwin())
198 {
199 pic->e.x = xe;
200 pic->e.y = ye;
201 }
202 else
203 {
204 pic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
205 pic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
206 }
207 #else
208 pic->e.x = xe;
209 pic->e.y = ye;
210 #endif
211 if (sw!=0)
212 {
213 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
214 pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 3 * (pic->e.y - pic->a.y + 1));
215 #else
216 pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1));
217 #endif
218 if (pic->p == NULL) { FREE(pic); return(NULL); }
219 for (j = pic->a.y; j <= pic->e.y; ++j)
220 for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
221 *( pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) = e_gt_byte(i, j);
222 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
223 e_get_pic_xrect(xa, ya, xe, ye, pic);
224 #endif
225 }
226 else pic->p = (char *)0;
227 if (sw < 2)
228 {
229 for (j = ya; j <= ye; ++j)
230 for (i = xa; i <= xe; ++i)
231 e_pr_char(i, j, ' ', col);
232 }
233 #ifndef NO_XWINDOWS
234 if (WpeIsXwin()) (*e_u_setlastpic)(pic);
235 #endif
236 #ifndef NEWSTYLE
237 if (WpeIsXwin())
238 {
239 if (sw != 0)
240 {
241 if (xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
242 e_pt_col(xe+1, i, SHDCOL);
243 if (xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
244 e_pt_col(xe+2, i, SHDCOL);
245 if (ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++) e_pt_col(i, ye+1, SHDCOL);
246 }
247 }
248 #endif
249 return(pic);
250 }
251
252 /* close screen section - refresh background */
e_close_view(PIC * pic,int sw)253 int e_close_view(PIC *pic, int sw)
254 {
255 int i, j;
256 #ifndef NO_XWINDOWS
257 if (WpeIsXwin()) (*e_u_setlastpic)(NULL);
258 #endif
259 if (pic == NULL) return(-1);
260 if (sw != 0 && pic->p != NULL)
261 {
262 for (j = pic->a.y; j <= pic->e.y; ++j)
263 for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
264 e_pt_byte(i, j, *(pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x)));
265 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
266 e_put_pic_xrect(pic);
267 #endif
268 }
269 else if (sw != 0)
270 {
271 for (j = pic->a.y; j <= pic->e.y; ++j)
272 for (i = pic->a.x; i <= pic->e.x; ++i)
273 e_pr_char(i, j, ' ', 0);
274 }
275 if (sw < 2)
276 {
277 if (pic->p != NULL) FREE(pic->p);
278 FREE(pic);
279 }
280 e_refresh();
281 return(sw);
282 }
283
284 /* Frame for edit window */
e_ed_rahmen(FENSTER * f,int sw)285 void e_ed_rahmen(FENSTER *f, int sw)
286 {
287 extern char *e_hlp;
288 extern int nblst;
289 extern WOPT *blst;
290 char *header = NULL;
291
292 if (!DTMD_ISTEXT(f->dtmd))
293 {
294 if (f->datnam[0]) header = f->datnam;
295 if (f->dtmd == DTMD_FILEDROPDOWN)
296 e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
297 f->fb->es.fb);
298 else
299 e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->nr.fb,
300 f->fb->ne.fb);
301 if (f->winnum < 10 && f->winnum >= 0)
302 e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->nr.fb);
303 else if (f->winnum >= 0)
304 e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->nr.fb);
305 if (sw > 0 && (f->dtmd == DTMD_FILEMANAGER || f->dtmd == DTMD_DATA))
306 {
307 if (f->zoom == 0)
308 e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->ne.fb);
309 else
310 e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->ne.fb);
311 #ifdef NEWSTYLE
312 if (!WpeIsXwin())
313 {
314 #endif
315 e_pr_char(f->e.x-4, f->a.y, '[', f->fb->nr.fb);
316 e_pr_char(f->e.x-2, f->a.y, ']', f->fb->nr.fb);
317 #ifdef NEWSTYLE
318 }
319 else
320 e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
321 #endif
322 blst = f->blst;
323 nblst = f->nblst;
324 e_hlp = f->hlp_str;
325 e_pr_uul(f->fb);
326 }
327 #ifdef NEWSTYLE
328 if (WpeIsXwin())
329 e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
330 #endif
331 return;
332 }
333 if (f->datnam[0])
334 {
335 if (strcmp(f->dirct, f->ed->dirct) == 0 ||
336 f->dtmd == DTMD_HELP || strcmp(f->datnam, BUFFER_NAME) == 0 ||
337 NUM_COLS_ON_SCREEN < 40)
338 {
339 header = (char *)WpeMalloc(strlen(f->datnam) + 1);
340 strcpy(header, f->datnam);
341 }
342 else
343 {
344 header = (char *)WpeMalloc(strlen(f->dirct) + strlen(f->datnam) + 1);
345 strcpy(header, f->dirct);
346 strcat(header, f->datnam);
347 }
348 }
349 e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
350 f->fb->es.fb);
351 if (header)
352 WpeFree(header);
353 if (sw > 0)
354 {
355 e_mouse_bar(f->e.x, f->a.y+1, NUM_LINES_ON_SCREEN - 1, 0, f->fb->em.fb);
356 e_mouse_bar(f->a.x+19, f->e.y, NUM_COLS_ON_SCREEN - 20, 1, f->fb->em.fb);
357 if (f->zoom == 0)
358 e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->es.fb);
359 else
360 e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->es.fb);
361 #ifdef NEWSTYLE
362 if (!WpeIsXwin())
363 {
364 #endif
365 e_pr_char(f->e.x-4, f->a.y, '[', f->fb->er.fb);
366 e_pr_char(f->e.x-2, f->a.y, ']', f->fb->er.fb);
367 #ifdef NEWSTYLE
368 }
369 else
370 e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
371 #endif
372 e_pr_filetype(f);
373 if (WpeIsXwin() && NUM_LINES_ON_SCREEN > 8)
374 {
375 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
376 e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
377 e_make_xrect(f->a.x, f->a.y+2, f->a.x, f->a.y+2, 0);
378 e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
379 e_make_xrect(f->a.x, f->a.y+4, f->a.x, f->a.y+4, 0);
380 e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
381 e_make_xrect(f->a.x, f->a.y+6, f->a.x, f->a.y+6, 0);
382 if (f->ins != 8)
383 {
384 e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
385 e_make_xrect(f->a.x, f->a.y+8, f->a.x, f->a.y+8, 0);
386 }
387 #else
388 e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
389 e_pr_char(f->a.x, f->a.y + 3, MCI, f->fb->em.fb);
390 e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
391 e_pr_char(f->a.x, f->a.y + 5, MCI, f->fb->em.fb);
392 e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
393 if (f->ins != 8)
394 {
395 e_pr_char(f->a.x, f->a.y + 7, MCI, f->fb->em.fb);
396 e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
397 }
398 #endif
399 }
400 e_zlsplt(f);
401 blst = f->blst;
402 nblst = f->nblst;
403 e_hlp = f->hlp_str;
404 e_pr_uul(f->fb);
405 }
406 if (f->winnum < 10 && f->winnum >= 0)
407 e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->er.fb);
408 else if (f->winnum >= 0)
409 e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->er.fb);
410 #ifdef NEWSTYLE
411 if (WpeIsXwin())
412 e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
413 #endif
414 }
415
416 /* Output - screen content */
e_schirm(FENSTER * f,int sw)417 int e_schirm(FENSTER *f, int sw)
418 {
419 int j;
420
421 if (f->dtmd == DTMD_FILEMANAGER)
422 return(WpeDrawFileManager(f));
423 else if (f->dtmd == DTMD_DATA)
424 return(e_data_schirm(f));
425 else if (f->dtmd == DTMD_FILEDROPDOWN)
426 return(e_pr_file_window((FLWND*)f->b, 1, sw, f->fb->er.fb, f->fb->ez.fb,
427 f->fb->frft.fb));
428 if (NUM_LINES_OFF_SCREEN_TOP < 0)
429 NUM_LINES_OFF_SCREEN_TOP = 0;
430
431 #ifdef PROG
432 if (f->c_sw)
433 for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
434 e_pr_c_line(j, f);
435 else
436 #endif
437 for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
438 e_pr_line(j, f);
439 for (; j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
440 e_blk((NUM_COLS_ON_SCREEN - 1), f->a.x + 1, j - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, f->fb->et.fb);
441 return(j);
442 }
443
444 /* Move and modify window */
e_size_move(FENSTER * f)445 int e_size_move(FENSTER *f)
446 {
447 int xa = f->a.x, ya = f->a.y, xe = f->e.x, ye = f->e.y;
448 int c = 0, xmin = 26, ymin = 3;
449
450 e_ed_rahmen(f, 0);
451 if (f->dtmd == DTMD_FILEDROPDOWN)
452 xmin = 15;
453 else if (!DTMD_ISTEXT(f->dtmd))
454 ymin = 9;
455 while ((c = e_getch()) != WPE_ESC && c != WPE_CR)
456 {
457 switch (c)
458 {
459 case CLE:
460 if (xa > 0) { xa--; xe--; }
461 break;
462 case CRI:
463 if (xe < MAXSCOL-1) { xa++; xe++; }
464 break;
465 case CUP:
466 if (ya > 1) { ya--; ye--; }
467 break;
468 case CDO:
469 if (ye < MAXSLNS-2) { ya++; ye++; }
470 break;
471 case SCLE:
472 case CCLE:
473 if ((xe - xa) > xmin) xe--;
474 break;
475 case SCRI:
476 case CCRI:
477 if (xe < MAXSCOL-1) xe++;
478 break;
479 case SCUP:
480 case BUP:
481 if ((ye - ya) > ymin) ye--;
482 break;
483 case SCDO:
484 case BDO:
485 if (ye < MAXSLNS-2) ye++;
486 break;
487 }
488 if (xa != f->a.x || ya != f->a.y || xe != f->e.x || ye != f->e.y)
489 {
490 f->a.x = xa;
491 f->a.y = ya;
492 f->e.x = xe;
493 f->e.y = ye;
494 f->pic = e_ed_kst(f, f->pic, 0);
495 if (f->pic == NULL) e_error(e_msg[ERR_LOWMEM], 1, f->fb);
496 if (f->dtmd == DTMD_FILEDROPDOWN)
497 {
498 FLWND *fw = (FLWND*) f->b;
499 fw->xa = f->a.x+1; fw->xe = f->e.x;
500 fw->ya = f->a.y+1; fw->ye = f->e.y;
501 }
502 e_cursor(f, 0);
503 e_schirm(f, 0);
504 }
505 }
506 e_ed_rahmen(f, 1);
507 return(c);
508 }
509
510 /* Standard Box */
e_std_kst(int xa,int ya,int xe,int ye,char * name,int sw,int fr,int ft,int fes)511 PIC *e_std_kst(int xa, int ya, int xe, int ye, char *name, int sw, int fr,
512 int ft, int fes)
513 {
514 PIC *pic = e_open_view(xa, ya, xe, ye, ft, 1);
515 if (pic == NULL) return (NULL);
516 e_std_rahmen(xa, ya, xe, ye, name, sw, fr, fes);
517 return(pic);
518 }
519
e_change_pic(int xa,int ya,int xe,int ye,PIC * pic,int sw,int frb)520 PIC *e_change_pic(int xa, int ya, int xe, int ye, PIC *pic, int sw, int frb)
521 {
522 int i, j;
523 int box = 2, ax, ay, ex, ey;
524 PIC *newpic;
525 if(sw<0) { sw = -sw; box = 1; }
526 if (pic == NULL)
527 { newpic = e_open_view(xa, ya, xe, ye, frb, box);
528 if (newpic == NULL) return (NULL);
529 }
530 else if (xa > pic->e.x || xe < pic->a.x ||
531 ya > pic->e.y || ye < pic->a.y)
532 { e_close_view(pic, box);
533 newpic = e_open_view(xa, ya, xe, ye, frb, box);
534 if (newpic == NULL) return (NULL);
535 }
536 else
537 {
538 newpic = MALLOC(sizeof(PIC));
539 if(newpic == NULL) return(NULL);
540 newpic->a.x = xa;
541 newpic->a.y = ya;
542 #ifndef NEWSTYLE
543 if(!WpeIsXwin())
544 { newpic->e.x = xe;
545 newpic->e.y = ye;
546 }
547 else
548 { newpic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
549 newpic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
550 }
551 #else
552 newpic->e.x = xe;
553 newpic->e.y = ye;
554 #endif
555 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
556 newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 3
557 * (newpic->e.y - newpic->a.y + 1) );
558 #else
559 newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 2
560 * (newpic->e.y - newpic->a.y + 1) );
561 #endif
562 if (newpic->p == NULL) { FREE(newpic); return(NULL); }
563 ax = pic->a.x > newpic->a.x ? pic->a.x : newpic->a.x;
564 ay = pic->a.y > newpic->a.y ? pic->a.y : newpic->a.y;
565 ex = pic->e.x < newpic->e.x ? pic->e.x : newpic->e.x;
566 ey = pic->e.y < newpic->e.y ? pic->e.y : newpic->e.y;
567 for (j = ay; j <= ey; ++j)
568 for (i = 2*ax; i <= 2*ex+1; ++i)
569 { *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
570 + (i-2*newpic->a.x))
571 = *(pic->p + 2*(pic->e.x-pic->a.x+1)*(j-pic->a.y)
572 + (i - 2*pic->a.x) );
573 }
574
575 for (j = newpic->a.y; j < ay; ++j)
576 for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
577 { *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
578 + (i-2*newpic->a.x)) = e_gt_byte(i, j);
579 }
580
581 for (j = newpic->e.y; j > ey; --j)
582 for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
583 { *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
584 + (i-2*newpic->a.x)) = e_gt_byte(i, j);
585 }
586
587 for (j = newpic->a.y; j <= newpic->e.y; ++j)
588 for (i = 2*newpic->a.x; i < 2*ax; ++i)
589 { *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
590 + (i-2*newpic->a.x)) = e_gt_byte(i, j);
591 }
592
593 for (j = newpic->a.y; j <= newpic->e.y; ++j)
594 for (i = 2*(ex+1); i <= 2*newpic->e.x + 1; ++i)
595 { *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
596 + (i-2*newpic->a.x)) = e_gt_byte(i, j);
597 }
598 for (j = pic->a.y; j < ya; ++j)
599 for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
600 e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
601 *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
602 for (j = pic->a.y; j <= pic->e.y; ++j)
603 for (i = 2*pic->a.x; i < 2*xa; i=i+1)
604 e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
605 *(pic->e.x-pic->a.x+1) + (i - 2*pic->a.x) ) );
606 for (j = pic->e.y; j > ye; --j)
607 for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
608 e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
609 *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
610 for (j = pic->e.y; j >= pic->a.y; --j)
611 for (i = 2*pic->e.x + 1; i > 2*xe; --i)
612 e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
613 *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
614 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
615 e_put_pic_xrect(pic);
616 e_get_pic_xrect(xa, ya, xe, ye, newpic);
617 #endif
618 #ifndef NEWSTYLE
619 if (WpeIsXwin())
620 { if(xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
621 e_pt_col(xe+1, i, SHDCOL);
622 if(xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
623 e_pt_col(xe+2, i, SHDCOL);
624 if(ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++)
625 e_pt_col(i, ye+1, SHDCOL);
626 }
627 #endif
628 FREE(pic->p);
629 FREE(pic);
630 }
631 #ifndef NO_XWINDOWS
632 if (WpeIsXwin()) (*e_u_setlastpic)(newpic);
633 #endif
634 return(newpic);
635 }
636
e_ed_kst(FENSTER * f,PIC * pic,int sw)637 PIC *e_ed_kst(FENSTER *f, PIC *pic, int sw)
638 {
639 PIC *newpic = e_change_pic(f->a.x, f->a.y, f->e.x,
640 f->e.y, pic, sw, f->fb->er.fb);
641 e_ed_rahmen(f, sw);
642 return(newpic);
643 }
644
645 /* delete buffer */
e_close_buffer(BUFFER * b)646 int e_close_buffer(BUFFER *b)
647 {
648 int i;
649
650 if (b != NULL)
651 {
652 e_remove_undo(b->ud, b->cn->numundo + 1);
653 if (b->bf != NULL)
654 {
655 for (i = 0; i < b->mxlines; i++)
656 {
657 if (b->bf[i].s != NULL)
658 FREE( b->bf[i].s );
659 b->bf[i].s = NULL;
660 }
661 FREE(b->bf);
662 }
663 FREE(b);
664 }
665 return(0);
666 }
667
668 /* close window */
e_close_window(FENSTER * f)669 int e_close_window(FENSTER *f)
670 {
671 ECNT *cn = f->ed;
672 FENSTER *f0 = f->ed->f[0];
673 int c = 0;
674 long maxname;
675 char text[256];
676
677 f = cn->f[cn->mxedt];
678 if (f->dtmd == DTMD_FILEMANAGER)
679 {
680 FLBFFR *b = (FLBFFR *)f->b;
681
682 FREE(f->dirct);
683 FREE(b->rdfile);
684 freedf(b->df); freedf(b->fw->df);
685 freedf(b->dd); freedf(b->cd); freedf(b->dw->df);
686 FREE(b->fw);
687 FREE(b->dw);
688 FREE(b);
689 (cn->mxedt)--;
690 cn->curedt = cn->edt[cn->mxedt];
691 e_close_view(f->pic, 1);
692 if (f != f0 && f != NULL)
693 {
694 e_free_find(&f->fd);
695 FREE(f);
696 }
697 if (cn->mxedt > 0)
698 {
699 f = cn->f[cn->mxedt];
700 e_ed_rahmen(f, 1);
701 }
702 return(0);
703 }
704 if (f->dtmd == DTMD_DATA)
705 {
706 FLWND *fw = (FLWND *)f->b;
707 int swt = f->ins;
708
709 #ifdef PROG
710 if (swt == 4 && f->save)
711 e_p_update_prj_fl(f);
712 #endif
713 if (f->dirct)
714 FREE(f->dirct);
715 if (swt == 7)
716 freedf(fw->df);
717 FREE(fw);
718 (cn->mxedt)--;
719 cn->curedt = cn->edt[cn->mxedt];
720 e_close_view(f->pic, 1);
721 if (f != f0 && f != NULL)
722 {
723 e_free_find(&f->fd);
724 FREE(f);
725 }
726 if (cn->mxedt > 0 && (swt < 5 || swt == 7))
727 {
728 f = cn->f[cn->mxedt];
729 e_ed_rahmen(f, 1);
730 }
731 return(0);
732 }
733 if (f == NULL || f->ed->mxedt <= 0)
734 return(0);
735 if (f != f0)
736 {
737 if (f->save != 0 && f->ins != 8)
738 {
739 sprintf(text, "File %s NOT saved!\nDo you want to save File ?", f->datnam);
740 c = e_message(1, text, f);
741 if (c == WPE_ESC)
742 return(c);
743 else if (c == 'Y')
744 e_save(f);
745 }
746 /* Check if file system could have an autosave or emergency save file
747 >12 check is to eliminate dos file systems */
748 if ((maxname = pathconf(f->dirct, _PC_NAME_MAX) >= strlen(f->datnam) + 4) &&
749 (maxname > 12))
750 {
751 remove(e_make_postf(text, f->datnam, ".ASV"));
752 remove(e_make_postf(text, f->datnam, ".ESV"));
753 }
754 if (strcmp(f->datnam, "Messages") && strcmp(f->datnam, "Watches"))
755 e_close_buffer(f->b);
756 if (f->dtmd == DTMD_HELP && f->ins == 8)
757 e_help_free(f);
758 if (f->datnam != NULL)
759 FREE(f->datnam);
760 if (f->dirct != NULL)
761 FREE(f->dirct);
762 if (f && f->s != NULL)
763 FREE(f->s);
764 }
765 (cn->mxedt)--;
766 cn->curedt = cn->edt[cn->mxedt];
767 e_close_view(f->pic, 1);
768 if (f != f0 && f != NULL)
769 {
770 e_free_find(&f->fd);
771 FREE(f);
772 }
773 if (cn->mxedt > 0)
774 {
775 f = cn->f[cn->mxedt];
776 e_ed_rahmen(f, 1);
777 }
778 return(c);
779 }
780
781 /* Toggle among windows */
e_rep_win_tree(ECNT * cn)782 int e_rep_win_tree(ECNT *cn)
783 {
784 int i;
785
786 if (cn->mxedt <= 0) return(0);
787 ini_repaint(cn);
788 for ( i = 1; i < cn->mxedt; i++)
789 {
790 e_firstl(cn->f[i], 0);
791 e_schirm(cn->f[i], 0);
792 }
793 e_firstl(cn->f[i], 1);
794 e_schirm(cn->f[i], 1);
795 e_cursor(cn->f[i], 1);
796 end_repaint();
797 return(0);
798 }
799
e_switch_window(int num,FENSTER * f)800 void e_switch_window(int num, FENSTER *f)
801 {
802 ECNT *cn = f->ed;
803 FENSTER *ft;
804 int n, i, te;
805
806 for (n = 1; cn->edt[n] != num && n < cn->mxedt; n++)
807 ;
808 if (n >= cn->mxedt) return;
809 for (i = cn->mxedt; i >= 1; i--)
810 {
811 FREE(cn->f[i]->pic->p);
812 FREE(cn->f[i]->pic);
813 }
814 ft = cn->f[n];
815 te = cn->edt[n];
816 for ( i = n; i < cn->mxedt; i++)
817 {
818 cn->edt[i] = cn->edt[i+1];
819 cn->f[i] = cn->f[i+1];
820 }
821 cn->f[i] = ft;
822 cn->edt[i] = te;
823 cn->curedt = num;
824 e_rep_win_tree(cn);
825 }
826
827 /* zoom windows */
e_ed_zoom(FENSTER * f)828 int e_ed_zoom(FENSTER *f)
829 {
830 if (f->ed->mxedt > 0)
831 {
832 if(f->zoom == 0)
833 {
834 f->sa = e_set_pnt(f->a.x, f->a.y);
835 f->se = e_set_pnt(f->e.x, f->e.y);
836 f->a = e_set_pnt(0, 1);
837 f->e = e_set_pnt(MAXSCOL-1, MAXSLNS-2);
838 f->zoom = 1;
839 }
840 else
841 {
842 f->a = e_set_pnt(f->sa.x, f->sa.y);
843 f->e = e_set_pnt(f->se.x, f->se.y);
844 f->zoom = 0;
845 }
846 f->pic = e_ed_kst(f, f->pic, 1);
847 if(f->pic == NULL) e_error(e_msg[ERR_LOWMEM], 1, f->fb);
848 e_cursor(f, 1);
849 e_schirm(f, 1);
850 }
851 return(WPE_ESC);
852 }
853
854 /* cascade windows */
e_ed_cascade(FENSTER * f)855 int e_ed_cascade(FENSTER *f)
856 {
857 ECNT *cn = f->ed;
858 int i;
859
860 if (cn->mxedt < 1)
861 return 0; /* no windows open */
862 for (i = cn->mxedt; i >= 1; i--)
863 {
864 FREE(cn->f[i]->pic->p);
865 FREE(cn->f[i]->pic);
866 cn->f[i]->a = e_set_pnt(i-1, i);
867 cn->f[i]->e = e_set_pnt(MAXSCOL-1-cn->mxedt+i, MAXSLNS-2-cn->mxedt+i);
868 }
869 ini_repaint(cn);
870 for ( i = 1; i < cn->mxedt; i++)
871 {
872 e_firstl(cn->f[i], 0);
873 e_schirm(cn->f[i], 0);
874 }
875 e_firstl(cn->f[i], 1);
876 e_schirm(cn->f[i], 1);
877 e_cursor(cn->f[i], 1);
878 end_repaint();
879 return(0);
880 }
881
882 /* Tile windows */
e_ed_tile(FENSTER * f)883 int e_ed_tile(FENSTER *f)
884 {
885 ECNT *cn = f->ed;
886 POINT atmp[MAXEDT+1];
887 POINT etmp[MAXEDT+1];
888 int i, j, ni, nj;
889 int editwin = 0; /* number of editor windows */
890 int editorwin[MAXEDT + 1];
891 int maxlines = MAXSLNS;
892
893 for (i = cn->mxedt; i >= 1; i--)
894 {
895 if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (!DTMD_ISTEXT(cn->f[i]->dtmd) ||
896 ((WpeIsProg()) && ((strcmp(cn->f[i]->datnam, "Messages") == 0) ||
897 (strcmp(cn->f[i]->datnam, "Watches") == 0)))))
898 {
899 editorwin[i] = 0;
900 }
901 else
902 {
903 editwin++;
904 editorwin[i] = 1;
905 }
906 }
907 if (editwin < 1)
908 return(0);
909 if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (WpeIsProg()))
910 {
911 maxlines -= MAXSLNS / 3 - 1;
912 }
913 for (i = cn->mxedt; i >= 1; i--)
914 {
915 FREE(cn->f[i]->pic->p);
916 FREE(cn->f[i]->pic);
917 }
918 for (ni = editwin, nj = 1; ni > 1; ni--)
919 {
920 nj = editwin / ni;
921 if (editwin % ni)
922 nj++;
923 if (nj >= ni)
924 break;
925 }
926 if (nj*ni < editwin)
927 nj++;
928 for (j = 0; j < nj; j++)
929 {
930 for (i = 0; i < ni; i++)
931 {
932 if (j == 0)
933 {
934 if (i == 0)
935 {
936 atmp[j*ni+i].x = i * MAXSCOL / ni;
937 etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
938 if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
939 etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
940 }
941 else
942 {
943 etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
944 atmp[j*ni+i].x = etmp[j*ni+i-1].x + 1;
945 if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
946 etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
947 if (etmp[j*ni+i].x >= MAXSCOL)
948 {
949 etmp[j*ni+i].x = MAXSCOL - 1;
950 atmp[j*ni+i].x = etmp[j*ni+i].x - 26;
951 }
952 }
953 }
954 else
955 {
956 atmp[j*ni+i].x = atmp[(j-1)*ni+i].x;
957 etmp[j*ni+i].x = etmp[(j-1)*ni+i].x;
958 /* make the last window full width */
959 if ((j * ni + i) == (editwin - 1))
960 etmp[j * ni + i].x = MAXSCOL - 1;
961 }
962 }
963 }
964 for (i = 0; i < ni; i++)
965 {
966 for (j = 0; j < nj; j++)
967 {
968 if (i == 0)
969 {
970 if (j == 0)
971 {
972 atmp[j*ni+i].y = j * (maxlines-2) / nj + 1;
973 etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
974 if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
975 etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
976 }
977 else
978 {
979 etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
980 atmp[j*ni+i].y = etmp[(j-1)*ni+i].y + 1;
981 if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
982 etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
983 if (etmp[j*ni+i].y > maxlines - 2)
984 {
985 etmp[j*ni+i].y = maxlines - 2;
986 atmp[j*ni+i].y = etmp[j*ni+i].y - 3;
987 }
988 }
989 }
990 else
991 {
992 atmp[j*ni+i].y = atmp[j*ni+i-1].y;
993 etmp[j*ni+i].y = etmp[j*ni+i-1].y;
994 }
995 }
996 }
997 for (i = 0, j = 1; i < editwin; i++, j++)
998 {
999 while (!editorwin[j]) j++;
1000 cn->f[j]->a = e_set_pnt(atmp[i].x, atmp[i].y);
1001 cn->f[j]->e = e_set_pnt(etmp[i].x, etmp[i].y);
1002 cn->f[j]->zoom = 0; /* Make sure zoom is off */
1003 }
1004 ini_repaint(cn);
1005 for ( i = 1; i < cn->mxedt; i++)
1006 {
1007 e_firstl(cn->f[i], 0);
1008 e_schirm(cn->f[i], 0);
1009 }
1010 e_firstl(cn->f[i], 1);
1011 e_schirm(cn->f[i], 1);
1012 e_cursor(cn->f[i], 1);
1013 end_repaint();
1014 return(0);
1015 }
1016
1017 /* call next window */
e_ed_next(FENSTER * f)1018 int e_ed_next(FENSTER *f)
1019 {
1020 if (f->ed->mxedt > 0) e_switch_window(f->ed->edt[1], f);
1021 return(0);
1022 }
1023
1024 /* write a line (screen content) */
e_pr_line(int y,FENSTER * f)1025 void e_pr_line(int y, FENSTER *f)
1026 {
1027 BUFFER *b = f->b;
1028 SCHIRM *s = f->s;
1029 int i, j, k, frb;
1030 #ifdef DEBUGGER
1031 int fsw = 0;
1032 #endif
1033
1034 for (i = j = 0; j < NUM_COLS_OFF_SCREEN_LEFT; j++, i++)
1035 {
1036 if (*(b->bf[y].s + i) == WPE_TAB)
1037 j += (f->ed->tabn - j % f->ed->tabn - 1);
1038 else if(((unsigned char) *(b->bf[y].s + i)) > 126)
1039 {
1040 j++;
1041 if (((unsigned char) *(b->bf[y].s + i)) < 128 + ' ')
1042 j++;
1043 }
1044 else if (*(b->bf[y].s + i) < ' ') j++;
1045 }
1046 if (j > NUM_COLS_OFF_SCREEN_LEFT) i--;
1047 #ifdef DEBUGGER
1048 for (j = 1; j <= s->brp[0]; j++)
1049 if (s->brp[j] == y) { fsw = 1; break; }
1050 for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1051 {
1052 if (y == s->da.y && i >= s->da.x && i < s->de.x )
1053 frb = s->fb->dy.fb;
1054 else if (fsw) frb = s->fb->db.fb;
1055 /* else if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y) */
1056 else if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
1057 frb = s->fb->ek.fb;
1058 #else
1059 for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1060 {
1061 if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
1062 frb = s->fb->ek.fb;
1063 #endif
1064 /* if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y)
1065 || (i == s->pt[2].x && y == s->pt[2].y) || (i == s->pt[3].x && y == s->pt[3].y)
1066 || (i == s->pt[4].x && y == s->pt[4].y) || (i == s->pt[5].x && y == s->pt[5].y)
1067 || (i == s->pt[6].x && y == s->pt[6].y) || (i == s->pt[7].x && y == s->pt[7].y)
1068 || (i == s->pt[8].x && y == s->pt[8].y) || (i == s->pt[9].x && y == s->pt[9].y))
1069 frb = s->fb->ek.fb;
1070 */
1071 else if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
1072 (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
1073 (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
1074 (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
1075 frb = s->fb->ez.fb;
1076 else
1077 frb = s->fb->et.fb;
1078
1079 if (f->dtmd == DTMD_HELP)
1080 {
1081 if (*(b->bf[y].s + i) == HBG || *(b->bf[y].s + i) == HFB ||
1082 *(b->bf[y].s + i) == HHD || *(b->bf[y].s + i) == HBB)
1083 {
1084 if (*(b->bf[y].s + i) == HHD) frb = s->fb->hh.fb;
1085 else if(*(b->bf[y].s + i) == HBB) frb = s->fb->hm.fb;
1086 else frb = s->fb->hb.fb;
1087 #ifdef NEWSTYLE
1088 if (*(b->bf[y].s + i) != HBB) k = j;
1089 else k = -1;
1090 #endif
1091 for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1092 j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1093 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1094 y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
1095 j--;
1096 #ifdef NEWSTYLE
1097 if (WpeIsXwin() && k >= 0)
1098 e_make_xrect(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + k + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1099 f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, 0);
1100 #endif
1101 continue;
1102 }
1103 else if (*(b->bf[y].s + i) == HFE)
1104 {
1105 for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
1106 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1107 ' ', s->fb->hh.fb);
1108 return;
1109 }
1110 else if (*(b->bf[y].s + i) == HNF)
1111 {
1112 for (k = j, i++; b->bf[y].s[i] != ':' && i < b->bf[y].len &&
1113 j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1114 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1115 y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), s->fb->hb.fb);
1116 #ifdef NEWSTYLE
1117 if (WpeIsXwin())
1118 e_make_xrect(f->a.x-NUM_COLS_OFF_SCREEN_LEFT+k+1, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1,
1119 f->a.x-NUM_COLS_OFF_SCREEN_LEFT+j, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1, 0);
1120 #endif
1121 for (; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1122 j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1123 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1124 y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
1125 for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1126 j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1127 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1128 y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
1129 for (; b->bf[y].s[i] != '.' && i < b->bf[y].len &&
1130 j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1131 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1132 y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
1133 j--;
1134 continue;
1135 }
1136 else if (*(b->bf[y].s + i) == HED) { j--; continue; }
1137 }
1138 if (*(b->bf[y].s + i) == WPE_TAB)
1139 for (k = f->ed->tabn - j % f->ed->tabn; k > 1 &&
1140 j < NUM_COLS_ON_SCREEN + NUM_COLS_OFF_SCREEN_LEFT - 2; k--, j++)
1141 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1142 ' ', frb);
1143 else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126)
1144 {
1145 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1146 '@', frb);
1147 if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1148 if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ' &&
1149 j < COL_NUM_ON_SCREEN_RIGHT)
1150 {
1151 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1152 '^', frb);
1153 if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1154 }
1155 }
1156 else if (*(b->bf[y].s + i) < ' ')
1157 {
1158 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1159 '^', frb);
1160 if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1161 }
1162 if (*(b->bf[y].s + i) == WPE_TAB)
1163 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
1164 else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126 &&
1165 j < COL_NUM_ON_SCREEN_RIGHT)
1166 {
1167 if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ')
1168 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1169 ((unsigned char) *(b->bf[y].s + i)) + 'A' - 129, frb);
1170 else
1171 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1172 ((unsigned char) *(b->bf[y].s + i)) - 128, frb);
1173 }
1174 else if (*(b->bf[y].s + i) < ' ' && j < COL_NUM_ON_SCREEN_RIGHT)
1175 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1176 *(b->bf[y].s + i) + 'A' - 1, frb);
1177 else
1178 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1179 *(b->bf[y].s + i), frb);
1180 }
1181
1182 if ((i == b->bf[y].len) && (f->ed->edopt & ED_SHOW_ENDMARKS) &&
1183 (DTMD_ISMARKABLE(f->dtmd)) && (j < COL_NUM_ON_SCREEN_RIGHT))
1184 {
1185 if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
1186 (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
1187 (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
1188 (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
1189 {
1190 if (*(b->bf[y].s + i) == WPE_WR)
1191 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1192 PWR, s->fb->ez.fb);
1193 else
1194 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1195 PNL, s->fb->ez.fb);
1196 }
1197 else
1198 {
1199 if (*(b->bf[y].s + i) == WPE_WR)
1200 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1201 PWR, s->fb->et.fb);
1202 else
1203 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1204 PNL, s->fb->et.fb);
1205 }
1206 j++;
1207 }
1208
1209 for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
1210 e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1211 ' ', s->fb->et.fb);
1212 }
1213
1214 /* draw standard-box frame */
1215 void e_std_rahmen(int xa, int ya, int xe, int ye, char *name, int sw, int frb,
1216 int fes)
1217 {
1218 int i;
1219 char rhm[2][6];
1220 char *short_name;
1221
1222 rhm[0][0] = RE1; rhm[0][1] = RE2; rhm[0][2] = RE3; rhm[0][3] = RE4;
1223 rhm[0][4] = RE5; rhm[0][5] = RE6; rhm[1][0] = RD1; rhm[1][1] = RD2;
1224 rhm[1][2] = RD3; rhm[1][3] = RD4; rhm[1][4] = RD5; rhm[1][5] = RD6;
1225 for (i = xa + 1; i < xe; i++)
1226 {
1227 e_pr_char(i, ya, rhm[sw][4], frb);
1228 e_pr_char(i, ye, rhm[sw][4], frb);
1229 }
1230 for (i = ya + 1; i < ye; i++)
1231 {
1232 e_pr_char(xa, i, rhm[sw][5], frb);
1233 e_pr_char(xe, i, rhm[sw][5], frb);
1234 }
1235 e_pr_char(xa, ya, rhm[sw][0], frb);
1236 e_pr_char(xa, ye, rhm[sw][2], frb);
1237 e_pr_char(xe, ya, rhm[sw][1], frb);
1238 e_pr_char(xe, ye, rhm[sw][3], frb);
1239
1240 if (name)
1241 {
1242 if (strlen(name) < xe - xa - 14)
1243 e_pr_str((xa+xe-strlen(name))/2, ya, name, frb, 0, 0, 0, 0);
1244 else
1245 {
1246 short_name = strdup(name);
1247 strcpy(short_name + xe - xa - 17, "...");
1248 e_pr_str(xa + 7, ya, short_name, frb, 0, 0, 0, 0);
1249 free(short_name);
1250 }
1251 }
1252 if (sw != 0)
1253 {
1254 e_pr_char(xa+3, ya, WBT, fes);
1255 #ifdef NEWSTYLE
1256 if (!WpeIsXwin())
1257 #endif
1258 {
1259 e_pr_char(xa+2, ya, '[', frb);
1260 e_pr_char(xa+4, ya, ']', frb);
1261 }
1262 #ifdef NEWSTYLE
1263 else e_make_xrect(xa+2, ya, xa+4, ya, 0);
1264 }
1265 if (WpeIsXwin()) e_make_xr_rahmen(xa, ya, xe, ye, sw);
1266 #else
1267 }
1268 /*
1269 if(xe < MAXSCOL-1) for(i = ya+1; i <= ye; i++) e_pt_col(xe+1, i, SHDCOL);
1270 if(ye < MAXSLNS-2) for(i = xa+1; i <= xe+1 && i < MAXSCOL; i++)
1271 e_pt_col(i, ye+1, SHDCOL);
1272 */
1273 #endif
1274 }
1275
e_add_df(char * str,struct dirfile * df)1276 struct dirfile *e_add_df(char *str, struct dirfile *df)
1277 {
1278 int i, n;
1279 char *tmp;
1280
1281 if (df == NULL)
1282 { df = MALLOC(sizeof(struct dirfile));
1283 df->anz = 0;
1284 df->name = MALLOC(sizeof(char*));
1285 }
1286 for(n = 0; n < df->anz && *df->name[n] && strcmp(df->name[n], str); n++);
1287 if(n == df->anz)
1288 { if(df->anz == MAXSVSTR - 1) FREE(df->name[df->anz-1]);
1289 else
1290 { df->anz++;
1291 df->name = REALLOC(df->name, df->anz * sizeof(char*));
1292 }
1293 for(i = df->anz-1; i > 0; i--) df->name[i] = df->name[i-1];
1294 df->name[0] = MALLOC((strlen(str)+1) * sizeof(char));
1295 strcpy(df->name[0], str);
1296 }
1297 else
1298 { tmp = df->name[n];
1299 for(i = n; i > 0; i--) df->name[i] = df->name[i-1];
1300 if(!tmp[0])
1301 { FREE(tmp);
1302 df->name[0] = MALLOC((strlen(str) + 1) * sizeof(char));
1303 strcpy(df->name[0], str);
1304 }
1305 else df->name[0] = tmp;
1306 }
1307 return(df);
1308 }
1309
e_sv_window(int xa,int ya,int * n,struct dirfile * df,FENSTER * f)1310 int e_sv_window(int xa, int ya, int *n, struct dirfile *df, FENSTER *f)
1311 {
1312 ECNT *cn = f->ed;
1313 int ret, ye = ya + 6;
1314 int xe = xa +21;
1315 FLWND *fw = MALLOC(sizeof(FLWND));
1316
1317 if ((f = (FENSTER *) MALLOC(sizeof(FENSTER))) == NULL)
1318 e_error(e_msg[ERR_LOWMEM], 1, cn->fb);
1319 if (xe > MAXSCOL-3) { xe = MAXSCOL - 3; xa = xe - 21; }
1320 if (ye > MAXSLNS-3) { ye = MAXSLNS - 3; ya = ye - 6; }
1321 f->fb = cn->fb;
1322 f->a = e_set_pnt(xa, ya);
1323 f->e = e_set_pnt(xe, ye);
1324 f->dtmd = DTMD_FILEDROPDOWN;
1325 f->zoom = 0;
1326 f->ed = cn;
1327 f->c_sw = NULL;
1328 f->c_st = NULL;
1329 f->fd.dirct = NULL;
1330 f->winnum = -1;
1331 f->datnam = "";
1332 if (!(f->pic = e_ed_kst(f, NULL, 1)))
1333 { e_error(e_msg[ERR_LOWMEM], 0, f->fb); return(0); }
1334 f->b = (BUFFER *)fw;
1335 fw->mxa = xa; fw->mxe = xe; fw->mya = ya; fw->mye = ye;
1336 fw->xa = xa+1; fw->xe = xe; fw->ya = ya+1; fw->ye = ye;
1337 fw->df = df; fw->srcha = 0; fw->f = f;
1338 fw->nf = fw->ia = fw->ja = 0;
1339 do
1340 {
1341 ret = e_file_window(0, fw, f->fb->er.fb, f->fb->ez.fb);
1342 #if MOUSE
1343 if (ret < 0) ret = e_rahmen_mouse(f);
1344 #endif
1345 if ((ret == AF2 && !(f->ed->edopt & ED_CUA_STYLE)) ||
1346 (f->ed->edopt & ED_CUA_STYLE && ret == CtrlL))
1347 e_size_move(f);
1348 } while(ret != WPE_CR && ret != WPE_ESC);
1349 *n = fw->nf;
1350 e_close_view(f->pic, 1);
1351 FREE(fw);
1352 FREE(f);
1353 return(ret);
1354 }
1355
e_schr_lst_wsv(char * str,int xa,int ya,int n,int len,int ft,int fz,struct dirfile ** df,FENSTER * f)1356 int e_schr_lst_wsv(char *str, int xa, int ya, int n, int len, int ft,
1357 int fz, struct dirfile **df, FENSTER *f)
1358 {
1359 #if MOUSE
1360 extern struct mouse e_mouse;
1361 #endif
1362 int ret, num;
1363 do
1364 { *df = e_add_df(str, *df);
1365 #ifndef NEWSTYLE
1366 ret = e_schreib_leiste(str, xa, ya, n-4, len, ft, fz);
1367 #else
1368 ret = e_schreib_leiste(str, xa, ya, n-3, len, ft, fz);
1369 #endif
1370 #if MOUSE
1371 if(ret < 0 && e_mouse.y == ya && e_mouse.x >= xa+n-3
1372 && e_mouse.x <= xa+n-1) ret = CDO;
1373 #endif
1374 if (ret == CDO && e_sv_window(xa+n, ya, &num, *df, f) == WPE_CR)
1375 strcpy(str, (*df)->name[num]);
1376 } while(ret == CDO);
1377 return(ret);
1378 }
1379
e_schr_nchar_wsv(char * str,int x,int y,int n,int max,int col,int csw)1380 int e_schr_nchar_wsv(char *str, int x, int y, int n, int max, int col,
1381 int csw)
1382 #ifdef NEWSTYLE
1383 {
1384 e_pr_char(x+max-3, y, ' ', csw);
1385 e_pr_char(x+max-2, y, WSW, csw);
1386 e_pr_char(x+max-1, y, ' ', csw);
1387 e_make_xrect(x+max-3, y, x+max-1, y, 0);
1388 return(e_schr_nchar(str, x, y, n, max-3, col));
1389 }
1390 #else
1391 {
1392 #if !defined(NO_XWINDOWS)
1393 int swcol = (e_gt_col(x+max, y) / 16) * 16;
1394 if (WpeIsXwin())
1395 {
1396 e_pr_char(x+max, y, SCR, swcol);
1397 e_pr_char(x+max, y+1, SCD, swcol);
1398 e_pr_char(x+max-1, y+1, SCD, swcol);
1399 e_pr_char(x+max-2, y+1, SCD, swcol);
1400 }
1401 #endif
1402 e_pr_char(x+max-3, y, ' ', csw);
1403 e_pr_char(x+max-2, y, WSW, csw);
1404 e_pr_char(x+max-1, y, ' ', csw);
1405 return(e_schr_nchar(str, x, y, n, max-4, col));
1406 }
1407 #endif
1408
e_mess_win(char * header,char * str,PIC ** pic,FENSTER * f)1409 int e_mess_win(char *header, char *str, PIC **pic, FENSTER *f)
1410 {
1411 ECNT *cn = f->ed;
1412 extern int (*e_u_kbhit)(void);
1413 #if MOUSE
1414 extern struct mouse e_mouse;
1415 #endif
1416 int xa, ya, xe, ye, num, anz = 0, mxlen = 0, i, j;
1417 char **s;
1418
1419 s = StringToStringArray(str, &mxlen, strlen(header) + 8, &anz);
1420
1421 ya = (MAXSLNS - anz - 6)/2;
1422 ye = ya + anz + 5;
1423 xa = (MAXSCOL - mxlen - 6)/2;
1424 xe = xa + mxlen + 6;
1425 if (ya < 2) ya = 2;
1426 if (ye > MAXSLNS-3) ye = MAXSLNS - 3;
1427 num = anz;
1428 if (num > ye - ya - 5)
1429 {
1430 num = ye - ya - 5;
1431 strcpy(s[num-1], "...");
1432 }
1433
1434 if (!(*pic) || (*pic)->e.x != xe || (*pic)->a.x != xa || (*pic)->e.x < xe)
1435 {
1436 *pic = e_change_pic(xa, ya, xe, ye, *pic, 1, cn->fb->nt.fb);
1437 for (i = xa + 1; i < xe; i++)
1438 {
1439 e_pr_char(i, ye-2, ' ', f->fb->nt.fb);
1440 e_pr_char(i, ye-1, ' ', f->fb->nt.fb);
1441 }
1442 e_pr_str((xe + xa - 6)/2, ye-2, "Ctrl C", cn->fb->nz.fb, -1, -1,
1443 cn->fb->ns.fb, cn->fb->nt.fb);
1444 }
1445 e_std_rahmen(xa, ya, xe, ye, header, 1, cn->fb->nr.fb, cn->fb->ne.fb);
1446 for (i = xa + 1; i < xe; i++)
1447 e_pr_char(i, ya+1, ' ', cn->fb->nr.fb);
1448 for (j = 0; j < num; j++)
1449 {
1450 e_pr_char(xa+1, ya+2+j, ' ', cn->fb->nt.fb);
1451 e_pr_char(xa+2, ya+2+j, ' ', cn->fb->nt.fb);
1452 e_pr_str(xa+3, ya+2+j, s[j], cn->fb->nt.fb, 0, 0, 0, 0);
1453 for (i = xa+strlen(s[j])+3; i < xe; i++)
1454 e_pr_char(i, ya+2+j, ' ', cn->fb->nt.fb);
1455 }
1456 for (j += ya+2; j < ye-2; j++)
1457 for (i = xa + 1; i < xe; i++)
1458 e_pr_char(i, j, ' ', cn->fb->nt.fb);
1459 for (i = 0; i < anz; i++)
1460 FREE(s[i]);
1461 FREE(s);
1462 #ifndef NO_XWINDOWS
1463 if (WpeIsXwin())
1464 {
1465 while ((i = (*e_u_kbhit)()))
1466 {
1467 if (i == -1 && e_mouse.y == ye-2 && e_mouse.x > (xe + xa - 10)/2 &&
1468 e_mouse.x < (xe + xa + 6)/2 )
1469 i = CtrlC;
1470 if (i == CtrlC) break;
1471 }
1472 }
1473 else
1474 #endif
1475 while ((i = (*e_u_kbhit)()) && i != CtrlC)
1476 ;
1477 return(i == CtrlC ? 1 : 0);
1478 }
1479
e_opt_sec_box(int xa,int ya,int num,OPTK * opt,FENSTER * f,int sw)1480 int e_opt_sec_box(int xa, int ya, int num, OPTK *opt, FENSTER *f, int sw)
1481 {
1482 PIC *pic;
1483 int n, nold, max = 0, i, c = 0, xe, ye = ya + num + 1;
1484 for(i = 0; i < num; i++)
1485 if((n = strlen(opt[i].t)) > max) max = n;
1486 xe = xa + max + 3;
1487 pic = e_std_kst(xa, ya, xe, ye, NULL, sw, f->fb->nr.fb, f->fb->nt.fb, f->fb->ne.fb);
1488 if(pic == NULL) { e_error(e_msg[ERR_LOWMEM], 0, f->fb); return(-2); }
1489 for (i = 0; i < num; i++)
1490 e_pr_str_wsd(xa+2, ya+i+1, opt[i].t, f->fb->mt.fb, opt[i].x,
1491 1, f->fb->ms.fb, xa+1, xe-1);
1492 #if MOUSE
1493 while (e_mshit() != 0);
1494 #endif
1495 n = 0; nold = 1;
1496 while (c != WPE_ESC && c != WPE_CR)
1497 { if (nold != n)
1498 { e_pr_str_wsd(xa+2, nold+ya+1, opt[nold].t, f->fb->mt.fb,
1499 opt[nold].x, 1, f->fb->ms.fb, xa+1, xe-1);
1500 e_pr_str_wsd(xa+2, n+ya+1, opt[n].t, f->fb->mz.fb,
1501 opt[n].x, 1, f->fb->mz.fb, xa+1, xe-1);
1502 nold = n;
1503 }
1504 #if MOUSE
1505 if( (c = e_toupper(e_getch())) == -1)
1506 c = e_m2_mouse(xa, ya, xe, ye, opt);
1507 #else
1508 c = e_toupper(e_getch());
1509 #endif
1510 for (i = 0; i < ye - ya - 1; i++)
1511 if( c == opt[i].o) { c = WPE_CR; n = i; break; }
1512 if (i > ye - ya) c = WPE_ESC;
1513 else if ( c == CUP || c == CtrlP ) n = n > 0 ? n-1 : ye - ya - 2 ;
1514 else if ( c == CDO || c == CtrlN ) n = n < ye-ya-2 ? n+1 : 0 ;
1515 else if ( c == POS1 || c == CtrlA ) n = 0;
1516 else if ( c == ENDE || c == CtrlE ) n = ye-ya-2;
1517 }
1518 if(sw == 1) e_close_view(pic, 1);
1519 return(c == WPE_ESC ? -1 : n);
1520 }
1521
e_make_win_list(FENSTER * f)1522 struct dirfile *e_make_win_list(FENSTER *f)
1523 {
1524 int i;
1525 struct dirfile *df;
1526
1527 if (!(df = MALLOC(sizeof(struct dirfile)))) return(NULL);
1528 df->anz = f->ed->mxedt;
1529 if (!(df->name = MALLOC(df->anz * sizeof(char *))))
1530 {
1531 FREE(df);
1532 return(NULL);
1533 }
1534 for (i = 0; i < df->anz; i++)
1535 {
1536 if (f->ed->f[df->anz-i]->datnam)
1537 {
1538 if (!(df->name[i] =
1539 MALLOC((strlen(f->ed->f[df->anz-i]->datnam)+1) * sizeof(char))))
1540 {
1541 df->anz = i;
1542 freedf(df);
1543 return(NULL);
1544 }
1545 else strcpy(df->name[i], f->ed->f[df->anz-i]->datnam);
1546 }
1547 else
1548 {
1549 if (!(df->name[i] = MALLOC(sizeof(char))))
1550 {
1551 df->anz = i;
1552 freedf(df);
1553 return(NULL);
1554 }
1555 else *df->name[i] = '\0';
1556 }
1557 }
1558 return(df);
1559 }
1560
e_list_all_win(FENSTER * f)1561 int e_list_all_win(FENSTER *f)
1562 {
1563 int i;
1564
1565 for (i = f->ed->mxedt; i > 0; i--)
1566 if (f->ed->f[i]->dtmd == DTMD_DATA && f->ed->f[i]->ins == 7)
1567 {
1568 e_switch_window(f->ed->edt[i], f);
1569 return(0);
1570 }
1571 return(e_data_first(7, f->ed, NULL));
1572 }
1573
1574 #ifdef NEWSTYLE
e_get_pic_xrect(int xa,int ya,int xe,int ye,PIC * pic)1575 int e_get_pic_xrect(int xa, int ya, int xe, int ye, PIC *pic)
1576 {
1577 int i = xa, j, ebbg;
1578
1579 ebbg = (xe - xa + 1) * 2 * (ye - ya + 1);
1580 for (j = ya; j <= ye; ++j)
1581 for (i = xa; i <= xe; ++i)
1582 *( pic->p + ebbg + (j-ya)*(xe-xa+1) + (i-xa) ) = extbyte[j*MAXSCOL + i];
1583 return(i);
1584 }
1585
e_put_pic_xrect(PIC * pic)1586 int e_put_pic_xrect(PIC *pic)
1587 {
1588 int i = 0, j;
1589 int ebbg = (pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1);
1590
1591 for (j = pic->a.y; j <= pic->e.y; ++j)
1592 for (i = pic->a.x; i <= pic->e.x; ++i)
1593 extbyte[j*MAXSCOL+i] =
1594 *(pic->p + ebbg + (j-pic->a.y)*(pic->e.x-pic->a.x+1) + (i-pic->a.x));
1595 return(i);
1596 }
1597
e_make_xrect_abs(int xa,int ya,int xe,int ye,int sw)1598 int e_make_xrect_abs(int xa, int ya, int xe, int ye, int sw)
1599 {
1600 int j;
1601
1602 for (j = xa; j <= xe; j++)
1603 *(extbyte+ya*MAXSCOL+j) = *(extbyte+ye*MAXSCOL+j) = 0;
1604 for (j = ya; j <= ye; j++)
1605 *(extbyte+j*MAXSCOL+xa) = *(extbyte+j*MAXSCOL+xe) = 0;
1606 return(e_make_xrect(xa, ya, xe, ye, sw));
1607 }
1608
e_make_xrect(int xa,int ya,int xe,int ye,int sw)1609 int e_make_xrect(int xa, int ya, int xe, int ye, int sw)
1610 {
1611 int j;
1612
1613 if (sw & 2)
1614 {
1615 sw = (sw & 1) ? 16 : 0;
1616 for (j = xa+1; j < xe; j++)
1617 {
1618 *(extbyte+ya*MAXSCOL+j) |= (sw | 4);
1619 *(extbyte+ye*MAXSCOL+j) |= (sw | 1);
1620 }
1621 for (j = ya+1; j < ye; j++)
1622 {
1623 *(extbyte+j*MAXSCOL+xa) |= (sw | 2);
1624 *(extbyte+j*MAXSCOL+xe) |= (sw | 8);
1625 }
1626 }
1627 else
1628 {
1629 sw = (sw & 1) ? 16 : 0;
1630 for (j = xa; j <= xe; j++)
1631 {
1632 *(extbyte+ya*MAXSCOL+j) |= (sw | 1);
1633 *(extbyte+ye*MAXSCOL+j) |= (sw | 4);
1634 }
1635 for (j = ya; j <= ye; j++)
1636 {
1637 *(extbyte+j*MAXSCOL+xa) |= (sw | 8);
1638 *(extbyte+j*MAXSCOL+xe) |= (sw | 2);
1639 }
1640 }
1641 return(j);
1642 }
1643
e_make_xr_rahmen(int xa,int ya,int xe,int ye,int sw)1644 int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw)
1645 {
1646 if (!sw)
1647 {
1648 e_make_xrect(xa, ya, xe, ye, 0);
1649 e_make_xrect(xa, ya, xe, ye, 2);
1650 }
1651 else
1652 {
1653 e_make_xrect(xa+1, ya, xe-1, ya, 0);
1654 e_make_xrect(xa+1, ye, xe-1, ye, 0);
1655 e_make_xrect(xa, ya+1, xa, ye-1, 0);
1656 e_make_xrect(xe, ya+1, xe, ye-1, 0);
1657 e_make_xrect(xa, ya, xa, ya, 0);
1658 e_make_xrect(xe, ya, xe, ya, 0);
1659 e_make_xrect(xe, ye, xe, ye, 0);
1660 e_make_xrect(xa, ye, xa, ye, 0);
1661 }
1662 return(sw);
1663 }
1664 #endif
1665
1666