source: trunk/dll/common.c@ 1009

Last change on this file since 1009 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

  • 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 1009 2008-05-10 07:51:58Z stevenhl $
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
44#pragma data_seg(DATA1)
45
46static PSZ pszSrcFile = __FILE__;
47
48MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
49 HWND hwnd,
50 ULONG msg, MPARAM mp1, MPARAM mp2)
51{
52 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
53
54 switch (msg) {
55 case UM_TIMER:
56 case UM_ACTION:
57 case UM_SHOWME:
58 case UM_OPENWINDOWFORME:
59 case UM_MINIMIZE:
60 case UM_MAXIMIZE:
61 case UM_CONTAINERDIR:
62 case UM_FILTER:
63 case UM_INITMENU:
64 case UM_COMMAND:
65 case UM_UPDATERECORD:
66 case UM_UPDATERECORDLIST:
67 case WM_COMMAND:
68 case MM_PORTHOLEINIT:
69 case WM_INITMENU:
70 case UM_CONTAINER_FILLED:
71 case UM_FILESMENU:
72 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
73
74 case UM_CONTEXTMENU:
75 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
76 return 0;
77
78 case UM_CONTAINERHWND:
79 return MRFROMLONG(WinWindowFromID(hwnd, id));
80
81 case DM_DROP:
82 case DM_DRAGOVER:
83 case DM_DRAGLEAVE:
84 case DM_DROPHELP:
85 {
86 CNRDRAGINFO cnd;
87 USHORT dcmd;
88
89 switch (msg) {
90 case DM_DROP:
91 dcmd = CN_DROP;
92 break;
93 case DM_DRAGOVER:
94 dcmd = CN_DRAGOVER;
95 break;
96 case DM_DRAGLEAVE:
97 dcmd = CN_DRAGLEAVE;
98 break;
99 case DM_DROPHELP:
100 dcmd = CN_DROPHELP;
101 break;
102 }
103 cnd.pDragInfo = (PDRAGINFO) mp1;
104 cnd.pRecord = NULL;
105 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
106 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
107 }
108
109 case UM_RESCAN:
110 if (fAutoTile &&
111 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
112 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
113 return 0;
114
115 case WM_MINMAXFRAME:
116 {
117 PSWP pswp = (PSWP) mp1;
118 MRESULT rc;
119
120 rc = oldproc(hwnd, msg, mp1, mp2);
121 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
122 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
123 return rc;
124 }
125
126 case WM_DESTROY:
127 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
128 break;
129 }
130 return oldproc(hwnd, msg, mp1, mp2);
131}
132
133MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
134{
135 switch (msg) {
136 case WM_CREATE:
137 {
138 MRESULT rc;
139
140 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
141 switch (WinQueryWindowUShort(hwnd, QWS_ID))
142 case DIR_SORT:
143 case DIR_VIEW:
144 case DIR_FILTER:
145
146 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, GetPString(IDS_8HELVTEXT));
147 return rc;
148 }
149 }
150 return PFNWPStatic(hwnd, msg, mp1, mp2);
151}
152
153void CommonTextPaint(HWND hwnd, HPS hps)
154{
155 int x;
156 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
157 DIR_FILTER, DIR_SORT, DIR_MAX, 0
158 };
159 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
160
161 for (x = 0; ids[x]; x++) {
162 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
163 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
164 bools[x], FALSE);
165 }
166}
167
168void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
169{
170 int x;
171 CHAR s[33];
172 ULONG attrs;
173 HWND hwndTmp;
174
175 if (!hwnd || !class || !ids) {
176 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
177 return;
178 }
179
180 for (x = 0; ids[x]; x++) {
181 *s = 0;
182 switch (ids[x]) {
183 case DIR_SORT:
184 case DIR_FILTER:
185 case DIR_VIEW:
186 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
187 break;
188 case DIR_FOLDERICON:
189 case DIR_MAX:
190 attrs = SS_BITMAP;
191 sprintf(s, "#%d", ids[x]);
192 break;
193 default:
194 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
195 break;
196 }
197 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
198 HWND_TOP, ids[x], NULL, NULL);
199 if (!hwndTmp)
200 Win_Error2(hwnd, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
201 } // for
202}
203
204void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
205{
206 char dv[CCHMAXPATH];
207
208 if (!drive || !*drive)
209 return;
210 strcpy(dv, drive);
211 MakeValidDir(dv);
212
213 switch (cmd) {
214 case IDM_MKDIR:
215 PMMkDir(hwnd, dv, FALSE);
216 break;
217 case IDM_INFO:
218 WinDlgBox(HWND_DESKTOP,
219 HWND_DESKTOP,
220 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
221 break;
222 case IDM_DRVFLAGS:
223 strcpy(dv, drive); // Must use original drive letter
224 if (WinDlgBox(HWND_DESKTOP,
225 hwnd,
226 SetDrvProc,
227 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
228 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
229 break;
230 case IDM_SIZES:
231 WinDlgBox(HWND_DESKTOP,
232 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
233 break;
234 case IDM_SHOWALLFILES:
235 StartSeeAll(HWND_DESKTOP, FALSE, dv);
236 break;
237 case IDM_UNDELETE:
238 WinDlgBox(HWND_DESKTOP,
239 hwnd, UndeleteDlgProc, FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
240 break;
241 case IDM_CHKDSK:
242 runemf2(SEPARATE | WINDOWED,
243 hwnd, pszSrcFile, __LINE__, NULL, NULL,
244 "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, pszSrcFile, __LINE__,
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, pszSrcFile, __LINE__, NULL, NULL,
265 "PMFORMAT.EXE %c:", toupper(*dv));
266 break;
267
268#if 0 // fixme to be gone?
269
270 case IDM_CLOSETRAY:
271 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
272
273 BYTE parm[4] = { "CD01" };
274 ULONGLONG dlen;
275 ULONG plen;
276 HFILE hfile;
277 APIRET rc;
278
279 dv[2] = 0;
280 rc = DosOpen(dv,
281 &hfile,
282 &dlen,
283 0,
284 0,
285 OPEN_ACTION_OPEN_IF_EXISTS |
286 OPEN_ACTION_CREATE_IF_NEW,
287 OPEN_FLAGS_DASD |
288 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
289 if (rc)
290 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
291 else {
292 dlen = 0;
293 plen = sizeof(parm);
294 rc = DosDevIOCtl(hfile,
295 0x80,
296 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
297 DosClose(hfile);
298 if (rc)
299 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
300 }
301 }
302 break;
303#endif // fixme to be gone?
304
305 case IDM_LOCK:
306 case IDM_UNLOCK:
307 case IDM_EJECT:
308 {
309 BYTE parm[2];
310 ULONG plen = sizeof(parm), dlen = 0L;
311
312 switch (SHORT1FROMMP(cmd)) {
313 case IDM_LOCK:
314 parm[0] = 1;
315 break;
316 case IDM_UNLOCK:
317 parm[0] = 0;
318 break;
319 case IDM_EJECT:
320 parm[0] = 2;
321 break;
322 }
323 parm[1] = (BYTE) (*dv - 'A');
324 DosError(FERR_DISABLEHARDERR);
325 DosDevIOCtl(-1L,
326 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
327 }
328 break;
329 }
330}
331
332void CommonCreateMainChildren(HWND hwnd, SWP * swp)
333{
334 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
335 HWND hwndTmp;
336 PFNWP oldproc;
337
338 // Create a children of frame window
339 // Left status window
340 hwndStatus = WinCreateWindow(hwndFrame,
341 WC_STATUS,
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 // Right status window
360 hwndStatus2 = WinCreateWindow(hwndFrame,
361 WC_STATUS,
362 "Status2",
363 WS_VISIBLE | SS_TEXT | DT_LEFT |
364 DT_VCENTER,
365 ((swp->cx / 2) + 4) +
366 WinQuerySysValue(HWND_DESKTOP,
367 SV_CXSIZEBORDER),
368 ((swp->cy / 2) + 4) +
369 WinQuerySysValue(HWND_DESKTOP,
370 SV_CYSIZEBORDER),
371 ((swp->cx / 2) - 8) -
372 (WinQuerySysValue(HWND_DESKTOP,
373 SV_CXSIZEBORDER) * 2),
374 20,
375 hwndFrame,
376 HWND_TOP, MAIN_STATUS2, NULL, NULL);
377 if (!hwndStatus2)
378 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
379
380 hwndAttr = WinCreateWindow(hwndFrame,
381 WC_STATUS,
382 "Attr",
383 WS_VISIBLE | SS_TEXT | DT_CENTER |
384 DT_VCENTER,
385 swp->x + 4 +
386 WinQuerySysValue(HWND_DESKTOP,
387 SV_CXSIZEBORDER),
388 swp->y + 4 + 24 +
389 WinQuerySysValue(HWND_DESKTOP,
390 SV_CYSIZEBORDER),
391 ((swp->cx / 4) - 8) -
392 (WinQuerySysValue(HWND_DESKTOP,
393 SV_CXSIZEBORDER) * 2),
394 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
395 if (!hwndAttr)
396 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
397
398 hwndDate = WinCreateWindow(hwndFrame,
399 WC_STATUS,
400 "Date",
401 WS_VISIBLE | SS_TEXT | DT_CENTER |
402 DT_VCENTER,
403 ((swp->x / 4) * 2) + 4 +
404 WinQuerySysValue(HWND_DESKTOP,
405 SV_CXSIZEBORDER),
406 swp->y + 4 + 24 +
407 WinQuerySysValue(HWND_DESKTOP,
408 SV_CYSIZEBORDER),
409 ((swp->cx / 4) - 8) -
410 (WinQuerySysValue(HWND_DESKTOP,
411 SV_CXSIZEBORDER) * 2),
412 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
413 if (!hwndDate)
414 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
415
416 hwndName = WinCreateWindow(hwndFrame,
417 WC_STATUS,
418 "Name",
419 WS_VISIBLE | SS_TEXT | DT_LEFT |
420 DT_VCENTER,
421 ((swp->x / 4) * 3) + 4 +
422 WinQuerySysValue(HWND_DESKTOP,
423 SV_CXSIZEBORDER),
424 swp->y + 4 +
425 WinQuerySysValue(HWND_DESKTOP,
426 SV_CYSIZEBORDER),
427 ((swp->cx / 4) - 8) -
428 (WinQuerySysValue(HWND_DESKTOP,
429 SV_CXSIZEBORDER) * 2),
430 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
431 if (!hwndName)
432 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
433
434 hwndTmp = WinCreateWindow(hwndFrame,
435 WC_TOOLBACK,
436 NullStr,
437 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
438 swp->x +
439 WinQuerySysValue(HWND_DESKTOP,
440 SV_CXSIZEBORDER),
441 (swp->cy -
442 WinQuerySysValue(HWND_DESKTOP,
443 SV_CYSIZEBORDER)) - 30,
444 swp->cx -
445 (WinQuerySysValue(HWND_DESKTOP,
446 SV_CXSIZEBORDER) * 2),
447 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
448 if (!hwndTmp)
449 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
450
451 hwndBack = WinCreateWindow(hwndFrame,
452 WC_DRIVEBACK,
453 NullStr,
454 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
455 swp->x +
456 WinQuerySysValue(HWND_DESKTOP,
457 SV_CXSIZEBORDER),
458 (swp->cy -
459 WinQuerySysValue(HWND_DESKTOP,
460 SV_CYSIZEBORDER)) - 30,
461 swp->cx -
462 (WinQuerySysValue(HWND_DESKTOP,
463 SV_CXSIZEBORDER) * 2),
464 30,
465 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
466
467 if (!hwndBack)
468 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
469
470 hwndLED = WinCreateWindow(hwndFrame,
471 WC_LED,
472 "#920",
473 WS_VISIBLE | SS_BITMAP,
474 swp->cx - 58,
475 swp->y,
476 12,
477 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
478 if (!hwndLED)
479 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
480
481 hwndLEDHdr = WinCreateWindow(hwndFrame,
482 WC_LED,
483 "0",
484 WS_VISIBLE | SS_TEXT | DT_VCENTER |
485 DT_CENTER,
486 swp->cx - 58,
487 swp->y + 12,
488 12,
489 12,
490 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
491 if (!hwndLEDHdr)
492 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
493
494 hwndAutoview = WinCreateWindow(hwndFrame,
495 WC_AUTOVIEW,
496 NullStr,
497 WS_VISIBLE | SS_TEXT | DT_LEFT |
498 DT_TOP | DT_WORDBREAK,
499 swp->x + 4 +
500 WinQuerySysValue(HWND_DESKTOP,
501 SV_CXSIZEBORDER),
502 swp->y + 4 +
503 WinQuerySysValue(HWND_DESKTOP,
504 SV_CYSIZEBORDER) + 16,
505 (swp->cx - 8) -
506 (WinQuerySysValue(HWND_DESKTOP,
507 SV_CXSIZEBORDER) * 2),
508 48,
509 hwndFrame,
510 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
511 if (!hwndAutoview)
512 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
513
514 hwndAutoMLE = WinCreateWindow(hwndFrame,
515 // GetPString(IDS_WCAUTOVIEW),
516 WC_MLE,
517 NullStr,
518 WS_VISIBLE | MLS_HSCROLL |
519 MLS_VSCROLL | MLS_BORDER,
520 swp->x + 4 +
521 WinQuerySysValue(HWND_DESKTOP,
522 SV_CXSIZEBORDER),
523 swp->y + 4 +
524 WinQuerySysValue(HWND_DESKTOP,
525 SV_CYSIZEBORDER) + 16,
526 (swp->cx - 8) -
527 (WinQuerySysValue(HWND_DESKTOP,
528 SV_CXSIZEBORDER) * 2),
529 48,
530 hwndFrame,
531 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
532 if (!hwndAutoMLE)
533 Win_Error2(hwndFrame, hwnd, pszSrcFile, __LINE__, IDS_WINCREATEWINDOW);
534
535 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
536 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
537 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
538}
539
540MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
541 MPARAM mp2)
542{
543 switch (msg) {
544 case UM_THREADUSE:
545 if (hbmLEDon && hbmLEDoff) {
546 static LONG threaduse;
547 CHAR ts[33];
548
549 if (mp1) {
550 threaduse++;
551 if (threaduse == 1)
552 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
553 }
554 else {
555 threaduse--;
556 if (threaduse <= 0) {
557 threaduse = 0;
558 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDoff), MPVOID);
559 }
560 }
561 ltoa(threaduse, ts, 10);
562 WinSetWindowText(hwndLEDHdr, ts);
563 DosSleep(0);
564 }
565 return 0;
566
567 case UM_LOADFILE:
568 {
569 CHAR *s = NULL;
570 static CHAR lastfile[CCHMAXPATH] = "";
571
572 if (!fAutoView) {
573 if (*lastfile)
574 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
575 UM_LOADFILE, MPVOID, MPVOID);
576 *lastfile = 0;
577 }
578 else {
579 if (mp1) {
580 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
581 return 0;
582 strcpy(lastfile, (CHAR *)mp1);
583 s = xstrdup(lastfile, pszSrcFile, __LINE__);
584 }
585 else
586 *lastfile = 0;
587 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
588 UM_LOADFILE, MPFROMP(s), MPVOID)) {
589 xfree(s, pszSrcFile, __LINE__);
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, QWL_USER);
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 PCNRITEM pci = (PCNRITEM) mp2;
743 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
744 }
745 else {
746 Broadcast(WinQueryAnchorBlock(hwnd),
747 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
748 xfree(mp2, pszSrcFile, __LINE__);
749 }
750 }
751 }
752 return 0;
753 }
754 return PFNWPCnr(hwnd, msg, mp1, mp2);
755}
756
757HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
758 BOOL noautotile, char *directory)
759{
760 SWP swp;
761 HWND hwndDir;
762
763 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
764 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
765 else if (*(ULONG *) realappname == FM3UL) {
766 if (!fAutoTile)
767 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
768 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
769 if (hwndDir) {
770 if (!fAutoTile)
771 WinSetWindowPos(hwndDir,
772 HWND_TOP,
773 swp.x,
774 swp.y,
775 swp.cx,
776 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
777 else if (!noautotile)
778 TileChildren(hwndParent, TRUE);
779 WinSetWindowPos(hwndDir,
780 HWND_TOP,
781 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
782 }
783 }
784 else {
785
786 char s[256];
787
788 assign_ignores(s);
789 runemf2(WINDOWED | SEPARATE,
790 hwnd, pszSrcFile, __LINE__,
791 NULL,
792 NULL,
793 "VDIR.EXE %s%s\"%s%s\"",
794 (*s) ? s : NullStr, (*s) ? " " : NullStr,
795 directory,
796 (directory[strlen(directory) - 1] == '\\') ? "\\" : NullStr);
797 }
798 return hwndDir;
799}
800
801//= IncrThreadUsage() Increment thread usage counter ==
802
803VOID IncrThreadUsage(VOID)
804{
805 if (hwndMain)
806 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
807}
808
809//= DecrThreadUsage() Decrement thread usage counter ==
810
811VOID DecrThreadUsage(VOID)
812{
813 if (hwndMain)
814 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
815}
816
817#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
818#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
819#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
820#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
821#pragma alloc_text(COMMON4,CommonCnrProc)
822#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.