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