source: trunk/dll/common.c@ 552

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

font cleanup; new image and archiver masks; messages moved to string file; new drive flags including David's icons mostly working

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