source: trunk/dll/common.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.5 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 1039 2008-07-05 22:16:21Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2008 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 26 Aug 07 SHL Change to DosSleep(0)
22 29 Feb 08 GKY Use xfree where appropriate
23
24***********************************************************************/
25
26#include <stdlib.h>
27#include <string.h>
28#include <ctype.h>
29
30#define INCL_DOS
31#define INCL_DOSERRORS
32#define INCL_WIN
33#define INCL_GPI
34#define INCL_LONGLONG // dircnrs.h
35
36#include "fm3dlg.h"
37#include "fm3str.h"
38#include "mle.h"
39#include "filldir.h" // RemoveCnrItems
40#include "errutil.h" // Dos_Error...
41#include "strutil.h" // GetPString
42#include "fm3dll.h"
43#include "fortify.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, pszSrcFile, __LINE__, NULL, NULL,
245 "PMCHKDSK.EXE %c:", toupper(*dv));
246 break;
247 case IDM_OPTIMIZE:
248 {
249 CHAR FileSystem[CCHMAXPATH];
250 ULONG type;
251
252 CheckDrive(*dv, FileSystem, &type);
253 if (*FileSystem) {
254 strcat(FileSystem, "OPT.CMD");
255 runemf2(SEPARATE | WINDOWED,
256 hwnd, pszSrcFile, __LINE__,
257 NULL,
258 NULL,
259 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
260 }
261 }
262 break;
263 case IDM_FORMAT:
264 runemf2(SEPARATE | WINDOWED,
265 hwnd, pszSrcFile, __LINE__, NULL, NULL,
266 "PMFORMAT.EXE %c:", toupper(*dv));
267 break;
268
269#if 0 // fixme to be gone?
270
271 case IDM_CLOSETRAY:
272 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
273
274 BYTE parm[4] = { "CD01" };
275 ULONGLONG dlen;
276 ULONG 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 // Left status window
341 hwndStatus = WinCreateWindow(hwndFrame,
342 WC_STATUS,
343 "Status",
344 WS_VISIBLE | SS_TEXT | DT_LEFT |
345 DT_VCENTER,
346 swp->x + 4 +
347 WinQuerySysValue(HWND_DESKTOP,
348 SV_CXSIZEBORDER),
349 swp->y + 4 +
350 WinQuerySysValue(HWND_DESKTOP,
351 SV_CYSIZEBORDER),
352 ((swp->cx / 2) - 8) -
353 (WinQuerySysValue(HWND_DESKTOP,
354 SV_CXSIZEBORDER) * 2),
355 20,
356 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
357 if (!hwndStatus)
358 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
359
360 // Right status window
361 hwndStatus2 = WinCreateWindow(hwndFrame,
362 WC_STATUS,
363 "Status2",
364 WS_VISIBLE | SS_TEXT | DT_LEFT |
365 DT_VCENTER,
366 ((swp->cx / 2) + 4) +
367 WinQuerySysValue(HWND_DESKTOP,
368 SV_CXSIZEBORDER),
369 ((swp->cy / 2) + 4) +
370 WinQuerySysValue(HWND_DESKTOP,
371 SV_CYSIZEBORDER),
372 ((swp->cx / 2) - 8) -
373 (WinQuerySysValue(HWND_DESKTOP,
374 SV_CXSIZEBORDER) * 2),
375 20,
376 hwndFrame,
377 HWND_TOP, MAIN_STATUS2, NULL, NULL);
378 if (!hwndStatus2)
379 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
380
381 hwndAttr = WinCreateWindow(hwndFrame,
382 WC_STATUS,
383 "Attr",
384 WS_VISIBLE | SS_TEXT | DT_CENTER |
385 DT_VCENTER,
386 swp->x + 4 +
387 WinQuerySysValue(HWND_DESKTOP,
388 SV_CXSIZEBORDER),
389 swp->y + 4 + 24 +
390 WinQuerySysValue(HWND_DESKTOP,
391 SV_CYSIZEBORDER),
392 ((swp->cx / 4) - 8) -
393 (WinQuerySysValue(HWND_DESKTOP,
394 SV_CXSIZEBORDER) * 2),
395 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
396 if (!hwndAttr)
397 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
398
399 hwndDate = WinCreateWindow(hwndFrame,
400 WC_STATUS,
401 "Date",
402 WS_VISIBLE | SS_TEXT | DT_CENTER |
403 DT_VCENTER,
404 ((swp->x / 4) * 2) + 4 +
405 WinQuerySysValue(HWND_DESKTOP,
406 SV_CXSIZEBORDER),
407 swp->y + 4 + 24 +
408 WinQuerySysValue(HWND_DESKTOP,
409 SV_CYSIZEBORDER),
410 ((swp->cx / 4) - 8) -
411 (WinQuerySysValue(HWND_DESKTOP,
412 SV_CXSIZEBORDER) * 2),
413 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
414 if (!hwndDate)
415 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
416
417 hwndName = WinCreateWindow(hwndFrame,
418 WC_STATUS,
419 "Name",
420 WS_VISIBLE | SS_TEXT | DT_LEFT |
421 DT_VCENTER,
422 ((swp->x / 4) * 3) + 4 +
423 WinQuerySysValue(HWND_DESKTOP,
424 SV_CXSIZEBORDER),
425 swp->y + 4 +
426 WinQuerySysValue(HWND_DESKTOP,
427 SV_CYSIZEBORDER),
428 ((swp->cx / 4) - 8) -
429 (WinQuerySysValue(HWND_DESKTOP,
430 SV_CXSIZEBORDER) * 2),
431 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
432 if (!hwndName)
433 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
434
435 hwndTmp = WinCreateWindow(hwndFrame,
436 WC_TOOLBACK,
437 NullStr,
438 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
439 swp->x +
440 WinQuerySysValue(HWND_DESKTOP,
441 SV_CXSIZEBORDER),
442 (swp->cy -
443 WinQuerySysValue(HWND_DESKTOP,
444 SV_CYSIZEBORDER)) - 30,
445 swp->cx -
446 (WinQuerySysValue(HWND_DESKTOP,
447 SV_CXSIZEBORDER) * 2),
448 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
449 if (!hwndTmp)
450 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
451
452 hwndBack = WinCreateWindow(hwndFrame,
453 WC_DRIVEBACK,
454 NullStr,
455 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
456 swp->x +
457 WinQuerySysValue(HWND_DESKTOP,
458 SV_CXSIZEBORDER),
459 (swp->cy -
460 WinQuerySysValue(HWND_DESKTOP,
461 SV_CYSIZEBORDER)) - 30,
462 swp->cx -
463 (WinQuerySysValue(HWND_DESKTOP,
464 SV_CXSIZEBORDER) * 2),
465 30,
466 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
467
468 if (!hwndBack)
469 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
470
471 hwndLED = WinCreateWindow(hwndFrame,
472 WC_LED,
473 "#920",
474 WS_VISIBLE | SS_BITMAP,
475 swp->cx - 58,
476 swp->y,
477 12,
478 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
479 if (!hwndLED)
480 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
481
482 hwndLEDHdr = WinCreateWindow(hwndFrame,
483 WC_LED,
484 "0",
485 WS_VISIBLE | SS_TEXT | DT_VCENTER |
486 DT_CENTER,
487 swp->cx - 58,
488 swp->y + 12,
489 12,
490 12,
491 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
492 if (!hwndLEDHdr)
493 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
494
495 hwndAutoview = WinCreateWindow(hwndFrame,
496 WC_AUTOVIEW,
497 NullStr,
498 WS_VISIBLE | SS_TEXT | DT_LEFT |
499 DT_TOP | DT_WORDBREAK,
500 swp->x + 4 +
501 WinQuerySysValue(HWND_DESKTOP,
502 SV_CXSIZEBORDER),
503 swp->y + 4 +
504 WinQuerySysValue(HWND_DESKTOP,
505 SV_CYSIZEBORDER) + 16,
506 (swp->cx - 8) -
507 (WinQuerySysValue(HWND_DESKTOP,
508 SV_CXSIZEBORDER) * 2),
509 48,
510 hwndFrame,
511 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
512 if (!hwndAutoview)
513 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
514
515 hwndAutoMLE = WinCreateWindow(hwndFrame,
516 // GetPString(IDS_WCAUTOVIEW),
517 WC_MLE,
518 NullStr,
519 WS_VISIBLE | MLS_HSCROLL |
520 MLS_VSCROLL | MLS_BORDER,
521 swp->x + 4 +
522 WinQuerySysValue(HWND_DESKTOP,
523 SV_CXSIZEBORDER),
524 swp->y + 4 +
525 WinQuerySysValue(HWND_DESKTOP,
526 SV_CYSIZEBORDER) + 16,
527 (swp->cx - 8) -
528 (WinQuerySysValue(HWND_DESKTOP,
529 SV_CXSIZEBORDER) * 2),
530 48,
531 hwndFrame,
532 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
533 if (!hwndAutoMLE)
534 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
535
536 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
537 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
538 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
539}
540
541MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
542 MPARAM mp2)
543{
544 switch (msg) {
545 case UM_THREADUSE:
546 if (hbmLEDon && hbmLEDoff) {
547 static LONG threaduse;
548 CHAR ts[33];
549
550 if (mp1) {
551 threaduse++;
552 if (threaduse == 1)
553 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
554 }
555 else {
556 threaduse--;
557 if (threaduse <= 0) {
558 threaduse = 0;
559 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
560 }
561 }
562 ltoa(threaduse, ts, 10);
563 WinSetWindowText(hwndLEDHdr, ts);
564 DosSleep(0);
565 }
566 return 0;
567
568 case UM_LOADFILE:
569 {
570 CHAR *s = NULL;
571 static CHAR lastfile[CCHMAXPATH] = "";
572
573 if (!fAutoView) {
574 if (*lastfile)
575 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
576 UM_LOADFILE, MPVOID, MPVOID);
577 *lastfile = 0;
578 }
579 else {
580 if (mp1) {
581 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
582 return 0;
583 strcpy(lastfile, (CHAR *)mp1);
584 s = xstrdup(lastfile, pszSrcFile, __LINE__);
585 }
586 else
587 *lastfile = 0;
588 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
589 UM_LOADFILE, MPFROMP(s), MPVOID)) {
590 xfree(s, pszSrcFile, __LINE__);
591 }
592 }
593 }
594 return 0;
595
596 case UM_BUILDDRIVEBAR:
597 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
598 MAIN_DRIVES));
599 return 0;
600 }
601 return WinDefWindowProc(hwnd, msg, mp1, mp2);
602}
603
604MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
605 MPARAM mp2)
606{
607 static HWND hwndLast = (HWND) 0;
608 static ULONG lastclick = 0;
609
610 switch (msg) {
611 case WM_MOUSEMOVE:
612 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
613 if (!fNoFinger) {
614 WinSetPointer(HWND_DESKTOP, hptrFinger);
615 return MRFROMLONG(TRUE);
616 }
617 break;
618
619 case WM_BUTTON1DOWN:
620 case WM_BUTTON3DOWN:
621 if (hwndBubble)
622 WinDestroyWindow(hwndBubble);
623 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
624 WinSetCapture(HWND_DESKTOP, hwnd);
625 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
626 break;
627
628 case WM_BUTTON2UP:
629 case WM_BUTTON2DOWN:
630 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
631 if (msg == WM_BUTTON2UP && hwndLast) {
632 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
633 hwndLast = (HWND) 0;
634 }
635 break;
636
637 case WM_BUTTON1UP:
638 case WM_BUTTON3UP:
639 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
640 WinSetCapture(HWND_DESKTOP, (HWND) 0);
641 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
642 {
643 ULONG check;
644
645 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
646 if (check > lastclick + 500) {
647
648 RECTL rcl;
649 POINTS pts;
650
651 pts.x = SHORT1FROMMP(mp1);
652 pts.y = SHORT2FROMMP(mp1);
653 WinQueryWindowRect(hwnd, &rcl);
654 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
655 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
656 }
657 lastclick = check;
658 }
659 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
660 hwndLast = (HWND) 0;
661 break;
662
663 case WM_SETFOCUS:
664 if (mp2)
665 hwndLast = (HWND) mp1;
666 break;
667
668 case UM_FOCUSME:
669 if (mp1) {
670
671 PID pid;
672 TID tid;
673
674 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
675 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
676 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
677 return 0;
678 }
679 }
680 {
681 HWND htemp = (HWND) 0;
682
683 if (hwndMain)
684 htemp = TopWindow(hwndMain, (HWND) 0);
685 if (!htemp)
686 htemp = hwndTree;
687 if (htemp)
688 WinSetFocus(HWND_DESKTOP, htemp);
689 else
690 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
691 }
692 return 0;
693 }
694
695 return PFNWPStatic(hwnd, msg, mp1, mp2);
696}
697
698MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
699{
700 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
701
702 switch (msg) {
703 case UM_FIXCNRMLE:
704 if (dcd) {
705
706 SWP swp, swpC;
707
708 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
709 if (WinQueryWindowPos(hwnd, &swpC)) {
710 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
711 swpC.cx -= swp.x;
712 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
713 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
714 }
715 }
716 if (mp1)
717 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
718 MLM_SETTEXTLIMIT, mp1, MPVOID);
719 }
720 return 0;
721
722 case UM_FIXEDITNAME:
723 if (dcd) {
724 if (mp1 && (INT) mp1 != -1) {
725
726 CHAR *p;
727
728 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
729 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
730 0, strlen((CHAR *)mp1) + 1);
731 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
732 p = strrchr((CHAR *)mp1, '\\');
733 if (p) {
734 p++;
735 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
736 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
737 }
738 else
739 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
740 }
741 else if (mp2) {
742 if ((INT) mp1 == -1) {
743 PCNRITEM pci = (PCNRITEM) mp2;
744 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
745 }
746 else {
747 Broadcast(WinQueryAnchorBlock(hwnd),
748 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
749 free(mp2);
750 }
751 }
752 }
753 return 0;
754 }
755 return PFNWPCnr(hwnd, msg, mp1, mp2);
756}
757
758HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
759 BOOL noautotile, char *directory)
760{
761 SWP swp;
762 HWND hwndDir;
763
764 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
765 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
766 else if (*(ULONG *) realappname == FM3UL) {
767 if (!fAutoTile)
768 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
769 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
770 if (hwndDir) {
771 if (!fAutoTile)
772 WinSetWindowPos(hwndDir,
773 HWND_TOP,
774 swp.x,
775 swp.y,
776 swp.cx,
777 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
778 else if (!noautotile)
779 TileChildren(hwndParent, TRUE);
780 WinSetWindowPos(hwndDir,
781 HWND_TOP,
782 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
783 }
784 }
785 else {
786
787 char s[256];
788
789 assign_ignores(s);
790 runemf2(WINDOWED | SEPARATE,
791 hwnd, pszSrcFile, __LINE__,
792 NULL,
793 NULL,
794 "VDIR.EXE %s%s\"%s%s\"",
795 (*s) ? s : NullStr, (*s) ? " " : NullStr,
796 directory,
797 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
798 }
799 return hwndDir;
800}
801
802//= IncrThreadUsage() Increment thread usage counter ==
803
804VOID IncrThreadUsage(VOID)
805{
806 if (hwndMain)
807 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
808}
809
810//= DecrThreadUsage() Decrement thread usage counter ==
811
812VOID DecrThreadUsage(VOID)
813{
814 if (hwndMain)
815 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
816}
817
818#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
819#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
820#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
821#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
822#pragma alloc_text(COMMON4,CommonCnrProc)
823#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.