source: trunk/dll/common.c@ 1395

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

Allow user to turn off alert and/or error beeps in settings notebook. Ticket 341 Move repeated strings to PCSZs. Ticket 6 Add *DateFormat functions to format dates based on locale Ticket 28 Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error Ticket 6

  • 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 1395 2009-02-08 01:48:16Z 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
28***********************************************************************/
29
30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33
34#define INCL_DOS
35#define INCL_DOSERRORS
36#define INCL_WIN
37#define INCL_GPI
38#define INCL_LONGLONG // dircnrs.h
39
40#include "fm3dll.h"
41#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
42#include "mainwnd2.h" // Data declaration(s)
43#include "killproc.h" // Data declaration(s)
44#include "collect.h" // Data declaration(s)
45#include "grep.h" // Data declaration(s)
46#include "dircnrs.h" // Data declaration(s)
47#include "notebook.h" // Data declaration(s)
48#include "inis.h" // Data declaration(s)
49#include "init.h" // Data declaration(s)
50#include "treecnr.h" // Data declaration(s)
51#include "fm3dlg.h"
52#include "fm3str.h"
53#include "mle.h"
54#include "filldir.h" // RemoveCnrItems
55#include "errutil.h" // Dos_Error...
56#include "strutil.h" // GetPString
57#include "autoview.h" // AutoViewProc
58#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
59#include "common.h"
60#include "dirsize.h" // DirSizeProc
61#include "info.h" // DrvInfoProc, SetDrvProc
62#include "seeall.h" // StartSeeAll
63#include "misc.h" // Broadcast
64#include "valid.h" // CheckDrive
65#include "mkdir.h" // PMMkDir
66#include "presparm.h" // SetPresParams
67#include "undel.h" // UndeleteDlgProc
68#include "systemf.h" // runemf2
69#include "wrappers.h" // xfree
70#include "fortify.h"
71
72// Data definitions
73#pragma data_seg(DATA1)
74static PSZ pszSrcFile = __FILE__;
75static HWND hwndLED;
76static HWND hwndLEDHdr;
77
78#pragma data_seg(GLOBAL1)
79HWND hwndBack;
80
81MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
82 HWND hwnd,
83 ULONG msg, MPARAM mp1, MPARAM mp2)
84{
85 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
86
87 switch (msg) {
88 case UM_TIMER:
89 case UM_ACTION:
90 case UM_SHOWME:
91 case UM_OPENWINDOWFORME:
92 case UM_MINIMIZE:
93 case UM_MAXIMIZE:
94 case UM_CONTAINERDIR:
95 case UM_FILTER:
96 case UM_INITMENU:
97 case UM_COMMAND:
98 case UM_UPDATERECORD:
99 case UM_UPDATERECORDLIST:
100 case WM_COMMAND:
101 case MM_PORTHOLEINIT:
102 case WM_INITMENU:
103 case UM_CONTAINER_FILLED:
104 case UM_FILESMENU:
105 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
106
107 case UM_CONTEXTMENU:
108 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
109 return 0;
110
111 case UM_CONTAINERHWND:
112 return MRFROMLONG(WinWindowFromID(hwnd, id));
113
114 case DM_DROP:
115 case DM_DRAGOVER:
116 case DM_DRAGLEAVE:
117 case DM_DROPHELP:
118 {
119 CNRDRAGINFO cnd;
120 USHORT dcmd;
121
122 switch (msg) {
123 case DM_DROP:
124 dcmd = CN_DROP;
125 break;
126 case DM_DRAGOVER:
127 dcmd = CN_DRAGOVER;
128 break;
129 case DM_DRAGLEAVE:
130 dcmd = CN_DRAGLEAVE;
131 break;
132 case DM_DROPHELP:
133 dcmd = CN_DROPHELP;
134 break;
135 }
136 cnd.pDragInfo = (PDRAGINFO) mp1;
137 cnd.pRecord = NULL;
138 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
139 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
140 }
141
142 case UM_RESCAN:
143 if (fAutoTile &&
144 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
145 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
146 return 0;
147
148 case WM_MINMAXFRAME:
149 {
150 PSWP pswp = (PSWP) mp1;
151 MRESULT rc;
152
153 rc = oldproc(hwnd, msg, mp1, mp2);
154 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
155 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
156 return rc;
157 }
158
159 case WM_DESTROY:
160 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
161 break;
162 }
163 return oldproc(hwnd, msg, mp1, mp2);
164}
165
166MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
167{
168 switch (msg) {
169 case WM_CREATE:
170 {
171 MRESULT rc;
172
173 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
174 switch (WinQueryWindowUShort(hwnd, QWS_ID))
175 case DIR_SORT:
176 case DIR_VIEW:
177 case DIR_FILTER:
178 //fixme to allow user to change presparams 1-10-09 GKY
179 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
180 return rc;
181 }
182 }
183 return PFNWPStatic(hwnd, msg, mp1, mp2);
184}
185
186void CommonTextPaint(HWND hwnd, HPS hps)
187{
188 int x;
189 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
190 DIR_FILTER, DIR_SORT, DIR_MAX, 0
191 };
192 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
193
194 for (x = 0; ids[x]; x++) {
195 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
196 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
197 bools[x], FALSE);
198 }
199}
200
201void CommonCreateTextChildren(HWND hwnd, char *class, USHORT * ids)
202{
203 int x;
204 CHAR s[33];
205 ULONG attrs;
206 HWND hwndTmp;
207
208 if (!hwnd || !class || !ids) {
209 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
210 return;
211 }
212
213 for (x = 0; ids[x]; x++) {
214 *s = 0;
215 switch (ids[x]) {
216 case DIR_SORT:
217 case DIR_FILTER:
218 case DIR_VIEW:
219 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
220 break;
221 case DIR_FOLDERICON:
222 case DIR_MAX:
223 attrs = SS_BITMAP;
224 sprintf(s, "#%d", ids[x]);
225 break;
226 default:
227 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
228 break;
229 }
230 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
231 HWND_TOP, ids[x], NULL, NULL);
232 if (!hwndTmp)
233 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
234 PCSZ_WINCREATEWINDOW);
235 } // for
236}
237
238void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
239{
240 char dv[CCHMAXPATH];
241
242 if (!drive || !*drive)
243 return;
244 strcpy(dv, drive);
245 MakeValidDir(dv);
246
247 switch (cmd) {
248 case IDM_MKDIR:
249 PMMkDir(hwnd, dv, FALSE);
250 break;
251 case IDM_INFO:
252 WinDlgBox(HWND_DESKTOP,
253 HWND_DESKTOP,
254 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
255 break;
256 case IDM_DRVFLAGS:
257 strcpy(dv, drive); // Must use original drive letter
258 if (WinDlgBox(HWND_DESKTOP,
259 hwnd,
260 SetDrvProc,
261 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
262 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
263 break;
264 case IDM_SIZES:
265 WinDlgBox(HWND_DESKTOP,
266 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
267 break;
268 case IDM_SHOWALLFILES:
269 StartSeeAll(HWND_DESKTOP, FALSE, dv);
270 break;
271 case IDM_UNDELETE:
272 {
273 HOBJECT hObject;
274 HWND hwndDesktop;
275
276 hObject = WinQueryObject("<XWP_TRASHCAN>");
277 if (hObject != NULLHANDLE && fTrashCan) {
278 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
279 WinSetFocus(HWND_DESKTOP, hwndDesktop);
280 WinOpenObject(hObject, 0, TRUE);
281 }
282 else
283 WinDlgBox(HWND_DESKTOP,
284 hwnd,
285 UndeleteDlgProc,
286 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
287 }
288 break;
289 case IDM_CHKDSK:
290 runemf2(SEPARATE | WINDOWED,
291 hwnd, pszSrcFile, __LINE__, NULL, NULL,
292 "PMCHKDSK.EXE %c:", toupper(*dv));
293 break;
294 case IDM_OPTIMIZE:
295 {
296 CHAR FileSystem[CCHMAXPATH];
297 ULONG type;
298
299 CheckDrive(*dv, FileSystem, &type);
300 if (*FileSystem) {
301 strcat(FileSystem, "OPT.CMD");
302 runemf2(SEPARATE | WINDOWED,
303 hwnd, pszSrcFile, __LINE__,
304 NULL,
305 NULL,
306 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
307 }
308 }
309 break;
310 case IDM_FORMAT:
311 runemf2(SEPARATE | WINDOWED,
312 hwnd, pszSrcFile, __LINE__, NULL, NULL,
313 "PMFORMAT.EXE %c:", toupper(*dv));
314 break;
315
316#if 0 // fixme to be gone?
317
318 case IDM_CLOSETRAY:
319 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
320
321 BYTE parm[4] = { "CD01" };
322 ULONGLONG dlen;
323 ULONG plen;
324 HFILE hfile;
325 APIRET rc;
326
327 dv[2] = 0;
328 rc = DosOpen(dv,
329 &hfile,
330 &dlen,
331 0,
332 0,
333 OPEN_ACTION_OPEN_IF_EXISTS |
334 OPEN_ACTION_CREATE_IF_NEW,
335 OPEN_FLAGS_DASD |
336 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
337 if (rc)
338 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
339 else {
340 dlen = 0;
341 plen = sizeof(parm);
342 rc = DosDevIOCtl(hfile,
343 0x80,
344 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
345 DosClose(hfile);
346 if (rc)
347 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
348 }
349 }
350 break;
351#endif // fixme to be gone?
352
353 case IDM_LOCK:
354 case IDM_UNLOCK:
355 case IDM_EJECT:
356 {
357 UCHAR parm[2];
358 ULONG plen = sizeof(parm), dlen = 0L;
359 APIRET rc;
360
361 switch (SHORT1FROMMP(cmd)) {
362 case IDM_LOCK:
363 parm[0] = 1;
364 break;
365 case IDM_UNLOCK:
366 parm[0] = 0;
367 break;
368 case IDM_EJECT:
369 parm[0] = 2;
370 break;
371 }
372 parm[1] = *dv - 'A';
373 DosError(FERR_DISABLEHARDERR);
374 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
375 DbgMsg(pszSrcFile, __LINE__, "Eject parm %i %i rc %i", parm[0], parm[1], rc);
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.