|
|
1.1 root 1: #include "jigsaw.h"
2: #include "globals.h"
3: #include <stdio.h>
4:
5: /******************************************************************************/
6: /* */
7: /* SendCommand will attempt to post the required command and parameters to */
8: /* the asynchronous drawing thread's message queue. The command will only */
9: /* be posted if the queue exists. */
10: /* */
11: /******************************************************************************/
12: BOOL SendCommand( usCommand, mp1, mp2)
13: USHORT usCommand;
14: MPARAM mp1;
15: MPARAM mp2;
16: {
17: if( !hmqAsync)
18: return( FALSE);
19:
20: switch( usCommand)
21: {
22: case UM_DIE:
23: case UM_LEFTDOWN:
24: case UM_LEFTUP:
25: case UM_MOUSEMOVE:
26: case UM_DRAW:
27: case UM_HSCROLL:
28: case UM_VSCROLL:
29: case UM_ZOOM:
30: case UM_REDRAW:
31: case UM_SIZING:
32: case UM_JUMBLE:
33: case UM_LOAD:
34: case UM_CHAR:
35:
36: return( WinPostQueueMsg( hmqAsync
37: , usCommand
38: , mp1
39: , mp2 ) );
40: break;
41:
42: default:
43: return( TRUE);
44: }
45: }
46:
47:
48: /******************************************************************************/
49: /* */
50: /* ClientWndProd is the window procedure associated with the client window. */
51: /* */
52: /******************************************************************************/
53: MRESULT EXPENTRY ClientWndProc(hwnd, msg, mp1, mp2)
54: HWND hwnd;
55: USHORT msg;
56: MPARAM mp1;
57: MPARAM mp2;
58: {
59: CHAR szTemp[128];
60: ULONG ulPostCt;
61:
62: switch( msg)
63: {
64: case WM_CHAR:
65: SendCommand( UM_CHAR, mp1, mp2);
66: break;
67:
68: case WM_CLOSE:
69: WinLoadString( habMain, NULL, TERMINATE, sizeof(szTemp), (PSZ)szTemp );
70: if( WinMessageBox( HWND_DESKTOP
71: , hwndFrame
72: , szTemp
73: , szTitle
74: , 0
75: , MB_CUAWARNING | MB_YESNO | MB_DEFBUTTON2)
76: == MBID_YES)
77: WinPostMsg( hwnd, WM_QUIT, NULL, NULL);
78: break;
79:
80: case WM_PAINT:
81: return( WndProcPaint());
82: break;
83:
84: /**************************************************************************/
85: /* */
86: /**************************************************************************/
87: case WM_ERASEBACKGROUND:
88: return( ( MRESULT)TRUE);
89: break;
90:
91: /**************************************************************************/
92: /* Process menu item commands, and commands generated from the keyboard */
93: /* via the accelerator table. Most are handled by the async thread */
94: /**************************************************************************/
95: case WM_COMMAND:
96: return( WndProcCommand( hwnd, msg, mp1, mp2));
97: break;
98:
99: /**************************************************************************/
100: /* Scrolling is handled by the async drawing thread. Simply pass on the */
101: /* command and parameters */
102: /**************************************************************************/
103: case WM_HSCROLL:
104: SendCommand( UM_HSCROLL, mp2, 0);
105: break;
106:
107: case WM_VSCROLL:
108: SendCommand( UM_VSCROLL, mp2, 0);
109: break;
110:
111: /************************************************************************/
112: /* The client area is being resized. */
113: /************************************************************************/
114: case WM_SIZE:
115: DosResetEventSem( hevDrawOn, &ulPostCt);
116: SendCommand( UM_SIZING, mp1, mp2);
117: break;
118:
119: /**************************************************************************/
120: /* Mouse commands are handled by the async thread. Simply send on the */
121: /* command and parameters. */
122: /**************************************************************************/
123: case WM_BUTTON1DBLCLK:
124: case WM_BUTTON1DOWN:
125: if( hwnd != WinQueryFocus( HWND_DESKTOP, FALSE))
126: WinSetFocus( HWND_DESKTOP, hwnd);
127: if( !fButtonDownMain)
128: {
129: fButtonDownMain = TRUE;
130: SendCommand( UM_LEFTDOWN, mp1, 0);
131: }
132: return( ( MRESULT)TRUE);
133: break;
134:
135: case WM_BUTTON1UP:
136: if( !fButtonDownMain)
137: return( ( MRESULT)TRUE);
138: if( SendCommand( UM_LEFTUP, mp1, 0))
139: fButtonDownMain = FALSE;
140: else
141: WinAlarm( HWND_DESKTOP, WA_WARNING);
142: return( ( MRESULT)TRUE);
143: break;
144:
145: case WM_MOUSEMOVE:
146: DosQueryEventSem( hevMouse, &ulPostCt);
147: if( ulPostCt) {
148: SendCommand( UM_MOUSEMOVE, mp1, 0);
149: }
150: return( WinDefWindowProc( hwnd, msg, mp1, mp2));
151: break;
152:
153: /**************************************************************************/
154: /* Default for the rest */
155: /**************************************************************************/
156: default:
157: return( WinDefWindowProc( hwnd, msg, mp1, mp2));
158: }
159:
160: return( FALSE);
161: }
162:
163: /******************************************************************************/
164: /* */
165: /* WM_PAINT message */
166: /* */
167: /******************************************************************************/
168: MRESULT WndProcPaint(VOID)
169: {
170: HRGN hrgnUpdt;
171: ULONG ulPostCt;
172: SHORT sRgnType;
173:
174: hrgnUpdt = GpiCreateRegion( hpsPaint, 0L, NULL);
175: sRgnType = WinQueryUpdateRegion( hwndClient, hrgnUpdt);
176: SendCommand( UM_DRAW, (MPARAM)hrgnUpdt, 0);
177: DosQueryEventSem( hevLoadMsg, &ulPostCt);
178: if( ulPostCt) {
179: WinSetDlgItemText(hwndStatus, SID_STATUS, pszLoadMsg);
180: }
181: WinValidateRegion( hwndClient, hrgnUpdt, FALSE);
182: return( FALSE);
183: }
184:
185: /******************************************************************************/
186: /* Process menu item commands, and commands generated from the keyboard via */
187: /* the accelerator table. Most are handled by the async thread */
188: /******************************************************************************/
189: MRESULT WndProcCommand(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
190: {
191: CHAR szTemp[128];
192: ULONG ulPostCt;
193:
194: switch( SHORT1FROMMP(mp1))
195: {
196: case MENU_SHOW:
197: WinSetParent(hwndStatus, HWND_DESKTOP, TRUE);
198: WinShowWindow(hwndStatus, TRUE);
199: STATUS_SHOW(FALSE);
200: STATUS_HIDE(TRUE);
201: break;
202:
203: case MENU_HIDE:
204: WinSetParent(hwndStatus, HWND_OBJECT, TRUE);
205: WinShowWindow(hwndStatus, TRUE);
206: STATUS_SHOW(TRUE);
207: STATUS_HIDE(FALSE);
208: break;
209:
210: case MENU_JUMBLE:
211: DosResetEventSem( hevDrawOn, &ulPostCt);
212: SendCommand( UM_JUMBLE, 0, 0);
213: break;
214:
215: case MENU_LOAD:
216:
217: if (WinDlgBox(HWND_DESKTOP
218: , hwnd
219: , CheapWndProc
220: , (HMODULE)NULL
221: , IDD_OPEN
222: , NULL) == MBID_CANCEL) {
223: return FALSE;
224: }
225:
226:
227: DosResetEventSem( hevDrawOn, &ulPostCt);
228: SendCommand( UM_LOAD, (MPARAM)pli, 0);
229: break;
230: /**********************************************************************/
231: /* EXIT command, menu item or F3 key pressed. Give the operator a */
232: /* second chance, if confirmed post a WM_QUIT msg to the application */
233: /* msg queue. This will force the MAIN thread to terminate. */
234: /**********************************************************************/
235: case MENU_EXIT:
236: WinLoadString( habMain, NULL, TERMINATE, sizeof(szTemp), szTemp);
237: if( WinMessageBox( HWND_DESKTOP
238: , hwndFrame
239: , szTemp
240: , szTitle
241: , 0
242: , MB_CUAWARNING | MB_YESNO | MB_DEFBUTTON2)
243: == MBID_YES)
244: WinPostMsg( hwnd, WM_QUIT, NULL, NULL);
245: break;
246:
247: /**********************************************************************/
248: /* Pass on the rest to the async thread. */
249: /**********************************************************************/
250: case MENU_ZOOMIN:
251: DosResetEventSem( hevDrawOn, &ulPostCt);
252: SendCommand( UM_ZOOM, (MPARAM)ZOOM_IN, 0);
253: break;
254:
255: case MENU_ZOOMOUT:
256: DosResetEventSem( hevDrawOn, &ulPostCt);
257: SendCommand( UM_ZOOM, (MPARAM)ZOOM_OUT , 0);
258: break;
259:
260: /**********************************************************************/
261: /* Unrecognised => default */
262: /**********************************************************************/
263: default:
264: return( WinDefWindowProc(hwnd, msg, mp1, mp2));
265: }
266: return( FALSE);
267: }
268:
269:
270: /******************************************************************************/
271: /* Dialog window processing routine */
272: /******************************************************************************/
273: MRESULT EXPENTRY CheapWndProc(hwnd, msg, mp1, mp2)
274: HWND hwnd;
275: USHORT msg;
276: MPARAM mp1;
277: MPARAM mp2;
278: {
279: switch (msg) {
280: case WM_INITDLG:
281: WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, EID_NAME));
282: WinSendDlgItemMsg(hwnd, EID_NAME, EM_SETTEXTLIMIT,
283: MPFROMSHORT((SHORT) sizeof(pli->szFileName)), (MPARAM) 0L);
284: return ((MRESULT) TRUE);
285: break;
286:
287: case WM_COMMAND:
288: if (LOUSHORT(mp1) == MBID_OK) {
289: ULONG ulDummy;
290:
291: WinQueryDlgItemText(hwnd, EID_NAME, sizeof(pli->szFileName),
292: pli->szFileName);
293:
294: DosOpen(pli->szFileName, &(pli->hf), &ulDummy, 0, 0x0001,
295: 0x00000001, 0x0010, 0x00000000);
296: }
297:
298: WinDismissDlg(hwnd, LOUSHORT(mp1));
299: break;
300:
301: default:
302: return WinDefDlgProc(hwnd, msg, mp1, mp2);
303: }
304:
305: return (MRESULT)0L;
306: }
307:
308: /******************************************************************************/
309: /* Dialog window processing routine */
310: /******************************************************************************/
311: MRESULT EXPENTRY StatusDlgProc(hwnd, msg, mp1, mp2)
312: HWND hwnd;
313: USHORT msg;
314: MPARAM mp1;
315: MPARAM mp2;
316: {
317: ULONG ulPostCt;
318: LONG lTempScale;
319:
320: switch (msg) {
321: case WM_INITDLG:
322: WinSendMsg( hwndMenu,
323: MM_SETITEMATTR,
324: MPFROM2SHORT( MENU_SHOW, TRUE),
325: MPFROM2SHORT( MIA_DISABLED, MIA_DISABLED));
326: hwndZoomScrollBar = WinWindowFromID(hwnd, HID_ZOOM);
327:
328: WinSendMsg(hwndZoomScrollBar, SBM_SETSCROLLBAR,
329: MPFROMSHORT((USHORT) 0),
330: MPFROM2SHORT((USHORT) 0, (USHORT) ZOOM_MAX));
331: WinSendMsg(hwndZoomScrollBar, SBM_SETTHUMBSIZE,
332: MPFROM2SHORT((USHORT) 1, (USHORT) (ZOOM_MAX + 1)), 0L);
333: WinEnableWindow(hwndZoomScrollBar, FALSE);
334: WinSetDlgItemText(hwnd, SID_STATUS, pszStartupMsg);
335: sprintf(szZoomFact, "1:1");
336: WinSetDlgItemText(hwnd, SID_ZOOMFACT, szZoomFact);
337:
338: break;
339:
340: case WM_HSCROLL:
341: /*
342: * if BMP is being loaded ingnore zoom messages
343: */
344: DosQueryEventSem(hevLoadMsg, &ulPostCt);
345: if (ulPostCt) {
346: break;
347: }
348:
349: switch (SHORT2FROMMP(mp2)) {
350:
351: case SB_SLIDERTRACK:
352: lTempScale = (LONG) -SHORT1FROMMP(mp2);
353: DisplayZoomFactor(lTempScale);
354: break;
355:
356: case SB_SLIDERPOSITION:
357: lTempScale = (LONG) -SHORT1FROMMP(mp2);
358: if (lScale != lTempScale) {
359: lScale = lTempScale;
360: DosResetEventSem( hevDrawOn, &ulPostCt);
361: DosPostEventSem( hevKillDraw);
362: DisplayZoomFactor(lScale);
363: SendCommand( UM_ZOOM, (MPARAM)ZOOM_IN, 0);
364: }
365: break;
366:
367: case SB_LINELEFT:
368: if (lScale != 0) {
369: lScale++;
370: DosResetEventSem( hevDrawOn, &ulPostCt);
371: DosPostEventSem( hevKillDraw);
372: DisplayZoomFactor(lScale);
373: SendCommand( UM_ZOOM, (MPARAM)ZOOM_IN, 0);
374: }
375: break;
376:
377: case SB_LINERIGHT:
378: if (lScale != -ZOOM_MAX) {
379: lScale--;
380: DosResetEventSem( hevDrawOn, &ulPostCt);
381: DosPostEventSem( hevKillDraw);
382: DisplayZoomFactor(lScale);
383: SendCommand( UM_ZOOM, (MPARAM)ZOOM_OUT , 0);
384: }
385: break;
386: }
387: break;
388:
389: case WM_COMMAND:
390:
391: switch (SHORT1FROMMP(mp1)) {
392:
393: case 1: // hide dialog box
394: WinSetParent(hwndStatus, HWND_OBJECT, TRUE);
395: WinShowWindow(hwndStatus, TRUE);
396: STATUS_SHOW(TRUE);
397: STATUS_HIDE(FALSE);
398: break;
399: }
400: break;
401:
402: default:
403: return WinDefDlgProc(hwnd, msg, mp1, mp2);
404: }
405:
406: return (MRESULT)0L;
407: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.