source: trunk/dll/common.c@ 1400

Last change on this file since 1400 was 1400, checked in by Gregg Young, 16 years ago

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

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