source: trunk/dll/common.c@ 793

Last change on this file since 793 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.3 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 793 2007-08-21 02:53:38Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2007 Steven H. Levine
10
11 13 Aug 05 SHL Renames
12 22 Jul 06 SHL Check more run time errors
13 15 Aug 06 SHL Use Dos_Error
14 03 Nov 06 SHL Rework thread usage count logic
15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
17 22 Mar 07 GKY Use QWL_USER
18 30 Mar 07 GKY Remove GetPString for window class names
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21
22***********************************************************************/
23
24#define INCL_DOS
25#define INCL_DOSERRORS
26#define INCL_WIN
27#define INCL_GPI
28#include <os2.h>
29
30#include <stdarg.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <ctype.h>
35#include <time.h>
36#include <direct.h>
37#include <share.h>
38#include <limits.h>
39
40#include "fm3dll.h"
41#include "fm3dlg.h"
42#include "fm3str.h"
43#include "mle.h"
44
45#pragma data_seg(DATA1)
46
47static PSZ pszSrcFile = __FILE__;
48
49MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
50 HWND hwnd,
51 ULONG msg, MPARAM mp1, MPARAM mp2)
52{
53 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
54
55 switch (msg) {
56 case UM_TIMER:
57 case UM_ACTION:
58 case UM_SHOWME:
59 case UM_OPENWINDOWFORME:
60 case UM_MINIMIZE:
61 case UM_MAXIMIZE:
62 case UM_CONTAINERDIR:
63 case UM_FILTER:
64 case UM_INITMENU:
65 case UM_COMMAND:
66 case UM_UPDATERECORD:
67 case UM_UPDATERECORDLIST:
68 case WM_COMMAND:
69 case MM_PORTHOLEINIT:
70 case WM_INITMENU:
71 case UM_CONTAINER_FILLED:
72 case UM_FILESMENU:
73 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
74
75 case UM_CONTEXTMENU:
76 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
77 return 0;
78
79 case UM_CONTAINERHWND:
80 return MRFROMLONG(WinWindowFromID(hwnd, id));
81
82 case DM_DROP:
83 case DM_DRAGOVER:
84 case DM_DRAGLEAVE:
85 case DM_DROPHELP:
86 {
87 CNRDRAGINFO cnd;
88 USHORT dcmd;
89
90 switch (msg) {
91 case DM_DROP:
92 dcmd = CN_DROP;
93 break;
94 case DM_DRAGOVER:
95 dcmd = CN_DRAGOVER;
96 break;
97 case DM_DRAGLEAVE:
98 dcmd = CN_DRAGLEAVE;
99 break;
100 case DM_DROPHELP:
101 dcmd = CN_DROPHELP;
102 break;
103 }
104 cnd.pDragInfo = (PDRAGINFO) mp1;
105 cnd.pRecord = NULL;
106 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
107 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
108 }
109
110 case UM_RESCAN:
111 if (fAutoTile &&
112 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
113 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
114 return 0;
115
116 case WM_MINMAXFRAME:
117 {
118 PSWP pswp = (PSWP) mp1;
119 MRESULT rc;
120
121 rc = oldproc(hwnd, msg, mp1, mp2);
122 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
123 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
124 return rc;
125 }
126
127 case WM_DESTROY:
128 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
129 break;
130 }
131 return oldproc(hwnd, msg, mp1, mp2);
132}
133
134MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
135{
136 switch (msg) {
137 case WM_CREATE:
138 {
139 MRESULT rc;
140
141 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
142 switch (WinQueryWindowUShort(hwnd, QWS_ID))
143 case DIR_SORT:
144 case DIR_VIEW:
145 case DIR_FILTER:
146
147 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
148 return rc;
149 }
150 }
151 return PFNWPStatic(hwnd, msg, mp1, mp2);
152}
153
154void CommonTextPaint(HWND hwnd, HPS hps)
155{
156 int x;
157 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
158 DIR_FILTER, DIR_SORT, DIR_MAX, 0
159 };
160 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
161
162 for (x = 0; ids[x]; x++) {
163 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
164 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
165 bools[x], FALSE);
166 }
167}
168
169void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
170{
171 int x;
172 CHAR s[33];
173 ULONG attrs;
174 HWND hwndTmp;
175
176 if (!hwnd || !class || !ids) {
177 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
178 return;
179 }
180
181 for (x = 0; ids[x]; x++) {
182 *s = 0;
183 switch (ids[x]) {
184 case DIR_SORT:
185 case DIR_FILTER:
186 case DIR_VIEW:
187 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
188 break;
189 case DIR_FOLDERICON:
190 case DIR_MAX:
191 attrs = SS_BITMAP;
192 sprintf(s, "#%d", ids[x]);
193 break;
194 default:
195 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
196 break;
197 }
198 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
199 HWND_TOP, ids[x], NULL, NULL);
200 if (!hwndTmp)
201 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
202 } // for
203}
204
205void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
206{
207 char dv[CCHMAXPATH];
208
209 if (!drive || !*drive)
210 return;
211 strcpy(dv, drive);
212 MakeValidDir(dv);
213
214 switch (cmd) {
215 case IDM_MKDIR:
216 PMMkDir(hwnd, dv, FALSE);
217 break;
218 case IDM_INFO:
219 WinDlgBox(HWND_DESKTOP,
220 HWND_DESKTOP,
221 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
222 break;
223 case IDM_DRVFLAGS:
224 strcpy(dv, drive); // Must use original drive letter
225 if (WinDlgBox(HWND_DESKTOP,
226 hwnd,
227 SetDrvProc,
228 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
229 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
230 break;
231 case IDM_SIZES:
232 WinDlgBox(HWND_DESKTOP,
233 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
234 break;
235 case IDM_SHOWALLFILES:
236 StartSeeAll(HWND_DESKTOP, FALSE, dv);
237 break;
238 case IDM_UNDELETE:
239 WinDlgBox(HWND_DESKTOP,
240 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
241 break;
242 case IDM_CHKDSK:
243 runemf2(SEPARATE | WINDOWED,
244 hwnd, NULL, NULL, "PMCHKDSK.EXE %c:", toupper(*dv));
245 break;
246 case IDM_OPTIMIZE:
247 {
248 CHAR FileSystem[CCHMAXPATH];
249 ULONG type;
250
251 CheckDrive(*dv, FileSystem, &type);
252 if (*FileSystem) {
253 strcat(FileSystem, "OPT.CMD");
254 runemf2(SEPARATE | WINDOWED,
255 hwnd,
256 NULL,
257 NULL,
258 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
259 }
260 }
261 break;
262 case IDM_FORMAT:
263 runemf2(SEPARATE | WINDOWED,
264 hwnd, NULL, NULL, "PMFORMAT.EXE %c:", toupper(*dv));
265 break;
266
267#if 0 // fixme to be gone?
268
269 case IDM_CLOSETRAY:
270 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
271
272 BYTE parm[4] = { "CD01" };
273 ULONG dlen, plen;
274 HFILE hfile;
275 APIRET rc;
276
277 dv[2] = 0;
278 rc = DosOpen(dv,
279 &hfile,
280 &dlen,
281 0,
282 0,
283 OPEN_ACTION_OPEN_IF_EXISTS |
284 OPEN_ACTION_CREATE_IF_NEW,
285 OPEN_FLAGS_DASD |
286 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
287 if (rc)
288 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
289 else {
290 dlen = 0;
291 plen = sizeof(parm);
292 rc = DosDevIOCtl(hfile,
293 0x80,
294 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
295 DosClose(hfile);
296 if (rc)
297 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
298 }
299 }
300 break;
301#endif // fixme to be gone?
302
303 case IDM_LOCK:
304 case IDM_UNLOCK:
305 case IDM_EJECT:
306 {
307 BYTE parm[2];
308 ULONG plen = sizeof(parm), dlen = 0L;
309
310 switch (SHORT1FROMMP(cmd)) {
311 case IDM_LOCK:
312 parm[0] = 1;
313 break;
314 case IDM_UNLOCK:
315 parm[0] = 0;
316 break;
317 case IDM_EJECT:
318 parm[0] = 2;
319 break;
320 }
321 parm[1] = (BYTE) (*dv - 'A');
322 DosError(FERR_DISABLEHARDERR);
323 DosDevIOCtl(-1L,
324 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
325 }
326 break;
327 }
328}
329
330void CommonCreateMainChildren(HWND hwnd, SWP * swp)
331{
332 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
333 HWND hwndTmp;
334 PFNWP oldproc;
335
336 // Create a children of frame window
337 hwndStatus = WinCreateWindow(hwndFrame,
338 WC_STATUS,
339 "Status",
340 WS_VISIBLE | SS_TEXT | DT_LEFT |
341 DT_VCENTER,
342 swp->x + 4 +
343 WinQuerySysValue(HWND_DESKTOP,
344 SV_CXSIZEBORDER),
345 swp->y + 4 +
346 WinQuerySysValue(HWND_DESKTOP,
347 SV_CYSIZEBORDER),
348 ((swp->cx / 2) - 8) -
349 (WinQuerySysValue(HWND_DESKTOP,
350 SV_CXSIZEBORDER) * 2),
351 20,
352 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
353 if (!hwndStatus)
354 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
355
356 hwndStatus2 = WinCreateWindow(hwndFrame,
357 WC_STATUS,
358 "Status2",
359 WS_VISIBLE | SS_TEXT | DT_LEFT |
360 DT_VCENTER,
361 ((swp->cx / 2) + 4) +
362 WinQuerySysValue(HWND_DESKTOP,
363 SV_CXSIZEBORDER),
364 ((swp->cy / 2) + 4) +
365 WinQuerySysValue(HWND_DESKTOP,
366 SV_CYSIZEBORDER),
367 ((swp->cx / 2) - 8) -
368 (WinQuerySysValue(HWND_DESKTOP,
369 SV_CXSIZEBORDER) * 2),
370 20,
371 hwndFrame,
372 HWND_TOP, MAIN_STATUS2, NULL, NULL);
373 if (!hwndStatus2)
374 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
375
376 hwndAttr = WinCreateWindow(hwndFrame,
377 WC_STATUS,
378 "Attr",
379 WS_VISIBLE | SS_TEXT | DT_CENTER |
380 DT_VCENTER,
381 swp->x + 4 +
382 WinQuerySysValue(HWND_DESKTOP,
383 SV_CXSIZEBORDER),
384 swp->y + 4 + 24 +
385 WinQuerySysValue(HWND_DESKTOP,
386 SV_CYSIZEBORDER),
387 ((swp->cx / 4) - 8) -
388 (WinQuerySysValue(HWND_DESKTOP,
389 SV_CXSIZEBORDER) * 2),
390 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
391 if (!hwndAttr)
392 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
393
394 hwndDate = WinCreateWindow(hwndFrame,
395 WC_STATUS,
396 "Date",
397 WS_VISIBLE | SS_TEXT | DT_CENTER |
398 DT_VCENTER,
399 ((swp->x / 4) * 2) + 4 +
400 WinQuerySysValue(HWND_DESKTOP,
401 SV_CXSIZEBORDER),
402 swp->y + 4 + 24 +
403 WinQuerySysValue(HWND_DESKTOP,
404 SV_CYSIZEBORDER),
405 ((swp->cx / 4) - 8) -
406 (WinQuerySysValue(HWND_DESKTOP,
407 SV_CXSIZEBORDER) * 2),
408 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
409 if (!hwndDate)
410 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
411
412 hwndName = WinCreateWindow(hwndFrame,
413 WC_STATUS,
414 "Name",
415 WS_VISIBLE | SS_TEXT | DT_LEFT |
416 DT_VCENTER,
417 ((swp->x / 4) * 3) + 4 +
418 WinQuerySysValue(HWND_DESKTOP,
419 SV_CXSIZEBORDER),
420 swp->y + 4 +
421 WinQuerySysValue(HWND_DESKTOP,
422 SV_CYSIZEBORDER),
423 ((swp->cx / 4) - 8) -
424 (WinQuerySysValue(HWND_DESKTOP,
425 SV_CXSIZEBORDER) * 2),
426 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
427 if (!hwndName)
428 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
429
430 hwndTmp = WinCreateWindow(hwndFrame,
431 WC_TOOLBACK,
432 NullStr,
433 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
434 swp->x +
435 WinQuerySysValue(HWND_DESKTOP,
436 SV_CXSIZEBORDER),
437 (swp->cy -
438 WinQuerySysValue(HWND_DESKTOP,
439 SV_CYSIZEBORDER)) - 30,
440 swp->cx -
441 (WinQuerySysValue(HWND_DESKTOP,
442 SV_CXSIZEBORDER) * 2),
443 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
444 if (!hwndTmp)
445 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
446
447 hwndBack = WinCreateWindow(hwndFrame,
448 WC_DRIVEBACK,
449 NullStr,
450 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
451 swp->x +
452 WinQuerySysValue(HWND_DESKTOP,
453 SV_CXSIZEBORDER),
454 (swp->cy -
455 WinQuerySysValue(HWND_DESKTOP,
456 SV_CYSIZEBORDER)) - 30,
457 swp->cx -
458 (WinQuerySysValue(HWND_DESKTOP,
459 SV_CXSIZEBORDER) * 2),
460 30,
461 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
462
463 if (!hwndBack)
464 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
465
466 hwndLED = WinCreateWindow(hwndFrame,
467 WC_LED,
468 "#920",
469 WS_VISIBLE | SS_BITMAP,
470 swp->cx - 58,
471 swp->y,
472 12,
473 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
474 if (!hwndLED)
475 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
476
477 hwndLEDHdr = WinCreateWindow(hwndFrame,
478 WC_LED,
479 "0",
480 WS_VISIBLE | SS_TEXT | DT_VCENTER |
481 DT_CENTER,
482 swp->cx - 58,
483 swp->y + 12,
484 12,
485 12,
486 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
487 if (!hwndLEDHdr)
488 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
489
490 hwndAutoview = WinCreateWindow(hwndFrame,
491 WC_AUTOVIEW,
492 NullStr,
493 WS_VISIBLE | SS_TEXT | DT_LEFT |
494 DT_TOP | DT_WORDBREAK,
495 swp->x + 4 +
496 WinQuerySysValue(HWND_DESKTOP,
497 SV_CXSIZEBORDER),
498 swp->y + 4 +
499 WinQuerySysValue(HWND_DESKTOP,
500 SV_CYSIZEBORDER) + 16,
501 (swp->cx - 8) -
502 (WinQuerySysValue(HWND_DESKTOP,
503 SV_CXSIZEBORDER) * 2),
504 48,
505 hwndFrame,
506 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
507 if (!hwndAutoview)
508 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
509
510 hwndAutoMLE = WinCreateWindow(hwndFrame,
511 // GetPString(IDS_WCAUTOVIEW),
512 WC_MLE,
513 NullStr,
514 WS_VISIBLE | MLS_HSCROLL |
515 MLS_VSCROLL | MLS_BORDER,
516 swp->x + 4 +
517 WinQuerySysValue(HWND_DESKTOP,
518 SV_CXSIZEBORDER),
519 swp->y + 4 +
520 WinQuerySysValue(HWND_DESKTOP,
521 SV_CYSIZEBORDER) + 16,
522 (swp->cx - 8) -
523 (WinQuerySysValue(HWND_DESKTOP,
524 SV_CXSIZEBORDER) * 2),
525 48,
526 hwndFrame,
527 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
528 if (!hwndAutoMLE)
529 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
530
531 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
532 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
533 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
534}
535
536MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
537 MPARAM mp2)
538{
539 switch (msg) {
540 case UM_THREADUSE:
541 if (hbmLEDon && hbmLEDoff) {
542 static LONG threaduse;
543 CHAR ts[33];
544
545 if (mp1) {
546 threaduse++;
547 if (threaduse == 1)
548 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
549 }
550 else {
551 threaduse--;
552 if (threaduse <= 0) {
553 threaduse = 0;
554 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
555 }
556 }
557 ltoa(threaduse, ts, 10);
558 WinSetWindowText(hwndLEDHdr, ts);
559 DosSleep(1);
560 }
561 return 0;
562
563 case UM_LOADFILE:
564 {
565 CHAR *s = NULL;
566 static CHAR lastfile[CCHMAXPATH] = "";
567
568 if (!fAutoView) {
569 if (*lastfile)
570 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
571 UM_LOADFILE, MPVOID, MPVOID);
572 *lastfile = 0;
573 }
574 else {
575 if (mp1) {
576 if (!mp2 && !stricmp(lastfile, (CHAR *) mp1))
577 return 0;
578 strcpy(lastfile, (CHAR *) mp1);
579 s = xstrdup(lastfile, pszSrcFile, __LINE__);
580 }
581 else
582 *lastfile = 0;
583 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
584 UM_LOADFILE, MPFROMP(s), MPVOID)) {
585 if (s)
586 free(s);
587 }
588 }
589 }
590 return 0;
591
592 case UM_BUILDDRIVEBAR:
593 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
594 MAIN_DRIVES));
595 return 0;
596 }
597 return WinDefWindowProc(hwnd, msg, mp1, mp2);
598}
599
600MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
601 MPARAM mp2)
602{
603 static HWND hwndLast = (HWND) 0;
604 static ULONG lastclick = 0;
605
606 switch (msg) {
607 case WM_MOUSEMOVE:
608 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
609 if (!fNoFinger) {
610 WinSetPointer(HWND_DESKTOP, hptrFinger);
611 return MRFROMLONG(TRUE);
612 }
613 break;
614
615 case WM_BUTTON1DOWN:
616 case WM_BUTTON3DOWN:
617 if (hwndBubble)
618 WinDestroyWindow(hwndBubble);
619 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
620 WinSetCapture(HWND_DESKTOP, hwnd);
621 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
622 break;
623
624 case WM_BUTTON2UP:
625 case WM_BUTTON2DOWN:
626 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
627 if (msg == WM_BUTTON2UP && hwndLast) {
628 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
629 hwndLast = (HWND) 0;
630 }
631 break;
632
633 case WM_BUTTON1UP:
634 case WM_BUTTON3UP:
635 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
636 WinSetCapture(HWND_DESKTOP, (HWND) 0);
637 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
638 {
639 ULONG check;
640
641 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
642 if (check > lastclick + 500) {
643
644 RECTL rcl;
645 POINTS pts;
646
647 pts.x = SHORT1FROMMP(mp1);
648 pts.y = SHORT2FROMMP(mp1);
649 WinQueryWindowRect(hwnd, &rcl);
650 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
651 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
652 }
653 lastclick = check;
654 }
655 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
656 hwndLast = (HWND) 0;
657 break;
658
659 case WM_SETFOCUS:
660 if (mp2)
661 hwndLast = (HWND) mp1;
662 break;
663
664 case UM_FOCUSME:
665 if (mp1) {
666
667 PID pid;
668 TID tid;
669
670 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
671 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
672 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
673 return 0;
674 }
675 }
676 {
677 HWND htemp = (HWND) 0;
678
679 if (hwndMain)
680 htemp = TopWindow(hwndMain, (HWND) 0);
681 if (!htemp)
682 htemp = hwndTree;
683 if (htemp)
684 WinSetFocus(HWND_DESKTOP, htemp);
685 else
686 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
687 }
688 return 0;
689 }
690
691 return PFNWPStatic(hwnd, msg, mp1, mp2);
692}
693
694MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
695{
696 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
697
698 switch (msg) {
699 case UM_FIXCNRMLE:
700 if (dcd) {
701
702 SWP swp, swpC;
703
704 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
705 if (WinQueryWindowPos(hwnd, &swpC)) {
706 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
707 swpC.cx -= swp.x;
708 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
709 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
710 }
711 }
712 if (mp1)
713 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
714 MLM_SETTEXTLIMIT, mp1, MPVOID);
715 }
716 return 0;
717
718 case UM_FIXEDITNAME:
719 if (dcd) {
720 if (mp1 && (INT) mp1 != -1) {
721
722 CHAR *p;
723
724 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
725 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
726 0, strlen((CHAR *) mp1) + 1);
727 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *) mp1);
728 p = strrchr((CHAR *) mp1, '\\');
729 if (p) {
730 p++;
731 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *) mp1));
732 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
733 }
734 else
735 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *) mp1));
736 }
737 else if (mp2) {
738 if ((INT) mp1 == -1) {
739 PCNRITEM pci = (PCNRITEM) mp2;
740 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
741 }
742 else {
743 Broadcast(WinQueryAnchorBlock(hwnd),
744 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
745 free(mp2);
746 }
747 }
748 }
749 return 0;
750 }
751 return PFNWPCnr(hwnd, msg, mp1, mp2);
752}
753
754HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
755 BOOL noautotile, char *directory)
756{
757 SWP swp;
758 HWND hwndDir;
759
760 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
761 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
762 else if (*(ULONG *) realappname == FM3UL) {
763 if (!fAutoTile)
764 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
765 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
766 if (hwndDir) {
767 if (!fAutoTile)
768 WinSetWindowPos(hwndDir,
769 HWND_TOP,
770 swp.x,
771 swp.y,
772 swp.cx,
773 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
774 else if (!noautotile)
775 TileChildren(hwndParent, TRUE);
776 WinSetWindowPos(hwndDir,
777 HWND_TOP,
778 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
779 }
780 }
781 else {
782
783 char s[256];
784
785 assign_ignores(s);
786 runemf2(WINDOWED | SEPARATE,
787 hwnd,
788 NULL,
789 NULL,
790 "VDIR.EXE %s%s\"%s%s\"",
791 (*s) ? s : NullStr, (*s) ? " " : NullStr,
792 directory,
793 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
794 }
795 return hwndDir;
796}
797
798//= IncrThreadUsage() Increment thread usage counter ==
799
800VOID IncrThreadUsage(VOID)
801{
802 if (hwndMain)
803 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
804}
805
806//= DecrThreadUsage() Decrement thread usage counter ==
807
808VOID DecrThreadUsage(VOID)
809{
810 if (hwndMain)
811 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
812}
813
814#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
815#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
816#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
817#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
818#pragma alloc_text(COMMON4,CommonCnrProc)
819#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.