1 
2 /****************************************************************************
3 
4 ****************************************************************************/
5 
6 #include "psllw.h"
7 #include  <stdio.h>
8 #include "winstruc.c"
9 #include "psllcall.h"
10 #include "string.h"
11 
12 extern int input_mark;
13 
14 #ifdef ALPHA
15 #define MY_LONG __int64
16 #define ADDRESSINGUNITSPERITEM 8
17 #else
18 #define MY_LONG long
19 #define ADDRESSINGUNITSPERITEM 4
20 #endif
21 
22 long my_gets(char * buf);
23 extern int  win_mode;
24 extern int slave_alife;
25 extern MY_LONG psl_callback1, psl_callback2, psl_callback3, psl_callback4;
26 
27 MY_LONG bruch_bruch = 0;
28 
29 static HWND hcaller=NULL;
30 
31 FILE * DriFileFile;
32 HBRUSH BackgroundBrush;
33 
34 char szAppName[] = "Reduce";   // The name of this application
35 
36 /****************************************************************************
37 
38     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
39 
40     PURPOSE: calls initialization function, processes message loop
41 
42 ****************************************************************************/
43 
44 LPSTR CmdLine;
45 MSG msg;
46 
WinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow)47 APIENTRY WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
48 HINSTANCE hInstance;
49 HINSTANCE hPrevInstance;
50 LPSTR lpCmdLine;
51 int nCmdShow;
52 {
53     MSG msg;
54 
55     CmdLine = lpCmdLine;
56 
57     if (hPrevInstance) return(FALSE);
58 
59     crack(CmdLine);
60 
61     if(min_mode()) nCmdShow = SW_MINIMIZE;
62 
63     if (!InitApplication(hInstance))
64 	    return (FALSE);
65 
66     if (!InitInstance(hInstance, nCmdShow))
67 	return (FALSE);
68 
69     if(!Catch(CatchBuf)) haupt();
70 
71 PostQuitMessage(1);
72     return (msg.wParam);
73 }
74 
75 /* second part of initialization, to be performed after allocation of
76    LISP memory
77       mode=1: batch mode
78    */
79 
init2(int mode,int kernel)80 init2(int mode,int kernel)
81   {
82       font_nr = get_profile_int("FONT",IDM_FONT_SYS);
83       if (font_nr <= IDM_FONT || IDM_FONT_HI < font_nr) font_nr = IDM_FONT_SYS;
84       if (font_nr != IDM_FONT_SYS)
85 	 { newfont(font_nr,0); get_geometry(0); }
86 
87 
88   }
89 
90 /* third part of initialization, to be performed after loading the image */
91 
init3()92 init3()
93   {
94     char dir[128];
95     int sm;
96     psl_call(PSLCALL_RESIZE,wColumns,0,0);
97     get_profile_string("DIR","",dir,128);
98 
99     graphics_mode = get_profile_int("GRAPHICS_MODE",0);
100     set_graphics_mode(graphics_mode);
101 
102     if(dir[0]) my_cd(dir,0);
103 
104     set_title();
105   }
106 
107 
haupt()108 haupt()
109   {
110     int i,j;
111     char zeile[100];
112 
113     DragAcceptFiles(hWnd,TRUE);
114 
115     win_mode = 1;
116     psl_callback1 = 0;
117     i = lisp_main(argc,argv);
118     close_all();
119     return(i);
120   }
121 
122 /* window: write string and sync */
123 
wputs(char * str,long l)124 wputs(char * str,long l)
125   {
126     prio_loop(0);
127     while(l-- > 0) my_putc(*str++);
128     my_flush();
129     return(l);
130   }
131 
132 
133 int do_win_loop = 1;
134 char * do_win_buf;
135 long do_win_lth;
136 int first_call=1;
137 int waiting_for_input =0;
138 
my_input(char buf[])139 long my_input(char buf[])
140    {
141      char c;
142 
143      if(first_call)
144      {
145        first_call=0;
146        psl_call(PSLCALL_RESIZE,wColumns,0,0);
147      };
148      do_win_lth = 0;
149      while(c = buf[do_win_lth])
150           do_win_buf[do_win_lth++] = c;
151      do_win_buf[do_win_lth] = 0;
152      do_win_loop = 0;
153      return(1);
154    }
155 
my_gets(char * buf)156 long my_gets(char * buf)
157     {
158       do_win_buf = buf;
159       do_win_loop = 1;
160       waiting_for_input =1;
161          // process paste input first
162       paste_one_line();
163          // wait for terminal input
164       post_ready_message();
165       caret(1);
166       win_loop();
167       caret(0);
168    done:
169       waiting_for_input =0;
170       return(do_win_lth);
171     }
172 
173 
174 // transaction processing: notify caller
175 
post_ready_message()176 post_ready_message()
177   {
178     if (hcaller) PostMessage(hcaller,WM_SLAVE,13,(LPARAM)NULL);
179     hcaller = NULL;
180   }
181 
182 static LPSTR lpszText;
183 
184          /* process paste input */
paste_one_line()185 paste_one_line()
186    {
187      char c,cc;
188 
189       if (hdef_input == NULL) return(0);
190 
191       if (!lpszText)
192          {lpszText = GlobalLock(hdef_input);}
193 
194       if ( !lpszText)
195          { warning("paste","impossible"); hdef_input=NULL; return(0);}
196 
197       state = CALL;
198      loop:
199            c=*lpszText++;
200 	   if(c) PostMessage(hWnd,WM_CHAR,c,0); // do_char(cc=c);
201            if(c && c != '\n') goto loop;
202       if(c == '\0')
203       {
204         GlobalUnlock(hdef_input);
205 	GlobalFree(hdef_input);
206 	prevent_caret = 0;
207 	state = LOOP;
208         lpszText = NULL;
209         hdef_input = NULL;
210       }
211 
212         // return T if line is complete
213       return(cc=='\n');
214    }
215 
216 
win_loop()217 int win_loop()
218 {
219     while (do_win_loop && GetMessage(&msg, (HWND)NULL, (UINT)NULL, (UINT)NULL))
220     {
221 	TranslateMessage(&msg);
222 	DispatchMessage(&msg);
223     }
224     if(do_win_loop) Throw(CatchBuf,1);
225     return (msg.wParam);
226 }
227 
prio_loop(int n)228 int prio_loop(int n)
229    {
230      while (PeekMessage(&msg,hWnd,(UINT)NULL,(UINT)NULL,PM_NOREMOVE))
231      {
232        GetMessage(&msg, (HWND)NULL, (UINT)NULL, (UINT)NULL);
233        TranslateMessage(&msg);
234 
235        if(msg.message == WM_PAINT) DispatchMessage(&msg);
236 	  else
237        /*       if(msg.message == 0x100) bruch_bruch = 1;   */
238        if ((msg.message == WM_KEYDOWN)
239 	    &&
240 	       (msg.wParam == 0x13
241 	     || msg.wParam == 0x3
242 	     || msg.wParam == 0x90
243 	       )) {
244                     warning("terminal","interrupt");
245                     if(n==1) return(0xfff);
246                     psl_call(PSLCALL_TERMINAL_INTERRUPT,0,0,0);
247                   }
248      }
249      return(1);
250    }
251 
252 
win_quit(i)253 win_quit(i)
254    {
255      warning("quit","quit");
256      PostQuitMessage(i);
257    }
258 
259 /****************************************************************************
260 
261     FUNCTION: InitApplication(HANDLE)
262 
263     PURPOSE: Initializes window data and registers window class
264 
265 ****************************************************************************/
266 
InitApplication(HINSTANCE hInstance)267 BOOL InitApplication(HINSTANCE hInstance)
268 {
269     WNDCLASS  wc;
270 
271     BackgroundBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
272     if(!BackgroundBrush) BackgroundBrush = GetStockObject(WHITE_BRUSH);
273 
274     wc.style          = CS_DBLCLKS;
275     wc.lpfnWndProc    = (WNDPROC)MainWndProc;
276     wc.cbClsExtra     = 0;
277     wc.cbWndExtra     = 0;
278     wc.hInstance      = hInstance;
279     wc.hIcon          = LoadIcon(hInstance,"psllwrIcon");
280     wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
281     hArrow            = wc.hCursor;
282     wc.hbrBackground  = (HBRUSH) (COLOR_WINDOW+1);
283     wc.lpszMenuName   = "psllMenu";
284     wc.lpszClassName  = szAppName;
285 
286     return (RegisterClass(&wc));
287 }
288 
289 
290 /****************************************************************************
291 
292     FUNCTION:  InitInstance(HANDLE, int)
293 
294     PURPOSE:  Saves instance handle and creates main window
295 
296 ****************************************************************************/
297 
InitInstance(hInstance,nCmdShow)298 BOOL InitInstance(hInstance, nCmdShow)
299     HANDLE          hInstance;
300     int             nCmdShow;
301 {
302 
303 
304     TEXTMETRIC      textmetric;
305     int             nLineHeight;
306     LPSTR           b1;
307     char            aux[20];
308     int             i,j;
309 
310     hInst = hInstance;
311   ///  LoadAccelerators(hInst,"EditMenuAcc");
312     banner = "LISP";
313   ///  b1 = banner;
314   ///  while (*b1) {if (*b1 == '\\') banner = ++b1; else  b1++;};
315 
316     hWnd = CreateWindow(
317     szAppName,
318     banner,
319 	WS_OVERLAPPEDWINDOW | WS_VSCROLL,  /* horz & vert scroll bars */
320 	org_x = get_profile_int("WX0",CW_USEDEFAULT),
321 	org_y = get_profile_int("WY0",CW_USEDEFAULT),
322 	get_profile_int("WX1",CW_USEDEFAULT),
323 	get_profile_int("WY1",CW_USEDEFAULT),
324 	NULL,
325 	NULL,
326 	hInstance,
327 	NULL
328     );
329 
330     if (!hWnd)
331 	return (FALSE);
332 
333     ShowWindow(hWnd,SW_SHOWNORMAL); // ShowWindow(hWnd, nCmdShow);
334     UpdateWindow(hWnd);
335 
336     hHourGlass = LoadCursor(NULL, IDC_WAIT);
337     hPageCurs = LoadCursor(hInstance, "pageCursor");
338 
339     dcon();
340 
341     hFont = CreateFont(
342 	 8,   /* 10, */
343 	 0,   /* 8,  */
344 	 0,
345 	 0,
346 	 FW_NORMAL,
347 	 FALSE,
348 	 FALSE,
349 	 FALSE,
350 	 ANSI_CHARSET,
351 	 OUT_DEFAULT_PRECIS,
352 	 CLIP_DEFAULT_PRECIS,
353 	 DEFAULT_QUALITY,
354 	 FIXED_PITCH | FF_MODERN,
355 	 "System"
356 	 );
357     if (hFont) SelectObject(hDC, hFont);
358        /* font geometry */
359     GetTextMetrics(hDC, &textmetric);
360     dcoff();
361     nLineHeight = /* textmetric.tmExternalLeading + */ textmetric.tmHeight;
362     cWidth = textmetric.tmMaxCharWidth;
363     cHeight = nLineHeight;
364       /* window geometry */
365 
366     get_geometry(0);
367 
368 
369     my_prepare();
370     font_nr = get_profile_int("FONT",IDM_FONT_SYS);
371     font_size = get_profile_int("FONTSIZE",0);
372     if (font_nr <= IDM_FONT || IDM_FONT_HI < font_nr) font_nr = IDM_FONT_SYS;
373 
374     newfont(font_nr,font_size,0);
375     get_geometry(0);
376 
377     page_mode = get_profile_int("PAGE_MODE",0);
378 
379       /* prepare for dialog */
380     init = 1;
381     set_title();
382     IsActive = 1;
383     return (TRUE);
384 
385 }
386 
387 //****************************************************************************
388 
my_check(HMENU wParam,int tag,int mode)389 my_check(HMENU wParam,int tag,int mode)
390   {
391     if (mode)
392 	CheckMenuItem(wParam, tag, MF_CHECKED);
393      else
394         CheckMenuItem(wParam, tag, MF_UNCHECKED);
395    }
396 
my_enable(HMENU wParam,int tag,int mode)397 my_enable(HMENU wParam,int tag,int mode)
398   {
399     if (mode)
400 	EnableMenuItem(wParam, tag, MF_ENABLED);
401      else
402         EnableMenuItem(wParam, tag, MF_GRAYED);
403    }
404 
405 //****************************************************************************/
406 
407 
MainWndProc(hWnd,message,wParam,lParam)408 LRESULT CALLBACK WINAPI  MainWndProc(hWnd, message, wParam, lParam)
409 HWND hWnd;
410 UINT message;
411 WPARAM wParam;
412 LPARAM lParam;
413 {
414     FARPROC lpProcAbout;
415     PAINTSTRUCT ps;                  /* paint structure              */
416     char HorzOrVertText[12];
417     char ScrollTypeText[20];
418     RECT rect;
419     int i,j;
420     FARPROC lpFileDlg;
421     int Success;                            /* return value from SaveAsDlg() */
422     int IOStatus;                           /* result of file i/o      */
423 
424 /*
425 	if(init && message!=15 && message!=20)
426 	{   my_puts("mess");
427 	    my_putint((long)message);
428 	    my_puts(" ");
429 	    my_putoct((long)wParam);
430 	    my_puts(" ");
431 	    my_putoct(lParam);
432 	    my_puts("\n");
433 	}
434 */
435 
436     caret(0);
437 
438   switch(message){
439 
440 	case WM_INITMENU:
441 	    if ((HMENU)wParam == GetMenu(hWnd))
442 	    {
443 		if (OpenClipboard(hWnd))
444 		{
445 		    if (IsClipboardFormatAvailable(CF_TEXT)
446 			|| IsClipboardFormatAvailable(CF_OEMTEXT))
447 			EnableMenuItem((HMENU)wParam, IDM_PASTE, MF_ENABLED);
448 		    else
449 			EnableMenuItem((HMENU)wParam, IDM_PASTE, MF_GRAYED);
450 		    CloseClipboard();
451 		}
452 
453                 my_check((HMENU)wParam, IDM_GRAPHICS,graphics_mode);
454 
455                 my_check ((HMENU)wParam, IDM_DRIBBLE, dribble);
456                 my_check ((HMENU)wParam, IDM_DRI_ON, dribble);
457                 my_check ((HMENU)wParam, IDM_DRI_OFF, !dribble);
458 
459                 my_check ((HMENU)wParam, IDM_DRI_LINEW, dri_linew);
460 		my_check ((HMENU)wParam, IDM_AUTOCOPY, autocopy);
461 		my_check ((HMENU)wParam, IDM_STOREDIR, storedir);
462                 my_enable((HMENU)wParam, IDM_COPY, marked);
463                 my_enable((HMENU)wParam, IDM_CUT, marked && input_mark > -1);
464 		my_check ((HMENU)wParam, IDM_PAGE_MODE, page_mode);
465 
466 		for(i=IDM_FONT+1; i<=IDM_FONT_HI; i++)
467 		 { if(i == font_nr)
468 		      CheckMenuItem((HMENU)wParam,i,MF_CHECKED);
469 			else
470 		      CheckMenuItem((HMENU)wParam,i,MF_UNCHECKED);
471 		 };
472 
473 	 for(i=10; i<=IDM_FONT_MAX; i=i+2)
474 		 {
475              j = i-10 + IDM_FONT_10;
476              if(i == font_size)
477 		        CheckMenuItem((HMENU)wParam,j,MF_CHECKED);
478 		      else
479 		        CheckMenuItem((HMENU)wParam,j,MF_UNCHECKED);
480 		  };
481 
482 	    }
483 	    return (TRUE);
484 
485 	case WM_COMMAND:
486 	    switch (LOWORD(wParam)) {
487 		case IDM_ABOUT:
488 		    lpProcAbout = MakeProcInstance(About, hInst);
489 		    DialogBox(hInst, "AboutBox", hWnd, lpProcAbout);
490 		    FreeProcInstance(lpProcAbout);
491 		    break;
492 
493 		case IDM_AUTOCOPY:
494 		   if(autocopy) autocopy=0; else autocopy=1;
495 		    break;
496 
497 		case IDM_DRI_OFF:
498 		   dribble =0; break;
499 
500 		case IDM_DRI_ON:
501 		   if(DriFile) { dribble = 1; break;}
502 
503 		case IDM_DRI_FILE:
504 		   lstrcpy(FileName, DriFileName);
505 		   lpFileDlg = MakeProcInstance((FARPROC) FileDlg, hInst);
506 		   i = DialogBox(hInst, "DribbleFile", hWnd, lpFileDlg);
507 		   FreeProcInstance(lpFileDlg);
508 
509 		   if(i == IDOK)
510 		   { if(FileName[1] == ':')  /* absolute path? */
511 			lstrcpy(DriFileName, FileName);
512 		     else
513 			{i=0;
514 			 while(DriFileName[i] = dir[i]) i++;
515 			 DriFileName[i++] = '\\';
516 			 j=0;
517 			 while(DriFileName[i++] = FileName[j++]);
518 			}
519 		     if(!filep(DriFileName)
520 			|| yesp2(DriFileName,"overwrite existing file?"))
521 		     {DriFileFile = fopen(DriFileName,"w");
522 		       if(DriFileFile)
523 		       {fclose(DriFileFile); DriFile = -1;
524 			 dribble = 1;
525 		       }
526 			else warning("DRIBBLE","cannot create file");
527 		     }
528 		       else
529 		     if(yesp2(DriFileName,"extend existing file?"))
530 			{ dribble = 1; DriFile = -1;}
531 		  }
532 		  break;
533 
534 		case IDM_DRI_LINEW:
535 		  if(dri_linew) dri_linew=0; else dri_linew = 1; break;
536 
537         case IDM_PRINT:
538           my_print(); break;
539 
540 		case IDM_EXIT:
541 		   if(DriFile>0) fclose(DriFileFile);
542            write_defaults();
543 		   PostMessage(hWnd,WM_DESTROY,0,0);
544 
545 		   break;
546 
547 		/* edit menu commands */
548 
549 		case IDM_COPY: my_copy(); break;
550 
551 		case IDM_CCOPY: copy_bitmap(); break;
552 
553                 case IDM_MCOPY: copy_metafile(); break;
554 
555 		case IDM_PASTE:    my_paste(); paste_one_line(); break;
556 
557                 case IDM_CUT:
558                      if (!autocopy) my_copy();
559                      char_delete(0);
560                      break;
561                 case IDM_FONT_SYS:
562                 case IDM_FONT_ARIAL:
563                 case IDM_FONT_COURIER:
564                 case IDM_FONT_MODERN:
565                 case IDM_FONT_TIMES:
566                    newfont(wParam,0,1);
567                    get_geometry(0);
568                    break;
569 
570 
571                 case IDM_FONT_10:
572                 case IDM_FONT_12:
573                 case IDM_FONT_14:
574                 case IDM_FONT_16:
575                 case IDM_FONT_18:
576                 case IDM_FONT_20:
577                 case IDM_FONT_22:
578                 case IDM_FONT_24:
579                   newfont(0,10 + wParam - IDM_FONT_10,1);
580                   get_geometry(0);
581                   break;
582 
583 		case IDM_PAGE_MODE:
584 		     page_mode = ! page_mode;
585 		     update_defaults = 1;
586 		     break;
587 
588 		case IDM_GRAPHICS:
589 		     graphics_mode = ! graphics_mode;
590 		     update_defaults = 1;
591 		     set_graphics_mode(graphics_mode);
592 		     break;
593 
594        case IDM_SHOW_F: show_f_keys(); break;
595 
596        case IDM_F1: case IDM_F2: case IDM_F3: case IDM_F4:
597        case IDM_F5: case IDM_F6: case IDM_F7: case IDM_F8:
598        case IDM_F9: case IDM_F10: case IDM_F11: case IDM_F12:
599              define_F_key(wParam-IDM_F1+1);
600              break;
601 
602 		case IDM_HELP:
603 		     help_menu();
604 		     break;
605 
606                 case IDM_MODES:
607                      win_params[0] = 1;
608                      psl_call(PSLCALL_MENU,wColumns,0,0);
609                      break;
610 
611 		default:
612              if (IDM_HELP < wParam && wParam < IDM_HELP+100) help_do(wParam);
613 
614     	     return (DefWindowProc(hWnd, message, wParam, lParam));
615 
616 	    };
617 	    InvalidateRect(hWnd,NULL,TRUE);
618 	    break;
619 
620 
621 	case WM_MOUSEMOVE:
622 	    if (mausdruck) move_pick(LOWORD(lParam),HIWORD(lParam),0);
623 	    break;
624 
625 	case WM_RBUTTONDOWN:
626 	case WM_MBUTTONDOWN: my_paste(); paste_one_line(); break;
627 
628 	case WM_LBUTTONDOWN:
629 	    mausdruck = 1;
630 	    prevent_caret=1;
631 	    start_pick(LOWORD(lParam),HIWORD(lParam));
632 	    break;
633 
634 	case WM_LBUTTONUP:
635 	    prevent_caret=0;
636 	    if(mausdruck)
637 	      {mausdruck=0;
638 	       move_pick (LOWORD(lParam),HIWORD(lParam),1);
639 	      }
640             end_pick();
641 	    break;
642 
643 	case WM_SYSCHAR:
644             SetFocus(hWnd);  /* 27.3. neu */
645 	    if((lParam>>16) & 0x20)
646 	      {
647 		SetFocus(hWnd);
648 		goto char_in;
649 	      }
650 	      break;
651 
652 	case WM_KEYDOWN:
653         if(0x70 <= wParam && wParam<=0x7b)
654            { paste_f_key(wParam-0x70+1); paste_one_line();}
655           else
656 	    if(wParam==0x11) ctrl=1;
657 	      else
658 	    if (wParam == 0x8 || (0x1b <= wParam && wParam <= 0x2e))
659 		    cursorKey(wParam);
660 	    break;
661 
662 	case WM_KEYUP:
663 	    if(wParam==0x11) ctrl=0;
664 	    break;
665 
666 	case WM_CHAR:
667 		 caret(0);
668      /* 21.7.93 neu */
669          { unsigned char c;
670            c = (unsigned char)wParam;
671            if (c == 0x03)  /* Ctrl C */
672               { my_copy(); break; };
673            if (c == 0x16)  /* Ctrl V */
674               { my_paste(); break; };
675        if (c == 0x18)  /* Ctrl X */
676           { if (!autocopy) my_copy(); char_delete(0); break; };
677        if (c == 0x7)   /* Ctrl G */
678              wParam = 0x1b;  /* Esc, transferred to LISP */
679        if (c == 0x1b)  /* Esc - already handled by KEYDOWN */
680              break;
681          }
682 
683       char_in:
684                  caret(0);
685 		 ctrl = 0;
686 		 prevent_caret = 0;
687 		 page_count = 0;
688 		 state = CALL;
689 		 if(HIWORD(lParam) == 0x1c)
690 		    {
691 		      i = do_char('\n');
692 		      if(dribble && DriFile>0)
693 			{ fclose(DriFileFile); DriFile=-1;}
694 		    }
695 		   else do_char((unsigned char)wParam);
696 		 state = LOOP;
697 		 if(do_win_loop &&waiting_for_input) caret(1);
698 	    break;
699 
700 	case WM_VSCROLL:
701 	     scrollbar(wParam,lParam);
702 	     break;
703 
704 	case WM_PAINT:
705 	    hDC = BeginPaint (hWnd, &ps);
706             if(!during_scroll)
707         {
708           SetBkMode(hDC,TRANSPARENT);
709           if (act_show == act_line) my_refresh();
710              else  my_showpage(act_show);
711         }
712 	    EndPaint(hWnd, &ps);
713 	    break;
714 
715 	case WM_DESTROY:
716 	     prevent_caret=1;
717              write_defaults();
718              delete_all_objects();
719              my_pexit();
720 	     PostQuitMessage(0);
721 	    break;
722 
723 	case WM_ACTIVATE:
724 	    if(init)
725 	       {if(wParam == 0)
726 		  {SetWindowText(hWnd,banner);
727            de_select_ext();                  /* 8.5.93 neu */
728 		   caret(0);
729 		   IsActive = 0;
730 		  }
731 		       else
732 		  {
733 		   if (!IsActive) set_title();
734 		   IsActive = 1;
735                    SetFocus(hWnd);
736 		  }
737 	       };
738 	  /*  return (DefWindowProc(hWnd, message, wParam, lParam));    */
739 	     break;
740 
741 
742 	case WM_SIZE:
743              wscreenmode = wParam;
744 	     if(wParam!=SIZEICONIC && wParam!=SIZE_MINIMIZED)
745 	     {  get_geometry(1);
746             InvalidateRect(hWnd,NULL,TRUE);
747 		    psl_call(PSLCALL_RESIZE,wColumns,0,0);
748 		    caret_y = act_y;
749 	     }
750 	     break;
751 
752 	case WM_MOVE:
753 	     org_x = LOWORD(lParam); org_y = HIWORD(lParam);
754 	     get_geometry(1);
755 	     break;
756 
757         case WM_SLAVE:
758              // external call
759              if (wParam==0)   // transaction start: supply callers window handle
760                     hcaller = (HWND)lParam;
761                else
762              if (wParam==1)   // execute one computation
763                     GlobalGetAtomName((ATOM)lParam,(LPSTR)ahead_buf,256);
764              break;
765 
766         case WM_DROPFILES:
767              if(DragQueryFile((HANDLE)wParam,-1,NULL,(UINT)0) != 1)
768                 warning("Drop file","can accept only one file");
769              else if(i=DragQueryFile((HANDLE)wParam,0,FileName,(UINT)128)>0)
770               {
771                 lstrcpy(ahead_buf,"in \"");
772                 lstrcat(ahead_buf,FileName);
773                 lstrcat(ahead_buf,"\"$\n");
774               }
775              DragFinish((HANDLE)wParam);
776              ShowWindow(hWnd,SW_SHOWNORMAL);
777              SetForegroundWindow(hWnd);
778              break;
779 
780         case WM_SYSCOLORCHANGE:
781              DeleteObject(BackgroundBrush);
782              BackgroundBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
783              break;
784 
785 	default:
786 	  def:
787 
788 	    return (DefWindowProc(hWnd, message, wParam, lParam));
789     }
790 
791      /* process eventual deferred input */
792     if(!during_scroll && ahead_buf[0])
793     { char c; int l;
794       l = lstrlen(ahead_buf);
795       state = CALL;
796       for(i=0;i<l;i++) { c = ahead_buf[i]; ahead_buf[i] =0 ; do_char(c);}
797       state = LOOP;
798       ahead_buf[0]=0;
799     };
800 
801     if(!during_scroll
802         && hWnd==GetFocus()
803         && state==LOOP
804         && waiting_for_input)
805        caret(1);
806 
807 exit:
808     return (0);
809 }
810 
scrollbar(UINT wParam,UINT lParam)811 scrollbar(UINT wParam,UINT lParam)
812   { if(act_line > wLines)
813     switch(LOWORD(wParam))
814    {
815 	case SB_BOTTOM:     my_showpage(act_line); break;
816 	case SB_LINEDOWN:   my_movepage(1); // my_showpage(act_show + 1);
817                             break;
818 	case SB_LINEUP:     my_movepage(-1); // my_showpage(act_show - 1);
819                             break;
820 	case SB_PAGEDOWN:   my_showpage(act_show + wLines); break;
821 	case SB_PAGEUP:     my_showpage(act_show - wLines); break;
822 	case SB_THUMBPOSITION:
823 			    my_showpage(lParam); break;
824 	case SB_TOP:        my_showpage(wLines);
825   }}
826 
827 /****************************************************************************
828 
829     FUNCTION: About(HWND, UINT, UINT, LONG)
830 
831     PURPOSE:  Processes messages for "About" dialog box
832 
833     MESSAGES:
834 
835 	WM_INITDIALOG - initialize dialog box
836 	WM_COMMAND    - Input received
837 
838 ****************************************************************************/
839 
About(hDlg,message,wParam,lParam)840 BOOL WINAPI About(hDlg, message, wParam, lParam)
841 HWND hDlg;
842 UINT message;
843 UINT wParam;
844 LONG lParam;
845 {
846     switch (message) {
847 	case WM_INITDIALOG:
848 	    return (TRUE);
849 
850 	case WM_COMMAND:
851 	    if (wParam == IDOK) {
852 		EndDialog(hDlg, TRUE);
853 		return (TRUE);
854 	    }
855 	    break;
856     }
857     return (FALSE);
858 }
859 
error(char * txt)860 error(char * txt)
861   {
862     warning("ERROR:",txt);
863     PostQuitMessage(0);
864     Throw(CatchBuf,1);
865   }
866 
867 
TerminalInterrupt()868 TerminalInterrupt()
869   {
870     psl_call(PSLCALL_TERMINAL_INTERRUPT,0,0,0);
871   }
872 
set_graphics_mode(char m)873 set_graphics_mode(char m)
874 {
875  if(m) psl_call(PSLCALL_GRAPHICS_MODE_ON,0,0,0);
876   else psl_call(PSLCALL_GRAPHICS_MODE_OFF,0,0,0);
877 }
878 
psl_call(int a,int b,int c,int d)879 psl_call(int a,int b,int c,int d)
880   {
881     psl_callback1 = psl_callback1 | (1L << a);
882     psl_callback2 = b;
883     psl_callback3 = c;
884     psl_callback4 = d;
885     if(slave_alife) p_callback();
886   }
887